Author: Philip Jenvey <[email protected]>
Branch: py3k
Changeset: r68014:0e3f24e124ac
Date: 2013-11-13 20:36 -0800
http://bitbucket.org/pypy/pypy/changeset/0e3f24e124ac/
Log: reapply frame/cell related py3k changes
diff --git a/pypy/interpreter/pyframe.py b/pypy/interpreter/pyframe.py
--- a/pypy/interpreter/pyframe.py
+++ b/pypy/interpreter/pyframe.py
@@ -510,7 +510,7 @@
for i in range(min(len(varnames), self.getcode().co_nlocals)):
name = varnames[i]
w_value = self.locals_stack_w[i]
- w_name = self.space.wrap(name)
+ w_name = self.space.wrap(name.decode('utf-8'))
if w_value is not None:
self.space.setitem(self.w_locals, w_name, w_value)
else:
@@ -547,7 +547,7 @@
new_fastlocals_w = [None] * numlocals
for i in range(min(len(varnames), numlocals)):
- w_name = self.space.wrap(varnames[i])
+ w_name = self.space.wrap(varnames[i].decode('utf-8'))
try:
w_value = self.space.getitem(self.w_locals, w_name)
except OperationError, e:
@@ -576,6 +576,8 @@
"""
Initialize cellvars from self.locals_stack_w.
"""
+ if self.cells is None:
+ return
args_to_copy = self.pycode._args_as_cellvars
for i in range(len(args_to_copy)):
argnum = args_to_copy[i]
diff --git a/pypy/interpreter/pyopcode.py b/pypy/interpreter/pyopcode.py
--- a/pypy/interpreter/pyopcode.py
+++ b/pypy/interpreter/pyopcode.py
@@ -484,15 +484,7 @@
try:
w_value = cell.get()
except ValueError:
- varname = self.getfreevarname(varindex)
- if self.iscellvar(varindex):
- message = "local variable '%s' referenced before assignment" %
varname
- w_exc_type = self.space.w_UnboundLocalError
- else:
- message = ("free variable '%s' referenced before assignment"
- " in enclosing scope" % varname)
- w_exc_type = self.space.w_NameError
- raise OperationError(w_exc_type, self.space.wrap(message))
+ self.raise_exc_unbound(varindex)
else:
self.pushvalue(w_value)
@@ -502,6 +494,26 @@
cell = self.cells[varindex]
cell.set(w_newvalue)
+ def DELETE_DEREF(self, varindex, next_instr):
+ cell = self.cells[varindex]
+ try:
+ cell.get()
+ except ValueError:
+ self.raise_exc_unbound(varindex)
+ else:
+ cell.set(None)
+
+ def raise_exc_unbound(self, varindex):
+ varname = self.getfreevarname(varindex)
+ if self.iscellvar(varindex):
+ message = "local variable '%s' referenced before
assignment"%varname
+ w_exc_type = self.space.w_UnboundLocalError
+ else:
+ message = ("free variable '%s' referenced before assignment"
+ " in enclosing scope"%varname)
+ w_exc_type = self.space.w_NameError
+ raise OperationError(w_exc_type, self.space.wrap(message))
+
def LOAD_CLOSURE(self, varindex, next_instr):
# nested scopes: access the cell object
cell = self.cells[varindex]
@@ -1200,16 +1212,11 @@
return self._make_function(oparg)
@jit.unroll_safe
- def MAKE_CLOSURE(self, numdefaults, next_instr):
- w_codeobj = self.popvalue()
- codeobj = self.space.interp_w(pycode.PyCode, w_codeobj)
- w_freevarstuple = self.popvalue()
+ def MAKE_CLOSURE(self, oparg, next_instr):
+ w_freevarstuple = self.peekvalue(1)
freevars = [self.space.interp_w(Cell, cell)
for cell in self.space.fixedview(w_freevarstuple)]
- defaultarguments = self.popvalues(numdefaults)
- fn = function.Function(self.space, codeobj, self.w_globals,
- defaultarguments, freevars)
- self.pushvalue(self.space.wrap(fn))
+ self._make_function(oparg, freevars)
def BUILD_SLICE(self, numargs, next_instr):
if numargs == 3:
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit