[pypy-svn] r5270 - in pypy/trunk/src/pypy/objspace/flow: . test
arigo at codespeak.net
arigo at codespeak.net
Thu Jun 24 18:34:03 CEST 2004
Author: arigo
Date: Thu Jun 24 18:34:03 2004
New Revision: 5270
Modified:
pypy/trunk/src/pypy/objspace/flow/flowcontext.py
pypy/trunk/src/pypy/objspace/flow/objspace.py
pypy/trunk/src/pypy/objspace/flow/test/test_objspace.py
Log:
* Yet another test file silently ignored because of ImportErrors
* Added support in FlowObjSpace for analyzing functions with free variables,
which means just making sure that the free variables get passed to the
interpreter properly, as Constants.
Modified: pypy/trunk/src/pypy/objspace/flow/flowcontext.py
==============================================================================
--- pypy/trunk/src/pypy/objspace/flow/flowcontext.py (original)
+++ pypy/trunk/src/pypy/objspace/flow/flowcontext.py Thu Jun 24 18:34:03 2004
@@ -63,10 +63,15 @@
class FlowExecutionContext(ExecutionContext):
- def __init__(self, space, code, globals, constargs={}):
+ def __init__(self, space, code, globals, constargs={}, closure=None):
ExecutionContext.__init__(self, space)
self.code = code
self.w_globals = w_globals = space.wrap(globals)
+ if closure is None:
+ self.closure = None
+ else:
+ from pypy.interpreter.nestedscope import Cell
+ self.closure = [Cell(Constant(value)) for value in closure]
frame = self.create_frame()
formalargcount = code.getformalargcount()
dummy = UndefinedConstant()
@@ -86,7 +91,8 @@
# create an empty frame suitable for the code object
# while ignoring any operation like the creation of the locals dict
self.crnt_ops = []
- return self.code.create_frame(self.space, self.w_globals)
+ return self.code.create_frame(self.space, self.w_globals,
+ self.closure)
def bytecode_trace(self, frame):
if isinstance(self.crnt_ops, ReplayList):
Modified: pypy/trunk/src/pypy/objspace/flow/objspace.py
==============================================================================
--- pypy/trunk/src/pypy/objspace/flow/objspace.py (original)
+++ pypy/trunk/src/pypy/objspace/flow/objspace.py Thu Jun 24 18:34:03 2004
@@ -72,8 +72,12 @@
"""
code = func.func_code
code = PyCode()._from_code(code)
+ if func.func_closure is None:
+ closure = None
+ else:
+ closure = [extract_cell_content(c) for c in func.func_closure]
ec = flowcontext.FlowExecutionContext(self, code, func.func_globals,
- constargs)
+ constargs, closure)
self.executioncontext = ec
ec.build_flow()
name = ec.graph.name
@@ -120,6 +124,16 @@
return 'implicitexc'
implicitexc = ImplicitExcValue()
+def extract_cell_content(c):
+ """Get the value contained in a CPython 'cell', as read through
+ the func_closure of a function object."""
+ import new
+ def hackout():
+ return hackout # this access becomes a cell reference
+ # now change the cell to become 'c'
+ hackout = new.function(hackout.func_code, {}, '', None, (c,))
+ return hackout()
+
def make_op(name, symbol, arity, specialnames):
if hasattr(FlowObjSpace, name):
return # Shouldn't do it
Modified: pypy/trunk/src/pypy/objspace/flow/test/test_objspace.py
==============================================================================
--- pypy/trunk/src/pypy/objspace/flow/test/test_objspace.py (original)
+++ pypy/trunk/src/pypy/objspace/flow/test/test_objspace.py Thu Jun 24 18:34:03 2004
@@ -1,10 +1,8 @@
import autopath
from pypy.tool import testit
-from pypy.objspace.flow.wrapper import *
-from pypy.translator.flowmodel import *
-class TestFlowOjSpace(testit.TestCase):
+class TestFlowObjSpace(testit.TestCase):
def setUp(self):
self.space = testit.objspace('flow')
@@ -63,7 +61,7 @@
def print_(i):
print i
- def test_print(self):
+ def dont_test_print(self): # app-level helpers confuse replay
x = self.codetest(self.print_)
self.show(x)
@@ -214,6 +212,16 @@
x = self.codetest(self.implicitIndexError)
self.show(x)
+ #__________________________________________________________
+ def freevar(self, x):
+ def adder(y):
+ return x+y
+ return adder
+
+ def test_freevar(self):
+ x = self.codetest(self.freevar(3))
+ self.show(x)
+
if __name__ == '__main__':
testit.main()
More information about the Pypy-commit
mailing list