export current predicate for SWI built-ins.

This commit is contained in:
Vítor Santos Costa 2011-02-11 19:01:18 +00:00
parent b041ae00c2
commit 45032cc61e
4 changed files with 38 additions and 1 deletions

View File

@ -1480,7 +1480,9 @@ YAP_Execute(PredEntry *pe, CPredicate exec_code)
for (i=pe->ArityOfPE; i > 0; i--) { for (i=pe->ArityOfPE; i > 0; i--) {
sl = Yap_InitSlot(XREGS[i]); sl = Yap_InitSlot(XREGS[i]);
} }
PP = pe;
ret = ((codev)(sl,0,&ctx)); ret = ((codev)(sl,0,&ctx));
PP = NULL;
if (!ret) { if (!ret) {
Term t; Term t;
@ -1494,7 +1496,9 @@ YAP_Execute(PredEntry *pe, CPredicate exec_code)
return ret; return ret;
} }
if (pe->PredFlags & CArgsPredFlag) { if (pe->PredFlags & CArgsPredFlag) {
PP = pe;
Int out = execute_cargs(pe, exec_code); Int out = execute_cargs(pe, exec_code);
PP = NULL;
if (!out) { if (!out) {
Term t; Term t;
@ -1524,6 +1528,7 @@ YAP_ExecuteFirst(PredEntry *pe, CPredicate exec_code)
CPredicateV codev = (CPredicateV)exec_code; CPredicateV codev = (CPredicateV)exec_code;
struct foreign_context *ctx = (struct foreign_context *)(&EXTRA_CBACK_ARG(pe->ArityOfPE,1)); struct foreign_context *ctx = (struct foreign_context *)(&EXTRA_CBACK_ARG(pe->ArityOfPE,1));
PP = pe;
ctx->control = FRG_FIRST_CALL; ctx->control = FRG_FIRST_CALL;
ctx->engine = NULL; //(PL_local_data *)Yap_regp; ctx->engine = NULL; //(PL_local_data *)Yap_regp;
ctx->context = NULL; ctx->context = NULL;
@ -1532,6 +1537,7 @@ YAP_ExecuteFirst(PredEntry *pe, CPredicate exec_code)
} else { } else {
val = ((codev)((&ARG1)-LCL0,0,ctx)); val = ((codev)((&ARG1)-LCL0,0,ctx));
} }
PP = NULL;
if (val == 0) { if (val == 0) {
Term t; Term t;
@ -1554,7 +1560,7 @@ YAP_ExecuteFirst(PredEntry *pe, CPredicate exec_code)
return TRUE; return TRUE;
} }
} else { } else {
return (exec_code)(); (exec_code)();
} }
} }
@ -1567,12 +1573,14 @@ YAP_ExecuteNext(PredEntry *pe, CPredicate exec_code)
CPredicateV codev = (CPredicateV)exec_code; CPredicateV codev = (CPredicateV)exec_code;
struct foreign_context *ctx = (struct foreign_context *)(&EXTRA_CBACK_ARG(pe->ArityOfPE,1)); struct foreign_context *ctx = (struct foreign_context *)(&EXTRA_CBACK_ARG(pe->ArityOfPE,1));
PP = pe;
ctx->control = FRG_REDO; ctx->control = FRG_REDO;
if (pe->PredFlags & CArgsPredFlag) { if (pe->PredFlags & CArgsPredFlag) {
val = execute_cargs_back(pe, exec_code, ctx); val = execute_cargs_back(pe, exec_code, ctx);
} else { } else {
val = ((codev)((&ARG1)-LCL0,0,ctx)); val = ((codev)((&ARG1)-LCL0,0,ctx));
} }
PP = NULL;
if (val == 0) { if (val == 0) {
Term t; Term t;

View File

@ -48,6 +48,7 @@
#include "swi.h" #include "swi.h"
extern X_API Atom YAP_AtomFromSWIAtom(atom_t at); extern X_API Atom YAP_AtomFromSWIAtom(atom_t at);
extern int PL_error(const char *pred, int arity, const char *msg, int id, ...);
X_API extern Atom X_API extern Atom
YAP_AtomFromSWIAtom(atom_t at) YAP_AtomFromSWIAtom(atom_t at)
@ -2996,6 +2997,26 @@ X_API pl_wchar_t *PL_atom_generator_w(const pl_wchar_t *pref, pl_wchar_t *buffer
return NULL; return NULL;
} }
const char *Yap_GetCurrentPredName(void);
Int Yap_GetCurrentPredArity(void);
const char *
Yap_GetCurrentPredName(void)
{
if (!PP)
return NULL;
if (PP->ArityOfPE)
return NameOfFunctor(PP->FunctorOfPred)->StrOfAE;
return RepAtom((Atom)(PP->FunctorOfPred))->StrOfAE;
}
Int
Yap_GetCurrentPredArity(void)
{
if (!PP)
return (Int)0;
return PP->ArityOfPE;
}
void void
Yap_swi_install(void) Yap_swi_install(void)

View File

@ -379,6 +379,10 @@ X_API int PL_error(const char *pred, int arity, const char *msg, int id, ...)
goto err_instantiation; goto err_instantiation;
} }
va_end(args); va_end(args);
if (!pred) {
pred = Yap_GetCurrentPredName();
arity = Yap_GetCurrentPredArity();
}
if ( pred ) if ( pred )
{ PL_unify_term(predterm, { PL_unify_term(predterm,
PL_FUNCTOR, FUNCTOR_divide2, PL_FUNCTOR, FUNCTOR_divide2,

View File

@ -29,6 +29,10 @@ typedef YAP_Term *Word; /* Anonymous 4 byte object */
typedef YAP_Atom Atom; typedef YAP_Atom Atom;
typedef YAP_Term (*Func)(); /* foreign functions */ typedef YAP_Term (*Func)(); /* foreign functions */
const char *Yap_GetCurrentPredName(void);
YAP_Int Yap_GetCurrentPredArity(void);
extern atom_t codeToAtom(int chrcode); extern atom_t codeToAtom(int chrcode);
#define valTermRef(t) ((Word)YAP_AddressFromSlot(t)) #define valTermRef(t) ((Word)YAP_AddressFromSlot(t))