Author: Maciej Fijalkowski <fij...@gmail.com> Branch: optresult Changeset: r77764:e93151054fb5 Date: 2015-06-02 15:19 +0200 http://bitbucket.org/pypy/pypy/changeset/e93151054fb5/
Log: basic fixes to vstring 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 @@ -543,12 +543,14 @@ return opinfo def make_virtual_raw_memory(self, size, source_op): + raise Exception("unsupported") logops = self.optimizer.loop.logops vvalue = VRawBufferValue(self.optimizer.cpu, logops, size, source_op) self.make_equal_to(source_op, vvalue) return vvalue def make_virtual_raw_slice(self, rawbuffer_value, offset, source_op): + raise Exception("unsupported") vvalue = VRawSliceValue(rawbuffer_value, offset, source_op) self.make_equal_to(source_op, vvalue) return vvalue 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 @@ -49,10 +49,11 @@ class StrPtrInfo(info.NonNullPtrInfo): - _attrs_ = ('length', 'lenbound', 'lgtop', 'mode') + _attrs_ = ('length', 'lenbound', 'lgtop', 'mode', '_cached_vinfo') lenbound = None lgtop = None + _cached_vinfo = None def __init__(self, mode, is_virtual=False, length=-1): self.length = length @@ -191,6 +192,13 @@ offsetbox = _int_add(string_optimizer, offsetbox, CONST_1) return offsetbox + def visitor_walk_recursive(self, instbox, visitor, optimizer): + visitor.register_virtual_fields(instbox, self._chars) + + @specialize.argtype(1) + def visitor_dispatch_virtual_type(self, visitor): + return visitor.visit_vstrplain(self.mode is mode_unicode) + class VStringSliceInfo(StrPtrInfo): def __init__(self, s, start, length, mode): self.s = s @@ -276,6 +284,23 @@ targetbox, offsetbox, mode) return offsetbox + def visitor_walk_recursive(self, instbox, visitor, optimizer): + # we don't store the lengthvalue in guards, because the + # guard-failed code starts with a regular STR_CONCAT again + leftbox = self.vleft + rightbox = self.vright + visitor.register_virtual_fields(instbox, [leftbox, rightbox]) + leftinfo = optimizer.getptrinfo(leftbox) + rightinfo = optimizer.getptrinfo(rightbox) + if leftinfo and leftinfo.is_virtual(): + leftinfo.visitor_walk_recursive(leftbox, visitor, optimizer) + if rightinfo and rightinfo.is_virtual(): + rightinfo.visitor_walk_recursive(rightbox, visitor, optimizer) + + @specialize.argtype(1) + def visitor_dispatch_virtual_type(self, visitor): + return visitor.visit_vstrconcat(self.mode is mode_unicode) + # class __extend__(optimizer.OptValue): # """New methods added to the base class OptValue for this file.""" 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 @@ -684,7 +684,7 @@ # if 'box' is directly a ConstPtr, bypass the heapcache completely resvalue = executor.execute(self.metainterp.cpu, self.metainterp, rop.GETFIELD_GC_PURE_F, fielddescr, box) - return ConstPtr(resvalue) + return ConstFloat(resvalue) return self._opimpl_getfield_gc_any_pureornot( rop.GETFIELD_GC_PURE_F, box, fielddescr, 'f') @@ -694,7 +694,7 @@ # if 'box' is directly a ConstPtr, bypass the heapcache completely val = executor.execute(self.metainterp.cpu, self.metainterp, rop.GETFIELD_GC_PURE_R, fielddescr, box) - return ConstFloat(val) + return ConstPtr(val) return self._opimpl_getfield_gc_any_pureornot( rop.GETFIELD_GC_PURE_R, box, fielddescr, 'r') 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 @@ -289,7 +289,7 @@ self.snapshot_storage = snapshot_storage self.memo = memo - def make_virtual_info(self, descr, info, fieldnums): + def make_virtual_info(self, info, fieldnums): assert fieldnums is not None vinfo = info._cached_vinfo if vinfo is not None and vinfo.equals(fieldnums): @@ -455,8 +455,7 @@ assert info.is_virtual() fieldnums = [self._gettagged(box) for box in fieldboxes] - descr = info.vdescr - vinfo = self.make_virtual_info(descr, info, fieldnums) + vinfo = self.make_virtual_info(info, fieldnums) # if a new vinfo instance is made, we get the fieldnums list we # pass in as an attribute. hackish. if vinfo.fieldnums is not fieldnums: _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit