Author: Armin Rigo <[email protected]>
Branch: stm-gc
Changeset: r54817:f701cef21be4
Date: 2012-04-30 10:17 +0200
http://bitbucket.org/pypy/pypy/changeset/f701cef21be4/
Log: hg merge default
diff --git a/pypy/jit/backend/llsupport/test/test_asmmemmgr.py
b/pypy/jit/backend/llsupport/test/test_asmmemmgr.py
--- a/pypy/jit/backend/llsupport/test/test_asmmemmgr.py
+++ b/pypy/jit/backend/llsupport/test/test_asmmemmgr.py
@@ -217,7 +217,8 @@
encoded = ''.join(writtencode).encode('hex').upper()
ataddr = '@%x' % addr
assert log == [('test-logname-section',
- [('debug_print', 'CODE_DUMP', ataddr, '+0 ', encoded)])]
+ [('debug_print', 'SYS_EXECUTABLE', '??'),
+ ('debug_print', 'CODE_DUMP', ataddr, '+0 ', encoded)])]
lltype.free(p, flavor='raw')
diff --git a/pypy/jit/metainterp/jitexc.py b/pypy/jit/metainterp/jitexc.py
--- a/pypy/jit/metainterp/jitexc.py
+++ b/pypy/jit/metainterp/jitexc.py
@@ -12,7 +12,6 @@
"""
_go_through_llinterp_uncaught_ = True # ugh
-
def _get_standard_error(rtyper, Class):
exdata = rtyper.getexceptiondata()
clsdef = rtyper.annotator.bookkeeper.getuniqueclassdef(Class)
diff --git a/pypy/jit/metainterp/optimize.py b/pypy/jit/metainterp/optimize.py
--- a/pypy/jit/metainterp/optimize.py
+++ b/pypy/jit/metainterp/optimize.py
@@ -5,3 +5,9 @@
"""Raised when the optimize*.py detect that the loop that
we are trying to build cannot possibly make sense as a
long-running loop (e.g. it cannot run 2 complete iterations)."""
+
+ def __init__(self, msg='?'):
+ debug_start("jit-abort")
+ debug_print(msg)
+ debug_stop("jit-abort")
+ self.msg = msg
diff --git a/pypy/jit/metainterp/optimizeopt/heap.py
b/pypy/jit/metainterp/optimizeopt/heap.py
--- a/pypy/jit/metainterp/optimizeopt/heap.py
+++ b/pypy/jit/metainterp/optimizeopt/heap.py
@@ -481,7 +481,7 @@
# already between the tracing and now. In this case, we are
# simply ignoring the QUASIIMMUT_FIELD hint and compiling it
# as a regular getfield.
- if not qmutdescr.is_still_valid():
+ if not qmutdescr.is_still_valid_for(structvalue.get_key_box()):
self._remove_guard_not_invalidated = True
return
# record as an out-of-line guard
diff --git a/pypy/jit/metainterp/optimizeopt/intbounds.py
b/pypy/jit/metainterp/optimizeopt/intbounds.py
--- a/pypy/jit/metainterp/optimizeopt/intbounds.py
+++ b/pypy/jit/metainterp/optimizeopt/intbounds.py
@@ -191,10 +191,13 @@
# GUARD_OVERFLOW, then the loop is invalid.
lastop = self.last_emitted_operation
if lastop is None:
- raise InvalidLoop
+ raise InvalidLoop('An INT_xxx_OVF was proven not to overflow but' +
+ 'guarded with GUARD_OVERFLOW')
opnum = lastop.getopnum()
if opnum not in (rop.INT_ADD_OVF, rop.INT_SUB_OVF, rop.INT_MUL_OVF):
- raise InvalidLoop
+ raise InvalidLoop('An INT_xxx_OVF was proven not to overflow but' +
+ 'guarded with GUARD_OVERFLOW')
+
self.emit_operation(op)
def optimize_INT_ADD_OVF(self, op):
diff --git a/pypy/jit/metainterp/optimizeopt/rewrite.py
b/pypy/jit/metainterp/optimizeopt/rewrite.py
--- a/pypy/jit/metainterp/optimizeopt/rewrite.py
+++ b/pypy/jit/metainterp/optimizeopt/rewrite.py
@@ -208,7 +208,8 @@
box = value.box
assert isinstance(box, Const)
if not box.same_constant(constbox):
- raise InvalidLoop
+ raise InvalidLoop('A GURAD_{VALUE,TRUE,FALSE} was proven to' +
+ 'always fail')
return
if emit_operation:
self.emit_operation(op)
@@ -220,7 +221,7 @@
if value.is_null():
return
elif value.is_nonnull():
- raise InvalidLoop
+ raise InvalidLoop('A GUARD_ISNULL was proven to always fail')
self.emit_operation(op)
value.make_constant(self.optimizer.cpu.ts.CONST_NULL)
@@ -229,7 +230,7 @@
if value.is_nonnull():
return
elif value.is_null():
- raise InvalidLoop
+ raise InvalidLoop('A GUARD_NONNULL was proven to always fail')
self.emit_operation(op)
value.make_nonnull(op)
@@ -278,7 +279,7 @@
if realclassbox is not None:
if realclassbox.same_constant(expectedclassbox):
return
- raise InvalidLoop
+ raise InvalidLoop('A GUARD_CLASS was proven to always fail')
if value.last_guard:
# there already has been a guard_nonnull or guard_class or
# guard_nonnull_class on this value.
@@ -301,7 +302,8 @@
def optimize_GUARD_NONNULL_CLASS(self, op):
value = self.getvalue(op.getarg(0))
if value.is_null():
- raise InvalidLoop
+ raise InvalidLoop('A GUARD_NONNULL_CLASS was proven to always ' +
+ 'fail')
self.optimize_GUARD_CLASS(op)
def optimize_CALL_LOOPINVARIANT(self, op):
diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -5090,7 +5090,6 @@
class TestLLtype(BaseTestOptimizeBasic, LLtypeMixin):
pass
-
##class TestOOtype(BaseTestOptimizeBasic, OOtypeMixin):
## def test_instanceof(self):
diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
b/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizeopt.py
@@ -6533,9 +6533,9 @@
def test_quasi_immut_2(self):
ops = """
[]
- quasiimmut_field(ConstPtr(myptr), descr=quasiimmutdescr)
+ quasiimmut_field(ConstPtr(quasiptr), descr=quasiimmutdescr)
guard_not_invalidated() []
- i1 = getfield_gc(ConstPtr(myptr), descr=quasifielddescr)
+ i1 = getfield_gc(ConstPtr(quasiptr), descr=quasifielddescr)
escape(i1)
jump()
"""
@@ -6585,13 +6585,13 @@
def test_call_may_force_invalidated_guards_reload(self):
ops = """
[i0a, i0b]
- quasiimmut_field(ConstPtr(myptr), descr=quasiimmutdescr)
+ quasiimmut_field(ConstPtr(quasiptr), descr=quasiimmutdescr)
guard_not_invalidated() []
- i1 = getfield_gc(ConstPtr(myptr), descr=quasifielddescr)
+ i1 = getfield_gc(ConstPtr(quasiptr), descr=quasifielddescr)
call_may_force(i0b, descr=mayforcevirtdescr)
- quasiimmut_field(ConstPtr(myptr), descr=quasiimmutdescr)
+ quasiimmut_field(ConstPtr(quasiptr), descr=quasiimmutdescr)
guard_not_invalidated() []
- i2 = getfield_gc(ConstPtr(myptr), descr=quasifielddescr)
+ i2 = getfield_gc(ConstPtr(quasiptr), descr=quasifielddescr)
i3 = escape(i1)
i4 = escape(i2)
jump(i3, i4)
@@ -7813,6 +7813,52 @@
"""
self.optimize_loop(ops, expected)
+ def test_issue1080_infinitie_loop_virtual(self):
+ ops = """
+ [p10]
+ p52 = getfield_gc(p10, descr=nextdescr) # inst_storage
+ p54 = getarrayitem_gc(p52, 0, descr=arraydescr)
+ p69 = getfield_gc_pure(p54, descr=otherdescr) # inst_w_function
+
+ quasiimmut_field(p69, descr=quasiimmutdescr)
+ guard_not_invalidated() []
+ p71 = getfield_gc(p69, descr=quasifielddescr) # inst_code
+ guard_value(p71, -4247) []
+
+ p106 = new_with_vtable(ConstClass(node_vtable))
+ p108 = new_array(3, descr=arraydescr)
+ p110 = new_with_vtable(ConstClass(node_vtable))
+ setfield_gc(p110, ConstPtr(myptr2), descr=otherdescr) # inst_w_function
+ setarrayitem_gc(p108, 0, p110, descr=arraydescr)
+ setfield_gc(p106, p108, descr=nextdescr) # inst_storage
+ jump(p106)
+ """
+ expected = """
+ []
+ p72 = getfield_gc(ConstPtr(myptr2), descr=quasifielddescr)
+ guard_value(p72, -4247) []
+ jump()
+ """
+ self.optimize_loop(ops, expected)
+
+
+ def test_issue1080_infinitie_loop_simple(self):
+ ops = """
+ [p69]
+ quasiimmut_field(p69, descr=quasiimmutdescr)
+ guard_not_invalidated() []
+ p71 = getfield_gc(p69, descr=quasifielddescr) # inst_code
+ guard_value(p71, -4247) []
+ jump(ConstPtr(myptr))
+ """
+ expected = """
+ []
+ p72 = getfield_gc(ConstPtr(myptr), descr=quasifielddescr)
+ guard_value(p72, -4247) []
+ jump()
+ """
+ self.optimize_loop(ops, expected)
+
class TestLLtype(OptimizeOptTest, LLtypeMixin):
pass
diff --git a/pypy/jit/metainterp/optimizeopt/test/test_util.py
b/pypy/jit/metainterp/optimizeopt/test/test_util.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_util.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_util.py
@@ -122,6 +122,7 @@
quasi.inst_field = -4247
quasifielddescr = cpu.fielddescrof(QUASI, 'inst_field')
quasibox = BoxPtr(lltype.cast_opaque_ptr(llmemory.GCREF, quasi))
+ quasiptr = quasibox.value
quasiimmutdescr = QuasiImmutDescr(cpu, quasibox,
quasifielddescr,
cpu.fielddescrof(QUASI, 'mutate_field'))
diff --git a/pypy/jit/metainterp/optimizeopt/unroll.py
b/pypy/jit/metainterp/optimizeopt/unroll.py
--- a/pypy/jit/metainterp/optimizeopt/unroll.py
+++ b/pypy/jit/metainterp/optimizeopt/unroll.py
@@ -315,7 +315,10 @@
try:
jumpargs = virtual_state.make_inputargs(values, self.optimizer)
except BadVirtualState:
- raise InvalidLoop
+ raise InvalidLoop('The state of the optimizer at the end of ' +
+ 'peeled loop is inconsistent with the ' +
+ 'VirtualState at the begining of the peeled ' +
+ 'loop')
jumpop.initarglist(jumpargs)
# Inline the short preamble at the end of the loop
@@ -325,7 +328,11 @@
for i in range(len(short_inputargs)):
if short_inputargs[i] in args:
if args[short_inputargs[i]] != jmp_to_short_args[i]:
- raise InvalidLoop
+ raise InvalidLoop('The short preamble wants the ' +
+ 'same box passed to multiple of its ' +
+ 'inputargs, but the jump at the ' +
+ 'end of this bridge does not do that.')
+
args[short_inputargs[i]] = jmp_to_short_args[i]
self.short_inliner = Inliner(short_inputargs, jmp_to_short_args)
for op in self.short[1:]:
@@ -378,7 +385,10 @@
#final_virtual_state.debug_print("Bad virtual state at end of
loop, ",
# bad)
#debug_stop('jit-log-virtualstate')
- raise InvalidLoop
+ raise InvalidLoop('The virtual state at the end of the peeled ' +
+ 'loop is not compatible with the virtual ' +
+ 'state at the start of the loop which makes ' +
+ 'it impossible to close the loop')
#debug_stop('jit-log-virtualstate')
@@ -526,8 +536,8 @@
args = jumpop.getarglist()
modifier = VirtualStateAdder(self.optimizer)
virtual_state = modifier.get_virtual_state(args)
- #debug_start('jit-log-virtualstate')
- #virtual_state.debug_print("Looking for ")
+ debug_start('jit-log-virtualstate')
+ virtual_state.debug_print("Looking for ")
for target in cell_token.target_tokens:
if not target.virtual_state:
@@ -536,10 +546,10 @@
extra_guards = []
bad = {}
- #debugmsg = 'Did not match '
+ debugmsg = 'Did not match '
if target.virtual_state.generalization_of(virtual_state, bad):
ok = True
- #debugmsg = 'Matched '
+ debugmsg = 'Matched '
else:
try:
cpu = self.optimizer.cpu
@@ -548,13 +558,13 @@
extra_guards)
ok = True
- #debugmsg = 'Guarded to match '
+ debugmsg = 'Guarded to match '
except InvalidLoop:
pass
- #target.virtual_state.debug_print(debugmsg, bad)
+ target.virtual_state.debug_print(debugmsg, bad)
if ok:
- #debug_stop('jit-log-virtualstate')
+ debug_stop('jit-log-virtualstate')
values = [self.getvalue(arg)
for arg in jumpop.getarglist()]
@@ -581,7 +591,7 @@
jumpop.setdescr(cell_token.target_tokens[0])
self.optimizer.send_extra_operation(jumpop)
return True
- #debug_stop('jit-log-virtualstate')
+ debug_stop('jit-log-virtualstate')
return False
class ValueImporter(object):
diff --git a/pypy/jit/metainterp/optimizeopt/virtualstate.py
b/pypy/jit/metainterp/optimizeopt/virtualstate.py
--- a/pypy/jit/metainterp/optimizeopt/virtualstate.py
+++ b/pypy/jit/metainterp/optimizeopt/virtualstate.py
@@ -27,11 +27,15 @@
if self.generalization_of(other, renum, {}):
return
if renum[self.position] != other.position:
- raise InvalidLoop
+ raise InvalidLoop('The numbering of the virtual states does not ' +
+ 'match. This means that two virtual fields ' +
+ 'have been set to the same Box in one of the ' +
+ 'virtual states but not in the other.')
self._generate_guards(other, box, cpu, extra_guards)
def _generate_guards(self, other, box, cpu, extra_guards):
- raise InvalidLoop
+ raise InvalidLoop('Generating guards for making the VirtualStates ' +
+ 'at hand match have not been implemented')
def enum_forced_boxes(self, boxes, value, optimizer):
raise NotImplementedError
@@ -346,10 +350,12 @@
def _generate_guards(self, other, box, cpu, extra_guards):
if not isinstance(other, NotVirtualStateInfo):
- raise InvalidLoop
+ raise InvalidLoop('The VirtualStates does not match as a ' +
+ 'virtual appears where a pointer is needed ' +
+ 'and it is too late to force it.')
if self.lenbound or other.lenbound:
- raise InvalidLoop
+ raise InvalidLoop('The array length bounds does not match.')
if self.level == LEVEL_KNOWNCLASS and \
box.nonnull() and \
@@ -400,7 +406,8 @@
return
# Remaining cases are probably not interesting
- raise InvalidLoop
+ raise InvalidLoop('Generating guards for making the VirtualStates ' +
+ 'at hand match have not been implemented')
if self.level == LEVEL_CONSTANT:
import pdb; pdb.set_trace()
raise NotImplementedError
diff --git a/pypy/jit/metainterp/quasiimmut.py
b/pypy/jit/metainterp/quasiimmut.py
--- a/pypy/jit/metainterp/quasiimmut.py
+++ b/pypy/jit/metainterp/quasiimmut.py
@@ -120,8 +120,10 @@
self.fielddescr, self.structbox)
return fieldbox.constbox()
- def is_still_valid(self):
+ def is_still_valid_for(self, structconst):
assert self.structbox is not None
+ if not self.structbox.constbox().same_constant(structconst):
+ return False
cpu = self.cpu
gcref = self.structbox.getref_base()
qmut = get_current_qmut_instance(cpu, gcref, self.mutatefielddescr)
diff --git a/pypy/jit/metainterp/test/test_quasiimmut.py
b/pypy/jit/metainterp/test/test_quasiimmut.py
--- a/pypy/jit/metainterp/test/test_quasiimmut.py
+++ b/pypy/jit/metainterp/test/test_quasiimmut.py
@@ -8,7 +8,7 @@
from pypy.jit.metainterp.quasiimmut import get_current_qmut_instance
from pypy.jit.metainterp.test.support import LLJitMixin
from pypy.jit.codewriter.policy import StopAtXPolicy
-from pypy.rlib.jit import JitDriver, dont_look_inside, unroll_safe
+from pypy.rlib.jit import JitDriver, dont_look_inside, unroll_safe, promote
def test_get_current_qmut_instance():
@@ -506,6 +506,27 @@
"guard_not_invalidated": 2
})
+ def test_issue1080(self):
+ myjitdriver = JitDriver(greens=[], reds=["n", "sa", "a"])
+ class Foo(object):
+ _immutable_fields_ = ["x?"]
+ def __init__(self, x):
+ self.x = x
+ one, two = Foo(1), Foo(2)
+ def main(n):
+ sa = 0
+ a = one
+ while n:
+ myjitdriver.jit_merge_point(n=n, sa=sa, a=a)
+ sa += a.x
+ if a.x == 1:
+ a = two
+ elif a.x == 2:
+ a = one
+ n -= 1
+ return sa
+ res = self.meta_interp(main, [10])
+ assert res == main(10)
class TestLLtypeGreenFieldsTests(QuasiImmutTests, LLJitMixin):
pass
diff --git a/pypy/module/_multiprocessing/test/test_connection.py
b/pypy/module/_multiprocessing/test/test_connection.py
--- a/pypy/module/_multiprocessing/test/test_connection.py
+++ b/pypy/module/_multiprocessing/test/test_connection.py
@@ -157,13 +157,15 @@
raises(IOError, _multiprocessing.Connection, -15)
def test_byte_order(self):
+ import socket
+ if not 'fromfd' in dir(socket):
+ skip('No fromfd in socket')
# The exact format of net strings (length in network byte
# order) is important for interoperation with others
# implementations.
rhandle, whandle = self.make_pair()
whandle.send_bytes("abc")
whandle.send_bytes("defg")
- import socket
sock = socket.fromfd(rhandle.fileno(),
socket.AF_INET, socket.SOCK_STREAM)
data1 = sock.recv(7)
diff --git a/pypy/module/_winreg/test/test_winreg.py
b/pypy/module/_winreg/test/test_winreg.py
--- a/pypy/module/_winreg/test/test_winreg.py
+++ b/pypy/module/_winreg/test/test_winreg.py
@@ -198,7 +198,10 @@
import nt
r = ExpandEnvironmentStrings(u"%windir%\\test")
assert isinstance(r, unicode)
- assert r == nt.environ["WINDIR"] + "\\test"
+ if 'WINDIR' in nt.environ.keys():
+ assert r == nt.environ["WINDIR"] + "\\test"
+ else:
+ assert r == nt.environ["windir"] + "\\test"
def test_long_key(self):
from _winreg import (
diff --git a/pypy/module/micronumpy/test/test_dtypes.py
b/pypy/module/micronumpy/test/test_dtypes.py
--- a/pypy/module/micronumpy/test/test_dtypes.py
+++ b/pypy/module/micronumpy/test/test_dtypes.py
@@ -185,6 +185,33 @@
assert dtype("float") is dtype(float)
+ def test_index_int8(self):
+ from _numpypy import array, int8
+
+ a = array(range(10), dtype=int8)
+ b = array([0] * 10, dtype=int8)
+ for idx in b: a[idx] += 1
+
+ def test_index_int16(self):
+ from _numpypy import array, int16
+
+ a = array(range(10), dtype=int16)
+ b = array([0] * 10, dtype=int16)
+ for idx in b: a[idx] += 1
+
+ def test_index_int32(self):
+ from _numpypy import array, int32
+
+ a = array(range(10), dtype=int32)
+ b = array([0] * 10, dtype=int32)
+ for idx in b: a[idx] += 1
+
+ def test_index_int64(self):
+ from _numpypy import array, int64
+
+ a = array(range(10), dtype=int64)
+ b = array([0] * 10, dtype=int64)
+ for idx in b: a[idx] += 1
class AppTestTypes(BaseNumpyAppTest):
def test_abstract_types(self):
diff --git a/pypy/module/pypyjit/test_pypy_c/test_00_model.py
b/pypy/module/pypyjit/test_pypy_c/test_00_model.py
--- a/pypy/module/pypyjit/test_pypy_c/test_00_model.py
+++ b/pypy/module/pypyjit/test_pypy_c/test_00_model.py
@@ -54,7 +54,8 @@
cmdline += ['--jit', ','.join(jitcmdline)]
cmdline.append(str(self.filepath))
#
- env={'PYPYLOG': self.log_string + ':' + str(logfile)}
+ env = os.environ.copy()
+ env['PYPYLOG'] = self.log_string + ':' + str(logfile)
pipe = subprocess.Popen(cmdline,
env=env,
stdout=subprocess.PIPE,
diff --git a/pypy/module/rctime/interp_time.py
b/pypy/module/rctime/interp_time.py
--- a/pypy/module/rctime/interp_time.py
+++ b/pypy/module/rctime/interp_time.py
@@ -572,7 +572,7 @@
if i < length and format[i] == '#':
# not documented by python
i += 1
- if i >= length or format[i] not in "aAbBcdfHIjmMpSUwWxXyYzZ%":
+ if i >= length or format[i] not in "aAbBcdHIjmMpSUwWxXyYzZ%":
raise OperationError(space.w_ValueError,
space.wrap("invalid format string"))
i += 1
diff --git a/pypy/rlib/test/test_rposix.py b/pypy/rlib/test/test_rposix.py
--- a/pypy/rlib/test/test_rposix.py
+++ b/pypy/rlib/test/test_rposix.py
@@ -133,6 +133,8 @@
pass
def test_validate_fd(self):
+ if os.name != 'nt':
+ skip('relevant for windows only')
assert rposix._validate_fd(0) == 1
fid = open(str(udir.join('validate_test.txt')), 'w')
fd = fid.fileno()
diff --git a/pypy/rpython/memory/gc/minimark.py
b/pypy/rpython/memory/gc/minimark.py
--- a/pypy/rpython/memory/gc/minimark.py
+++ b/pypy/rpython/memory/gc/minimark.py
@@ -917,7 +917,7 @@
ll_assert(not self.is_in_nursery(obj),
"object in nursery after collection")
# similarily, all objects should have this flag:
- ll_assert(self.header(obj).tid & GCFLAG_TRACK_YOUNG_PTRS,
+ ll_assert(self.header(obj).tid & GCFLAG_TRACK_YOUNG_PTRS != 0,
"missing GCFLAG_TRACK_YOUNG_PTRS")
# the GCFLAG_VISITED should not be set between collections
ll_assert(self.header(obj).tid & GCFLAG_VISITED == 0,
diff --git a/pypy/rpython/memory/gc/semispace.py
b/pypy/rpython/memory/gc/semispace.py
--- a/pypy/rpython/memory/gc/semispace.py
+++ b/pypy/rpython/memory/gc/semispace.py
@@ -640,7 +640,7 @@
between collections."""
tid = self.header(obj).tid
if tid & GCFLAG_EXTERNAL:
- ll_assert(tid & GCFLAG_FORWARDED, "bug: external+!forwarded")
+ ll_assert(tid & GCFLAG_FORWARDED != 0, "bug: external+!forwarded")
ll_assert(not (self.tospace <= obj < self.free),
"external flag but object inside the semispaces")
else:
diff --git a/pypy/rpython/memory/gctransform/framework.py
b/pypy/rpython/memory/gctransform/framework.py
--- a/pypy/rpython/memory/gctransform/framework.py
+++ b/pypy/rpython/memory/gctransform/framework.py
@@ -8,7 +8,6 @@
from pypy.rpython.memory.gcheader import GCHeaderBuilder
from pypy.rlib.rarithmetic import ovfcheck
from pypy.rlib import rgc
-from pypy.rlib.debug import ll_assert
from pypy.rlib.objectmodel import we_are_translated
from pypy.translator.backendopt import graphanalyze
from pypy.translator.backendopt.support import var_needsgc
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit