virtual streams

This commit is contained in:
Vítor Santos Costa 2018-05-24 21:45:38 +01:00
parent 8607aee725
commit 7c934d3f40
9 changed files with 28 additions and 51 deletions

View File

@ -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 */

View File

@ -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;

View File

@ -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)

View File

@ -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')) {

View File

@ -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;

View File

@ -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)

View File

@ -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.

View File

@ -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).

View File

@ -111,4 +111,4 @@ exports(In, Exports) :-
read(In, Term),
Term = (:- module(_Name, Exports)).
@}
%% @}