Author: Maciej Fijalkowski <fij...@gmail.com>
Branch: optresult
Changeset: r77778:63a86d7eb28c
Date: 2015-06-02 18:26 +0200
http://bitbucket.org/pypy/pypy/changeset/63a86d7eb28c/

Log:    fix quasiimmut + rpython fixes

diff --git a/rpython/jit/backend/llgraph/runner.py 
b/rpython/jit/backend/llgraph/runner.py
--- a/rpython/jit/backend/llgraph/runner.py
+++ b/rpython/jit/backend/llgraph/runner.py
@@ -95,6 +95,9 @@
         self.all_fielddescrs = heaptracker.all_fielddescrs(runner, S,
                                     get_field_descr=LLGraphCPU.fielddescrof)
 
+    def get_all_fielddescrs(self):
+        return self.all_fielddescrs
+
     def is_object(self):
         return self._is_object
 
@@ -114,9 +117,15 @@
         self.FIELD = getattr(S, fieldname)
         self.index = heaptracker.get_fielddescr_index_in(S, fieldname)
 
+    def get_parent_descr(self):
+        return self.parent_descr
+
     def get_vinfo(self):
         return self.vinfo
 
+    def get_index(self):
+        return self.index
+
     def __repr__(self):
         return 'FieldDescr(%r, %r)' % (self.S, self.fieldname)
 
diff --git a/rpython/jit/backend/llsupport/descr.py 
b/rpython/jit/backend/llsupport/descr.py
--- a/rpython/jit/backend/llsupport/descr.py
+++ b/rpython/jit/backend/llsupport/descr.py
@@ -45,6 +45,9 @@
         self.all_fielddescrs = all_fielddescrs
         self.vtable = vtable
 
+    def get_all_fielddescrs(self):
+        return self.all_fielddescrs
+
     def count_fields_if_immutable(self):
         return self.count_fields_if_immut
 
@@ -157,6 +160,12 @@
     def repr_of_descr(self):
         return '<Field%s %s %s>' % (self.flag, self.name, self.offset)
 
+    def get_parent_descr(self):
+        return self.parent_descr
+
+    def get_index(self):
+        return self.index
+
 
 def get_field_descr(gccache, STRUCT, fieldname):
     cache = gccache._cache_field
@@ -294,6 +303,9 @@
         self.arraydescr = arraydescr
         self.fielddescr = fielddescr
 
+    def get_arraydescr(self):
+        return self.arraydescr
+
     def sort_key(self):
         return self.fielddescr.sort_key()
 
diff --git a/rpython/jit/backend/llsupport/gc.py 
b/rpython/jit/backend/llsupport/gc.py
--- a/rpython/jit/backend/llsupport/gc.py
+++ b/rpython/jit/backend/llsupport/gc.py
@@ -152,6 +152,7 @@
     def _rewrite_changeable_constptrs(self, op, ops_with_movable_const_ptr, 
moving_obj_tracker):
         newops = []
         for arg_i in ops_with_movable_const_ptr[op]:
+            raise Exception("implement me")
             v = op.getarg(arg_i)
             # assert to make sure we got what we expected
             assert isinstance(v, ConstPtr)
diff --git a/rpython/jit/metainterp/executor.py 
b/rpython/jit/metainterp/executor.py
--- a/rpython/jit/metainterp/executor.py
+++ b/rpython/jit/metainterp/executor.py
@@ -76,6 +76,7 @@
                 metainterp.execute_raised(e)
             return None
         raise AssertionError("bad rettype")
+    do_call.func_name = "do_call_" + rettype
     return do_call
 
 do_call_r = new_do_call("r")
@@ -144,6 +145,7 @@
         cpu.bh_setarrayitem_raw_i(array, index, itembox.getint(), arraydescr)
 
 def do_getinteriorfield_gc(cpu, _, arraybox, indexbox, descr):
+    raise Exception("implement me")
     xxxx
     array = arraybox.getref_base()
     index = indexbox.getint()
@@ -179,6 +181,7 @@
     return cpu.bh_getfield_gc_f(struct, fielddescr)
 
 def do_getfield_raw(cpu, _, structbox, fielddescr):
+    raise Exception("implement me")    
     xxxx
     check_descr(fielddescr)
     struct = structbox.getint()
@@ -217,6 +220,7 @@
         cpu.bh_raw_store_i(addr, offset, valuebox.getint(), arraydescr)
 
 def do_raw_load(cpu, _, addrbox, offsetbox, arraydescr):
+    raise Exception("implement me")    
     xxx
     addr = addrbox.getint()
     offset = offsetbox.getint()
@@ -422,8 +426,8 @@
     # constant-folded away.  Only works if opnum and num_args are
     # constants, of course.
     func = EXECUTE_BY_NUM_ARGS[num_args, withdescr][opnum]
-    assert func is not None, "EXECUTE_BY_NUM_ARGS[%s, %s][%s]" % (
-        num_args, withdescr, resoperation.opname[opnum])
+    #assert func is not None, "EXECUTE_BY_NUM_ARGS[%s, %s][%s]" % (
+    #    num_args, withdescr, resoperation.opname[opnum])
     return func
 get_execute_function._annspecialcase_ = 'specialize:memo'
 
