Revision: 2985
Author: [email protected]
Date: Tue Sep 29 07:56:24 2009
Log: Return the original value when assigning to a pixel array.

After fast-case assignment to a pixel array the original value assigned is  
now returned. Before the un-tagged smi value was returned causing crashes.

BUG=22913
TEST=cctest/test-api/PixelArray
Review URL: http://codereview.chromium.org/248033
http://code.google.com/p/v8/source/detail?r=2985

Modified:
  /branches/bleeding_edge/src/ia32/ic-ia32.cc
  /branches/bleeding_edge/test/cctest/test-api.cc

=======================================
--- /branches/bleeding_edge/src/ia32/ic-ia32.cc Fri Sep 11 05:41:27 2009
+++ /branches/bleeding_edge/src/ia32/ic-ia32.cc Tue Sep 29 07:56:24 2009
@@ -421,6 +421,7 @@
    __ sar(ebx, kSmiTagSize);  // Untag the index.
    __ cmp(ebx, FieldOperand(ecx, PixelArray::kLengthOffset));
    __ j(above_equal, &slow);
+  __ mov(edx, eax);  // Save the value.
    __ sar(eax, kSmiTagSize);  // Untag the value.
    {  // Clamp the value to [0..255].
      Label done, check_255;
@@ -436,6 +437,7 @@
    }
    __ mov(ecx, FieldOperand(ecx, PixelArray::kExternalPointerOffset));
    __ mov_b(Operand(ecx, ebx, times_1, 0), eax);
+  __ mov(eax, edx);  // Return the original value.
    __ ret(0);

    // Extra capacity case: Check if there is extra capacity to
=======================================
--- /branches/bleeding_edge/test/cctest/test-api.cc     Mon Aug 31 08:02:54 2009
+++ /branches/bleeding_edge/test/cctest/test-api.cc     Tue Sep 29 07:56:24 2009
@@ -7729,6 +7729,42 @@
    CHECK_EQ(1503, result->Int32Value());
    result = CompileRun("pixels[1]");
    CHECK_EQ(1, result->Int32Value());
+
+  result = CompileRun("var sum = 0;"
+                      "for (var i = 0; i < 8; i++) {"
+                      "  sum += pixels[i] = pixels[i] = -i;"
+                      "}"
+                      "sum;");
+  CHECK_EQ(-28, result->Int32Value());
+
+  result = CompileRun("var sum = 0;"
+                      "for (var i = 0; i < 8; i++) {"
+                      "  sum += pixels[i] = pixels[i] = 0;"
+                      "}"
+                      "sum;");
+  CHECK_EQ(0, result->Int32Value());
+
+  result = CompileRun("var sum = 0;"
+                      "for (var i = 0; i < 8; i++) {"
+                      "  sum += pixels[i] = pixels[i] = 255;"
+                      "}"
+                      "sum;");
+  CHECK_EQ(8 * 255, result->Int32Value());
+
+  result = CompileRun("var sum = 0;"
+                      "for (var i = 0; i < 8; i++) {"
+                      "  sum += pixels[i] = pixels[i] = 256 + i;"
+                      "}"
+                      "sum;");
+  CHECK_EQ(2076, result->Int32Value());
+
+  result = CompileRun("var sum = 0;"
+                      "for (var i = 0; i < 8; i++) {"
+                      "  sum += pixels[i] = pixels[i] = i;"
+                      "}"
+                      "sum;");
+  CHECK_EQ(28, result->Int32Value());
+
    result = CompileRun("var sum = 0;"
                        "for (var i = 0; i < 8; i++) {"
                        "  sum += pixels[i];"
@@ -7839,6 +7875,9 @@
    CHECK_EQ(77, v8::Object::Cast(*result)->Get(v8_str("0"))->Int32Value());
    CHECK_EQ(23, v8::Object::Cast(*result)->Get(v8_str("1"))->Int32Value());

+  result = CompileRun("pixels[1] = 23;");
+  CHECK_EQ(23, result->Int32Value());
+
    free(pixel_data);
  }


--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to