[pypy-svn] r74376 - in pypy/branch/blackhole-improvement/pypy/jit: backend/llgraph codewriter metainterp

arigo at codespeak.net arigo at codespeak.net
Wed May 5 11:20:29 CEST 2010


Author: arigo
Date: Wed May  5 11:20:28 2010
New Revision: 74376

Modified:
   pypy/branch/blackhole-improvement/pypy/jit/backend/llgraph/llimpl.py
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/liveness.py
   pypy/branch/blackhole-improvement/pypy/jit/metainterp/executor.py
   pypy/branch/blackhole-improvement/pypy/jit/metainterp/history.py
   pypy/branch/blackhole-improvement/pypy/jit/metainterp/logger.py
   pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py
   pypy/branch/blackhole-improvement/pypy/jit/metainterp/resoperation.py
   pypy/branch/blackhole-improvement/pypy/jit/metainterp/typesystem.py
Log:
Pass the correct location of exceptions.
Complete some more executor.py.
Kill ConstAddr entirely, now that we have AddressAsInt.


Modified: pypy/branch/blackhole-improvement/pypy/jit/backend/llgraph/llimpl.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/backend/llgraph/llimpl.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/backend/llgraph/llimpl.py	Wed May  5 11:20:28 2010
@@ -7,7 +7,7 @@
 import sys
 from pypy.objspace.flow.model import Variable, Constant
 from pypy.annotation import model as annmodel
-from pypy.jit.metainterp.history import (ConstInt, ConstPtr, ConstAddr,
+from pypy.jit.metainterp.history import (ConstInt, ConstPtr,
                                          BoxInt, BoxPtr, BoxObj, BoxFloat,
                                          REF, INT, FLOAT)
 from pypy.rpython.lltypesystem import lltype, llmemory, rclass, rstr

Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/liveness.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/liveness.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/liveness.py	Wed May  5 11:20:28 2010
@@ -14,6 +14,7 @@
     'residual_call_',
     '(int|ref|float)_guard_value',
     'guard_class',
+    'int_(add|sub|mul)_ovf',
     ]
 
 # ____________________________________________________________

Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/executor.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/executor.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/executor.py	Wed May  5 11:20:28 2010
@@ -85,27 +85,34 @@
         return None
     raise AssertionError("bad rettype")
 
+def do_getarrayitem_gc(metainterp, arraybox, indexbox, arraydescr):
+    cpu = metainterp.cpu
+    array = arraybox.getref_base()
+    index = indexbox.getint()
+    if arraydescr.is_array_of_pointers():
+        return BoxPtr(cpu.bh_setarrayitem_gc_r(arraydescr, array, index))
+    elif arraydescr.is_array_of_floats():
+        return BoxFloat(cpu.bh_setarrayitem_gc_f(arraydescr, array, index))
+    else:
+        return BoxInt(cpu.bh_setarrayitem_gc_i(arraydescr, array, index))
+
 def do_setarrayitem_gc(metainterp, arraybox, indexbox, itembox, arraydescr):
     cpu = metainterp.cpu
     array = arraybox.getref_base()
     index = indexbox.getint()
-    if itembox.type == INT:
-        item = itembox.getint()
-        cpu.bh_setarrayitem_gc_i(arraydescr, array, index, item)
-    elif itembox.type == REF:
-        item = itembox.getref_base()
-        cpu.bh_setarrayitem_gc_r(arraydescr, array, index, item)
-    elif itembox.type == FLOAT:
-        item = itembox.getfloat()
-        cpu.bh_setarrayitem_gc_f(arraydescr, array, index, item)
+    if arraydescr.is_array_of_pointers():
+        cpu.bh_setarrayitem_gc_r(arraydescr, array, index,
+                                 itembox.getref_base())
+    elif arraydescr.is_array_of_floats():
+        cpu.bh_setarrayitem_gc_f(arraydescr, array, index, itembox.getfloat())
     else:
-        raise AssertionError("bad itembox.type")
+        cpu.bh_setarrayitem_gc_i(arraydescr, array, index, itembox.getint())
 
 def do_getfield_gc(metainterp, structbox, fielddescr):
     cpu = metainterp.cpu
     struct = structbox.getref_base()
     if fielddescr.is_pointer_field():
-        return BoxPtr(cpu.bh_getfield_gc_p(struct, fielddescr))
+        return BoxPtr(cpu.bh_getfield_gc_r(struct, fielddescr))
     elif fielddescr.is_float_field():
         return BoxFloat(cpu.bh_getfield_gc_f(struct, fielddescr))
     else:
@@ -115,12 +122,32 @@
     cpu = metainterp.cpu
     struct = structbox.getint()
     if fielddescr.is_pointer_field():
-        return BoxPtr(cpu.bh_getfield_raw_p(struct, fielddescr))
+        return BoxPtr(cpu.bh_getfield_raw_r(struct, fielddescr))
     elif fielddescr.is_float_field():
         return BoxFloat(cpu.bh_getfield_raw_f(struct, fielddescr))
     else:
         return BoxInt(cpu.bh_getfield_raw_i(struct, fielddescr))
 
+def do_setfield_gc(metainterp, structbox, itembox, fielddescr):
+    cpu = metainterp.cpu
+    struct = structbox.getref_base()
+    if fielddescr.is_pointer_field():
+        cpu.bh_setfield_gc_r(struct, fielddescr, itembox.getref_base())
+    elif fielddescr.is_float_field():
+        cpu.bh_setfield_gc_f(struct, fielddescr, itembox.getfloat())
+    else:
+        cpu.bh_setfield_gc_i(struct, fielddescr, itembox.getint())
+
+def do_setfield_raw(metainterp, structbox, itembox, fielddescr):
+    cpu = metainterp.cpu
+    struct = structbox.getint()
+    if fielddescr.is_pointer_field():
+        cpu.bh_setfield_raw_r(struct, fielddescr, itembox.getref_base())
+    elif fielddescr.is_float_field():
+        cpu.bh_setfield_raw_f(struct, fielddescr, itembox.getfloat())
+    else:
+        cpu.bh_setfield_raw_i(struct, fielddescr, itembox.getint())
+
 def do_int_add_ovf(metainterp, box1, box2):
     a = box1.getint()
     b = box2.getint()

Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/history.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/history.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/history.py	Wed May  5 11:20:28 2010
@@ -98,7 +98,7 @@
     def nonconstbox(self):
         raise NotImplementedError
 
-    def getaddr(self, cpu):
+    def getaddr(self):
         raise NotImplementedError
 
     def sort_key(self):
@@ -182,18 +182,13 @@
     __slots__ = ()
 
     @staticmethod
-    def _new(x, cpu):
+    def _new(x):
         "NOT_RPYTHON"
         T = lltype.typeOf(x)
         kind = getkind(T)
         if kind == "int":
             if isinstance(T, lltype.Ptr):
-                if not we_are_translated():
-                    # cannot store integers representing casted addresses
-                    # inside ConstInt() instances that are going through
-                    # translation; must use the special ConstAddr instead.
-                    return ConstAddr(x, cpu)
-                intval = cpu.cast_adr_to_int(llmemory.cast_ptr_to_adr(x))
+                intval = llmemory.cast_adr_to_int(llmemory.cast_ptr_to_adr(x))
             else:
                 intval = lltype.cast_primitive(lltype.Signed, x)
             return ConstInt(intval)
@@ -256,8 +251,8 @@
     def getint(self):
         return self.value
 
-    def getaddr(self, cpu):
-        return cpu.cast_int_to_adr(self.value)
+    def getaddr(self):
+        return llmemory.cast_int_to_adr(self.value)
 
     def _get_hash_(self):
         return self.value
@@ -281,50 +276,6 @@
 CONST_FALSE = ConstInt(0)
 CONST_TRUE  = ConstInt(1)
 
-class ConstAddr(Const):       # only for constants built before translation
-    type = INT
-    _attrs_ = ('value', 'cpu')
-
-    def __init__(self, adrvalue, cpu):
-        "NOT_RPYTHON"
-        assert not we_are_translated()
-        if isinstance(lltype.typeOf(adrvalue), lltype.Ptr):
-            adrvalue = llmemory.cast_ptr_to_adr(adrvalue)    # convenience
-        else:
-            assert lltype.typeOf(adrvalue) == llmemory.Address
-        self.value = adrvalue
-        self.cpu = cpu
-
-    def clonebox(self):
-        return BoxInt(self.cpu.cast_adr_to_int(self.value))
-
-    nonconstbox = clonebox
-
-    def getint(self):
-        return self.cpu.cast_adr_to_int(self.value)
-
-    def getaddr(self, cpu):
-        return self.value
-
-    def _get_hash_(self):
-        return llmemory.cast_adr_to_int(self.value)
-
-    def set_future_value(self, cpu, j):
-        cpu.set_future_value_int(j, self.getint())
-
-    def same_constant(self, other):
-        assert isinstance(other, Const)
-        return self.value == other.getaddr(self.cpu)
-
-    def nonnull(self):
-        return bool(self.value)
-
-    def _getrepr_(self):
-        return self.value
-
-    def repr_rpython(self):
-        return repr_rpython(self, 'ca')
-
 class ConstFloat(Const):
     type = FLOAT
     value = 0.0
@@ -388,7 +339,7 @@
         else:
             return 0
 
-    def getaddr(self, cpu):
+    def getaddr(self):
         return llmemory.cast_ptr_to_adr(self.value)
 
     def set_future_value(self, cpu, j):
@@ -441,7 +392,7 @@
     def set_future_value(self, cpu, j):
         cpu.set_future_value_ref(j, self.value)
 
-##    def getaddr(self, cpu):
+##    def getaddr(self):
 ##        # so far this is used only when calling
 ##        # CodeWriter.IndirectCallset.bytecode_for_address.  We don't need a
 ##        # real addr, but just a key for the dictionary
@@ -470,7 +421,7 @@
     is_box = True  # hint that we want to make links in graphviz from this
 
     @staticmethod
-    def _new(x, cpu):
+    def _new(x):
         "NOT_RPYTHON"
         kind = getkind(lltype.typeOf(x))
         if kind == "int":
@@ -533,8 +484,8 @@
     def getint(self):
         return self.value
 
-    def getaddr(self, cpu):
-        return cpu.cast_int_to_adr(self.value)
+    def getaddr(self):
+        return llmemory.cast_int_to_adr(self.value)
 
     def _get_hash_(self):
         return self.value
@@ -604,7 +555,7 @@
         return lltype.cast_opaque_ptr(PTR, self.getref_base())
     getref._annspecialcase_ = 'specialize:arg(1)'
 
-    def getaddr(self, cpu):
+    def getaddr(self):
         return llmemory.cast_ptr_to_adr(self.value)
 
     def _get_hash_(self):

Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/logger.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/logger.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/logger.py	Wed May  5 11:20:28 2010
@@ -1,9 +1,11 @@
 import os
 from pypy.rlib.debug import have_debug_prints
 from pypy.rlib.debug import debug_start, debug_stop, debug_print
+from pypy.rlib.objectmodel import we_are_translated
+from pypy.rpython.lltypesystem import llmemory
 from pypy.jit.metainterp.resoperation import rop
 from pypy.jit.metainterp.history import Const, ConstInt, Box, \
-     BoxInt, ConstAddr, ConstFloat, BoxFloat, AbstractFailDescr
+     BoxInt, ConstFloat, BoxFloat, AbstractFailDescr
 
 class Logger(object):
 
@@ -46,10 +48,16 @@
             mv = len(memo)
             memo[arg] = mv
         if isinstance(arg, ConstInt):
+            if int_could_be_an_address(arg.value):
+                addr = arg.getaddr()
+                name = self.metainterp_sd.get_name_from_address(addr)
+                if name:
+                    return 'ConstAddr(' + name + ')'
             return str(arg.value)
         elif isinstance(arg, BoxInt):
             return 'i' + str(mv)
         elif isinstance(arg, self.ts.ConstRef):
+            # XXX for ootype, this should also go through get_name_from_address
             return 'ConstPtr(ptr' + str(mv) + ')'
         elif isinstance(arg, self.ts.BoxRef):
             return 'p' + str(mv)
@@ -57,12 +65,6 @@
             return str(arg.value)
         elif isinstance(arg, BoxFloat):
             return 'f' + str(mv)
-        elif isinstance(arg, self.ts.ConstAddr):
-            addr = arg.getaddr(self.metainterp_sd.cpu)
-            name = self.metainterp_sd.get_name_from_address(addr)
-            if not name:
-                name = 'cls' + str(mv)
-            return 'ConstClass(' + name + ')'
         elif arg is None:
             return 'None'
         else:
@@ -102,3 +104,10 @@
                 fail_args = ''
             debug_print(res + op.getopname() +
                         '(' + args + ')' + fail_args)
+
+
+def int_could_be_an_address(x):
+    if we_are_translated():
+        return not (-32768 <= x <= 32767)
+    else:
+        return isinstance(x, llmemory.AddressAsInt)

Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py	Wed May  5 11:20:28 2010
@@ -148,10 +148,10 @@
 
     for _opimpl in ['int_add_ovf', 'int_sub_ovf', 'int_mul_ovf']:
         exec py.code.Source('''
-            @arguments("box", "box")
-            def opimpl_%s(self, b1, b2):
+            @arguments("orgpc", "box", "box")
+            def opimpl_%s(self, pc, b1, b2):
                 resbox = self.execute(rop.%s, b1, b2)
-                self.metainterp.handle_possible_overflow_error()
+                self.metainterp.handle_possible_overflow_error(pc)
                 return resbox
         ''' % (_opimpl, _opimpl.upper())).compile()
 