@@ -472,47 +476,52 @@
     else:
         assert op.type == 'f'
         return ConstFloat(op.getfloatstorage())
+
+unrolled_range = unrolling_iterable(range(rop._LAST))
     
 def execute_nonspec_const(cpu, metainterp, opnum, argboxes, descr=None,
                           type='i'):
-    return wrap_constant(_execute_nonspec(cpu, metainterp, opnum, argboxes,
-                                          descr))
+    for num in unrolled_range:
+        if num == opnum:
+            return wrap_constant(_execute_arglist(cpu, metainterp, num,
+                                                  argboxes, descr))
+    assert False
 
 @specialize.arg(2)
-def _execute_nonspec(cpu, metainterp, opnum, argboxes, descr=None):
-    arity = resoperation.oparity[opnum]
+def _execute_arglist(cpu, metainterp, opnum, argboxes, descr=None):
+    arity = resoperation.oparity[opnum]    
     assert arity == -1 or len(argboxes) == arity
     if resoperation.opwithdescr[opnum]:
         check_descr(descr)
         if arity == -1:
-            func = get_execute_funclist(-1, True)[opnum]
+            func = get_execute_function(opnum, -1, True)
             return func(cpu, metainterp, argboxes, descr)
         if arity == 0:
-            func = get_execute_funclist(0, True)[opnum]
+            func = get_execute_function(opnum, 0, True)
             return func(cpu, metainterp, descr)
         if arity == 1:
-            func = get_execute_funclist(1, True)[opnum]
+            func = get_execute_function(opnum, 1, True)
             return func(cpu, metainterp, argboxes[0], descr)
         if arity == 2:
-            func = get_execute_funclist(2, True)[opnum]
+            func = get_execute_function(opnum, 2, True)
             return func(cpu, metainterp, argboxes[0], argboxes[1], descr)
         if arity == 3:
-            func = get_execute_funclist(3, True)[opnum]
+            func = get_execute_function(opnum, 3, True)
             return func(cpu, metainterp, argboxes[0], argboxes[1], argboxes[2],
                         descr)
     else:
         assert descr is None
         if arity == 1:
-            func = get_execute_funclist(1, False)[opnum]
+            func = get_execute_function(opnum, 1, False)
             return func(cpu, metainterp, argboxes[0])
         if arity == 2:
-            func = get_execute_funclist(2, False)[opnum]
+            func = get_execute_function(opnum, 2, False)
             return func(cpu, metainterp, argboxes[0], argboxes[1])
         if arity == 3:
-            func = get_execute_funclist(3, False)[opnum]
+            func = get_execute_function(opnum, 3, False)
             return func(cpu, metainterp, argboxes[0], argboxes[1], argboxes[2])
         if arity == 5:    # copystrcontent, copyunicodecontent
-            func = get_execute_funclist(5, False)[opnum]
+            func = get_execute_function(opnum, 5, False)
             return func(cpu, metainterp, argboxes[0], argboxes[1],
                         argboxes[2], argboxes[3], argboxes[4])
     raise NotImplementedError
diff --git a/rpython/jit/metainterp/history.py 
b/rpython/jit/metainterp/history.py
--- a/rpython/jit/metainterp/history.py
+++ b/rpython/jit/metainterp/history.py
@@ -137,6 +137,8 @@
     def get_vinfo(self):
         raise NotImplementedError
 
+DONT_CHANGE = AbstractDescr()
+
 class AbstractFailDescr(AbstractDescr):
     index = -1
     final_descr = False
diff --git a/rpython/jit/metainterp/optimizeopt/heap.py 
b/rpython/jit/metainterp/optimizeopt/heap.py
--- a/rpython/jit/metainterp/optimizeopt/heap.py
+++ b/rpython/jit/metainterp/optimizeopt/heap.py
@@ -11,6 +11,7 @@
 from rpython.jit.metainterp.optimize import InvalidLoop
 from rpython.jit.metainterp.resoperation import rop, ResOperation, OpHelpers
 from rpython.rlib.objectmodel import we_are_translated
+from rpython.jit.metainterp.optimizeopt import info
 
 
 class BogusPureField(JitException):
@@ -40,8 +41,9 @@
         self.cached_infos.append(info)
 
     def invalidate(self, descr):
-        for info in self.cached_infos:
-            info._fields[descr.index] = None
+        for opinfo in self.cached_infos:
+            assert isinstance(opinfo, info.AbstractStructPtrInfo)
+            opinfo._fields[descr.get_index()] = None
         self.cached_infos = []
 
 
@@ -151,8 +153,9 @@
         opinfo.setitem(self.index, arg, self, optheap)
 
     def invalidate(self, descr):
-        for info in self.cached_infos:
-            info._items = None
+        for opinfo in self.cached_infos:
+            assert isinstance(opinfo, info.ArrayPtrInfo)
+            opinfo._items = None
         self.cached_infos = []
 
 class OptHeap(Optimization):
@@ -402,7 +405,7 @@
             return
         for idx, cf in submap.iteritems():
             if indexb is None or indexb.contains(idx):
