[pypy-commit] pypy jit-multilabel: hg merge default
hakanardo
noreply at buildbot.pypy.org
Mon Dec 19 18:21:55 CET 2011
Author: Hakan Ardo <hakan at debian.org>
Branch: jit-multilabel
Changeset: r50710:ac207c29864b
Date: 2011-12-19 08:07 +0100
http://bitbucket.org/pypy/pypy/changeset/ac207c29864b/
Log: hg merge default
diff --git a/pypy/jit/backend/llsupport/llmodel.py b/pypy/jit/backend/llsupport/llmodel.py
--- a/pypy/jit/backend/llsupport/llmodel.py
+++ b/pypy/jit/backend/llsupport/llmodel.py
@@ -107,9 +107,15 @@
_exception_emulator[1] = 0
self.saved_exc_value = rffi.cast(llmemory.GCREF, v_i)
+ def save_exception_memoryerr():
+ save_exception()
+ if not self.saved_exc_value:
+ self.saved_exc_value = "memoryerror!" # for tests
+
self.pos_exception = pos_exception
self.pos_exc_value = pos_exc_value
self.save_exception = save_exception
+ self.save_exception_memoryerr = save_exception_memoryerr
self.insert_stack_check = lambda: (0, 0, 0)
@@ -134,6 +140,15 @@
# in the assignment to self.saved_exc_value, as needed.
self.saved_exc_value = exc_value
+ def save_exception_memoryerr():
+ from pypy.rpython.annlowlevel import cast_instance_to_base_ptr
+ save_exception()
+ if not self.saved_exc_value:
+ exc = MemoryError()
+ exc = cast_instance_to_base_ptr(exc)
+ exc = lltype.cast_opaque_ptr(llmemory.GCREF, exc)
+ self.saved_exc_value = exc
+
from pypy.rlib import rstack
STACK_CHECK_SLOWPATH = lltype.Ptr(lltype.FuncType([lltype.Signed],
lltype.Void))
@@ -147,16 +162,19 @@
self.pos_exception = pos_exception
self.pos_exc_value = pos_exc_value
self.save_exception = save_exception
+ self.save_exception_memoryerr = save_exception_memoryerr
self.insert_stack_check = insert_stack_check
def _setup_on_leave_jitted_untranslated(self):
# assume we don't need a backend leave in this case
self.on_leave_jitted_save_exc = self.save_exception
+ self.on_leave_jitted_memoryerr = self.save_exception_memoryerr
self.on_leave_jitted_noexc = lambda : None
def _setup_on_leave_jitted_translated(self):
on_leave_jitted_hook = self.get_on_leave_jitted_hook()
save_exception = self.save_exception
+ save_exception_memoryerr = self.save_exception_memoryerr
def on_leave_jitted_noexc():
on_leave_jitted_hook()
@@ -165,16 +183,24 @@
save_exception()
on_leave_jitted_hook()
+ def on_leave_jitted_memoryerr():
+ save_exception_memoryerr()
+ on_leave_jitted_hook()
+
self.on_leave_jitted_noexc = on_leave_jitted_noexc
self.on_leave_jitted_save_exc = on_leave_jitted_save_exc
+ self.on_leave_jitted_memoryerr = on_leave_jitted_memoryerr
def get_on_leave_jitted_hook(self):
return lambda : None
_ON_JIT_LEAVE_FUNC = lltype.Ptr(lltype.FuncType([], lltype.Void))
- def get_on_leave_jitted_int(self, save_exception):
- if save_exception:
+ def get_on_leave_jitted_int(self, save_exception,
+ default_to_memoryerror=False):
+ if default_to_memoryerror:
+ f = llhelper(self._ON_JIT_LEAVE_FUNC, self.on_leave_jitted_memoryerr)
+ elif save_exception:
f = llhelper(self._ON_JIT_LEAVE_FUNC, self.on_leave_jitted_save_exc)
else:
f = llhelper(self._ON_JIT_LEAVE_FUNC, self.on_leave_jitted_noexc)
diff --git a/pypy/jit/backend/test/runner_test.py b/pypy/jit/backend/test/runner_test.py
--- a/pypy/jit/backend/test/runner_test.py
+++ b/pypy/jit/backend/test/runner_test.py
@@ -2930,6 +2930,8 @@
# overflowing value:
fail = self.cpu.execute_token(looptoken, sys.maxint // 4 + 1)
assert fail.identifier == excdescr.identifier
+ exc = self.cpu.grab_exc_value()
+ assert exc == "memoryerror!"
def test_compile_loop_with_target(self):
i0 = BoxInt()
diff --git a/pypy/jit/backend/x86/assembler.py b/pypy/jit/backend/x86/assembler.py
--- a/pypy/jit/backend/x86/assembler.py
+++ b/pypy/jit/backend/x86/assembler.py
@@ -275,7 +275,8 @@
#
self.mc = codebuf.MachineCodeBlockWrapper()
# call on_leave_jitted_save_exc()
- addr = self.cpu.get_on_leave_jitted_int(save_exception=True)
+ addr = self.cpu.get_on_leave_jitted_int(save_exception=True,
+ default_to_memoryerror=True)
self.mc.CALL(imm(addr))
self.mc.MOV_ri(eax.value, self.cpu.propagate_exception_v)
self._call_footer()
@@ -865,8 +866,8 @@
high_part = rffi.cast(rffi.CArrayPtr(rffi.INT), from_loc.value)[1]
low_part = intmask(low_part)
high_part = intmask(high_part)
- self.mc.MOV_bi(to_loc.value, low_part)
- self.mc.MOV_bi(to_loc.value + 4, high_part)
+ self.mc.MOV32_bi(to_loc.value, low_part)
+ self.mc.MOV32_bi(to_loc.value + 4, high_part)
def regalloc_perform(self, op, arglocs, resloc):
genop_list[op.getopnum()](self, op, arglocs, resloc)
diff --git a/pypy/module/_weakref/interp__weakref.py b/pypy/module/_weakref/interp__weakref.py
--- a/pypy/module/_weakref/interp__weakref.py
+++ b/pypy/module/_weakref/interp__weakref.py
@@ -329,11 +329,16 @@
special_ops = {'repr': True, 'userdel': True, 'hash': True}
for opname, _, arity, special_methods in ObjSpace.MethodTable:
- if opname in special_ops:
+ if opname in special_ops or not special_methods:
continue
nonspaceargs = ", ".join(["w_obj%s" % i for i in range(arity)])
code = "def func(space, %s):\n '''%s'''\n" % (nonspaceargs, opname)
- for i in range(arity):
+ assert arity >= len(special_methods)
+ forcing_count = len(special_methods)
+ if opname.startswith('inplace_'):
+ assert arity == 2
+ forcing_count = arity
+ for i in range(forcing_count):
code += " w_obj%s = force(space, w_obj%s)\n" % (i, i)
code += " return space.%s(%s)" % (opname, nonspaceargs)
exec py.code.Source(code).compile()
diff --git a/pypy/module/_weakref/test/test_weakref.py b/pypy/module/_weakref/test/test_weakref.py
--- a/pypy/module/_weakref/test/test_weakref.py
+++ b/pypy/module/_weakref/test/test_weakref.py
@@ -466,3 +466,44 @@
# No exception should be raised here
gc.collect()
+ def test_add(self):
+ import _weakref
+ class A(object):
+ def __add__(self, other):
+ return other
+ a1 = A()
+ a2 = A()
+ p1 = _weakref.proxy(a1)
+ p2 = _weakref.proxy(a2)
+ a3 = p1 + p2
+ assert a3 is a2
+
+ def test_inplace_add(self):
+ import _weakref
+ class A(object):
+ def __add__(self, other):
+ return other
+ a1 = A()
+ a2 = A()
+ p1 = _weakref.proxy(a1)
+ p2 = _weakref.proxy(a2)
+ p1 += p2
+ assert p1 is a2
+
+ def test_setattr(self):
+ import _weakref
+ class A(object):
+ def __setitem__(self, key, value):
+ self.setkey = key
+ self.setvalue = value
+ a1 = A()
+ a2 = A()
+ p1 = _weakref.proxy(a1)
+ p2 = _weakref.proxy(a2)
+ p1[p2] = 42
+ assert a1.setkey is p2
+ assert a1.setvalue == 42
+ #
+ p1[42] = p2
+ assert a1.setkey == 42
+ assert a1.setvalue is p2
More information about the pypy-commit
mailing list