@@ -128,13 +128,26 @@ class EnvironmentInstanceData {
128
128
std::unique_ptr<node::CommonEnvironmentSetup>&& setup)
129
129
: setup_(std::move(setup)),
130
130
locker(setup_->isolate ()),
131
- isolate_scope(setup_->isolate ()) {}
131
+ isolate_scope(setup_->isolate ()),
132
+ handle_scope(setup_->isolate ()),
133
+ context_scope(setup_->context ()),
134
+ seal_scope(nullptr ) {}
132
135
node::CommonEnvironmentSetup* setup () { return setup_.get (); }
136
+ inline void seal () {
137
+ seal_scope =
138
+ std::make_unique<node::DebugSealHandleScope>(setup_->isolate ());
139
+ }
133
140
134
141
private:
135
142
std::unique_ptr<node::CommonEnvironmentSetup> setup_;
136
143
v8::Locker locker;
137
144
v8::Isolate::Scope isolate_scope;
145
+ v8::HandleScope handle_scope;
146
+ v8::Context::Scope context_scope;
147
+ // As this handle scope will remain open for the lifetime
148
+ // of the environment, we seal it to prevent it from
149
+ // becoming everyone's favorite trash bin
150
+ std::unique_ptr<node::DebugSealHandleScope> seal_scope;
138
151
};
139
152
140
153
class HandleScopeWrapper {
@@ -869,32 +882,30 @@ napi_status NAPI_CDECL napi_create_environment(napi_platform platform,
869
882
auto wrapper = reinterpret_cast <v8impl::PlatformWrapper*>(platform);
870
883
std::vector<std::string> errors_vec;
871
884
872
- auto instance_data = new v8impl::EnvironmentInstanceData (
873
- node::CommonEnvironmentSetup::Create (wrapper->platform .get (),
874
- &errors_vec,
875
- wrapper->args ,
876
- wrapper->exec_args ));
877
-
878
- if (instance_data->setup () == nullptr ) {
885
+ auto setup = node::CommonEnvironmentSetup::Create (
886
+ wrapper->platform .get (),
887
+ &errors_vec,
888
+ wrapper->args ,
889
+ wrapper->exec_args );
890
+ if (setup == nullptr ) {
879
891
HANDLE_ERRORS_VECTOR (errors, errors_vec);
880
892
return napi_generic_failure;
881
893
}
882
-
883
- v8::HandleScope handle_scope (instance_data->setup ()->isolate ());
884
- v8::Local<v8::Context> context = instance_data->setup ()->context ();
885
- v8::Context::Scope context_scope (context);
894
+ auto instance_data = new v8impl::EnvironmentInstanceData (std::move (setup));
886
895
887
896
v8::MaybeLocal<v8::Value> loadenv_ret =
888
897
node::LoadEnvironment (instance_data->setup ()->env (), main_script);
889
898
890
899
std::string filename =
891
900
wrapper->args .size () > 1 ? wrapper->args [1 ] : " <internal>" ;
892
- auto env__ = new node_napi_env__ (context, filename);
901
+ auto env__ =
902
+ new node_napi_env__ (instance_data->setup ()->context (), filename);
893
903
env__->instance_data = reinterpret_cast <void *>(instance_data);
894
904
env__->node_env ()->AddCleanupHook (
895
905
[](void * arg) { static_cast <napi_env>(arg)->Unref (); },
896
906
static_cast <void *>(env__));
897
907
*result = env__;
908
+ instance_data->seal ();
898
909
899
910
if (loadenv_ret.IsEmpty ()) return napi_pending_exception;
900
911
return napi_ok;
0 commit comments