diff options
author | Ryan Dahl <ry@tinyclouds.org> | 2019-06-10 15:27:34 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-06-10 15:27:34 -0400 |
commit | e0436975211202afadb1a8ccd7d5154694162f38 (patch) | |
tree | a4e864991a109071b32e79ae5ab9624c1228b0a4 /core/libdeno/modules.cc | |
parent | 88b0c8756eef96c8adaff1005d00aae52bd2272c (diff) |
Expose dynamic import in core (#2472)
Diffstat (limited to 'core/libdeno/modules.cc')
-rw-r--r-- | core/libdeno/modules.cc | 19 |
1 files changed, 16 insertions, 3 deletions
diff --git a/core/libdeno/modules.cc b/core/libdeno/modules.cc index 3451a3a69..77b330c3e 100644 --- a/core/libdeno/modules.cc +++ b/core/libdeno/modules.cc @@ -151,13 +151,19 @@ 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) { +void deno_dyn_import(Deno* d_, void* user_data, deno_dyn_import_id import_id, + deno_mod mod_id) { auto* d = unwrap(d_); + deno::UserDataScope user_data_scope(d, user_data); + 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_); + v8::Context::Scope context_scope(context); + + v8::TryCatch try_catch(isolate); auto it = d->dyn_import_map_.find(import_id); if (it == d->dyn_import_map_.end()) { @@ -168,9 +174,13 @@ void deno_dyn_import(Deno* d_, deno_dyn_import_id import_id, deno_mod mod_id) { /// Resolve. auto persistent_promise = &it->second; auto promise = persistent_promise->Get(isolate); - persistent_promise->Reset(); auto* info = d->GetModuleInfo(mod_id); + + // Do the following callback into JS?? Is user_data_scope needed? + persistent_promise->Reset(); + d->dyn_import_map_.erase(it); + if (info == nullptr) { // Resolution error. promise->Reject(context, v8::Null(isolate)).ToChecked(); @@ -181,7 +191,10 @@ void deno_dyn_import(Deno* d_, deno_dyn_import_id import_id, deno_mod mod_id) { Local<Value> module_namespace = module->GetModuleNamespace(); promise->Resolve(context, module_namespace).ToChecked(); } - d->dyn_import_map_.erase(it); + + if (try_catch.HasCaught()) { + HandleException(context, try_catch.Exception()); + } } } // extern "C" |