[pypy-commit] pypy op_malloc_gc: hg merge default
arigo
noreply at buildbot.pypy.org
Mon Dec 19 07:26:17 CET 2011
Author: Armin Rigo <arigo at tunes.org>
Branch: op_malloc_gc
Changeset: r50693:5fab2978624a
Date: 2011-12-19 07:23 +0100
http://bitbucket.org/pypy/pypy/changeset/5fab2978624a/
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
@@ -106,9 +106,14 @@
_exception_emulator[1] = 0
self.saved_exc_value = rffi.cast(llmemory.GCREF, v_i)
+ def save_exception_memoryerr():
+ save_exception()
+ 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)
@@ -133,6 +138,13 @@
# 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()
+ exc = MemoryError()
+ exc = cast_instance_to_base_ptr(exc)
+ self.saved_exc_value = lltype.cast_opaque_ptr(llmemory.GCREF, exc)
+
from pypy.rlib import rstack
STACK_CHECK_SLOWPATH = lltype.Ptr(lltype.FuncType([lltype.Signed],
lltype.Void))
@@ -146,16 +158,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()
@@ -164,16 +179,23 @@
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, memoryerror=False):
+ if 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
@@ -257,7 +257,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,
+ memoryerror=True)
self.mc.CALL(imm(addr))
self.mc.MOV_ri(eax.value, self.cpu.propagate_exception_v)
self._call_footer()
More information about the pypy-commit
mailing list