[pypy-commit] pypy op_malloc_gc: translation fixes

arigo noreply at buildbot.pypy.org
Sun Dec 18 20:43:21 CET 2011


Author: Armin Rigo <arigo at tunes.org>
Branch: op_malloc_gc
Changeset: r50682:2ba13ee957b9
Date: 2011-12-18 20:42 +0100
http://bitbucket.org/pypy/pypy/changeset/2ba13ee957b9/

Log:	translation fixes

diff --git a/pypy/jit/backend/llsupport/gc.py b/pypy/jit/backend/llsupport/gc.py
--- a/pypy/jit/backend/llsupport/gc.py
+++ b/pypy/jit/backend/llsupport/gc.py
@@ -1,6 +1,6 @@
 import os
 from pypy.rlib import rgc
-from pypy.rlib.objectmodel import we_are_translated
+from pypy.rlib.objectmodel import we_are_translated, specialize
 from pypy.rlib.debug import fatalerror
 from pypy.rlib.rarithmetic import ovfcheck
 from pypy.rpython.lltypesystem import lltype, llmemory, rffi, rclass, rstr
@@ -9,8 +9,7 @@
 from pypy.rpython.annlowlevel import llhelper
 from pypy.translator.tool.cbuild import ExternalCompilationInfo
 from pypy.jit.codewriter import heaptracker
-from pypy.jit.metainterp.history import BoxInt, BoxPtr, ConstInt, ConstPtr
-from pypy.jit.metainterp.history import AbstractDescr
+from pypy.jit.metainterp.history import ConstPtr, AbstractDescr
 from pypy.jit.metainterp.resoperation import ResOperation, rop
 from pypy.jit.backend.llsupport import symbolic
 from pypy.jit.backend.llsupport.symbolic import WORD
