do not emit indexing instructions for single clause subsequences (#1503)
This commit is contained in:
@@ -1130,7 +1130,6 @@ impl<'b> CodeGenerator<'b> {
|
|||||||
if clauses.len() > 1 {
|
if clauses.len() > 1 {
|
||||||
let choice = match i {
|
let choice = match i {
|
||||||
0 => self.settings.internal_try_me_else(clause_code.len() + 1),
|
0 => self.settings.internal_try_me_else(clause_code.len() + 1),
|
||||||
//Instruction::TryMeElse(clause_code.len() + 1),
|
|
||||||
_ if i == clauses.len() - 1 => self.settings.internal_trust_me(),
|
_ if i == clauses.len() - 1 => self.settings.internal_trust_me(),
|
||||||
_ => self.settings.internal_retry_me_else(clause_code.len() + 1),
|
_ => self.settings.internal_retry_me_else(clause_code.len() + 1),
|
||||||
};
|
};
|
||||||
@@ -1152,17 +1151,14 @@ impl<'b> CodeGenerator<'b> {
|
|||||||
skip_stub_try_me_else = !self.settings.is_dynamic();
|
skip_stub_try_me_else = !self.settings.is_dynamic();
|
||||||
}
|
}
|
||||||
|
|
||||||
let arg = match clause.args() {
|
let arg = clause.args().and_then(|args| args.iter().nth(optimal_index));
|
||||||
Some(args) => match args.iter().nth(optimal_index) {
|
|
||||||
Some(term) => Some(term),
|
|
||||||
None => None,
|
|
||||||
},
|
|
||||||
None => None,
|
|
||||||
};
|
|
||||||
|
|
||||||
if let Some(arg) = arg {
|
if let Some(arg) = arg {
|
||||||
let index = code.len();
|
let index = code.len();
|
||||||
code_offsets.index_term(arg, index, &mut clause_index_info, self.atom_tbl);
|
|
||||||
|
if clauses.len() > 1 {
|
||||||
|
code_offsets.index_term(arg, index, &mut clause_index_info, self.atom_tbl);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if !(code_offsets.no_indices() && clauses.len() == 1 && self.settings.is_extensible) {
|
if !(code_offsets.no_indices() && clauses.len() == 1 && self.settings.is_extensible) {
|
||||||
@@ -1182,7 +1178,12 @@ impl<'b> CodeGenerator<'b> {
|
|||||||
code.extend(clause_code.into_iter());
|
code.extend(clause_code.into_iter());
|
||||||
}
|
}
|
||||||
|
|
||||||
let index_code = code_offsets.compute_indices(skip_stub_try_me_else);
|
let index_code = if clauses.len() > 1 {
|
||||||
|
code_offsets.compute_indices(skip_stub_try_me_else)
|
||||||
|
} else {
|
||||||
|
vec![]
|
||||||
|
};
|
||||||
|
|
||||||
self.global_jmp_by_locs_offset = jmp_by_locs_len;
|
self.global_jmp_by_locs_offset = jmp_by_locs_len;
|
||||||
|
|
||||||
if !index_code.is_empty() {
|
if !index_code.is_empty() {
|
||||||
|
|||||||
Reference in New Issue
Block a user