[pypy-svn] r23535 - pypy/dist/pypy/rpython/memory
cfbolz at codespeak.net
cfbolz at codespeak.net
Tue Feb 21 02:22:03 CET 2006
Author: cfbolz
Date: Tue Feb 21 02:22:00 2006
New Revision: 23535
Modified:
pypy/dist/pypy/rpython/memory/gcwrapper.py
Log:
introduce SymbolicQueryTypes, to be used together with the FrameWorkGCTransformer
Modified: pypy/dist/pypy/rpython/memory/gcwrapper.py
==============================================================================
--- pypy/dist/pypy/rpython/memory/gcwrapper.py (original)
+++ pypy/dist/pypy/rpython/memory/gcwrapper.py Tue Feb 21 02:22:00 2006
@@ -1,6 +1,6 @@
from pypy.annotation.annrpython import RPythonAnnotator
from pypy.rpython.rtyper import RPythonTyper
-from pypy.rpython.lltypesystem import lltype
+from pypy.rpython.lltypesystem import lltype, llmemory
from pypy.rpython.memory.support import AddressLinkedList, INT_SIZE
from pypy.rpython.memory.lladdress import raw_malloc, raw_free, NULL
from pypy.rpython.memory import lltypelayout
@@ -34,19 +34,16 @@
tttid.sort()
tttid = zip(*zip(*tttid)[::-1])
for TYPE, typeid in tttid:
- varsize = (isinstance(TYPE, lltype.Array) or
- (isinstance(TYPE, lltype.Struct) and
- TYPE._arrayfld is not None))
+ varsize = self.is_varsize(typeid)
_is_varsize.append(varsize)
- _offsets_to_gc_pointers.append(
- lltypelayout.offsets_to_gc_pointers(TYPE))
- _fixed_size.append(lltypelayout.get_fixed_size(TYPE))
+ _offsets_to_gc_pointers.append(self.offsets_to_gc_pointers(typeid))
+ _fixed_size.append(self.fixed_size(typeid))
if varsize:
- _varsize_item_sizes.append(lltypelayout.get_variable_size(TYPE))
+ _varsize_item_sizes.append(self.varsize_item_sizes(typeid))
_varsize_offset_to_variable_part.append(
- lltypelayout.get_fixed_size(TYPE))
+ self.varsize_offset_to_variable_part(typeid))
_varsize_offset_to_length.append(
- lltypelayout.varsize_offset_to_length(TYPE))
+ self.varsize_offset_to_length(typeid))
_varsize_offsets_to_gcpointers_in_var_part.append(
lltypelayout.varsize_offsets_to_gcpointers_in_var_part(TYPE))
else:
@@ -123,7 +120,47 @@
self.varsize_offset_to_length,
self.varsize_offsets_to_gcpointers_in_var_part)
+class SymbolicQueryTypes(QueryTypes):
+ def fixed_size(self, typeid):
+ assert typeid >= 0
+ if self.types[typeid]._is_varsize():
+ return llmemory.sizeof(self.types[typeid], 0)
+ else:
+ return llmemory.sizeof(self.types[typeid])
+
+ def varsize_item_sizes(self, typeid):
+ assert typeid >= 0
+ if self.is_varsize(typeid):
+ return llmemory.ItemOffset(self.types[typeid])
+ else:
+ return 0
+
+ def varsize_offset_to_variable_part(self, typeid):
+ assert typeid >= 0
+ if self.is_varsize(typeid):
+ return llmemory.ArrayItemsOffset(self.types[typeid])
+ else:
+ return 0
+ def varsize_offset_to_length(self, typeid):
+ assert typeid >= 0
+ if self.is_varsize(typeid):
+ TYPE = self.types[typeid]
+ if isinstance(TYPE, lltype.Array):
+ return 0
+ else:
+ return llmemory.FieldOffset(TYPE, TYPE._arrayfld)
+ else:
+ return 0
+
+ def varsize_offsets_to_gcpointers_in_var_part(self, typeid):
+ assert typeid >= 0
+ if self.is_varsize(typeid):
+ return lltypelayout.varsize_offsets_to_gcpointers_in_var_part(
+ self.types[typeid])
+ else:
+ return 0
+
def getfunctionptr(annotator, graphfunc):
"""Make a functionptr from the given Python function."""
graph = annotator.bookkeeper.getdesc(graphfunc).cachedgraph(None)
More information about the Pypy-commit
mailing list