@@ -280,13 +280,13 @@
         except KeyError:
             pass
 
-    @XXX  #arguments("descr")
-    def opimpl_new(self, size):
-        self.execute_with_descr(rop.NEW, descr=size)
-
-    @XXX  #arguments("constbox")
-    def opimpl_new_with_vtable(self, vtablebox):
-        self.execute(rop.NEW_WITH_VTABLE, vtablebox)
+    @arguments("descr")
+    def opimpl_new(self, sizedescr):
+        return self.execute_with_descr(rop.NEW, sizedescr)
+
+    @arguments("descr")
+    def opimpl_new_with_vtable(self, sizevtabledescr):
+        return self.execute_with_descr(rop.NEW_WITH_VTABLE, sizevtabledescr)
 
     @XXX  #arguments("box")
     def opimpl_runtimenew(self, classbox):
@@ -611,15 +611,15 @@
     def opimpl_call(self, callee, varargs):
         return self.perform_call(callee, varargs)
 
-    @arguments("box", "descr", "boxes")
-    def _opimpl_residual_call1(self, funcbox, calldescr, argboxes):
-        return self.do_residual_call(funcbox, calldescr, argboxes, exc=True)
-    @arguments("box", "descr", "boxes2")
-    def _opimpl_residual_call2(self, funcbox, calldescr, argboxes):
-        return self.do_residual_call(funcbox, calldescr, argboxes, exc=True)
-    @arguments("box", "descr", "boxes3")
-    def _opimpl_residual_call3(self, funcbox, calldescr, argboxes):
-        return self.do_residual_call(funcbox, calldescr, argboxes, exc=True)
+    @arguments("orgpc", "box", "descr", "boxes")
+    def _opimpl_residual_call1(self, pc, funcbox, calldescr, argboxes):
+        return self.do_residual_call(funcbox, calldescr, argboxes, exc_at=pc)
+    @arguments("orgpc", "box", "descr", "boxes2")
+    def _opimpl_residual_call2(self, pc, funcbox, calldescr, argboxes):
+        return self.do_residual_call(funcbox, calldescr, argboxes, exc_at=pc)
+    @arguments("orgpc", "box", "descr", "boxes3")
+    def _opimpl_residual_call3(self, pc, funcbox, calldescr, argboxes):
+        return self.do_residual_call(funcbox, calldescr, argboxes, exc_at=pc)
 
     opimpl_residual_call_r_i = _opimpl_residual_call1
     opimpl_residual_call_r_r = _opimpl_residual_call1
@@ -856,12 +856,10 @@
 
     @arguments("box", "label")
     def opimpl_goto_if_exception_mismatch(self, vtablebox, next_exc_target):
-        # XXX use typesystem.py
-        from pypy.rpython.lltypesystem import rclass
-        assert self.last_exception is not None
-        adr = vtablebox.getaddr(self.metainterp.cpu)
-        bounding_class = llmemory.cast_adr_to_ptr(adr, rclass.CLASSTYPE)
-        if not rclass.ll_isinstance(self.last_exception, bounding_class):
+        metainterp = self.metainterp
+        last_exc_value_box = metainterp.last_exc_value_box
+        assert last_exc_value_box is not None
+        if not metainterp.cpu.ts.instanceOf(last_exc_value_box, vtablebox):
             self.pc = next_exc_target
 
     @arguments("box")
@@ -1016,16 +1014,16 @@
         return self.metainterp.execute_and_record(opnum, descr, *argboxes)
 
     @specialize.arg(1)
-    def execute_varargs(self, opnum, argboxes, descr, exc):
+    def execute_varargs(self, opnum, argboxes, descr, exc_at):
         resbox = self.metainterp.execute_and_record_varargs(opnum, argboxes,
                                                             descr=descr)
-        if exc:
-            self.metainterp.handle_possible_exception()
+        if exc_at >= 0:
+            self.metainterp.handle_possible_exception(exc_at)
         else:
             self.metainterp.assert_no_exception()
         return resbox
 
