offset SwitchOnTerm's Internal indices only if the proper instructions were emitted
This commit is contained in:
@@ -848,7 +848,7 @@ fn second_level_index<IndexKey: Eq + Hash>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn switch_on<IndexKey: Eq + Hash>(
|
fn switch_on<IndexKey: Eq + Hash>(
|
||||||
instr_fn: impl Fn(IndexMap<IndexKey, IndexingCodePtr>) -> IndexingInstruction,
|
mut instr_fn: impl FnMut(IndexMap<IndexKey, IndexingCodePtr>) -> IndexingInstruction,
|
||||||
index: IndexMap<IndexKey, SliceDeque<IndexedChoiceInstruction>>,
|
index: IndexMap<IndexKey, SliceDeque<IndexedChoiceInstruction>>,
|
||||||
prelude: &mut SliceDeque<IndexingLine>,
|
prelude: &mut SliceDeque<IndexingLine>,
|
||||||
) -> IndexingCodePtr {
|
) -> IndexingCodePtr {
|
||||||
@@ -1083,31 +1083,40 @@ impl CodeOffsets {
|
|||||||
|
|
||||||
let mut prelude = sdeq![];
|
let mut prelude = sdeq![];
|
||||||
|
|
||||||
|
let mut emitted_switch_on_structure = false;
|
||||||
|
let mut emitted_switch_on_constant = false;
|
||||||
|
|
||||||
let mut lst_loc = switch_on_list(self.lists, &mut prelude);
|
let mut lst_loc = switch_on_list(self.lists, &mut prelude);
|
||||||
|
|
||||||
let mut str_loc = switch_on(
|
let mut str_loc = switch_on(
|
||||||
IndexingInstruction::SwitchOnStructure,
|
|index| {
|
||||||
|
emitted_switch_on_structure = true;
|
||||||
|
IndexingInstruction::SwitchOnStructure(index)
|
||||||
|
},
|
||||||
self.structures,
|
self.structures,
|
||||||
&mut prelude,
|
&mut prelude,
|
||||||
);
|
);
|
||||||
|
|
||||||
let con_loc = switch_on(
|
let con_loc = switch_on(
|
||||||
IndexingInstruction::SwitchOnConstant,
|
|index| {
|
||||||
|
emitted_switch_on_constant = true;
|
||||||
|
IndexingInstruction::SwitchOnConstant(index)
|
||||||
|
},
|
||||||
self.constants,
|
self.constants,
|
||||||
&mut prelude,
|
&mut prelude,
|
||||||
);
|
);
|
||||||
|
|
||||||
match &mut str_loc {
|
match &mut str_loc {
|
||||||
IndexingCodePtr::Internal(ref mut i) => {
|
IndexingCodePtr::Internal(ref mut i) => {
|
||||||
*i += con_loc.is_internal() as usize;
|
*i += emitted_switch_on_constant as usize; // con_loc.is_internal() as usize;
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
};
|
};
|
||||||
|
|
||||||
match &mut lst_loc {
|
match &mut lst_loc {
|
||||||
IndexingCodePtr::Internal(ref mut i) => {
|
IndexingCodePtr::Internal(ref mut i) => {
|
||||||
*i += con_loc.is_internal() as usize;
|
*i += emitted_switch_on_constant as usize; // con_loc.is_internal() as usize;
|
||||||
*i += str_loc.is_internal() as usize;
|
*i += emitted_switch_on_structure as usize; // str_loc.is_internal() as usize;
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user