[pypy-commit] pypy default: merged upstream
alex_gaynor
noreply at buildbot.pypy.org
Sun Apr 14 22:14:54 CEST 2013
Author: Alex Gaynor <alex.gaynor at gmail.com>
Branch:
Changeset: r63343:0e80ff8260ae
Date: 2013-04-14 13:14 -0700
http://bitbucket.org/pypy/pypy/changeset/0e80ff8260ae/
Log: merged upstream
diff --git a/rpython/jit/backend/test/runner_test.py b/rpython/jit/backend/test/runner_test.py
--- a/rpython/jit/backend/test/runner_test.py
+++ b/rpython/jit/backend/test/runner_test.py
@@ -2831,6 +2831,51 @@
assert self.cpu.get_int_value(deadframe, 0) == 97
assert not called
+ def test_assembler_call_propagate_exc(self):
+ excdescr = BasicFailDescr(666)
+ self.cpu.propagate_exception_descr = excdescr
+ self.cpu.setup_once() # xxx redo it, because we added
+ # propagate_exception
+
+ def assembler_helper(deadframe, virtualizable):
+ assert self.cpu.get_latest_descr(deadframe) is excdescr
+ # let's assume we handled that
+ return 3
+
+ FUNCPTR = lltype.Ptr(lltype.FuncType([llmemory.GCREF,
+ llmemory.GCREF],
+ lltype.Signed))
+ class FakeJitDriverSD:
+ index_of_virtualizable = -1
+ _assembler_helper_ptr = llhelper(FUNCPTR, assembler_helper)
+ assembler_helper_adr = llmemory.cast_ptr_to_adr(
+ _assembler_helper_ptr)
+
+ ops = '''
+ [i0]
+ p0 = newunicode(i0)
+ finish(p0)'''
+ loop = parse(ops)
+ looptoken = JitCellToken()
+ looptoken.outermost_jitdriver_sd = FakeJitDriverSD()
+ self.cpu.compile_loop(loop.inputargs, loop.operations, looptoken)
+ ARGS = [lltype.Signed] * 10
+ RES = lltype.Signed
+ FakeJitDriverSD.portal_calldescr = self.cpu.calldescrof(
+ lltype.Ptr(lltype.FuncType(ARGS, RES)), ARGS, RES,
+ EffectInfo.MOST_GENERAL)
+ ops = '''
+ [i0]
+ i11 = call_assembler(i0, descr=looptoken)
+ guard_not_forced()[]
+ finish(i11)
+ '''
+ loop = parse(ops, namespace=locals())
+ othertoken = JitCellToken()
+ self.cpu.compile_loop(loop.inputargs, loop.operations, othertoken)
+ deadframe = self.cpu.execute_token(othertoken, sys.maxint - 1)
+ assert self.cpu.get_int_value(deadframe, 0) == 3
+
def test_assembler_call_float(self):
if not self.cpu.supports_floats:
py.test.skip("requires floats")
@@ -3341,7 +3386,7 @@
excdescr = BasicFailDescr(666)
self.cpu.propagate_exception_descr = excdescr
self.cpu.setup_once() # xxx redo it, because we added
- # propagate_exception_v
+ # propagate_exception
i0 = BoxInt()
p0 = BoxPtr()
operations = [
diff --git a/rpython/jit/backend/x86/assembler.py b/rpython/jit/backend/x86/assembler.py
--- a/rpython/jit/backend/x86/assembler.py
+++ b/rpython/jit/backend/x86/assembler.py
@@ -563,7 +563,7 @@
if expected_size == -1:
mc.MOV_si(WORD, 0xffffff)
else:
- mc.MOV_si(WORD, expected_size)
+ mc.MOV_si(WORD, expected_size)
ofs2 = mc.get_relative_pos() - 4
self.push_gcmap(mc, gcmap, mov=True)
mc.CALL(imm(self._frame_realloc_slowpath))
@@ -601,7 +601,7 @@
mc = codebuf.MachineCodeBlockWrapper()
mc.writeimm32(allocated_depth)
mc.copy_to_raw_memory(adr)
-
+
def get_asmmemmgr_blocks(self, looptoken):
clt = looptoken.compiled_loop_token
if clt.asmmemmgr_blocks is None:
@@ -614,7 +614,7 @@
allblocks = self.get_asmmemmgr_blocks(looptoken)
return self.mc.materialize(self.cpu.asmmemmgr, allblocks,
self.cpu.gc_ll_descr.gcrootmap)
-
+
def patch_jump_for_descr(self, faildescr, adr_new_target):
adr_jump_offset = faildescr._x86_adr_jump_offset
assert adr_jump_offset != 0
@@ -812,7 +812,7 @@
else:
assert isinstance(to_loc, RawEspLoc)
self.mc.MOV32_si(to_loc.value, low_part)
- self.mc.MOV32_si(to_loc.value + 4, high_part)
+ self.mc.MOV32_si(to_loc.value + 4, high_part)
def regalloc_perform(self, op, arglocs, resloc):
genop_list[op.getopnum()](self, op, arglocs, resloc)
@@ -974,12 +974,13 @@
def _emit_call(self, x, arglocs, start=0, tmp=eax,
argtypes=None, callconv=FFI_DEFAULT_ABI, can_collect=1,
- stack_max=PASS_ON_MY_FRAME):
+ stack_max=PASS_ON_MY_FRAME, reload_frame=False):
if can_collect == 1 and not self._is_asmgcc():
can_collect = 2 # don't bother with jf_extra_stack_depth
if IS_X86_64:
return self._emit_call_64(x, arglocs, start, argtypes,
- can_collect, stack_max)
+ can_collect, stack_max,
+ reload_frame=reload_frame)
stack_depth = 0
n = len(arglocs)
for i in range(start, n):
@@ -1029,6 +1030,8 @@
ofs = self.cpu.get_ofs_of_frame_field('jf_extra_stack_depth')
self.mc.MOV_bi(ofs, 0)
self.pop_gcmap(self.mc)
+ elif reload_frame:
+ self._reload_frame_if_necessary(self.mc)
#
def _fix_stdcall(self, callconv, p):
@@ -1039,7 +1042,7 @@
self.mc.SUB_ri(esp.value, p)
def _emit_call_64(self, x, arglocs, start, argtypes,
- can_collect, stack_max):
+ can_collect, stack_max, reload_frame=False):
src_locs = []
dst_locs = []
xmm_src_locs = []
@@ -1129,6 +1132,8 @@
if align and can_collect == 1:
ofs = self.cpu.get_ofs_of_frame_field('jf_extra_stack_depth')
self.mc.MOV_bi(ofs, 0)
+ elif reload_frame:
+ self._reload_frame_if_necessary(self.mc)
if align:
self.mc.ADD_ri(esp.value, align * WORD)
if can_collect:
@@ -1658,7 +1663,7 @@
if exctploc is not None:
assert exctploc.is_reg()
mc.MOV(exctploc, heap(self.cpu.pos_exception()))
-
+
mc.MOV(heap(self.cpu.pos_exception()), imm0)
mc.MOV(heap(self.cpu.pos_exc_value()), imm0)
@@ -2072,7 +2077,8 @@
reg = edi
self.mc.LEA_rs(reg.value, css)
args = [reg]
- self._emit_call(imm(self.reacqgil_addr), args, can_collect=False)
+ self._emit_call(imm(self.reacqgil_addr), args, can_collect=False,
+ reload_frame=True)
# restore the result from the stack
if isinstance(save_loc, RegLoc) and not save_loc.is_xmm:
self.mc.MOV_rs(save_loc.value, WORD)
More information about the pypy-commit
mailing list