summaryrefslogtreecommitdiff
path: root/core/libdeno/modules.cc
diff options
context:
space:
mode:
authorRyan Dahl <ry@tinyclouds.org>2019-06-06 19:07:47 -0400
committerGitHub <noreply@github.com>2019-06-06 19:07:47 -0400
commitcbcb78f1884c675268cbce700e7d43bfd1b78481 (patch)
tree493224e763c787a59b74cece0f87d74637a78e96 /core/libdeno/modules.cc
parent341150266eef10b005388db4210571554bb4b931 (diff)
libdeno: expose dynamic import (#2461)
Diffstat (limited to 'core/libdeno/modules.cc')
-rw-r--r--core/libdeno/modules.cc33
1 files changed, 33 insertions, 0 deletions
diff --git a/core/libdeno/modules.cc b/core/libdeno/modules.cc
index 0b408aec8..3451a3a69 100644
--- a/core/libdeno/modules.cc
+++ b/core/libdeno/modules.cc
@@ -151,4 +151,37 @@ void deno_mod_evaluate(Deno* d_, void* user_data, deno_mod id) {
}
}
+void deno_dyn_import(Deno* d_, deno_dyn_import_id import_id, deno_mod mod_id) {
+ auto* d = unwrap(d_);
+ auto* isolate = d->isolate_;
+ v8::Isolate::Scope isolate_scope(isolate);
+ v8::Locker locker(isolate);
+ v8::HandleScope handle_scope(isolate);
+ auto context = d->context_.Get(d->isolate_);
+
+ auto it = d->dyn_import_map_.find(import_id);
+ if (it == d->dyn_import_map_.end()) {
+ CHECK(false); // TODO(ry) error on bad import_id.
+ return;
+ }
+
+ /// Resolve.
+ auto persistent_promise = &it->second;
+ auto promise = persistent_promise->Get(isolate);
+ persistent_promise->Reset();
+
+ auto* info = d->GetModuleInfo(mod_id);
+ if (info == nullptr) {
+ // Resolution error.
+ promise->Reject(context, v8::Null(isolate)).ToChecked();
+ } else {
+ // Resolution success
+ Local<Module> module = info->handle.Get(isolate);
+ CHECK_GE(module->GetStatus(), v8::Module::kInstantiated);
+ Local<Value> module_namespace = module->GetModuleNamespace();
+ promise->Resolve(context, module_namespace).ToChecked();
+ }
+ d->dyn_import_map_.erase(it);
+}
+
} // extern "C"