virtual streams
This commit is contained in:
parent
8607aee725
commit
7c934d3f40
@ -1774,7 +1774,7 @@ X_API bool YAP_RetryGoal(YAP_dogoalinfo *dgi) {
|
||||
return out;
|
||||
}
|
||||
|
||||
X_API bool YAP_LeaveGoal(bool backtrack, YAP_dogoalinfo *dgi) {
|
||||
X_API bool YAP_LeaveGoal(bool exit, YAP_dogoalinfo *dgi) {
|
||||
CACHE_REGS
|
||||
choiceptr myB;
|
||||
|
||||
@ -1792,7 +1792,7 @@ X_API bool YAP_LeaveGoal(bool backtrack, YAP_dogoalinfo *dgi) {
|
||||
B = myB;
|
||||
}
|
||||
/* if backtracking asked for, recover space and bindings */
|
||||
if (backtrack) {
|
||||
if (!exit) {
|
||||
P = FAILCODE;
|
||||
Yap_exec_absmi(true, YAP_EXEC_ABSMI);
|
||||
/* recover stack space */
|
||||
|
11
CXX/yapi.cpp
11
CXX/yapi.cpp
@ -53,7 +53,6 @@ static void YAPCatchError()
|
||||
YAPPredicate::YAPPredicate(Term &t, Term &tmod, CELL *&ts, const char *pname) {
|
||||
Term t0 = t;
|
||||
ap = nullptr;
|
||||
Yap_DebugPlWriteln(t);
|
||||
restart:
|
||||
if (IsVarTerm(t)) {
|
||||
throw YAPError(SOURCE(), INSTANTIATION_ERROR, t0, pname);
|
||||
@ -503,7 +502,7 @@ bool YAPEngine::call(YAPPredicate ap, YAPTerm ts[]) {
|
||||
q.cp = CP;
|
||||
// allow Prolog style exceotion handling
|
||||
// don't forget, on success these bindings will still be there);
|
||||
result = YAP_LeaveGoal(false, &q);
|
||||
result = YAP_LeaveGoal(true, &q);
|
||||
|
||||
YAPCatchError();
|
||||
|
||||
@ -737,14 +736,10 @@ bool YAPQuery::next() {
|
||||
q_state = 1;
|
||||
__android_log_print(ANDROID_LOG_INFO, "YAPDroid", "out %d", result);
|
||||
|
||||
if (!result) {
|
||||
YAP_LeaveGoal(false, &q_h);
|
||||
YAP_LeaveGoal(result, &q_h);
|
||||
Yap_CloseHandles(q_handles);
|
||||
q_open = false;
|
||||
YAPCatchError();
|
||||
} else {
|
||||
q_handles = Yap_StartSlots();
|
||||
}
|
||||
RECOVER_MACHINE_REGS();
|
||||
LOCAL_RestartEnv = oldp;
|
||||
return result;
|
||||
@ -1004,7 +999,7 @@ void *YAPPrologPredicate::retractClause(YAPTerm skeleton, bool all) {
|
||||
}
|
||||
|
||||
std::string YAPError::text() {
|
||||
char buf[256];
|
||||
|
||||
return "Error";
|
||||
#if 0
|
||||
std::stringstream s;
|
||||
|
18
CXX/yapq.hh
18
CXX/yapq.hh
@ -45,7 +45,6 @@ class X_API YAPQuery : public YAPPredicate {
|
||||
YAPPairTerm names;
|
||||
YAPTerm goal;
|
||||
// temporaries
|
||||
Term tnames, tgoal;
|
||||
YAPError *e;
|
||||
|
||||
inline void setNext() { // oq = LOCAL_execution;
|
||||
@ -92,31 +91,30 @@ public:
|
||||
/// It is given a string, calls the parser and obtains a Prolog term that
|
||||
/// should be a callable
|
||||
/// goal.
|
||||
inline YAPQuery(const char *s) : YAPPredicate(s, tgoal, tnames) {
|
||||
inline YAPQuery(const char *s) : YAPPredicate(s, goal.term(), names.term()) {
|
||||
CELL *qt = nullptr;
|
||||
__android_log_print(ANDROID_LOG_INFO, "YAPDroid", "got game %d",
|
||||
LOCAL_CurSlot);
|
||||
if (!ap)
|
||||
return;
|
||||
__android_log_print(ANDROID_LOG_INFO, "YAPDroid", "%s", names.text());
|
||||
if (IsPairTerm(tgoal)) {
|
||||
qt = RepPair(tgoal);
|
||||
tgoal = Yap_MkApplTerm(FunctorCsult, 1, qt);
|
||||
if (IsPairTerm(goal.term())) {
|
||||
qt = RepPair(goal.term());
|
||||
goal.put(Yap_MkApplTerm(FunctorCsult, 1, qt));
|
||||
ap = RepPredProp(PredPropByFunc(FunctorCsult, TermProlog));
|
||||
}
|
||||
goal = YAPTerm(tgoal);
|
||||
if (IsApplTerm(tgoal)) {
|
||||
Functor f = FunctorOfTerm(tgoal);
|
||||
if (IsApplTerm(goal.term())) {
|
||||
Functor f = FunctorOfTerm(goal.term());
|
||||
if (!IsExtensionFunctor(f)) {
|
||||
arity_t arity = ap->ArityOfPE;
|
||||
if (arity) {
|
||||
qt = RepAppl(tgoal) + 1;
|
||||
qt = RepAppl(goal.term()) + 1;
|
||||
for (arity_t i = 0; i < arity; i++)
|
||||
XREGS[i + 1] = qt[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
names = YAPPairTerm(tnames);
|
||||
names = YAPPairTerm(names.term());
|
||||
openQuery();
|
||||
};
|
||||
// inline YAPQuery() : YAPPredicate(s, tgoal, tnames)
|
||||
|
@ -571,13 +571,13 @@ int Yap_DebugGetc() {
|
||||
int Yap_DebugPutc(FILE *s, wchar_t ch) {
|
||||
if (Yap_Option['l' - 96])
|
||||
(void)putc(ch, Yap_logfile);
|
||||
return (putc(ch, s));
|
||||
return (putc(ch, stderr));
|
||||
}
|
||||
|
||||
int Yap_DebugPuts(FILE *s, const char *sch) {
|
||||
if (Yap_Option['l' - 96])
|
||||
(void)fputs(sch, Yap_logfile);
|
||||
return fputs(sch, s);
|
||||
return fputs(sch, stderr);
|
||||
}
|
||||
|
||||
void Yap_DebugErrorPuts(const char *s) { Yap_DebugPuts(stderr, s); }
|
||||
@ -1584,7 +1584,7 @@ int Yap_OpenStream(Term tin, const char *io_mode, Term user_name,
|
||||
} else {
|
||||
st->file = fopen(fname, io_mode);
|
||||
}
|
||||
if (!st->file && !st->vfs) {
|
||||
if (!st->file) {
|
||||
fprintf(stderr, "trying %s\n", fname);
|
||||
PlIOError(EXISTENCE_ERROR_SOURCE_SINK, tin, "%s", fname);
|
||||
/* extract BACK info passed through the stream descriptor */
|
||||
@ -1629,7 +1629,7 @@ int Yap_OpenStream(Term tin, const char *io_mode, Term user_name,
|
||||
pop_text_stack(i);
|
||||
}
|
||||
}
|
||||
if (st->file == NULL && st->vfs == NULL) {
|
||||
if (st->file == NULL) {
|
||||
if (!strchr(io_mode, 'b') && binary_file(fname)) {
|
||||
UNLOCK(st->streamlock);
|
||||
if (errno == ENOENT && !strchr(io_mode, 'r')) {
|
||||
|
@ -7,21 +7,21 @@
|
||||
|
||||
YAP_Term TermErrStream, TermOutStream;
|
||||
|
||||
static int py_put(int sno, int ch) {
|
||||
static int py_putc(int sno, int ch) {
|
||||
// PyObject *pyw; // buffer
|
||||
// int pyw_kind;
|
||||
// PyObject *pyw_data;
|
||||
StreamDesc *st = YAP_GetStreamFromId(sno);
|
||||
if (st->user_name == TermOutStream) {
|
||||
term_t tg = python_acquire_GIL();
|
||||
// term_t tg = python_acquire_GIL();
|
||||
PySys_WriteStdout("%C", ch);
|
||||
python_release_GIL(tg);
|
||||
//python_release_GIL(tg);
|
||||
return ch;
|
||||
}
|
||||
if (st->user_name == TermErrStream) {
|
||||
term_t tg = python_acquire_GIL();
|
||||
//term_t tg = python_acquire_GIL();
|
||||
PySys_WriteStderr("%C", ch);
|
||||
python_release_GIL(tg);
|
||||
//python_release_GIL(tg);
|
||||
return ch;
|
||||
}
|
||||
char s[2];
|
||||
@ -73,6 +73,7 @@ static void *py_open(VFS_t *me, const char *name, const char *io_mode,
|
||||
return st;
|
||||
}
|
||||
|
||||
|
||||
static bool py_close(int sno) {
|
||||
StreamDesc *st = YAP_RepStreamFromId(sno);
|
||||
if (strcmp(st->name, "sys.stdout") && strcmp(st->name, "sys.stderr")) {
|
||||
@ -200,7 +201,7 @@ bool init_python_vfs(void) {
|
||||
pystream.close = py_close;
|
||||
pystream.get_char = py_getc;
|
||||
pystream.peek_char = py_peek;
|
||||
pystream.put_char = py_put;
|
||||
pystream.put_char = py_putc;
|
||||
pystream.flush = py_flush;
|
||||
pystream.seek = py_seek;
|
||||
pystream.next = GLOBAL_VFS;
|
||||
|
@ -145,6 +145,7 @@ class YAPShell:
|
||||
# return
|
||||
try:
|
||||
engine = self.engine
|
||||
engine.ReSet()
|
||||
bindings = []
|
||||
loop = False
|
||||
g = python_query(self, query)
|
||||
@ -176,7 +177,6 @@ class YAPShell:
|
||||
return False, None
|
||||
except Exception as e:
|
||||
print("Exception")
|
||||
print(dir(e))
|
||||
return False, None
|
||||
|
||||
def live(self, engine, **kwargs):
|
||||
@ -208,6 +208,7 @@ class YAPShell:
|
||||
#
|
||||
def __init__(self, engine, **kwargs):
|
||||
self.engine = engine
|
||||
|
||||
self.live(engine)
|
||||
|
||||
|
||||
|
@ -1,18 +0,0 @@
|
||||
|
||||
:- use_module(library(python)).
|
||||
|
||||
:- if( current_prolog_flag(apple, true) ).
|
||||
|
||||
:- putenv( 'LC_CTYPE', 'en_us:UTF-8').
|
||||
|
||||
plot_inline :-
|
||||
X := self.inline_plotting,
|
||||
nb_setval(inline, X ),
|
||||
X = true,
|
||||
!,
|
||||
:= (
|
||||
import( matplotlib ),
|
||||
matplotlib.use( `nbagg` )
|
||||
).
|
||||
|
||||
:- endif.
|
@ -72,7 +72,7 @@ streams(true) :-
|
||||
% open('/python/input', read, _Input, [alias(user_input),bom(false)]),
|
||||
open('/python/sys.stdout', append, _Output, [alias(user_output)]),
|
||||
open('/python/sys.stderr', append, _Error, [alias(user_error)]),
|
||||
% set_prolog_flag(user_input,_Input),
|
||||
% set_prolog_flag(user_input,_Input),
|
||||
set_prolog_flag(user_output,_Output),
|
||||
set_prolog_flag(user_error,_Error).
|
||||
|
||||
|
@ -111,4 +111,4 @@ exports(In, Exports) :-
|
||||
read(In, Term),
|
||||
Term = (:- module(_Name, Exports)).
|
||||
|
||||
@}
|
||||
%% @}
|
||||
|
Reference in New Issue
Block a user