Skip to content

Commit 03fcd4d

Browse files
committed
fixup! src: add initial support for ESM in embedder API
1 parent 9465a44 commit 03fcd4d

File tree

4 files changed

+57
-81
lines changed

4 files changed

+57
-81
lines changed

src/api/environment.cc

Lines changed: 39 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -573,24 +573,22 @@ NODE_EXTERN std::unique_ptr<InspectorParentHandle> GetInspectorParentHandle(
573573

574574
MaybeLocal<Value> LoadEnvironment(Environment* env,
575575
StartExecutionCallbackWithModule cb,
576-
EmbedderPreloadCallback preload,
577-
void* callback_data) {
576+
EmbedderPreloadCallback preload) {
578577
env->InitializeLibuv();
579578
env->InitializeDiagnostics();
580579
if (preload) {
581580
env->set_embedder_preload(std::move(preload));
582581
}
583582
env->InitializeCompileCache();
584583

585-
return StartExecution(env, cb, callback_data);
584+
return StartExecution(env, cb);
586585
}
587586

588587
struct StartExecutionCallbackInfoWithModule::Impl {
589588
Environment* env = nullptr;
590589
Local<Object> process_object;
591590
Local<Function> native_require;
592591
Local<Function> run_module;
593-
void* data = nullptr;
594592
};
595593

596594
StartExecutionCallbackInfoWithModule::StartExecutionCallbackInfoWithModule()
@@ -606,6 +604,22 @@ StartExecutionCallbackInfoWithModule&
606604
StartExecutionCallbackInfoWithModule::operator=(
607605
StartExecutionCallbackInfoWithModule&&) = default;
608606

607+
Environment* StartExecutionCallbackInfoWithModule::env() const {
608+
return impl_->env;
609+
}
610+
611+
Local<Object> StartExecutionCallbackInfoWithModule::process_object() const {
612+
return impl_->process_object;
613+
}
614+
615+
Local<Function> StartExecutionCallbackInfoWithModule::native_require() const {
616+
return impl_->native_require;
617+
}
618+
619+
Local<Function> StartExecutionCallbackInfoWithModule::run_module() const {
620+
return impl_->run_module;
621+
}
622+
609623
void StartExecutionCallbackInfoWithModule::set_env(Environment* env) {
610624
impl_->env = env;
611625
}
@@ -625,30 +639,6 @@ void StartExecutionCallbackInfoWithModule::set_run_module(
625639
impl_->run_module = run_module;
626640
}
627641

628-
void StartExecutionCallbackInfoWithModule::set_data(void* data) {
629-
impl_->data = data;
630-
}
631-
632-
Environment* StartExecutionCallbackInfoWithModule::env() const {
633-
return impl_->env;
634-
}
635-
636-
Local<Object> StartExecutionCallbackInfoWithModule::process_object() const {
637-
return impl_->process_object;
638-
}
639-
640-
Local<Function> StartExecutionCallbackInfoWithModule::native_require() const {
641-
return impl_->native_require;
642-
}
643-
644-
Local<Function> StartExecutionCallbackInfoWithModule::run_module() const {
645-
return impl_->run_module;
646-
}
647-
648-
void* StartExecutionCallbackInfoWithModule::data() const {
649-
return impl_->data;
650-
}
651-
652642
struct ModuleData::Impl {
653643
std::string_view source;
654644
ModuleFormat format = ModuleFormat::kCommonJS;
@@ -687,46 +677,23 @@ std::string_view ModuleData::resource_name() const {
687677
return impl_->resource_name;
688678
}
689679

690-
struct LegacyModuleData {
691-
StartExecutionCallback cb;
692-
void* callback_data;
693-
};
694-
695680
MaybeLocal<Value> LoadEnvironment(Environment* env,
696681
StartExecutionCallback cb,
697682
EmbedderPreloadCallback preload) {
698-
if (cb == nullptr) {
683+
if (!cb) {
699684
return LoadEnvironment(
700685
env, StartExecutionCallbackWithModule{}, std::move(preload));
701686
}
702687

703688
return LoadEnvironment(
704689
env,
705-
[](const StartExecutionCallbackInfoWithModule& info)
690+
[cb = std::move(cb)](const StartExecutionCallbackInfoWithModule& info)
706691
-> MaybeLocal<Value> {
707-
const StartExecutionCallback* cb =
708-
static_cast<const StartExecutionCallback*>(info.data());
709692
StartExecutionCallbackInfo legacy_info{
710693
info.process_object(), info.native_require(), info.run_module()};
711-
return (*cb)(legacy_info);
694+
return cb(legacy_info);
712695
},
713-
nullptr,
714-
&cb);
715-
}
716-
717-
MaybeLocal<Value> RunModule(const StartExecutionCallbackInfoWithModule& info) {
718-
const ModuleData* data = static_cast<const ModuleData*>(info.data());
719-
Environment* env = info.env();
720-
Local<Context> context = env->context();
721-
Isolate* isolate = env->isolate();
722-
Local<Value> main_script =
723-
ToV8Value(context, data->source()).ToLocalChecked();
724-
Local<Value> format =
725-
v8::Integer::New(isolate, static_cast<int>(data->format()));
726-
Local<Value> resource_name =
727-
ToV8Value(context, data->resource_name()).ToLocalChecked();
728-
Local<Value> args[] = {main_script, format, resource_name};
729-
return info.run_module()->Call(context, Null(isolate), arraysize(args), args);
696+
std::move(preload));
730697
}
731698

732699
MaybeLocal<Value> LoadEnvironment(Environment* env,
@@ -745,7 +712,23 @@ MaybeLocal<Value> LoadEnvironment(Environment* env,
745712
// It could be empty when it's used by SEA to load an empty script.
746713
CHECK_IMPLIES(data->source().size() > 0, data->source().data());
747714
return LoadEnvironment(
748-
env, RunModule, std::move(preload), const_cast<ModuleData*>(data));
715+
env,
716+
[data](const StartExecutionCallbackInfoWithModule& info)
717+
-> MaybeLocal<Value> {
718+
Environment* env = info.env();
719+
Local<Context> context = env->context();
720+
Isolate* isolate = env->isolate();
721+
Local<Value> main_script =
722+
ToV8Value(context, data->source()).ToLocalChecked();
723+
Local<Value> format =
724+
v8::Integer::New(isolate, static_cast<int>(data->format()));
725+
Local<Value> resource_name =
726+
ToV8Value(context, data->resource_name()).ToLocalChecked();
727+
Local<Value> args[] = {main_script, format, resource_name};
728+
return info.run_module()->Call(
729+
context, Null(isolate), arraysize(args), args);
730+
},
731+
std::move(preload));
749732
}
750733

751734
Environment* GetCurrentEnvironment(Local<Context> context) {

src/node.cc

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,7 @@ MaybeLocal<Value> StartExecution(Environment* env, const char* main_script_id) {
258258
// StartExecutionCallbackInfoWithModule. Currently the result is an array
259259
// containing [process, requireFunction, runModule].
260260
std::optional<StartExecutionCallbackInfoWithModule> CallbackInfoFromArray(
261-
Environment* env, Local<Value> result, void* callback_data) {
261+
Environment* env, Local<Value> result) {
262262
CHECK(result->IsArray());
263263
Local<Array> args = result.As<Array>();
264264
CHECK_EQ(args->Length(), 3);
@@ -277,13 +277,11 @@ std::optional<StartExecutionCallbackInfoWithModule> CallbackInfoFromArray(
277277
info.set_process_object(process_obj.As<Object>());
278278
info.set_native_require(require_fn.As<Function>());
279279
info.set_run_module(run_module.As<Function>());
280-
info.set_data(callback_data);
281280
return info;
282281
}
283282

284283
MaybeLocal<Value> StartExecution(Environment* env,
285-
StartExecutionCallbackWithModule cb,
286-
void* callback_data) {
284+
StartExecutionCallbackWithModule cb) {
287285
InternalCallbackScope callback_scope(
288286
env,
289287
Object::New(env->isolate()),
@@ -292,7 +290,7 @@ MaybeLocal<Value> StartExecution(Environment* env,
292290

293291
// Only snapshot builder or embedder applications set the
294292
// callback.
295-
if (cb != nullptr) {
293+
if (cb) {
296294
EscapableHandleScope scope(env->isolate());
297295

298296
Local<Value> result;
@@ -306,9 +304,9 @@ MaybeLocal<Value> StartExecution(Environment* env,
306304
}
307305
}
308306

309-
auto info = CallbackInfoFromArray(env, result, callback_data);
307+
auto info = CallbackInfoFromArray(env, result);
310308
if (!info.has_value()) {
311-
MaybeLocal<Value>();
309+
return MaybeLocal<Value>();
312310
}
313311
#if HAVE_INSPECTOR
314312
if (env->options()->debug_options().break_first_line) {

src/node.h

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -736,14 +736,9 @@ enum class ModuleFormat : uint8_t {
736736
// The layout is opaque to allow future additions without breaking ABI.
737737
class NODE_EXTERN StartExecutionCallbackInfoWithModule {
738738
public:
739+
StartExecutionCallbackInfoWithModule();
739740
~StartExecutionCallbackInfoWithModule();
740741

741-
Environment* env() const;
742-
v8::Local<v8::Object> process_object() const;
743-
v8::Local<v8::Function> native_require() const;
744-
v8::Local<v8::Function> run_module() const;
745-
void* data() const;
746-
747742
StartExecutionCallbackInfoWithModule(
748743
const StartExecutionCallbackInfoWithModule&) = delete;
749744
StartExecutionCallbackInfoWithModule& operator=(
@@ -752,12 +747,15 @@ class NODE_EXTERN StartExecutionCallbackInfoWithModule {
752747
StartExecutionCallbackInfoWithModule& operator=(
753748
StartExecutionCallbackInfoWithModule&&);
754749

755-
StartExecutionCallbackInfoWithModule();
750+
Environment* env() const;
751+
v8::Local<v8::Object> process_object() const;
752+
v8::Local<v8::Function> native_require() const;
753+
v8::Local<v8::Function> run_module() const;
754+
756755
void set_env(Environment* env);
757756
void set_process_object(v8::Local<v8::Object> process_object);
758757
void set_native_require(v8::Local<v8::Function> native_require);
759758
void set_run_module(v8::Local<v8::Function> run_module);
760-
void set_data(void* data);
761759

762760
private:
763761
struct Impl;
@@ -796,8 +794,7 @@ NODE_EXTERN v8::MaybeLocal<v8::Value> LoadEnvironment(
796794
NODE_EXTERN v8::MaybeLocal<v8::Value> LoadEnvironment(
797795
Environment* env,
798796
StartExecutionCallbackWithModule cb,
799-
EmbedderPreloadCallback preload = nullptr,
800-
void* callback_data = nullptr);
797+
EmbedderPreloadCallback preload = nullptr);
801798

802799
NODE_EXTERN v8::MaybeLocal<v8::Value> LoadEnvironment(
803800
Environment* env,
@@ -812,6 +809,11 @@ class NODE_EXTERN ModuleData {
812809
ModuleData();
813810
~ModuleData();
814811

812+
ModuleData(const ModuleData&) = delete;
813+
ModuleData& operator=(const ModuleData&) = delete;
814+
ModuleData(ModuleData&&);
815+
ModuleData& operator=(ModuleData&&);
816+
815817
void set_source(std::string_view source);
816818
void set_format(ModuleFormat format);
817819
void set_resource_name(std::string_view name);
@@ -820,11 +822,6 @@ class NODE_EXTERN ModuleData {
820822
ModuleFormat format() const;
821823
std::string_view resource_name() const;
822824

823-
ModuleData(const ModuleData&) = delete;
824-
ModuleData& operator=(const ModuleData&) = delete;
825-
ModuleData(ModuleData&&);
826-
ModuleData& operator=(ModuleData&&);
827-
828825
private:
829826
struct Impl;
830827
std::unique_ptr<Impl> impl_;

src/node_internals.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -364,9 +364,7 @@ v8::Isolate* NewIsolate(v8::Isolate::CreateParams* params,
364364
// This overload automatically picks the right 'main_script_id' if no callback
365365
// was provided by the embedder.
366366
v8::MaybeLocal<v8::Value> StartExecution(
367-
Environment* env,
368-
StartExecutionCallbackWithModule cb = nullptr,
369-
void* callback_data = nullptr);
367+
Environment* env, StartExecutionCallbackWithModule cb = nullptr);
370368
v8::MaybeLocal<v8::Object> GetPerContextExports(
371369
v8::Local<v8::Context> context, IsolateData* isolate_data = nullptr);
372370
void MarkBootstrapComplete(const v8::FunctionCallbackInfo<v8::Value>& args);

0 commit comments

Comments
 (0)