[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