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

Side by Side Diff: src/ic/ic.cc

Issue 2028983002: Introduce IsUndefined(Isolate*) and IsTheHole(Isolate*) (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: rebase master Created 4 years, 6 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
« no previous file with comments | « src/ic/ia32/handler-compiler-ia32.cc ('k') | src/ic/ic-state.h » ('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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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/ic/ic.h" 5 #include "src/ic/ic.h"
6 6
7 #include "src/accessors.h" 7 #include "src/accessors.h"
8 #include "src/api.h" 8 #include "src/api.h"
9 #include "src/api-arguments.h" 9 #include "src/api-arguments.h"
10 #include "src/arguments.h" 10 #include "src/arguments.h"
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
228 for (; it->IsFound(); it->Next()) { 228 for (; it->IsFound(); it->Next()) {
229 switch (it->state()) { 229 switch (it->state()) {
230 case LookupIterator::NOT_FOUND: 230 case LookupIterator::NOT_FOUND:
231 case LookupIterator::TRANSITION: 231 case LookupIterator::TRANSITION:
232 UNREACHABLE(); 232 UNREACHABLE();
233 case LookupIterator::JSPROXY: 233 case LookupIterator::JSPROXY:
234 return; 234 return;
235 case LookupIterator::INTERCEPTOR: { 235 case LookupIterator::INTERCEPTOR: {
236 // If there is a getter, return; otherwise loop to perform the lookup. 236 // If there is a getter, return; otherwise loop to perform the lookup.
237 Handle<JSObject> holder = it->GetHolder<JSObject>(); 237 Handle<JSObject> holder = it->GetHolder<JSObject>();
238 if (!holder->GetNamedInterceptor()->getter()->IsUndefined()) { 238 if (!holder->GetNamedInterceptor()->getter()->IsUndefined(
239 it->isolate())) {
239 return; 240 return;
240 } 241 }
241 break; 242 break;
242 } 243 }
243 case LookupIterator::ACCESS_CHECK: 244 case LookupIterator::ACCESS_CHECK:
244 // PropertyHandlerCompiler::CheckPrototypes() knows how to emit 245 // PropertyHandlerCompiler::CheckPrototypes() knows how to emit
245 // access checks for global proxies. 246 // access checks for global proxies.
246 if (it->GetHolder<JSObject>()->IsJSGlobalProxy() && it->HasAccess()) { 247 if (it->GetHolder<JSObject>()->IsJSGlobalProxy() && it->HasAccess()) {
247 break; 248 break;
248 } 249 }
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
297 } 298 }
298 299
299 return true; 300 return true;
300 } 301 }
301 302
302 303
303 void IC::UpdateState(Handle<Object> receiver, Handle<Object> name) { 304 void IC::UpdateState(Handle<Object> receiver, Handle<Object> name) {
304 update_receiver_map(receiver); 305 update_receiver_map(receiver);
305 if (!name->IsString()) return; 306 if (!name->IsString()) return;
306 if (state() != MONOMORPHIC && state() != POLYMORPHIC) return; 307 if (state() != MONOMORPHIC && state() != POLYMORPHIC) return;
307 if (receiver->IsUndefined() || receiver->IsNull()) return; 308 if (receiver->IsUndefined(isolate()) || receiver->IsNull()) return;
308 309
309 // Remove the target from the code cache if it became invalid 310 // Remove the target from the code cache if it became invalid
310 // because of changes in the prototype chain to avoid hitting it 311 // because of changes in the prototype chain to avoid hitting it
311 // again. 312 // again.
312 if (ShouldRecomputeHandler(receiver, Handle<String>::cast(name))) { 313 if (ShouldRecomputeHandler(receiver, Handle<String>::cast(name))) {
313 MarkRecomputeHandler(name); 314 MarkRecomputeHandler(name);
314 } 315 }
315 } 316 }
316 317
317 318
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after
581 nexus->ConfigurePolymorphic(maps, transitioned_maps, handlers); 582 nexus->ConfigurePolymorphic(maps, transitioned_maps, handlers);
582 583
583 vector_set_ = true; 584 vector_set_ = true;
584 OnTypeFeedbackChanged(isolate(), get_host()); 585 OnTypeFeedbackChanged(isolate(), get_host());
585 } 586 }
586 587
587 588
588 MaybeHandle<Object> LoadIC::Load(Handle<Object> object, Handle<Name> name) { 589 MaybeHandle<Object> LoadIC::Load(Handle<Object> object, Handle<Name> name) {
589 // If the object is undefined or null it's illegal to try to get any 590 // If the object is undefined or null it's illegal to try to get any
590 // of its properties; throw a TypeError in that case. 591 // of its properties; throw a TypeError in that case.
591 if (object->IsUndefined() || object->IsNull()) { 592 if (object->IsUndefined(isolate()) || object->IsNull()) {
592 return TypeError(MessageTemplate::kNonObjectPropertyLoad, object, name); 593 return TypeError(MessageTemplate::kNonObjectPropertyLoad, object, name);
593 } 594 }
594 595
595 // Check if the name is trivially convertible to an index and get 596 // Check if the name is trivially convertible to an index and get
596 // the element or char if so. 597 // the element or char if so.
597 uint32_t index; 598 uint32_t index;
598 if (kind() == Code::KEYED_LOAD_IC && name->AsArrayIndex(&index)) { 599 if (kind() == Code::KEYED_LOAD_IC && name->AsArrayIndex(&index)) {
599 // Rewrite to the generic keyed load stub. 600 // Rewrite to the generic keyed load stub.
600 if (FLAG_use_ic) { 601 if (FLAG_use_ic) {
601 DCHECK(UseVector()); 602 DCHECK(UseVector());
(...skipping 16 matching lines...) Expand all
618 Handle<JSGlobalObject> global = Handle<JSGlobalObject>::cast(object); 619 Handle<JSGlobalObject> global = Handle<JSGlobalObject>::cast(object);
619 Handle<ScriptContextTable> script_contexts( 620 Handle<ScriptContextTable> script_contexts(
620 global->native_context()->script_context_table()); 621 global->native_context()->script_context_table());
621 622
622 ScriptContextTable::LookupResult lookup_result; 623 ScriptContextTable::LookupResult lookup_result;
623 if (ScriptContextTable::Lookup(script_contexts, str_name, &lookup_result)) { 624 if (ScriptContextTable::Lookup(script_contexts, str_name, &lookup_result)) {
624 Handle<Object> result = 625 Handle<Object> result =
625 FixedArray::get(*ScriptContextTable::GetContext( 626 FixedArray::get(*ScriptContextTable::GetContext(
626 script_contexts, lookup_result.context_index), 627 script_contexts, lookup_result.context_index),
627 lookup_result.slot_index, isolate()); 628 lookup_result.slot_index, isolate());
628 if (*result == *isolate()->factory()->the_hole_value()) { 629 if (result->IsTheHole(isolate())) {
629 // Do not install stubs and stay pre-monomorphic for 630 // Do not install stubs and stay pre-monomorphic for
630 // uninitialized accesses. 631 // uninitialized accesses.
631 return ReferenceError(name); 632 return ReferenceError(name);
632 } 633 }
633 634
634 if (use_ic && LoadScriptContextFieldStub::Accepted(&lookup_result)) { 635 if (use_ic && LoadScriptContextFieldStub::Accepted(&lookup_result)) {
635 TRACE_HANDLER_STATS(isolate(), LoadIC_LoadScriptContextFieldStub); 636 TRACE_HANDLER_STATS(isolate(), LoadIC_LoadScriptContextFieldStub);
636 LoadScriptContextFieldStub stub(isolate(), &lookup_result); 637 LoadScriptContextFieldStub stub(isolate(), &lookup_result);
637 PatchCache(name, stub.GetCode()); 638 PatchCache(name, stub.GetCode());
638 } 639 }
(...skipping 506 matching lines...) Expand 10 before | Expand all | Expand 10 after
1145 receiver->IsJSFunction() && 1146 receiver->IsJSFunction() &&
1146 Name::Equals(isolate()->factory()->prototype_string(), lookup->name()) && 1147 Name::Equals(isolate()->factory()->prototype_string(), lookup->name()) &&
1147 receiver->IsConstructor() && 1148 receiver->IsConstructor() &&
1148 !Handle<JSFunction>::cast(receiver) 1149 !Handle<JSFunction>::cast(receiver)
1149 ->map() 1150 ->map()
1150 ->has_non_instance_prototype())); 1151 ->has_non_instance_prototype()));
1151 1152
1152 Handle<Map> map = receiver_map(); 1153 Handle<Map> map = receiver_map();
1153 switch (lookup->state()) { 1154 switch (lookup->state()) {
1154 case LookupIterator::INTERCEPTOR: { 1155 case LookupIterator::INTERCEPTOR: {
1155 DCHECK(!holder->GetNamedInterceptor()->getter()->IsUndefined()); 1156 DCHECK(!holder->GetNamedInterceptor()->getter()->IsUndefined(isolate()));
1156 TRACE_HANDLER_STATS(isolate(), LoadIC_LoadInterceptor); 1157 TRACE_HANDLER_STATS(isolate(), LoadIC_LoadInterceptor);
1157 NamedLoadHandlerCompiler compiler(isolate(), map, holder, cache_holder); 1158 NamedLoadHandlerCompiler compiler(isolate(), map, holder, cache_holder);
1158 // Perform a lookup behind the interceptor. Copy the LookupIterator since 1159 // Perform a lookup behind the interceptor. Copy the LookupIterator since
1159 // the original iterator will be used to fetch the value. 1160 // the original iterator will be used to fetch the value.
1160 LookupIterator it = *lookup; 1161 LookupIterator it = *lookup;
1161 it.Next(); 1162 it.Next();
1162 LookupForRead(&it); 1163 LookupForRead(&it);
1163 return compiler.CompileLoadInterceptor(&it); 1164 return compiler.CompileLoadInterceptor(&it);
1164 } 1165 }
1165 1166
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
1258 if (key->IsHeapNumber()) { 1259 if (key->IsHeapNumber()) {
1259 double value = Handle<HeapNumber>::cast(key)->value(); 1260 double value = Handle<HeapNumber>::cast(key)->value();
1260 if (std::isnan(value)) { 1261 if (std::isnan(value)) {
1261 key = isolate->factory()->nan_string(); 1262 key = isolate->factory()->nan_string();
1262 } else { 1263 } else {
1263 int int_value = FastD2I(value); 1264 int int_value = FastD2I(value);
1264 if (value == int_value && Smi::IsValid(int_value)) { 1265 if (value == int_value && Smi::IsValid(int_value)) {
1265 key = handle(Smi::FromInt(int_value), isolate); 1266 key = handle(Smi::FromInt(int_value), isolate);
1266 } 1267 }
1267 } 1268 }
1268 } else if (key->IsUndefined()) { 1269 } else if (key->IsUndefined(isolate)) {
1269 key = isolate->factory()->undefined_string(); 1270 key = isolate->factory()->undefined_string();
1270 } 1271 }
1271 return key; 1272 return key;
1272 } 1273 }
1273 1274
1274 void KeyedLoadIC::UpdateLoadElement(Handle<HeapObject> receiver) { 1275 void KeyedLoadIC::UpdateLoadElement(Handle<HeapObject> receiver) {
1275 Handle<Map> receiver_map(receiver->map(), isolate()); 1276 Handle<Map> receiver_map(receiver->map(), isolate());
1276 DCHECK(receiver_map->instance_type() != JS_VALUE_TYPE && 1277 DCHECK(receiver_map->instance_type() != JS_VALUE_TYPE &&
1277 receiver_map->instance_type() != JS_PROXY_TYPE); // Checked by caller. 1278 receiver_map->instance_type() != JS_PROXY_TYPE); // Checked by caller.
1278 MapHandleList target_receiver_maps; 1279 MapHandleList target_receiver_maps;
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
1398 case LookupIterator::NOT_FOUND: 1399 case LookupIterator::NOT_FOUND:
1399 case LookupIterator::TRANSITION: 1400 case LookupIterator::TRANSITION:
1400 UNREACHABLE(); 1401 UNREACHABLE();
1401 case LookupIterator::JSPROXY: 1402 case LookupIterator::JSPROXY:
1402 return false; 1403 return false;
1403 case LookupIterator::INTERCEPTOR: { 1404 case LookupIterator::INTERCEPTOR: {
1404 Handle<JSObject> holder = it->GetHolder<JSObject>(); 1405 Handle<JSObject> holder = it->GetHolder<JSObject>();
1405 InterceptorInfo* info = holder->GetNamedInterceptor(); 1406 InterceptorInfo* info = holder->GetNamedInterceptor();
1406 if (it->HolderIsReceiverOrHiddenPrototype()) { 1407 if (it->HolderIsReceiverOrHiddenPrototype()) {
1407 return !info->non_masking() && receiver.is_identical_to(holder) && 1408 return !info->non_masking() && receiver.is_identical_to(holder) &&
1408 !info->setter()->IsUndefined(); 1409 !info->setter()->IsUndefined(it->isolate());
1409 } else if (!info->getter()->IsUndefined() || 1410 } else if (!info->getter()->IsUndefined(it->isolate()) ||
1410 !info->query()->IsUndefined()) { 1411 !info->query()->IsUndefined(it->isolate())) {
1411 return false; 1412 return false;
1412 } 1413 }
1413 break; 1414 break;
1414 } 1415 }
1415 case LookupIterator::ACCESS_CHECK: 1416 case LookupIterator::ACCESS_CHECK:
1416 if (it->GetHolder<JSObject>()->IsAccessCheckNeeded()) return false; 1417 if (it->GetHolder<JSObject>()->IsAccessCheckNeeded()) return false;
1417 break; 1418 break;
1418 case LookupIterator::ACCESSOR: 1419 case LookupIterator::ACCESSOR:
1419 return !it->IsReadOnly(); 1420 return !it->IsReadOnly();
1420 case LookupIterator::INTEGER_INDEXED_EXOTIC: 1421 case LookupIterator::INTEGER_INDEXED_EXOTIC:
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
1485 if (ScriptContextTable::Lookup(script_contexts, str_name, &lookup_result)) { 1486 if (ScriptContextTable::Lookup(script_contexts, str_name, &lookup_result)) {
1486 Handle<Context> script_context = ScriptContextTable::GetContext( 1487 Handle<Context> script_context = ScriptContextTable::GetContext(
1487 script_contexts, lookup_result.context_index); 1488 script_contexts, lookup_result.context_index);
1488 if (lookup_result.mode == CONST) { 1489 if (lookup_result.mode == CONST) {
1489 return TypeError(MessageTemplate::kConstAssign, object, name); 1490 return TypeError(MessageTemplate::kConstAssign, object, name);
1490 } 1491 }
1491 1492
1492 Handle<Object> previous_value = 1493 Handle<Object> previous_value =
1493 FixedArray::get(*script_context, lookup_result.slot_index, isolate()); 1494 FixedArray::get(*script_context, lookup_result.slot_index, isolate());
1494 1495
1495 if (*previous_value == *isolate()->factory()->the_hole_value()) { 1496 if (previous_value->IsTheHole(isolate())) {
1496 // Do not install stubs and stay pre-monomorphic for 1497 // Do not install stubs and stay pre-monomorphic for
1497 // uninitialized accesses. 1498 // uninitialized accesses.
1498 return ReferenceError(name); 1499 return ReferenceError(name);
1499 } 1500 }
1500 1501
1501 if (FLAG_use_ic && 1502 if (FLAG_use_ic &&
1502 StoreScriptContextFieldStub::Accepted(&lookup_result)) { 1503 StoreScriptContextFieldStub::Accepted(&lookup_result)) {
1503 TRACE_HANDLER_STATS(isolate(), StoreIC_StoreScriptContextFieldStub); 1504 TRACE_HANDLER_STATS(isolate(), StoreIC_StoreScriptContextFieldStub);
1504 StoreScriptContextFieldStub stub(isolate(), &lookup_result); 1505 StoreScriptContextFieldStub stub(isolate(), &lookup_result);
1505 PatchCache(name, stub.GetCode()); 1506 PatchCache(name, stub.GetCode());
1506 } 1507 }
1507 1508
1508 script_context->set(lookup_result.slot_index, *value); 1509 script_context->set(lookup_result.slot_index, *value);
1509 return value; 1510 return value;
1510 } 1511 }
1511 } 1512 }
1512 1513
1513 // TODO(verwaest): Let SetProperty do the migration, since storing a property 1514 // TODO(verwaest): Let SetProperty do the migration, since storing a property
1514 // might deprecate the current map again, if value does not fit. 1515 // might deprecate the current map again, if value does not fit.
1515 if (MigrateDeprecated(object) || object->IsJSProxy()) { 1516 if (MigrateDeprecated(object) || object->IsJSProxy()) {
1516 Handle<Object> result; 1517 Handle<Object> result;
1517 ASSIGN_RETURN_ON_EXCEPTION( 1518 ASSIGN_RETURN_ON_EXCEPTION(
1518 isolate(), result, 1519 isolate(), result,
1519 Object::SetProperty(object, name, value, language_mode()), Object); 1520 Object::SetProperty(object, name, value, language_mode()), Object);
1520 return result; 1521 return result;
1521 } 1522 }
1522 1523
1523 // If the object is undefined or null it's illegal to try to set any 1524 // If the object is undefined or null it's illegal to try to set any
1524 // properties on it; throw a TypeError in that case. 1525 // properties on it; throw a TypeError in that case.
1525 if (object->IsUndefined() || object->IsNull()) { 1526 if (object->IsUndefined(isolate()) || object->IsNull()) {
1526 return TypeError(MessageTemplate::kNonObjectPropertyStore, object, name); 1527 return TypeError(MessageTemplate::kNonObjectPropertyStore, object, name);
1527 } 1528 }
1528 1529
1529 LookupIterator it(object, name); 1530 LookupIterator it(object, name);
1530 if (FLAG_use_ic) UpdateCaches(&it, value, store_mode); 1531 if (FLAG_use_ic) UpdateCaches(&it, value, store_mode);
1531 1532
1532 MAYBE_RETURN_NULL( 1533 MAYBE_RETURN_NULL(
1533 Object::SetProperty(&it, value, language_mode(), store_mode)); 1534 Object::SetProperty(&it, value, language_mode(), store_mode));
1534 return value; 1535 return value;
1535 } 1536 }
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
1608 TRACE_GENERIC_IC(isolate(), "StoreIC", "transition from slow"); 1609 TRACE_GENERIC_IC(isolate(), "StoreIC", "transition from slow");
1609 TRACE_HANDLER_STATS(isolate(), StoreIC_SlowStub); 1610 TRACE_HANDLER_STATS(isolate(), StoreIC_SlowStub);
1610 return slow_stub(); 1611 return slow_stub();
1611 } 1612 }
1612 1613
1613 DCHECK(lookup->IsCacheableTransition()); 1614 DCHECK(lookup->IsCacheableTransition());
1614 break; // Custom-compiled handler. 1615 break; // Custom-compiled handler.
1615 } 1616 }
1616 1617
1617 case LookupIterator::INTERCEPTOR: { 1618 case LookupIterator::INTERCEPTOR: {
1618 DCHECK(!holder->GetNamedInterceptor()->setter()->IsUndefined()); 1619 DCHECK(!holder->GetNamedInterceptor()->setter()->IsUndefined(isolate()));
1619 TRACE_HANDLER_STATS(isolate(), StoreIC_StoreInterceptorStub); 1620 TRACE_HANDLER_STATS(isolate(), StoreIC_StoreInterceptorStub);
1620 StoreInterceptorStub stub(isolate()); 1621 StoreInterceptorStub stub(isolate());
1621 return stub.GetCode(); 1622 return stub.GetCode();
1622 } 1623 }
1623 1624
1624 case LookupIterator::ACCESSOR: { 1625 case LookupIterator::ACCESSOR: {
1625 if (!holder->HasFastProperties()) { 1626 if (!holder->HasFastProperties()) {
1626 TRACE_GENERIC_IC(isolate(), "StoreIC", "accessor on slow map"); 1627 TRACE_GENERIC_IC(isolate(), "StoreIC", "accessor on slow map");
1627 TRACE_HANDLER_STATS(isolate(), StoreIC_SlowStub); 1628 TRACE_HANDLER_STATS(isolate(), StoreIC_SlowStub);
1628 return slow_stub(); 1629 return slow_stub();
(...skipping 1011 matching lines...) Expand 10 before | Expand all | Expand 10 after
2640 2641
2641 2642
2642 Code* CompareIC::UpdateCaches(Handle<Object> x, Handle<Object> y) { 2643 Code* CompareIC::UpdateCaches(Handle<Object> x, Handle<Object> y) {
2643 HandleScope scope(isolate()); 2644 HandleScope scope(isolate());
2644 CompareICStub old_stub(target()->stub_key(), isolate()); 2645 CompareICStub old_stub(target()->stub_key(), isolate());
2645 CompareICState::State new_left = 2646 CompareICState::State new_left =
2646 CompareICState::NewInputState(old_stub.left(), x); 2647 CompareICState::NewInputState(old_stub.left(), x);
2647 CompareICState::State new_right = 2648 CompareICState::State new_right =
2648 CompareICState::NewInputState(old_stub.right(), y); 2649 CompareICState::NewInputState(old_stub.right(), y);
2649 CompareICState::State state = CompareICState::TargetState( 2650 CompareICState::State state = CompareICState::TargetState(
2650 old_stub.state(), old_stub.left(), old_stub.right(), op_, 2651 isolate(), old_stub.state(), old_stub.left(), old_stub.right(), op_,
2651 HasInlinedSmiCode(address()), x, y); 2652 HasInlinedSmiCode(address()), x, y);
2652 CompareICStub stub(isolate(), op_, new_left, new_right, state); 2653 CompareICStub stub(isolate(), op_, new_left, new_right, state);
2653 if (state == CompareICState::KNOWN_RECEIVER) { 2654 if (state == CompareICState::KNOWN_RECEIVER) {
2654 stub.set_known_map( 2655 stub.set_known_map(
2655 Handle<Map>(Handle<JSReceiver>::cast(x)->map(), isolate())); 2656 Handle<Map>(Handle<JSReceiver>::cast(x)->map(), isolate()));
2656 } 2657 }
2657 Handle<Code> new_target = stub.GetCode(); 2658 Handle<Code> new_target = stub.GetCode();
2658 set_target(*new_target); 2659 set_target(*new_target);
2659 2660
2660 if (FLAG_trace_ic) { 2661 if (FLAG_trace_ic) {
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after
2934 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_LOAD_IC, 2935 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_LOAD_IC,
2935 vector->GetKind(vector_slot)); 2936 vector->GetKind(vector_slot));
2936 KeyedLoadICNexus nexus(vector, vector_slot); 2937 KeyedLoadICNexus nexus(vector, vector_slot);
2937 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); 2938 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus);
2938 ic.UpdateState(receiver, key); 2939 ic.UpdateState(receiver, key);
2939 RETURN_RESULT_OR_FAILURE(isolate, ic.Load(receiver, key)); 2940 RETURN_RESULT_OR_FAILURE(isolate, ic.Load(receiver, key));
2940 } 2941 }
2941 } 2942 }
2942 } // namespace internal 2943 } // namespace internal
2943 } // namespace v8 2944 } // namespace v8
OLDNEW
« no previous file with comments | « src/ic/ia32/handler-compiler-ia32.cc ('k') | src/ic/ic-state.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698