[pypy-commit] pypy remove-eval-frame: Remove eval.Frame class that didn't add value (and added foncusion)
alex_gaynor
noreply at buildbot.pypy.org
Fri Oct 25 19:27:34 CEST 2013
Author: Alex Gaynor <alex.gaynor at gmail.com>
Branch: remove-eval-frame
Changeset: r67606:d7fd8a64c1db
Date: 2013-10-25 10:26 -0700
http://bitbucket.org/pypy/pypy/changeset/d7fd8a64c1db/
Log: Remove eval.Frame class that didn't add value (and added foncusion)
diff --git a/pypy/interpreter/eval.py b/pypy/interpreter/eval.py
--- a/pypy/interpreter/eval.py
+++ b/pypy/interpreter/eval.py
@@ -2,7 +2,7 @@
This module defines the abstract base classes that support execution:
Code and Frame.
"""
-from pypy.interpreter.error import OperationError
+
from pypy.interpreter.baseobjspace import W_Root
@@ -51,88 +51,3 @@
def funcrun_obj(self, func, w_obj, args):
return self.funcrun(func, args.prepend(w_obj))
-
-
-class Frame(W_Root):
- """A frame is an environment supporting the execution of a code object.
- Abstract base class."""
-
- def __init__(self, space, w_globals=None):
- self.space = space
- self.w_globals = w_globals # wrapped dict of globals
- self.w_locals = None # wrapped dict of locals
-
- 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(self, space):
- return space.wrap(self.getcode())
-
- def fget_getdictscope(self, space):
- return self.getdictscope()
-
- def setdictscope(self, w_locals):
- "Initialize the locals from a dictionary."
- self.w_locals = w_locals
- self.locals2fast()
-
- def getfastscope(self):
- "Abstract. Get the fast locals as a list."
- raise TypeError("abstract")
-
- def setfastscope(self, scope_w):
- """Abstract. Initialize the fast locals from a list of values,
- where the order is according to self.getcode().signature()."""
- raise TypeError("abstract")
-
- def getfastscopelength(self):
- "Abstract. Get the expected number of locals."
- raise TypeError("abstract")
-
- def fast2locals(self):
- # Copy values from the fastlocals to self.w_locals
- if self.w_locals is None:
- self.w_locals = self.space.newdict()
- varnames = self.getcode().getvarnames()
- fastscope_w = self.getfastscope()
- for i in range(min(len(varnames), self.getfastscopelength())):
- name = varnames[i]
- w_value = fastscope_w[i]
- w_name = self.space.wrap(name)
- if w_value is not None:
- self.space.setitem(self.w_locals, w_name, w_value)
- else:
- try:
- self.space.delitem(self.w_locals, w_name)
- except OperationError as e:
- if not e.match(self.space, self.space.w_KeyError):
- raise
-
- def locals2fast(self):
- # Copy values from self.w_locals to the fastlocals
- assert self.w_locals is not None
- varnames = self.getcode().getvarnames()
- numlocals = self.getfastscopelength()
-
- new_fastlocals_w = [None] * numlocals
-
- for i in range(min(len(varnames), numlocals)):
- w_name = self.space.wrap(varnames[i])
- try:
- w_value = self.space.getitem(self.w_locals, w_name)
- except OperationError, e:
- if not e.match(self.space, self.space.w_KeyError):
- raise
- else:
- new_fastlocals_w[i] = w_value
-
- self.setfastscope(new_fastlocals_w)
diff --git a/pypy/interpreter/pyframe.py b/pypy/interpreter/pyframe.py
--- a/pypy/interpreter/pyframe.py
+++ b/pypy/interpreter/pyframe.py
@@ -1,19 +1,19 @@
""" PyFrame class implementation with the interpreter main loop.
"""
+from rpython.rlib import jit
+from rpython.rlib.debug import make_sure_not_resized, check_nonneg
+from rpython.rlib.jit import hint
+from rpython.rlib.objectmodel import we_are_translated, instantiate
+from rpython.rlib.rarithmetic import intmask, r_uint
from rpython.tool.pairtype import extendabletype
-from pypy.interpreter import eval, pycode
+
+from pypy.interpreter import eval, pycode, pytraceback
from pypy.interpreter.argument import Arguments
+from pypy.interpreter.baseobjspace import W_Root
from pypy.interpreter.error import OperationError, operationerrfmt
from pypy.interpreter.executioncontext import ExecutionContext
-from pypy.interpreter import pytraceback
-from rpython.rlib.objectmodel import we_are_translated, instantiate
-from rpython.rlib.jit import hint
-from rpython.rlib.debug import make_sure_not_resized, check_nonneg
-from rpython.rlib.rarithmetic import intmask, r_uint
-from rpython.rlib import jit
from pypy.tool import stdlib_opcode
-from rpython.tool.stdlib_opcode import host_bytecode_spec
# Define some opcodes used
for op in '''DUP_TOP POP_TOP SETUP_LOOP SETUP_EXCEPT SETUP_FINALLY
@@ -21,7 +21,8 @@
globals()[op] = stdlib_opcode.opmap[op]
HAVE_ARGUMENT = stdlib_opcode.HAVE_ARGUMENT
-class PyFrame(eval.Frame):
+
+class PyFrame(W_Root):
"""Represents a frame for a regular Python function
that needs to be interpreted.
@@ -56,8 +57,10 @@
"use space.FrameClass(), not directly PyFrame()")
self = hint(self, access_directly=True, fresh_virtualizable=True)
assert isinstance(code, pycode.PyCode)
+ self.space = space
+ self.w_globals = w_globals
+ self.w_locals = None
self.pycode = code
- eval.Frame.__init__(self, space, w_globals)
self.locals_stack_w = [None] * (code.co_nlocals + code.co_stacksize)
self.valuestackdepth = code.co_nlocals
self.lastblock = None
@@ -458,6 +461,59 @@
self.locals_stack_w[i] = scope_w[i]
self.init_cells()
+ def getdictscope(self):
+ """
+ Get the locals as a dictionary
+ """
+ self.fast2locals()
+ return self.w_locals
+
+ def setdictscope(self, w_locals):
+ """
+ Initialize the locals from a dictionary.
+ """
+ self.w_locals = w_locals
+ self.locals2fast()
+
+ def fast2locals(self):
+ # Copy values from the fastlocals to self.w_locals
+ if self.w_locals is None:
+ self.w_locals = self.space.newdict()
+ varnames = self.getcode().getvarnames()
+ fastscope_w = self.getfastscope()
+ for i in range(min(len(varnames), self.getfastscopelength())):
+ name = varnames[i]
+ w_value = fastscope_w[i]
+ w_name = self.space.wrap(name)
+ if w_value is not None:
+ self.space.setitem(self.w_locals, w_name, w_value)
+ else:
+ try:
+ self.space.delitem(self.w_locals, w_name)
+ except OperationError as e:
+ if not e.match(self.space, self.space.w_KeyError):
+ raise
+
+ def locals2fast(self):
+ # Copy values from self.w_locals to the fastlocals
+ assert self.w_locals is not None
+ varnames = self.getcode().getvarnames()
+ numlocals = self.getfastscopelength()
+
+ new_fastlocals_w = [None] * numlocals
+
+ for i in range(min(len(varnames), numlocals)):
+ w_name = self.space.wrap(varnames[i])
+ try:
+ w_value = self.space.getitem(self.w_locals, w_name)
+ except OperationError, e:
+ if not e.match(self.space, self.space.w_KeyError):
+ raise
+ else:
+ new_fastlocals_w[i] = w_value
+
+ self.setfastscope(new_fastlocals_w)
+
def init_cells(self):
"""Initialize cellvars from self.locals_stack_w.
This is overridden in nestedscope.py"""
@@ -475,6 +531,12 @@
def _setcellvars(self, cellvars):
pass
+ def fget_code(self, space):
+ return space.wrap(self.getcode())
+
+ def fget_getdictscope(self, space):
+ return self.getdictscope()
+
### line numbers ###
def fget_f_lineno(self, space):
@@ -488,7 +550,7 @@
"Returns the line number of the instruction currently being executed."
try:
new_lineno = space.int_w(w_new_lineno)
- except OperationError, e:
+ except OperationError:
raise OperationError(space.w_ValueError,
space.wrap("lineno must be an integer"))
diff --git a/pypy/interpreter/test/test_eval.py b/pypy/interpreter/test/test_eval.py
deleted file mode 100644
--- a/pypy/interpreter/test/test_eval.py
+++ /dev/null
@@ -1,69 +0,0 @@
-
-from pypy.interpreter.eval import Frame
-from pypy.interpreter.pycode import PyCode
-
-
-class TestFrame:
- def setup_method(self, method):
- def c(x, y, *args):
- pass
- code = PyCode._from_code(self.space, c.func_code)
-
- class ConcreteFastscopeFrame(Frame):
-
- def __init__(self, space, code, numlocals):
- self.code = code
- Frame.__init__(self, space)
- self.numlocals = numlocals
- self._fastlocals_w = [None] * self.numlocals
-
- def getcode(self):
- return self.code
-
- def setfastscope(self, scope_w):
- self._fastlocals_w = scope_w
-
- def getfastscope(self):
- return self._fastlocals_w
-
- def getfastscopelength(self):
- return self.numlocals
-
- self.f = ConcreteFastscopeFrame(self.space, code, numlocals=5)
-
-
- def test_fast2locals(self):
- space = self.space
- w = space.wrap
- self.f.fast2locals()
- assert space.eq_w(self.f.w_locals, self.space.wrap({}))
-
- self.f._fastlocals_w[0] = w(5)
- self.f.fast2locals()
- assert space.eq_w(self.f.w_locals, self.space.wrap({'x': 5}))
-
- self.f._fastlocals_w[2] = w(7)
- self.f.fast2locals()
- assert space.eq_w(self.f.w_locals, self.space.wrap({'x': 5, 'args': 7}))
-
- def sameList(self, l1, l2):
- assert len(l1) == len(l2)
- for w_1, w_2 in zip(l1, l2):
- assert (w_1 is None) == (w_2 is None)
- if w_1 is not None:
- assert self.space.eq_w(w_1, w_2)
-
- def test_locals2fast(self):
- w = self.space.wrap
- self.f.w_locals = self.space.wrap({})
- self.f.locals2fast()
- self.sameList(self.f._fastlocals_w, [None]*5)
-
- self.f.w_locals = self.space.wrap({'x': 5})
- self.f.locals2fast()
- self.sameList(self.f._fastlocals_w, [w(5)] + [None]*4)
-
- self.f.w_locals = self.space.wrap({'x':5, 'args':7})
- self.f.locals2fast()
- self.sameList(self.f._fastlocals_w, [w(5), None, w(7),
- None, None])
diff --git a/pypy/interpreter/typedef.py b/pypy/interpreter/typedef.py
--- a/pypy/interpreter/typedef.py
+++ b/pypy/interpreter/typedef.py
@@ -605,7 +605,7 @@
#
# Definition of the type's descriptors for all the internal types
-from pypy.interpreter.eval import Code, Frame
+from pypy.interpreter.eval import Code
from pypy.interpreter.pycode import PyCode, CO_VARARGS, CO_VARKEYWORDS
from pypy.interpreter.pyframe import PyFrame
from pypy.interpreter.pyopcode import SuspendedUnroller
@@ -711,13 +711,6 @@
BuiltinCode.typedef.acceptable_as_base_class = False
-Frame.typedef = TypeDef('internal-frame',
- f_code = GetSetProperty(Frame.fget_code),
- f_locals = GetSetProperty(Frame.fget_getdictscope),
- f_globals = interp_attrproperty_w('w_globals', cls=Frame),
- )
-Frame.typedef.acceptable_as_base_class = False
-
PyCode.typedef = TypeDef('code',
__new__ = interp2app(PyCode.descr_code__new__.im_func),
__eq__ = interp2app(PyCode.descr_code__eq__),
@@ -756,7 +749,10 @@
f_exc_value = GetSetProperty(PyFrame.fget_f_exc_value),
f_exc_traceback = GetSetProperty(PyFrame.fget_f_exc_traceback),
f_restricted = GetSetProperty(PyFrame.fget_f_restricted),
- **Frame.typedef.rawdict)
+ f_code = GetSetProperty(PyFrame.fget_code),
+ f_locals = GetSetProperty(PyFrame.fget_getdictscope),
+ f_globals = interp_attrproperty_w('w_globals', cls=PyFrame),
+)
PyFrame.typedef.acceptable_as_base_class = False
Module.typedef = TypeDef("module",
More information about the pypy-commit
mailing list