Index: src/ic.cc |
diff --git a/src/ic.cc b/src/ic.cc |
index ca3970bad41e8c8257181c1a79de8a4b2d3e5286..829db7d9e65627b089b7a07034eac63603ede41b 100644 |
--- a/src/ic.cc |
+++ b/src/ic.cc |
@@ -1195,11 +1195,12 @@ MaybeHandle<Object> KeyedLoadIC::Load(Handle<Object> object, |
} |
-static bool LookupForWrite(Handle<JSObject> receiver, |
- Handle<String> name, |
- Handle<Object> value, |
- LookupResult* lookup, |
- IC* ic) { |
+static bool LookupForWrite(Handle<Object> object, Handle<String> name, |
+ Handle<Object> value, LookupResult* lookup, IC* ic) { |
+ // Disable ICs for non-JSObjects for now. |
+ if (!object->IsJSObject()) return false; |
+ Handle<JSObject> receiver = Handle<JSObject>::cast(object); |
+ |
Handle<JSObject> holder = receiver; |
receiver->Lookup(name, lookup); |
if (lookup->IsFound()) { |
@@ -1268,11 +1269,10 @@ MaybeHandle<Object> StoreIC::Store(Handle<Object> object, |
// TODO(verwaest): Let SetProperty do the migration, since storing a property |
// might deprecate the current map again, if value does not fit. |
if (MigrateDeprecated(object) || object->IsJSProxy()) { |
- Handle<JSReceiver> receiver = Handle<JSReceiver>::cast(object); |
Handle<Object> result; |
ASSIGN_RETURN_ON_EXCEPTION( |
isolate(), result, |
- JSReceiver::SetProperty(receiver, name, value, strict_mode()), Object); |
+ Object::SetProperty(object, name, value, strict_mode()), Object); |
return result; |
} |
@@ -1282,21 +1282,14 @@ MaybeHandle<Object> StoreIC::Store(Handle<Object> object, |
return TypeError("non_object_property_store", object, name); |
} |
- // The length property of string values is read-only. Throw in strict mode. |
- if (strict_mode() == STRICT && object->IsString() && |
- String::Equals(isolate()->factory()->length_string(), name)) { |
- return TypeError("strict_read_only_property", object, name); |
- } |
- |
- // Ignore other stores where the receiver is not a JSObject. |
- // TODO(1475): Must check prototype chains of object wrappers. |
- if (!object->IsJSObject()) return value; |
- |
- Handle<JSObject> receiver = Handle<JSObject>::cast(object); |
- |
// Check if the given name is an array index. |
uint32_t index; |
if (name->AsArrayIndex(&index)) { |
+ // Ignore other stores where the receiver is not a JSObject. |
+ // TODO(1475): Must check prototype chains of object wrappers. |
+ if (!object->IsJSObject()) return value; |
+ Handle<JSObject> receiver = Handle<JSObject>::cast(object); |
+ |
Handle<Object> result; |
ASSIGN_RETURN_ON_EXCEPTION( |
isolate(), |
@@ -1307,17 +1300,18 @@ MaybeHandle<Object> StoreIC::Store(Handle<Object> object, |
} |
// Observed objects are always modified through the runtime. |
- if (receiver->map()->is_observed()) { |
+ if (object->IsHeapObject() && |
+ Handle<HeapObject>::cast(object)->map()->is_observed()) { |
Handle<Object> result; |
ASSIGN_RETURN_ON_EXCEPTION( |
- isolate(), result, JSReceiver::SetProperty(receiver, name, value, |
- strict_mode(), store_mode), |
+ isolate(), result, |
+ Object::SetProperty(object, name, value, strict_mode(), store_mode), |
Object); |
return result; |
} |
LookupResult lookup(isolate()); |
- bool can_store = LookupForWrite(receiver, name, value, &lookup, this); |
+ bool can_store = LookupForWrite(object, name, value, &lookup, this); |
if (!can_store && |
strict_mode() == STRICT && |
!(lookup.IsProperty() && lookup.IsReadOnly()) && |
@@ -1331,7 +1325,7 @@ MaybeHandle<Object> StoreIC::Store(Handle<Object> object, |
set_target(*stub); |
TRACE_IC("StoreIC", name); |
} else if (can_store) { |
- UpdateCaches(&lookup, receiver, name, value); |
+ UpdateCaches(&lookup, Handle<JSObject>::cast(object), name, value); |
} else if (lookup.IsNormal() || |
(lookup.IsField() && lookup.CanHoldValue(value))) { |
Handle<Code> stub = generic_stub(); |
@@ -1343,7 +1337,7 @@ MaybeHandle<Object> StoreIC::Store(Handle<Object> object, |
Handle<Object> result; |
ASSIGN_RETURN_ON_EXCEPTION( |
isolate(), result, |
- JSReceiver::SetProperty(receiver, name, value, strict_mode(), store_mode), |
+ Object::SetProperty(object, name, value, strict_mode(), store_mode), |
Object); |
return result; |
} |