Author: Stephan <[email protected]>
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
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit