[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