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

Reply via email to