Revert "ENV may not be in scope of catch in very special cases (eg, call counter)."
This reverts commit 15f9a68a35480a054d74c2a96e8047da6aa662b7. Botch!
This commit is contained in:
parent
15f9a68a35
commit
69c0a52548
63
C/exec.c
63
C/exec.c
@ -1570,36 +1570,49 @@ JumpToEnv(Term t) {
|
|||||||
if (!(t = Yap_SaveTerm(t)))
|
if (!(t = Yap_SaveTerm(t)))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
/* find the first choicepoint that may be a catch */
|
do {
|
||||||
while (B != NULL && B->cp_ap != pos) {
|
/* find the first choicepoint that may be a catch */
|
||||||
/* we are already doing a catch */
|
while (B != NULL && B->cp_ap != pos) {
|
||||||
if (B->cp_ap == catchpos) {
|
/* we are already doing a catch */
|
||||||
P = (yamop *)FAILCODE;
|
if (B->cp_ap == catchpos) {
|
||||||
if (first_func != NULL) {
|
P = (yamop *)FAILCODE;
|
||||||
B = first_func;
|
if (first_func != NULL) {
|
||||||
|
B = first_func;
|
||||||
|
}
|
||||||
|
return(FALSE);
|
||||||
}
|
}
|
||||||
return(FALSE);
|
if (B->cp_ap == NOCODE) {
|
||||||
|
/* up to the C-code to deal with this! */
|
||||||
|
UncaughtThrow = TRUE;
|
||||||
|
B->cp_h = H;
|
||||||
|
EX = t;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
B = B->cp_b;
|
||||||
}
|
}
|
||||||
if (B->cp_ap == NOCODE) {
|
/* uncaught throw */
|
||||||
/* up to the C-code to deal with this! */
|
if (B == NULL) {
|
||||||
UncaughtThrow = TRUE;
|
UncaughtThrow = TRUE;
|
||||||
B->cp_h = H;
|
B = B0;
|
||||||
EX = t;
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
B = B->cp_b;
|
|
||||||
}
|
|
||||||
/* uncaught throw */
|
|
||||||
if (B == NULL) {
|
|
||||||
UncaughtThrow = TRUE;
|
|
||||||
B = B0;
|
|
||||||
#if PUSH_REGS
|
#if PUSH_REGS
|
||||||
restore_absmi_regs(&Yap_standard_regs);
|
restore_absmi_regs(&Yap_standard_regs);
|
||||||
#endif
|
#endif
|
||||||
siglongjmp(Yap_RestartEnv,1);
|
siglongjmp(Yap_RestartEnv,1);
|
||||||
}
|
}
|
||||||
/* is it a continuation? */
|
/* is it a continuation? */
|
||||||
env = ENV = B->cp_env;
|
env = B->cp_env;
|
||||||
|
while (env > ENV) {
|
||||||
|
ENV = ENV_Parent(ENV);
|
||||||
|
}
|
||||||
|
/* yes, we found it ! */
|
||||||
|
// while (env < ENV)
|
||||||
|
// env = ENV_Parent(env);
|
||||||
|
if (env == ENV) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* oops, try next */
|
||||||
|
B = B->cp_b;
|
||||||
|
} while (TRUE);
|
||||||
/* step one environment above, otherwise we'll redo the original goal */
|
/* step one environment above, otherwise we'll redo the original goal */
|
||||||
B->cp_cp = (yamop *)env[E_CP];
|
B->cp_cp = (yamop *)env[E_CP];
|
||||||
B->cp_env = (CELL *)env[E_E];
|
B->cp_env = (CELL *)env[E_E];
|
||||||
|
Reference in New Issue
Block a user