[pypy-commit] lang-js default: strange hack to make references more jit-friendly

stepahn noreply at buildbot.pypy.org
Fri Dec 28 11:35:34 CET 2012


Author: Stephan <stephan at stzal.com>
Branch: 
Changeset: r312:8d5191d68fe4
Date: 2012-12-11 16:21 +0100
http://bitbucket.org/pypy/lang-js/changeset/8d5191d68fe4/

Log:	strange hack to make references more jit-friendly

diff --git a/js/lexical_environment.py b/js/lexical_environment.py
--- a/js/lexical_environment.py
+++ b/js/lexical_environment.py
@@ -52,7 +52,10 @@
     def get_base(self):
         return self.base_value
 
-    def get_referenced_name(self):
+    # XXX passing identifier is a obscure hack but cfbolz sayz so!
+    def get_referenced_name(self, identifier=None):
+        if identifier is not None:
+            return identifier
         return self.referenced
 
     def is_strict_reference(self):
@@ -76,15 +79,15 @@
             return True
         return False
 
-    def get_value(self):
-        return get_value(self)
+    def get_value(self, identifier=None):
+        return get_value(self, identifier)
 
-    def put_value(self, value):
-        put_value(self, value)
+    def put_value(self, value, identifier=None):
+        put_value(self, value, identifier)
 
 
 # 8.7.1
-def get_value(v):
+def get_value(v, identifier=None):
     if not isinstance(v, Reference):
         return v
 
@@ -98,13 +101,13 @@
         base_env = v.base_env
         from js.environment_record import EnvironmentRecord
         assert isinstance(base_env, EnvironmentRecord)
-        name = v.get_referenced_name()
+        name = v.get_referenced_name(identifier)
         strict = v.is_strict_reference()
         return base_env.get_binding_value(name, strict)
 
 
 # 8.7.2
-def put_value(v, w):
+def put_value(v, w, identifier):
     if not isinstance(v, Reference):
         raise JsReferenceError('unresolvable reference')
 
@@ -113,7 +116,7 @@
             referenced = v.get_referenced_name()
             raise JsReferenceError(referenced)
         else:
-            name = v.get_referenced_name()
+            name = v.get_referenced_name(identifier)
             # TODO how to solve this ????
             from js.object_space import object_space
             global_object = object_space.global_object
@@ -125,6 +128,6 @@
         base_env = v.base_env
         from js.environment_record import EnvironmentRecord
         assert isinstance(base_env, EnvironmentRecord)
-        name = v.get_referenced_name()
+        name = v.get_referenced_name(identifier)
         strict = v.is_strict_reference()
         base_env.set_mutable_binding(name, w, strict)
diff --git a/js/opcodes.py b/js/opcodes.py
--- a/js/opcodes.py
+++ b/js/opcodes.py
@@ -143,8 +143,8 @@
     # 11.1.2
     def eval(self, ctx):
         # TODO put ref onto stack
-        value = ref.get_value()
         ref = ctx.get_ref(self.identifier, self.index)
+        value = ref.get_value(self.identifier)
         ctx.stack_append(value)
 
     def __str__(self):
@@ -501,8 +501,8 @@
 
     def eval(self, ctx):
         value = ctx.stack_top()
-        ref.put_value(value)
         ref = ctx.get_ref(self.identifier, self.index)
+        ref.put_value(value, self.identifier)
 
     def __str__(self):
         return 'STORE "%s"' % (self.identifier)


More information about the pypy-commit mailing list