| 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 1699 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1710 result = AddSlowProperty(name, value, attributes); | 1710 result = AddSlowProperty(name, value, attributes); |
| 1711 } | 1711 } |
| 1712 } else { | 1712 } else { |
| 1713 result = AddSlowProperty(name, value, attributes); | 1713 result = AddSlowProperty(name, value, attributes); |
| 1714 } | 1714 } |
| 1715 | 1715 |
| 1716 Handle<Object> hresult; | 1716 Handle<Object> hresult; |
| 1717 if (!result->ToHandle(&hresult)) return result; | 1717 if (!result->ToHandle(&hresult)) return result; |
| 1718 | 1718 |
| 1719 if (FLAG_harmony_observation && map()->is_observed()) { | 1719 if (FLAG_harmony_observation && map()->is_observed()) { |
| 1720 this->EnqueueChangeRecord( | 1720 EnqueueChangeRecord(handle(this), "new", handle(name), |
| 1721 "new", handle(name), handle(heap->the_hole_value())); | 1721 handle(heap->the_hole_value())); |
| 1722 } | 1722 } |
| 1723 | 1723 |
| 1724 return *hresult; | 1724 return *hresult; |
| 1725 } | 1725 } |
| 1726 | 1726 |
| 1727 | 1727 |
| 1728 void JSObject::EnqueueChangeRecord( | 1728 void JSObject::EnqueueChangeRecord(Handle<JSObject> object, |
| 1729 const char* type_str, Handle<String> name, Handle<Object> old_value) { | 1729 const char* type_str, |
| 1730 Isolate* isolate = GetIsolate(); | 1730 Handle<String> name, |
| 1731 Handle<Object> old_value) { |
| 1732 Isolate* isolate = object->GetIsolate(); |
| 1731 HandleScope scope; | 1733 HandleScope scope; |
| 1732 Handle<String> type = isolate->factory()->LookupAsciiSymbol(type_str); | 1734 Handle<String> type = isolate->factory()->LookupAsciiSymbol(type_str); |
| 1733 Handle<JSObject> object(this); | |
| 1734 Handle<Object> args[] = { type, object, name, old_value }; | 1735 Handle<Object> args[] = { type, object, name, old_value }; |
| 1735 bool threw; | 1736 bool threw; |
| 1736 Execution::Call(Handle<JSFunction>(isolate->observers_notify_change()), | 1737 Execution::Call(Handle<JSFunction>(isolate->observers_notify_change()), |
| 1737 Handle<Object>(isolate->heap()->undefined_value()), | 1738 Handle<Object>(isolate->heap()->undefined_value()), |
| 1738 old_value->IsTheHole() ? 3 : 4, args, | 1739 old_value->IsTheHole() ? 3 : 4, args, |
| 1739 &threw); | 1740 &threw); |
| 1740 ASSERT(!threw); | 1741 ASSERT(!threw); |
| 1741 } | 1742 } |
| 1742 | 1743 |
| 1743 | 1744 |
| (...skipping 1233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2977 case HANDLER: | 2978 case HANDLER: |
| 2978 case NONEXISTENT: | 2979 case NONEXISTENT: |
| 2979 UNREACHABLE(); | 2980 UNREACHABLE(); |
| 2980 } | 2981 } |
| 2981 | 2982 |
| 2982 Handle<Object> hresult; | 2983 Handle<Object> hresult; |
| 2983 if (!result->ToHandle(&hresult)) return result; | 2984 if (!result->ToHandle(&hresult)) return result; |
| 2984 | 2985 |
| 2985 if (FLAG_harmony_observation && map()->is_observed()) { | 2986 if (FLAG_harmony_observation && map()->is_observed()) { |
| 2986 if (lookup->IsTransition()) { | 2987 if (lookup->IsTransition()) { |
| 2987 self->EnqueueChangeRecord("new", name, old_value); | 2988 EnqueueChangeRecord(self, "new", name, old_value); |
| 2988 } else { | 2989 } else { |
| 2989 LookupResult new_lookup(self->GetIsolate()); | 2990 LookupResult new_lookup(self->GetIsolate()); |
| 2990 self->LocalLookup(*name, &new_lookup); | 2991 self->LocalLookup(*name, &new_lookup); |
| 2991 ASSERT(!new_lookup.GetLazyValue()->IsTheHole()); | 2992 ASSERT(!new_lookup.GetLazyValue()->IsTheHole()); |
| 2992 if (!new_lookup.GetLazyValue()->SameValue(*old_value)) { | 2993 if (!new_lookup.GetLazyValue()->SameValue(*old_value)) { |
| 2993 self->EnqueueChangeRecord("updated", name, old_value); | 2994 EnqueueChangeRecord(self, "updated", name, old_value); |
| 2994 } | 2995 } |
| 2995 } | 2996 } |
| 2996 } | 2997 } |
| 2997 | 2998 |
| 2998 return *hresult; | 2999 return *hresult; |
| 2999 } | 3000 } |
| 3000 | 3001 |
| 3001 | 3002 |
| 3002 // Set a real local property, even if it is READ_ONLY. If the property is not | 3003 // Set a real local property, even if it is READ_ONLY. If the property is not |
| 3003 // present, add it with attributes NONE. This code is an exact clone of | 3004 // present, add it with attributes NONE. This code is an exact clone of |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3125 case HANDLER: | 3126 case HANDLER: |
| 3126 case NONEXISTENT: | 3127 case NONEXISTENT: |
| 3127 UNREACHABLE(); | 3128 UNREACHABLE(); |
| 3128 } | 3129 } |
| 3129 | 3130 |
| 3130 Handle<Object> hresult; | 3131 Handle<Object> hresult; |
| 3131 if (!result->ToHandle(&hresult)) return result; | 3132 if (!result->ToHandle(&hresult)) return result; |
| 3132 | 3133 |
| 3133 if (FLAG_harmony_observation && map()->is_observed()) { | 3134 if (FLAG_harmony_observation && map()->is_observed()) { |
| 3134 if (lookup.IsTransition()) { | 3135 if (lookup.IsTransition()) { |
| 3135 self->EnqueueChangeRecord("new", name, old_value); | 3136 EnqueueChangeRecord(self, "new", name, old_value); |
| 3136 } else { | 3137 } else { |
| 3137 LookupResult new_lookup(isolate); | 3138 LookupResult new_lookup(isolate); |
| 3138 self->LocalLookup(*name, &new_lookup); | 3139 self->LocalLookup(*name, &new_lookup); |
| 3139 ASSERT(!new_lookup.GetLazyValue()->IsTheHole()); | 3140 ASSERT(!new_lookup.GetLazyValue()->IsTheHole()); |
| 3140 if (old_value->IsTheHole() || | 3141 if (old_value->IsTheHole() || |
| 3141 new_lookup.GetAttributes() != old_attributes) { | 3142 new_lookup.GetAttributes() != old_attributes) { |
| 3142 self->EnqueueChangeRecord("reconfigured", name, old_value); | 3143 EnqueueChangeRecord(self, "reconfigured", name, old_value); |
| 3143 } else if (!new_lookup.GetLazyValue()->SameValue(*old_value)) { | 3144 } else if (!new_lookup.GetLazyValue()->SameValue(*old_value)) { |
| 3144 self->EnqueueChangeRecord("updated", name, old_value); | 3145 EnqueueChangeRecord(self, "updated", name, old_value); |
| 3145 } | 3146 } |
| 3146 } | 3147 } |
| 3147 } | 3148 } |
| 3148 | 3149 |
| 3149 return *hresult; | 3150 return *hresult; |
| 3150 } | 3151 } |
| 3151 | 3152 |
| 3152 | 3153 |
| 3153 PropertyAttributes JSObject::GetPropertyAttributePostInterceptor( | 3154 PropertyAttributes JSObject::GetPropertyAttributePostInterceptor( |
| 3154 JSObject* receiver, | 3155 JSObject* receiver, |
| (...skipping 976 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4131 result = self->DeleteElementWithInterceptor(index); | 4132 result = self->DeleteElementWithInterceptor(index); |
| 4132 } else { | 4133 } else { |
| 4133 result = self->GetElementsAccessor()->Delete(*self, index, mode); | 4134 result = self->GetElementsAccessor()->Delete(*self, index, mode); |
| 4134 } | 4135 } |
| 4135 | 4136 |
| 4136 Handle<Object> hresult; | 4137 Handle<Object> hresult; |
| 4137 if (!result->ToHandle(&hresult)) return result; | 4138 if (!result->ToHandle(&hresult)) return result; |
| 4138 | 4139 |
| 4139 if (FLAG_harmony_observation && map()->is_observed()) { | 4140 if (FLAG_harmony_observation && map()->is_observed()) { |
| 4140 if (preexists && !self->HasLocalElement(index)) | 4141 if (preexists && !self->HasLocalElement(index)) |
| 4141 self->EnqueueChangeRecord("deleted", name, old_value); | 4142 EnqueueChangeRecord(self, "deleted", name, old_value); |
| 4142 } | 4143 } |
| 4143 | 4144 |
| 4144 return *hresult; | 4145 return *hresult; |
| 4145 } | 4146 } |
| 4146 | 4147 |
| 4147 | 4148 |
| 4148 Handle<Object> JSObject::DeleteProperty(Handle<JSObject> obj, | 4149 Handle<Object> JSObject::DeleteProperty(Handle<JSObject> obj, |
| 4149 Handle<String> prop) { | 4150 Handle<String> prop) { |
| 4150 CALL_HEAP_FUNCTION(obj->GetIsolate(), | 4151 CALL_HEAP_FUNCTION(obj->GetIsolate(), |
| 4151 obj->DeleteProperty(*prop, JSObject::NORMAL_DELETION), | 4152 obj->DeleteProperty(*prop, JSObject::NORMAL_DELETION), |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4218 if (!result->To(&obj)) return result; | 4219 if (!result->To(&obj)) return result; |
| 4219 // Make sure the properties are normalized before removing the entry. | 4220 // Make sure the properties are normalized before removing the entry. |
| 4220 result = self->DeleteNormalizedProperty(*hname, mode); | 4221 result = self->DeleteNormalizedProperty(*hname, mode); |
| 4221 } | 4222 } |
| 4222 | 4223 |
| 4223 Handle<Object> hresult; | 4224 Handle<Object> hresult; |
| 4224 if (!result->ToHandle(&hresult)) return result; | 4225 if (!result->ToHandle(&hresult)) return result; |
| 4225 | 4226 |
| 4226 if (FLAG_harmony_observation && map()->is_observed()) { | 4227 if (FLAG_harmony_observation && map()->is_observed()) { |
| 4227 if (!self->HasLocalProperty(*hname)) | 4228 if (!self->HasLocalProperty(*hname)) |
| 4228 self->EnqueueChangeRecord("deleted", hname, old_value); | 4229 EnqueueChangeRecord(self, "deleted", hname, old_value); |
| 4229 } | 4230 } |
| 4230 | 4231 |
| 4231 return *hresult; | 4232 return *hresult; |
| 4232 } | 4233 } |
| 4233 | 4234 |
| 4234 | 4235 |
| 4235 MaybeObject* JSReceiver::DeleteElement(uint32_t index, DeleteMode mode) { | 4236 MaybeObject* JSReceiver::DeleteElement(uint32_t index, DeleteMode mode) { |
| 4236 if (IsJSProxy()) { | 4237 if (IsJSProxy()) { |
| 4237 return JSProxy::cast(this)->DeleteElementWithHandler(index, mode); | 4238 return JSProxy::cast(this)->DeleteElementWithHandler(index, mode); |
| 4238 } | 4239 } |
| (...skipping 646 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4885 | 4886 |
| 4886 MaybeObject* result = is_element ? | 4887 MaybeObject* result = is_element ? |
| 4887 self->DefineElementAccessor(index, *getter, *setter, attributes) : | 4888 self->DefineElementAccessor(index, *getter, *setter, attributes) : |
| 4888 self->DefinePropertyAccessor(*name, *getter, *setter, attributes); | 4889 self->DefinePropertyAccessor(*name, *getter, *setter, attributes); |
| 4889 | 4890 |
| 4890 Handle<Object> hresult; | 4891 Handle<Object> hresult; |
| 4891 if (!result->ToHandle(&hresult)) return result; | 4892 if (!result->ToHandle(&hresult)) return result; |
| 4892 | 4893 |
| 4893 if (FLAG_harmony_observation && map()->is_observed()) { | 4894 if (FLAG_harmony_observation && map()->is_observed()) { |
| 4894 const char* type = preexists ? "reconfigured" : "new"; | 4895 const char* type = preexists ? "reconfigured" : "new"; |
| 4895 self->EnqueueChangeRecord(type, name, old_value); | 4896 EnqueueChangeRecord(self, type, name, old_value); |
| 4896 } | 4897 } |
| 4897 | 4898 |
| 4898 return *hresult; | 4899 return *hresult; |
| 4899 } | 4900 } |
| 4900 | 4901 |
| 4901 | 4902 |
| 4902 static MaybeObject* TryAccessorTransition(JSObject* self, | 4903 static MaybeObject* TryAccessorTransition(JSObject* self, |
| 4903 Map* transitioned_map, | 4904 Map* transitioned_map, |
| 4904 int target_descriptor, | 4905 int target_descriptor, |
| 4905 AccessorComponent component, | 4906 AccessorComponent component, |
| (...skipping 5404 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10310 index, *value, attributes, strict_mode, check_prototype, set_mode) | 10311 index, *value, attributes, strict_mode, check_prototype, set_mode) |
| 10311 : self->SetElementWithoutInterceptor( | 10312 : self->SetElementWithoutInterceptor( |
| 10312 index, *value, attributes, strict_mode, check_prototype, set_mode); | 10313 index, *value, attributes, strict_mode, check_prototype, set_mode); |
| 10313 | 10314 |
| 10314 Handle<Object> hresult; | 10315 Handle<Object> hresult; |
| 10315 if (!result->ToHandle(&hresult)) return result; | 10316 if (!result->ToHandle(&hresult)) return result; |
| 10316 | 10317 |
| 10317 if (FLAG_harmony_observation && map()->is_observed()) { | 10318 if (FLAG_harmony_observation && map()->is_observed()) { |
| 10318 PropertyAttributes new_attributes = self->GetLocalPropertyAttribute(*name); | 10319 PropertyAttributes new_attributes = self->GetLocalPropertyAttribute(*name); |
| 10319 if (!preexists) { | 10320 if (!preexists) { |
| 10320 self->EnqueueChangeRecord("new", name, old_value); | 10321 EnqueueChangeRecord(self, "new", name, old_value); |
| 10321 } else if (new_attributes != old_attributes || old_value->IsTheHole()) { | 10322 } else if (new_attributes != old_attributes || old_value->IsTheHole()) { |
| 10322 self->EnqueueChangeRecord("reconfigured", name, old_value); | 10323 EnqueueChangeRecord(self, "reconfigured", name, old_value); |
| 10323 } else { | 10324 } else { |
| 10324 Handle<Object> newValue = Object::GetElement(self, index); | 10325 Handle<Object> newValue = Object::GetElement(self, index); |
| 10325 if (!newValue->SameValue(*old_value)) | 10326 if (!newValue->SameValue(*old_value)) |
| 10326 self->EnqueueChangeRecord("updated", name, old_value); | 10327 EnqueueChangeRecord(self, "updated", name, old_value); |
| 10327 } | 10328 } |
| 10328 } | 10329 } |
| 10329 | 10330 |
| 10330 return *hresult; | 10331 return *hresult; |
| 10331 } | 10332 } |
| 10332 | 10333 |
| 10333 | 10334 |
| 10334 MaybeObject* JSObject::SetElementWithoutInterceptor(uint32_t index, | 10335 MaybeObject* JSObject::SetElementWithoutInterceptor(uint32_t index, |
| 10335 Object* value, | 10336 Object* value, |
| 10336 PropertyAttributes attr, | 10337 PropertyAttributes attr, |
| (...skipping 3495 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13832 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); | 13833 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); |
| 13833 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); | 13834 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); |
| 13834 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); | 13835 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); |
| 13835 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); | 13836 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); |
| 13836 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); | 13837 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); |
| 13837 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); | 13838 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); |
| 13838 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); | 13839 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); |
| 13839 } | 13840 } |
| 13840 | 13841 |
| 13841 } } // namespace v8::internal | 13842 } } // namespace v8::internal |
| OLD | NEW |