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 <iostream> | 7 #include <iostream> |
8 | 8 |
9 #include "src/accessors.h" | 9 #include "src/accessors.h" |
10 #include "src/api-arguments-inl.h" | 10 #include "src/api-arguments-inl.h" |
(...skipping 2534 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2545 LoadGlobalIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus); | 2545 LoadGlobalIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus); |
2546 ic.UpdateState(global, name); | 2546 ic.UpdateState(global, name); |
2547 | 2547 |
2548 Handle<Object> result; | 2548 Handle<Object> result; |
2549 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(name)); | 2549 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, ic.Load(name)); |
2550 return *result; | 2550 return *result; |
2551 } | 2551 } |
2552 | 2552 |
2553 RUNTIME_FUNCTION(Runtime_LoadGlobalIC_Slow) { | 2553 RUNTIME_FUNCTION(Runtime_LoadGlobalIC_Slow) { |
2554 HandleScope scope(isolate); | 2554 HandleScope scope(isolate); |
2555 DCHECK_EQ(1, args.length()); | 2555 DCHECK_EQ(3, args.length()); |
2556 CONVERT_ARG_HANDLE_CHECKED(String, name, 0); | 2556 CONVERT_ARG_HANDLE_CHECKED(String, name, 0); |
2557 | 2557 |
2558 Handle<Context> native_context = isolate->native_context(); | 2558 Handle<Context> native_context = isolate->native_context(); |
2559 Handle<ScriptContextTable> script_contexts( | 2559 Handle<ScriptContextTable> script_contexts( |
2560 native_context->script_context_table()); | 2560 native_context->script_context_table()); |
2561 | 2561 |
2562 ScriptContextTable::LookupResult lookup_result; | 2562 ScriptContextTable::LookupResult lookup_result; |
2563 if (ScriptContextTable::Lookup(script_contexts, name, &lookup_result)) { | 2563 if (ScriptContextTable::Lookup(script_contexts, name, &lookup_result)) { |
2564 Handle<Context> script_context = ScriptContextTable::GetContext( | 2564 Handle<Context> script_context = ScriptContextTable::GetContext( |
2565 script_contexts, lookup_result.context_index); | 2565 script_contexts, lookup_result.context_index); |
2566 Handle<Object> result = | 2566 Handle<Object> result = |
2567 FixedArray::get(*script_context, lookup_result.slot_index, isolate); | 2567 FixedArray::get(*script_context, lookup_result.slot_index, isolate); |
2568 if (*result == isolate->heap()->the_hole_value()) { | 2568 if (*result == isolate->heap()->the_hole_value()) { |
2569 THROW_NEW_ERROR_RETURN_FAILURE( | 2569 THROW_NEW_ERROR_RETURN_FAILURE( |
2570 isolate, NewReferenceError(MessageTemplate::kNotDefined, name)); | 2570 isolate, NewReferenceError(MessageTemplate::kNotDefined, name)); |
2571 } | 2571 } |
2572 return *result; | 2572 return *result; |
2573 } | 2573 } |
2574 | 2574 |
2575 Handle<JSGlobalObject> global(native_context->global_object(), isolate); | 2575 Handle<JSGlobalObject> global(native_context->global_object(), isolate); |
2576 Handle<Object> result; | 2576 Handle<Object> result; |
2577 bool is_found = false; | 2577 bool is_found = false; |
2578 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 2578 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
2579 isolate, result, | 2579 isolate, result, |
2580 Runtime::GetObjectProperty(isolate, global, name, &is_found)); | 2580 Runtime::GetObjectProperty(isolate, global, name, &is_found)); |
2581 if (!is_found) { | 2581 if (!is_found) { |
2582 LoadICNexus nexus(isolate); | 2582 Handle<Smi> slot = args.at<Smi>(1); |
2583 LoadIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus); | 2583 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(2); |
| 2584 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value()); |
| 2585 FeedbackVectorSlotKind kind = vector->GetKind(vector_slot); |
2584 // It is actually a LoadGlobalICs here but the predicate handles this case | 2586 // It is actually a LoadGlobalICs here but the predicate handles this case |
2585 // properly. | 2587 // properly. |
2586 if (ic.ShouldThrowReferenceError()) { | 2588 if (LoadIC::ShouldThrowReferenceError(kind)) { |
2587 THROW_NEW_ERROR_RETURN_FAILURE( | 2589 THROW_NEW_ERROR_RETURN_FAILURE( |
2588 isolate, NewReferenceError(MessageTemplate::kNotDefined, name)); | 2590 isolate, NewReferenceError(MessageTemplate::kNotDefined, name)); |
2589 } | 2591 } |
2590 } | 2592 } |
2591 return *result; | 2593 return *result; |
2592 } | 2594 } |
2593 | 2595 |
2594 // Used from ic-<arch>.cc | 2596 // Used from ic-<arch>.cc |
2595 RUNTIME_FUNCTION(Runtime_KeyedLoadIC_Miss) { | 2597 RUNTIME_FUNCTION(Runtime_KeyedLoadIC_Miss) { |
2596 HandleScope scope(isolate); | 2598 HandleScope scope(isolate); |
(...skipping 426 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3023 return isolate->heap()->no_interceptor_result_sentinel(); | 3025 return isolate->heap()->no_interceptor_result_sentinel(); |
3024 } | 3026 } |
3025 | 3027 |
3026 | 3028 |
3027 /** | 3029 /** |
3028 * Loads a property with an interceptor performing post interceptor | 3030 * Loads a property with an interceptor performing post interceptor |
3029 * lookup if interceptor failed. | 3031 * lookup if interceptor failed. |
3030 */ | 3032 */ |
3031 RUNTIME_FUNCTION(Runtime_LoadPropertyWithInterceptor) { | 3033 RUNTIME_FUNCTION(Runtime_LoadPropertyWithInterceptor) { |
3032 HandleScope scope(isolate); | 3034 HandleScope scope(isolate); |
3033 DCHECK(args.length() == NamedLoadHandlerCompiler::kInterceptorArgsLength); | 3035 DCHECK(args.length() == NamedLoadHandlerCompiler::kInterceptorArgsLength + 2); |
3034 Handle<Name> name = | 3036 Handle<Name> name = |
3035 args.at<Name>(NamedLoadHandlerCompiler::kInterceptorArgsNameIndex); | 3037 args.at<Name>(NamedLoadHandlerCompiler::kInterceptorArgsNameIndex); |
3036 Handle<Object> receiver = | 3038 Handle<Object> receiver = |
3037 args.at(NamedLoadHandlerCompiler::kInterceptorArgsThisIndex); | 3039 args.at(NamedLoadHandlerCompiler::kInterceptorArgsThisIndex); |
3038 Handle<JSObject> holder = | 3040 Handle<JSObject> holder = |
3039 args.at<JSObject>(NamedLoadHandlerCompiler::kInterceptorArgsHolderIndex); | 3041 args.at<JSObject>(NamedLoadHandlerCompiler::kInterceptorArgsHolderIndex); |
3040 | 3042 |
3041 if (!receiver->IsJSReceiver()) { | 3043 if (!receiver->IsJSReceiver()) { |
3042 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 3044 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( |
3043 isolate, receiver, Object::ConvertReceiver(isolate, receiver)); | 3045 isolate, receiver, Object::ConvertReceiver(isolate, receiver)); |
(...skipping 18 matching lines...) Expand all Loading... |
3062 !it.GetHolder<JSObject>().is_identical_to(holder)) { | 3064 !it.GetHolder<JSObject>().is_identical_to(holder)) { |
3063 DCHECK(it.state() != LookupIterator::ACCESS_CHECK || it.HasAccess()); | 3065 DCHECK(it.state() != LookupIterator::ACCESS_CHECK || it.HasAccess()); |
3064 it.Next(); | 3066 it.Next(); |
3065 } | 3067 } |
3066 // Skip past the interceptor. | 3068 // Skip past the interceptor. |
3067 it.Next(); | 3069 it.Next(); |
3068 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, Object::GetProperty(&it)); | 3070 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, Object::GetProperty(&it)); |
3069 | 3071 |
3070 if (it.IsFound()) return *result; | 3072 if (it.IsFound()) return *result; |
3071 | 3073 |
3072 LoadICNexus nexus(isolate); | 3074 Handle<Smi> slot = args.at<Smi>(3); |
3073 LoadIC ic(IC::NO_EXTRA_FRAME, isolate, &nexus); | 3075 Handle<TypeFeedbackVector> vector = args.at<TypeFeedbackVector>(4); |
3074 // It could actually be any kind of LoadICs here but the predicate handles | 3076 FeedbackVectorSlot vector_slot = vector->ToSlot(slot->value()); |
3075 // all the cases properly. | 3077 FeedbackVectorSlotKind slot_kind = vector->GetKind(vector_slot); |
3076 if (!ic.ShouldThrowReferenceError()) { | 3078 // It could actually be any kind of load IC slot here but the predicate |
| 3079 // handles all the cases properly. |
| 3080 if (!LoadIC::ShouldThrowReferenceError(slot_kind)) { |
3077 return isolate->heap()->undefined_value(); | 3081 return isolate->heap()->undefined_value(); |
3078 } | 3082 } |
3079 | 3083 |
3080 // Throw a reference error. | 3084 // Throw a reference error. |
3081 THROW_NEW_ERROR_RETURN_FAILURE( | 3085 THROW_NEW_ERROR_RETURN_FAILURE( |
3082 isolate, NewReferenceError(MessageTemplate::kNotDefined, it.name())); | 3086 isolate, NewReferenceError(MessageTemplate::kNotDefined, it.name())); |
3083 } | 3087 } |
3084 | 3088 |
3085 | 3089 |
3086 RUNTIME_FUNCTION(Runtime_StorePropertyWithInterceptor) { | 3090 RUNTIME_FUNCTION(Runtime_StorePropertyWithInterceptor) { |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3147 DCHECK_EQ(LookupIterator::INTERCEPTOR, it.state()); | 3151 DCHECK_EQ(LookupIterator::INTERCEPTOR, it.state()); |
3148 it.Next(); | 3152 it.Next(); |
3149 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, | 3153 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, |
3150 Object::GetProperty(&it)); | 3154 Object::GetProperty(&it)); |
3151 } | 3155 } |
3152 | 3156 |
3153 return *result; | 3157 return *result; |
3154 } | 3158 } |
3155 } // namespace internal | 3159 } // namespace internal |
3156 } // namespace v8 | 3160 } // namespace v8 |
OLD | NEW |