| Index: src/objects.cc
|
| ===================================================================
|
| --- src/objects.cc (revision 2563)
|
| +++ src/objects.cc (working copy)
|
| @@ -6985,28 +6985,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);
|
|
|