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
|
||||
.switch_on_term_loc()
|
||||
{
|
||||
Some(index_loc) => find_inner_choice_instr(
|
||||
&self.wam_prelude.code,
|
||||
skeleton.clauses[target_pos].clause_start,
|
||||
index_loc,
|
||||
),
|
||||
Some(index_loc) => {
|
||||
find_inner_choice_instr(
|
||||
&self.wam_prelude.code,
|
||||
skeleton.clauses[target_pos].clause_start,
|
||||
index_loc,
|
||||
)
|
||||
}
|
||||
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 {
|
||||
self.machine_st.backtrack();
|
||||
continue;
|
||||
}
|
||||
|
||||
self.machine_st.dynamic_mode = FirstOrNext::Next;
|
||||
}
|
||||
&Instruction::DynamicInternalElse(..) => {
|
||||
let p = self.machine_st.p;
|
||||
@@ -1115,12 +1114,11 @@ impl Machine {
|
||||
}
|
||||
}
|
||||
|
||||
self.machine_st.dynamic_mode = FirstOrNext::Next;
|
||||
|
||||
if self.machine_st.fail {
|
||||
self.machine_st.backtrack();
|
||||
continue;
|
||||
}
|
||||
|
||||
self.machine_st.dynamic_mode = FirstOrNext::Next;
|
||||
}
|
||||
&Instruction::TryMeElse(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 {
|
||||
self.machine_st.backtrack();
|
||||
} else {
|
||||
self.machine_st.dynamic_mode = FirstOrNext::Next;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user