Author: hager <sven.ha...@uni-duesseldorf.de>
Branch: ppc-jit-backend
Changeset: r50755:81c255a5fb96
Date: 2011-12-20 15:36 +0100
http://bitbucket.org/pypy/pypy/changeset/81c255a5fb96/

Log:    begin of exceptopn handling during memory allocation

diff --git a/pypy/jit/backend/ppc/ppcgen/opassembler.py 
b/pypy/jit/backend/ppc/ppcgen/opassembler.py
--- a/pypy/jit/backend/ppc/ppcgen/opassembler.py
+++ b/pypy/jit/backend/ppc/ppcgen/opassembler.py
@@ -838,7 +838,7 @@
                 self.mc.std(r.r0.value, r.r3.value, self.cpu.vtable_offset)
 
     def emit_new_array(self, op, arglocs, regalloc):
-        # XXX handle memory errors
+        self.propagate_memoryerror_if_r3_is_null()
         if len(arglocs) > 0:
             value_loc, base_loc, ofs_length = arglocs
             if IS_PPC_32:
diff --git a/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py 
b/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
--- a/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
+++ b/pypy/jit/backend/ppc/ppcgen/ppc_assembler.py
@@ -102,6 +102,7 @@
         self.current_clt = None
         self._regalloc = None
         self.max_stack_params = 0
+        self.propagate_exception_path = 0
 
     def _save_nonvolatiles(self):
         """ save nonvolatile GPRs in GPR SAVE AREA 
@@ -290,6 +291,21 @@
             locs.append(loc)
         return locs
 
+    def _build_propagate_exception_path(self):
+        if self.cpu.propagate_exception_v < 0:
+            return
+
+        mc = PPCBuilder()
+        with Saved_Volatiles(mc):
+            addr = self.cpu.get_on_leave_jitted_int(save_exception=True)
+            mc.bl_abs(addr)
+        #mc.alloc_scratch_reg(self.cpu.propagate_exception_v)
+        #mc.mr(r.RES.value, r.SCRATCH.value)
+        #mc.free_scratch_reg()
+        mc.load_imm(r.RES, self.cpu.propagate_exception_v)
+        mc.prepare_insts_blocks()
+        self.propagate_exception_path = mc.materialize(self.cpu.asmmemmgr, [])
+
     def _gen_leave_jitted_hook_code(self, save_exc=False):
         mc = PPCBuilder()
 
@@ -328,7 +344,7 @@
         # load parameters into parameter registers
         if IS_PPC_32:
             mc.lwz(r.r3.value, r.SPP.value, self.ENCODING_AREA)     # address 
of state encoding 
-        else:
+        else: 
             mc.ld(r.r3.value, r.SPP.value, self.ENCODING_AREA)     
         mc.mr(r.r4.value, r.SP.value)          # load stack pointer
         mc.mr(r.r5.value, r.SPP.value)         # load spilling pointer
@@ -495,6 +511,7 @@
         gc_ll_descr.initialize()
         ll_new = gc_ll_descr.get_funcptr_for_new()
         self.malloc_func_addr = rffi.cast(lltype.Signed, ll_new)
+        self._build_propagate_exception_path()
         if gc_ll_descr.get_funcptr_for_newarray is not None:
             ll_new_array = gc_ll_descr.get_funcptr_for_newarray()
             self.malloc_array_func_addr = rffi.cast(lltype.Signed,
@@ -955,6 +972,10 @@
             assert gcrootmap.is_shadow_stack
             gcrootmap.write_callshape(mark, force_index)
 
+    def propagate_memoryerror_if_r3_is_null(self):
+        self.mc.cmp_op(0, r.RES.value, 0, imm=True)
+        self.mc.b_cond_abs(self.propagate_exception_path, c.EQ)
+
     def write_new_force_index(self):
         # for shadowstack only: get a new, unused force_index number and
         # write it to FORCE_INDEX_OFS.  Used to record the call shape
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to