fixes
This commit is contained in:
parent
29f79473e5
commit
bde725e016
111
C/c_interface.c
111
C/c_interface.c
@ -1801,67 +1801,16 @@ X_API bool YAP_RetryGoal(YAP_dogoalinfo *dgi) {
|
|||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
X_API bool YAP_LeaveGoal(bool successful, YAP_dogoalinfo *dgi) {
|
static void completeInnerCall( bool on_cut, yamop *old_CP, yamop *old_P)
|
||||||
CACHE_REGS
|
{
|
||||||
choiceptr myB, handler;
|
if (on_cut) {
|
||||||
|
P = old_P;
|
||||||
// fprintf(stderr,"LeaveGoal success=%d: H=%d ENV=%p B=%ld myB=%ld TR=%d P=%p CP=%p Slots=%d\n", successful,HR-H0,LCL0-ENV,LCL0-(CELL*)B,dgi->b0,(CELL*)TR-LCL0, P, CP, LOCAL_CurSlot);
|
|
||||||
BACKUP_MACHINE_REGS();
|
|
||||||
myB = (choiceptr)(LCL0 - dgi->b0);
|
|
||||||
handler = B;
|
|
||||||
while (handler
|
|
||||||
//&& LOCAL_CBorder > LCL0 - (CELL *)handler
|
|
||||||
//&& handler->cp_ap != NOCODE
|
|
||||||
&& handler->cp_b != NULL
|
|
||||||
&& handler != myB
|
|
||||||
) {
|
|
||||||
handler->cp_ap = TRUSTFAILCODE;
|
|
||||||
handler = handler->cp_b;
|
|
||||||
}
|
|
||||||
if (LOCAL_PrologMode & AsyncIntMode) {
|
|
||||||
Yap_signal(YAP_FAIL_SIGNAL);
|
|
||||||
}
|
|
||||||
B = handler;
|
|
||||||
if (successful) {
|
|
||||||
Yap_TrimTrail();
|
|
||||||
CP = dgi->cp;
|
|
||||||
P = dgi->p;
|
|
||||||
} else {
|
|
||||||
Yap_exec_absmi(true, YAP_EXEC_ABSMI);
|
|
||||||
LOCAL_CurSlot = dgi->CurSlot;
|
|
||||||
ENV = YENV = B->cp_env;
|
|
||||||
HR = B->cp_h;
|
|
||||||
TR = B->cp_tr;
|
|
||||||
// use the current choicepoint
|
|
||||||
// B=B->cp_b;
|
|
||||||
ASP=(CELL*)B;
|
|
||||||
}
|
|
||||||
RECOVER_MACHINE_REGS();
|
|
||||||
// fprintf(stderr,"LeftGoal success=%d: H=%d ENV=%p B=%d TR=%d P=%p CP=%p Slots=%d\n", successful,HR-H0,LCL0-ENV,LCL0-(CELL*)B,(CELL*)TR-LCL0, P, CP, LOCAL_CurSlot);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
X_API Int YAP_RunGoal(Term t) {
|
|
||||||
CACHE_REGS
|
|
||||||
Term out;
|
|
||||||
yamop *old_CP = CP;
|
|
||||||
yhandle_t cslot = LOCAL_CurSlot;
|
|
||||||
BACKUP_MACHINE_REGS();
|
|
||||||
|
|
||||||
LOCAL_AllowRestart = FALSE;
|
|
||||||
LOCAL_PrologMode = UserMode;
|
|
||||||
out = Yap_RunTopGoal(t, true);
|
|
||||||
LOCAL_PrologMode = UserCCallMode;
|
|
||||||
// should we catch the exception or pass it through?
|
|
||||||
// We'll pass it through
|
|
||||||
Yap_RaiseException();
|
|
||||||
if (out) {
|
|
||||||
P = (yamop *)ENV[E_CP];
|
|
||||||
ENV = (CELL *)ENV[E_E];
|
ENV = (CELL *)ENV[E_E];
|
||||||
CP = old_CP;
|
CP = old_CP;
|
||||||
LOCAL_AllowRestart = TRUE;
|
LOCAL_AllowRestart = TRUE;
|
||||||
// we are back to user code again, need slots */
|
// we are back to user code again, need slots */
|
||||||
} else {
|
} else {
|
||||||
|
P = old_P;
|
||||||
ENV = B->cp_env;
|
ENV = B->cp_env;
|
||||||
ENV = (CELL *)ENV[E_E];
|
ENV = (CELL *)ENV[E_E];
|
||||||
CP = old_CP;
|
CP = old_CP;
|
||||||
@ -1872,6 +1821,56 @@ X_API Int YAP_RunGoal(Term t) {
|
|||||||
SET_ASP(ENV, E_CB * sizeof(CELL));
|
SET_ASP(ENV, E_CB * sizeof(CELL));
|
||||||
// make sure the slots are ok.
|
// make sure the slots are ok.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
X_API bool YAP_LeaveGoal(bool on_cut, YAP_dogoalinfo *dgi) {
|
||||||
|
CACHE_REGS
|
||||||
|
choiceptr myB, handler;
|
||||||
|
|
||||||
|
// fprintf(stderr,"LeaveGoal success=%d: H=%d ENV=%p B=%ld myB=%ld TR=%d P=%p CP=%p Slots=%d\n", successful,HR-H0,LCL0-ENV,LCL0-(CELL*)B,dgi->b0,(CELL*)TR-LCL0, P, CP, LOCAL_CurSlot);
|
||||||
|
BACKUP_MACHINE_REGS();
|
||||||
|
myB = (choiceptr)(LCL0 - dgi->b);
|
||||||
|
if (LOCAL_PrologMode & AsyncIntMode) {
|
||||||
|
Yap_signal(YAP_FAIL_SIGNAL);
|
||||||
|
}
|
||||||
|
handler = B;
|
||||||
|
while (handler
|
||||||
|
//&& LOCAL_CBorder > LCL0 - (CELL *)handler
|
||||||
|
//&& handler->cp_ap != NOCODE
|
||||||
|
&& handler <= myB
|
||||||
|
) {
|
||||||
|
if (handler < myB)
|
||||||
|
handler->cp_ap = TRUSTFAILCODE;
|
||||||
|
B = handler;
|
||||||
|
handler = handler->cp_b;
|
||||||
|
RECOVER_MACHINE_REGS();
|
||||||
|
if (on_cut) {
|
||||||
|
Yap_TrimTrail();
|
||||||
|
} else if (!(LOCAL_PrologMode & AsyncIntMode)) {
|
||||||
|
P=FAILCODE;
|
||||||
|
Yap_exec_absmi(true, YAP_EXEC_ABSMI);
|
||||||
|
}
|
||||||
|
BACKUP_MACHINE_REGS();
|
||||||
|
}
|
||||||
|
completeInnerCall( on_cut, dgi->cp, dgi->p);
|
||||||
|
RECOVER_MACHINE_REGS();
|
||||||
|
// fprintf(stderr,"LeftGoal success=%d: H=%d ENV=%p B=%d TR=%d P=%p CP=%p Slots=%d\n", successful,HR-H0,LCL0-ENV,LCL0-(CELL*)B,(CELL*)TR-LCL0, P, CP, LOCAL_CurSlot);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
X_API Int YAP_RunGoal(Term t) {
|
||||||
|
CACHE_REGS
|
||||||
|
Term out;
|
||||||
|
yhandle_t cslot = LOCAL_CurSlot;
|
||||||
|
BACKUP_MACHINE_REGS();
|
||||||
|
|
||||||
|
LOCAL_AllowRestart = FALSE;
|
||||||
|
LOCAL_PrologMode = UserMode;
|
||||||
|
out = Yap_RunTopGoal(t, true);
|
||||||
|
LOCAL_PrologMode = UserCCallMode;
|
||||||
|
// should we catch the exception or pass it through?
|
||||||
|
// We'll pass it through
|
||||||
RECOVER_MACHINE_REGS();
|
RECOVER_MACHINE_REGS();
|
||||||
LOCAL_CurSlot = cslot;
|
LOCAL_CurSlot = cslot;
|
||||||
return out;
|
return out;
|
||||||
|
37
CXX/yapi.cpp
37
CXX/yapi.cpp
@ -640,39 +640,45 @@ void YAPEngine::release() {
|
|||||||
Term YAPEngine::fun(Term t) {
|
Term YAPEngine::fun(Term t) {
|
||||||
CACHE_REGS
|
CACHE_REGS
|
||||||
BACKUP_MACHINE_REGS();
|
BACKUP_MACHINE_REGS();
|
||||||
Term tmod = Yap_CurrentModule(), *ts = nullptr;
|
Term tmod = Yap_CurrentModule(), *ts = NULL;
|
||||||
PredEntry *ap;
|
PredEntry *ap;
|
||||||
arity_t arity;
|
arity_t arity;
|
||||||
Functor f;
|
Functor f;
|
||||||
Atom name;
|
Atom name;
|
||||||
|
|
||||||
|
RESET_VARIABLE(HR);
|
||||||
if (IsApplTerm(t)) {
|
if (IsApplTerm(t)) {
|
||||||
ts = RepAppl(t) + 1;
|
CELL *p = RepAppl(t);
|
||||||
f = (Functor)ts[-1];
|
f = (Functor)*p;
|
||||||
name = NameOfFunctor(f);
|
name = NameOfFunctor(f);
|
||||||
arity = ArityOfFunctor(f);
|
arity = ArityOfFunctor(f);
|
||||||
|
p++;
|
||||||
for (arity_t i = 0; i < arity; i++)
|
for (arity_t i = 0; i < arity; i++)
|
||||||
XREGS[i + 1] = ts[i];
|
XREGS[i+1] = p[i];
|
||||||
|
arity += 1;
|
||||||
|
XREGS[arity] = (CELL)HR;
|
||||||
|
HR+= 1;
|
||||||
} else if (IsAtomTerm(t)) {
|
} else if (IsAtomTerm(t)) {
|
||||||
name = AtomOfTerm(t);
|
name = AtomOfTerm(t);
|
||||||
f = nullptr;
|
XREGS[1] = (CELL)HR;
|
||||||
arity = 0;
|
HR+=1;
|
||||||
|
arity = 1;
|
||||||
} else if (IsPairTerm(t)) {
|
} else if (IsPairTerm(t)) {
|
||||||
XREGS[1] = ts[0];
|
XREGS[1] = ts[0];
|
||||||
XREGS[2] = ts[1];
|
XREGS[2] = ts[1];
|
||||||
arity = 2;
|
arity = 3;
|
||||||
name = AtomDot;
|
name = AtomDot;
|
||||||
f = FunctorDot;
|
arity++;
|
||||||
|
HR += arity;
|
||||||
} else {
|
} else {
|
||||||
throw YAPError(SOURCE(), TYPE_ERROR_CALLABLE, t, 0);
|
throw YAPError(SOURCE(), TYPE_ERROR_CALLABLE, t, 0);
|
||||||
return 0L;
|
return 0L;
|
||||||
}
|
}
|
||||||
XREGS[arity + 1] = MkVarTerm();
|
|
||||||
arity++;
|
|
||||||
f = Yap_MkFunctor(name, arity);
|
f = Yap_MkFunctor(name, arity);
|
||||||
ap = (PredEntry *)(PredPropByFunc(f, tmod));
|
ap = (PredEntry *)(PredPropByFunc(f, tmod));
|
||||||
|
yhandle_t k = Yap_InitHandle(HR[-1]);
|
||||||
if (ap == nullptr || ap->OpcodeOfPred == UNDEF_OPCODE) {
|
if (ap == nullptr || ap->OpcodeOfPred == UNDEF_OPCODE) {
|
||||||
Term g = (Yap_MkApplTerm(f, arity, ts));
|
Term g = Yap_MkApplTerm(f, arity, ts);
|
||||||
ap = rewriteUndefEngineQuery(ap, g, (ap->ModuleOfPred));
|
ap = rewriteUndefEngineQuery(ap, g, (ap->ModuleOfPred));
|
||||||
}
|
}
|
||||||
q.CurSlot = Yap_StartSlots();
|
q.CurSlot = Yap_StartSlots();
|
||||||
@ -681,15 +687,16 @@ Term YAPEngine::fun(Term t) {
|
|||||||
// make sure this is safe
|
// make sure this is safe
|
||||||
// allow Prolog style exception handling
|
// allow Prolog style exception handling
|
||||||
//__android_log_print(ANDROID_LOG_INFO, "YAPDroid", "exec ");
|
//__android_log_print(ANDROID_LOG_INFO, "YAPDroid", "exec ");
|
||||||
|
|
||||||
bool result = (bool)YAP_EnterGoal(ap, nullptr, &q);
|
bool result = (bool)YAP_EnterGoal(ap, nullptr, &q);
|
||||||
YAPCatchError();
|
YAPCatchError();
|
||||||
|
Term out = 0;
|
||||||
|
if (result) {
|
||||||
|
out = Yap_GetFromHandle(k);
|
||||||
|
}
|
||||||
{
|
{
|
||||||
YAP_LeaveGoal(result, &q);
|
YAP_LeaveGoal(result, &q);
|
||||||
// PyEval_RestoreThread(_save);
|
|
||||||
RECOVER_MACHINE_REGS();
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
YAPQuery::YAPQuery(YAPFunctor f, YAPTerm mod, YAPTerm ts[])
|
YAPQuery::YAPQuery(YAPFunctor f, YAPTerm mod, YAPTerm ts[])
|
||||||
|
@ -367,7 +367,7 @@ public:
|
|||||||
//> output.
|
//> output.
|
||||||
YAPTerm funCall(YAPTerm t) { return YAPTerm(fun(t.term())); };
|
YAPTerm funCall(YAPTerm t) { return YAPTerm(fun(t.term())); };
|
||||||
Term fun(Term t);
|
Term fun(Term t);
|
||||||
Term fun(YAPTerm t) { return fun(t.term()); };
|
//Term fun(YAPTerm t) { return fun(t.term()); };
|
||||||
//> set a StringFlag, usually a path
|
//> set a StringFlag, usually a path
|
||||||
//>
|
//>
|
||||||
bool setStringFlag(std::string arg, std::string path) {
|
bool setStringFlag(std::string arg, std::string path) {
|
||||||
|
@ -8,7 +8,6 @@ PyObject *py_Main;
|
|||||||
void pyErrorHandler__(int line, const char *file, const char *code) {
|
void pyErrorHandler__(int line, const char *file, const char *code) {
|
||||||
// this code is called if a Python error is found.
|
// this code is called if a Python error is found.
|
||||||
// int lvl = push_text_stack();
|
// int lvl = push_text_stack();
|
||||||
PyObject *type;
|
|
||||||
// PyErr_Fetch(&type, &val, NULL);
|
// PyErr_Fetch(&type, &val, NULL);
|
||||||
// PyErr_Print();
|
// PyErr_Print();
|
||||||
// Yap_ThrowError__(file,code,line,0, SYSTEM_ERROR_RUNTIME_PYTHON ,"Python
|
// Yap_ThrowError__(file,code,line,0, SYSTEM_ERROR_RUNTIME_PYTHON ,"Python
|
||||||
@ -235,18 +234,19 @@ static foreign_t assign_python(term_t exp, term_t name) {
|
|||||||
static foreign_t python_string_to(term_t f) {
|
static foreign_t python_string_to(term_t f) {
|
||||||
if (PL_is_atom(f)) {
|
if (PL_is_atom(f)) {
|
||||||
char *s = NULL;
|
char *s = NULL;
|
||||||
if (!PL_get_chars(f, &s, CVT_ALL | CVT_EXCEPTION | REP_UTF8)) {
|
if (!PL_get_chars(f, &s, CVT_ATOM |CVT_STRING | CVT_EXCEPTION | REP_UTF8)) {
|
||||||
pyErrorAndReturn(false);
|
pyErrorAndReturn(false);
|
||||||
}
|
}
|
||||||
if (!strcmp(s,"atom"))
|
if (!strcmp(s,"atom")) {
|
||||||
pyStringToString = false;
|
pyStringToString = false;
|
||||||
if (!strcmp(s,"string"))
|
|
||||||
pyStringToString = true;
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if (!strcmp(s,"string")) {
|
||||||
|
pyStringToString = true;
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static foreign_t python_builtin_eval(term_t caller, term_t dict, term_t out) {
|
static foreign_t python_builtin_eval(term_t caller, term_t dict, term_t out) {
|
||||||
@ -570,27 +570,6 @@ static foreign_t python_export(term_t t, term_t pl) {
|
|||||||
pyErrorAndReturn(rc);
|
pyErrorAndReturn(rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool get_mod(const char *s0)
|
|
||||||
{
|
|
||||||
PyObject *pName;
|
|
||||||
term_t t0 = python_acquire_GIL();
|
|
||||||
#if PY_MAJOR_VERSION < 3
|
|
||||||
pName = PyString_FromString(s0);
|
|
||||||
#else
|
|
||||||
pName = PyUnicode_FromString(s0);
|
|
||||||
#endif
|
|
||||||
if (pName == NULL) {
|
|
||||||
python_release_GIL(t0);
|
|
||||||
}
|
|
||||||
|
|
||||||
PyObject *pModule = PyImport_Import(pName);
|
|
||||||
|
|
||||||
Py_XDECREF(pName);
|
|
||||||
python_release_GIL(t0);
|
|
||||||
|
|
||||||
return pModule;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @pred python_import(MName, Mod)
|
* @pred python_import(MName, Mod)
|
||||||
* Import a python module to the YAP environment.
|
* Import a python module to the YAP environment.
|
||||||
|
@ -479,7 +479,7 @@ If this hook preodicate succeeds it must instantiate the _Action_ argument to t
|
|||||||
|
|
||||||
:- yap_flag(user:unknown,error).
|
:- yap_flag(user:unknown,error).
|
||||||
|
|
||||||
:- ensure_loaded('../android.yap').
|
%:- ensure_loaded('../android.yap').
|
||||||
|
|
||||||
|
|
||||||
%% @}
|
%% @}
|
||||||
|
@ -91,6 +91,18 @@ lists:delete([Head|List], Elem, Residue) :-
|
|||||||
lists:delete([Head|List], Elem, [Head|Residue]) :-
|
lists:delete([Head|List], Elem, [Head|Residue]) :-
|
||||||
lists:delete(List, Elem, Residue).
|
lists:delete(List, Elem, Residue).
|
||||||
|
|
||||||
|
|
||||||
|
% reverse(List, Reversed)
|
||||||
|
% is true when List and Reversed are lists with the same elements
|
||||||
|
% but in opposite orders. rev/2 is a synonym for reverse/2.
|
||||||
|
|
||||||
|
lists:reverse(List, Reversed) :-
|
||||||
|
lists:reverse(List, [], Reversed).
|
||||||
|
|
||||||
|
lists:reverse([], Reversed, Reversed).
|
||||||
|
lists:reverse([Head|Tail], Sofar, Reversed) :-
|
||||||
|
lists:reverse(Tail, [Head|Sofar], Reversed).
|
||||||
|
|
||||||
:- set_prolog_flag(source, false). % disable source.
|
:- set_prolog_flag(source, false). % disable source.
|
||||||
|
|
||||||
|
|
||||||
@ -135,15 +147,3 @@ prolog:length(L, M) :-
|
|||||||
M is N + 1, NL = [_|L], '$$_length2'(L, O, M) ).
|
M is N + 1, NL = [_|L], '$$_length2'(L, O, M) ).
|
||||||
|
|
||||||
%% @}
|
%% @}
|
||||||
|
|
||||||
% reverse(List, Reversed)
|
|
||||||
% is true when List and Reversed are lists with the same elements
|
|
||||||
% but in opposite orders. rev/2 is a synonym for reverse/2.
|
|
||||||
|
|
||||||
lists:reverse(List, Reversed) :-
|
|
||||||
lists:reverse(List, [], Reversed).
|
|
||||||
|
|
||||||
lists:reverse([], Reversed, Reversed).
|
|
||||||
lists:reversae([Head|Tail], Sofar, Reversed) :-
|
|
||||||
lists:reverse(Tail, [Head|Sofar], Reversed).
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user