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

Reply via email to