Reviewers: Mads Ager,

Message:
Fast case pixel array in not implemented on x64 or ARM.

Description:
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

Please review this at http://codereview.chromium.org/248033

SVN Base: http://v8.googlecode.com/svn/branches/bleeding_edge/

Affected files:
   M     src/ia32/ic-ia32.cc
   M     test/cctest/test-api.cc


Index: test/cctest/test-api.cc
===================================================================
--- test/cctest/test-api.cc     (revision 2984)
+++ test/cctest/test-api.cc     (working copy)
@@ -7729,8 +7729,44 @@
    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];"
                        "}"
                        "sum;");
@@ -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);
  }

Index: src/ia32/ic-ia32.cc
===================================================================
--- src/ia32/ic-ia32.cc (revision 2984)
+++ src/ia32/ic-ia32.cc (working copy)
@@ -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



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

Reply via email to