Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(18)

Side by Side Diff: src/objects.cc

Issue 439243005: Ensure prototypes always stay fast by turning them fast again after an operation that turned them s… (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/objects.h ('k') | src/runtime.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 4049 matching lines...) Expand 10 before | Expand all | Expand 10 after
4060 } 4060 }
4061 4061
4062 4062
4063 void JSObject::ConvertAndSetOwnProperty(LookupResult* lookup, 4063 void JSObject::ConvertAndSetOwnProperty(LookupResult* lookup,
4064 Handle<Name> name, 4064 Handle<Name> name,
4065 Handle<Object> value, 4065 Handle<Object> value,
4066 PropertyAttributes attributes) { 4066 PropertyAttributes attributes) {
4067 Handle<JSObject> object(lookup->holder()); 4067 Handle<JSObject> object(lookup->holder());
4068 if (object->map()->TooManyFastProperties(Object::MAY_BE_STORE_FROM_KEYED)) { 4068 if (object->map()->TooManyFastProperties(Object::MAY_BE_STORE_FROM_KEYED)) {
4069 JSObject::NormalizeProperties(object, CLEAR_INOBJECT_PROPERTIES, 0); 4069 JSObject::NormalizeProperties(object, CLEAR_INOBJECT_PROPERTIES, 0);
4070 } else if (object->map()->is_prototype_map()) {
4071 JSObject::NormalizeProperties(object, KEEP_INOBJECT_PROPERTIES, 0);
4070 } 4072 }
4071 4073
4072 if (!object->HasFastProperties()) { 4074 if (!object->HasFastProperties()) {
4073 ReplaceSlowProperty(object, name, value, attributes); 4075 ReplaceSlowProperty(object, name, value, attributes);
4076 ReoptimizeIfPrototype(object);
4074 return; 4077 return;
4075 } 4078 }
4076 4079
4077 int descriptor_index = lookup->GetDescriptorIndex(); 4080 int descriptor_index = lookup->GetDescriptorIndex();
4078 if (lookup->GetAttributes() == attributes) { 4081 if (lookup->GetAttributes() == attributes) {
4079 JSObject::GeneralizeFieldRepresentation(object, descriptor_index, 4082 JSObject::GeneralizeFieldRepresentation(object, descriptor_index,
4080 Representation::Tagged(), 4083 Representation::Tagged(),
4081 HeapType::Any(lookup->isolate())); 4084 HeapType::Any(lookup->isolate()));
4082 } else { 4085 } else {
4083 Handle<Map> old_map(object->map()); 4086 Handle<Map> old_map(object->map());
(...skipping 1060 matching lines...) Expand 10 before | Expand all | Expand 10 after
5144 5147
5145 SetOwnPropertyIgnoreAttributes(object, isolate->factory()->hidden_string(), 5148 SetOwnPropertyIgnoreAttributes(object, isolate->factory()->hidden_string(),
5146 value, DONT_ENUM, 5149 value, DONT_ENUM,
5147 OMIT_EXTENSIBILITY_CHECK).Assert(); 5150 OMIT_EXTENSIBILITY_CHECK).Assert();
5148 return object; 5151 return object;
5149 } 5152 }
5150 5153
5151 5154
5152 Handle<Object> JSObject::DeletePropertyPostInterceptor(Handle<JSObject> object, 5155 Handle<Object> JSObject::DeletePropertyPostInterceptor(Handle<JSObject> object,
5153 Handle<Name> name, 5156 Handle<Name> name,
5154 DeleteMode mode) { 5157 DeleteMode delete_mode) {
5155 // Check own property, ignore interceptor. 5158 // Check own property, ignore interceptor.
5156 Isolate* isolate = object->GetIsolate(); 5159 Isolate* isolate = object->GetIsolate();
5157 LookupResult result(isolate); 5160 LookupResult lookup(isolate);
5158 object->LookupOwnRealNamedProperty(name, &result); 5161 object->LookupOwnRealNamedProperty(name, &lookup);
5159 if (!result.IsFound()) return isolate->factory()->true_value(); 5162 if (!lookup.IsFound()) return isolate->factory()->true_value();
5160 5163
5164 PropertyNormalizationMode mode = object->map()->is_prototype_map()
5165 ? KEEP_INOBJECT_PROPERTIES
5166 : CLEAR_INOBJECT_PROPERTIES;
5161 // Normalize object if needed. 5167 // Normalize object if needed.
5162 NormalizeProperties(object, CLEAR_INOBJECT_PROPERTIES, 0); 5168 NormalizeProperties(object, mode, 0);
5163 5169
5164 return DeleteNormalizedProperty(object, name, mode); 5170 Handle<Object> result = DeleteNormalizedProperty(object, name, delete_mode);
5171 ReoptimizeIfPrototype(object);
5172 return result;
5165 } 5173 }
5166 5174
5167 5175
5168 MaybeHandle<Object> JSObject::DeletePropertyWithInterceptor( 5176 MaybeHandle<Object> JSObject::DeletePropertyWithInterceptor(
5169 Handle<JSObject> object, Handle<Name> name) { 5177 Handle<JSObject> object, Handle<Name> name) {
5170 Isolate* isolate = object->GetIsolate(); 5178 Isolate* isolate = object->GetIsolate();
5171 5179
5172 // TODO(rossberg): Support symbols in the API. 5180 // TODO(rossberg): Support symbols in the API.
5173 if (name->IsSymbol()) return isolate->factory()->false_value(); 5181 if (name->IsSymbol()) return isolate->factory()->false_value();
5174 5182
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
5301 EnqueueChangeRecord(object, "delete", name, old_value); 5309 EnqueueChangeRecord(object, "delete", name, old_value);
5302 } 5310 }
5303 } 5311 }
5304 5312
5305 return result; 5313 return result;
5306 } 5314 }
5307 5315
5308 5316
5309 MaybeHandle<Object> JSObject::DeleteProperty(Handle<JSObject> object, 5317 MaybeHandle<Object> JSObject::DeleteProperty(Handle<JSObject> object,
5310 Handle<Name> name, 5318 Handle<Name> name,
5311 DeleteMode mode) { 5319 DeleteMode delete_mode) {
5312 Isolate* isolate = object->GetIsolate(); 5320 Isolate* isolate = object->GetIsolate();
5313 // ECMA-262, 3rd, 8.6.2.5 5321 // ECMA-262, 3rd, 8.6.2.5
5314 DCHECK(name->IsName()); 5322 DCHECK(name->IsName());
5315 5323
5316 // Check access rights if needed. 5324 // Check access rights if needed.
5317 if (object->IsAccessCheckNeeded() && 5325 if (object->IsAccessCheckNeeded() &&
5318 !isolate->MayNamedAccess(object, name, v8::ACCESS_DELETE)) { 5326 !isolate->MayNamedAccess(object, name, v8::ACCESS_DELETE)) {
5319 isolate->ReportFailedAccessCheck(object, v8::ACCESS_DELETE); 5327 isolate->ReportFailedAccessCheck(object, v8::ACCESS_DELETE);
5320 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); 5328 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object);
5321 return isolate->factory()->false_value(); 5329 return isolate->factory()->false_value();
5322 } 5330 }
5323 5331
5324 if (object->IsJSGlobalProxy()) { 5332 if (object->IsJSGlobalProxy()) {
5325 PrototypeIterator iter(isolate, object); 5333 PrototypeIterator iter(isolate, object);
5326 if (iter.IsAtEnd()) return isolate->factory()->false_value(); 5334 if (iter.IsAtEnd()) return isolate->factory()->false_value();
5327 DCHECK(PrototypeIterator::GetCurrent(iter)->IsJSGlobalObject()); 5335 DCHECK(PrototypeIterator::GetCurrent(iter)->IsJSGlobalObject());
5328 return JSGlobalObject::DeleteProperty( 5336 return JSGlobalObject::DeleteProperty(
5329 Handle<JSGlobalObject>::cast(PrototypeIterator::GetCurrent(iter)), name, 5337 Handle<JSGlobalObject>::cast(PrototypeIterator::GetCurrent(iter)), name,
5330 mode); 5338 delete_mode);
5331 } 5339 }
5332 5340
5333 uint32_t index = 0; 5341 uint32_t index = 0;
5334 if (name->AsArrayIndex(&index)) { 5342 if (name->AsArrayIndex(&index)) {
5335 return DeleteElement(object, index, mode); 5343 return DeleteElement(object, index, delete_mode);
5336 } 5344 }
5337 5345
5338 LookupResult lookup(isolate); 5346 LookupResult lookup(isolate);
5339 object->LookupOwn(name, &lookup, true); 5347 object->LookupOwn(name, &lookup, true);
5340 if (!lookup.IsFound()) return isolate->factory()->true_value(); 5348 if (!lookup.IsFound()) return isolate->factory()->true_value();
5341 // Ignore attributes if forcing a deletion. 5349 // Ignore attributes if forcing a deletion.
5342 if (lookup.IsDontDelete() && mode != FORCE_DELETION) { 5350 if (lookup.IsDontDelete() && delete_mode != FORCE_DELETION) {
5343 if (mode == STRICT_DELETION) { 5351 if (delete_mode == STRICT_DELETION) {
5344 // Deleting a non-configurable property in strict mode. 5352 // Deleting a non-configurable property in strict mode.
5345 Handle<Object> args[2] = { name, object }; 5353 Handle<Object> args[2] = { name, object };
5346 Handle<Object> error = isolate->factory()->NewTypeError( 5354 Handle<Object> error = isolate->factory()->NewTypeError(
5347 "strict_delete_property", HandleVector(args, ARRAY_SIZE(args))); 5355 "strict_delete_property", HandleVector(args, ARRAY_SIZE(args)));
5348 isolate->Throw(*error); 5356 isolate->Throw(*error);
5349 return Handle<Object>(); 5357 return Handle<Object>();
5350 } 5358 }
5351 return isolate->factory()->false_value(); 5359 return isolate->factory()->false_value();
5352 } 5360 }
5353 5361
5354 Handle<Object> old_value = isolate->factory()->the_hole_value(); 5362 Handle<Object> old_value = isolate->factory()->the_hole_value();
5355 bool is_observed = object->map()->is_observed() && 5363 bool is_observed = object->map()->is_observed() &&
5356 *name != isolate->heap()->hidden_string(); 5364 *name != isolate->heap()->hidden_string();
5357 if (is_observed && lookup.IsDataProperty()) { 5365 if (is_observed && lookup.IsDataProperty()) {
5358 old_value = Object::GetPropertyOrElement(object, name).ToHandleChecked(); 5366 old_value = Object::GetPropertyOrElement(object, name).ToHandleChecked();
5359 } 5367 }
5360 Handle<Object> result; 5368 Handle<Object> result;
5361 5369
5362 // Check for interceptor. 5370 // Check for interceptor.
5363 if (lookup.IsInterceptor()) { 5371 if (lookup.IsInterceptor()) {
5364 // Skip interceptor if forcing a deletion. 5372 // Skip interceptor if forcing a deletion.
5365 if (mode == FORCE_DELETION) { 5373 if (delete_mode == FORCE_DELETION) {
5366 result = DeletePropertyPostInterceptor(object, name, mode); 5374 result = DeletePropertyPostInterceptor(object, name, delete_mode);
5367 } else { 5375 } else {
5368 ASSIGN_RETURN_ON_EXCEPTION( 5376 ASSIGN_RETURN_ON_EXCEPTION(
5369 isolate, result, 5377 isolate, result,
5370 DeletePropertyWithInterceptor(object, name), 5378 DeletePropertyWithInterceptor(object, name),
5371 Object); 5379 Object);
5372 } 5380 }
5373 } else { 5381 } else {
5382 PropertyNormalizationMode mode = object->map()->is_prototype_map()
5383 ? KEEP_INOBJECT_PROPERTIES
5384 : CLEAR_INOBJECT_PROPERTIES;
5374 // Normalize object if needed. 5385 // Normalize object if needed.
5375 NormalizeProperties(object, CLEAR_INOBJECT_PROPERTIES, 0); 5386 NormalizeProperties(object, mode, 0);
5376 // Make sure the properties are normalized before removing the entry. 5387 // Make sure the properties are normalized before removing the entry.
5377 result = DeleteNormalizedProperty(object, name, mode); 5388 result = DeleteNormalizedProperty(object, name, delete_mode);
5389 ReoptimizeIfPrototype(object);
5378 } 5390 }
5379 5391
5380 if (is_observed) { 5392 if (is_observed) {
5381 Maybe<bool> maybe = HasOwnProperty(object, name); 5393 Maybe<bool> maybe = HasOwnProperty(object, name);
5382 if (!maybe.has_value) return MaybeHandle<Object>(); 5394 if (!maybe.has_value) return MaybeHandle<Object>();
5383 if (!maybe.value) { 5395 if (!maybe.value) {
5384 EnqueueChangeRecord(object, "delete", name, old_value); 5396 EnqueueChangeRecord(object, "delete", name, old_value);
5385 } 5397 }
5386 } 5398 }
5387 5399
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after
5689 Handle<Map> transition_map(old_map->GetTransition(transition_index)); 5701 Handle<Map> transition_map(old_map->GetTransition(transition_index));
5690 DCHECK(transition_map->has_dictionary_elements()); 5702 DCHECK(transition_map->has_dictionary_elements());
5691 DCHECK(transition_map->is_frozen()); 5703 DCHECK(transition_map->is_frozen());
5692 DCHECK(!transition_map->is_extensible()); 5704 DCHECK(!transition_map->is_extensible());
5693 JSObject::MigrateToMap(object, transition_map); 5705 JSObject::MigrateToMap(object, transition_map);
5694 } else if (object->HasFastProperties() && old_map->CanHaveMoreTransitions()) { 5706 } else if (object->HasFastProperties() && old_map->CanHaveMoreTransitions()) {
5695 // Create a new descriptor array with fully-frozen properties 5707 // Create a new descriptor array with fully-frozen properties
5696 Handle<Map> new_map = Map::CopyForFreeze(old_map); 5708 Handle<Map> new_map = Map::CopyForFreeze(old_map);
5697 JSObject::MigrateToMap(object, new_map); 5709 JSObject::MigrateToMap(object, new_map);
5698 } else { 5710 } else {
5711 DCHECK(old_map->is_dictionary_map() || !old_map->is_prototype_map());
5699 // Slow path: need to normalize properties for safety 5712 // Slow path: need to normalize properties for safety
5700 NormalizeProperties(object, CLEAR_INOBJECT_PROPERTIES, 0); 5713 NormalizeProperties(object, CLEAR_INOBJECT_PROPERTIES, 0);
5701 5714
5702 // Create a new map, since other objects with this map may be extensible. 5715 // Create a new map, since other objects with this map may be extensible.
5703 // TODO(adamk): Extend the NormalizedMapCache to handle non-extensible maps. 5716 // TODO(adamk): Extend the NormalizedMapCache to handle non-extensible maps.
5704 Handle<Map> new_map = Map::Copy(handle(object->map())); 5717 Handle<Map> new_map = Map::Copy(handle(object->map()));
5705 new_map->freeze(); 5718 new_map->freeze();
5706 new_map->set_is_extensible(false); 5719 new_map->set_is_extensible(false);
5707 new_map->set_elements_kind(DICTIONARY_ELEMENTS); 5720 new_map->set_elements_kind(DICTIONARY_ELEMENTS);
5708 JSObject::MigrateToMap(object, new_map); 5721 JSObject::MigrateToMap(object, new_map);
(...skipping 878 matching lines...) Expand 10 before | Expand all | Expand 10 after
6587 heap->ClearAllICsByKind(Code::KEYED_STORE_IC); 6600 heap->ClearAllICsByKind(Code::KEYED_STORE_IC);
6588 } 6601 }
6589 } 6602 }
6590 } 6603 }
6591 6604
6592 6605
6593 void JSObject::SetPropertyCallback(Handle<JSObject> object, 6606 void JSObject::SetPropertyCallback(Handle<JSObject> object,
6594 Handle<Name> name, 6607 Handle<Name> name,
6595 Handle<Object> structure, 6608 Handle<Object> structure,
6596 PropertyAttributes attributes) { 6609 PropertyAttributes attributes) {
6610 PropertyNormalizationMode mode = object->map()->is_prototype_map()
6611 ? KEEP_INOBJECT_PROPERTIES
6612 : CLEAR_INOBJECT_PROPERTIES;
6597 // Normalize object to make this operation simple. 6613 // Normalize object to make this operation simple.
6598 NormalizeProperties(object, CLEAR_INOBJECT_PROPERTIES, 0); 6614 NormalizeProperties(object, mode, 0);
6599 6615
6600 // For the global object allocate a new map to invalidate the global inline 6616 // For the global object allocate a new map to invalidate the global inline
6601 // caches which have a global property cell reference directly in the code. 6617 // caches which have a global property cell reference directly in the code.
6602 if (object->IsGlobalObject()) { 6618 if (object->IsGlobalObject()) {
6603 Handle<Map> new_map = Map::CopyDropDescriptors(handle(object->map())); 6619 Handle<Map> new_map = Map::CopyDropDescriptors(handle(object->map()));
6604 DCHECK(new_map->is_dictionary_map()); 6620 DCHECK(new_map->is_dictionary_map());
6605 JSObject::MigrateToMap(object, new_map); 6621 JSObject::MigrateToMap(object, new_map);
6606 6622
6607 // When running crankshaft, changing the map is not enough. We 6623 // When running crankshaft, changing the map is not enough. We
6608 // need to deoptimize all functions that rely on this global 6624 // need to deoptimize all functions that rely on this global
6609 // object. 6625 // object.
6610 Deoptimizer::DeoptimizeGlobalObject(*object); 6626 Deoptimizer::DeoptimizeGlobalObject(*object);
6611 } 6627 }
6612 6628
6613 // Update the dictionary with the new CALLBACKS property. 6629 // Update the dictionary with the new CALLBACKS property.
6614 PropertyDetails details = PropertyDetails(attributes, CALLBACKS, 0); 6630 PropertyDetails details = PropertyDetails(attributes, CALLBACKS, 0);
6615 SetNormalizedProperty(object, name, structure, details); 6631 SetNormalizedProperty(object, name, structure, details);
6632
6633 ReoptimizeIfPrototype(object);
6616 } 6634 }
6617 6635
6618 6636
6619 MaybeHandle<Object> JSObject::DefineAccessor(Handle<JSObject> object, 6637 MaybeHandle<Object> JSObject::DefineAccessor(Handle<JSObject> object,
6620 Handle<Name> name, 6638 Handle<Name> name,
6621 Handle<Object> getter, 6639 Handle<Object> getter,
6622 Handle<Object> setter, 6640 Handle<Object> setter,
6623 PropertyAttributes attributes) { 6641 PropertyAttributes attributes) {
6624 Isolate* isolate = object->GetIsolate(); 6642 Isolate* isolate = object->GetIsolate();
6625 // Check access rights if needed. 6643 // Check access rights if needed.
(...skipping 3337 matching lines...) Expand 10 before | Expand all | Expand 10 after
9963 if (object->IsGlobalObject()) return; 9981 if (object->IsGlobalObject()) return;
9964 9982
9965 // Make sure prototypes are fast objects and their maps have the bit set 9983 // Make sure prototypes are fast objects and their maps have the bit set
9966 // so they remain fast. 9984 // so they remain fast.
9967 if (!object->HasFastProperties()) { 9985 if (!object->HasFastProperties()) {
9968 MigrateSlowToFast(object, 0); 9986 MigrateSlowToFast(object, 0);
9969 } 9987 }
9970 } 9988 }
9971 9989
9972 9990
9991 void JSObject::ReoptimizeIfPrototype(Handle<JSObject> object) {
9992 if (!object->map()->is_prototype_map()) return;
9993 OptimizeAsPrototype(object);
9994 }
9995
9996
9973 Handle<Object> CacheInitialJSArrayMaps( 9997 Handle<Object> CacheInitialJSArrayMaps(
9974 Handle<Context> native_context, Handle<Map> initial_map) { 9998 Handle<Context> native_context, Handle<Map> initial_map) {
9975 // Replace all of the cached initial array maps in the native context with 9999 // Replace all of the cached initial array maps in the native context with
9976 // the appropriate transitioned elements kind maps. 10000 // the appropriate transitioned elements kind maps.
9977 Factory* factory = native_context->GetIsolate()->factory(); 10001 Factory* factory = native_context->GetIsolate()->factory();
9978 Handle<FixedArray> maps = factory->NewFixedArrayWithHoles( 10002 Handle<FixedArray> maps = factory->NewFixedArrayWithHoles(
9979 kElementsKindCount, TENURED); 10003 kElementsKindCount, TENURED);
9980 10004
9981 Handle<Map> current_map = initial_map; 10005 Handle<Map> current_map = initial_map;
9982 ElementsKind kind = current_map->elements_kind(); 10006 ElementsKind kind = current_map->elements_kind();
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
10125 instance_type = JS_OBJECT_TYPE; 10149 instance_type = JS_OBJECT_TYPE;
10126 instance_size = function->shared()->CalculateInstanceSize(); 10150 instance_size = function->shared()->CalculateInstanceSize();
10127 in_object_properties = function->shared()->CalculateInObjectProperties(); 10151 in_object_properties = function->shared()->CalculateInObjectProperties();
10128 } 10152 }
10129 Handle<Map> map = isolate->factory()->NewMap(instance_type, instance_size); 10153 Handle<Map> map = isolate->factory()->NewMap(instance_type, instance_size);
10130 10154
10131 // Fetch or allocate prototype. 10155 // Fetch or allocate prototype.
10132 Handle<Object> prototype; 10156 Handle<Object> prototype;
10133 if (function->has_instance_prototype()) { 10157 if (function->has_instance_prototype()) {
10134 prototype = handle(function->instance_prototype(), isolate); 10158 prototype = handle(function->instance_prototype(), isolate);
10135 // TODO(verwaest): Remove once "delete" keeps objects marked as prototypes
10136 // fast as well.
10137 JSObject::OptimizeAsPrototype(Handle<JSObject>::cast(prototype));
10138 } else { 10159 } else {
10139 prototype = isolate->factory()->NewFunctionPrototype(function); 10160 prototype = isolate->factory()->NewFunctionPrototype(function);
10140 } 10161 }
10141 map->set_inobject_properties(in_object_properties); 10162 map->set_inobject_properties(in_object_properties);
10142 map->set_unused_property_fields(in_object_properties); 10163 map->set_unused_property_fields(in_object_properties);
10143 map->set_prototype(*prototype); 10164 map->set_prototype(*prototype);
10144 DCHECK(map->has_fast_object_elements()); 10165 DCHECK(map->has_fast_object_elements());
10145 10166
10146 // Finally link initial map and constructor function. 10167 // Finally link initial map and constructor function.
10147 function->set_initial_map(*map); 10168 function->set_initial_map(*map);
(...skipping 6876 matching lines...) Expand 10 before | Expand all | Expand 10 after
17024 #define ERROR_MESSAGES_TEXTS(C, T) T, 17045 #define ERROR_MESSAGES_TEXTS(C, T) T,
17025 static const char* error_messages_[] = { 17046 static const char* error_messages_[] = {
17026 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) 17047 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS)
17027 }; 17048 };
17028 #undef ERROR_MESSAGES_TEXTS 17049 #undef ERROR_MESSAGES_TEXTS
17029 return error_messages_[reason]; 17050 return error_messages_[reason];
17030 } 17051 }
17031 17052
17032 17053
17033 } } // namespace v8::internal 17054 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/objects.h ('k') | src/runtime.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698