Revision: 9694
Author: [email protected]
Date: Wed Oct 19 02:52:08 2011
Log: Fixed evaluation order issue in defineProperties.
This is not covered by test262 yet, but it really makes sense and matches
Firefox's behaviour.
TEST=mjsunit/define-properties.js
Review URL: http://codereview.chromium.org/8349031
http://code.google.com/p/v8/source/detail?r=9694
Modified:
/branches/bleeding_edge/src/v8natives.js
/branches/bleeding_edge/test/mjsunit/object-define-properties.js
=======================================
--- /branches/bleeding_edge/src/v8natives.js Tue Oct 18 05:26:53 2011
+++ /branches/bleeding_edge/src/v8natives.js Wed Oct 19 02:52:08 2011
@@ -1078,10 +1078,12 @@
throw MakeTypeError("obj_ctor_property_non_object",
["defineProperties"]);
var props = ToObject(properties);
var names = GetOwnEnumerablePropertyNames(props);
+ var descriptors = new InternalArray();
for (var i = 0; i < names.length; i++) {
- var name = names[i];
- var desc = ToPropertyDescriptor(props[name]);
- DefineOwnProperty(obj, name, desc, true);
+ descriptors.push(ToPropertyDescriptor(props[names[i]]));
+ }
+ for (var i = 0; i < names.length; i++) {
+ DefineOwnProperty(obj, names[i], descriptors[i], true);
}
return obj;
}
=======================================
--- /branches/bleeding_edge/test/mjsunit/object-define-properties.js Thu
Sep 1 04:28:10 2011
+++ /branches/bleeding_edge/test/mjsunit/object-define-properties.js Wed
Oct 19 02:52:08 2011
@@ -54,3 +54,19 @@
assertEquals(x.foo, 10);
assertEquals(x.bar, 42);
+
+
+// Make sure that all property descriptors are calculated before any
+// modifications are done.
+
+var object = {};
+
+assertThrows(function() {
+ Object.defineProperties(object, {
+ foo: { value: 1 },
+ bar: { value: 2, get: function() { return 3; } }
+ });
+ }, TypeError);
+
+assertEquals(undefined, object.foo);
+assertEquals(undefined, object.bar);
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev