Author: Stephan <[email protected]>
Branch: 
Changeset: r125:8b10b3522d6b
Date: 2011-09-07 16:16 +0200
http://bitbucket.org/pypy/lang-js/changeset/8b10b3522d6b/

Log:    context value maps are now mixed into the JsContext

diff --git a/js/jsexecution_context.py b/js/jsexecution_context.py
--- a/js/jsexecution_context.py
+++ b/js/jsexecution_context.py
@@ -1,9 +1,12 @@
-from js.utils import DynamicMapDict, MapDict, StackMixin
+from js.utils import StackMixin, MapMixin, MapDictMixin, DynamicMapDictMixin
 from js.jsobj import DONT_DELETE
 
-class JSContext(object):
+class JSContext(MapMixin, MapDictMixin):
     def __init__(self, parent=None):
-        self.values = MapDict()
+        #MapDictMixin.__init__(self)
+        self._map_next_index = 0
+        self._map_indexes = {}
+        self._map_dict_values = []
         self.parent = parent
         self.ctx_obj = None
 
@@ -40,24 +43,24 @@
 
     def declare_variable(self, identifier, flags=DONT_DELETE):
         from js.jsobj import w_Undefined, Property
-        self.values.addname(identifier)
+        self._map_addname(identifier)
         p = Property(identifier, w_Undefined, flags)
         self._identifier_set_local(identifier, p)
 
     def get_local_value(self, idx):
-        val = self.values.getindex(idx)
+        val = self._map_dict_getindex(idx)
         if val is None:
             raise KeyError
         return val.value
 
     def _identifier_set_local(self, identifier, value):
-        self.values.set(identifier, value)
+        self._map_dict_set(identifier, value)
 
     def _identifier_get_local(self, identifier):
-        return self.values.get(identifier)
+        return self._map_dict_get(identifier)
 
     def _identifier_is_local(self, identifier):
-        return self.values.indexof(identifier) != self.values.NOT_FOUND
+        return self._map_indexof(identifier) != self._MAP_NOT_FOUND
 
     def _identifier_set(self, identifier, value):
         try:
@@ -83,7 +86,7 @@
         raise KeyError
 
     def assign_local(self, idx, value):
-        prop = self.values.getindex(idx)
+        prop = self._map_dict_getindex(idx)
         prop.value = value
 
     def get_global(self):
@@ -104,26 +107,29 @@
         self.assign(name, value)
 
     def delete_identifier(self, name):
-        self.values.delete(name)
+        self._map_dict_delete(name)
         return True
 
 class ActivationContext(JSContext):
     def __init__(self, parent, this, args):
         JSContext.__init__(self, parent)
+        self._map_dict_values_init_with_size(2)
 
         if this is not None:
             self.put('this', this)
 
         self.put('arguments', args)
 
-class GlobalContext(JSContext, StackMixin):
+class GlobalContext(DynamicMapDictMixin, JSContext, StackMixin):
+    #_virtualizable2_ = ['stack[*]', 'stack_pointer']
     def __init__(self, parent=None):
         JSContext.__init__(self, parent)
         StackMixin.__init__(self)
+        DynamicMapDictMixin.__init__(self)
         # TODO size of gloabl context
-        self.values = DynamicMapDict()
 
 class ExecutionContext(JSContext, StackMixin):
+    #_virtualizable2_ = ['stack[*]', 'stack_pointer']
     def __init__(self, parent=None):
         JSContext.__init__(self, parent)
         StackMixin.__init__(self)
@@ -144,5 +150,10 @@
     def __init__(self, parent, func):
         ExecutionContext.__init__(self, parent)
         if func.scope:
-            from js.utils import mapdict_with_map
-            self.values = mapdict_with_map(func.scope.local_variables)
+            from js.utils import init_mapdict_with_map
+            init_mapdict_with_map(self, func.scope.local_variables)
+
+class CatchContext(ExecutionContext):
+    def __init__(self, parent=None):
+        ExecutionContext.__init__(self, parent)
+        self._map_dict_values_init_with_size(1)
diff --git a/js/opcodes.py b/js/opcodes.py
--- a/js/opcodes.py
+++ b/js/opcodes.py
@@ -531,8 +531,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 ExecutionContext
-                    newctx = ExecutionContext(ctx)
+                    from js.jsexecution_context import CatchContext
+                    newctx = CatchContext(ctx)
                     newctx.put(self.catchparam, e.exception)
                     self.catchfunc.run(newctx)
                 if self.finallyfunc is not None:
diff --git a/js/test/test_execution_context.py 
b/js/test/test_execution_context.py
--- a/js/test/test_execution_context.py
+++ b/js/test/test_execution_context.py
@@ -4,43 +4,49 @@
 from js.execution import ThrowException
 from js.jsobj import Property, w_Undefined
 
+def new_context(parent = None, size=3):
+    context = ExecutionContext(parent)
+    context._map_dict_values_init_with_size(size)
+    return context
+
 class TestExecutionContext(object):
     def test_identifier_set_local(self):
-        context = ExecutionContext()
+        context = new_context()
         context._identifier_set_local('foo', 1)
-        assert context.values.get('foo') == 1
+        assert context._map_dict_get('foo') == 1
 
     def test_identifier_get_local(self):
-        context = ExecutionContext()
-        context.values.set('foo', 1)
+        context = new_context()
+        context._map_dict_set('foo', 1)
         assert context._identifier_get_local('foo') == 1
 
     def test_identifier_is_local(sefl):
-        context = ExecutionContext()
-        context.values.set('foo', 1)
+        context = new_context()
+        context._map_dict_set('foo', 1)
         assert context._identifier_is_local('foo') is True
         assert context._identifier_is_local('bar') is False
 
-
     def test_identifier_get(self):
-        context = ExecutionContext()
+        context = new_context()
         context._identifier_set_local('foo', 1)
         context._identifier_set_local('bar', 2)
         assert context._identifier_get('foo') == 1
         assert context._identifier_get('bar') == 2
 
     def test_identifier_get_from_parent(self):
-        parent = ExecutionContext()
+        parent = new_context()
+        context = new_context(parent)
+
         parent._identifier_set_local('foo', 1)
-        context = ExecutionContext(parent)
         context._identifier_set_local('bar', 2)
+
         assert context._identifier_get('foo') == 1
         assert context._identifier_get('bar') == 2
 
     def test_identifier_get_from_parents(self):
-        grandparent = ExecutionContext()
-        parent = ExecutionContext(grandparent)
-        context = ExecutionContext(parent)
+        grandparent = new_context()
+        parent = new_context(grandparent)
+        context = new_context(parent)
 
         grandparent._identifier_set_local('foo', 0)
         parent._identifier_set_local('foo', 1)
@@ -50,46 +56,51 @@
         assert context._identifier_get('bar') == 2
 
     def test_identifier_get_local_precedence(self):
-        parent = ExecutionContext()
-        context = ExecutionContext(parent)
+        parent = new_context()
+        context = new_context(parent)
+
         parent._identifier_set_local('foo', 1)
         context._identifier_set_local('foo', 2)
+
         assert context._identifier_get('foo') == 2
         assert parent._identifier_get('foo') == 1
 
     def test_identifier_get_undefined_identifier(self):
-        parent = ExecutionContext()
-        context = ExecutionContext(parent)
+        parent = new_context()
+        context = new_context(parent)
         py.test.raises(KeyError, context._identifier_get, 'foo')
         py.test.raises(KeyError, parent._identifier_get, 'foo')
 
     def test_identifier_set_if_local(self):
-        context = ExecutionContext()
+        context = new_context()
+
         context._identifier_set_local('foo', 0)
         context._identifier_set_if_local('foo', 1)
+
         assert context._identifier_get_local('foo') == 1
 
     def test_identifier_set_if_local_not_local(self):
-        context = ExecutionContext()
+        context = new_context()
         py.test.raises(KeyError, context._identifier_set_if_local, 'foo', 1)
 
     def test_identifier_set_if_local_on_parent(self):
