Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 10370c5

Browse filesBrowse files
addaleaxtargos
authored andcommitted
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 <codebytere@gmail.com> Reviewed-By: Michaël Zasso <targos@protonmail.com> Reviewed-By: Richard Lau <rlau@redhat.com>
1 parent ded8335 commit 10370c5
Copy full SHA for 10370c5

File tree

Expand file treeCollapse file tree

4 files changed

+41
-3
lines changed
Open diff view settings
Filter options
Expand file treeCollapse file tree

4 files changed

+41
-3
lines changed
Open diff view settings
Collapse file

‎src/api/environment.cc‎

Copy file name to clipboardExpand all lines: src/api/environment.cc
+3-3Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -655,10 +655,10 @@ void AddLinkedBinding(Environment* env, const node_module& mod) {
655655
CHECK_NOT_NULL(env);
656656
Mutex::ScopedLock lock(env->extra_linked_bindings_mutex());
657657

658-
node_module* prev_head = env->extra_linked_bindings_head();
658+
node_module* prev_tail = env->extra_linked_bindings_tail();
659659
env->extra_linked_bindings()->push_back(mod);
660-
if (prev_head != nullptr)
661-
prev_head->nm_link = &env->extra_linked_bindings()->back();
660+
if (prev_tail != nullptr)
661+
prev_tail->nm_link = &env->extra_linked_bindings()->back();
662662
}
663663

664664
void AddLinkedBinding(Environment* env, const napi_module& mod) {
Collapse file

‎src/env-inl.h‎

Copy file name to clipboardExpand all lines: src/env-inl.h
+5Lines 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
}
Collapse file

‎src/env.h‎

Copy file name to clipboardExpand all lines: src/env.h
+1Lines 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;
Collapse file

‎test/cctest/test_linked_binding.cc‎

Copy file name to clipboardExpand all lines: test/cctest/test_linked_binding.cc
+32Lines 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 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.