[pypy-commit] lang-js default: removed subclasses of JSContext, unified under ExecutionContext

stepahn noreply at buildbot.pypy.org
Fri Dec 28 11:32:27 CET 2012


Author: Stephan <stephan at stzal.com>
Branch: 
Changeset: r129:7a7430f64ef0
Date: 2011-09-18 17:07 +0200
http://bitbucket.org/pypy/lang-js/changeset/7a7430f64ef0/

Log:	removed subclasses of JSContext, unified under ExecutionContext

diff --git a/js/interpreter.py b/js/interpreter.py
--- a/js/interpreter.py
+++ b/js/interpreter.py
@@ -722,8 +722,8 @@
     """Creates a js interpreter"""
     def __init__(self):
         allon = DE | DD | RO
-        from js.jsexecution_context import GlobalContext
-        ctx = GlobalContext()
+        from js.jsexecution_context import make_global_context
+        ctx = make_global_context()
         w_Global = ctx.to_context_object()
 
         w_ObjPrototype = W_Object(Prototype=None, Class='Object')
diff --git a/js/jsexecution_context.py b/js/jsexecution_context.py
--- a/js/jsexecution_context.py
+++ b/js/jsexecution_context.py
@@ -1,16 +1,15 @@
-from js.utils import StackMixin, MapMixin, MapDictMixin, DynamicMapDictMixin
+from js.utils import StackMixin, MapMixin, MapDictMixin
 from js.jsobj import DONT_DELETE
 
-class JSContext(MapMixin, MapDictMixin):
+class ExecutionContext(MapDictMixin, MapMixin, StackMixin):
+    #_virtualizable2_ = ['stack[*]', 'stack_pointer', '_map_dict_values[*]', '_map_next_index']
     def __init__(self, parent=None):
-        self._init_js_context(parent)
-
-    def _init_js_context(self, parent=None):
-        self._init_map_dict(0)
-        self.parent = parent
-        self.ctx_obj = None
+        self._init_execution_context(parent)
 
     def resolve_identifier(self, ctx, identifier):
+        if self.ctx_obj is not None and self.ctx_obj.HasProperty(identifier):
+                return self.ctx_obj.Get(ctx, identifier);
+
         try:
             return self.get_property_value(identifier)
         except KeyError:
@@ -110,12 +109,19 @@
         self._map_dict_delete(name)
         return True
 
-class ActivationContext(JSContext):
-    def __init__(self, parent, this, args):
-        self._init_acitvation_context(parent, this, args)
+    def _init_execution_context(self, parent):
+        self._init_map_dict(0)
+        self.parent = parent
+        self.ctx_obj = None
+        self._init_stack()
+
+    def _init_function_context(self, parent, func):
+        self._init_execution_context(parent)
+        if func.scope:
+            self._init_map_dict_with_map(func.scope.local_variables)
 
     def _init_acitvation_context(self, parent, this, args):
-        self._init_js_context(parent)
+        self._init_execution_context(parent)
         self._map_dict_values_init_with_size(2)
 
         if this is not None:
@@ -123,27 +129,10 @@
 
         self.put('arguments', args)
 
-class ExecutionContext(JSContext, StackMixin):
-    #_virtualizable2_ = ['stack[*]', 'stack_pointer', '_map_dict_values[*]', '_map_next_index']
-    def __init__(self, parent=None):
+    def _init_catch_context(self, parent, param, exception):
         self._init_execution_context(parent)
-
-    def _init_execution_context(self, parent):
-        self._init_js_context(parent)
-        self._init_stack()
-
-class GlobalContext(DynamicMapDictMixin, ExecutionContext):
-    def __init__(self, parent=None):
-        self._init_global_context(parent)
-
-    def _init_global_context(self, parent):
-        self._init_execution_context(parent)
-        # TODO size of gloabl context
-        self._init_dynamic_map_dict()
-
-class WithExecutionContext(ExecutionContext):
-    def __init__(self, parent, obj):
-        self._init_with_execution_context(parent, obj)
+        self._map_dict_values_init_with_size(1)
+        self.put(param, exception)
 
     def _init_with_execution_context(self, parent, obj):
         self._init_execution_context(parent)
@@ -151,25 +140,32 @@
         self.stack = parent.stack
         self.stack_pointer = parent.stack_pointer
 
-    def resolve_identifier(self, ctx, identifier):
-        if self.ctx_obj.HasProperty(identifier):
-            return self.ctx_obj.Get(ctx, identifier);
-        return ExecutionContext.resolve_identifier(self, ctx, identifier)
+    def _init_global_context(self):
+        self._init_execution_context(None)
+        # TODO size of gloabl context
+        self._init_dynamic_map_dict()
 
-class FunctionContext(ExecutionContext):
-    def __init__(self, parent, func):
-        self._init_function_context(parent, func)
+def make_activation_context(parent, this, args):
+    ctx = ExecutionContext()
+    ctx._init_acitvation_context(parent, this, args)
+    return ctx
 
-    def _init_function_context(self, parent, func):
-        self._init_execution_context(parent)
-        if func.scope:
-            self._init_map_dict_with_map(func.scope.local_variables)
+def make_global_context():
+    ctx = ExecutionContext()
+    ctx._init_global_context()
+    return ctx
 
-class CatchContext(ExecutionContext):
-    def __init__(self, parent, param, exception):
-        self._init_catch_context(parent, param, exception)
+def make_with_context(parent, obj):
+    ctx = ExecutionContext()
+    ctx._init_with_execution_context(parent, obj)
+    return ctx
 
-    def _init_catch_context(self, parent, param, exception):
-        self._init_execution_context(parent)
-        self._map_dict_values_init_with_size(1)
-        self.put(param, exception)
+def make_function_context(parent, func):
+    ctx = ExecutionContext()
+    ctx._init_function_context(parent, func)
+    return ctx
+
+def make_catch_context(parent, param, exception):
+    ctx = ExecutionContext()
+    ctx._init_catch_context(parent, param, exception)
+    return ctx
diff --git a/js/jsobj.py b/js/jsobj.py
--- a/js/jsobj.py
+++ b/js/jsobj.py
@@ -166,14 +166,15 @@
     def Call(self, ctx, args=[], this=None):
         if self.callfunc is None: # XXX Not sure if I should raise it here
             raise JsTypeError('not a function')
+        # TODO
         from js.jsobj import W_Root
         assert isinstance(this, W_Root)
 
-        from js.jsexecution_context import ActivationContext, FunctionContext
+        from js.jsexecution_context import make_activation_context, make_function_context
 
         w_Arguments = W_Arguments(self, args)
-        act = ActivationContext(self.ctx, this, w_Arguments)
-        newctx = FunctionContext(act, self.callfunc)
+        act = make_activation_context(self.ctx, this, w_Arguments)
+        newctx = make_function_context(act, self.callfunc)
 
         paramn = len(self.callfunc.params)
         for i in range(paramn):
diff --git a/js/opcodes.py b/js/opcodes.py
--- a/js/opcodes.py
+++ b/js/opcodes.py
@@ -557,8 +557,8 @@
             except ThrowException, e:
                 if self.catchfunc is not None:
                     # XXX just copied, I don't know if it's right
-                    from js.jsexecution_context import CatchContext
-                    newctx = CatchContext(ctx, self.catchparam, e.exception)
+                    from js.jsexecution_context import make_catch_context
+                    newctx = make_catch_context(ctx, self.catchparam, e.exception)
                     self.catchfunc.run(newctx)
                 if self.finallyfunc is not None:
                     self.finallyfunc.run(ctx)
@@ -627,8 +627,8 @@
 
     def eval(self, ctx):
         obj = ctx.pop().ToObject(ctx)
-        from js.jsexecution_context import WithExecutionContext
-        self.newctx = WithExecutionContext(ctx, obj)
+        from js.jsexecution_context import make_with_context
+        self.newctx = make_with_context(ctx, obj)
 
 class WITH_END(Opcode):
     _stack_change = 0
diff --git a/js/utils.py b/js/utils.py
--- a/js/utils.py
+++ b/js/utils.py
@@ -97,6 +97,11 @@
     def _init_map_dict(self, size = 99):
         self._init_map()
         self._map_dict_values_init_with_size(size)
+        self._map_dict_expand = False
+
+    def _init_dynamic_map_dict(self):
+        self._init_map_dict(0)
+        self._map_dict_expand = True
 
     def _init_map_dict_with_map(self, map):
         indexes = map._map_indexes
@@ -127,7 +132,14 @@
     def _map_dict_setindex(self, idx, value):
         self._map_dict_values[idx] = value
 
-class MapDict(Map, MapDictMixin):
+    def _map_addname(self, name):
+        if self._map_dict_expand:
+            while len(self._map_dict_values) <= self._map_next_index:
+                self._map_dict_values = self._map_dict_values + [None]
+
+        return self._map_addname_no_resize(name)
+
+class MapDict(MapDictMixin, Map):
     def __init__(self, size = 99):
         self._init_map_dict(size)
 
@@ -149,16 +161,6 @@
     def setindex(self, idx, value):
         self._map_dict_setindex(idx, value)
 
-class DynamicMapDictMixin(object):
-    _mixin_ = True
-    def _init_dynamic_map_dict(self):
-        self._init_map_dict(0)
-
-    def _map_addname(self, name):
-        while len(self._map_dict_values) <= self._map_next_index:
-            self._map_dict_values = self._map_dict_values + [None]
-        return self._map_addname_no_resize(name)
-
-class DynamicMapDict(DynamicMapDictMixin, MapDict):
+class DynamicMapDict(MapDict):
     def __init__(self):
         self._init_dynamic_map_dict()


More information about the pypy-commit mailing list