Author: Stephan <step...@stzal.com> Branch: Changeset: r295:3c974365c7f1 Date: 2012-09-04 15:44 +0200 http://bitbucket.org/pypy/lang-js/changeset/3c974365c7f1/
Log: static sisze of slots in declarative environment record diff --git a/js/astbuilder.py b/js/astbuilder.py --- a/js/astbuilder.py +++ b/js/astbuilder.py @@ -53,6 +53,9 @@ if idx == index: return symbol + def len(self): + return self.next_index + empty_symbols = SymbolMap() diff --git a/js/environment_record.py b/js/environment_record.py --- a/js/environment_record.py +++ b/js/environment_record.py @@ -30,10 +30,11 @@ class DeclarativeEnvironmentRecord(EnvironmentRecord): - def __init__(self): + def __init__(self, size=0, resize=True): EnvironmentRecord.__init__(self) self._binding_map_ = _new_map() - self._binding_slots_ = [] + self._binding_slots_ = [None] * size + self._binding_resize_ = resize self._mutable_bindings_map_ = _new_map() self._deletable_bindings_map_ = _new_map() @@ -55,27 +56,26 @@ def _get_binding(self, name): idx = self._binding_map_.lookup(name) - - if self._binding_map_.not_found(idx): - return - if idx >= len(self._binding_slots_): - return - binding = self._binding_slots_[idx] return binding - def _set_binding(self, name, value): + def _add_binding(self, name, value): idx = self._binding_map_.lookup(name) if self._binding_map_.not_found(idx): self._binding_map_ = self._binding_map_.add(name) idx = self._binding_map_.index - if idx >= len(self._binding_slots_): - self._binding_slots_ += ([None] * (1 + idx - len(self._binding_slots_))) + if self._binding_resize_ is True: + if idx >= len(self._binding_slots_): + self._binding_slots_ += ([None] * (1 + idx - len(self._binding_slots_))) self._binding_slots_[idx] = value + def _set_binding(self, name, value): + idx = self._binding_map_.lookup(name) + self._binding_slots_[idx] = value + def _del_binding(self, name): idx = self._binding_map_.lookup(name) @@ -88,7 +88,7 @@ # 10.2.1.1.2 def create_mutuable_binding(self, identifier, deletable): assert not self.has_binding(identifier) - self._set_binding(identifier, w_Undefined) + self._add_binding(identifier, w_Undefined) self._set_mutable_binding(identifier) if deletable: self._set_deletable_binding(identifier) diff --git a/js/execution_context.py b/js/execution_context.py --- a/js/execution_context.py +++ b/js/execution_context.py @@ -164,6 +164,7 @@ from js.object_space import object_space stack_size = code.estimated_stack_size() + env_size = code.env_size() ExecutionContext.__init__(self, stack_size) @@ -177,7 +178,7 @@ self._calling_context_ = None from js.lexical_environment import DeclarativeEnvironment - localEnv = DeclarativeEnvironment(scope) + localEnv = DeclarativeEnvironment(scope, env_size, False) self._lexical_environment_ = localEnv self._variable_environment_ = localEnv diff --git a/js/functions.py b/js/functions.py --- a/js/functions.py +++ b/js/functions.py @@ -43,6 +43,9 @@ def is_function_code(self): return False + def env_size(self): + return 0 + class JsNativeFunction(JsBaseFunction): def __init__(self, function, name=u''): @@ -88,10 +91,14 @@ assert isinstance(js_code, JsCode) self._js_code_ = js_code self._stack_size_ = js_code.estimated_stack_size() + self._symbol_size_ = js_code.symbol_size() def estimated_stack_size(self): return self._stack_size_ + def env_size(self): + return self._symbol_size_ + def get_js_code(self): from js.jscode import JsCode assert isinstance(self._js_code_, JsCode) diff --git a/js/jscode.py b/js/jscode.py --- a/js/jscode.py +++ b/js/jscode.py @@ -76,6 +76,9 @@ return self._estimated_stack_size + def symbol_size(self): + return self._symbols.len() + def emit_label(self, num=-1): if num == -1: num = self.prealocate_label() diff --git a/js/lexical_environment.py b/js/lexical_environment.py --- a/js/lexical_environment.py +++ b/js/lexical_environment.py @@ -26,10 +26,10 @@ class DeclarativeEnvironment(LexicalEnvironment): - def __init__(self, outer_environment=None): + def __init__(self, outer_environment=None, env_size=0, env_resize=True): LexicalEnvironment.__init__(self, outer_environment) from js.environment_record import DeclarativeEnvironmentRecord - self.environment_record = DeclarativeEnvironmentRecord() + self.environment_record = DeclarativeEnvironmentRecord(env_size, env_resize) class ObjectEnvironment(LexicalEnvironment): _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit