diff options
author | Ryan Dahl <ry@tinyclouds.org> | 2019-06-06 19:07:47 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-06-06 19:07:47 -0400 |
commit | cbcb78f1884c675268cbce700e7d43bfd1b78481 (patch) | |
tree | 493224e763c787a59b74cece0f87d74637a78e96 /core/libdeno/binding.cc | |
parent | 341150266eef10b005388db4210571554bb4b931 (diff) |
libdeno: expose dynamic import (#2461)
Diffstat (limited to 'core/libdeno/binding.cc')
-rw-r--r-- | core/libdeno/binding.cc | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/core/libdeno/binding.cc b/core/libdeno/binding.cc index 8001534ff..4aeb6003a 100644 --- a/core/libdeno/binding.cc +++ b/core/libdeno/binding.cc @@ -509,6 +509,38 @@ void HostInitializeImportMetaObjectCallback(v8::Local<v8::Context> context, meta->CreateDataProperty(context, v8_str("main"), v8_bool(main)).ToChecked(); } +v8::MaybeLocal<v8::Promise> HostImportModuleDynamicallyCallback( + v8::Local<v8::Context> context, v8::Local<v8::ScriptOrModule> referrer, + v8::Local<v8::String> specifier) { + auto* isolate = context->GetIsolate(); + DenoIsolate* d = DenoIsolate::FromIsolate(isolate); + v8::Isolate::Scope isolate_scope(isolate); + + v8::String::Utf8Value specifier_str(isolate, specifier); + + auto referrer_name = referrer->GetResourceName(); + v8::String::Utf8Value referrer_name_str(isolate, referrer_name); + + // TODO(ry) I'm not sure what HostDefinedOptions is for or if we're ever going + // to use it. For now we check that it is not used. This check may need to be + // changed in the future. + auto host_defined_options = referrer->GetHostDefinedOptions(); + CHECK_EQ(host_defined_options->Length(), 0); + + v8::Local<v8::Promise::Resolver> resolver = + v8::Promise::Resolver::New(context).ToLocalChecked(); + + deno_dyn_import_id import_id = d->next_dyn_import_id_++; + + d->dyn_import_map_.emplace(std::piecewise_construct, + std::make_tuple(import_id), + std::make_tuple(d->isolate_, resolver)); + + d->dyn_import_cb_(d->user_data_, *specifier_str, *referrer_name_str, + import_id); + return resolver->GetPromise(); +} + void DenoIsolate::AddIsolate(v8::Isolate* isolate) { isolate_ = isolate; isolate_->SetCaptureStackTraceForUncaughtExceptions( @@ -518,6 +550,8 @@ void DenoIsolate::AddIsolate(v8::Isolate* isolate) { isolate_->AddMessageListener(MessageCallback); isolate->SetHostInitializeImportMetaObjectCallback( HostInitializeImportMetaObjectCallback); + isolate->SetHostImportModuleDynamicallyCallback( + HostImportModuleDynamicallyCallback); } } // namespace deno |