| Index: src/objects.cc
|
| ===================================================================
|
| --- src/objects.cc (revision 7276)
|
| +++ src/objects.cc (working copy)
|
| @@ -1438,13 +1438,19 @@
|
|
|
| MaybeObject* JSObject::AddProperty(String* name,
|
| Object* value,
|
| - PropertyAttributes attributes) {
|
| + PropertyAttributes attributes,
|
| + StrictModeFlag strict_mode) {
|
| ASSERT(!IsJSGlobalProxy());
|
| Heap* heap = GetHeap();
|
| if (!map()->is_extensible()) {
|
| - Handle<Object> args[1] = {Handle<String>(name)};
|
| - return heap->isolate()->Throw(
|
| - *FACTORY->NewTypeError("object_not_extensible", HandleVector(args, 1)));
|
| + if (strict_mode == kNonStrictMode) {
|
| + return heap->undefined_value();
|
| + } else {
|
| + Handle<Object> args[1] = {Handle<String>(name)};
|
| + return heap->isolate()->Throw(
|
| + *FACTORY->NewTypeError("object_not_extensible",
|
| + HandleVector(args, 1)));
|
| + }
|
| }
|
| if (HasFastProperties()) {
|
| // Ensure the descriptor array does not get too big.
|
| @@ -1485,7 +1491,7 @@
|
| return SetProperty(&result, name, value, attributes, strict_mode);
|
| }
|
| // Add a new real property.
|
| - return AddProperty(name, value, attributes);
|
| + return AddProperty(name, value, attributes, strict_mode);
|
| }
|
|
|
|
|
| @@ -1989,7 +1995,7 @@
|
| }
|
| if (!result->IsFound()) {
|
| // Neither properties nor transitions found.
|
| - return AddProperty(name, value, attributes);
|
| + return AddProperty(name, value, attributes, strict_mode);
|
| }
|
| if (result->IsReadOnly() && result->IsProperty()) {
|
| if (strict_mode == kStrictMode) {
|
| @@ -2096,7 +2102,7 @@
|
| // Check for accessor in prototype chain removed here in clone.
|
| if (!result.IsFound()) {
|
| // Neither properties nor transitions found.
|
| - return AddProperty(name, value, attributes);
|
| + return AddProperty(name, value, attributes, kNonStrictMode);
|
| }
|
|
|
| PropertyDetails details = PropertyDetails(attributes, NORMAL);
|
| @@ -7347,13 +7353,17 @@
|
| // When we set the is_extensible flag to false we always force
|
| // the element into dictionary mode (and force them to stay there).
|
| if (!map()->is_extensible()) {
|
| - Handle<Object> number(isolate->factory()->NewNumberFromUint(index));
|
| - Handle<String> index_string(
|
| - isolate->factory()->NumberToString(number));
|
| - Handle<Object> args[1] = { index_string };
|
| - return isolate->Throw(
|
| - *isolate->factory()->NewTypeError("object_not_extensible",
|
| - HandleVector(args, 1)));
|
| + if (strict_mode == kNonStrictMode) {
|
| + return isolate->heap()->undefined_value();
|
| + } else {
|
| + Handle<Object> number(isolate->factory()->NewNumberFromUint(index));
|
| + Handle<String> index_string(
|
| + isolate->factory()->NumberToString(number));
|
| + Handle<Object> args[1] = { index_string };
|
| + return isolate->Throw(
|
| + *isolate->factory()->NewTypeError("object_not_extensible",
|
| + HandleVector(args, 1)));
|
| + }
|
| }
|
| Object* result;
|
| { MaybeObject* maybe_result = dictionary->AtNumberPut(index, value);
|
|
|