Author: Armin Rigo <[email protected]>
Branch:
Changeset: r64845:48357e1d63e1
Date: 2013-06-10 19:28 +0200
http://bitbucket.org/pypy/pypy/changeset/48357e1d63e1/
Log: fix for 123cde0fe60f
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
@@ -17,6 +17,7 @@
_attrs_ = ('keybox', 'source_op', '_cached_vinfo')
box = None
level = optimizer.LEVEL_NONNULL
+ is_about_raw = False
_cached_vinfo = None
def __init__(self, keybox, source_op=None):
@@ -395,6 +396,7 @@
class VRawBufferValue(AbstractVArrayValue):
+ is_about_raw = True
def __init__(self, cpu, logops, size, keybox, source_op):
AbstractVirtualValue.__init__(self, keybox, source_op)
@@ -457,6 +459,7 @@
class VRawSliceValue(AbstractVirtualValue):
+ is_about_raw = True
def __init__(self, rawbuffer_value, offset, keybox, source_op):
AbstractVirtualValue.__init__(self, keybox, source_op)
@@ -676,13 +679,17 @@
offsetbox = self.get_constant_box(op.getarg(1))
if value.is_virtual() and offsetbox is not None:
offset = offsetbox.getint()
- if isinstance(value, VRawBufferValue):
- self.make_virtual_raw_slice(value, offset, op.result, op)
- return
- elif isinstance(value, VRawSliceValue):
- offset = offset + value.offset
- self.make_virtual_raw_slice(value.rawbuffer_value, offset,
op.result, op)
- return
+ # the following check is constant-folded to False if the
+ # translation occurs without any VRawXxxValue instance around
+ if value.is_about_raw:
+ if isinstance(value, VRawBufferValue):
+ self.make_virtual_raw_slice(value, offset, op.result, op)
+ return
+ elif isinstance(value, VRawSliceValue):
+ offset = offset + value.offset
+ self.make_virtual_raw_slice(value.rawbuffer_value, offset,
+ op.result, op)
+ return
self.emit_operation(op)
def optimize_ARRAYLEN_GC(self, op):
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
@@ -451,6 +451,7 @@
class AbstractVirtualInfo(object):
kind = REF
+ is_about_raw = False
#def allocate(self, decoder, index):
# raise NotImplementedError
def equals(self, fieldnums):
@@ -461,7 +462,7 @@
def debug_prints(self):
raise NotImplementedError
-
+
class AbstractVirtualStructInfo(AbstractVirtualInfo):
def __init__(self, fielddescrs):
@@ -547,6 +548,7 @@
class VRawBufferStateInfo(AbstractVirtualInfo):
kind = INT
+ is_about_raw = True
def __init__(self, size, offsets, descrs):
self.size = size
@@ -772,7 +774,9 @@
assert self.virtuals_cache is not None
v = self.virtuals_cache.get_int(index)
if not v:
- v = self.rd_virtuals[index].allocate_int(self, index)
+ v = self.rd_virtuals[index]
+ assert v.is_about_raw and isinstance(v, VRawBufferStateInfo)
+ v = v.allocate_int(self, index)
ll_assert(v == self.virtuals_cache.get_int(index), "resume.py: bad
cache")
return v
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit