Author: Stephan <step...@stzal.com> Branch: Changeset: r290:43cf4303c4f4 Date: 2012-08-25 21:45 +0200 http://bitbucket.org/pypy/lang-js/changeset/43cf4303c4f4/
Log: replaces W_BasicObject property dict with map diff --git a/js/builtins_interpreter.py b/js/builtins_interpreter.py --- a/js/builtins_interpreter.py +++ b/js/builtins_interpreter.py @@ -11,7 +11,7 @@ ## the tests expect eval to return "error" on an exception if overwrite_eval is True: from js.builtins import put_intimate_function - del(global_object._properties_[u'eval']) + global_object._del_prop(u'eval') put_intimate_function(global_object, u'eval', overriden_eval, configurable=False, params=[u'x']) put_native_function(global_object, u'trace', js_trace) diff --git a/js/jsobj.py b/js/jsobj.py --- a/js/jsobj.py +++ b/js/jsobj.py @@ -9,6 +9,11 @@ from js.property_descriptor import PropertyDescriptor, DataPropertyDescriptor, AccessorPropertyDescriptor, is_data_descriptor, is_generic_descriptor, is_accessor_descriptor from js.property import DataProperty, AccessorProperty +from js.object_map import ROOT_MAP + + +def _new_map(): + return ROOT_MAP @jit.elidable @@ -180,7 +185,9 @@ _immutable_fields_ = ['_type_', '_class_', '_extensible_'] def __init__(self): - self._properties_ = {} + self._property_map_ = _new_map() + self._property_slots_ = [] + self._prototype_ = w_Null W_BasicObject.define_own_property(self, u'__proto__', proto_desc) @@ -220,12 +227,44 @@ def get_own_property(self, p): assert p is not None and isinstance(p, unicode) - prop = self._properties_.get(p, None) + prop = self._get_prop(p) if prop is None: return return prop.to_property_descriptor() + def _get_prop(self, name): + idx = self._property_map_.lookup(name) + + if self._property_map_.not_found(idx): + return + elif idx >= len(self._property_slots_): + return + + prop = self._property_slots_[idx] + return prop + + def _del_prop(self, name): + idx = self._property_map_.lookup(name) + + if self._property_map_.not_found(idx): + return + + del(self._property_slots_[idx]) + self._property_map_ = self._property_map_.delete(name) + + def _set_prop(self, name, value): + idx = self._property_map_.lookup(name) + + if self._property_map_.not_found(idx): + self._property_map_ = self._property_map_.add(name) + idx = self._property_map_.index + + if idx >= len(self._property_slots_): + self._property_slots_ += ([None] * (1 + idx - len(self._property_slots_))) + + self._property_slots_[idx] = value + # 8.12.2 def get_property(self, p): assert p is not None and isinstance(p, unicode) @@ -313,7 +352,7 @@ if desc is None: return True if desc.configurable: - del self._properties_[p] + self._del_prop(p) return True if throw is True: @@ -370,7 +409,7 @@ desc.enumerable, desc.configurable ) - self._properties_[p] = new_prop + self._set_prop(p, new_prop) # 4.b else: assert is_accessor_descriptor(desc) is True @@ -380,7 +419,7 @@ desc.enumerable, desc.configurable ) - self._properties_[p] = new_prop + self._set_prop(p, new_prop) # 4.c return True @@ -438,8 +477,8 @@ if desc.has_set_getter() and desc.getter != current.getter: return reject(throw, p) # 12 - prop = self._properties_[p] - self._properties_[p] = prop.update_with_descriptor(desc) + prop = self._get_prop(p) + self._set_prop(p, prop.update_with_descriptor(desc)) # 13 return True @@ -466,7 +505,7 @@ def _named_properties_dict(self): my_d = {} - for i in self._properties_.keys(): + for i in self._property_map_.keys(): my_d[i] = None proto = self.prototype() _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit