[pypy-svn] r61860 - in pypy/branch/pyjitpl5/pypy/jit/metainterp: . test
fijal at codespeak.net
fijal at codespeak.net
Sat Feb 14 00:17:26 CET 2009
Author: fijal
Date: Sat Feb 14 00:17:26 2009
New Revision: 61860
Modified:
pypy/branch/pyjitpl5/pypy/jit/metainterp/codewriter.py
pypy/branch/pyjitpl5/pypy/jit/metainterp/optimize.py
pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_vable_optimize.py
Log:
A bit of fixes and a test that should test something else, but a fix
for it anyway :)
Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/codewriter.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/codewriter.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/codewriter.py Sat Feb 14 00:17:26 2009
@@ -487,6 +487,7 @@
c_fieldname.value)
self.emit(offset)
self.register_var(op.result)
+ self._eventualy_builtin(op.result)
def serialize_op_setfield(self, op):
if self.is_typeptr_getset(op):
@@ -549,19 +550,22 @@
range(0, 2*(len(op.args) - 2), 2))
for i in range(2, len(op.args)):
arg = op.args[i]
- if isinstance(arg.concretetype, lltype.Ptr):
- # XXX very complex logic for getting all things
- # that are pointers, but not objects
- if isinstance(arg.concretetype.TO, lltype.GcArray):
- descr = self.codewriter.list_descr_for_tp(
- arg.concretetype)
- self.emit('guard_builtin', self.var_position(arg),
- self.get_position(descr))
+ self._eventualy_builtin(arg)
elif op.args[0].value == 'can_enter_jit':
self.emit('can_enter_jit')
self.emit_varargs(op.args[2:])
+ def _eventualy_builtin(self, arg):
+ if isinstance(arg.concretetype, lltype.Ptr):
+ # XXX very complex logic for getting all things
+ # that are pointers, but not objects
+ if isinstance(arg.concretetype.TO, lltype.GcArray):
+ descr = self.codewriter.list_descr_for_tp(arg.concretetype)
+ self.emit('guard_builtin', self.var_position(arg),
+ self.get_position(descr))
+
+
#def serialize_op_direct_call(self, op):
# color = support.guess_call_kind(self.codewriter.hannotator, op)
# return getattr(self, 'handle_%s_call' % color)(op)
Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/optimize.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/optimize.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/optimize.py Sat Feb 14 00:17:26 2009
@@ -148,14 +148,14 @@
node = other.curfields[ofs]
specnode = self.origfields[ofs].intersect(node)
elif ofs in self.origfields:
- specnode = NotSpecNode()
+ node = self.origfields[ofs]
+ specnode = node.intersect(node)
else:
# ofs in other.curfields
node = other.curfields[ofs]
self.origfields[ofs] = InstanceNode(node.source.clonebox())
specnode = NotSpecNode()
fields.append((ofs, specnode))
-
return VirtualizableSpecNode(known_class, fields)
def __repr__(self):
Modified: pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_vable_optimize.py
==============================================================================
--- pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_vable_optimize.py (original)
+++ pypy/branch/pyjitpl5/pypy/jit/metainterp/test/test_vable_optimize.py Sat Feb 14 00:17:26 2009
@@ -12,6 +12,7 @@
from pypy.jit.metainterp.virtualizable import VirtualizableDesc
from pypy.jit.metainterp.test.test_optimize import (cpu, NODE, node_vtable,
equaloplists, Loop)
+from pypy.jit.metainterp.codewriter import ListDescr
# ____________________________________________________________
@@ -21,10 +22,11 @@
('vable_base', llmemory.Address),
('vable_rti', VABLERTIPTR),
('x', lltype.Signed),
+ ('l', lltype.Ptr(lltype.GcArray(lltype.Signed))),
('node', lltype.Ptr(NODE)),
hints = {'virtualizable2': True},
adtmeths = {'access': VirtualizableAccessor()})
-XY._adtmeths['access'].initialize(XY, ['x', 'node'])
+XY._adtmeths['access'].initialize(XY, ['x', 'node', 'l'])
xy_vtable = lltype.malloc(rclass.OBJECT_VTABLE, immortal=True)
xy_vtable.name = lltype.malloc(rclass.OBJECT_VTABLE.name.TO, 3, immortal=True)
@@ -60,6 +62,7 @@
class A:
ofs_node = runner.CPU.fielddescrof(XY, 'node')
+ ofs_l = runner.CPU.fielddescrof(XY, 'l')
ofs_value = runner.CPU.fielddescrof(NODE, 'value')
size_of_node = runner.CPU.sizeof(NODE)
#
@@ -190,3 +193,37 @@
assert len(spec.specnodes[0].fields) == 1
assert spec.specnodes[0].fields[0][0] == C.ofs_node
assert isinstance(spec.specnodes[0].fields[0][1], NotSpecNode)
+
+
+# ____________________________________________________________
+
+class D:
+ class SomeDescr(ListDescr):
+ def __init__(self):
+ pass
+
+ locals().update(A.__dict__)
+ n2 = BoxPtr(lltype.cast_opaque_ptr(llmemory.GCREF, frame.node))
+ v2 = BoxInt(13)
+ l = BoxPtr(lltype.cast_opaque_ptr(llmemory.GCREF, frame.node))
+ ops = [
+ MergePoint('merge_point', [fr], []),
+ ResOperation('guard_nonvirtualized', [fr, ConstAddr(xy_vtable, cpu),
+ ConstInt(ofs_node)], []),
+ #
+ ResOperation('getfield_gc', [fr, ConstInt(ofs_l)], [l]),
+ ResOperation('guard_builtin', [l, SomeDescr()], []),
+ ResOperation('getitem', [None, l, ConstInt(0)], [v2]),
+ ResOperation('setitem', [None, l, ConstInt(0), v2], []),
+ Jump('jump', [fr], []),
+ ]
+ ops[1].vdesc = xy_desc
+
+def test_D_intersect_input_and_output():
+ spec = PerfectSpecializer(Loop(D.ops))
+ spec.find_nodes()
+ spec.intersect_input_and_output()
+ assert spec.nodes[D.fr].escaped
+ assert spec.nodes[D.fr].virtualized
+ assert spec.nodes[D.l].escaped
+ assert spec.nodes[D.l].expanded_fields.keys() == [0]
More information about the Pypy-commit
mailing list