Return length passed instead of receiver to allow chained assignments like
authorantonm@chromium.org <antonm@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Fri, 26 Feb 2010 16:12:39 +0000 (16:12 +0000)
committerantonm@chromium.org <antonm@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Fri, 26 Feb 2010 16:12:39 +0000 (16:12 +0000)
foo = a.length = 7

BUG=crbug.com/36854

Review URL: http://codereview.chromium.org/660174

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3979 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/ic.cc
test/mjsunit/array-length.js

index 31ece04a0b820beac92c3f3b3a46182628339937..8fd777a362c1997240d850bb4f3d1bc486df9e50 100644 (file)
--- a/src/ic.cc
+++ b/src/ic.cc
@@ -1365,7 +1365,9 @@ Object* StoreIC_ArrayLength(Arguments args) {
   JSObject* receiver = JSObject::cast(args[0]);
   Object* len = args[1];
 
-  return receiver->SetElementsLength(len);
+  Object* result = receiver->SetElementsLength(len);
+  if (result->IsFailure()) return result;
+  return len;
 }
 
 
index 9731e7a3ed3c5ab524c8748ad02945b6e6713132..967d7203cef94aacf7b9f6b91365c1c79a2f68a2 100644 (file)
@@ -26,7 +26,7 @@
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 var a = [0,1,2,3];
-a.length = 0;
+assertEquals(0, a.length = 0);
 
 assertEquals('undefined', typeof a[0]);
 assertEquals('undefined', typeof a[1]);
@@ -35,7 +35,7 @@ assertEquals('undefined', typeof a[3]);
 
 
 var a = [0,1,2,3];
-a.length = 2;
+assertEquals(2, a.length = 2);
 
 assertEquals(0, a[0]);
 assertEquals(1, a[1]);
@@ -50,7 +50,7 @@ a[1000000] = 1000000;
 a[2000000] = 2000000;
 
 assertEquals(2000001, a.length);
-a.length = 0;
+assertEquals(0, a.length = 0);
 assertEquals(0, a.length);
 assertEquals('undefined', typeof a[0]);
 assertEquals('undefined', typeof a[1000]);
@@ -65,7 +65,7 @@ a[1000000] = 1000000;
 a[2000000] = 2000000;
 
 assertEquals(2000001, a.length);
-a.length = 2000;
+assertEquals(2000, a.length = 2000);
 assertEquals(2000, a.length);
 assertEquals(0, a[0]);
 assertEquals(1000, a[1000]);
@@ -91,7 +91,7 @@ assertEquals(Math.pow(2,31)-1, a[Math.pow(2,31)-1]);
 assertEquals(Math.pow(2,32)-2, a[Math.pow(2,32)-2]);
 
 assertEquals(Math.pow(2,32)-1, a.length);
-a.length = Math.pow(2,30)+1;  // not a smi!
+assertEquals(Math.pow(2,30) + 1, a.length = Math.pow(2,30)+1);  // not a smi!
 assertEquals(Math.pow(2,30)+1, a.length);
 
 assertEquals(0, a[0]);
@@ -102,10 +102,20 @@ assertEquals('undefined', typeof a[Math.pow(2,32)-2], "top");
 
 
 var a = new Array();
-a.length = new Number(12);
+assertEquals(12, a.length = new Number(12));
 assertEquals(12, a.length);
 
 
 var o = { length: -23 };
 Array.prototype.pop.apply(o);
 assertEquals(4294967272, o.length);
+
+// Check case of compiled stubs.
+var a = [];
+for (var i = 0; i < 7; i++) {
+  assertEquals(3, a.length = 3);
+
+  var t = 239;
+  t = a.length = 7;
+  assertEquals(7, t);
+}