OLD | NEW |
---|---|
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 3168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3179 case NONEXISTENT: | 3179 case NONEXISTENT: |
3180 UNREACHABLE(); | 3180 UNREACHABLE(); |
3181 } | 3181 } |
3182 | 3182 |
3183 Handle<Object> hresult; | 3183 Handle<Object> hresult; |
3184 if (!result->ToHandle(&hresult, isolate)) return result; | 3184 if (!result->ToHandle(&hresult, isolate)) return result; |
3185 | 3185 |
3186 if (is_observed) { | 3186 if (is_observed) { |
3187 if (lookup.IsTransition()) { | 3187 if (lookup.IsTransition()) { |
3188 EnqueueChangeRecord(self, "new", name, old_value); | 3188 EnqueueChangeRecord(self, "new", name, old_value); |
3189 } else if (old_value->IsTheHole()) { | |
rossberg
2013/01/17 16:57:44
Is this extra branch actually needed? It seems lik
adamk
2013/01/22 22:30:10
I think I pulled this out to avoid an unnecessary
rossberg
2013/01/28 13:30:43
Yeah, the fewer code paths the better, but I don't
| |
3190 EnqueueChangeRecord(self, "reconfigured", name, old_value); | |
3189 } else { | 3191 } else { |
3190 LookupResult new_lookup(isolate); | 3192 LookupResult new_lookup(isolate); |
3191 self->LocalLookup(*name, &new_lookup, true); | 3193 self->LocalLookup(*name, &new_lookup, true); |
3192 if (old_value->IsTheHole() || | 3194 bool value_changed = new_lookup.IsDataProperty() && |
3193 new_lookup.GetAttributes() != old_attributes) { | 3195 !old_value->SameValue(*Object::GetProperty(self, name)); |
3196 if (new_lookup.GetAttributes() != old_attributes) { | |
3197 if (!value_changed) old_value = isolate->factory()->the_hole_value(); | |
3194 EnqueueChangeRecord(self, "reconfigured", name, old_value); | 3198 EnqueueChangeRecord(self, "reconfigured", name, old_value); |
3195 } else if (new_lookup.IsDataProperty() && | 3199 } else if (value_changed) { |
3196 !Object::GetProperty(self, name)->SameValue(*old_value)) { | |
3197 EnqueueChangeRecord(self, "updated", name, old_value); | 3200 EnqueueChangeRecord(self, "updated", name, old_value); |
3198 } | 3201 } |
3199 } | 3202 } |
3200 } | 3203 } |
3201 | 3204 |
3202 return *hresult; | 3205 return *hresult; |
3203 } | 3206 } |
3204 | 3207 |
3205 | 3208 |
3206 PropertyAttributes JSObject::GetPropertyAttributePostInterceptor( | 3209 PropertyAttributes JSObject::GetPropertyAttributePostInterceptor( |
(...skipping 7042 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
10249 | 10252 |
10250 Handle<String> name = isolate->factory()->Uint32ToString(index); | 10253 Handle<String> name = isolate->factory()->Uint32ToString(index); |
10251 PropertyAttributes new_attributes = self->GetLocalElementAttribute(index); | 10254 PropertyAttributes new_attributes = self->GetLocalElementAttribute(index); |
10252 if (old_attributes == ABSENT) { | 10255 if (old_attributes == ABSENT) { |
10253 EnqueueChangeRecord(self, "new", name, old_value); | 10256 EnqueueChangeRecord(self, "new", name, old_value); |
10254 if (self->IsJSArray() && | 10257 if (self->IsJSArray() && |
10255 !old_length->SameValue(Handle<JSArray>::cast(self)->length())) { | 10258 !old_length->SameValue(Handle<JSArray>::cast(self)->length())) { |
10256 EnqueueChangeRecord( | 10259 EnqueueChangeRecord( |
10257 self, "updated", isolate->factory()->length_symbol(), old_length); | 10260 self, "updated", isolate->factory()->length_symbol(), old_length); |
10258 } | 10261 } |
10259 } else if (old_attributes != new_attributes || old_value->IsTheHole()) { | 10262 } else if (old_value->IsTheHole()) { |
rossberg
2013/01/17 16:57:44
Similarly here.
| |
10260 EnqueueChangeRecord(self, "reconfigured", name, old_value); | 10263 EnqueueChangeRecord(self, "reconfigured", name, old_value); |
10261 } else if (!old_value->SameValue(*Object::GetElement(self, index))) { | 10264 } else { |
10262 EnqueueChangeRecord(self, "updated", name, old_value); | 10265 bool value_changed = |
10266 !old_value->SameValue(*Object::GetElement(self, index)); | |
10267 if (old_attributes != new_attributes) { | |
10268 if (!value_changed) old_value = isolate->factory()->the_hole_value(); | |
10269 EnqueueChangeRecord(self, "reconfigured", name, old_value); | |
10270 } else if (value_changed) { | |
10271 EnqueueChangeRecord(self, "updated", name, old_value); | |
10272 } | |
10263 } | 10273 } |
10264 | 10274 |
10265 return *hresult; | 10275 return *hresult; |
10266 } | 10276 } |
10267 | 10277 |
10268 | 10278 |
10269 MaybeObject* JSObject::SetElementWithoutInterceptor(uint32_t index, | 10279 MaybeObject* JSObject::SetElementWithoutInterceptor(uint32_t index, |
10270 Object* value, | 10280 Object* value, |
10271 PropertyAttributes attr, | 10281 PropertyAttributes attr, |
10272 StrictModeFlag strict_mode, | 10282 StrictModeFlag strict_mode, |
(...skipping 3452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
13725 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); | 13735 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); |
13726 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); | 13736 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); |
13727 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); | 13737 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); |
13728 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); | 13738 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); |
13729 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); | 13739 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); |
13730 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); | 13740 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); |
13731 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); | 13741 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); |
13732 } | 13742 } |
13733 | 13743 |
13734 } } // namespace v8::internal | 13744 } } // namespace v8::internal |
OLD | NEW |