-                cf.force_lazy_setfield(self, idx, can_cache)
+                cf.force_lazy_setfield(self, None, can_cache)
 
     def force_all_lazy_setfields_and_arrayitems(self):
         # XXX fix the complexity here
@@ -410,7 +413,7 @@
             cf.force_lazy_setfield(self, descr)
         for submap in self.cached_arrayitems.itervalues():
             for index, cf in submap.iteritems():
-                cf.force_lazy_setfield(self, index)
+                cf.force_lazy_setfield(self, None)
 
     def force_lazy_setfields_and_arrayitems_for_guard(self):
         pendingfields = []
diff --git a/rpython/jit/metainterp/optimizeopt/info.py 
b/rpython/jit/metainterp/optimizeopt/info.py
--- a/rpython/jit/metainterp/optimizeopt/info.py
+++ b/rpython/jit/metainterp/optimizeopt/info.py
@@ -11,6 +11,8 @@
 INFO_UNKNOWN = 2
 
 class AbstractInfo(AbstractValue):
+    _attrs_ = ()
+    
     is_info_class = True
 
     def force_box(self, op, optforce):
@@ -58,6 +60,9 @@
             return None
         return optimizer._newoperations[self.last_guard_pos]
 
+    def get_last_guard_pos(self):
+        return self.last_guard_pos
+
     def reset_last_guard_pos(self):
         self.last_guard_pos = -1
 
@@ -92,7 +97,7 @@
     _attrs_ = ('_fields',)
 
     def init_fields(self, descr):
-        self._fields = [None] * len(descr.all_fielddescrs)
+        self._fields = [None] * len(descr.get_all_fielddescrs())
 
     def clear_cache(self):
         assert not self.is_virtual()
@@ -100,22 +105,22 @@
 
     def setfield(self, descr, op, optheap=None, cf=None):
         if self._fields is None:
-            self.init_fields(descr.parent_descr)
-        self._fields[descr.index] = op
+            self.init_fields(descr.get_parent_descr())
+        self._fields[descr.get_index()] = op
         if cf is not None:
             assert not self.is_virtual()
             cf.register_dirty_field(self)
 
     def getfield(self, descr, optheap=None):
         if self._fields is None:
-            self.init_fields(descr.parent_descr)
-        return self._fields[descr.index]
+            self.init_fields(descr.get_parent_descr())
+        return self._fields[descr.get_index()]
 
     def _force_elements(self, op, optforce, descr):
         if self._fields is None:
             return 0
         count = 0
-        for i, flddescr in enumerate(descr.all_fielddescrs):
+        for i, flddescr in enumerate(descr.get_all_fielddescrs()):
             fld = self._fields[i]
             if fld is not None:
                 subbox = optforce.force_box(fld)
@@ -129,7 +134,7 @@
     def visitor_walk_recursive(self, instbox, visitor, optimizer):
         if visitor.already_seen_virtual(instbox):
             return
