| 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/runtime/runtime-utils.h" | 5 #include "src/runtime/runtime-utils.h" |
| 6 | 6 |
| 7 #include "src/accessors.h" | 7 #include "src/accessors.h" |
| 8 #include "src/arguments.h" | 8 #include "src/arguments.h" |
| 9 #include "src/ast/scopeinfo.h" | 9 #include "src/ast/scopeinfo.h" |
| 10 #include "src/ast/scopes.h" | 10 #include "src/ast/scopes.h" |
| (...skipping 708 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 719 CONVERT_ARG_HANDLE_CHECKED(ScopeInfo, scope_info, 0); | 719 CONVERT_ARG_HANDLE_CHECKED(ScopeInfo, scope_info, 0); |
| 720 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 1); | 720 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 1); |
| 721 Handle<Context> current(isolate->context()); | 721 Handle<Context> current(isolate->context()); |
| 722 Handle<Context> context = | 722 Handle<Context> context = |
| 723 isolate->factory()->NewBlockContext(function, current, scope_info); | 723 isolate->factory()->NewBlockContext(function, current, scope_info); |
| 724 isolate->set_context(*context); | 724 isolate->set_context(*context); |
| 725 return *context; | 725 return *context; |
| 726 } | 726 } |
| 727 | 727 |
| 728 | 728 |
| 729 RUNTIME_FUNCTION(Runtime_IsJSModule) { | |
| 730 SealHandleScope shs(isolate); | |
| 731 DCHECK(args.length() == 1); | |
| 732 CONVERT_ARG_CHECKED(Object, obj, 0); | |
| 733 return isolate->heap()->ToBoolean(obj->IsJSModule()); | |
| 734 } | |
| 735 | |
| 736 | |
| 737 RUNTIME_FUNCTION(Runtime_PushModuleContext) { | |
| 738 SealHandleScope shs(isolate); | |
| 739 DCHECK(args.length() == 2); | |
| 740 CONVERT_SMI_ARG_CHECKED(index, 0); | |
| 741 | |
| 742 if (!args[1]->IsScopeInfo()) { | |
| 743 // Module already initialized. Find hosting context and retrieve context. | |
| 744 Context* host = Context::cast(isolate->context())->script_context(); | |
| 745 Context* context = Context::cast(host->get(index)); | |
| 746 DCHECK(context->previous() == isolate->context()); | |
| 747 isolate->set_context(context); | |
| 748 return context; | |
| 749 } | |
| 750 | |
| 751 CONVERT_ARG_HANDLE_CHECKED(ScopeInfo, scope_info, 1); | |
| 752 | |
| 753 // Allocate module context. | |
| 754 HandleScope scope(isolate); | |
| 755 Factory* factory = isolate->factory(); | |
| 756 Handle<Context> context = factory->NewModuleContext(scope_info); | |
| 757 Handle<JSModule> module = factory->NewJSModule(context, scope_info); | |
| 758 context->set_module(*module); | |
| 759 Context* previous = isolate->context(); | |
| 760 context->set_previous(previous); | |
| 761 context->set_closure(previous->closure()); | |
| 762 context->set_native_context(previous->native_context()); | |
| 763 isolate->set_context(*context); | |
| 764 | |
| 765 // Find hosting scope and initialize internal variable holding module there. | |
| 766 previous->script_context()->set(index, *context); | |
| 767 | |
| 768 return *context; | |
| 769 } | |
| 770 | |
| 771 | |
| 772 RUNTIME_FUNCTION(Runtime_DeclareModules) { | |
| 773 HandleScope scope(isolate); | |
| 774 DCHECK(args.length() == 1); | |
| 775 CONVERT_ARG_HANDLE_CHECKED(FixedArray, descriptions, 0); | |
| 776 Context* host_context = isolate->context(); | |
| 777 | |
| 778 for (int i = 0; i < descriptions->length(); ++i) { | |
| 779 Handle<ModuleInfo> description(ModuleInfo::cast(descriptions->get(i))); | |
| 780 int host_index = description->host_index(); | |
| 781 Handle<Context> context(Context::cast(host_context->get(host_index))); | |
| 782 Handle<JSModule> module(context->module()); | |
| 783 | |
| 784 for (int j = 0; j < description->length(); ++j) { | |
| 785 Handle<String> name(description->name(j), isolate); | |
| 786 VariableMode mode = description->mode(j); | |
| 787 int index = description->index(j); | |
| 788 switch (mode) { | |
| 789 case VAR: | |
| 790 case LET: | |
| 791 case CONST: | |
| 792 case CONST_LEGACY: { | |
| 793 PropertyAttributes attr = | |
| 794 IsImmutableVariableMode(mode) ? FROZEN : SEALED; | |
| 795 Handle<AccessorInfo> info = | |
| 796 Accessors::MakeModuleExport(name, index, attr); | |
| 797 Handle<Object> result = | |
| 798 JSObject::SetAccessor(module, info).ToHandleChecked(); | |
| 799 DCHECK(!result->IsUndefined(isolate)); | |
| 800 USE(result); | |
| 801 break; | |
| 802 } | |
| 803 case TEMPORARY: | |
| 804 case DYNAMIC: | |
| 805 case DYNAMIC_GLOBAL: | |
| 806 case DYNAMIC_LOCAL: | |
| 807 UNREACHABLE(); | |
| 808 } | |
| 809 } | |
| 810 | |
| 811 if (JSObject::PreventExtensions(module, Object::THROW_ON_ERROR) | |
| 812 .IsNothing()) { | |
| 813 DCHECK(false); | |
| 814 } | |
| 815 } | |
| 816 | |
| 817 DCHECK(!isolate->has_pending_exception()); | |
| 818 return isolate->heap()->undefined_value(); | |
| 819 } | |
| 820 | |
| 821 | |
| 822 RUNTIME_FUNCTION(Runtime_DeleteLookupSlot) { | 729 RUNTIME_FUNCTION(Runtime_DeleteLookupSlot) { |
| 823 HandleScope scope(isolate); | 730 HandleScope scope(isolate); |
| 824 DCHECK_EQ(1, args.length()); | 731 DCHECK_EQ(1, args.length()); |
| 825 CONVERT_ARG_HANDLE_CHECKED(String, name, 0); | 732 CONVERT_ARG_HANDLE_CHECKED(String, name, 0); |
| 826 | 733 |
| 827 int index; | 734 int index; |
| 828 PropertyAttributes attributes; | 735 PropertyAttributes attributes; |
| 829 BindingFlags flags; | 736 BindingFlags flags; |
| 830 Handle<Object> holder = isolate->context()->Lookup( | 737 Handle<Object> holder = isolate->context()->Lookup( |
| 831 name, FOLLOW_CHAINS, &index, &attributes, &flags); | 738 name, FOLLOW_CHAINS, &index, &attributes, &flags); |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1028 RUNTIME_FUNCTION(Runtime_StoreLookupSlot_Strict) { | 935 RUNTIME_FUNCTION(Runtime_StoreLookupSlot_Strict) { |
| 1029 HandleScope scope(isolate); | 936 HandleScope scope(isolate); |
| 1030 DCHECK_EQ(2, args.length()); | 937 DCHECK_EQ(2, args.length()); |
| 1031 CONVERT_ARG_HANDLE_CHECKED(String, name, 0); | 938 CONVERT_ARG_HANDLE_CHECKED(String, name, 0); |
| 1032 CONVERT_ARG_HANDLE_CHECKED(Object, value, 1); | 939 CONVERT_ARG_HANDLE_CHECKED(Object, value, 1); |
| 1033 RETURN_RESULT_OR_FAILURE(isolate, StoreLookupSlot(name, value, STRICT)); | 940 RETURN_RESULT_OR_FAILURE(isolate, StoreLookupSlot(name, value, STRICT)); |
| 1034 } | 941 } |
| 1035 | 942 |
| 1036 } // namespace internal | 943 } // namespace internal |
| 1037 } // namespace v8 | 944 } // namespace v8 |
| OLD | NEW |