| OLD | NEW | 
|---|
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "src/v8.h" | 5 #include "src/v8.h" | 
| 6 | 6 | 
| 7 #include "src/accessors.h" | 7 #include "src/accessors.h" | 
| 8 #include "src/allocation-site-scopes.h" | 8 #include "src/allocation-site-scopes.h" | 
| 9 #include "src/api.h" | 9 #include "src/api.h" | 
| 10 #include "src/arguments.h" | 10 #include "src/arguments.h" | 
| (...skipping 1816 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1827   ConstantDescriptor new_constant_desc(name, constant, attributes); | 1827   ConstantDescriptor new_constant_desc(name, constant, attributes); | 
| 1828   return Map::CopyAddDescriptor(map, &new_constant_desc, flag); | 1828   return Map::CopyAddDescriptor(map, &new_constant_desc, flag); | 
| 1829 } | 1829 } | 
| 1830 | 1830 | 
| 1831 | 1831 | 
| 1832 void JSObject::AddFastProperty(Handle<JSObject> object, | 1832 void JSObject::AddFastProperty(Handle<JSObject> object, | 
| 1833                                Handle<Name> name, | 1833                                Handle<Name> name, | 
| 1834                                Handle<Object> value, | 1834                                Handle<Object> value, | 
| 1835                                PropertyAttributes attributes, | 1835                                PropertyAttributes attributes, | 
| 1836                                StoreFromKeyed store_mode, | 1836                                StoreFromKeyed store_mode, | 
|  | 1837                                ValueType value_type, | 
| 1837                                TransitionFlag flag) { | 1838                                TransitionFlag flag) { | 
| 1838   ASSERT(!object->IsJSGlobalProxy()); | 1839   ASSERT(!object->IsJSGlobalProxy()); | 
| 1839 | 1840 | 
| 1840   MaybeHandle<Map> maybe_map; | 1841   MaybeHandle<Map> maybe_map; | 
| 1841   if (value->IsJSFunction()) { | 1842   if (value->IsJSFunction()) { | 
| 1842     maybe_map = Map::CopyWithConstant( | 1843     maybe_map = Map::CopyWithConstant( | 
| 1843         handle(object->map()), name, value, attributes, flag); | 1844         handle(object->map()), name, value, attributes, flag); | 
| 1844   } else if (!object->TooManyFastProperties(store_mode)) { | 1845   } else if (!object->TooManyFastProperties(store_mode)) { | 
| 1845     Isolate* isolate = object->GetIsolate(); | 1846     Isolate* isolate = object->GetIsolate(); | 
| 1846     Representation representation = value->OptimalRepresentation(); | 1847     Representation representation = value->OptimalRepresentation(value_type); | 
| 1847     maybe_map = Map::CopyWithField( | 1848     maybe_map = Map::CopyWithField( | 
| 1848         handle(object->map(), isolate), name, | 1849         handle(object->map(), isolate), name, | 
| 1849         value->OptimalType(isolate, representation), | 1850         value->OptimalType(isolate, representation), | 
| 1850         attributes, representation, flag); | 1851         attributes, representation, flag); | 
| 1851   } | 1852   } | 
| 1852 | 1853 | 
| 1853   Handle<Map> new_map; | 1854   Handle<Map> new_map; | 
| 1854   if (!maybe_map.ToHandle(&new_map)) { | 1855   if (!maybe_map.ToHandle(&new_map)) { | 
| 1855     NormalizeProperties(object, CLEAR_INOBJECT_PROPERTIES, 0); | 1856     NormalizeProperties(object, CLEAR_INOBJECT_PROPERTIES, 0); | 
| 1856     return; | 1857     return; | 
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1893 | 1894 | 
| 1894 | 1895 | 
| 1895 MaybeHandle<Object> JSObject::AddPropertyInternal( | 1896 MaybeHandle<Object> JSObject::AddPropertyInternal( | 
| 1896     Handle<JSObject> object, | 1897     Handle<JSObject> object, | 
| 1897     Handle<Name> name, | 1898     Handle<Name> name, | 
| 1898     Handle<Object> value, | 1899     Handle<Object> value, | 
| 1899     PropertyAttributes attributes, | 1900     PropertyAttributes attributes, | 
| 1900     StrictMode strict_mode, | 1901     StrictMode strict_mode, | 
| 1901     JSReceiver::StoreFromKeyed store_mode, | 1902     JSReceiver::StoreFromKeyed store_mode, | 
| 1902     ExtensibilityCheck extensibility_check, | 1903     ExtensibilityCheck extensibility_check, | 
|  | 1904     ValueType value_type, | 
| 1903     StoreMode mode, | 1905     StoreMode mode, | 
| 1904     TransitionFlag transition_flag) { | 1906     TransitionFlag transition_flag) { | 
| 1905   ASSERT(!object->IsJSGlobalProxy()); | 1907   ASSERT(!object->IsJSGlobalProxy()); | 
| 1906   Isolate* isolate = object->GetIsolate(); | 1908   Isolate* isolate = object->GetIsolate(); | 
| 1907 | 1909 | 
| 1908   if (!name->IsUniqueName()) { | 1910   if (!name->IsUniqueName()) { | 
| 1909     name = isolate->factory()->InternalizeString( | 1911     name = isolate->factory()->InternalizeString( | 
| 1910         Handle<String>::cast(name)); | 1912         Handle<String>::cast(name)); | 
| 1911   } | 1913   } | 
| 1912 | 1914 | 
| 1913   if (extensibility_check == PERFORM_EXTENSIBILITY_CHECK && | 1915   if (extensibility_check == PERFORM_EXTENSIBILITY_CHECK && | 
| 1914       !object->map()->is_extensible()) { | 1916       !object->map()->is_extensible()) { | 
| 1915     if (strict_mode == SLOPPY) { | 1917     if (strict_mode == SLOPPY) { | 
| 1916       return value; | 1918       return value; | 
| 1917     } else { | 1919     } else { | 
| 1918       Handle<Object> args[1] = { name }; | 1920       Handle<Object> args[1] = { name }; | 
| 1919       Handle<Object> error = isolate->factory()->NewTypeError( | 1921       Handle<Object> error = isolate->factory()->NewTypeError( | 
| 1920           "object_not_extensible", HandleVector(args, ARRAY_SIZE(args))); | 1922           "object_not_extensible", HandleVector(args, ARRAY_SIZE(args))); | 
| 1921       return isolate->Throw<Object>(error); | 1923       return isolate->Throw<Object>(error); | 
| 1922     } | 1924     } | 
| 1923   } | 1925   } | 
| 1924 | 1926 | 
| 1925   if (object->HasFastProperties()) { | 1927   if (object->HasFastProperties()) { | 
| 1926     AddFastProperty(object, name, value, attributes, store_mode, | 1928     AddFastProperty(object, name, value, attributes, store_mode, | 
| 1927                     transition_flag); | 1929                     value_type, transition_flag); | 
| 1928   } | 1930   } | 
| 1929 | 1931 | 
| 1930   if (!object->HasFastProperties()) { | 1932   if (!object->HasFastProperties()) { | 
| 1931     AddSlowProperty(object, name, value, attributes); | 1933     AddSlowProperty(object, name, value, attributes); | 
| 1932   } | 1934   } | 
| 1933 | 1935 | 
| 1934   if (object->map()->is_observed() && | 1936   if (object->map()->is_observed() && | 
| 1935       *name != isolate->heap()->hidden_string()) { | 1937       *name != isolate->heap()->hidden_string()) { | 
| 1936     Handle<Object> old_value = isolate->factory()->the_hole_value(); | 1938     Handle<Object> old_value = isolate->factory()->the_hole_value(); | 
| 1937     EnqueueChangeRecord(object, "add", name, old_value); | 1939     EnqueueChangeRecord(object, "add", name, old_value); | 
| (...skipping 2029 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3967   Handle<DescriptorArray> descriptors(transition_map->instance_descriptors()); | 3969   Handle<DescriptorArray> descriptors(transition_map->instance_descriptors()); | 
| 3968   PropertyDetails details = descriptors->GetDetails(descriptor); | 3970   PropertyDetails details = descriptors->GetDetails(descriptor); | 
| 3969 | 3971 | 
| 3970   if (details.type() == CALLBACKS || attributes != details.attributes()) { | 3972   if (details.type() == CALLBACKS || attributes != details.attributes()) { | 
| 3971     // AddPropertyInternal will either normalize the object, or create a new | 3973     // AddPropertyInternal will either normalize the object, or create a new | 
| 3972     // fast copy of the map. If we get a fast copy of the map, all field | 3974     // fast copy of the map. If we get a fast copy of the map, all field | 
| 3973     // representations will be tagged since the transition is omitted. | 3975     // representations will be tagged since the transition is omitted. | 
| 3974     return JSObject::AddPropertyInternal( | 3976     return JSObject::AddPropertyInternal( | 
| 3975         object, name, value, attributes, SLOPPY, | 3977         object, name, value, attributes, SLOPPY, | 
| 3976         JSReceiver::CERTAINLY_NOT_STORE_FROM_KEYED, | 3978         JSReceiver::CERTAINLY_NOT_STORE_FROM_KEYED, | 
| 3977         JSReceiver::OMIT_EXTENSIBILITY_CHECK, FORCE_FIELD, OMIT_TRANSITION); | 3979         JSReceiver::OMIT_EXTENSIBILITY_CHECK, | 
|  | 3980         JSObject::FORCE_TAGGED, FORCE_FIELD, OMIT_TRANSITION); | 
| 3978   } | 3981   } | 
| 3979 | 3982 | 
| 3980   // Keep the target CONSTANT if the same value is stored. | 3983   // Keep the target CONSTANT if the same value is stored. | 
| 3981   // TODO(verwaest): Also support keeping the placeholder | 3984   // TODO(verwaest): Also support keeping the placeholder | 
| 3982   // (value->IsUninitialized) as constant. | 3985   // (value->IsUninitialized) as constant. | 
| 3983   if (!lookup->CanHoldValue(value)) { | 3986   if (!lookup->CanHoldValue(value)) { | 
| 3984     Representation field_representation = value->OptimalRepresentation(); | 3987     Representation field_representation = value->OptimalRepresentation(); | 
| 3985     Handle<HeapType> field_type = value->OptimalType( | 3988     Handle<HeapType> field_type = value->OptimalType( | 
| 3986         lookup->isolate(), field_representation); | 3989         lookup->isolate(), field_representation); | 
| 3987     transition_map = Map::GeneralizeRepresentation( | 3990     transition_map = Map::GeneralizeRepresentation( | 
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 4213 | 4216 | 
| 4214   return result; | 4217   return result; | 
| 4215 } | 4218 } | 
| 4216 | 4219 | 
| 4217 | 4220 | 
| 4218 void JSObject::AddProperty( | 4221 void JSObject::AddProperty( | 
| 4219     Handle<JSObject> object, | 4222     Handle<JSObject> object, | 
| 4220     Handle<Name> name, | 4223     Handle<Name> name, | 
| 4221     Handle<Object> value, | 4224     Handle<Object> value, | 
| 4222     PropertyAttributes attributes, | 4225     PropertyAttributes attributes, | 
|  | 4226     ValueType value_type, | 
| 4223     StoreMode store_mode) { | 4227     StoreMode store_mode) { | 
| 4224 #ifdef DEBUG | 4228 #ifdef DEBUG | 
| 4225   uint32_t index; | 4229   uint32_t index; | 
| 4226   ASSERT(!object->IsJSProxy()); | 4230   ASSERT(!object->IsJSProxy()); | 
| 4227   ASSERT(!name->AsArrayIndex(&index)); | 4231   ASSERT(!name->AsArrayIndex(&index)); | 
| 4228   LookupIterator it(object, name, LookupIterator::CHECK_OWN_REAL); | 4232   LookupIterator it(object, name, LookupIterator::CHECK_OWN_REAL); | 
| 4229   GetPropertyAttributes(&it); | 4233   GetPropertyAttributes(&it); | 
| 4230   ASSERT(!it.IsFound()); | 4234   ASSERT(!it.IsFound()); | 
| 4231   ASSERT(object->map()->is_extensible()); | 4235   ASSERT(object->map()->is_extensible()); | 
| 4232 #endif | 4236 #endif | 
| 4233   SetOwnPropertyIgnoreAttributes(object, name, value, attributes, store_mode, | 4237   SetOwnPropertyIgnoreAttributes( | 
| 4234                                  OMIT_EXTENSIBILITY_CHECK).Check(); | 4238       object, name, value, attributes, value_type, store_mode, | 
|  | 4239       OMIT_EXTENSIBILITY_CHECK).Check(); | 
| 4235 } | 4240 } | 
| 4236 | 4241 | 
| 4237 | 4242 | 
| 4238 // Set a real own property, even if it is READ_ONLY.  If the property is not | 4243 // Set a real own property, even if it is READ_ONLY.  If the property is not | 
| 4239 // present, add it with attributes NONE.  This code is an exact clone of | 4244 // present, add it with attributes NONE.  This code is an exact clone of | 
| 4240 // SetProperty, with the check for IsReadOnly and the check for a | 4245 // SetProperty, with the check for IsReadOnly and the check for a | 
| 4241 // callback setter removed.  The two lines looking up the LookupResult | 4246 // callback setter removed.  The two lines looking up the LookupResult | 
| 4242 // result are also added.  If one of the functions is changed, the other | 4247 // result are also added.  If one of the functions is changed, the other | 
| 4243 // should be. | 4248 // should be. | 
| 4244 MaybeHandle<Object> JSObject::SetOwnPropertyIgnoreAttributes( | 4249 MaybeHandle<Object> JSObject::SetOwnPropertyIgnoreAttributes( | 
| 4245     Handle<JSObject> object, | 4250     Handle<JSObject> object, | 
| 4246     Handle<Name> name, | 4251     Handle<Name> name, | 
| 4247     Handle<Object> value, | 4252     Handle<Object> value, | 
| 4248     PropertyAttributes attributes, | 4253     PropertyAttributes attributes, | 
|  | 4254     ValueType value_type, | 
| 4249     StoreMode mode, | 4255     StoreMode mode, | 
| 4250     ExtensibilityCheck extensibility_check, | 4256     ExtensibilityCheck extensibility_check, | 
| 4251     StoreFromKeyed store_from_keyed, | 4257     StoreFromKeyed store_from_keyed, | 
| 4252     ExecutableAccessorInfoHandling handling) { | 4258     ExecutableAccessorInfoHandling handling) { | 
| 4253   Isolate* isolate = object->GetIsolate(); | 4259   Isolate* isolate = object->GetIsolate(); | 
| 4254 | 4260 | 
| 4255   // Make sure that the top context does not change when doing callbacks or | 4261   // Make sure that the top context does not change when doing callbacks or | 
| 4256   // interceptor calls. | 4262   // interceptor calls. | 
| 4257   AssertNoContextChange ncc(isolate); | 4263   AssertNoContextChange ncc(isolate); | 
| 4258 | 4264 | 
| 4259   LookupResult lookup(isolate); | 4265   LookupResult lookup(isolate); | 
| 4260   object->LookupOwn(name, &lookup, true); | 4266   object->LookupOwn(name, &lookup, true); | 
| 4261   if (!lookup.IsFound()) { | 4267   if (!lookup.IsFound()) { | 
| 4262     object->map()->LookupTransition(*object, *name, &lookup); | 4268     object->map()->LookupTransition(*object, *name, &lookup); | 
| 4263   } | 4269   } | 
| 4264 | 4270 | 
| 4265   // Check access rights if needed. | 4271   // Check access rights if needed. | 
| 4266   if (object->IsAccessCheckNeeded()) { | 4272   if (object->IsAccessCheckNeeded()) { | 
| 4267     if (!isolate->MayNamedAccess(object, name, v8::ACCESS_SET)) { | 4273     if (!isolate->MayNamedAccess(object, name, v8::ACCESS_SET)) { | 
| 4268       return SetPropertyWithFailedAccessCheck(object, &lookup, name, value, | 4274       return SetPropertyWithFailedAccessCheck(object, &lookup, name, value, | 
| 4269                                               false, SLOPPY); | 4275                                               false, SLOPPY); | 
| 4270     } | 4276     } | 
| 4271   } | 4277   } | 
| 4272 | 4278 | 
| 4273   if (object->IsJSGlobalProxy()) { | 4279   if (object->IsJSGlobalProxy()) { | 
| 4274     Handle<Object> proto(object->GetPrototype(), isolate); | 4280     Handle<Object> proto(object->GetPrototype(), isolate); | 
| 4275     if (proto->IsNull()) return value; | 4281     if (proto->IsNull()) return value; | 
| 4276     ASSERT(proto->IsJSGlobalObject()); | 4282     ASSERT(proto->IsJSGlobalObject()); | 
| 4277     return SetOwnPropertyIgnoreAttributes(Handle<JSObject>::cast(proto), name, | 4283     return SetOwnPropertyIgnoreAttributes(Handle<JSObject>::cast(proto), | 
| 4278                                           value, attributes, mode, | 4284         name, value, attributes, value_type, mode, extensibility_check); | 
| 4279                                           extensibility_check); |  | 
| 4280   } | 4285   } | 
| 4281 | 4286 | 
| 4282   if (lookup.IsInterceptor() || | 4287   if (lookup.IsInterceptor() || | 
| 4283       (lookup.IsDescriptorOrDictionary() && lookup.type() == CALLBACKS)) { | 4288       (lookup.IsDescriptorOrDictionary() && lookup.type() == CALLBACKS)) { | 
| 4284     object->LookupOwnRealNamedProperty(name, &lookup); | 4289     object->LookupOwnRealNamedProperty(name, &lookup); | 
| 4285   } | 4290   } | 
| 4286 | 4291 | 
| 4287   // Check for accessor in prototype chain removed here in clone. | 4292   // Check for accessor in prototype chain removed here in clone. | 
| 4288   if (!lookup.IsFound()) { | 4293   if (!lookup.IsFound()) { | 
| 4289     object->map()->LookupTransition(*object, *name, &lookup); | 4294     object->map()->LookupTransition(*object, *name, &lookup); | 
| 4290     TransitionFlag flag = lookup.IsFound() | 4295     TransitionFlag flag = lookup.IsFound() | 
| 4291         ? OMIT_TRANSITION : INSERT_TRANSITION; | 4296         ? OMIT_TRANSITION : INSERT_TRANSITION; | 
| 4292     // Neither properties nor transitions found. | 4297     // Neither properties nor transitions found. | 
| 4293     return AddPropertyInternal(object, name, value, attributes, SLOPPY, | 4298     return AddPropertyInternal(object, name, value, attributes, SLOPPY, | 
| 4294                                store_from_keyed, extensibility_check, mode, | 4299         store_from_keyed, extensibility_check, value_type, mode, flag); | 
| 4295                                flag); |  | 
| 4296   } | 4300   } | 
| 4297 | 4301 | 
| 4298   Handle<Object> old_value = isolate->factory()->the_hole_value(); | 4302   Handle<Object> old_value = isolate->factory()->the_hole_value(); | 
| 4299   PropertyAttributes old_attributes = ABSENT; | 4303   PropertyAttributes old_attributes = ABSENT; | 
| 4300   bool is_observed = object->map()->is_observed() && | 4304   bool is_observed = object->map()->is_observed() && | 
| 4301                      *name != isolate->heap()->hidden_string(); | 4305                      *name != isolate->heap()->hidden_string(); | 
| 4302   if (is_observed && lookup.IsProperty()) { | 4306   if (is_observed && lookup.IsProperty()) { | 
| 4303     if (lookup.IsDataProperty()) { | 4307     if (lookup.IsDataProperty()) { | 
| 4304       old_value = Object::GetPropertyOrElement(object, name).ToHandleChecked(); | 4308       old_value = Object::GetPropertyOrElement(object, name).ToHandleChecked(); | 
| 4305     } | 4309     } | 
| (...skipping 943 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5249     if (descriptors->number_of_descriptors() > 0) { | 5253     if (descriptors->number_of_descriptors() > 0) { | 
| 5250       int sorted_index = descriptors->GetSortedKeyIndex(0); | 5254       int sorted_index = descriptors->GetSortedKeyIndex(0); | 
| 5251       if (descriptors->GetKey(sorted_index) == isolate->heap()->hidden_string() | 5255       if (descriptors->GetKey(sorted_index) == isolate->heap()->hidden_string() | 
| 5252           && sorted_index < object->map()->NumberOfOwnDescriptors()) { | 5256           && sorted_index < object->map()->NumberOfOwnDescriptors()) { | 
| 5253         object->WriteToField(sorted_index, *value); | 5257         object->WriteToField(sorted_index, *value); | 
| 5254         return object; | 5258         return object; | 
| 5255       } | 5259       } | 
| 5256     } | 5260     } | 
| 5257   } | 5261   } | 
| 5258 | 5262 | 
| 5259   SetOwnPropertyIgnoreAttributes(object, isolate->factory()->hidden_string(), | 5263   SetOwnPropertyIgnoreAttributes(object, | 
| 5260                                  value, DONT_ENUM, ALLOW_AS_CONSTANT, | 5264                                  isolate->factory()->hidden_string(), | 
|  | 5265                                  value, | 
|  | 5266                                  DONT_ENUM, | 
|  | 5267                                  OPTIMAL_REPRESENTATION, | 
|  | 5268                                  ALLOW_AS_CONSTANT, | 
| 5261                                  OMIT_EXTENSIBILITY_CHECK).Assert(); | 5269                                  OMIT_EXTENSIBILITY_CHECK).Assert(); | 
| 5262   return object; | 5270   return object; | 
| 5263 } | 5271 } | 
| 5264 | 5272 | 
| 5265 | 5273 | 
| 5266 Handle<Object> JSObject::DeletePropertyPostInterceptor(Handle<JSObject> object, | 5274 Handle<Object> JSObject::DeletePropertyPostInterceptor(Handle<JSObject> object, | 
| 5267                                                        Handle<Name> name, | 5275                                                        Handle<Name> name, | 
| 5268                                                        DeleteMode mode) { | 5276                                                        DeleteMode mode) { | 
| 5269   // Check own property, ignore interceptor. | 5277   // Check own property, ignore interceptor. | 
| 5270   Isolate* isolate = object->GetIsolate(); | 5278   Isolate* isolate = object->GetIsolate(); | 
| (...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5595       kind = arguments->IsDictionary() ? DICTIONARY_ELEMENTS : | 5603       kind = arguments->IsDictionary() ? DICTIONARY_ELEMENTS : | 
| 5596           FAST_HOLEY_ELEMENTS; | 5604           FAST_HOLEY_ELEMENTS; | 
| 5597       if (ReferencesObjectFromElements(arguments, kind, obj)) return true; | 5605       if (ReferencesObjectFromElements(arguments, kind, obj)) return true; | 
| 5598       break; | 5606       break; | 
| 5599     } | 5607     } | 
| 5600   } | 5608   } | 
| 5601 | 5609 | 
| 5602   // For functions check the context. | 5610   // For functions check the context. | 
| 5603   if (IsJSFunction()) { | 5611   if (IsJSFunction()) { | 
| 5604     // Get the constructor function for arguments array. | 5612     // Get the constructor function for arguments array. | 
| 5605     Map* arguments_map = | 5613     JSObject* arguments_boilerplate = | 
| 5606         heap->isolate()->context()->native_context()->sloppy_arguments_map(); | 5614         heap->isolate()->context()->native_context()-> | 
|  | 5615             sloppy_arguments_boilerplate(); | 
| 5607     JSFunction* arguments_function = | 5616     JSFunction* arguments_function = | 
| 5608         JSFunction::cast(arguments_map->constructor()); | 5617         JSFunction::cast(arguments_boilerplate->map()->constructor()); | 
| 5609 | 5618 | 
| 5610     // Get the context and don't check if it is the native context. | 5619     // Get the context and don't check if it is the native context. | 
| 5611     JSFunction* f = JSFunction::cast(this); | 5620     JSFunction* f = JSFunction::cast(this); | 
| 5612     Context* context = f->context(); | 5621     Context* context = f->context(); | 
| 5613     if (context->IsNativeContext()) { | 5622     if (context->IsNativeContext()) { | 
| 5614       return false; | 5623       return false; | 
| 5615     } | 5624     } | 
| 5616 | 5625 | 
| 5617     // Check the non-special context slots. | 5626     // Check the non-special context slots. | 
| 5618     for (int i = Context::MIN_CONTEXT_SLOTS; i < context->length(); i++) { | 5627     for (int i = Context::MIN_CONTEXT_SLOTS; i < context->length(); i++) { | 
| (...skipping 271 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5890   const bool copying_; | 5899   const bool copying_; | 
| 5891   const JSObject::DeepCopyHints hints_; | 5900   const JSObject::DeepCopyHints hints_; | 
| 5892 }; | 5901 }; | 
| 5893 | 5902 | 
| 5894 | 5903 | 
| 5895 template <class ContextObject> | 5904 template <class ContextObject> | 
| 5896 MaybeHandle<JSObject> JSObjectWalkVisitor<ContextObject>::StructureWalk( | 5905 MaybeHandle<JSObject> JSObjectWalkVisitor<ContextObject>::StructureWalk( | 
| 5897     Handle<JSObject> object) { | 5906     Handle<JSObject> object) { | 
| 5898   Isolate* isolate = this->isolate(); | 5907   Isolate* isolate = this->isolate(); | 
| 5899   bool copying = this->copying(); | 5908   bool copying = this->copying(); | 
| 5900   bool shallow = hints_ == JSObject::kObjectIsShallow; | 5909   bool shallow = hints_ == JSObject::kObjectIsShallowArray; | 
| 5901 | 5910 | 
| 5902   if (!shallow) { | 5911   if (!shallow) { | 
| 5903     StackLimitCheck check(isolate); | 5912     StackLimitCheck check(isolate); | 
| 5904 | 5913 | 
| 5905     if (check.HasOverflowed()) { | 5914     if (check.HasOverflowed()) { | 
| 5906       isolate->StackOverflow(); | 5915       isolate->StackOverflow(); | 
| 5907       return MaybeHandle<JSObject>(); | 5916       return MaybeHandle<JSObject>(); | 
| 5908     } | 5917     } | 
| 5909   } | 5918   } | 
| 5910 | 5919 | 
| (...skipping 466 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 6377     return storage; | 6386     return storage; | 
| 6378   } | 6387   } | 
| 6379 } | 6388 } | 
| 6380 | 6389 | 
| 6381 | 6390 | 
| 6382 MaybeHandle<FixedArray> JSReceiver::GetKeys(Handle<JSReceiver> object, | 6391 MaybeHandle<FixedArray> JSReceiver::GetKeys(Handle<JSReceiver> object, | 
| 6383                                             KeyCollectionType type) { | 6392                                             KeyCollectionType type) { | 
| 6384   USE(ContainsOnlyValidKeys); | 6393   USE(ContainsOnlyValidKeys); | 
| 6385   Isolate* isolate = object->GetIsolate(); | 6394   Isolate* isolate = object->GetIsolate(); | 
| 6386   Handle<FixedArray> content = isolate->factory()->empty_fixed_array(); | 6395   Handle<FixedArray> content = isolate->factory()->empty_fixed_array(); | 
| 6387   Handle<JSFunction> arguments_function( | 6396   Handle<JSObject> arguments_boilerplate = Handle<JSObject>( | 
| 6388       JSFunction::cast(isolate->sloppy_arguments_map()->constructor())); | 6397       isolate->context()->native_context()->sloppy_arguments_boilerplate(), | 
|  | 6398       isolate); | 
|  | 6399   Handle<JSFunction> arguments_function = Handle<JSFunction>( | 
|  | 6400       JSFunction::cast(arguments_boilerplate->map()->constructor()), | 
|  | 6401       isolate); | 
| 6389 | 6402 | 
| 6390   // Only collect keys if access is permitted. | 6403   // Only collect keys if access is permitted. | 
| 6391   for (Handle<Object> p = object; | 6404   for (Handle<Object> p = object; | 
| 6392        *p != isolate->heap()->null_value(); | 6405        *p != isolate->heap()->null_value(); | 
| 6393        p = Handle<Object>(p->GetPrototype(isolate), isolate)) { | 6406        p = Handle<Object>(p->GetPrototype(isolate), isolate)) { | 
| 6394     if (p->IsJSProxy()) { | 6407     if (p->IsJSProxy()) { | 
| 6395       Handle<JSProxy> proxy(JSProxy::cast(*p), isolate); | 6408       Handle<JSProxy> proxy(JSProxy::cast(*p), isolate); | 
| 6396       Handle<Object> args[] = { proxy }; | 6409       Handle<Object> args[] = { proxy }; | 
| 6397       Handle<Object> names; | 6410       Handle<Object> names; | 
| 6398       ASSIGN_RETURN_ON_EXCEPTION( | 6411       ASSIGN_RETURN_ON_EXCEPTION( | 
| (...skipping 10606 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 17005 #define ERROR_MESSAGES_TEXTS(C, T) T, | 17018 #define ERROR_MESSAGES_TEXTS(C, T) T, | 
| 17006   static const char* error_messages_[] = { | 17019   static const char* error_messages_[] = { | 
| 17007       ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) | 17020       ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) | 
| 17008   }; | 17021   }; | 
| 17009 #undef ERROR_MESSAGES_TEXTS | 17022 #undef ERROR_MESSAGES_TEXTS | 
| 17010   return error_messages_[reason]; | 17023   return error_messages_[reason]; | 
| 17011 } | 17024 } | 
| 17012 | 17025 | 
| 17013 | 17026 | 
| 17014 } }  // namespace v8::internal | 17027 } }  // namespace v8::internal | 
| OLD | NEW | 
|---|