-        lst = self.vdescr.all_fielddescrs
+        lst = self.vdescr.get_all_fielddescrs()
         assert self.is_virtual()
         visitor.register_virtual_fields(instbox,
                                         [optimizer.get_box_replacement(box)
@@ -155,7 +160,7 @@
 
     @specialize.argtype(1)
     def visitor_dispatch_virtual_type(self, visitor):
-        fielddescrs = self.vdescr.all_fielddescrs
+        fielddescrs = self.vdescr.get_all_fielddescrs()
         assert self.is_virtual()
         return visitor.visit_virtual(self.vdescr, fielddescrs)
 
@@ -165,7 +170,7 @@
 
     @specialize.argtype(1)
     def visitor_dispatch_virtual_type(self, visitor):
-        fielddescrs = self.vdescr.all_fielddescrs
+        fielddescrs = self.vdescr.get_all_fielddescrs()
         assert self.is_virtual()
         return visitor.visit_vstruct(self.vdescr, fielddescrs)
 
@@ -187,6 +192,7 @@
 
     def getlenbound(self):
         if self.lenbound is None:
+            raise Exception("implement me - lenbound")
             xxx
         return self.lenbound
 
@@ -249,13 +255,14 @@
 class ArrayStructInfo(ArrayPtrInfo):
     def __init__(self, size, vdescr=None):
         self.length = size
-        lgt = len(vdescr.all_interiorfielddescrs)
+        lgt = len(vdescr.get_all_fielddescrs())
         self.vdescr = vdescr
         self._items = [None] * (size * lgt)
 
     def _compute_index(self, index, fielddescr):
-        one_size = len(fielddescr.arraydescr.all_interiorfielddescrs)
-        return index * one_size + fielddescr.fielddescr.index
+        raise Exception("implement virtual array of structs")
+        one_size = len(fielddescr.get_arraydescr().get_all_fielddescrs())
+        return index * one_size + fielddescr.fielddescr.get_index()
         
     def setinteriorfield_virtual(self, index, fielddescr, fld):
         index = self._compute_index(index, fielddescr)
@@ -267,7 +274,7 @@
 
     def _force_elements(self, op, optforce, descr):
         i = 0
-        fielddescrs = op.getdescr().all_interiorfielddescrs
+        fielddescrs = op.getdescr().get_all_fielddescrs()
         count = 0
         for index in range(self.length):
             for flddescr in fielddescrs:
@@ -294,7 +301,7 @@
         info = optheap.const_infos.get(ref, None)
         if info is None:
             info = StructPtrInfo()
-            info.init_fields(descr.parent_descr)
+            info.init_fields(descr.get_parent_descr())
             optheap.const_infos[ref] = info
         return info
 
@@ -314,7 +321,7 @@
         info = self._get_array_info(optheap)
         return info.getitem(index)
 
-    def setitem(self, index, op, cf, optheap=None):
+    def setitem(self, index, op, cf=None, optheap=None):
         info = self._get_array_info(optheap)
         info.setitem(index, op, cf)
 
@@ -349,25 +356,35 @@
 
     # --------------------- vstring -------------------
 
+    @specialize.arg(1)
     def _unpack_str(self, mode):
         return mode.hlstr(lltype.cast_opaque_ptr(
             lltype.Ptr(mode.LLTYPE), self._const.getref_base()))
 
+    @specialize.arg(2)
     def get_constant_string_spec(self, optforce, mode):
         return self._unpack_str(mode)
     
     def getstrlen(self, op, string_optimizer, mode, create_ops=True):
-        s = self._unpack_str(mode)
-        if s is None:
-            return None
-        return ConstInt(len(s))
+        from rpython.jit.metainterp.optimizeopt import vstring
+        
+        if mode is vstring.mode_string:
+            s = self._unpack_str(vstring.mode_string)
+            if s is None:
+                return None
+            return ConstInt(len(s))
+        else:
+            s = self._unpack_str(vstring.mode_unicode)            
+            if s is None:
+                return None
+            return ConstInt(len(s))
 
     def string_copy_parts(self, op, string_optimizer, targetbox, offsetbox,
                           mode):
         from rpython.jit.metainterp.optimizeopt import vstring
         from rpython.jit.metainterp.optimizeopt.optimizer import CONST_0
 
-        lgt = self.getstrlen(op, string_optimizer, mode, None)
+        lgt = self.getstrlen(op, string_optimizer, mode, False)
         return vstring.copy_str_content(string_optimizer, self._const,
                                         targetbox, CONST_0, offsetbox,
                                         lgt, mode)
diff --git a/rpython/jit/metainterp/optimizeopt/intbounds.py 
b/rpython/jit/metainterp/optimizeopt/intbounds.py
--- a/rpython/jit/metainterp/optimizeopt/intbounds.py
+++ b/rpython/jit/metainterp/optimizeopt/intbounds.py
@@ -569,12 +569,12 @@
             self.propagate_bounds_backward(op.getarg(1))
 
     def propagate_bounds_INT_LSHIFT(self, op):
-        v1 = self.getvalue(op.getarg(0))
-        v2 = self.getvalue(op.getarg(1))
-        r = self.getvalue(op)
-        b = r.getintbound().rshift_bound(v2.getintbound())
-        if v1.getintbound().intersect(b):
-            self.propagate_bounds_backward(op.getarg(0), v1)
+        b1 = self.getintbound(op.getarg(0))
+        b2 = self.getintbound(op.getarg(1))
+        r = self.getintbound(op)
+        b = r.rshift_bound(b2)
+        if b1.intersect(b):
+            self.propagate_bounds_backward(op.getarg(0))
 
     propagate_bounds_INT_ADD_OVF = propagate_bounds_INT_ADD
     propagate_bounds_INT_SUB_OVF = propagate_bounds_INT_SUB
diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py 
b/rpython/jit/metainterp/optimizeopt/optimizer.py
--- a/rpython/jit/metainterp/optimizeopt/optimizer.py
+++ b/rpython/jit/metainterp/optimizeopt/optimizer.py
@@ -305,7 +305,7 @@
             opinfo._known_class = class_const
         else:
             if opinfo is not None:
-                last_guard_pos = opinfo.last_guard_pos
+                last_guard_pos = opinfo.get_last_guard_pos()
             else:
                 last_guard_pos = -1
             opinfo = info.InstancePtrInfo(class_const)
@@ -633,17 +633,18 @@
         if isinstance(opinfo, info.AbstractVirtualPtrInfo):
             return opinfo
         elif opinfo is not None:
-            last_guard_pos = opinfo.last_guard_pos
+            last_guard_pos = opinfo.get_last_guard_pos()
         else:
             last_guard_pos = -1
         assert opinfo is None or opinfo.__class__ is info.NonNullPtrInfo
-        if op.is_getfield() or op.getopnum() == rop.SETFIELD_GC:
-            is_object = op.getdescr().parent_descr.is_object()
+        if (op.is_getfield() or op.getopnum() == rop.SETFIELD_GC or
+            op.getopnum() == rop.QUASIIMMUT_FIELD):
+            is_object = op.getdescr().get_parent_descr().is_object()
             if is_object:
                 opinfo = info.InstancePtrInfo()
             else:
                 opinfo = info.StructPtrInfo()
-            opinfo.init_fields(op.getdescr().parent_descr)
+            opinfo.init_fields(op.getdescr().get_parent_descr())
         elif op.is_getarrayitem() or op.getopnum() == rop.SETARRAYITEM_GC:
             opinfo = info.ArrayPtrInfo(op.getdescr())
         elif op.getopnum() == rop.GUARD_CLASS:
@@ -653,7 +654,8 @@
         elif op.getopnum() in (rop.UNICODELEN,):
             opinfo = vstring.StrPtrInfo(vstring.mode_unicode)
         else:
-            xxx
+            assert False, "operations %s unsupported" % op
+        assert isinstance(opinfo, info.NonNullPtrInfo)
         opinfo.last_guard_pos = last_guard_pos
         arg0.set_forwarded(opinfo)
         return opinfo
diff --git a/rpython/jit/metainterp/optimizeopt/rewrite.py 
b/rpython/jit/metainterp/optimizeopt/rewrite.py
--- a/rpython/jit/metainterp/optimizeopt/rewrite.py
+++ b/rpython/jit/metainterp/optimizeopt/rewrite.py
@@ -305,7 +305,7 @@
             info = self.getptrinfo(arg0)
             if info:
                 if info.is_virtual():
-                    xxx
+                    raise InvalidLoop("promote of a virtual")
                 old_guard_op = info.get_last_guard(self.optimizer)
                 if old_guard_op is not None:
                     op = self.replace_guard_class_with_guard_value(op, info,
@@ -393,9 +393,8 @@
         self.make_constant_class(op.getarg(0), expectedclassbox)
 
     def optimize_GUARD_NONNULL_CLASS(self, op):
-        xxx
-        value = self.getvalue(op.getarg(0))
-        if value.is_null():
+        info = self.getptrinfo(op.getarg(0))
+        if info and info.is_null():
             r = self.optimizer.metainterp_sd.logger_ops.repr_of_resop(op)
             raise InvalidLoop('A GUARD_NONNULL_CLASS (%s) was proven to '
                               'always fail' % r)
diff --git a/rpython/jit/metainterp/optimizeopt/simplify.py 
b/rpython/jit/metainterp/optimizeopt/simplify.py
--- a/rpython/jit/metainterp/optimizeopt/simplify.py
+++ b/rpython/jit/metainterp/optimizeopt/simplify.py
@@ -23,7 +23,8 @@
     optimize_CALL_PURE_N = optimize_CALL_PURE_I
 
     def optimize_CALL_LOOPINVARIANT_I(self, op):
-        op = op.copy_and_change(rop.CALL)
+        opnum = OpHelpers.call_for_descr(op.getdescr())
+        op = op.copy_and_change(opnum)
         self.emit_operation(op)
     optimize_CALL_LOOPINVARIANT_R = optimize_CALL_LOOPINVARIANT_I
     optimize_CALL_LOOPINVARIANT_F = optimize_CALL_LOOPINVARIANT_I
@@ -33,8 +34,7 @@
         pass
 
     def optimize_VIRTUAL_REF(self, op):
-        newop = ResOperation(rop.SAME_AS_R, [op.getarg(0)], op.result)
-        self.replace_op_with(op, newop)
+        newop = self.replace_op_with(op, rop.SAME_AS_R, [op.getarg(0)])
         self.emit_operation(newop)
 
     def optimize_QUASIIMMUT_FIELD(self, op):
diff --git a/rpython/jit/metainterp/optimizeopt/unroll.py 
b/rpython/jit/metainterp/optimizeopt/unroll.py
--- a/rpython/jit/metainterp/optimizeopt/unroll.py
+++ b/rpython/jit/metainterp/optimizeopt/unroll.py
@@ -8,7 +8,7 @@
 from rpython.jit.metainterp.optimizeopt.optimizer import Optimizer, 
Optimization
 from rpython.jit.metainterp.optimizeopt.virtualstate import 
(VirtualStateConstructor,
         ShortBoxes, BadVirtualState, VirtualStatesCantMatch)
-from rpython.jit.metainterp.resoperation import rop, ResOperation, 
DONT_CHANGE,\
+from rpython.jit.metainterp.resoperation import rop, ResOperation,\
      OpHelpers, AbstractInputArg, GuardResOp
 from rpython.jit.metainterp.resume import Snapshot
 from rpython.jit.metainterp import compile
diff --git a/rpython/jit/metainterp/optimizeopt/virtualize.py 
b/rpython/jit/metainterp/optimizeopt/virtualize.py
--- a/rpython/jit/metainterp/optimizeopt/virtualize.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualize.py
@@ -654,6 +654,7 @@
         # was already forced).
 
     def _optimize_JIT_FORCE_VIRTUAL(self, op):
+        raise Exception("implement me")
         vref = self.getvalue(op.getarg(1))
         vrefinfo = self.optimizer.metainterp_sd.virtualref_info
         if vref.is_virtual():
@@ -683,6 +684,7 @@
         if opinfo and opinfo.is_virtual():
             fieldop = opinfo.getfield(op.getdescr())
             if fieldop is None:
+                raise Exception("I think this is plain illegal")
                 xxx
                 fieldvalue = self.optimizer.new_const(op.getdescr())
             self.make_equal_to(op, fieldop)
@@ -736,8 +738,8 @@
             self.do_RAW_FREE(op)
         elif effectinfo.oopspecindex == EffectInfo.OS_JIT_FORCE_VIRTUALIZABLE:
             # we might end up having CALL here instead of COND_CALL
-            value = self.getvalue(op.getarg(1))
-            if value.is_virtual():
+            info = self.getptrinfo(op.getarg(1))
+            if info and info.is_virtual():
                 return
         else:
             self.emit_operation(op)
@@ -830,6 +832,7 @@
     def optimize_GETARRAYITEM_RAW_I(self, op):
         opinfo = self.getrawptrinfo(op.getarg(0))
         if opinfo and opinfo.is_virtual():
+            raise Exception("implement raw virtuals")
             xxx
             indexbox = self.get_constant_box(op.getarg(1))
             if indexbox is not None:
@@ -850,6 +853,7 @@
         if opinfo and opinfo.is_virtual():
             indexbox = self.get_constant_box(op.getarg(1))
             if indexbox is not None:
+                raise Exception("implement raw virtuals")
                 offset, itemsize, descr = self._unpack_arrayitem_raw_op(op, 
indexbox)
                 itemvalue = self.getvalue(op.getarg(2))
                 try:
@@ -868,6 +872,7 @@
         return offset, itemsize, descr
 
     def optimize_RAW_LOAD_I(self, op):
+        raise Exception("implement me")
         value = self.getvalue(op.getarg(0))
         if value.is_virtual():
             offsetbox = self.get_constant_box(op.getarg(1))
@@ -907,6 +912,7 @@
                 descr = op.getdescr()
                 fld = opinfo.getinteriorfield_virtual(indexbox.getint(), descr)
                 if fld is None:
+                    raise Exception("I think this is illegal")
                     xxx
                     fieldvalue = self.new_const(descr)
                 self.make_equal_to(op, fld)
diff --git a/rpython/jit/metainterp/optimizeopt/vstring.py 
b/rpython/jit/metainterp/optimizeopt/vstring.py
--- a/rpython/jit/metainterp/optimizeopt/vstring.py
+++ b/rpython/jit/metainterp/optimizeopt/vstring.py
@@ -1,11 +1,12 @@
 from rpython.jit.codewriter.effectinfo import EffectInfo
 from rpython.jit.metainterp.history import (BoxInt, Const, ConstInt, ConstPtr,
-    get_const_ptr_for_string, get_const_ptr_for_unicode, BoxPtr, REF, INT)
+    get_const_ptr_for_string, get_const_ptr_for_unicode, BoxPtr, REF, INT,
+    DONT_CHANGE)
 from rpython.jit.metainterp.optimizeopt import optimizer, virtualize
 from rpython.jit.metainterp.optimizeopt.optimizer import CONST_0, CONST_1
 from rpython.jit.metainterp.optimizeopt.optimizer import llhelper, REMOVED
 from rpython.jit.metainterp.optimizeopt.util import make_dispatcher_method
-from rpython.jit.metainterp.resoperation import rop, ResOperation, 
DONT_CHANGE,\
+from rpython.jit.metainterp.resoperation import rop, ResOperation,\
      AbstractResOp
 from rpython.jit.metainterp.optimizeopt import info
 from rpython.rlib.objectmodel import specialize, we_are_translated
@@ -48,8 +49,8 @@
 
 
 
-class StrPtrInfo(info.NonNullPtrInfo):
-    _attrs_ = ('length', 'lenbound', 'lgtop', 'mode', '_cached_vinfo')
+class StrPtrInfo(info.AbstractVirtualPtrInfo):
+    #_attrs_ = ('length', 'lenbound', 'lgtop', 'mode', '_cached_vinfo', 
'_is_virtual')
 
     lenbound = None
     lgtop = None
@@ -134,7 +135,7 @@
                                  CONST_0, offsetbox, lengthbox, mode)
 
 class VStringPlainInfo(StrPtrInfo):
