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