OLD | NEW |
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/arguments.h" | 9 #include "src/arguments.h" |
10 #include "src/base/bits.h" | 10 #include "src/base/bits.h" |
(...skipping 668 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
679 if (object->IsJSGlobalObject() && name->IsString()) { | 679 if (object->IsJSGlobalObject() && name->IsString()) { |
680 // Look up in script context table. | 680 // Look up in script context table. |
681 Handle<String> str_name = Handle<String>::cast(name); | 681 Handle<String> str_name = Handle<String>::cast(name); |
682 Handle<JSGlobalObject> global = Handle<JSGlobalObject>::cast(object); | 682 Handle<JSGlobalObject> global = Handle<JSGlobalObject>::cast(object); |
683 Handle<ScriptContextTable> script_contexts( | 683 Handle<ScriptContextTable> script_contexts( |
684 global->native_context()->script_context_table()); | 684 global->native_context()->script_context_table()); |
685 | 685 |
686 ScriptContextTable::LookupResult lookup_result; | 686 ScriptContextTable::LookupResult lookup_result; |
687 if (ScriptContextTable::Lookup(script_contexts, str_name, &lookup_result)) { | 687 if (ScriptContextTable::Lookup(script_contexts, str_name, &lookup_result)) { |
688 Handle<Object> result = | 688 Handle<Object> result = |
689 FixedArray::get(ScriptContextTable::GetContext( | 689 FixedArray::get(*ScriptContextTable::GetContext( |
690 script_contexts, lookup_result.context_index), | 690 script_contexts, lookup_result.context_index), |
691 lookup_result.slot_index); | 691 lookup_result.slot_index, isolate()); |
692 if (*result == *isolate()->factory()->the_hole_value()) { | 692 if (*result == *isolate()->factory()->the_hole_value()) { |
693 // Do not install stubs and stay pre-monomorphic for | 693 // Do not install stubs and stay pre-monomorphic for |
694 // uninitialized accesses. | 694 // uninitialized accesses. |
695 return ReferenceError(name); | 695 return ReferenceError(name); |
696 } | 696 } |
697 | 697 |
698 if (use_ic && LoadScriptContextFieldStub::Accepted(&lookup_result)) { | 698 if (use_ic && LoadScriptContextFieldStub::Accepted(&lookup_result)) { |
699 LoadScriptContextFieldStub stub(isolate(), &lookup_result); | 699 LoadScriptContextFieldStub stub(isolate(), &lookup_result); |
700 PatchCache(name, stub.GetCode()); | 700 PatchCache(name, stub.GetCode()); |
701 } | 701 } |
(...skipping 666 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1368 Handle<Code> stub = megamorphic_stub(); | 1368 Handle<Code> stub = megamorphic_stub(); |
1369 | 1369 |
1370 // Check for non-string values that can be converted into an | 1370 // Check for non-string values that can be converted into an |
1371 // internalized string directly or is representable as a smi. | 1371 // internalized string directly or is representable as a smi. |
1372 key = TryConvertKey(key, isolate()); | 1372 key = TryConvertKey(key, isolate()); |
1373 | 1373 |
1374 if (key->IsInternalizedString() || key->IsSymbol()) { | 1374 if (key->IsInternalizedString() || key->IsSymbol()) { |
1375 ASSIGN_RETURN_ON_EXCEPTION(isolate(), load_handle, | 1375 ASSIGN_RETURN_ON_EXCEPTION(isolate(), load_handle, |
1376 LoadIC::Load(object, Handle<Name>::cast(key)), | 1376 LoadIC::Load(object, Handle<Name>::cast(key)), |
1377 Object); | 1377 Object); |
1378 } else if (FLAG_use_ic && !object->IsAccessCheckNeeded()) { | 1378 } else if (FLAG_use_ic && !object->IsAccessCheckNeeded() && |
| 1379 !object->IsJSValue()) { |
1379 if (object->IsJSObject() || (object->IsString() && key->IsNumber())) { | 1380 if (object->IsJSObject() || (object->IsString() && key->IsNumber())) { |
1380 Handle<HeapObject> receiver = Handle<HeapObject>::cast(object); | 1381 Handle<HeapObject> receiver = Handle<HeapObject>::cast(object); |
1381 if (object->IsString() || key->IsSmi()) stub = LoadElementStub(receiver); | 1382 if (object->IsString() || key->IsSmi()) stub = LoadElementStub(receiver); |
1382 } | 1383 } |
1383 } | 1384 } |
1384 | 1385 |
1385 DCHECK(UseVector()); | 1386 DCHECK(UseVector()); |
1386 if (!is_vector_set() || stub.is_null()) { | 1387 if (!is_vector_set() || stub.is_null()) { |
1387 Code* generic = *megamorphic_stub(); | 1388 Code* generic = *megamorphic_stub(); |
1388 if (!stub.is_null() && *stub == generic) { | 1389 if (!stub.is_null() && *stub == generic) { |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1500 | 1501 |
1501 ScriptContextTable::LookupResult lookup_result; | 1502 ScriptContextTable::LookupResult lookup_result; |
1502 if (ScriptContextTable::Lookup(script_contexts, str_name, &lookup_result)) { | 1503 if (ScriptContextTable::Lookup(script_contexts, str_name, &lookup_result)) { |
1503 Handle<Context> script_context = ScriptContextTable::GetContext( | 1504 Handle<Context> script_context = ScriptContextTable::GetContext( |
1504 script_contexts, lookup_result.context_index); | 1505 script_contexts, lookup_result.context_index); |
1505 if (lookup_result.mode == CONST) { | 1506 if (lookup_result.mode == CONST) { |
1506 return TypeError(MessageTemplate::kConstAssign, object, name); | 1507 return TypeError(MessageTemplate::kConstAssign, object, name); |
1507 } | 1508 } |
1508 | 1509 |
1509 Handle<Object> previous_value = | 1510 Handle<Object> previous_value = |
1510 FixedArray::get(script_context, lookup_result.slot_index); | 1511 FixedArray::get(*script_context, lookup_result.slot_index, isolate()); |
1511 | 1512 |
1512 if (*previous_value == *isolate()->factory()->the_hole_value()) { | 1513 if (*previous_value == *isolate()->factory()->the_hole_value()) { |
1513 // Do not install stubs and stay pre-monomorphic for | 1514 // Do not install stubs and stay pre-monomorphic for |
1514 // uninitialized accesses. | 1515 // uninitialized accesses. |
1515 return ReferenceError(name); | 1516 return ReferenceError(name); |
1516 } | 1517 } |
1517 | 1518 |
1518 if (FLAG_use_ic && | 1519 if (FLAG_use_ic && |
1519 StoreScriptContextFieldStub::Accepted(&lookup_result)) { | 1520 StoreScriptContextFieldStub::Accepted(&lookup_result)) { |
1520 StoreScriptContextFieldStub stub(isolate(), &lookup_result); | 1521 StoreScriptContextFieldStub stub(isolate(), &lookup_result); |
(...skipping 1452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2973 KeyedLoadICNexus nexus(vector, vector_slot); | 2974 KeyedLoadICNexus nexus(vector, vector_slot); |
2974 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); | 2975 KeyedLoadIC ic(IC::EXTRA_CALL_FRAME, isolate, &nexus); |
2975 ic.UpdateState(receiver, key); | 2976 ic.UpdateState(receiver, key); |
2976 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); | 2977 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(receiver, key)); |
2977 } | 2978 } |
2978 | 2979 |
2979 return *result; | 2980 return *result; |
2980 } | 2981 } |
2981 } // namespace internal | 2982 } // namespace internal |
2982 } // namespace v8 | 2983 } // namespace v8 |
OLD | NEW |