[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