[pypy-svn] r23518 - pypy/dist/pypy/rpython/memory
cfbolz at codespeak.net
cfbolz at codespeak.net
Mon Feb 20 17:51:26 CET 2006
Author: cfbolz
Date: Mon Feb 20 17:51:25 2006
New Revision: 23518
Modified:
pypy/dist/pypy/rpython/memory/convertlltype.py
Log:
simplify a bit the gctransformer and factor out a function
Modified: pypy/dist/pypy/rpython/memory/convertlltype.py
==============================================================================
--- pypy/dist/pypy/rpython/memory/convertlltype.py (original)
+++ pypy/dist/pypy/rpython/memory/convertlltype.py Mon Feb 20 17:51:25 2006
@@ -126,6 +126,30 @@
assert inline_to_ptr is None, "can't inline function or pyobject"
return simulatorptr(lltype.Ptr(lltype.typeOf(_obj)),
lladdress.get_address_of_object(_obj))
+def collect_constants_and_types(graphs):
+ constants = {}
+ types = {}
+ def collect_args(args):
+ for arg in args:
+ if (isinstance(arg, Constant) and
+ arg.concretetype is not lltype.Void):
+ constants[arg] = None
+ types[arg.concretetype] = True
+ for graph in graphs:
+ for block in graph.iterblocks():
+ collect_args(block.inputargs)
+ for op in block.operations:
+ collect_args(op.args)
+ if op.opname in ("malloc", "malloc_varsize"):
+ types[op.args[0].value] = True
+ for link in graph.iterlinks():
+ collect_args(link.args)
+ if hasattr(link, "llexitcase"):
+ if isinstance(link.llexitcase, IntegerRepr):
+ assert 0
+ constants[Constant(link.llexitcase)] = None
+ return constants, types
+
class FlowGraphConstantConverter(object):
def __init__(self, graphs, gc=None, qt=None):
@@ -137,30 +161,7 @@
self.query_types = qt
def collect_constants_and_types(self):
- constants = {}
- types = {}
- def collect_args(args):
- for arg in args:
- if (isinstance(arg, Constant) and
- arg.concretetype is not lltype.Void):
- constants[arg] = None
- types[arg.concretetype] = True
- def visit(obj):
- if isinstance(obj, Link):
- collect_args(obj.args)
- if hasattr(obj, "llexitcase"):
- if isinstance(obj.llexitcase, IntegerRepr):
- assert 0
- constants[Constant(obj.llexitcase)] = None
- elif isinstance(obj, Block):
- for op in obj.operations:
- collect_args(op.args)
- if op.opname in ("malloc", "malloc_varsize"):
- types[op.args[0].value] = True
- for graph in self.graphs:
- traverse(visit, graph)
- self.constants = constants
- self.types = types
+ self.constants, self.types = collect_constants_and_types(self.graphs)
def calculate_size(self):
total_size = 0
More information about the Pypy-commit
mailing list