OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/objects.h" | 5 #include "src/objects.h" |
6 | 6 |
7 #include <cmath> | 7 #include <cmath> |
8 #include <iomanip> | 8 #include <iomanip> |
9 #include <memory> | 9 #include <memory> |
10 #include <sstream> | 10 #include <sstream> |
(...skipping 19835 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
19846 THROW_NEW_ERROR(isolate, | 19846 THROW_NEW_ERROR(isolate, |
19847 NewSyntaxError(MessageTemplate::kUnresolvableExport, name), | 19847 NewSyntaxError(MessageTemplate::kUnresolvableExport, name), |
19848 Cell); | 19848 Cell); |
19849 } | 19849 } |
19850 return MaybeHandle<Cell>(); | 19850 return MaybeHandle<Cell>(); |
19851 } | 19851 } |
19852 | 19852 |
19853 bool Module::Instantiate(Handle<Module> module, v8::Local<v8::Context> context, | 19853 bool Module::Instantiate(Handle<Module> module, v8::Local<v8::Context> context, |
19854 v8::Module::ResolveCallback callback, | 19854 v8::Module::ResolveCallback callback, |
19855 v8::Local<v8::Value> callback_data) { | 19855 v8::Local<v8::Value> callback_data) { |
19856 // Already instantiated. | 19856 if (module->instantiated()) return true; |
19857 if (module->code()->IsJSFunction()) return true; | |
19858 | 19857 |
19859 Isolate* isolate = module->GetIsolate(); | 19858 Isolate* isolate = module->GetIsolate(); |
19860 Handle<SharedFunctionInfo> shared(SharedFunctionInfo::cast(module->code()), | 19859 Handle<SharedFunctionInfo> shared(SharedFunctionInfo::cast(module->code()), |
19861 isolate); | 19860 isolate); |
19862 Handle<JSFunction> function = | 19861 Handle<JSFunction> function = |
19863 isolate->factory()->NewFunctionFromSharedFunctionInfo( | 19862 isolate->factory()->NewFunctionFromSharedFunctionInfo( |
19864 shared, | 19863 shared, |
19865 handle(Utils::OpenHandle(*context)->native_context(), isolate)); | 19864 handle(Utils::OpenHandle(*context)->native_context(), isolate)); |
19866 module->set_code(*function); | 19865 module->set_code(*function); |
| 19866 DCHECK(module->instantiated()); |
19867 | 19867 |
19868 Handle<ModuleInfo> module_info(shared->scope_info()->ModuleDescriptorInfo(), | 19868 Handle<ModuleInfo> module_info(shared->scope_info()->ModuleDescriptorInfo(), |
19869 isolate); | 19869 isolate); |
19870 | 19870 |
19871 // Set up local exports. | 19871 // Set up local exports. |
19872 Handle<FixedArray> regular_exports(module_info->regular_exports(), isolate); | 19872 Handle<FixedArray> regular_exports(module_info->regular_exports(), isolate); |
19873 for (int i = 0, n = regular_exports->length(); i < n; i += 2) { | 19873 for (int i = 0, n = regular_exports->length(); i < n; i += 2) { |
19874 Handle<FixedArray> export_names( | 19874 Handle<FixedArray> export_names( |
19875 FixedArray::cast(regular_exports->get(i + 1)), isolate); | 19875 FixedArray::cast(regular_exports->get(i + 1)), isolate); |
19876 CreateExport(module, export_names); | 19876 CreateExport(module, export_names); |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
19938 if (ResolveExport(module, Handle<String>::cast(name), true, &resolve_set) | 19938 if (ResolveExport(module, Handle<String>::cast(name), true, &resolve_set) |
19939 .is_null()) { | 19939 .is_null()) { |
19940 return false; | 19940 return false; |
19941 } | 19941 } |
19942 } | 19942 } |
19943 | 19943 |
19944 return true; | 19944 return true; |
19945 } | 19945 } |
19946 | 19946 |
19947 MaybeHandle<Object> Module::Evaluate(Handle<Module> module) { | 19947 MaybeHandle<Object> Module::Evaluate(Handle<Module> module) { |
19948 DCHECK(module->code()->IsJSFunction()); // Instantiated. | 19948 DCHECK(module->instantiated()); |
19949 | |
19950 Isolate* isolate = module->GetIsolate(); | |
19951 | 19949 |
19952 // Each module can only be evaluated once. | 19950 // Each module can only be evaluated once. |
| 19951 Isolate* isolate = module->GetIsolate(); |
19953 if (module->evaluated()) return isolate->factory()->undefined_value(); | 19952 if (module->evaluated()) return isolate->factory()->undefined_value(); |
19954 module->set_evaluated(true); | 19953 Handle<JSFunction> function(JSFunction::cast(module->code()), isolate); |
| 19954 module->set_evaluated(); |
19955 | 19955 |
19956 // Initialization. | 19956 // Initialization. |
19957 Handle<JSFunction> function(JSFunction::cast(module->code()), isolate); | |
19958 DCHECK_EQ(MODULE_SCOPE, function->shared()->scope_info()->scope_type()); | 19957 DCHECK_EQ(MODULE_SCOPE, function->shared()->scope_info()->scope_type()); |
19959 Handle<Object> receiver = isolate->factory()->undefined_value(); | 19958 Handle<Object> receiver = isolate->factory()->undefined_value(); |
19960 Handle<Object> argv[] = {module}; | 19959 Handle<Object> argv[] = {module}; |
19961 Handle<Object> generator; | 19960 Handle<Object> generator; |
19962 ASSIGN_RETURN_ON_EXCEPTION( | 19961 ASSIGN_RETURN_ON_EXCEPTION( |
19963 isolate, generator, | 19962 isolate, generator, |
19964 Execution::Call(isolate, function, receiver, arraysize(argv), argv), | 19963 Execution::Call(isolate, function, receiver, arraysize(argv), argv), |
19965 Object); | 19964 Object); |
19966 | 19965 |
19967 // Recursion. | 19966 // Recursion. |
19968 Handle<FixedArray> requested_modules(module->requested_modules(), isolate); | 19967 Handle<FixedArray> requested_modules(module->requested_modules(), isolate); |
19969 for (int i = 0, length = requested_modules->length(); i < length; ++i) { | 19968 for (int i = 0, length = requested_modules->length(); i < length; ++i) { |
19970 Handle<Module> import(Module::cast(requested_modules->get(i)), isolate); | 19969 Handle<Module> import(Module::cast(requested_modules->get(i)), isolate); |
19971 RETURN_ON_EXCEPTION(isolate, Evaluate(import), Object); | 19970 RETURN_ON_EXCEPTION(isolate, Evaluate(import), Object); |
19972 } | 19971 } |
19973 | 19972 |
19974 // Evaluation of module body. | 19973 // Evaluation of module body. |
19975 Handle<JSFunction> resume( | 19974 Handle<JSFunction> resume( |
19976 isolate->native_context()->generator_next_internal(), isolate); | 19975 isolate->native_context()->generator_next_internal(), isolate); |
19977 return Execution::Call(isolate, resume, generator, 0, nullptr); | 19976 return Execution::Call(isolate, resume, generator, 0, nullptr); |
19978 } | 19977 } |
19979 | 19978 |
19980 namespace { | 19979 namespace { |
19981 | 19980 |
19982 void FetchStarExports(Handle<Module> module, Zone* zone, | 19981 void FetchStarExports(Handle<Module> module, Zone* zone, |
19983 UnorderedModuleSet* visited) { | 19982 UnorderedModuleSet* visited) { |
19984 DCHECK(module->code()->IsJSFunction()); // Instantiated. | 19983 DCHECK(module->instantiated()); |
19985 | 19984 |
19986 bool cycle = !visited->insert(module).second; | 19985 bool cycle = !visited->insert(module).second; |
19987 if (cycle) return; | 19986 if (cycle) return; |
19988 | 19987 |
19989 Isolate* isolate = module->GetIsolate(); | 19988 Isolate* isolate = module->GetIsolate(); |
19990 Handle<ObjectHashTable> exports(module->exports(), isolate); | 19989 Handle<ObjectHashTable> exports(module->exports(), isolate); |
19991 UnorderedStringMap more_exports(zone); | 19990 UnorderedStringMap more_exports(zone); |
19992 | 19991 |
19993 // TODO(neis): Only allocate more_exports if there are star exports. | 19992 // TODO(neis): Only allocate more_exports if there are star exports. |
19994 // Maybe split special_exports into indirect_exports and star_exports. | 19993 // Maybe split special_exports into indirect_exports and star_exports. |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
20105 ns, Accessors::ModuleNamespaceEntryInfo(isolate, name, attr)) | 20104 ns, Accessors::ModuleNamespaceEntryInfo(isolate, name, attr)) |
20106 .Check(); | 20105 .Check(); |
20107 } | 20106 } |
20108 JSObject::PreventExtensions(ns, THROW_ON_ERROR).ToChecked(); | 20107 JSObject::PreventExtensions(ns, THROW_ON_ERROR).ToChecked(); |
20109 | 20108 |
20110 return ns; | 20109 return ns; |
20111 } | 20110 } |
20112 | 20111 |
20113 } // namespace internal | 20112 } // namespace internal |
20114 } // namespace v8 | 20113 } // namespace v8 |
OLD | NEW |