Include new instruction execute_cpred to perform tail optimisation for
builtins. Required changes: - be careful about creeping in deallocate: it may be followed by something that is not a cut nor a proceed. - include new instruction in absmi.c: it is a merge of execute and call_cpred. - change compiler to generate execute even for C builtins. - be careful with dexecute: it may not be done if execute_op is a C builtin. - if we are in execute_cpred, the garbage collector cannot trust P: instead it must look at CP to find out the size of the current environment. The macro gc_P receives that information. - We don't need to change CP if we do a meta-call from within execute_cpred (and we in fact cannot). Check places where we do meta-calls: exec, clause in cdmgr, and lu_recorded.
This commit is contained in:
@@ -393,7 +393,7 @@ handle_cp_overflow(int res, UInt arity, Term t)
|
||||
XREGS[arity+1] = t;
|
||||
switch(res) {
|
||||
case -1:
|
||||
if (!Yap_gcl((ASP-H)*sizeof(CELL), arity+1, ENV, P)) {
|
||||
if (!Yap_gcl((ASP-H)*sizeof(CELL), arity+1, ENV, gc_P(P,CP))) {
|
||||
Yap_Error(OUT_OF_STACK_ERROR, TermNil, Yap_ErrorMessage);
|
||||
return 0L;
|
||||
}
|
||||
@@ -733,7 +733,7 @@ expand_vts(void)
|
||||
return FALSE;
|
||||
}
|
||||
} else {
|
||||
if (!Yap_gcl(expand, 3, ENV, P)) {
|
||||
if (!Yap_gcl(expand, 3, ENV, gc_P(P,CP))) {
|
||||
Yap_Error(OUT_OF_STACK_ERROR, TermNil, "in term_variables");
|
||||
return FALSE;
|
||||
}
|
||||
@@ -1787,7 +1787,7 @@ p_variant(void) /* variant terms t1 and t2 */
|
||||
}
|
||||
error:
|
||||
if (out == -1) {
|
||||
if (!Yap_gcl((ASP-H)*sizeof(CELL), 2, ENV, P)) {
|
||||
if (!Yap_gcl((ASP-H)*sizeof(CELL), 2, ENV, gc_P(P,CP))) {
|
||||
Yap_Error(OUT_OF_STACK_ERROR, TermNil, "in variant");
|
||||
return FALSE;
|
||||
}
|
||||
|
Reference in New Issue
Block a user