[pypy-svn] r14631 - in pypy/dist/pypy: interpreter interpreter/test module/__builtin__ objspace objspace/flow objspace/std tool tool/pytest
pedronis at codespeak.net
pedronis at codespeak.net
Wed Jul 13 19:20:48 CEST 2005
Author: pedronis
Date: Wed Jul 13 19:20:34 2005
New Revision: 14631
Modified:
pypy/dist/pypy/interpreter/error.py
pypy/dist/pypy/interpreter/eval.py
pypy/dist/pypy/interpreter/executioncontext.py
pypy/dist/pypy/interpreter/gateway.py
pypy/dist/pypy/interpreter/generator.py
pypy/dist/pypy/interpreter/nestedscope.py
pypy/dist/pypy/interpreter/pyframe.py
pypy/dist/pypy/interpreter/pyopcode.py
pypy/dist/pypy/interpreter/pytraceback.py
pypy/dist/pypy/interpreter/test/test_eval.py
pypy/dist/pypy/interpreter/typedef.py
pypy/dist/pypy/module/__builtin__/compiling.py
pypy/dist/pypy/objspace/flow/flowcontext.py
pypy/dist/pypy/objspace/std/fake.py
pypy/dist/pypy/objspace/trace.py
pypy/dist/pypy/tool/pytest/appsupport.py
pypy/dist/pypy/tool/traceop.py
Log:
avoid that what was .code (now pycode) get improperly lifted to Frame from PyFrame and that various attributes of PyCode
get also lifted improperly to Code. Introduced an intermediary subclass eval.EvalFrame for .eval() based run/resume
behavior. Now PyFrame inherits from it.
Modified: pypy/dist/pypy/interpreter/error.py
==============================================================================
--- pypy/dist/pypy/interpreter/error.py (original)
+++ pypy/dist/pypy/interpreter/error.py Wed Jul 13 19:20:34 2005
@@ -89,7 +89,7 @@
import linecache
print >> file, "Traceback (application-level):"
while tb is not None:
- co = tb.frame.code
+ co = tb.frame.pycode
lineno = tb.lineno
fname = co.co_filename
if fname.startswith('<inline>\n'):
Modified: pypy/dist/pypy/interpreter/eval.py
==============================================================================
--- pypy/dist/pypy/interpreter/eval.py (original)
+++ pypy/dist/pypy/interpreter/eval.py Wed Jul 13 19:20:34 2005
@@ -54,38 +54,29 @@
"""A frame is an environment supporting the execution of a code object.
Abstract base class."""
- def __init__(self, space, code, w_globals=None, numlocals=-1):
+ def __init__(self, space, w_globals=None, numlocals=-1):
self.space = space
- self.code = code # Code instance
self.w_globals = w_globals # wrapped dict of globals
self.w_locals = None # wrapped dict of locals
if numlocals < 0: # compute the minimal size based on arguments
- numlocals = len(code.getvarnames())
+ numlocals = len(self.getcode().getvarnames())
self.numlocals = numlocals
- def resume(self):
- "Resume the execution of the frame from its current state."
- executioncontext = self.space.getexecutioncontext()
- executioncontext.enter(self)
- try:
- result = self.eval(executioncontext)
- finally:
- executioncontext.leave(self)
- return result
-
- # running a frame is usually the same as resuming it from its
- # initial state, but not for generator frames
- run = resume
-
- def eval(self, executioncontext):
- "Abstract method to override."
+ def run(self):
+ "Abstract method to override. Runs the frame"
raise TypeError, "abstract"
-
+
def getdictscope(self):
"Get the locals as a dictionary."
self.fast2locals()
return self.w_locals
+ def getcode(self):
+ return None
+
+ def fget_code(space, self):
+ return space.wrap(self.getcode())
+
def fget_getdictscope(space, self): # unwrapping through unwrap_spec in typedef.py
return self.getdictscope()
@@ -100,14 +91,14 @@
def setfastscope(self, scope_w):
"""Abstract. Initialize the fast locals from a list of values,
- where the order is according to self.code.signature()."""
+ where the order is according to self.getcode().signature()."""
raise TypeError, "abstract"
def fast2locals(self):
# Copy values from self.fastlocals_w to self.w_locals
if self.w_locals is None:
self.w_locals = self.space.newdict([])
- varnames = self.code.getvarnames()
+ varnames = self.getcode().getvarnames()
fastscope_w = self.getfastscope()
for i in range(min(len(varnames), len(fastscope_w))):
name = varnames[i]
@@ -119,7 +110,7 @@
def locals2fast(self):
# Copy values from self.w_locals to self.fastlocals_w
assert self.w_locals is not None
- varnames = self.code.getvarnames()
+ varnames = self.getcode().getvarnames()
new_fastlocals_w = [None]*self.numlocals
@@ -134,3 +125,27 @@
new_fastlocals_w[i] = w_value
self.setfastscope(new_fastlocals_w)
+
+
+class EvalFrame(Frame):
+
+ def resume(self):
+ "Resume the execution of the frame from its current state."
+ executioncontext = self.space.getexecutioncontext()
+ executioncontext.enter(self)
+ try:
+ result = self.eval(executioncontext)
+ finally:
+ executioncontext.leave(self)
+ return result
+
+ # running a frame is usually the same as resuming it from its
+ # initial state, but not for generator frames
+ run = resume
+
+ def eval(self, executioncontext):
+ "Abstract method to override."
+ raise TypeError, "abstract"
+
+ def hide(self):
+ return False
Modified: pypy/dist/pypy/interpreter/executioncontext.py
==============================================================================
--- pypy/dist/pypy/interpreter/executioncontext.py (original)
+++ pypy/dist/pypy/interpreter/executioncontext.py Wed Jul 13 19:20:34 2005
@@ -23,14 +23,14 @@
except:
frame.f_back = None
- if not frame.code.hidden_applevel:
+ if not frame.hide():
self.framestack.push(frame)
def leave(self, frame):
if self.w_profilefunc:
self._trace(frame, 'leaveframe', None)
- if not frame.code.hidden_applevel:
+ if not frame.hide():
self.framestack.pop()
def get_builtin(self):
@@ -59,7 +59,7 @@
"Trace function called before each bytecode."
if self.is_tracing or frame.w_f_trace is None:
return
- code = getattr(frame, 'code')
+ code = getattr(frame, 'pycode')
if frame.instr_lb <= frame.last_instr < frame.instr_ub:
return
@@ -136,7 +136,7 @@
self.is_tracing = is_tracing
def _trace(self, frame, event, w_arg, operr=None):
- if self.is_tracing or frame.code.hidden_applevel:
+ if self.is_tracing or frame.hide():
return
space = self.space
Modified: pypy/dist/pypy/interpreter/gateway.py
==============================================================================
--- pypy/dist/pypy/interpreter/gateway.py (original)
+++ pypy/dist/pypy/interpreter/gateway.py Wed Jul 13 19:20:34 2005
@@ -235,6 +235,13 @@
# Initialization of locals is already done by the time run() is called,
# via the interface defined in eval.Frame.
+ def __init__(self, space, code, w_globals=None, numlocals=-1):
+ self.bltn_code = code
+ eval.Frame.__init__(self, space, w_globals, numlocals)
+
+ def getcode(self):
+ return self.bltn_code
+
def setfastscope(self, scope_w):
"""Subclasses with behavior specific for an unwrap spec are generated"""
raise TypeError, "abstract"
Modified: pypy/dist/pypy/interpreter/generator.py
==============================================================================
--- pypy/dist/pypy/interpreter/generator.py (original)
+++ pypy/dist/pypy/interpreter/generator.py Wed Jul 13 19:20:34 2005
@@ -1,6 +1,6 @@
from pypy.interpreter.error import OperationError
from pypy.interpreter.baseobjspace import Wrappable
-from pypy.interpreter.eval import Frame
+from pypy.interpreter.eval import EvalFrame
from pypy.interpreter.pyframe import ControlFlowException, ExitFrame
#
@@ -12,7 +12,7 @@
# that return iterators).
#
-class GeneratorFrame(Frame):
+class GeneratorFrame(EvalFrame):
"A frame attached to a generator."
def run(self):
Modified: pypy/dist/pypy/interpreter/nestedscope.py
==============================================================================
--- pypy/dist/pypy/interpreter/nestedscope.py (original)
+++ pypy/dist/pypy/interpreter/nestedscope.py Wed Jul 13 19:20:34 2005
@@ -65,14 +65,14 @@
self.cells = [Cell() for i in range(ncellvars)] + closure
def getclosure(self):
- ncellvars = len(self.code.co_cellvars) # not part of the closure
+ ncellvars = len(self.pycode.co_cellvars) # not part of the closure
return self.cells[ncellvars:]
def fast2locals(self):
PyInterpFrame.fast2locals(self)
# cellvars are values exported to inner scopes
# freevars are values coming from outer scopes
- freevarnames = self.code.co_cellvars + self.code.co_freevars
+ freevarnames = self.pycode.co_cellvars + self.pycode.co_freevars
for i in range(len(freevarnames)):
name = freevarnames[i]
cell = self.cells[i]
@@ -86,7 +86,7 @@
def locals2fast(self):
PyInterpFrame.locals2fast(self)
- freevarnames = self.code.co_cellvars + self.code.co_freevars
+ freevarnames = self.pycode.co_cellvars + self.pycode.co_freevars
for i in range(len(freevarnames)):
name = freevarnames[i]
cell = self.cells[i]
@@ -101,10 +101,10 @@
def setfastscope(self, scope_w):
PyInterpFrame.setfastscope(self, scope_w)
- if self.code.co_cellvars:
+ if self.pycode.co_cellvars:
# the first few cell vars could shadow already-set arguments,
# in the same order as they appear in co_varnames
- code = self.code
+ code = self.pycode
argvars = code.co_varnames
cellvars = code.co_cellvars
next = 0
@@ -121,12 +121,12 @@
break # all cell vars initialized this way
def getfreevarname(self, index):
- freevarnames = self.code.co_cellvars + self.code.co_freevars
+ freevarnames = self.pycode.co_cellvars + self.pycode.co_freevars
return freevarnames[index]
def iscellvar(self, index):
# is the variable given by index a cell or a free var?
- return index < len(self.code.co_cellvars)
+ return index < len(self.pycode.co_cellvars)
### extra opcodes ###
Modified: pypy/dist/pypy/interpreter/pyframe.py
==============================================================================
--- pypy/dist/pypy/interpreter/pyframe.py (original)
+++ pypy/dist/pypy/interpreter/pyframe.py Wed Jul 13 19:20:34 2005
@@ -21,7 +21,7 @@
return sys.exc_info()[2]
cpython_tb._annspecialcase_ = "override:ignore"
-class PyFrame(eval.Frame):
+class PyFrame(eval.EvalFrame):
"""Represents a frame for a regular Python function
that needs to be interpreted.
@@ -37,7 +37,8 @@
"""
def __init__(self, space, code, w_globals, closure):
- eval.Frame.__init__(self, space, code, w_globals, code.co_nlocals)
+ self.pycode = code
+ eval.Frame.__init__(self, space, w_globals, code.co_nlocals)
self.valuestack = Stack()
self.blockstack = Stack()
self.last_exception = None
@@ -52,11 +53,17 @@
self.w_f_trace = None
self.last_instr = -1
self.f_back = None
- self.f_lineno = self.code.co_firstlineno
+ self.f_lineno = self.pycode.co_firstlineno
# For tracing
self.instr_lb = 0
self.instr_ub = -1
+
+ def hide(self):
+ return self.pycode.hidden_applevel
+
+ def getcode(self):
+ return self.pycode
def getfastscope(self):
"Get the fast locals as a list."
@@ -64,7 +71,7 @@
def setfastscope(self, scope_w):
"""Initialize the fast locals from a list of values,
- where the order is according to self.code.signature()."""
+ where the order is according to self.pycode.signature()."""
if len(scope_w) > len(self.fastlocals_w):
raise ValueError, "new fastscope is longer than the allocated area"
self.fastlocals_w[:len(scope_w)] = scope_w
@@ -145,15 +152,15 @@
raise OperationError(space.w_ValueError,
space.wrap("f_lineo can only be set by a trace function."))
- if new_lineno < self.code.co_firstlineno:
+ if new_lineno < self.pycode.co_firstlineno:
raise OperationError(space.w_ValueError,
space.wrap("line %d comes before the current code." % new_lineno))
- code = self.code.co_code
+ code = self.pycode.co_code
addr = 0
- line = self.code.co_firstlineno
+ line = self.pycode.co_firstlineno
new_lasti = -1
offset = 0
- lnotab = self.code.co_lnotab
+ lnotab = self.pycode.co_lnotab
for offset in xrange(0, len(lnotab), 2):
addr += ord(lnotab[offset])
line += ord(lnotab[offset + 1])
@@ -259,11 +266,11 @@
def get_last_lineno(self):
"Returns the line number of the instruction currently being executed."
- return pytraceback.offset2lineno(self.code, self.next_instr-1)
+ return pytraceback.offset2lineno(self.pycode, self.next_instr-1)
def get_next_lineno(self):
"Returns the line number of the next instruction to execute."
- return pytraceback.offset2lineno(self.code, self.next_instr)
+ return pytraceback.offset2lineno(self.pycode, self.next_instr)
def fget_f_builtins(space, self):
return self.builtin.getdict()
Modified: pypy/dist/pypy/interpreter/pyopcode.py
==============================================================================
--- pypy/dist/pypy/interpreter/pyopcode.py (original)
+++ pypy/dist/pypy/interpreter/pyopcode.py Wed Jul 13 19:20:34 2005
@@ -57,7 +57,7 @@
fn(self)
def nextop(self):
- c = self.code.co_code[self.next_instr]
+ c = self.pycode.co_code[self.next_instr]
self.next_instr += 1
return ord(c)
@@ -69,16 +69,16 @@
### accessor functions ###
def getlocalvarname(self, index):
- return self.code.co_varnames[index]
+ return self.pycode.co_varnames[index]
def getconstant_w(self, index):
- return self.code.co_consts_w[index]
+ return self.pycode.co_consts_w[index]
def getname_u(self, index):
- return self.code.co_names[index]
+ return self.pycode.co_names[index]
def getname_w(self, index):
- return self.space.wrap(self.code.co_names[index])
+ return self.space.wrap(self.pycode.co_names[index])
################################################################
@@ -113,9 +113,9 @@
# print " varindex:", varindex
# print " len(locals_w)", len(f.locals_w)
# import dis
- # print dis.dis(f.code)
- # print "co_varnames", f.code.co_varnames
- # print "co_nlocals", f.code.co_nlocals
+ # print dis.dis(f.pycode)
+ # print "co_varnames", f.pycode.co_varnames
+ # print "co_nlocals", f.pycode.co_nlocals
# raise
def POP_TOP(f):
@@ -348,7 +348,7 @@
w_locals = f.valuestack.pop()
w_globals = f.valuestack.pop()
w_prog = f.valuestack.pop()
- flags = f.space.getexecutioncontext().compiler.getcodeflags(f.code)
+ flags = f.space.getexecutioncontext().compiler.getcodeflags(f.pycode)
w_compile_flags = f.space.wrap(flags)
w_resulttuple = prepare_exec(f.space, f.space.wrap(f), w_prog,
w_globals, w_locals,
Modified: pypy/dist/pypy/interpreter/pytraceback.py
==============================================================================
--- pypy/dist/pypy/interpreter/pytraceback.py (original)
+++ pypy/dist/pypy/interpreter/pytraceback.py Wed Jul 13 19:20:34 2005
@@ -20,9 +20,9 @@
def record_application_traceback(space, operror, frame, last_instruction):
- if frame.code.hidden_applevel:
+ if frame.pycode.hidden_applevel:
return
- lineno = offset2lineno(frame.code, last_instruction)
+ lineno = offset2lineno(frame.pycode, last_instruction)
tb = operror.application_traceback
tb = PyTraceback(space, frame, last_instruction, lineno, tb)
operror.application_traceback = tb
Modified: pypy/dist/pypy/interpreter/test/test_eval.py
==============================================================================
--- pypy/dist/pypy/interpreter/test/test_eval.py (original)
+++ pypy/dist/pypy/interpreter/test/test_eval.py Wed Jul 13 19:20:34 2005
@@ -13,9 +13,13 @@
class ConcreteFastscopeFrame(Frame):
def __init__(self, space, code, numlocals):
- Frame.__init__(self, space, code, numlocals=numlocals)
+ self.code = code
+ Frame.__init__(self, space, numlocals=numlocals)
self.fastlocals_w = [None] * self.numlocals
+ def getcode(self):
+ return self.code
+
def setfastscope(self, scope_w):
self.fastlocals_w = scope_w
Modified: pypy/dist/pypy/interpreter/typedef.py
==============================================================================
--- pypy/dist/pypy/interpreter/typedef.py (original)
+++ pypy/dist/pypy/interpreter/typedef.py Wed Jul 13 19:20:34 2005
@@ -366,7 +366,7 @@
)
Frame.typedef = TypeDef('internal-frame',
- f_code = interp_attrproperty('code', cls=Frame),
+ f_code = GetSetProperty(Frame.fget_code),
f_locals = GetSetProperty(Frame.fget_getdictscope),
f_globals = interp_attrproperty_w('w_globals', cls=Frame),
)
Modified: pypy/dist/pypy/module/__builtin__/compiling.py
==============================================================================
--- pypy/dist/pypy/module/__builtin__/compiling.py (original)
+++ pypy/dist/pypy/module/__builtin__/compiling.py Wed Jul 13 19:20:34 2005
@@ -20,7 +20,7 @@
except IndexError:
pass
else:
- flags |= ec.compiler.getcodeflags(caller.code)
+ flags |= ec.compiler.getcodeflags(caller.getcode())
if mode not in ('exec', 'eval', 'single'):
raise OperationError(space.w_ValueError,
Modified: pypy/dist/pypy/objspace/flow/flowcontext.py
==============================================================================
--- pypy/dist/pypy/objspace/flow/flowcontext.py (original)
+++ pypy/dist/pypy/objspace/flow/flowcontext.py Wed Jul 13 19:20:34 2005
@@ -100,7 +100,7 @@
# If we have a SpamBlock, the first call to bytecode_trace()
# occurs as soon as frame.resume() starts, before interpretation
# really begins.
- varnames = frame.code.getvarnames()
+ varnames = frame.pycode.getvarnames()
for name, w_value in zip(varnames, frame.getfastscope()):
if isinstance(w_value, Variable):
w_value.rename(name)
Modified: pypy/dist/pypy/objspace/std/fake.py
==============================================================================
--- pypy/dist/pypy/objspace/std/fake.py (original)
+++ pypy/dist/pypy/objspace/std/fake.py Wed Jul 13 19:20:34 2005
@@ -136,13 +136,20 @@
class CPythonFakeFrame(eval.Frame):
+ def __init__(self, space, code, w_globals=None, numlocals=-1):
+ self.fakecode = code
+ eval.Frame.__init__(self, space, w_globals, numlocals)
+
+ def getcode(self):
+ return self.fakecode
+
def setfastscope(self, scope_w):
w_args, w_kwds = scope_w
try:
self.unwrappedargs = self.space.unwrap(w_args)
self.unwrappedkwds = self.space.unwrap(w_kwds)
except UnwrapError, e:
- code = self.code
+ code = self.fakecode
assert isinstance(code, CPythonFakeCode)
raise UnwrapError('calling %s: %s' % (code.cpy_callable, e))
@@ -150,7 +157,7 @@
raise OperationError(self.space.w_TypeError,
self.space.wrap("cannot get fastscope of a CPythonFakeFrame"))
def run(self):
- code = self.code
+ code = self.fakecode
assert isinstance(code, CPythonFakeCode)
fn = code.cpy_callable
try:
Modified: pypy/dist/pypy/objspace/trace.py
==============================================================================
--- pypy/dist/pypy/objspace/trace.py (original)
+++ pypy/dist/pypy/objspace/trace.py Wed Jul 13 19:20:34 2005
@@ -18,7 +18,7 @@
""" bytecode trace. """
def __init__(self, frame):
self.frame = frame
- self.code = frame.code
+ self.code = frame.pycode
self.index = frame.next_instr
class EnterFrame(object):
@@ -85,9 +85,9 @@
""" return (possibly cached) pydis result for the given frame. """
try:
- return _cache[id(frame.code)]
+ return _cache[id(frame.pycode)]
except KeyError:
- res = _cache[id(frame.code)] = pydis.pydis(frame.code)
+ res = _cache[id(frame.pycode)] = pydis.pydis(frame.pycode)
assert res is not None
return res
Modified: pypy/dist/pypy/tool/pytest/appsupport.py
==============================================================================
--- pypy/dist/pypy/tool/pytest/appsupport.py (original)
+++ pypy/dist/pypy/tool/pytest/appsupport.py Wed Jul 13 19:20:34 2005
@@ -10,7 +10,7 @@
class AppFrame(py.code.Frame):
def __init__(self, pyframe):
- self.code = py.code.Code(pyframe.code)
+ self.code = py.code.Code(pyframe.pycode)
self.lineno = pyframe.get_last_lineno() - 1
self.space = pyframe.space
self.w_globals = pyframe.w_globals
Modified: pypy/dist/pypy/tool/traceop.py
==============================================================================
--- pypy/dist/pypy/tool/traceop.py (original)
+++ pypy/dist/pypy/tool/traceop.py Wed Jul 13 19:20:34 2005
@@ -149,7 +149,7 @@
if isinstance(event, trace.EnterFrame):
frame = event.frame
- if self.show_hidden_applevel or not frame.code.hidden_applevel:
+ if self.show_hidden_applevel or not frame.pycode.hidden_applevel:
show = True
else:
show = False
@@ -183,7 +183,7 @@
# Check if we are in applevel?
if not self.show_hidden_applevel:
- if lastframe is None or lastframe.code.hidden_applevel:
+ if lastframe is None or lastframe.pycode.hidden_applevel:
show = False
# Check if recursive operations?
More information about the Pypy-commit
mailing list