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