[pypy-commit] lang-js default: moved reference code into separate file

stepahn noreply at buildbot.pypy.org
Sun Feb 3 17:38:30 CET 2013


Author: Stephan <stephan at stzal.com>
Branch: 
Changeset: r342:50d27cfd406a
Date: 2013-01-18 14:17 +0100
http://bitbucket.org/pypy/lang-js/changeset/50d27cfd406a/

Log:	moved reference code into separate file

diff --git a/js/lexical_environment.py b/js/lexical_environment.py
--- a/js/lexical_environment.py
+++ b/js/lexical_environment.py
@@ -1,4 +1,5 @@
-from js.execution import JsReferenceError
+from pypy.rlib import jit
+from js.reference import Reference
 
 
 def get_identifier_reference(lex, identifier, strict=False):
@@ -9,7 +10,9 @@
     envRec = lex.environment_record
     exists = envRec.has_binding(identifier)
     if exists:
-        return Reference(base_env=envRec, referenced=identifier, strict=strict)
+        ref = Reference(base_env=envRec, referenced=identifier, strict=strict)
+        jit.promote(ref)
+        return ref
     else:
         outer = lex.outer_environment
         return get_identifier_reference(outer, identifier, strict)
@@ -39,96 +42,3 @@
         LexicalEnvironment.__init__(self, outer_environment)
         from js.environment_record import ObjectEnvironmentRecord
         self.environment_record = ObjectEnvironmentRecord(obj)
-
-
-class Reference(object):
-    _immutable_fields_ = ['base_env', 'base_value', 'referenced', 'strict']
-
-    def __init__(self, base_value=None, base_env=None, referenced=None, strict=False):
-        self.base_env = base_env
-        self.base_value = base_value
-        self.referenced = referenced
-        self.strict = strict
-
-    def get_base(self):
-        return self.base_value
-
-    # 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):
-        return self.strict is True
-
-    def has_primitive_base(self):
-        b = self.base_value
-        from js.jsobj import W_Boolean, W_String, W_Number
-        if isinstance(b, W_Boolean) or isinstance(b, W_String) or isinstance(b, W_Number):
-            return True
-        return False
-
-    def is_property_reference(self):
-        from js.jsobj import W_BasicObject
-        if isinstance(self.base_value, W_BasicObject) or self.has_primitive_base() is True:
-            return True
-        return False
-
-    def is_unresolvable_reference(self):
-        if self.base_value is None and self.base_env is None:
-            return True
-        return False
-
-    def get_value(self, identifier=None):
-        return get_value(self, identifier)
-
-    def put_value(self, value, identifier=None):
-        put_value(self, value, identifier)
-
-
-# 8.7.1
-def get_value(v, identifier=None):
-    if not isinstance(v, Reference):
-        return v
-
-    if v.is_unresolvable_reference():
-        referenced = v.get_referenced_name()
-        raise JsReferenceError(referenced)
-
-    if v.is_property_reference():
-        raise NotImplementedError('8.7.1 4.')
-    else:
-        base_env = v.base_env
-        from js.environment_record import EnvironmentRecord
-        assert isinstance(base_env, EnvironmentRecord)
-        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, identifier):
-    if not isinstance(v, Reference):
-        raise JsReferenceError('unresolvable reference')
-
-    if v.is_unresolvable_reference():
-        if v.is_strict_reference():
-            referenced = v.get_referenced_name()
-            raise JsReferenceError(referenced)
-        else:
-            name = v.get_referenced_name(identifier)
-            # TODO how to solve this ????
-            from js.object_space import object_space
-            global_object = object_space.global_object
-
-            global_object.put(name, w, throw=False)
-    elif v.is_property_reference():
-        raise NotImplementedError('8.7.2 4.')
-    else:
-        base_env = v.base_env
-        from js.environment_record import EnvironmentRecord
-        assert isinstance(base_env, EnvironmentRecord)
-        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
@@ -893,7 +893,7 @@
         self.index = index
 
     def eval(self, ctx):
-        from js.lexical_environment import Reference
+        from js.reference import Reference
         from js.execution import JsSyntaxError
 
         # 11.4.1
diff --git a/js/reference.py b/js/reference.py
new file mode 100644
--- /dev/null
+++ b/js/reference.py
@@ -0,0 +1,95 @@
+from js.execution import JsReferenceError
+#from pypy.rlib import jit
+
+
+class Reference(object):
+    _immutable_fields_ = ['base_env', 'base_value', 'referenced', 'strict']
+
+    def __init__(self, base_value=None, base_env=None, referenced=None, strict=False):
+        self.base_env = base_env
+        self.base_value = base_value
+        self.referenced = referenced
+        self.strict = strict
+
+    def get_base(self):
+        return self.base_value
+
+    # 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):
+        return self.strict is True
+
+    def has_primitive_base(self):
+        b = self.base_value
+        from js.jsobj import W_Boolean, W_String, W_Number
+        if isinstance(b, W_Boolean) or isinstance(b, W_String) or isinstance(b, W_Number):
+            return True
+        return False
+
+    def is_property_reference(self):
+        from js.jsobj import W_BasicObject
+        if isinstance(self.base_value, W_BasicObject) or self.has_primitive_base() is True:
+            return True
+        return False
+
+    def is_unresolvable_reference(self):
+        if self.base_value is None and self.base_env is None:
+            return True
+        return False
+
+    def get_value(self, identifier=None):
+        return get_value(self, identifier)
+
+    def put_value(self, value, identifier=None):
+        put_value(self, value, identifier)
+
+
+# 8.7.1
+def get_value(v, identifier=None):
+    if not isinstance(v, Reference):
+        return v
+
+    if v.is_unresolvable_reference():
+        referenced = v.get_referenced_name()
+        raise JsReferenceError(referenced)
+
+    if v.is_property_reference():
+        raise NotImplementedError('8.7.1 4.')
+    else:
+        base_env = v.base_env
+        from js.environment_record import EnvironmentRecord
+        assert isinstance(base_env, EnvironmentRecord)
+        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, identifier):
+    if not isinstance(v, Reference):
+        raise JsReferenceError('unresolvable reference')
+
+    if v.is_unresolvable_reference():
+        if v.is_strict_reference():
+            referenced = v.get_referenced_name()
+            raise JsReferenceError(referenced)
+        else:
+            name = v.get_referenced_name(identifier)
+            # TODO how to solve this ????
+            from js.object_space import object_space
+            global_object = object_space.global_object
+
+            global_object.put(name, w, throw=False)
+    elif v.is_property_reference():
+        raise NotImplementedError('8.7.2 4.')
+    else:
+        base_env = v.base_env
+        from js.environment_record import EnvironmentRecord
+        assert isinstance(base_env, EnvironmentRecord)
+        name = v.get_referenced_name(identifier)
+        strict = v.is_strict_reference()
+        base_env.set_mutable_binding(name, w, strict)


More information about the pypy-commit mailing list