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