| 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 |