From b6235d8ecdce5ab4b7f1c426b27d28459d87fbff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADtor=20Santos=20Costa?= Date: Tue, 18 Sep 2018 19:43:50 +0100 Subject: [PATCH] trust your head --- C/c_interface.c | 52 ++++++++++++++++++++++----------------- CXX/yapq.hh | 1 + packages/python/pypreds.c | 24 +----------------- pl/boot.yap | 1 + pl/bootlists.yap | 13 +++++++++- 5 files changed, 45 insertions(+), 46 deletions(-) diff --git a/C/c_interface.c b/C/c_interface.c index 3ca80bf18..b56bb2677 100755 --- a/C/c_interface.c +++ b/C/c_interface.c @@ -1801,20 +1801,47 @@ X_API bool YAP_RetryGoal(YAP_dogoalinfo *dgi) { return out; } +static void completeInnerCall( bool on_cut, yamop *old_CP, yamop *old_P) +{ + if (on_cut) { + P = old_P; + ENV = (CELL *)ENV[E_E]; + CP = old_CP; + LOCAL_AllowRestart = TRUE; + // we are back to user code again, need slots */ + } else { + P = old_P; + ENV = B->cp_env; + ENV = (CELL *)ENV[E_E]; + CP = old_CP; + HR = B->cp_h; + TR = B->cp_tr; + B = B->cp_b; + LOCAL_AllowRestart = FALSE; + SET_ASP(ENV, E_CB * sizeof(CELL)); + // make sure the slots are ok. + } + +} + X_API bool YAP_LeaveGoal(bool successful, 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->b0); + myB = (choiceptr)(LCL0 - dgi->b); + if (LOCAL_PrologMode & AsyncIntMode) { + Yap_signal(YAP_FAIL_SIGNAL); + } handler = B; - while (handler + while (handler //&& LOCAL_CBorder > LCL0 - (CELL *)handler //&& handler->cp_ap != NOCODE && handler->cp_b != NULL && handler <= myB ) { + if (handler < myB) handler->cp_ap = TRUSTFAILCODE; B = handler; handler = handler->cp_b; @@ -1851,7 +1878,6 @@ X_API bool YAP_LeaveGoal(bool successful, YAP_dogoalinfo *dgi) { X_API Int YAP_RunGoal(Term t) { CACHE_REGS Term out; - yamop *old_CP = CP; yhandle_t cslot = LOCAL_CurSlot; BACKUP_MACHINE_REGS(); @@ -1861,25 +1887,7 @@ X_API Int YAP_RunGoal(Term t) { 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]; - CP = old_CP; - LOCAL_AllowRestart = TRUE; - // we are back to user code again, need slots */ - } else { - ENV = B->cp_env; - ENV = (CELL *)ENV[E_E]; - CP = old_CP; - HR = B->cp_h; - TR = B->cp_tr; - B = B->cp_b; - LOCAL_AllowRestart = FALSE; - SET_ASP(ENV, E_CB * sizeof(CELL)); - // make sure the slots are ok. - } - RECOVER_MACHINE_REGS(); + RECOVER_MACHINE_REGS(); LOCAL_CurSlot = cslot; return out; } diff --git a/CXX/yapq.hh b/CXX/yapq.hh index dcfadc7f3..7fcf764c0 100644 --- a/CXX/yapq.hh +++ b/CXX/yapq.hh @@ -367,6 +367,7 @@ public: //> output. YAPTerm funCall(YAPTerm t) { return YAPTerm(fun(t.term())); }; Term fun(Term t); + //Term fun(YAPTerm t) { return fun(t.term()); }; //> set a StringFlag, usually a path //> bool setStringFlag(std::string arg, std::string path) { diff --git a/packages/python/pypreds.c b/packages/python/pypreds.c index f7f642a3c..9dc6d4cbf 100644 --- a/packages/python/pypreds.c +++ b/packages/python/pypreds.c @@ -8,7 +8,6 @@ PyObject *py_Main; void pyErrorHandler__(int line, const char *file, const char *code) { // this code is called if a Python error is found. // int lvl = push_text_stack(); - PyObject *type; // PyErr_Fetch(&type, &val, NULL); // PyErr_Print(); // Yap_ThrowError__(file,code,line,0, SYSTEM_ERROR_RUNTIME_PYTHON ,"Python @@ -235,7 +234,7 @@ static foreign_t assign_python(term_t exp, term_t name) { static foreign_t python_string_to(term_t f) { if (PL_is_atom(f)) { 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); } if (!strcmp(s,"atom")) { @@ -571,27 +570,6 @@ static foreign_t python_export(term_t t, term_t pl) { 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) * Import a python module to the YAP environment. diff --git a/pl/boot.yap b/pl/boot.yap index 4abb93f4c..cb5591395 100644 --- a/pl/boot.yap +++ b/pl/boot.yap @@ -479,6 +479,7 @@ If this hook preodicate succeeds it must instantiate the _Action_ argument to t :- yap_flag(user:unknown,error). +%:- ensure_loaded('../android.yap'). %% @} diff --git a/pl/bootlists.yap b/pl/bootlists.yap index 69beade81..471fbad9d 100644 --- a/pl/bootlists.yap +++ b/pl/bootlists.yap @@ -91,6 +91,18 @@ lists:delete([Head|List], Elem, Residue) :- lists:delete([Head|List], Elem, [Head|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. @@ -135,4 +147,3 @@ prolog:length(L, M) :- M is N + 1, NL = [_|L], '$$_length2'(L, O, M) ). %% @} -