Author: Ronan Lamy <[email protected]>
Branch: less-stringly-ops
Changeset: r66237:019245b1068b
Date: 2013-04-30 15:32 +0100
http://bitbucket.org/pypy/pypy/changeset/019245b1068b/
Log: Deal with FSFrame.last_instr a bit more explicitly
diff --git a/rpython/flowspace/flowcontext.py b/rpython/flowspace/flowcontext.py
--- a/rpython/flowspace/flowcontext.py
+++ b/rpython/flowspace/flowcontext.py
@@ -410,7 +410,7 @@
self.locals_stack_w[:len(items_w)] = items_w
self.dropvaluesuntil(len(items_w))
- def getstate(self):
+ def getstate(self, next_pos):
# getfastscope() can return real None, for undefined locals
data = self.save_locals_stack()
if self.last_exception is None:
@@ -420,7 +420,7 @@
data.append(self.last_exception.w_type)
data.append(self.last_exception.w_value)
recursively_flatten(data)
- return FrameState(data, self.blockstack[:], self.last_instr)
+ return FrameState(data, self.blockstack[:], next_pos)
def setstate(self, state):
""" Reset the frame to the given state. """
@@ -432,7 +432,6 @@
self.last_exception = None
else:
self.last_exception = FSException(data[-2], data[-1])
- self.last_instr = state.next_instr
self.blockstack = state.blocklist[:]
def guessbool(self, w_condition, **kwds):
@@ -478,11 +477,12 @@
def record_block(self, block):
self.setstate(block.framestate)
+ next_pos = block.framestate.next_instr
self.recorder = block.make_recorder()
try:
while True:
- self.last_instr = self.handle_bytecode(self.last_instr)
- self.recorder.final_state = self.getstate()
+ next_pos = self.handle_bytecode(next_pos)
+ self.recorder.final_state = self.getstate(next_pos)
except ImplicitOperationError, e:
if isinstance(e.w_type, Constant):
@@ -563,6 +563,7 @@
break
def handle_bytecode(self, next_instr):
+ self.last_instr = next_instr
next_instr, methodname, oparg = self.pycode.read(next_instr)
try:
res = getattr(self, methodname)(oparg)
diff --git a/rpython/flowspace/test/test_framestate.py
b/rpython/flowspace/test/test_framestate.py
--- a/rpython/flowspace/test/test_framestate.py
+++ b/rpython/flowspace/test/test_framestate.py
@@ -25,55 +25,55 @@
def test_eq_framestate(self):
frame = self.getframe(self.func_simple)
- fs1 = frame.getstate()
- fs2 = frame.getstate()
+ fs1 = frame.getstate(0)
+ fs2 = frame.getstate(0)
assert fs1 == fs2
def test_neq_hacked_framestate(self):
frame = self.getframe(self.func_simple)
- fs1 = frame.getstate()
+ fs1 = frame.getstate(0)
frame.locals_stack_w[frame.pycode.co_nlocals-1] = Variable()
- fs2 = frame.getstate()
+ fs2 = frame.getstate(0)
assert fs1 != fs2
def test_union_on_equal_framestates(self):
frame = self.getframe(self.func_simple)
- fs1 = frame.getstate()
- fs2 = frame.getstate()
+ fs1 = frame.getstate(0)
+ fs2 = frame.getstate(0)
assert fs1.union(fs2) == fs1
def test_union_on_hacked_framestates(self):
frame = self.getframe(self.func_simple)
- fs1 = frame.getstate()
+ fs1 = frame.getstate(0)
frame.locals_stack_w[frame.pycode.co_nlocals-1] = Variable()
- fs2 = frame.getstate()
+ fs2 = frame.getstate(0)
assert fs1.union(fs2) == fs2 # fs2 is more general
assert fs2.union(fs1) == fs2 # fs2 is more general
def test_restore_frame(self):
frame = self.getframe(self.func_simple)
- fs1 = frame.getstate()
+ fs1 = frame.getstate(0)
frame.locals_stack_w[frame.pycode.co_nlocals-1] = Variable()
frame.setstate(fs1)
- assert fs1 == frame.getstate()
+ assert fs1 == frame.getstate(0)
def test_copy(self):
frame = self.getframe(self.func_simple)
- fs1 = frame.getstate()
+ fs1 = frame.getstate(0)
fs2 = fs1.copy()
assert fs1 == fs2
def test_getvariables(self):
frame = self.getframe(self.func_simple)
- fs1 = frame.getstate()
+ fs1 = frame.getstate(0)
vars = fs1.getvariables()
assert len(vars) == 1
def test_getoutputargs(self):
frame = self.getframe(self.func_simple)
- fs1 = frame.getstate()
+ fs1 = frame.getstate(0)
frame.locals_stack_w[frame.pycode.co_nlocals-1] = Variable()
- fs2 = frame.getstate()
+ fs2 = frame.getstate(0)
outputargs = fs1.getoutputargs(fs2)
# 'x' -> 'x' is a Variable
# locals_w[n-1] -> locals_w[n-1] is Constant(None)
@@ -81,9 +81,9 @@
def test_union_different_constants(self):
frame = self.getframe(self.func_simple)
- fs1 = frame.getstate()
+ fs1 = frame.getstate(0)
frame.locals_stack_w[frame.pycode.co_nlocals-1] = Constant(42)
- fs2 = frame.getstate()
+ fs2 = frame.getstate(0)
fs3 = fs1.union(fs2)
frame.setstate(fs3)
assert isinstance(frame.locals_stack_w[frame.pycode.co_nlocals-1],
@@ -91,7 +91,7 @@
def test_union_spectag(self):
frame = self.getframe(self.func_simple)
- fs1 = frame.getstate()
+ fs1 = frame.getstate(0)
frame.locals_stack_w[frame.pycode.co_nlocals-1] = Constant(SpecTag())
- fs2 = frame.getstate()
+ fs2 = frame.getstate(0)
assert fs1.union(fs2) is None # UnionError
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit