Author: Maciej Fijalkowski <[email protected]>
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
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit