Skip to content

Commit cd43073

Browse files
committed
src: fix multiple AddLinkedBinding() calls
Singly-linked lists are extended at their tail, not their head. This fixes using more than 2 linked addons at a time. PR-URL: #39012 Reviewed-By: Shelley Vohr <[email protected]> Reviewed-By: Michaël Zasso <[email protected]> Reviewed-By: Richard Lau <[email protected]>
1 parent 67d4a3f commit cd43073

File tree

4 files changed

+41
-3
lines changed

4 files changed

+41
-3
lines changed

src/api/environment.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -659,10 +659,10 @@ void AddLinkedBinding(Environment* env, const node_module& mod) {
659659
CHECK_NOT_NULL(env);
660660
Mutex::ScopedLock lock(env->extra_linked_bindings_mutex());
661661

662-
node_module* prev_head = env->extra_linked_bindings_head();
662+
node_module* prev_tail = env->extra_linked_bindings_tail();
663663
env->extra_linked_bindings()->push_back(mod);
664-
if (prev_head != nullptr)
665-
prev_head->nm_link = &env->extra_linked_bindings()->back();
664+
if (prev_tail != nullptr)
665+
prev_tail->nm_link = &env->extra_linked_bindings()->back();
666666
}
667667

668668
void AddLinkedBinding(Environment* env, const napi_module& mod) {

src/env-inl.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -930,6 +930,11 @@ inline node_module* Environment::extra_linked_bindings_head() {
930930
&extra_linked_bindings_.front() : nullptr;
931931
}
932932

933+
inline node_module* Environment::extra_linked_bindings_tail() {
934+
return extra_linked_bindings_.size() > 0 ?
935+
&extra_linked_bindings_.back() : nullptr;
936+
}
937+
933938
inline const Mutex& Environment::extra_linked_bindings_mutex() const {
934939
return extra_linked_bindings_mutex_;
935940
}

src/env.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1208,6 +1208,7 @@ class Environment : public MemoryRetainer {
12081208
inline void set_stopping(bool value);
12091209
inline std::list<node_module>* extra_linked_bindings();
12101210
inline node_module* extra_linked_bindings_head();
1211+
inline node_module* extra_linked_bindings_tail();
12111212
inline const Mutex& extra_linked_bindings_mutex() const;
12121213

12131214
inline bool filehandle_close_warning() const;

test/cctest/test_linked_binding.cc

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,3 +190,35 @@ TEST_F(LinkedBindingTest, LocallyDefinedLinkedBindingNapiInstanceDataTest) {
190190
CHECK_EQ(*instance_data, 1);
191191
delete instance_data;
192192
}
193+
194+
TEST_F(LinkedBindingTest, ManyBindingsTest) {
195+
const v8::HandleScope handle_scope(isolate_);
196+
const Argv argv;
197+
Env test_env {handle_scope, argv};
198+
199+
int calls = 0;
200+
AddLinkedBinding(*test_env, "local_linked1", InitializeLocalBinding, &calls);
201+
AddLinkedBinding(*test_env, "local_linked2", InitializeLocalBinding, &calls);
202+
AddLinkedBinding(*test_env, "local_linked3", InitializeLocalBinding, &calls);
203+
AddLinkedBinding(*test_env, local_linked_napi); // Add a N-API addon as well.
204+
AddLinkedBinding(*test_env, "local_linked4", InitializeLocalBinding, &calls);
205+
AddLinkedBinding(*test_env, "local_linked5", InitializeLocalBinding, &calls);
206+
207+
v8::Local<v8::Context> context = isolate_->GetCurrentContext();
208+
209+
const char* run_script =
210+
"for (let i = 1; i <= 5; i++)process._linkedBinding(`local_linked${i}`);"
211+
"process._linkedBinding('local_linked_napi').hello";
212+
v8::Local<v8::Script> script = v8::Script::Compile(
213+
context,
214+
v8::String::NewFromOneByte(isolate_,
215+
reinterpret_cast<const uint8_t*>(run_script))
216+
.ToLocalChecked())
217+
.ToLocalChecked();
218+
v8::Local<v8::Value> completion_value = script->Run(context).ToLocalChecked();
219+
v8::String::Utf8Value utf8val(isolate_, completion_value);
220+
CHECK_NOT_NULL(*utf8val);
221+
CHECK_EQ(strcmp(*utf8val, "world"), 0);
222+
CHECK_EQ(calls, 5);
223+
}
224+

0 commit comments

Comments
 (0)