diff options
Diffstat (limited to 'core/libdeno/modules.cc')
-rw-r--r-- | core/libdeno/modules.cc | 33 |
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" |