[pypy-commit] lang-js default: optimized property access

stepahn noreply at buildbot.pypy.org
Thu Feb 21 14:58:47 CET 2013


Author: Stephan <stephan at stzal.com>
Branch: 
Changeset: r360:33a38e14a318
Date: 2013-02-21 14:57 +0100
http://bitbucket.org/pypy/lang-js/changeset/33a38e14a318/

Log:	optimized property access

diff --git a/js/jsobj.py b/js/jsobj.py
--- a/js/jsobj.py
+++ b/js/jsobj.py
@@ -2,7 +2,7 @@
 from rpython.rlib.rarithmetic import intmask
 from rpython.rlib.rfloat import isnan, isinf, NAN, formatd, INFINITY
 from rpython.rlib.objectmodel import enforceargs
-from rpython.rlib import jit
+from rpython.rlib import jit, debug
 
 from js.property_descriptor import PropertyDescriptor, DataPropertyDescriptor, AccessorPropertyDescriptor, is_data_descriptor, is_generic_descriptor, is_accessor_descriptor
 from js.property import DataProperty, AccessorProperty
@@ -179,7 +179,7 @@
     def __init__(self):
         from js.object_space import newnull
         self._property_map_ = new_map()
-        self._property_slots_ = []
+        self._property_slots_ = debug.make_sure_not_resized([])
 
         self._prototype_ = newnull()
         W_BasicObject.define_own_property(self, u'__proto__', proto_desc)
@@ -242,7 +242,8 @@
         if self._property_map_.not_found(idx):
             return
 
-        del(self._property_slots_[idx])
+        assert idx >= 0
+        self._property_slots_ = self._property_slots_[:idx] + self._property_slots_[idx + 1:]
         self._property_map_ = self._property_map_.delete(name)
 
     def _add_prop(self, name, value):
@@ -253,7 +254,7 @@
             idx = self._property_map_.index
 
         if idx >= len(self._property_slots_):
-            self._property_slots_ += ([None] * (1 + idx - len(self._property_slots_)))
+            self._property_slots_ = self._property_slots_ + ([None] * (1 + idx - len(self._property_slots_)))
 
         self._property_slots_[idx] = value
 
@@ -479,7 +480,7 @@
                     return reject(throw, p)
         # 12
         prop = self._get_prop(p)
-        self._set_prop(p, prop.update_with_descriptor(desc))
+        prop.update_with_descriptor(desc)
 
         # 13
         return True
diff --git a/js/property.py b/js/property.py
--- a/js/property.py
+++ b/js/property.py
@@ -7,8 +7,6 @@
 
 # 8.6.1
 class Property(object):
-    _immutable_fields_ = ['value', 'writable', 'getter', 'setter', 'enumerable', 'configurable']
-
     def __init__(self, value=None, writable=NOT_SET, getter=None, setter=None, enumerable=NOT_SET, configurable=NOT_SET):
         self.value = value
         self.writable = writable
@@ -41,26 +39,18 @@
         assert isinstance(desc, PropertyDescriptor)
 
         if desc.has_set_value():
-            value = desc.value
-        else:
-            value = self.value
+            self.value = desc.value
 
         if desc.has_set_writable():
-            writable = desc.writable
-        else:
-            writable = self.writable
+            self.writable = desc.writable
 
         if desc.has_set_enumerable():
-            enumerable = desc.enumerable
-        else:
-            enumerable = self.enumerable
+            self.enumerable = desc.enumerable
 
         if desc.has_set_configurable():
-            configurable = desc.configurable
-        else:
-            configurable = self.configurable
+            self.configurable = desc.configurable
 
-        return DataProperty(value, writable, enumerable, configurable)
+        return self
 
     def to_property_descriptor(self):
         return DataPropertyDescriptor(self.value, self.writable, self.enumerable, self.configurable)
@@ -77,26 +67,18 @@
         assert isinstance(desc, PropertyDescriptor)
 
         if desc.has_set_getter():
-            getter = desc.getter
-        else:
-            getter = self.getter
+            self.getter = desc.getter
 
         if desc.has_set_setter():
-            setter = desc.setter
-        else:
-            setter = self.setter
+            self.setter = desc.setter
 
         if desc.has_set_enumerable():
-            enumerable = desc.enumerable
-        else:
-            enumerable = self.enumerable
+            self.enumerable = desc.enumerable
 
         if desc.has_set_configurable():
-            configurable = desc.configurable
-        else:
-            configurable = self.configurable
+            self.configurable = desc.configurable
 
-        return AccessorProperty(getter, setter, enumerable, configurable)
+        return self
 
     def to_property_descriptor(self):
         return AccessorPropertyDescriptor(self.getter, self.setter, self.enumerable, self.configurable)
diff --git a/test/jit_view.py b/test/jit_view.py
--- a/test/jit_view.py
+++ b/test/jit_view.py
@@ -62,6 +62,20 @@
 
         self.run(code, 100)
 
+    def test_simple_object_alloc_loop_in_func_loop(self):
+        code = """
+        function f() {
+            var i = 0;
+            while(i < 100) {
+                i = {foo: i}.foo + 1;
+            }
+            return x.i;
+        }
+        return f();
+        """
+
+        self.run(code, 100)
+
     def test_object_alloc_loop_in_func_loop(self):
         code = """
         function f() {


More information about the pypy-commit mailing list