| Index: src/objects.cc
|
| ===================================================================
|
| --- src/objects.cc (revision 11731)
|
| +++ src/objects.cc (working copy)
|
| @@ -1514,7 +1514,8 @@
|
|
|
| MaybeObject* JSObject::AddFastProperty(String* name,
|
| Object* value,
|
| - PropertyAttributes attributes) {
|
| + PropertyAttributes attributes,
|
| + StoreFromKeyed store_mode) {
|
| ASSERT(!IsJSGlobalProxy());
|
|
|
| // Normalize the object if the name is an actual string (not the
|
| @@ -1580,7 +1581,7 @@
|
| }
|
|
|
| if (map()->unused_property_fields() == 0) {
|
| - if (TooManyFastProperties(properties()->length())) {
|
| + if (TooManyFastProperties(properties()->length(), store_mode)) {
|
| Object* obj;
|
| { MaybeObject* maybe_obj =
|
| NormalizeProperties(CLEAR_INOBJECT_PROPERTIES, 0);
|
| @@ -1710,7 +1711,8 @@
|
| MaybeObject* JSObject::AddProperty(String* name,
|
| Object* value,
|
| PropertyAttributes attributes,
|
| - StrictModeFlag strict_mode) {
|
| + StrictModeFlag strict_mode,
|
| + JSReceiver::StoreFromKeyed store_mode) {
|
| ASSERT(!IsJSGlobalProxy());
|
| Map* map_of_this = map();
|
| Heap* heap = GetHeap();
|
| @@ -1733,7 +1735,7 @@
|
| JSFunction::cast(value),
|
| attributes);
|
| } else {
|
| - return AddFastProperty(name, value, attributes);
|
| + return AddFastProperty(name, value, attributes, store_mode);
|
| }
|
| } else {
|
| // Normalize the object to prevent very large instance descriptors.
|
| @@ -1830,7 +1832,7 @@
|
| Object* new_value,
|
| PropertyAttributes attributes) {
|
| if (map()->unused_property_fields() == 0 &&
|
| - TooManyFastProperties(properties()->length())) {
|
| + TooManyFastProperties(properties()->length(), MAY_BE_STORE_FROM_KEYED)) {
|
| Object* obj;
|
| { MaybeObject* maybe_obj =
|
| NormalizeProperties(CLEAR_INOBJECT_PROPERTIES, 0);
|
| @@ -1945,10 +1947,11 @@
|
| MaybeObject* JSReceiver::SetProperty(String* name,
|
| Object* value,
|
| PropertyAttributes attributes,
|
| - StrictModeFlag strict_mode) {
|
| + StrictModeFlag strict_mode,
|
| + JSReceiver::StoreFromKeyed store_mode) {
|
| LookupResult result(GetIsolate());
|
| LocalLookup(name, &result);
|
| - return SetProperty(&result, name, value, attributes, strict_mode);
|
| + return SetProperty(&result, name, value, attributes, strict_mode, store_mode);
|
| }
|
|
|
|
|
| @@ -2619,13 +2622,14 @@
|
| String* key,
|
| Object* value,
|
| PropertyAttributes attributes,
|
| - StrictModeFlag strict_mode) {
|
| + StrictModeFlag strict_mode,
|
| + JSReceiver::StoreFromKeyed store_mode) {
|
| if (result->IsFound() && result->type() == HANDLER) {
|
| return result->proxy()->SetPropertyWithHandler(
|
| this, key, value, attributes, strict_mode);
|
| } else {
|
| return JSObject::cast(this)->SetPropertyForResult(
|
| - result, key, value, attributes, strict_mode);
|
| + result, key, value, attributes, strict_mode, store_mode);
|
| }
|
| }
|
|
|
| @@ -2908,7 +2912,8 @@
|
| String* name,
|
| Object* value,
|
| PropertyAttributes attributes,
|
| - StrictModeFlag strict_mode) {
|
| + StrictModeFlag strict_mode,
|
| + StoreFromKeyed store_mode) {
|
| Heap* heap = GetHeap();
|
| // Make sure that the top context does not change when doing callbacks or
|
| // interceptor calls.
|
| @@ -2939,7 +2944,7 @@
|
| if (proto->IsNull()) return value;
|
| ASSERT(proto->IsJSGlobalObject());
|
| return JSObject::cast(proto)->SetPropertyForResult(
|
| - result, name, value, attributes, strict_mode);
|
| + result, name, value, attributes, strict_mode, store_mode);
|
| }
|
|
|
| if (!result->IsProperty() && !IsJSContextExtensionObject()) {
|
| @@ -2951,7 +2956,7 @@
|
|
|
| if (!result->IsFound()) {
|
| // Neither properties nor transitions found.
|
| - return AddProperty(name, value, attributes, strict_mode);
|
| + return AddProperty(name, value, attributes, strict_mode, store_mode);
|
| }
|
| if (result->IsReadOnly() && result->IsProperty()) {
|
| if (strict_mode == kStrictMode) {
|
|
|