[pypy-commit] lang-js default: use the js property for local variables instead of the raw value, propagate value updates via name or local reference

stepahn noreply at buildbot.pypy.org
Wed Jun 8 12:43:22 CEST 2011


Author: Stephan <stephan at stzal.com>
Branch: 
Changeset: r95:88a7fc212e70
Date: 2011-06-04 01:26 +0200
http://bitbucket.org/pypy/lang-js/changeset/88a7fc212e70/

Log:	use the js property for local variables instead of the raw value,
	propagate value updates via name or local reference

diff --git a/js/jsobj.py b/js/jsobj.py
--- a/js/jsobj.py
+++ b/js/jsobj.py
@@ -596,16 +596,13 @@
     def __str__(self):
         return "<ExCtx %s, var: %s>"%(self.scope, self.variable)
 
-    def declare_local(self, name):
+    def declare_variable(self, name):
         self.scope[-1].Put(self, name, w_Undefined, flags = DD)
-        self.local_identifiers.append(name)
-        self.local_values.append(w_Undefined)
+        prop = self.scope[-1].propdict[name]
+        self.local_values.append(prop)
 
     def get_local_value(self, idx):
-        return self.local_values[idx]
-
-    def get_local_identifier(self, idx):
-        return self.local_identifiers[idx]
+        return self.local_values[idx].value
 
     def get_local_index(self, name):
         if name in self.local_identifiers:
@@ -614,20 +611,15 @@
             return None
 
     def assign_local(self, idx, value):
-        name = self.get_local_identifier(idx)
-        self.store(name, value)
-        self.store_local(idx, value)
+        self.local_values[idx].value = value
+
+    def delete_local(self, identifier):
+        idx = self.get_local_index(identifier)
+        if idx is not None:
+            self.local_variables[idx] = None
+            self.local_identifiers[idx] = None
 
     def assign(self, name, value):
-        idx = self.get_local_index(name)
-        if idx is not None:
-            self.store_local(idx, value)
-        self.store(name, value)
-
-    def store_local(self, idx, value):
-        self.local_values[idx]=value
-
-    def store(self, name, value):
         assert name is not None
         for i in range(len(self.scope)-1, -1, -1):
             obj = self.scope[i]
@@ -643,6 +635,7 @@
         self.variable.Put(self, name, value)
 
     def delete_identifier(self, name):
+        self.delete_local(name)
         for i in range(len(self.scope)-1, -1, -1):
             obj = self.scope[i]
             assert isinstance(obj, W_PrimitiveObject)
diff --git a/js/opcodes.py b/js/opcodes.py
--- a/js/opcodes.py
+++ b/js/opcodes.py
@@ -466,7 +466,7 @@
         self.name = name
 
     def eval(self, ctx, stack):
-        ctx.declare_local(self.name)
+        ctx.declare_variable(self.name)
 
     def __repr__(self):
         return 'DECLARE_VAR "%s"' % (self.name,)
diff --git a/js/test/test_interp.py b/js/test/test_interp.py
--- a/js/test/test_interp.py
+++ b/js/test/test_interp.py
@@ -888,7 +888,6 @@
     }
     f();
     """, 12
-    py.test.skip("does not work yet")
     yield assertv, """
     function f() {
         var i;


More information about the pypy-commit mailing list