correct inlining calling in last call context
This commit is contained in:
@@ -613,70 +613,8 @@ match_builtins(string, 1).
|
||||
match_builtins(float, 1).
|
||||
match_builtins(nonvar, 1).
|
||||
match_builtins(var, 1).
|
||||
match_builtins(call, 0).
|
||||
match_builtins(call, 1).
|
||||
match_builtins(call, 2).
|
||||
match_builtins(call, 3).
|
||||
match_builtins(call, 4).
|
||||
match_builtins(call, 5).
|
||||
match_builtins(call, 6).
|
||||
match_builtins(call, 7).
|
||||
match_builtins(call, 8).
|
||||
match_builtins(call, 9).
|
||||
match_builtins(call, 10).
|
||||
match_builtins(call, 11).
|
||||
match_builtins(call, 12).
|
||||
match_builtins(call, 13).
|
||||
match_builtins(call, 14).
|
||||
match_builtins(call, 15).
|
||||
match_builtins(call, 16).
|
||||
match_builtins(call, 17).
|
||||
match_builtins(call, 18).
|
||||
match_builtins(call, 19).
|
||||
match_builtins(call, 20).
|
||||
match_builtins(call, 21).
|
||||
match_builtins(call, 22).
|
||||
match_builtins(call, 23).
|
||||
match_builtins(call, 24).
|
||||
match_builtins(call, 25).
|
||||
match_builtins(call, 26).
|
||||
match_builtins(call, 27).
|
||||
match_builtins(call, 28).
|
||||
match_builtins(call, 29).
|
||||
match_builtins(call, 30).
|
||||
match_builtins(call, 31).
|
||||
match_builtins(call, 32).
|
||||
match_builtins(call, 33).
|
||||
match_builtins(call, 34).
|
||||
match_builtins(call, 35).
|
||||
match_builtins(call, 36).
|
||||
match_builtins(call, 37).
|
||||
match_builtins(call, 38).
|
||||
match_builtins(call, 39).
|
||||
match_builtins(call, 40).
|
||||
match_builtins(call, 41).
|
||||
match_builtins(call, 42).
|
||||
match_builtins(call, 43).
|
||||
match_builtins(call, 44).
|
||||
match_builtins(call, 45).
|
||||
match_builtins(call, 46).
|
||||
match_builtins(call, 47).
|
||||
match_builtins(call, 48).
|
||||
match_builtins(call, 49).
|
||||
match_builtins(call, 50).
|
||||
match_builtins(call, 51).
|
||||
match_builtins(call, 52).
|
||||
match_builtins(call, 53).
|
||||
match_builtins(call, 54).
|
||||
match_builtins(call, 55).
|
||||
match_builtins(call, 56).
|
||||
match_builtins(call, 57).
|
||||
match_builtins(call, 58).
|
||||
match_builtins(call, 59).
|
||||
match_builtins(call, 60).
|
||||
match_builtins(call, 61).
|
||||
match_builtins(call, 62).
|
||||
match_builtins(call, 63).
|
||||
match_builtins(call, N) :-
|
||||
between:between(0, 63, N).
|
||||
|
||||
'$iterate_predicate_list'([Name/Arity|Preds], Name/Arity).
|
||||
'$iterate_predicate_list'([_|Preds], Pred) :-
|
||||
|
||||
@@ -86,3 +86,4 @@ maplist(_, [], [], [], [], [], [], [], []).
|
||||
maplist(Cont, [E1|E1s], [E2|E2s], [E3|E3s], [E4|E4s], [E5|E5s], [E6|E6s], [E7|E7s], [E8|E8s]) :-
|
||||
call(Cont, E1, E2, E3, E4, E5, E6, E7),
|
||||
maplist(Cont, E1s, E2s, E3s, E4s, E5s, E6s, E7s, E8s).
|
||||
|
||||
|
||||
@@ -747,8 +747,13 @@ pub(crate) trait CallPolicy: Any {
|
||||
machine_st.setup_built_in_call(built_in.clone());
|
||||
self.call_builtin(machine_st, &built_in, indices)?;
|
||||
},
|
||||
ClauseType::Inlined(inlined) =>
|
||||
machine_st.execute_inlined(&inlined),
|
||||
ClauseType::Inlined(inlined) => {
|
||||
machine_st.execute_inlined(&inlined);
|
||||
|
||||
if machine_st.last_call {
|
||||
machine_st.p = CodePtr::Local(machine_st.cp);
|
||||
}
|
||||
},
|
||||
ClauseType::Op(..) | ClauseType::Named(..) => {
|
||||
let module = name.owning_module();
|
||||
|
||||
|
||||
@@ -1768,7 +1768,7 @@ impl MachineState {
|
||||
let d = self.store(self.deref(self[r1].clone()));
|
||||
|
||||
match d {
|
||||
Addr::Con(Constant::Atom(..)) | Addr::Con(Constant::Char(_)) => {},
|
||||
Addr::Con(Constant::Atom(..)) | Addr::Con(Constant::Char(_)) => self.p += 1,
|
||||
_ => self.fail = true
|
||||
};
|
||||
},
|
||||
@@ -1776,7 +1776,7 @@ impl MachineState {
|
||||
let d = self.store(self.deref(self[r1].clone()));
|
||||
|
||||
match d {
|
||||
Addr::Con(_) => {},
|
||||
Addr::Con(_) => self.p += 1,
|
||||
_ => self.fail = true
|
||||
};
|
||||
},
|
||||
@@ -1784,7 +1784,7 @@ impl MachineState {
|
||||
let d = self.store(self.deref(self[r1].clone()));
|
||||
|
||||
match d {
|
||||
Addr::Con(Constant::Number(Number::Integer(_))) => {},
|
||||
Addr::Con(Constant::Number(Number::Integer(_))) => self.p += 1,
|
||||
_ => self.fail = true
|
||||
};
|
||||
},
|
||||
@@ -1792,7 +1792,7 @@ impl MachineState {
|
||||
let d = self.store(self.deref(self[r1].clone()));
|
||||
|
||||
match d {
|
||||
Addr::Str(_) | Addr::Lis(_) => {},
|
||||
Addr::Str(_) | Addr::Lis(_) => self.p += 1,
|
||||
_ => self.fail = true
|
||||
};
|
||||
},
|
||||
@@ -1800,7 +1800,7 @@ impl MachineState {
|
||||
let d = self.store(self.deref(self[r1].clone()));
|
||||
|
||||
match d {
|
||||
Addr::Con(Constant::Number(Number::Float(_))) => {},
|
||||
Addr::Con(Constant::Number(Number::Float(_))) => self.p += 1,
|
||||
_ => self.fail = true
|
||||
};
|
||||
},
|
||||
@@ -1808,7 +1808,7 @@ impl MachineState {
|
||||
let d = self.store(self.deref(self[r1].clone()));
|
||||
|
||||
match d {
|
||||
Addr::Con(Constant::Number(Number::Rational(_))) => {},
|
||||
Addr::Con(Constant::Number(Number::Rational(_))) => self.p += 1,
|
||||
_ => self.fail = true
|
||||
};
|
||||
},
|
||||
@@ -1816,7 +1816,7 @@ impl MachineState {
|
||||
let d = self.store(self.deref(self[r1].clone()));
|
||||
|
||||
match d {
|
||||
Addr::Con(Constant::String(_)) => {},
|
||||
Addr::Con(Constant::String(_)) => self.p += 1,
|
||||
_ => self.fail = true
|
||||
};
|
||||
},
|
||||
@@ -1825,14 +1825,14 @@ impl MachineState {
|
||||
|
||||
match d {
|
||||
Addr::AttrVar(_) | Addr::HeapCell(_) | Addr::StackCell(..) => self.fail = true,
|
||||
_ => {}
|
||||
_ => self.p += 1
|
||||
};
|
||||
},
|
||||
&InlinedClauseType::IsVar(r1) => {
|
||||
let d = self.store(self.deref(self[r1].clone()));
|
||||
|
||||
match d {
|
||||
Addr::AttrVar(_) | Addr::HeapCell(_) | Addr::StackCell(_,_) => {},
|
||||
Addr::AttrVar(_) | Addr::HeapCell(_) | Addr::StackCell(_,_) => self.p += 1,
|
||||
_ => self.fail = true
|
||||
};
|
||||
},
|
||||
@@ -1840,13 +1840,11 @@ impl MachineState {
|
||||
let d = self.store(self.deref(self[r1].clone()));
|
||||
|
||||
match d {
|
||||
Addr::Con(Constant::String(ref s)) if s.is_expandable() => {},
|
||||
Addr::Con(Constant::String(ref s)) if s.is_expandable() => self.p += 1,
|
||||
_ => self.fail = true
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
self.set_p();
|
||||
}
|
||||
|
||||
fn try_functor_unify_components(&mut self, name: Addr, arity: Addr) {
|
||||
@@ -2208,8 +2206,13 @@ impl MachineState {
|
||||
try_or_fail!(self, call_policy.call_n(self, arity, indices)),
|
||||
&ClauseType::Hook(ref hook) =>
|
||||
try_or_fail!(self, call_policy.compile_hook(self, hook)),
|
||||
&ClauseType::Inlined(ref ct) =>
|
||||
self.execute_inlined(ct),
|
||||
&ClauseType::Inlined(ref ct) => {
|
||||
self.execute_inlined(ct);
|
||||
|
||||
if lco {
|
||||
self.p = CodePtr::Local(self.cp);
|
||||
}
|
||||
},
|
||||
&ClauseType::Named(ref name, _, ref idx) | &ClauseType::Op(OpDecl(.., ref name), ref idx) =>
|
||||
try_or_fail!(self, call_policy.context_call(self, name.clone(), arity, idx.clone(),
|
||||
indices)),
|
||||
|
||||
@@ -186,7 +186,7 @@ impl MachineState {
|
||||
pub(super)
|
||||
fn set_p(&mut self) {
|
||||
if self.last_call {
|
||||
self.p = CodePtr::Local(self.cp.clone());
|
||||
self.p = CodePtr::Local(self.cp);
|
||||
} else {
|
||||
self.p += 1;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user