[pypy-svn] r51869 - pypy/branch/unified-rtti/pypy/rpython/memory/gctransform

arigo at codespeak.net arigo at codespeak.net
Tue Feb 26 10:01:10 CET 2008


Author: arigo
Date: Tue Feb 26 10:01:08 2008
New Revision: 51869

Modified:
   pypy/branch/unified-rtti/pypy/rpython/memory/gctransform/boehm.py
Log:
Fix for Boehm.


Modified: pypy/branch/unified-rtti/pypy/rpython/memory/gctransform/boehm.py
==============================================================================
--- pypy/branch/unified-rtti/pypy/rpython/memory/gctransform/boehm.py	(original)
+++ pypy/branch/unified-rtti/pypy/rpython/memory/gctransform/boehm.py	Tue Feb 26 10:01:08 2008
@@ -20,25 +20,44 @@
 
         atomic_mh = mallocHelpers()
         atomic_mh.allocate = lambda size: llop.boehm_malloc_atomic(llmemory.Address, size)
-        ll_malloc_fixedsize_atomic = atomic_mh._ll_malloc_fixedsize
-
         mh = mallocHelpers()
         mh.allocate = lambda size: llop.boehm_malloc(llmemory.Address, size)
-        ll_malloc_fixedsize = mh._ll_malloc_fixedsize
+        HDRPTR = lltype.Ptr(self.HDR)
+
+        def ll_malloc_fixedsize_rtti(size, rtti):
+            raw = mh._ll_malloc_fixedsize(size)
+            llmemory.cast_adr_to_ptr(raw, HDRPTR).typeptr = rtti
+            return raw
+
+        def ll_malloc_fixedsize_atomic_rtti(size, rtti):
+            raw = atomic_mh._ll_malloc_fixedsize(size)
+            llmemory.cast_adr_to_ptr(raw, HDRPTR).typeptr = rtti
+            return raw
 
         # XXX, do we need/want an atomic version of this function?
-        ll_malloc_varsize_no_length = mh.ll_malloc_varsize_no_length
-        ll_malloc_varsize = mh.ll_malloc_varsize
+        def ll_malloc_varsize_no_length_rtti(length, size, itemsize, rtti):
+            raw = mh.ll_malloc_varsize_no_length(length, size, itemsize)
+            llmemory.cast_adr_to_ptr(raw, HDRPTR).typeptr = rtti
+            return raw
+
+        def ll_malloc_varsize_rtti(length, size, itemsize, lengthoffset, rtti):
+            raw = mh.ll_malloc_varsize(length, size, itemsize, lengthoffset)
+            llmemory.cast_adr_to_ptr(raw, HDRPTR).typeptr = rtti
+            return raw
 
         if self.translator:
             self.malloc_fixedsize_ptr = self.inittime_helper(
-                ll_malloc_fixedsize, [lltype.Signed], llmemory.Address)
+                ll_malloc_fixedsize_rtti,
+                [lltype.Signed, RTTIPTR], llmemory.Address)
             self.malloc_fixedsize_atomic_ptr = self.inittime_helper(
-                ll_malloc_fixedsize_atomic, [lltype.Signed], llmemory.Address)
+                ll_malloc_fixedsize_atomic_rtti,
+                [lltype.Signed, RTTIPTR], llmemory.Address)
             self.malloc_varsize_no_length_ptr = self.inittime_helper(
-                ll_malloc_varsize_no_length, [lltype.Signed]*3, llmemory.Address, inline=False)
+                ll_malloc_varsize_no_length_rtti,
+                [lltype.Signed]*3 + [RTTIPTR], llmemory.Address, inline=False)
             self.malloc_varsize_ptr = self.inittime_helper(
-                ll_malloc_varsize, [lltype.Signed]*4, llmemory.Address, inline=False)
+                ll_malloc_varsize_rtti,
+                [lltype.Signed]*4 + [RTTIPTR], llmemory.Address, inline=False)
             self.weakref_create_ptr = self.inittime_helper(
                 ll_weakref_create, [llmemory.Address], llmemory.WeakRefPtr,
                 inline=False)
@@ -62,8 +81,9 @@
             funcptr = self.malloc_fixedsize_atomic_ptr
         else:
             funcptr = self.malloc_fixedsize_ptr
+        c_rtti = rmodel.inputconst(RTTIPTR, self.gcheaderbuilder.getRtti(TYPE))
         v_raw = hop.genop("direct_call",
-                          [funcptr, c_size],
+                          [funcptr, c_size, c_rtti],
                           resulttype=llmemory.Address)
         finalizer_ptr = self.finalizer_funcptr_for_type(TYPE)
         if finalizer_ptr:
@@ -75,15 +95,17 @@
     def gct_fv_gc_malloc_varsize(self, hop, flags, TYPE, v_length, c_const_size, c_item_size,
                                                                    c_offset_to_length):
         # XXX same behavior for zero=True: in theory that's wrong        
+        c_rtti = rmodel.inputconst(RTTIPTR, self.gcheaderbuilder.getRtti(TYPE))
         if c_offset_to_length is None:
             v_raw = hop.genop("direct_call",
                                [self.malloc_varsize_no_length_ptr, v_length,
-                                c_const_size, c_item_size],
+                                c_const_size, c_item_size, c_rtti],
                                resulttype=llmemory.Address)
         else:
             v_raw = hop.genop("direct_call",
                                [self.malloc_varsize_ptr, v_length,
-                                c_const_size, c_item_size, c_offset_to_length],
+                                c_const_size, c_item_size, c_offset_to_length,
+                                c_rtti],
                                resulttype=llmemory.Address)
         return v_raw
 



More information about the Pypy-commit mailing list