-    def do_residual_call(self, funcbox, descr, argboxes, exc):
+    def do_residual_call(self, funcbox, descr, argboxes, exc_at):
         allboxes = [funcbox] + argboxes
         effectinfo = descr.get_extra_info()
         if 0:# XXX effectinfo is None or effectinfo.forces_virtual_or_virtualizable:
@@ -1043,7 +1041,7 @@
             else:
                 return self.metainterp.assert_no_exception()
         else:
-            return self.execute_varargs(rop.CALL, allboxes, descr, exc)
+            return self.execute_varargs(rop.CALL, allboxes, descr, exc_at)
 
 # ____________________________________________________________
 
@@ -1835,26 +1833,26 @@
         # mark by replacing it with ConstPtr(NULL)
         self.virtualref_boxes[i+1] = self.cpu.ts.CONST_NULL
 
-    def handle_possible_exception(self):
+    def handle_possible_exception(self, pc):
         frame = self.framestack[-1]
         if self.last_exc_value_box:
             exception_box = self.cpu.ts.cls_of_box(self.last_exc_value_box)
-            op = frame.generate_guard(frame.pc, rop.GUARD_EXCEPTION,
+            op = frame.generate_guard(pc, rop.GUARD_EXCEPTION,
                                       None, [exception_box])
             if op:
                 op.result = self.last_exc_value_box
             self.finishframe_exception()
         else:
-            frame.generate_guard(frame.pc, rop.GUARD_NO_EXCEPTION, None, [])
+            frame.generate_guard(pc, rop.GUARD_NO_EXCEPTION, None, [])
 
-    def handle_possible_overflow_error(self):
+    def handle_possible_overflow_error(self, pc):
         frame = self.framestack[-1]
         if self.last_exc_value_box:
-            frame.generate_guard(frame.pc, rop.GUARD_OVERFLOW, None)
+            frame.generate_guard(pc, rop.GUARD_OVERFLOW, None)
             assert isinstance(self.last_exc_value_box, Const)
             self.finishframe_exception()
         else:
-            frame.generate_guard(frame.pc, rop.GUARD_NO_OVERFLOW, None)
+            frame.generate_guard(pc, rop.GUARD_NO_OVERFLOW, None)
 
     def assert_no_exception(self):
         assert not self.last_exc_value_box

Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/resoperation.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/resoperation.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/resoperation.py	Wed May  5 11:20:28 2010
@@ -206,7 +206,7 @@
     'GETFIELD_GC/1d',
     'GETFIELD_RAW/1d',
     'NEW/0d',
-    'NEW_WITH_VTABLE/1',
+    'NEW_WITH_VTABLE/0d',
     'NEW_ARRAY/1d',
     'FORCE_TOKEN/0',
     'VIRTUAL_REF/2',

Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/typesystem.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/typesystem.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/typesystem.py	Wed May  5 11:20:28 2010
@@ -44,7 +44,6 @@
     BASETYPE = llmemory.GCREF
     BoxRef = history.BoxPtr
     ConstRef = history.ConstPtr
-    ConstAddr = history.ConstAddr
     loops_done_with_this_frame_ref = None # patched by compile.py
     CONST_NULL = history.ConstPtr(history.ConstPtr.value)
     CVAL_NULLREF = None # patched by optimizeopt.py
@@ -76,12 +75,11 @@
         cls = llmemory.cast_ptr_to_adr(obj.typeptr)
         return history.ConstInt(llmemory.cast_adr_to_int(cls))
 
-    def subclassOf(self, cpu, clsbox1, clsbox2):
-        adr = clsbox2.getaddr(cpu)
+    def instanceOf(self, instbox, clsbox):
+        adr = clsbox.getaddr()
         bounding_class = llmemory.cast_adr_to_ptr(adr, rclass.CLASSTYPE)
-        adr = clsbox1.getaddr(cpu)
-        real_class = llmemory.cast_adr_to_ptr(adr, rclass.CLASSTYPE)
-        return rclass.ll_issubclass(real_class, bounding_class)
+        real_instance = instbox.getref(rclass.OBJECTPTR)
+        return rclass.ll_isinstance(real_instance, bounding_class)
 
     def get_exception_box(self, etype):
         return history.ConstInt(etype)
@@ -151,7 +149,6 @@
     BASETYPE = ootype.Object
     BoxRef = history.BoxObj
     ConstRef = history.ConstObj
-    ConstAddr = history.ConstObj
     loops_done_with_this_frame_ref = None # patched by compile.py
     CONST_NULL = history.ConstObj(history.ConstObj.value)
     CVAL_NULLREF = None # patched by optimizeopt.py



More information about the Pypy-commit mailing list