adjust dynamic external indices upon retraction, reset dynamic_mode to Next regardless of success or failure
This commit is contained in:
@@ -1769,11 +1769,13 @@ impl<'a, LS: LoadState<'a>> Loader<'a, LS> {
|
|||||||
.opt_arg_index_key
|
.opt_arg_index_key
|
||||||
.switch_on_term_loc()
|
.switch_on_term_loc()
|
||||||
{
|
{
|
||||||
Some(index_loc) => find_inner_choice_instr(
|
Some(index_loc) => {
|
||||||
&self.wam_prelude.code,
|
find_inner_choice_instr(
|
||||||
skeleton.clauses[target_pos].clause_start,
|
&self.wam_prelude.code,
|
||||||
index_loc,
|
skeleton.clauses[target_pos].clause_start,
|
||||||
),
|
index_loc,
|
||||||
|
)
|
||||||
|
}
|
||||||
None => skeleton.clauses[target_pos].clause_start,
|
None => skeleton.clauses[target_pos].clause_start,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1033,12 +1033,11 @@ impl Machine {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self.machine_st.dynamic_mode = FirstOrNext::Next;
|
||||||
|
|
||||||
if self.machine_st.fail {
|
if self.machine_st.fail {
|
||||||
self.machine_st.backtrack();
|
self.machine_st.backtrack();
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
self.machine_st.dynamic_mode = FirstOrNext::Next;
|
|
||||||
}
|
}
|
||||||
&Instruction::DynamicInternalElse(..) => {
|
&Instruction::DynamicInternalElse(..) => {
|
||||||
let p = self.machine_st.p;
|
let p = self.machine_st.p;
|
||||||
@@ -1115,12 +1114,11 @@ impl Machine {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self.machine_st.dynamic_mode = FirstOrNext::Next;
|
||||||
|
|
||||||
if self.machine_st.fail {
|
if self.machine_st.fail {
|
||||||
self.machine_st.backtrack();
|
self.machine_st.backtrack();
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
self.machine_st.dynamic_mode = FirstOrNext::Next;
|
|
||||||
}
|
}
|
||||||
&Instruction::TryMeElse(offset) => {
|
&Instruction::TryMeElse(offset) => {
|
||||||
self.machine_st.try_me_else(offset);
|
self.machine_st.try_me_else(offset);
|
||||||
@@ -3129,10 +3127,10 @@ impl Machine {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self.machine_st.dynamic_mode = FirstOrNext::Next;
|
||||||
|
|
||||||
if self.machine_st.fail {
|
if self.machine_st.fail {
|
||||||
self.machine_st.backtrack();
|
self.machine_st.backtrack();
|
||||||
} else {
|
|
||||||
self.machine_st.dynamic_mode = FirstOrNext::Next;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user