summaryrefslogtreecommitdiff
path: root/core/libdeno/binding.cc
diff options
context:
space:
mode:
Diffstat (limited to 'core/libdeno/binding.cc')
-rw-r--r--core/libdeno/binding.cc34
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