@@ -45,16 +44,23 @@
         memory.
         """
         FUNCPTR = lltype.Ptr(lltype.FuncType(ARGS, RESULT))
-        ll_func = llhelper(FUNCPTR, func)
-        c_ll_func = ConstInt(
-            heaptracker.adr2int(llmemory.cast_ptr_to_adr(ll_func)))
         descr = get_call_descr(self, ARGS, RESULT)
-        setattr(self, '%s'      % funcname, func)
-        setattr(self, '%s_fn'   % funcname, ll_func)
-        setattr(self, 'c_%s_fn' % funcname, c_ll_func)
-        setattr(self, '%s_descr' % funcname, descr)
+        setattr(self, funcname, func)
+        setattr(self, funcname + '_FUNCPTR', FUNCPTR)
+        setattr(self, funcname + '_descr', descr)
         self._generated_functions.append(funcname)
 
+    @specialize.arg(1)
+    def get_malloc_fn(self, funcname):
+        func = getattr(self, funcname)
+        FUNC = getattr(self, funcname + '_FUNCPTR')
+        return llhelper(FUNC, func)
+
+    @specialize.arg(1)
+    def get_malloc_fn_addr(self, funcname):
+        ll_func = self.get_malloc_fn(funcname)
+        return heaptracker.adr2int(llmemory.cast_ptr_to_adr(ll_func))
+
     def _freeze_(self):
         return True
     def initialize(self):
diff --git a/pypy/jit/backend/llsupport/rewrite.py b/pypy/jit/backend/llsupport/rewrite.py
--- a/pypy/jit/backend/llsupport/rewrite.py
+++ b/pypy/jit/backend/llsupport/rewrite.py
@@ -150,13 +150,14 @@
         """Generate a CALL_MALLOC_GC(malloc_fixedsize_fn, Const(size)).
         Note that with the framework GC, this should be called very rarely.
         """
-        self._gen_call_malloc_gc([self.gc_ll_descr.c_malloc_fixedsize_fn,
-                                  ConstInt(size)], v_result,
+        addr = self.gc_ll_descr.get_malloc_fn_addr('malloc_fixedsize')
+        self._gen_call_malloc_gc([ConstInt(addr), ConstInt(size)], v_result,
                                  self.gc_ll_descr.malloc_fixedsize_descr)
 
     def gen_boehm_malloc_array(self, arraydescr, v_num_elem, v_result):
         """Generate a CALL_MALLOC_GC(malloc_array_fn, ...) for Boehm."""
-        self._gen_call_malloc_gc([self.gc_ll_descr.c_malloc_array_fn,
+        addr = self.gc_ll_descr.get_malloc_fn_addr('malloc_array')
+        self._gen_call_malloc_gc([ConstInt(addr),
                                   ConstInt(arraydescr.basesize),
                                   v_num_elem,
                                   ConstInt(arraydescr.itemsize),
@@ -172,14 +173,17 @@
             and arraydescr.lendescr.offset ==
                 self.gc_ll_descr.standard_array_length_ofs):
             # this is a standard-looking array, common case
-            args = [self.gc_ll_descr.c_malloc_array_fn,
+            addr = self.gc_ll_descr.get_malloc_fn_addr('malloc_array')
+            args = [ConstInt(addr),
                     ConstInt(arraydescr.itemsize),
                     ConstInt(arraydescr.tid),
                     v_num_elem]
             calldescr = self.gc_ll_descr.malloc_array_descr
         else:
             # rare case, so don't care too much about the number of arguments
-            args = [self.gc_ll_descr.c_malloc_array_nonstandard_fn,
+            addr = self.gc_ll_descr.get_malloc_fn_addr(
+                                              'malloc_array_nonstandard')
+            args = [ConstInt(addr),
                     ConstInt(arraydescr.basesize),
                     ConstInt(arraydescr.itemsize),
                     ConstInt(arraydescr.lendescr.offset),
@@ -190,14 +194,14 @@
 
     def gen_malloc_str(self, v_num_elem, v_result):
         """Generate a CALL_MALLOC_GC(malloc_str_fn, ...)."""
-        self._gen_call_malloc_gc([self.gc_ll_descr.c_malloc_str_fn,
-                                  v_num_elem], v_result,
+        addr = self.gc_ll_descr.get_malloc_fn_addr('malloc_str')
+        self._gen_call_malloc_gc([ConstInt(addr), v_num_elem], v_result,
                                  self.gc_ll_descr.malloc_str_descr)
 
     def gen_malloc_unicode(self, v_num_elem, v_result):
         """Generate a CALL_MALLOC_GC(malloc_unicode_fn, ...)."""
-        self._gen_call_malloc_gc([self.gc_ll_descr.c_malloc_unicode_fn,
-                                  v_num_elem], v_result,
+        addr = self.gc_ll_descr.get_malloc_fn_addr('malloc_unicode')
+        self._gen_call_malloc_gc([ConstInt(addr), v_num_elem], v_result,
                                  self.gc_ll_descr.malloc_unicode_descr)
 
     def gen_malloc_nursery(self, size, v_result):
diff --git a/pypy/jit/backend/llsupport/test/test_gc.py b/pypy/jit/backend/llsupport/test/test_gc.py
--- a/pypy/jit/backend/llsupport/test/test_gc.py
+++ b/pypy/jit/backend/llsupport/test/test_gc.py
@@ -6,6 +6,7 @@
 from pypy.jit.backend.llsupport.gc import *
 from pypy.jit.backend.llsupport import symbolic
 from pypy.jit.metainterp.gc import get_description
+from pypy.jit.metainterp.history import BoxPtr, BoxInt, ConstPtr
 from pypy.jit.metainterp.resoperation import get_deep_immutable_oplist
 from pypy.jit.tool.oparser import parse
 from pypy.rpython.lltypesystem.rclass import OBJECT, OBJECT_VTABLE
diff --git a/pypy/jit/backend/llsupport/test/test_rewrite.py b/pypy/jit/backend/llsupport/test/test_rewrite.py
--- a/pypy/jit/backend/llsupport/test/test_rewrite.py
+++ b/pypy/jit/backend/llsupport/test/test_rewrite.py
@@ -64,7 +64,7 @@
         namespace.update(locals())
         #
         for funcname in self.gc_ll_descr._generated_functions:
-            namespace[funcname] = getattr(self.gc_ll_descr, '%s_fn' % funcname)
+            namespace[funcname] = self.gc_ll_descr.get_malloc_fn(funcname)
             namespace[funcname + '_descr'] = getattr(self.gc_ll_descr,
                                                      '%s_descr' % funcname)
         #


More information about the pypy-commit mailing list