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 1247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2991 case HANDLER: | 2992 case HANDLER: |
2992 case NONEXISTENT: | 2993 case NONEXISTENT: |
2993 UNREACHABLE(); | 2994 UNREACHABLE(); |
2994 } | 2995 } |
2995 | 2996 |
2996 Handle<Object> hresult; | 2997 Handle<Object> hresult; |
2997 if (!result->ToHandle(&hresult)) return result; | 2998 if (!result->ToHandle(&hresult)) return result; |
2998 | 2999 |
2999 if (FLAG_harmony_observation && map()->is_observed()) { | 3000 if (FLAG_harmony_observation && map()->is_observed()) { |
3000 if (lookup->IsTransition()) { | 3001 if (lookup->IsTransition()) { |
3001 self->EnqueueChangeRecord("new", name, old_value); | 3002 EnqueueChangeRecord(self, "new", name, old_value); |
3002 } else { | 3003 } else { |
3003 LookupResult new_lookup(self->GetIsolate()); | 3004 LookupResult new_lookup(self->GetIsolate()); |
3004 self->LocalLookup(*name, &new_lookup); | 3005 self->LocalLookup(*name, &new_lookup); |
3005 ASSERT(!new_lookup.GetLazyValue()->IsTheHole()); | 3006 ASSERT(!new_lookup.GetLazyValue()->IsTheHole()); |
3006 if (!new_lookup.GetLazyValue()->SameValue(*old_value)) { | 3007 if (!new_lookup.GetLazyValue()->SameValue(*old_value)) { |
3007 self->EnqueueChangeRecord("updated", name, old_value); | 3008 EnqueueChangeRecord(self, "updated", name, old_value); |
3008 } | 3009 } |
3009 } | 3010 } |
3010 } | 3011 } |
3011 | 3012 |
3012 return *hresult; | 3013 return *hresult; |
3013 } | 3014 } |
3014 | 3015 |
3015 | 3016 |
3016 // Set a real local property, even if it is READ_ONLY. If the property is not | 3017 // Set a real local property, even if it is READ_ONLY. If the property is not |
3017 // present, add it with attributes NONE. This code is an exact clone of | 3018 // 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... |
3139 case HANDLER: | 3140 case HANDLER: |
3140 case NONEXISTENT: | 3141 case NONEXISTENT: |
3141 UNREACHABLE(); | 3142 UNREACHABLE(); |
3142 } | 3143 } |
3143 | 3144 |
3144 Handle<Object> hresult; | 3145 Handle<Object> hresult; |
3145 if (!result->ToHandle(&hresult)) return result; | 3146 if (!result->ToHandle(&hresult)) return result; |
3146 | 3147 |
3147 if (FLAG_harmony_observation && map()->is_observed()) { | 3148 if (FLAG_harmony_observation && map()->is_observed()) { |
3148 if (lookup.IsTransition()) { | 3149 if (lookup.IsTransition()) { |
3149 self->EnqueueChangeRecord("new", name, old_value); | 3150 EnqueueChangeRecord(self, "new", name, old_value); |
3150 } else { | 3151 } else { |
3151 LookupResult new_lookup(isolate); | 3152 LookupResult new_lookup(isolate); |
3152 self->LocalLookup(*name, &new_lookup); | 3153 self->LocalLookup(*name, &new_lookup); |
3153 ASSERT(!new_lookup.GetLazyValue()->IsTheHole()); | 3154 ASSERT(!new_lookup.GetLazyValue()->IsTheHole()); |
3154 if (old_value->IsTheHole() || | 3155 if (old_value->IsTheHole() || |
3155 new_lookup.GetAttributes() != old_attributes) { | 3156 new_lookup.GetAttributes() != old_attributes) { |
3156 self->EnqueueChangeRecord("reconfigured", name, old_value); | 3157 EnqueueChangeRecord(self, "reconfigured", name, old_value); |
3157 } else if (!new_lookup.GetLazyValue()->SameValue(*old_value)) { | 3158 } else if (!new_lookup.GetLazyValue()->SameValue(*old_value)) { |
3158 self->EnqueueChangeRecord("updated", name, old_value); | 3159 EnqueueChangeRecord(self, "updated", name, old_value); |
3159 } | 3160 } |
3160 } | 3161 } |
3161 } | 3162 } |
3162 | 3163 |
3163 return *hresult; | 3164 return *hresult; |
3164 } | 3165 } |
3165 | 3166 |
3166 | 3167 |
3167 PropertyAttributes JSObject::GetPropertyAttributePostInterceptor( | 3168 PropertyAttributes JSObject::GetPropertyAttributePostInterceptor( |
3168 JSObject* receiver, | 3169 JSObject* receiver, |
(...skipping 976 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4145 result = self->DeleteElementWithInterceptor(index); | 4146 result = self->DeleteElementWithInterceptor(index); |
4146 } else { | 4147 } else { |
4147 result = self->GetElementsAccessor()->Delete(*self, index, mode); | 4148 result = self->GetElementsAccessor()->Delete(*self, index, mode); |
4148 } | 4149 } |
4149 | 4150 |
4150 Handle<Object> hresult; | 4151 Handle<Object> hresult; |
4151 if (!result->ToHandle(&hresult)) return result; | 4152 if (!result->ToHandle(&hresult)) return result; |
4152 | 4153 |
4153 if (FLAG_harmony_observation && map()->is_observed()) { | 4154 if (FLAG_harmony_observation && map()->is_observed()) { |
4154 if (preexists && !self->HasLocalElement(index)) | 4155 if (preexists && !self->HasLocalElement(index)) |
4155 self->EnqueueChangeRecord("deleted", name, old_value); | 4156 EnqueueChangeRecord(self, "deleted", name, old_value); |
4156 } | 4157 } |
4157 | 4158 |
4158 return *hresult; | 4159 return *hresult; |
4159 } | 4160 } |
4160 | 4161 |
4161 | 4162 |
4162 Handle<Object> JSObject::DeleteProperty(Handle<JSObject> obj, | 4163 Handle<Object> JSObject::DeleteProperty(Handle<JSObject> obj, |
4163 Handle<String> prop) { | 4164 Handle<String> prop) { |
4164 CALL_HEAP_FUNCTION(obj->GetIsolate(), | 4165 CALL_HEAP_FUNCTION(obj->GetIsolate(), |
4165 obj->DeleteProperty(*prop, JSObject::NORMAL_DELETION), | 4166 obj->DeleteProperty(*prop, JSObject::NORMAL_DELETION), |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4232 if (!result->To(&obj)) return result; | 4233 if (!result->To(&obj)) return result; |
4233 // Make sure the properties are normalized before removing the entry. | 4234 // Make sure the properties are normalized before removing the entry. |
4234 result = self->DeleteNormalizedProperty(*hname, mode); | 4235 result = self->DeleteNormalizedProperty(*hname, mode); |
4235 } | 4236 } |
4236 | 4237 |
4237 Handle<Object> hresult; | 4238 Handle<Object> hresult; |
4238 if (!result->ToHandle(&hresult)) return result; | 4239 if (!result->ToHandle(&hresult)) return result; |
4239 | 4240 |
4240 if (FLAG_harmony_observation && map()->is_observed()) { | 4241 if (FLAG_harmony_observation && map()->is_observed()) { |
4241 if (!self->HasLocalProperty(*hname)) | 4242 if (!self->HasLocalProperty(*hname)) |
4242 self->EnqueueChangeRecord("deleted", hname, old_value); | 4243 EnqueueChangeRecord(self, "deleted", hname, old_value); |
4243 } | 4244 } |
4244 | 4245 |
4245 return *hresult; | 4246 return *hresult; |
4246 } | 4247 } |
4247 | 4248 |
4248 | 4249 |
4249 MaybeObject* JSReceiver::DeleteElement(uint32_t index, DeleteMode mode) { | 4250 MaybeObject* JSReceiver::DeleteElement(uint32_t index, DeleteMode mode) { |
4250 if (IsJSProxy()) { | 4251 if (IsJSProxy()) { |
4251 return JSProxy::cast(this)->DeleteElementWithHandler(index, mode); | 4252 return JSProxy::cast(this)->DeleteElementWithHandler(index, mode); |
4252 } | 4253 } |
(...skipping 646 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4899 | 4900 |
4900 MaybeObject* result = is_element ? | 4901 MaybeObject* result = is_element ? |
4901 self->DefineElementAccessor(index, *getter, *setter, attributes) : | 4902 self->DefineElementAccessor(index, *getter, *setter, attributes) : |
4902 self->DefinePropertyAccessor(*name, *getter, *setter, attributes); | 4903 self->DefinePropertyAccessor(*name, *getter, *setter, attributes); |
4903 | 4904 |
4904 Handle<Object> hresult; | 4905 Handle<Object> hresult; |
4905 if (!result->ToHandle(&hresult)) return result; | 4906 if (!result->ToHandle(&hresult)) return result; |
4906 | 4907 |
4907 if (FLAG_harmony_observation && map()->is_observed()) { | 4908 if (FLAG_harmony_observation && map()->is_observed()) { |
4908 const char* type = preexists ? "reconfigured" : "new"; | 4909 const char* type = preexists ? "reconfigured" : "new"; |
4909 self->EnqueueChangeRecord(type, name, old_value); | 4910 EnqueueChangeRecord(self, type, name, old_value); |
4910 } | 4911 } |
4911 | 4912 |
4912 return *hresult; | 4913 return *hresult; |
4913 } | 4914 } |
4914 | 4915 |
4915 | 4916 |
4916 static MaybeObject* TryAccessorTransition(JSObject* self, | 4917 static MaybeObject* TryAccessorTransition(JSObject* self, |
4917 Map* transitioned_map, | 4918 Map* transitioned_map, |
4918 int target_descriptor, | 4919 int target_descriptor, |
4919 AccessorComponent component, | 4920 AccessorComponent component, |
(...skipping 5404 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10324 index, *value, attributes, strict_mode, check_prototype, set_mode) | 10325 index, *value, attributes, strict_mode, check_prototype, set_mode) |
10325 : self->SetElementWithoutInterceptor( | 10326 : self->SetElementWithoutInterceptor( |
10326 index, *value, attributes, strict_mode, check_prototype, set_mode); | 10327 index, *value, attributes, strict_mode, check_prototype, set_mode); |
10327 | 10328 |
10328 Handle<Object> hresult; | 10329 Handle<Object> hresult; |
10329 if (!result->ToHandle(&hresult)) return result; | 10330 if (!result->ToHandle(&hresult)) return result; |
10330 | 10331 |
10331 if (FLAG_harmony_observation && map()->is_observed()) { | 10332 if (FLAG_harmony_observation && map()->is_observed()) { |
10332 PropertyAttributes new_attributes = self->GetLocalPropertyAttribute(*name); | 10333 PropertyAttributes new_attributes = self->GetLocalPropertyAttribute(*name); |
10333 if (!preexists) { | 10334 if (!preexists) { |
10334 self->EnqueueChangeRecord("new", name, old_value); | 10335 EnqueueChangeRecord(self, "new", name, old_value); |
10335 } else if (new_attributes != old_attributes || old_value->IsTheHole()) { | 10336 } else if (new_attributes != old_attributes || old_value->IsTheHole()) { |
10336 self->EnqueueChangeRecord("reconfigured", name, old_value); | 10337 EnqueueChangeRecord(self, "reconfigured", name, old_value); |
10337 } else { | 10338 } else { |
10338 Handle<Object> newValue = Object::GetElement(self, index); | 10339 Handle<Object> newValue = Object::GetElement(self, index); |
10339 if (!newValue->SameValue(*old_value)) | 10340 if (!newValue->SameValue(*old_value)) |
10340 self->EnqueueChangeRecord("updated", name, old_value); | 10341 EnqueueChangeRecord(self, "updated", name, old_value); |
10341 } | 10342 } |
10342 } | 10343 } |
10343 | 10344 |
10344 return *hresult; | 10345 return *hresult; |
10345 } | 10346 } |
10346 | 10347 |
10347 | 10348 |
10348 MaybeObject* JSObject::SetElementWithoutInterceptor(uint32_t index, | 10349 MaybeObject* JSObject::SetElementWithoutInterceptor(uint32_t index, |
10349 Object* value, | 10350 Object* value, |
10350 PropertyAttributes attr, | 10351 PropertyAttributes attr, |
(...skipping 3495 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13846 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); | 13847 set_year(Smi::FromInt(year), SKIP_WRITE_BARRIER); |
13847 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); | 13848 set_month(Smi::FromInt(month), SKIP_WRITE_BARRIER); |
13848 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); | 13849 set_day(Smi::FromInt(day), SKIP_WRITE_BARRIER); |
13849 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); | 13850 set_weekday(Smi::FromInt(weekday), SKIP_WRITE_BARRIER); |
13850 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); | 13851 set_hour(Smi::FromInt(hour), SKIP_WRITE_BARRIER); |
13851 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); | 13852 set_min(Smi::FromInt(min), SKIP_WRITE_BARRIER); |
13852 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); | 13853 set_sec(Smi::FromInt(sec), SKIP_WRITE_BARRIER); |
13853 } | 13854 } |
13854 | 13855 |
13855 } } // namespace v8::internal | 13856 } } // namespace v8::internal |
OLD | NEW |