-    _attrs_ = ('mode', '_is_virtual')
+    #_attrs_ = ('mode', '_is_virtual')
 
     _chars = None
     
@@ -143,7 +144,7 @@
             self._chars = [None] * length
         StrPtrInfo.__init__(self, mode, is_virtual, length)
 
-    def setitem(self, index, item):
+    def setitem(self, index, item, cf=None, optheap=None):
         self._chars[index] = item
 
     def setup_slice(self, longerlist, start, stop):
@@ -151,7 +152,7 @@
         self._chars = longerlist[start:stop]
         # slice the 'longerlist', which may also contain Nones
 
-    def getitem(self, index):
+    def getitem(self, index, optheap=None):
         return self._chars[index]
 
     def is_virtual(self):
@@ -162,7 +163,7 @@
             self.lgtop = ConstInt(len(self._chars))
         return self.lgtop
 
-    @specialize.arg(1)
+    @specialize.arg(2)
     def get_constant_string_spec(self, optforce, mode):
         for c in self._chars:
             if c is None or not c.is_constant():
@@ -172,7 +173,9 @@
 
     def string_copy_parts(self, op, string_optimizer, targetbox, offsetbox,
                           mode):
-        if not self.is_virtual() and not self.is_completely_initialized():
+        if not self.is_virtual():
+            # and not self.is_completely_initialized():
+            raise Exception("implement me")
             return VAbstractStringValue.string_copy_parts(
                 self, string_optimizer, targetbox, offsetbox, mode)
         else:
@@ -215,12 +218,12 @@
         return copy_str_content(string_optimizer, self.s, targetbox,
                                 self.start, offsetbox, self.lgtop, mode)
 
-    @specialize.arg(1)
+    @specialize.arg(2)
     def get_constant_string_spec(self, string_optimizer, mode):
         vstart = string_optimizer.getintbound(self.start)
         vlength = string_optimizer.getintbound(self.lgtop)
         if vstart.is_constant() and vlength.is_constant():
-            xxx
+            raise Exception("implement me")
             s1 = self.vstr.get_constant_string_spec(mode)
             if s1 is None:
                 return None
@@ -235,7 +238,7 @@
         return self.lgtop
 
 class VStringConcatInfo(StrPtrInfo):
-    _attrs_ = ('mode', 'vleft', 'vright', '_is_virtual')
+    #_attrs_ = ('mode', 'vleft', 'vright', '_is_virtual')
     
     def __init__(self, mode, vleft, vright, is_virtual):
         self.vleft = vleft
@@ -262,7 +265,7 @@
             # ^^^ may still be None, if string_optimizer is None
         return self.lgtop
 
-    @specialize.arg(1)
+    @specialize.arg(2)
     def get_constant_string_spec(self, string_optimizer, mode):
         ileft = string_optimizer.getptrinfo(self.vleft)
         s1 = ileft.get_constant_string_spec(string_optimizer, mode)
@@ -717,6 +720,7 @@
         self.make_vstring_slice(op, strbox, startbox, mode, lengthbox)
         return True
 
+    @specialize.arg(2)
     def opt_call_stroruni_STR_EQUAL(self, op, mode):
         arg1 = self.get_box_replacement(op.getarg(1))
         arg2 = self.get_box_replacement(op.getarg(2))
@@ -845,6 +849,7 @@
         return False
 
     def opt_call_stroruni_STR_CMP(self, op, mode):
+        raise Exception('implement me')
         v1 = self.getvalue(op.getarg(1))
         v2 = self.getvalue(op.getarg(2))
         l1box = v1.getstrlen(None, mode, None)
@@ -865,6 +870,7 @@
         return False
 
     def opt_call_SHRINK_ARRAY(self, op):
+        raise Exception('implement me')
         v1 = self.getvalue(op.getarg(1))
         v2 = self.getvalue(op.getarg(2))
         # If the index is constant, if the argument is virtual (we only support
diff --git a/rpython/jit/metainterp/pyjitpl.py 
b/rpython/jit/metainterp/pyjitpl.py
--- a/rpython/jit/metainterp/pyjitpl.py
+++ b/rpython/jit/metainterp/pyjitpl.py
@@ -818,7 +818,8 @@
                                        mutatefielddescr, orgpc):
         from rpython.jit.metainterp.quasiimmut import QuasiImmutDescr
         cpu = self.metainterp.cpu
-        descr = QuasiImmutDescr(cpu, box, fielddescr, mutatefielddescr)
+        descr = QuasiImmutDescr(cpu, box.getref_base(), fielddescr,
+                                mutatefielddescr)
         self.metainterp.history.record(rop.QUASIIMMUT_FIELD, [box],
                                        None, descr=descr)
         self.metainterp.generate_guard(rop.GUARD_NOT_INVALIDATED,
@@ -834,7 +835,8 @@
         # null, and the guard will be removed.  So the fact that the field is
         # quasi-immutable will have no effect, and instead it will work as a
         # regular, probably virtual, structure.
-        mutatebox = self.execute_with_descr(rop.GETFIELD_GC,
+        opnum = OpHelpers.getfield_for_descr(mutatefielddescr)
+        mutatebox = self.execute_with_descr(opnum,
                                             mutatefielddescr, box)
         if mutatebox.nonnull():
             from rpython.jit.metainterp.quasiimmut import 
do_force_quasi_immutable
@@ -1600,8 +1602,10 @@
                     self.metainterp.history.record(rop.KEEPALIVE, [vablebox], 
None)
                 self.metainterp.handle_possible_exception()
                 # XXX refactor: direct_libffi_call() is a hack
+                # does not work in the new system
                 if effectinfo.oopspecindex == effectinfo.OS_LIBFFI_CALL:
-                    self.metainterp.direct_libffi_call()
+                    raise Exception("implement OS_LIBFFI_CALL properly")
+                #    self.metainterp.direct_libffi_call()
                 return resbox
             else:
                 effect = effectinfo.extraeffect
diff --git a/rpython/jit/metainterp/quasiimmut.py 
b/rpython/jit/metainterp/quasiimmut.py
--- a/rpython/jit/metainterp/quasiimmut.py
+++ b/rpython/jit/metainterp/quasiimmut.py
@@ -109,6 +109,9 @@
         self.qmut = get_current_qmut_instance(cpu, struct, mutatefielddescr)
         self.constantfieldbox = self.get_current_constant_fieldvalue()
 
+    def get_parent_descr(self):
+        return self.fielddescr.get_parent_descr()
+
     def get_current_constant_fieldvalue(self):
         struct = self.struct
         fielddescr = self.fielddescr
diff --git a/rpython/jit/metainterp/resoperation.py 
b/rpython/jit/metainterp/resoperation.py
--- a/rpython/jit/metainterp/resoperation.py
+++ b/rpython/jit/metainterp/resoperation.py
@@ -35,8 +35,6 @@
             orig_op.set_forwarded(op)
         return op
 
-DONT_CHANGE = AbstractValue()
-
 def ResOperation(opnum, args, descr=None):
     cls = opclasses[opnum]
     op = cls()
@@ -120,6 +118,8 @@
 
     def copy_and_change(self, opnum, args=None, descr=None):
         "shallow copy: the returned operation is meant to be used in place of 
self"
+        from rpython.jit.metainterp.history import DONT_CHANGE
+        
         if args is None:
             args = self.getarglist()
         if descr is None:
diff --git a/rpython/jit/metainterp/resume.py b/rpython/jit/metainterp/resume.py
--- a/rpython/jit/metainterp/resume.py
+++ b/rpython/jit/metainterp/resume.py
@@ -12,6 +12,7 @@
 from rpython.rtyper.lltypesystem import lltype, llmemory, rffi, rstr
 from rpython.rtyper.rclass import OBJECTPTR
 from rpython.jit.metainterp.walkvirtual import VirtualVisitor
+from rpython.jit.metainterp.optimizeopt.info import AbstractVirtualPtrInfo
 
 
 # Logic to encode the chain of frames and the state of the boxes at a
@@ -453,6 +454,7 @@
                 num, _ = untag(self.liveboxes[virtualbox])
                 info = optimizer.getptrinfo(virtualbox)
                 assert info.is_virtual()
+                assert isinstance(info, AbstractVirtualPtrInfo)
                 fieldnums = [self._gettagged(box)
                              for box in fieldboxes]
                 vinfo = self.make_virtual_info(info, fieldnums)
@@ -1038,7 +1040,7 @@
         cic = self.metainterp.staticdata.callinfocollection
         calldescr, func = 
cic.callinfo_for_oopspec(EffectInfo.OS_RAW_MALLOC_VARSIZE_CHAR)
         return self.metainterp.execute_and_record_varargs(
-            rop.CALL, [ConstInt(func), ConstInt(size)], calldescr)
+            rop.CALL_I, [ConstInt(func), ConstInt(size)], calldescr)
 
     def allocate_string(self, length):
         return self.metainterp.execute_and_record(rop.NEWSTR,
@@ -1066,7 +1068,7 @@
         stopbox = self.metainterp.execute_and_record(rop.INT_ADD, None,
                                                      startbox, lengthbox)
         return self.metainterp.execute_and_record_varargs(
-            rop.CALL, [ConstInt(func), strbox, startbox, stopbox], calldescr)
+            rop.CALL_R, [ConstInt(func), strbox, startbox, stopbox], calldescr)
 
     def allocate_unicode(self, length):
         return self.metainterp.execute_and_record(rop.NEWUNICODE,
@@ -1083,7 +1085,7 @@
         str1box = self.decode_box(str1num, REF)
         str2box = self.decode_box(str2num, REF)
         return self.metainterp.execute_and_record_varargs(
-            rop.CALL, [ConstInt(func), str1box, str2box], calldescr)
+            rop.CALL_R, [ConstInt(func), str1box, str2box], calldescr)
 
     def slice_unicode(self, strnum, startnum, lengthnum):
         cic = self.metainterp.staticdata.callinfocollection
@@ -1094,7 +1096,7 @@
         stopbox = self.metainterp.execute_and_record(rop.INT_ADD, None,
                                                      startbox, lengthbox)
         return self.metainterp.execute_and_record_varargs(
-            rop.CALL, [ConstInt(func), strbox, startbox, stopbox], calldescr)
+            rop.CALL_R, [ConstInt(func), strbox, startbox, stopbox], calldescr)
 
     def setfield(self, structbox, fieldnum, descr):
         if descr.is_pointer_field():
diff --git a/rpython/jit/metainterp/test/test_resume.py 
b/rpython/jit/metainterp/test/test_resume.py
--- a/rpython/jit/metainterp/test/test_resume.py
+++ b/rpython/jit/metainterp/test/test_resume.py
@@ -135,6 +135,15 @@
     vinfo4 = modifier.make_virtual_info(v1, [1, 2, 6])
     assert vinfo3 is vinfo4
 
+def setvalue(op, val):
+    if op.type == 'i':
+        op.setint(val)
+    elif op.type == 'r':
+        op.setref_base(val)
+    elif op.type == 'f':
+        op.setfloatstorage(val)
+    else:
+        assert op.type == 'v'
 
 class MyMetaInterp:
     _already_allocated_resume_virtuals = None
@@ -155,7 +164,7 @@
     def execute_and_record(self, opnum, descr, *argboxes):
         resvalue = executor.execute(self.cpu, None, opnum, descr, *argboxes)
         op = ResOperation(opnum, list(argboxes), descr)
-        op.setvalue(resvalue)
+        setvalue(op, resvalue)
         self.trace.append((opnum, list(argboxes), resvalue, descr))
         return op
 
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to