Chromium Code Reviews| Index: src/builtins.cc |
| diff --git a/src/builtins.cc b/src/builtins.cc |
| index d0c1a446a8beb9e80e5ddce6fab385d74468363c..602382b79f4c203251bd1a38b099146ece108388 100644 |
| --- a/src/builtins.cc |
| +++ b/src/builtins.cc |
| @@ -382,15 +382,17 @@ BUILTIN(ArrayPush) { |
| } |
| Handle<JSArray> array = Handle<JSArray>::cast(receiver); |
| + int len = Smi::cast(array->length())->value(); |
| + int to_add = args.length() - 1; |
| + if (to_add > 0 && JSArray::WouldChangeReadOnlyLength(array, len + to_add)) { |
| + return CallJsBuiltin(isolate, "ArrayPush", args); |
| + } |
| ASSERT(!array->map()->is_observed()); |
| ElementsKind kind = array->GetElementsKind(); |
| if (IsFastSmiOrObjectElementsKind(kind)) { |
| Handle<FixedArray> elms = Handle<FixedArray>::cast(elms_obj); |
| - |
| - int len = Smi::cast(array->length())->value(); |
| - int to_add = args.length() - 1; |
| if (to_add == 0) { |
| return Smi::FromInt(len); |
| } |
| @@ -429,10 +431,7 @@ BUILTIN(ArrayPush) { |
| array->set_length(Smi::FromInt(new_length)); |
| return Smi::FromInt(new_length); |
| } else { |
| - int len = Smi::cast(array->length())->value(); |
| int elms_len = elms_obj->length(); |
| - |
| - int to_add = args.length() - 1; |
| if (to_add == 0) { |
| return Smi::FromInt(len); |
| } |
| @@ -578,8 +577,6 @@ BUILTIN(ArrayUnshift) { |
| if (!array->HasFastSmiOrObjectElements()) { |
| return CallJsBuiltin(isolate, "ArrayUnshift", args); |
| } |
| - Handle<FixedArray> elms = Handle<FixedArray>::cast(elms_obj); |
| - |
| int len = Smi::cast(array->length())->value(); |
| int to_add = args.length() - 1; |
| int new_length = len + to_add; |
| @@ -587,6 +584,13 @@ BUILTIN(ArrayUnshift) { |
| // we should never hit this case. |
| ASSERT(to_add <= (Smi::kMaxValue - len)); |
| + if (to_add > 0 && JSArray::WouldChangeReadOnlyLength(array, len + to_add)) { |
| + return CallJsBuiltin(isolate, "ArrayUnshift", args); |
| + } |
| + |
| + Handle<FixedArray> elms = Handle<FixedArray>::cast(elms_obj); |
| + |
|
Michael Starzinger
2014/05/21 12:34:36
nit: Only one empty new-line is fine.
ulan
2014/05/21 14:52:22
Done.
|
| + |
| JSObject::EnsureCanContainElements(array, &args, 1, to_add, |
| DONT_ALLOW_DOUBLE_ELEMENTS); |