[pypy-commit] pypy default: move w_locals to the debug subobject
fijal
noreply at buildbot.pypy.org
Mon May 4 14:07:21 CEST 2015
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch:
Changeset: r77037:1d2f92dd9385
Date: 2015-05-04 14:06 +0200
http://bitbucket.org/pypy/pypy/changeset/1d2f92dd9385/
Log: move w_locals to the debug subobject
diff --git a/pypy/interpreter/pyframe.py b/pypy/interpreter/pyframe.py
--- a/pypy/interpreter/pyframe.py
+++ b/pypy/interpreter/pyframe.py
@@ -32,6 +32,7 @@
instr_prev_plus_one = 0
f_lineno = -1 # current lineno
is_being_profiled = False
+ w_locals = None
class PyFrame(W_Root):
"""Represents a frame for a regular Python function
@@ -40,7 +41,8 @@
Public fields:
* 'space' is the object space this frame is running in
* 'code' is the PyCode object this frame runs
- * 'w_locals' is the locals dictionary to use
+ * 'w_locals' is the locals dictionary to use, if needed, stored on a
+ debug object
* 'w_globals' is the attached globals dictionary
* 'builtin' is the attached built-in module
* 'valuestack_w', 'blockstack', control the interpretation
@@ -63,7 +65,6 @@
debugdata = None
w_globals = None
- w_locals = None # dict containing locals, if forced or necessary
pycode = None # code object executed by that frame
locals_stack_w = None # the list of all locals and valuestack
valuestackdepth = 0 # number of items on valuestack
@@ -118,7 +119,13 @@
d = self.getdebug()
if d is None:
return False
- return d.is_being_profiled
+ return d.is_being_profiled
+
+ def get_w_locals(self):
+ d = self.getdebug()
+ if d is None:
+ return None
+ return d.w_locals
def __repr__(self):
# NOT_RPYTHON: useful in tracebacks
@@ -182,10 +189,10 @@
flags = code.co_flags
if not (flags & pycode.CO_OPTIMIZED):
if flags & pycode.CO_NEWLOCALS:
- self.w_locals = self.space.newdict(module=True)
+ self.getorcreatedebug().w_locals = self.space.newdict(module=True)
else:
assert self.w_globals is not None
- self.w_locals = self.w_globals
+ self.getorcreatedebug().w_locals = self.w_globals
ncellvars = len(code.co_cellvars)
nfreevars = len(code.co_freevars)
@@ -545,30 +552,31 @@
Get the locals as a dictionary
"""
self.fast2locals()
- return self.w_locals
+ return self.debugdata.w_locals
def setdictscope(self, w_locals):
"""
Initialize the locals from a dictionary.
"""
- self.w_locals = w_locals
+ self.getorcreatedebug().w_locals = w_locals
self.locals2fast()
@jit.unroll_safe
def fast2locals(self):
# Copy values from the fastlocals to self.w_locals
- if self.w_locals is None:
- self.w_locals = self.space.newdict()
+ d = self.getorcreatedebug()
+ if d.w_locals is None:
+ d.w_locals = self.space.newdict()
varnames = self.getcode().getvarnames()
for i in range(min(len(varnames), self.getcode().co_nlocals)):
name = varnames[i]
w_value = self.locals_stack_w[i]
if w_value is not None:
- self.space.setitem_str(self.w_locals, name, w_value)
+ self.space.setitem_str(d.w_locals, name, w_value)
else:
w_name = self.space.wrap(name)
try:
- self.space.delitem(self.w_locals, w_name)
+ self.space.delitem(d.w_locals, w_name)
except OperationError as e:
if not e.match(self.space, self.space.w_KeyError):
raise
@@ -587,13 +595,14 @@
except ValueError:
pass
else:
- self.space.setitem_str(self.w_locals, name, w_value)
+ self.space.setitem_str(d.w_locals, name, w_value)
@jit.unroll_safe
def locals2fast(self):
# Copy values from self.w_locals to the fastlocals
- assert self.w_locals is not None
+ w_locals = self.getorcreatedebug().w_locals
+ assert w_locals is not None
varnames = self.getcode().getvarnames()
numlocals = self.getcode().co_nlocals
@@ -601,7 +610,7 @@
for i in range(min(len(varnames), numlocals)):
name = varnames[i]
- w_value = self.space.finditem_str(self.w_locals, name)
+ w_value = self.space.finditem_str(w_locals, name)
if w_value is not None:
new_fastlocals_w[i] = w_value
@@ -620,7 +629,7 @@
for i in range(len(freevarnames)):
name = freevarnames[i]
cell = self.cells[i]
- w_value = self.space.finditem_str(self.w_locals, name)
+ w_value = self.space.finditem_str(w_locals, name)
if w_value is not None:
cell.set(w_value)
diff --git a/pypy/interpreter/pyopcode.py b/pypy/interpreter/pyopcode.py
--- a/pypy/interpreter/pyopcode.py
+++ b/pypy/interpreter/pyopcode.py
@@ -773,7 +773,7 @@
raise RaiseWithExplicitTraceback(operror)
def LOAD_LOCALS(self, oparg, next_instr):
- self.pushvalue(self.w_locals)
+ self.pushvalue(self.getorcreatedebug().w_locals)
def EXEC_STMT(self, oparg, next_instr):
w_locals = self.popvalue()
@@ -789,8 +789,8 @@
self.space.gettypeobject(PyCode.typedef))
w_prog, w_globals, w_locals = self.space.fixedview(w_resulttuple, 3)
- plain = (self.w_locals is not None and
- self.space.is_w(w_locals, self.w_locals))
+ plain = (self.get_w_locals() is not None and
+ self.space.is_w(w_locals, self.get_w_locals()))
if plain:
w_locals = self.getdictscope()
co = self.space.interp_w(eval.Code, w_prog)
@@ -840,12 +840,13 @@
def STORE_NAME(self, varindex, next_instr):
varname = self.getname_u(varindex)
w_newvalue = self.popvalue()
- self.space.setitem_str(self.w_locals, varname, w_newvalue)
+ self.space.setitem_str(self.getorcreatedebug().w_locals, varname,
+ w_newvalue)
def DELETE_NAME(self, varindex, next_instr):
w_varname = self.getname_w(varindex)
try:
- self.space.delitem(self.w_locals, w_varname)
+ self.space.delitem(self.getorcreatedebug().w_locals, w_varname)
except OperationError, e:
# catch KeyErrors and turn them into NameErrors
if not e.match(self.space, self.space.w_KeyError):
@@ -881,9 +882,10 @@
self.space.delitem(self.w_globals, w_varname)
def LOAD_NAME(self, nameindex, next_instr):
- if self.w_locals is not self.w_globals:
+ if self.getorcreatedebug().w_locals is not self.w_globals:
varname = self.getname_u(nameindex)
- w_value = self.space.finditem_str(self.w_locals, varname)
+ w_value = self.space.finditem_str(self.getorcreatedebug().w_locals,
+ varname)
if w_value is not None:
self.pushvalue(w_value)
return
@@ -1013,7 +1015,7 @@
if w_import is None:
raise OperationError(space.w_ImportError,
space.wrap("__import__ not found"))
- w_locals = self.w_locals
+ w_locals = self.getorcreatedebug().w_locals
if w_locals is None: # CPython does this
w_locals = space.w_None
w_modulename = space.wrap(modulename)
More information about the pypy-commit
mailing list