Reviewers: Kasper Lund, Description: Merge r2564 to branches/1.2: - Clamp double values as doubles to get a free NaN check and to handle infinity properly.
Please review this at http://codereview.chromium.org/159537 SVN Base: http://v8.googlecode.com/svn/branches/1.2/ Affected files: M src/objects.cc M src/version.cc M test/cctest/test-api.cc Index: test/cctest/test-api.cc =================================================================== --- test/cctest/test-api.cc (revision 2564) +++ test/cctest/test-api.cc (working copy) @@ -7234,6 +7234,20 @@ CHECK_EQ(0, result->Int32Value()); CHECK_EQ(0, i::Smi::cast(jsobj->GetElement(5))->value()); + result = CompileRun("for (var i = 0; i < 8; i++) {" + " pixels[8] = Infinity;" + "}" + "pixels[8];"); + CHECK_EQ(255, result->Int32Value()); + CHECK_EQ(255, i::Smi::cast(jsobj->GetElement(8))->value()); + + result = CompileRun("for (var i = 0; i < 8; i++) {" + " pixels[9] = -Infinity;" + "}" + "pixels[9];"); + CHECK_EQ(0, result->Int32Value()); + CHECK_EQ(0, i::Smi::cast(jsobj->GetElement(9))->value()); + result = CompileRun("pixels[3] = 33;" "delete pixels[3];" "pixels[3];"); Index: src/objects.cc =================================================================== --- src/objects.cc (revision 2564) +++ src/objects.cc (working copy) @@ -7056,28 +7056,32 @@ Object* PixelArray::SetValue(uint32_t index, Object* value) { uint8_t clamped_value = 0; if (index < static_cast<uint32_t>(length())) { - int int_value = 0; if (value->IsSmi()) { - int_value = Smi::cast(value)->value(); + int int_value = Smi::cast(value)->value(); + if (int_value < 0) { + clamped_value = 0; + } else if (int_value > 255) { + clamped_value = 255; + } else { + clamped_value = static_cast<uint8_t>(int_value); + } } else if (value->IsHeapNumber()) { double double_value = HeapNumber::cast(value)->value(); - if (!isnan(double_value)) { - // NaN clamps to zero (default). Other doubles are rounded to - // the nearest integer. - int_value = static_cast<int>(double_value + 0.5); + if (!(double_value > 0)) { + // NaN and less than zero clamp to zero. + clamped_value = 0; + } else if (double_value > 255) { + // Greater than 255 clamp to 255. + clamped_value = 255; + } else { + // Other doubles are rounded to the nearest integer. + clamped_value = static_cast<uint8_t>(double_value + 0.5); } } else { // Clamp undefined to zero (default). All other types have been // converted to a number type further up in the call chain. ASSERT(value->IsUndefined()); } - if (int_value < 0) { - clamped_value = 0; - } else if (int_value > 255) { - clamped_value = 255; - } else { - clamped_value = static_cast<uint8_t>(int_value); - } set(index, clamped_value); } return Smi::FromInt(clamped_value); Index: src/version.cc =================================================================== --- src/version.cc (revision 2564) +++ src/version.cc (working copy) @@ -35,7 +35,7 @@ #define MAJOR_VERSION 1 #define MINOR_VERSION 2 #define BUILD_NUMBER 14 -#define PATCH_LEVEL 10 +#define PATCH_LEVEL 11 #define CANDIDATE_VERSION false // Define SONAME to have the SCons build the put a specific SONAME into the --~--~---------~--~----~------------~-------~--~----~ v8-dev mailing list [email protected] http://groups.google.com/group/v8-dev -~----------~----~----~----~------~----~------~--~---
