[pypy-commit] lang-js default: use object_maps for context identifiers

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


Author: Stephan <stephan at stzal.com>
Branch: 
Changeset: r142:278b9506bae9
Date: 2011-11-02 10:53 +0100
http://bitbucket.org/pypy/lang-js/changeset/278b9506bae9/

Log:	use object_maps for context identifiers

diff --git a/js/astbuilder.py b/js/astbuilder.py
--- a/js/astbuilder.py
+++ b/js/astbuilder.py
@@ -5,9 +5,14 @@
 from js import operations
 from js.utils import Map
 
+from js.object_map import ROOT_MAP
+
+def _get_root_map():
+    return ROOT_MAP
+
 class Scope(object):
     def __init__(self):
-        self.local_variables = Map()
+        self.local_variables = ROOT_MAP
         self.declared_variables = []
 
     def __repr__(self):
@@ -15,7 +20,7 @@
 
     def add_local(self, identifier):
         if not self.is_local(identifier):
-            self.local_variables.addname(identifier)
+            self.local_variables = self.local_variables.add(identifier)
 
     def declare_local(self, identifier):
         if not self.is_local(identifier):
@@ -24,10 +29,10 @@
                 self.declared_variables.append(identifier)
 
     def is_local(self, identifier):
-        return self.local_variables.indexof(identifier) != self.local_variables.NOT_FOUND
+        return self.local_variables.lookup(identifier) != self.local_variables.NOT_FOUND
 
     def get_local(self, identifier):
-        idx = self.local_variables.indexof(identifier)
+        idx = self.local_variables.lookup(identifier)
         if idx == self.local_variables.NOT_FOUND:
             raise ValueError
         return idx
diff --git a/js/jsexecution_context.py b/js/jsexecution_context.py
--- a/js/jsexecution_context.py
+++ b/js/jsexecution_context.py
@@ -1,10 +1,11 @@
-from js.utils import StackMixin, MapMixin, MapDictMixin
+from js.utils import StackMixin
 from js.jsobj import DONT_DELETE
+from js.object_map import root_map
 
 from pypy.rlib import jit, debug
 
-class ExecutionContext(MapDictMixin, MapMixin, StackMixin):
-    _virtualizable2_ = ['stack[*]', 'stack_pointer', '_map_dict_values[*]', '_map_next_index']
+class ExecutionContext(StackMixin):
+    _virtualizable2_ = ['stack[*]', 'stack_pointer', '_map_dict_values[*]']
     def __init__(self, parent=None):
         self._init_execution_context(parent)
 
@@ -23,9 +24,7 @@
         return self._identifier_get(name)
 
     def get_property_flags(self, name):
-        self._identifier_get(name)
-        idx = self._map_indexof(name)
-        return self._property_flags.get(idx, 0)
+        return self._identifier_get_flags(name)
 
     def set_property_value(self, name, value):
         self._identifier_set(name, value)
@@ -34,8 +33,7 @@
         self._identifier_set_local(name, value)
 
     def set_property_flags(self, name, flags):
-        idx = self._map_indexof(name)
-        self._property_flags[idx] = flags
+        self._identifier_set_flags(name, flags)
 
     def assign(self, name, value):
         from js.jsobj import READ_ONLY, Property
@@ -66,7 +64,7 @@
         return self._map_dict_get(identifier)
 
     def _identifier_is_local(self, identifier):
-        return self._map_indexof(identifier) != self._MAP_NOT_FOUND
+        return self._map_indexof(identifier) != self._variables_map.NOT_FOUND
 
     def _identifier_set(self, identifier, value):
         try:
@@ -91,6 +89,35 @@
                 return self.parent._identifier_get(identifier)
         raise KeyError
 
+    def _identifier_get_flags_local(self, identifier):
+        idx = self._variables_map.lookup_flag(identifier)
+        if idx < 0:
+            raise KeyError
+        return idx
+
+    def _identifier_get_flags(self, identifier):
+        try:
+            return self._identifier_get_flags_local(identifier)
+        except KeyError:
+            if self.parent:
+                return self.parent._identifier_get_flags(identifier)
+        raise KeyError
+
+    def _identifier_set_flags(self, identifier, value):
+        self._identifier_set_flags_if_local(identifier, value)
+
+    def _identifier_set_flags_if_local(self, identifier, flags):
+        if self._identifier_is_local(identifier):
+            self._identifier_set_flags_local(identifier, flags)
+            return
+        elif self.parent:
+            self.parent._identifier_set_flags_if_local(identifier, flags)
+            return
+        raise KeyError
+
+    def _identifier_set_flags_local(self, identifier, flags):
+        self._variables_map = self._variables_map.set_flags(identifier, flags)
+
     def assign_local(self, idx, value):
         self._map_dict_getindex(idx)
         self._map_dict_setindex(idx, value)
@@ -122,7 +149,7 @@
         self.parent = parent
         self.ctx_obj = None
         self._init_stack()
-        self._property_flags = {}
+        self._variables_map = root_map()
 
     def _init_function_context(self, parent, func):
         self = jit.hint(self, access_directly=True, fresh_virtualizable=True)
@@ -157,6 +184,61 @@
         # TODO size of gloabl context
         self._init_dynamic_map_dict()
 
+    def _init_map_dict(self, size=99):
+        self._map_dict_values_init_with_size(size)
+        self._map_dict_expand = False
+
+    def _map_dict_values_init_with_size(self, size):
+        self._map_dict_values = [None] * size
+
+    def _map_dict_set(self, name, value):
+        idx = self._map_addname(name)
+        self._map_dict_setindex(idx, value)
+
+    def _map_addname(self, name):
+        if self._map_dict_expand:
+            _resize_map_dict(self)
+        return self._map_addname_no_resize(name)
+
+    def _map_addname_no_resize(self, name):
+        if self._map_indexof(name) == self._variables_map.NOT_FOUND:
+            self._variables_map = self._variables_map.add(name)
+        return self._map_indexof(name)
+
+    def _map_indexof(self, name):
+        return self._variables_map.lookup(name)
+
+    def _map_dict_setindex(self, idx, value):
+        assert idx >= 0
+        self._map_dict_values[idx] = value
+
+    def _map_dict_getindex(self, idx):
+        if idx < 0:
+            raise KeyError
+        return self._map_dict_values[idx]
+
+    def _map_dict_get(self, name):
+        idx = self._map_indexof(name)
+        return self._map_dict_getindex(idx)
+
+    def _init_dynamic_map_dict(self):
+        self._init_map_dict(0)
+        self._map_dict_expand = True
+
+    def _init_map_dict_with_map(self, other_map):
+        self._variables_map = other_map
+        self._map_dict_values_init_with_size(len(self._variables_map.keys()))
+
+    def _map_dict_delete(self, name):
+        # TODO flags and stuff
+        self._map_dict_set(name, None)
+        self._variables_map = self._variables_map.delete(name)
+
+ at jit.dont_look_inside
+def _resize_map_dict(map_dict_obj):
+    while len(map_dict_obj._map_dict_values) <= (len(map_dict_obj._variables_map.keys())):
+        map_dict_obj._map_dict_values = map_dict_obj._map_dict_values + [None]
+
 def make_activation_context(parent, this, args):
     ctx = ExecutionContext()
     ctx._init_acitvation_context(parent, this, args)


More information about the pypy-commit mailing list