-        parent = ExecutionContext()
-        context = ExecutionContext(parent)
+        parent = new_context()
+        context = new_context(parent)
+
         parent._identifier_set_local('foo', None)
 
         context._identifier_set_if_local('foo', 1)
         assert parent._identifier_get_local('foo') == 1
 
     def test_identifier_set_if_local_not_in_parent(self):
-        parent = ExecutionContext()
-        context = ExecutionContext(parent)
+        parent = new_context()
+        context = new_context(parent)
         py.test.raises(KeyError, context._identifier_set_if_local, 'foo', 1)
 
     def test_identifier_set_if_local_on_parents(self):
-        grandparent = ExecutionContext()
-        parent = ExecutionContext(grandparent)
-        context = ExecutionContext(parent)
+        grandparent = new_context()
+        parent = new_context(grandparent)
+        context = new_context(parent)
 
         grandparent._identifier_set_local('foo', 0)
         parent._identifier_set_local('foo', 1)
@@ -104,8 +115,8 @@
         assert grandparent._identifier_get_local('foo') == 0
 
     def test_resolve_identifier(self):
-        parent = ExecutionContext()
-        context = ExecutionContext(parent)
+        parent = new_context()
+        context = new_context(parent)
         parent._identifier_set_local('foo', Property('foo', 0))
         context._identifier_set_local('bar', Property('foo', 1))
 
@@ -115,8 +126,8 @@
         py.test.raises(ThrowException, context.resolve_identifier, ctx, 'baz')
 
     def test_assign(self):
-        parent = ExecutionContext()
-        context = ExecutionContext(parent)
+        parent = new_context()
+        context = new_context(parent)
         p_foo = Property('foo', 0)
         p_bar = Property('foo', 1)
         parent._identifier_set_local('foo', p_foo)
@@ -129,8 +140,8 @@
         assert p_bar.value == 8
 
     def test_assign_local_precedence(self):
-        parent = ExecutionContext()
-        context = ExecutionContext(parent)
+        parent = new_context()
+        context = new_context(parent)
         p_foo_0 = Property('foo', 0)
         p_foo_1 = Property('foo', 1)
         parent._identifier_set_local('foo', p_foo_0)
@@ -143,8 +154,8 @@
 
     def test_declare_variable(self):
         ctx = None
-        parent = ExecutionContext()
-        context = ExecutionContext(parent)
+        parent = new_context()
+        context = new_context(parent)
 
         p_foo = Property('foo', 0)
         parent._identifier_set_local('foo', p_foo)
@@ -161,7 +172,7 @@
         assert context.resolve_identifier(ctx, 'foo') == 42
 
     def test_get_local_value(self):
-        context = ExecutionContext()
+        context = new_context()
         context.declare_variable('foo')
         context.declare_variable('bar')
 
@@ -175,17 +186,17 @@
         assert context.get_local_value(1) == 1
 
     def test_get_local_value_is_local(self):
-        parent = ExecutionContext()
-        context = ExecutionContext(parent)
+        parent = new_context()
+        context = new_context(parent)
 
         p_foo = Property('foo', 0)
         parent._identifier_set_local('foo', p_foo)
         py.test.raises(KeyError, context.get_local_value, 0)
 
     def test_assign_global_default(self):
-        global_ctx = ExecutionContext()
-        parent = ExecutionContext(global_ctx)
-        context = ExecutionContext(parent)
+        global_ctx = new_context()
+        parent = new_context(global_ctx)
+        context = new_context(parent)
 
         context.assign('foo', 0)
         py.test.raises(KeyError, context._identifier_get_local, 'foo')
diff --git a/js/utils.py b/js/utils.py
--- a/js/utils.py
+++ b/js/utils.py
@@ -163,3 +163,11 @@
     md._map_indexes = indexes
     md._map_next_index = m._map_next_index
     return md
+
+def init_mapdict_with_map(mapdict, map):
+    assert isinstance(map, MapMixin)
+    assert isinstance(mapdict, MapDictMixin)
+    indexes = map._map_indexes
+    MapDictMixin.__init__(mapdict, len(indexes))
+    mapdict._map_indexes = indexes
+    mapdict._map_next_index = map._map_next_index
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to