Chromium Code Reviews| Index: src/runtime.cc |
| diff --git a/src/runtime.cc b/src/runtime.cc |
| index 0c15f60f30677bc02c172b4f6929e5ac559273cd..dcbfb20000581cabce315ac92b0b86d0fb249399 100644 |
| --- a/src/runtime.cc |
| +++ b/src/runtime.cc |
| @@ -335,7 +335,10 @@ static Handle<Object> CreateObjectLiteralBoilerplate( |
| if (key->IsSymbol()) { |
| if (Handle<String>::cast(key)->AsArrayIndex(&element_index)) { |
| // Array index as string (uint32). |
| - result = SetOwnElement(boilerplate, element_index, value); |
| + result = SetOwnElement(boilerplate, |
| + element_index, |
| + value, |
| + kNonStrictMode); |
| } else { |
| Handle<String> name(String::cast(*key)); |
| ASSERT(!name->AsArrayIndex(&element_index)); |
| @@ -344,7 +347,10 @@ static Handle<Object> CreateObjectLiteralBoilerplate( |
| } |
| } else if (key->ToArrayIndex(&element_index)) { |
| // Array index (uint32). |
| - result = SetOwnElement(boilerplate, element_index, value); |
| + result = SetOwnElement(boilerplate, |
| + element_index, |
| + value, |
| + kNonStrictMode); |
| } else { |
| // Non-uint32 number. |
| ASSERT(key->IsNumber()); |
| @@ -1184,7 +1190,8 @@ static MaybeObject* Runtime_DeclareContextSlot(Arguments args) { |
| } else { |
| // The holder is an arguments object. |
| Handle<JSObject> arguments(Handle<JSObject>::cast(holder)); |
| - Handle<Object> result = SetElement(arguments, index, initial_value); |
| + Handle<Object> result = SetElement(arguments, index, initial_value, |
| + kNonStrictMode); |
| if (result.is_null()) return Failure::Exception(); |
| } |
| } else { |
| @@ -1469,7 +1476,7 @@ static MaybeObject* Runtime_InitializeConstContextSlot(Arguments args) { |
| // The holder is an arguments object. |
| ASSERT((attributes & READ_ONLY) == 0); |
| Handle<JSObject> arguments(Handle<JSObject>::cast(holder)); |
| - SetElement(arguments, index, value); |
| + SetElement(arguments, index, value, kNonStrictMode); |
| } |
| return *value; |
| } |
| @@ -3812,8 +3819,7 @@ MaybeObject* Runtime::SetObjectProperty(Handle<Object> object, |
| return *value; |
| } |
| - // TODO(1220): Implement SetElement strict mode. |
| - Handle<Object> result = SetElement(js_object, index, value); |
| + Handle<Object> result = SetElement(js_object, index, value, strict); |
| if (result.is_null()) return Failure::Exception(); |
| return *value; |
| } |
| @@ -3821,7 +3827,7 @@ MaybeObject* Runtime::SetObjectProperty(Handle<Object> object, |
| if (key->IsString()) { |
| Handle<Object> result; |
| if (Handle<String>::cast(key)->AsArrayIndex(&index)) { |
| - result = SetElement(js_object, index, value); |
| + result = SetElement(js_object, index, value, strict); |
| } else { |
| Handle<String> key_string = Handle<String>::cast(key); |
| key_string->TryFlatten(); |
| @@ -3838,8 +3844,7 @@ MaybeObject* Runtime::SetObjectProperty(Handle<Object> object, |
| Handle<String> name = Handle<String>::cast(converted); |
| if (name->AsArrayIndex(&index)) { |
| - // TODO(1220): Implement SetElement strict mode. |
| - return js_object->SetElement(index, *value); |
| + return js_object->SetElement(index, *value, strict); |
| } else { |
| return js_object->SetProperty(*name, *value, attr, strict); |
| } |
| @@ -3866,12 +3871,12 @@ MaybeObject* Runtime::ForceSetObjectProperty(Handle<JSObject> js_object, |
| return *value; |
| } |
| - return js_object->SetElement(index, *value); |
| + return js_object->SetElement(index, *value, kNonStrictMode); |
| } |
| if (key->IsString()) { |
| if (Handle<String>::cast(key)->AsArrayIndex(&index)) { |
| - return js_object->SetElement(index, *value); |
| + return js_object->SetElement(index, *value, kNonStrictMode); |
| } else { |
| Handle<String> key_string = Handle<String>::cast(key); |
| key_string->TryFlatten(); |
| @@ -3888,7 +3893,7 @@ MaybeObject* Runtime::ForceSetObjectProperty(Handle<JSObject> js_object, |
| Handle<String> name = Handle<String>::cast(converted); |
| if (name->AsArrayIndex(&index)) { |
| - return js_object->SetElement(index, *value); |
| + return js_object->SetElement(index, *value, kNonStrictMode); |
| } else { |
| return js_object->SetLocalPropertyIgnoreAttributes(*name, *value, attr); |
| } |
| @@ -7557,11 +7562,17 @@ static MaybeObject* Runtime_StoreContextSlot(Arguments args) { |
| if ((attributes & READ_ONLY) == 0) { |
| // Context is a fixed array and set cannot fail. |
| Context::cast(*holder)->set(index, *value); |
| + } else if (strict == kStrictMode) { |
| + // Setting read only property in strict mode. |
| + Handle<Object> error = |
| + Factory::NewTypeError("strict_cannot_assign", |
| + HandleVector(&name, 1)); |
| + return Top::Throw(*error); |
| } |
| } else { |
| ASSERT((attributes & READ_ONLY) == 0); |
| Handle<Object> result = |
| - SetElement(Handle<JSObject>::cast(holder), index, value); |
| + SetElement(Handle<JSObject>::cast(holder), index, value, strict); |
| if (result.is_null()) { |
| ASSERT(Top::has_pending_exception()); |
| return Failure::Exception(); |
| @@ -7592,7 +7603,7 @@ static MaybeObject* Runtime_StoreContextSlot(Arguments args) { |
| } else if (strict == kStrictMode && (attributes & READ_ONLY) != 0) { |
| // Setting read only property in strict mode. |
| Handle<Object> error = |
| - Factory::NewTypeError("strict_cannot_assign", HandleVector(&name, 1)); |
| + Factory::NewTypeError("strict_cannot_assign", HandleVector(&name, 1)); |
| return Top::Throw(*error); |
| } |
| return *value; |
| @@ -8064,7 +8075,9 @@ static MaybeObject* Runtime_PushIfAbsent(Arguments args) { |
| if (elements->get(i) == element) return Heap::false_value(); |
| } |
| Object* obj; |
| - { MaybeObject* maybe_obj = array->SetFastElement(length, element); |
| + // Strict not needed. Used for cycle detection in Array join implementation. |
| + { MaybeObject* maybe_obj = array->SetFastElement(length, element, |
| + kNonStrictMode); |
| if (!maybe_obj->ToObject(&obj)) return maybe_obj; |
| } |
| return Heap::true_value(); |
| @@ -8659,8 +8672,8 @@ static MaybeObject* Runtime_SwapElements(Arguments args) { |
| Handle<Object> tmp1 = GetElement(jsobject, index1); |
| Handle<Object> tmp2 = GetElement(jsobject, index2); |
| - SetElement(jsobject, index1, tmp2); |
| - SetElement(jsobject, index2, tmp1); |
| + SetElement(jsobject, index1, tmp2, kNonStrictMode); |
|
Martin Maly
2011/03/03 06:07:56
Runtime_SwapElements - used by quick sort. I could
Lasse Reichstein
2011/03/03 09:39:50
It's used only internally in the Array.prototype.s
Lasse Reichstein
2011/03/03 09:44:53
My bad, the spec is fine. It uses [[GetProperty]]
Martin Maly
2011/03/04 00:36:09
Done. Strict mode worked just fine.
|
| + SetElement(jsobject, index2, tmp1, kNonStrictMode); |
| return Heap::undefined_value(); |
| } |
| @@ -11293,10 +11306,11 @@ static MaybeObject* Runtime_CollectStackTrace(Arguments args) { |
| elements->set(cursor++, *code); |
| elements->set(cursor++, *offset); |
| } else { |
| - SetElement(result, cursor++, recv); |
| - SetElement(result, cursor++, fun); |
| - SetElement(result, cursor++, code); |
| - SetElement(result, cursor++, offset); |
| + // Strict mode not required for collecting stack trace. |
| + SetElement(result, cursor++, recv, kNonStrictMode); |
| + SetElement(result, cursor++, fun, kNonStrictMode); |
| + SetElement(result, cursor++, code, kNonStrictMode); |
| + SetElement(result, cursor++, offset, kNonStrictMode); |
| } |
| } |
| } |
| @@ -11483,9 +11497,9 @@ static MaybeObject* Runtime_ListNatives(Arguments args) { |
| Vector<const char>(#Name, StrLength(#Name))); \ |
| } \ |
| Handle<JSArray> pair = Factory::NewJSArray(0); \ |
| - SetElement(pair, 0, name); \ |
| - SetElement(pair, 1, Handle<Smi>(Smi::FromInt(argc))); \ |
| - SetElement(result, index++, pair); \ |
| + SetElement(pair, 0, name, kNonStrictMode); \ |
| + SetElement(pair, 1, Handle<Smi>(Smi::FromInt(argc)), kNonStrictMode); \ |
| + SetElement(result, index++, pair, kNonStrictMode); \ |
|
Martin Maly
2011/03/03 06:07:56
Debug code only, no need for strict mode.
|
| } |
| inline_runtime_functions = false; |
| RUNTIME_FUNCTION_LIST(ADD_ENTRY) |