From cbcb78f1884c675268cbce700e7d43bfd1b78481 Mon Sep 17 00:00:00 2001 From: Ryan Dahl Date: Thu, 6 Jun 2019 19:07:47 -0400 Subject: libdeno: expose dynamic import (#2461) --- core/libdeno/modules.cc | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'core/libdeno/modules.cc') 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 = info->handle.Get(isolate); + CHECK_GE(module->GetStatus(), v8::Module::kInstantiated); + Local module_namespace = module->GetModuleNamespace(); + promise->Resolve(context, module_namespace).ToChecked(); + } + d->dyn_import_map_.erase(it); +} + } // extern "C" -- cgit v1.2.3