inference count call_inline, fail on undefined index
This commit is contained in:
@@ -5014,6 +5014,11 @@ impl Machine {
|
|||||||
|
|
||||||
if self.machine_st.fail {
|
if self.machine_st.fail {
|
||||||
self.machine_st.backtrack();
|
self.machine_st.backtrack();
|
||||||
|
} else {
|
||||||
|
try_or_throw!(
|
||||||
|
self.machine_st,
|
||||||
|
(self.machine_st.increment_call_count_fn)(&mut self.machine_st)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
&Instruction::ExecuteInlineCallN(arity, _) => {
|
&Instruction::ExecuteInlineCallN(arity, _) => {
|
||||||
@@ -5025,6 +5030,11 @@ impl Machine {
|
|||||||
|
|
||||||
if self.machine_st.fail {
|
if self.machine_st.fail {
|
||||||
self.machine_st.backtrack();
|
self.machine_st.backtrack();
|
||||||
|
} else {
|
||||||
|
try_or_throw!(
|
||||||
|
self.machine_st,
|
||||||
|
(self.machine_st.increment_call_count_fn)(&mut self.machine_st)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -166,15 +166,6 @@ impl CodeIndex {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#[inline(always)]
|
|
||||||
pub(crate) fn is_dynamic_undefined(&self) -> bool {
|
|
||||||
match self.0.tag() {
|
|
||||||
IndexPtrTag::DynamicUndefined => true,
|
|
||||||
_ => false,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(crate) fn local(&self) -> Option<usize> {
|
pub(crate) fn local(&self) -> Option<usize> {
|
||||||
match self.0.tag() {
|
match self.0.tag() {
|
||||||
IndexPtrTag::Index => Some(self.0.p() as usize),
|
IndexPtrTag::Index => Some(self.0.p() as usize),
|
||||||
|
|||||||
@@ -1018,7 +1018,7 @@ impl Machine {
|
|||||||
let index_cell = self.machine_st.heap[s+goal_arity+1];
|
let index_cell = self.machine_st.heap[s+goal_arity+1];
|
||||||
|
|
||||||
if let Some(code_index) = get_structure_index(index_cell) {
|
if let Some(code_index) = get_structure_index(index_cell) {
|
||||||
if code_index.is_undefined() || code_index.is_dynamic_undefined() {
|
if code_index.is_undefined() {
|
||||||
self.machine_st.fail = true;
|
self.machine_st.fail = true;
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user