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 19886 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
19897 if (ResolveExport(module, Handle<String>::cast(name), true, &resolve_set) | 19897 if (ResolveExport(module, Handle<String>::cast(name), true, &resolve_set) |
19898 .is_null()) { | 19898 .is_null()) { |
19899 return false; | 19899 return false; |
19900 } | 19900 } |
19901 } | 19901 } |
19902 | 19902 |
19903 return true; | 19903 return true; |
19904 } | 19904 } |
19905 | 19905 |
19906 MaybeHandle<Object> Module::Evaluate(Handle<Module> module) { | 19906 MaybeHandle<Object> Module::Evaluate(Handle<Module> module) { |
19907 DCHECK(module->code()->IsJSFunction()); | 19907 DCHECK(module->code()->IsJSFunction()); // Instantiated. |
19908 | 19908 |
19909 Isolate* isolate = module->GetIsolate(); | 19909 Isolate* isolate = module->GetIsolate(); |
19910 | 19910 |
19911 // Each module can only be evaluated once. | 19911 // Each module can only be evaluated once. |
19912 if (module->evaluated()) return isolate->factory()->undefined_value(); | 19912 if (module->evaluated()) return isolate->factory()->undefined_value(); |
19913 module->set_evaluated(true); | 19913 module->set_evaluated(true); |
19914 | 19914 |
| 19915 // Initialization. |
| 19916 Handle<JSFunction> function(JSFunction::cast(module->code()), isolate); |
| 19917 DCHECK_EQ(MODULE_SCOPE, function->shared()->scope_info()->scope_type()); |
| 19918 Handle<Object> receiver = isolate->factory()->undefined_value(); |
| 19919 Handle<Object> argv[] = {module}; |
| 19920 Handle<Object> generator; |
| 19921 ASSIGN_RETURN_ON_EXCEPTION( |
| 19922 isolate, generator, |
| 19923 Execution::Call(isolate, function, receiver, arraysize(argv), argv), |
| 19924 Object); |
| 19925 |
| 19926 // Recursion. |
19915 Handle<FixedArray> requested_modules(module->requested_modules(), isolate); | 19927 Handle<FixedArray> requested_modules(module->requested_modules(), isolate); |
19916 for (int i = 0, length = requested_modules->length(); i < length; ++i) { | 19928 for (int i = 0, length = requested_modules->length(); i < length; ++i) { |
19917 Handle<Module> import(Module::cast(requested_modules->get(i)), isolate); | 19929 Handle<Module> import(Module::cast(requested_modules->get(i)), isolate); |
19918 RETURN_ON_EXCEPTION(isolate, Evaluate(import), Object); | 19930 RETURN_ON_EXCEPTION(isolate, Evaluate(import), Object); |
19919 } | 19931 } |
19920 | 19932 |
19921 Handle<JSFunction> function(JSFunction::cast(module->code()), isolate); | 19933 // Evaluation of module body. |
19922 DCHECK_EQ(MODULE_SCOPE, function->shared()->scope_info()->scope_type()); | 19934 Handle<JSFunction> resume( |
19923 Handle<Object> receiver = isolate->factory()->undefined_value(); | 19935 isolate->native_context()->generator_prototype_next(), isolate); |
19924 Handle<Object> argv[] = {module}; | 19936 return Execution::Call(isolate, resume, generator, 0, nullptr); |
19925 return Execution::Call(isolate, function, receiver, arraysize(argv), argv); | |
19926 } | 19937 } |
19927 | 19938 |
19928 } // namespace internal | 19939 } // namespace internal |
19929 } // namespace v8 | 19940 } // namespace v8 |
OLD | NEW |