| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 2119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2130 } else { | 2130 } else { |
| 2131 // Normalize the object to prevent very large instance descriptors. | 2131 // Normalize the object to prevent very large instance descriptors. |
| 2132 // This eliminates unwanted N^2 allocation and lookup behavior. | 2132 // This eliminates unwanted N^2 allocation and lookup behavior. |
| 2133 NormalizeProperties(object, CLEAR_INOBJECT_PROPERTIES, 0); | 2133 NormalizeProperties(object, CLEAR_INOBJECT_PROPERTIES, 0); |
| 2134 AddSlowProperty(object, name, value, attributes); | 2134 AddSlowProperty(object, name, value, attributes); |
| 2135 } | 2135 } |
| 2136 } else { | 2136 } else { |
| 2137 AddSlowProperty(object, name, value, attributes); | 2137 AddSlowProperty(object, name, value, attributes); |
| 2138 } | 2138 } |
| 2139 | 2139 |
| 2140 if (FLAG_harmony_observation && object->map()->is_observed()) { | 2140 if (FLAG_harmony_observation && |
| 2141 object->map()->is_observed() && |
| 2142 *name != isolate->heap()->hidden_string()) { |
| 2141 Handle<Object> old_value = isolate->factory()->the_hole_value(); | 2143 Handle<Object> old_value = isolate->factory()->the_hole_value(); |
| 2142 EnqueueChangeRecord(object, "new", name, old_value); | 2144 EnqueueChangeRecord(object, "new", name, old_value); |
| 2143 } | 2145 } |
| 2144 | 2146 |
| 2145 return value; | 2147 return value; |
| 2146 } | 2148 } |
| 2147 | 2149 |
| 2148 | 2150 |
| 2149 void JSObject::EnqueueChangeRecord(Handle<JSObject> object, | 2151 void JSObject::EnqueueChangeRecord(Handle<JSObject> object, |
| 2150 const char* type_str, | 2152 const char* type_str, |
| (...skipping 1857 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4008 Handle<Object> error = isolate->factory()->NewTypeError( | 4010 Handle<Object> error = isolate->factory()->NewTypeError( |
| 4009 "strict_read_only_property", HandleVector(args, ARRAY_SIZE(args))); | 4011 "strict_read_only_property", HandleVector(args, ARRAY_SIZE(args))); |
| 4010 isolate->Throw(*error); | 4012 isolate->Throw(*error); |
| 4011 return Handle<Object>(); | 4013 return Handle<Object>(); |
| 4012 } else { | 4014 } else { |
| 4013 return value; | 4015 return value; |
| 4014 } | 4016 } |
| 4015 } | 4017 } |
| 4016 | 4018 |
| 4017 Handle<Object> old_value = isolate->factory()->the_hole_value(); | 4019 Handle<Object> old_value = isolate->factory()->the_hole_value(); |
| 4018 if (FLAG_harmony_observation && | 4020 bool is_observed = FLAG_harmony_observation && |
| 4019 object->map()->is_observed() && lookup->IsDataProperty()) { | 4021 object->map()->is_observed() && |
| 4022 *name != isolate->heap()->hidden_string(); |
| 4023 if (is_observed && lookup->IsDataProperty()) { |
| 4020 old_value = Object::GetProperty(object, name); | 4024 old_value = Object::GetProperty(object, name); |
| 4021 } | 4025 } |
| 4022 | 4026 |
| 4023 // This is a real property that is not read-only, or it is a | 4027 // This is a real property that is not read-only, or it is a |
| 4024 // transition or null descriptor and there are no setters in the prototypes. | 4028 // transition or null descriptor and there are no setters in the prototypes. |
| 4025 Handle<Object> result = value; | 4029 Handle<Object> result = value; |
| 4026 switch (lookup->type()) { | 4030 switch (lookup->type()) { |
| 4027 case NORMAL: | 4031 case NORMAL: |
| 4028 SetNormalizedProperty(handle(lookup->holder()), lookup, value); | 4032 SetNormalizedProperty(handle(lookup->holder()), lookup, value); |
| 4029 break; | 4033 break; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 4048 result = SetPropertyUsingTransition(handle(lookup->holder()), lookup, | 4052 result = SetPropertyUsingTransition(handle(lookup->holder()), lookup, |
| 4049 name, value, attributes); | 4053 name, value, attributes); |
| 4050 break; | 4054 break; |
| 4051 case HANDLER: | 4055 case HANDLER: |
| 4052 case NONEXISTENT: | 4056 case NONEXISTENT: |
| 4053 UNREACHABLE(); | 4057 UNREACHABLE(); |
| 4054 } | 4058 } |
| 4055 | 4059 |
| 4056 RETURN_IF_EMPTY_HANDLE_VALUE(isolate, result, Handle<Object>()); | 4060 RETURN_IF_EMPTY_HANDLE_VALUE(isolate, result, Handle<Object>()); |
| 4057 | 4061 |
| 4058 if (FLAG_harmony_observation && object->map()->is_observed()) { | 4062 if (is_observed) { |
| 4059 if (lookup->IsTransition()) { | 4063 if (lookup->IsTransition()) { |
| 4060 EnqueueChangeRecord(object, "new", name, old_value); | 4064 EnqueueChangeRecord(object, "new", name, old_value); |
| 4061 } else { | 4065 } else { |
| 4062 LookupResult new_lookup(isolate); | 4066 LookupResult new_lookup(isolate); |
| 4063 object->LocalLookup(*name, &new_lookup, true); | 4067 object->LocalLookup(*name, &new_lookup, true); |
| 4064 if (new_lookup.IsDataProperty()) { | 4068 if (new_lookup.IsDataProperty()) { |
| 4065 Handle<Object> new_value = Object::GetProperty(object, name); | 4069 Handle<Object> new_value = Object::GetProperty(object, name); |
| 4066 if (!new_value->SameValue(*old_value)) { | 4070 if (!new_value->SameValue(*old_value)) { |
| 4067 EnqueueChangeRecord(object, "updated", name, old_value); | 4071 EnqueueChangeRecord(object, "updated", name, old_value); |
| 4068 } | 4072 } |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4149 | 4153 |
| 4150 // Check for accessor in prototype chain removed here in clone. | 4154 // Check for accessor in prototype chain removed here in clone. |
| 4151 if (!lookup.IsFound()) { | 4155 if (!lookup.IsFound()) { |
| 4152 // Neither properties nor transitions found. | 4156 // Neither properties nor transitions found. |
| 4153 return AddProperty(object, name, value, attributes, kNonStrictMode, | 4157 return AddProperty(object, name, value, attributes, kNonStrictMode, |
| 4154 MAY_BE_STORE_FROM_KEYED, extensibility_check, value_type, mode); | 4158 MAY_BE_STORE_FROM_KEYED, extensibility_check, value_type, mode); |
| 4155 } | 4159 } |
| 4156 | 4160 |
| 4157 Handle<Object> old_value = isolate->factory()->the_hole_value(); | 4161 Handle<Object> old_value = isolate->factory()->the_hole_value(); |
| 4158 PropertyAttributes old_attributes = ABSENT; | 4162 PropertyAttributes old_attributes = ABSENT; |
| 4159 bool is_observed = FLAG_harmony_observation && object->map()->is_observed(); | 4163 bool is_observed = FLAG_harmony_observation && |
| 4164 object->map()->is_observed() && |
| 4165 *name != isolate->heap()->hidden_string(); |
| 4160 if (is_observed && lookup.IsProperty()) { | 4166 if (is_observed && lookup.IsProperty()) { |
| 4161 if (lookup.IsDataProperty()) old_value = | 4167 if (lookup.IsDataProperty()) old_value = |
| 4162 Object::GetProperty(object, name); | 4168 Object::GetProperty(object, name); |
| 4163 old_attributes = lookup.GetAttributes(); | 4169 old_attributes = lookup.GetAttributes(); |
| 4164 } | 4170 } |
| 4165 | 4171 |
| 4166 // Check of IsReadOnly removed from here in clone. | 4172 // Check of IsReadOnly removed from here in clone. |
| 4167 switch (lookup.type()) { | 4173 switch (lookup.type()) { |
| 4168 case NORMAL: | 4174 case NORMAL: |
| 4169 ReplaceSlowProperty(object, name, value, attributes); | 4175 ReplaceSlowProperty(object, name, value, attributes); |
| (...skipping 1043 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5213 Handle<Object> args[2] = { name, object }; | 5219 Handle<Object> args[2] = { name, object }; |
| 5214 Handle<Object> error = isolate->factory()->NewTypeError( | 5220 Handle<Object> error = isolate->factory()->NewTypeError( |
| 5215 "strict_delete_property", HandleVector(args, ARRAY_SIZE(args))); | 5221 "strict_delete_property", HandleVector(args, ARRAY_SIZE(args))); |
| 5216 isolate->Throw(*error); | 5222 isolate->Throw(*error); |
| 5217 return Handle<Object>(); | 5223 return Handle<Object>(); |
| 5218 } | 5224 } |
| 5219 return isolate->factory()->false_value(); | 5225 return isolate->factory()->false_value(); |
| 5220 } | 5226 } |
| 5221 | 5227 |
| 5222 Handle<Object> old_value = isolate->factory()->the_hole_value(); | 5228 Handle<Object> old_value = isolate->factory()->the_hole_value(); |
| 5223 bool is_observed = FLAG_harmony_observation && object->map()->is_observed(); | 5229 bool is_observed = FLAG_harmony_observation && |
| 5230 object->map()->is_observed() && |
| 5231 *name != isolate->heap()->hidden_string(); |
| 5224 if (is_observed && lookup.IsDataProperty()) { | 5232 if (is_observed && lookup.IsDataProperty()) { |
| 5225 old_value = Object::GetProperty(object, name); | 5233 old_value = Object::GetProperty(object, name); |
| 5226 } | 5234 } |
| 5227 Handle<Object> result; | 5235 Handle<Object> result; |
| 5228 | 5236 |
| 5229 // Check for interceptor. | 5237 // Check for interceptor. |
| 5230 if (lookup.IsInterceptor()) { | 5238 if (lookup.IsInterceptor()) { |
| 5231 // Skip interceptor if forcing a deletion. | 5239 // Skip interceptor if forcing a deletion. |
| 5232 if (mode == FORCE_DELETION) { | 5240 if (mode == FORCE_DELETION) { |
| 5233 result = DeletePropertyPostInterceptor(object, name, mode); | 5241 result = DeletePropertyPostInterceptor(object, name, mode); |
| (...skipping 1051 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6285 | 6293 |
| 6286 // Try to flatten before operating on the string. | 6294 // Try to flatten before operating on the string. |
| 6287 if (name->IsString()) String::cast(*name)->TryFlatten(); | 6295 if (name->IsString()) String::cast(*name)->TryFlatten(); |
| 6288 | 6296 |
| 6289 if (!object->CanSetCallback(*name)) return; | 6297 if (!object->CanSetCallback(*name)) return; |
| 6290 | 6298 |
| 6291 uint32_t index = 0; | 6299 uint32_t index = 0; |
| 6292 bool is_element = name->AsArrayIndex(&index); | 6300 bool is_element = name->AsArrayIndex(&index); |
| 6293 | 6301 |
| 6294 Handle<Object> old_value = isolate->factory()->the_hole_value(); | 6302 Handle<Object> old_value = isolate->factory()->the_hole_value(); |
| 6295 bool is_observed = FLAG_harmony_observation && object->map()->is_observed(); | 6303 bool is_observed = FLAG_harmony_observation && |
| 6304 object->map()->is_observed() && |
| 6305 *name != isolate->heap()->hidden_string(); |
| 6296 bool preexists = false; | 6306 bool preexists = false; |
| 6297 if (is_observed) { | 6307 if (is_observed) { |
| 6298 if (is_element) { | 6308 if (is_element) { |
| 6299 preexists = HasLocalElement(object, index); | 6309 preexists = HasLocalElement(object, index); |
| 6300 if (preexists && object->GetLocalElementAccessorPair(index) == NULL) { | 6310 if (preexists && object->GetLocalElementAccessorPair(index) == NULL) { |
| 6301 old_value = Object::GetElement(isolate, object, index); | 6311 old_value = Object::GetElement(isolate, object, index); |
| 6302 } | 6312 } |
| 6303 } else { | 6313 } else { |
| 6304 LookupResult lookup(isolate); | 6314 LookupResult lookup(isolate); |
| 6305 object->LocalLookup(*name, &lookup, true); | 6315 object->LocalLookup(*name, &lookup, true); |
| (...skipping 10058 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 16364 #define ERROR_MESSAGES_TEXTS(C, T) T, | 16374 #define ERROR_MESSAGES_TEXTS(C, T) T, |
| 16365 static const char* error_messages_[] = { | 16375 static const char* error_messages_[] = { |
| 16366 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) | 16376 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) |
| 16367 }; | 16377 }; |
| 16368 #undef ERROR_MESSAGES_TEXTS | 16378 #undef ERROR_MESSAGES_TEXTS |
| 16369 return error_messages_[reason]; | 16379 return error_messages_[reason]; |
| 16370 } | 16380 } |
| 16371 | 16381 |
| 16372 | 16382 |
| 16373 } } // namespace v8::internal | 16383 } } // namespace v8::internal |
| OLD | NEW |