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

Reply via email to