[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