OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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/execution.h" | 5 #include "src/execution.h" |
6 | 6 |
7 #include "src/bootstrapper.h" | 7 #include "src/bootstrapper.h" |
8 #include "src/codegen.h" | 8 #include "src/codegen.h" |
9 #include "src/deoptimizer.h" | 9 #include "src/deoptimizer.h" |
10 #include "src/isolate-inl.h" | 10 #include "src/isolate-inl.h" |
(...skipping 612 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
623 if (!TryCall(Handle<JSFunction>::cast(char_at), | 623 if (!TryCall(Handle<JSFunction>::cast(char_at), |
624 string, | 624 string, |
625 arraysize(index_arg), | 625 arraysize(index_arg), |
626 index_arg).ToHandle(&result)) { | 626 index_arg).ToHandle(&result)) { |
627 return factory->undefined_value(); | 627 return factory->undefined_value(); |
628 } | 628 } |
629 return result; | 629 return result; |
630 } | 630 } |
631 | 631 |
632 | 632 |
633 MaybeHandle<JSFunction> Execution::InstantiateFunction( | |
634 Handle<FunctionTemplateInfo> data) { | |
635 Isolate* isolate = data->GetIsolate(); | |
636 if (!data->do_not_cache()) { | |
637 // Fast case: see if the function has already been instantiated | |
638 int serial_number = Smi::cast(data->serial_number())->value(); | |
639 Handle<JSObject> cache(isolate->native_context()->function_cache()); | |
640 Handle<Object> elm = | |
641 Object::GetElement(isolate, cache, serial_number).ToHandleChecked(); | |
642 if (elm->IsJSFunction()) return Handle<JSFunction>::cast(elm); | |
643 } | |
644 // The function has not yet been instantiated in this context; do it. | |
645 Handle<Object> args[] = { data }; | |
646 Handle<Object> result; | |
647 ASSIGN_RETURN_ON_EXCEPTION( | |
648 isolate, result, | |
649 Call(isolate, | |
650 isolate->instantiate_fun(), | |
651 isolate->js_builtins_object(), | |
652 arraysize(args), | |
653 args), | |
654 JSFunction); | |
655 return Handle<JSFunction>::cast(result); | |
656 } | |
657 | |
658 | |
659 MaybeHandle<JSObject> Execution::InstantiateObject( | |
660 Handle<ObjectTemplateInfo> data) { | |
661 Isolate* isolate = data->GetIsolate(); | |
662 Handle<Object> result; | |
663 if (data->property_list()->IsUndefined() && | |
664 !data->constructor()->IsUndefined()) { | |
665 Handle<FunctionTemplateInfo> cons_template = | |
666 Handle<FunctionTemplateInfo>( | |
667 FunctionTemplateInfo::cast(data->constructor())); | |
668 Handle<JSFunction> cons; | |
669 ASSIGN_RETURN_ON_EXCEPTION( | |
670 isolate, cons, InstantiateFunction(cons_template), JSObject); | |
671 ASSIGN_RETURN_ON_EXCEPTION(isolate, result, New(cons, 0, NULL), JSObject); | |
672 } else { | |
673 Handle<Object> args[] = { data }; | |
674 ASSIGN_RETURN_ON_EXCEPTION( | |
675 isolate, result, | |
676 Call(isolate, | |
677 isolate->instantiate_fun(), | |
678 isolate->js_builtins_object(), | |
679 arraysize(args), | |
680 args), | |
681 JSObject); | |
682 } | |
683 return Handle<JSObject>::cast(result); | |
684 } | |
685 | |
686 | |
687 MaybeHandle<Object> Execution::ConfigureInstance( | |
688 Isolate* isolate, | |
689 Handle<Object> instance, | |
690 Handle<Object> instance_template) { | |
691 Handle<Object> args[] = { instance, instance_template }; | |
692 return Execution::Call(isolate, | |
693 isolate->configure_instance_fun(), | |
694 isolate->js_builtins_object(), | |
695 arraysize(args), | |
696 args); | |
697 } | |
698 | |
699 | |
700 Handle<String> Execution::GetStackTraceLine(Handle<Object> recv, | 633 Handle<String> Execution::GetStackTraceLine(Handle<Object> recv, |
701 Handle<JSFunction> fun, | 634 Handle<JSFunction> fun, |
702 Handle<Object> pos, | 635 Handle<Object> pos, |
703 Handle<Object> is_global) { | 636 Handle<Object> is_global) { |
704 Isolate* isolate = fun->GetIsolate(); | 637 Isolate* isolate = fun->GetIsolate(); |
705 Handle<Object> args[] = { recv, fun, pos, is_global }; | 638 Handle<Object> args[] = { recv, fun, pos, is_global }; |
706 MaybeHandle<Object> maybe_result = | 639 MaybeHandle<Object> maybe_result = |
707 TryCall(isolate->get_stack_trace_line_fun(), | 640 TryCall(isolate->get_stack_trace_line_fun(), |
708 isolate->js_builtins_object(), | 641 isolate->js_builtins_object(), |
709 arraysize(args), | 642 arraysize(args), |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
745 } | 678 } |
746 | 679 |
747 isolate_->counters()->stack_interrupts()->Increment(); | 680 isolate_->counters()->stack_interrupts()->Increment(); |
748 isolate_->counters()->runtime_profiler_ticks()->Increment(); | 681 isolate_->counters()->runtime_profiler_ticks()->Increment(); |
749 isolate_->runtime_profiler()->OptimizeNow(); | 682 isolate_->runtime_profiler()->OptimizeNow(); |
750 | 683 |
751 return isolate_->heap()->undefined_value(); | 684 return isolate_->heap()->undefined_value(); |
752 } | 685 } |
753 | 686 |
754 } } // namespace v8::internal | 687 } } // namespace v8::internal |
OLD | NEW |