| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index 173cc7dd8590b04a7e8c4b9d5bada2560e0a9e9d..1d95a5c15271ab3d955e2cbd3f2b6ad1b270cc25 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -2943,8 +2943,9 @@ MaybeObject* JSObject::SetPropertyForResult(LookupResult* lookup,
|
| }
|
|
|
| Handle<Object> old_value(heap->the_hole_value(), isolate);
|
| - if (FLAG_harmony_observation && map()->is_observed()) {
|
| - old_value = handle(lookup->GetLazyValue(), isolate);
|
| + if (FLAG_harmony_observation &&
|
| + map()->is_observed() && lookup->IsDataProperty()) {
|
| + old_value = Object::GetProperty(self, name);
|
| }
|
|
|
| // This is a real property that is not read-only, or it is a
|
| @@ -3030,8 +3031,8 @@ MaybeObject* JSObject::SetPropertyForResult(LookupResult* lookup,
|
| } else {
|
| LookupResult new_lookup(isolate);
|
| self->LocalLookup(*name, &new_lookup, true);
|
| - ASSERT(!new_lookup.GetLazyValue()->IsTheHole());
|
| - if (!new_lookup.GetLazyValue()->SameValue(*old_value)) {
|
| + if (new_lookup.IsDataProperty() &&
|
| + !Object::GetProperty(self, name)->SameValue(*old_value)) {
|
| EnqueueChangeRecord(self, "updated", name, old_value);
|
| }
|
| }
|
| @@ -3110,15 +3111,7 @@ MaybeObject* JSObject::SetLocalPropertyIgnoreAttributes(
|
| PropertyAttributes old_attributes = ABSENT;
|
| bool is_observed = FLAG_harmony_observation && self->map()->is_observed();
|
| if (is_observed) {
|
| - // Function prototypes are stored specially
|
| - if (self->IsJSFunction() &&
|
| - JSFunction::cast(*self)->should_have_prototype() &&
|
| - name->Equals(isolate->heap()->prototype_symbol())) {
|
| - MaybeObject* maybe = Accessors::FunctionGetPrototype(*self, NULL);
|
| - if (!maybe->ToHandle(&old_value, isolate)) return maybe;
|
| - } else {
|
| - old_value = handle(lookup.GetLazyValue(), isolate);
|
| - }
|
| + if (lookup.IsDataProperty()) old_value = Object::GetProperty(self, name);
|
| old_attributes = lookup.GetAttributes();
|
| }
|
|
|
| @@ -3188,11 +3181,11 @@ MaybeObject* JSObject::SetLocalPropertyIgnoreAttributes(
|
| } else {
|
| LookupResult new_lookup(isolate);
|
| self->LocalLookup(*name, &new_lookup, true);
|
| - ASSERT(!new_lookup.GetLazyValue()->IsTheHole());
|
| if (old_value->IsTheHole() ||
|
| new_lookup.GetAttributes() != old_attributes) {
|
| EnqueueChangeRecord(self, "reconfigured", name, old_value);
|
| - } else if (!new_lookup.GetLazyValue()->SameValue(*old_value)) {
|
| + } else if (new_lookup.IsDataProperty() &&
|
| + !Object::GetProperty(self, name)->SameValue(*old_value)) {
|
| EnqueueChangeRecord(self, "updated", name, old_value);
|
| }
|
| }
|
| @@ -4255,8 +4248,8 @@ MaybeObject* JSObject::DeleteProperty(String* name, DeleteMode mode) {
|
|
|
| Handle<Object> old_value(isolate->heap()->the_hole_value());
|
| bool is_observed = FLAG_harmony_observation && self->map()->is_observed();
|
| - if (is_observed) {
|
| - old_value = handle(lookup.GetLazyValue(), isolate);
|
| + if (is_observed && lookup.IsDataProperty()) {
|
| + old_value = Object::GetProperty(self, hname);
|
| }
|
| MaybeObject* result;
|
|
|
| @@ -4947,7 +4940,9 @@ MaybeObject* JSObject::DefineAccessor(String* name_raw,
|
| LookupResult lookup(isolate);
|
| LocalLookup(*name, &lookup, true);
|
| preexists = lookup.IsProperty();
|
| - if (preexists) old_value = handle(lookup.GetLazyValue(), isolate);
|
| + if (preexists && lookup.IsDataProperty()) {
|
| + old_value = Object::GetProperty(self, name);
|
| + }
|
| }
|
| }
|
|
|
|
|