From 6cedbc33c05fc430e85d7e0dc765b07881ee78c2 Mon Sep 17 00:00:00 2001 From: Emilie Burgun Date: Tue, 7 Jan 2025 17:59:13 +0100 Subject: [PATCH 1/2] Fix load_context_module triggering unreachable code in unify_atom --- src/machine/dispatch.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/machine/dispatch.rs b/src/machine/dispatch.rs index f77f7f0f..635de289 100644 --- a/src/machine/dispatch.rs +++ b/src/machine/dispatch.rs @@ -4812,11 +4812,11 @@ impl Machine { step_or_fail!(self, self.machine_st.p = self.machine_st.cp); } &Instruction::CallLoadContextModule => { - self.load_context_module(self.machine_st.registers[1]); + self.load_context_module(self.deref_register(1)); step_or_fail!(self, self.machine_st.p += 1); } &Instruction::ExecuteLoadContextModule => { - self.load_context_module(self.machine_st.registers[1]); + self.load_context_module(self.deref_register(1)); step_or_fail!(self, self.machine_st.p = self.machine_st.cp); } &Instruction::CallLoadContextStream => { From eff094cc2906f830b1a8c306d5fc9aa34b893bbc Mon Sep 17 00:00:00 2001 From: Emilie Burgun Date: Tue, 7 Jan 2025 18:10:50 +0100 Subject: [PATCH 2/2] Add tests for PR #2756 --- tests-pl/load-context-unreachable.pl | 1 + tests/scryer/issues.rs | 8 ++++++++ 2 files changed, 9 insertions(+) create mode 100644 tests-pl/load-context-unreachable.pl diff --git a/tests-pl/load-context-unreachable.pl b/tests-pl/load-context-unreachable.pl new file mode 100644 index 00000000..5a0f2782 --- /dev/null +++ b/tests-pl/load-context-unreachable.pl @@ -0,0 +1 @@ +:- initialization((M = user, loader:load_context(M))). diff --git a/tests/scryer/issues.rs b/tests/scryer/issues.rs index de318708..207c4909 100644 --- a/tests/scryer/issues.rs +++ b/tests/scryer/issues.rs @@ -25,3 +25,11 @@ fn issue2588_load_html() { fn call_qualification() { load_module_test("tests-pl/issue2361-call-qualified.pl", ""); } + +// PR #2756: ensures that calling load_context with a bound variable doesn't trigger unreachable!() +#[serial] +#[test] +#[cfg_attr(miri, ignore = "it takes too long to run")] +fn load_context_unreachable() { + load_module_test("tests-pl/load-context-unreachable.pl", ""); +}