This commit is contained in:
Vitor Santos Costa 2018-07-21 12:08:09 +01:00
parent 562e9e5af3
commit 0c950ce5b3
8 changed files with 514 additions and 512 deletions

View File

@ -30,8 +30,6 @@ class YAPError;
extern "C" { extern "C" {
X_API extern Term YAP_MkCharPTerm(char *n); X_API extern Term YAP_MkCharPTerm(char *n);
} }
/** /**
@ -93,7 +91,7 @@ public:
// fprintf(stderr,"-%d,%lx,%p ",t,LOCAL_HandleBase[t] ,HR); // fprintf(stderr,"-%d,%lx,%p ",t,LOCAL_HandleBase[t] ,HR);
/* if (!t) /* if (!t)
return; return;
Yap_DebugPlWriteln(LOCAL_HandleBase[t]); // Yap_DebugPlWriteln(LOCAL_HandleBase[t]);
LOCAL_HandleBase[t] = TermFreeTerm; LOCAL_HandleBase[t] = TermFreeTerm;
while (LOCAL_HandleBase[LOCAL_CurSlot - 1] == TermFreeTerm) { while (LOCAL_HandleBase[LOCAL_CurSlot - 1] == TermFreeTerm) {
LOCAL_CurSlot--; LOCAL_CurSlot--;
@ -201,7 +199,8 @@ public:
virtual bool isGround() { return Yap_IsGroundTerm(gt()); } /// term is ground virtual bool isGround() { return Yap_IsGroundTerm(gt()); } /// term is ground
virtual bool isList() { return Yap_IsListTerm(gt()); } /// term is a list virtual bool isList() { return Yap_IsListTerm(gt()); } /// term is a list
/// extract the argument i of the term, where i in 1...arityvoid *Yap_RepStreamFromId(int sno) /// extract the argument i of the term, where i in 1...arityvoid
/// *Yap_RepStreamFromId(int sno)
virtual Term getArg(arity_t i); virtual Term getArg(arity_t i);
/// extract the arity of the term /// extract the arity of the term
@ -304,7 +303,10 @@ public:
RECOVER_MACHINE_REGS(); RECOVER_MACHINE_REGS();
}; };
YAPApplTerm(YAPFunctor f, YAPTerm ts[]); YAPApplTerm(YAPFunctor f, YAPTerm ts[]);
YAPApplTerm(const std::string s, unsigned int arity) { mk(Yap_MkNewApplTerm(Yap_MkFunctor(Yap_LookupAtom(s.c_str()), arity), arity)); }; YAPApplTerm(const std::string s, unsigned int arity) {
mk(Yap_MkNewApplTerm(Yap_MkFunctor(Yap_LookupAtom(s.c_str()), arity),
arity));
};
YAPApplTerm(const std::string s, std::vector<YAPTerm> ts); YAPApplTerm(const std::string s, std::vector<YAPTerm> ts);
YAPApplTerm(YAPFunctor f); YAPApplTerm(YAPFunctor f);
inline Functor functor() { return FunctorOfTerm(gt()); } inline Functor functor() { return FunctorOfTerm(gt()); }
@ -482,7 +484,8 @@ public:
// Constructor: receives a sequence of n wchar_ts, whatever they may be; // Constructor: receives a sequence of n wchar_ts, whatever they may be;
YAPAtomTerm(wchar_t *s, size_t len); YAPAtomTerm(wchar_t *s, size_t len);
// Constructor: receives a std::string; // Constructor: receives a std::string;
// YAPAtomTerm(std::string s) { mk(MkAtomTerm(Yap_LookupAtom(s.c_str()))); }; // YAPAtomTerm(std::string s) { mk(MkAtomTerm(Yap_LookupAtom(s.c_str())));
// };
bool isVar() { return false; } /// type check for unbound bool isVar() { return false; } /// type check for unbound
bool isAtom() { return true; } /// type check for atom bool isAtom() { return true; } /// type check for atom
bool isInteger() { return false; } /// type check for integer bool isInteger() { return false; } /// type check for integer

View File

@ -278,15 +278,13 @@ static Term scanToList(TokEntry *tok, TokEntry *errtok) {
} }
tok = tok->TokNext; tok = tok->TokNext;
} }
if (ts[0])
Yap_DebugPlWriteln(ts[0]);
return ts[0]; return ts[0];
} }
/** /**
@pred scan_to_list( +Stream, -Tokens ) @pred scan_to_list( +Stream, -Tokens )
Generate a list of tokens from a scan of the (input) stream, Tokens are of the Generate a list of tokens from a scan of the (input) stream, Tokens are of
form: the form:
+ `atom`(Atom) + `atom`(Atom)
+ `<QQ>`(Text) + `<QQ>`(Text)
@ -838,7 +836,10 @@ static parser_state_t initParser(Term opts, FEnv *fe, REnv *re, int inp_stream,
fe->old_TR = TR; fe->old_TR = TR;
LOCAL_Error_TYPE = YAP_NO_ERROR; LOCAL_Error_TYPE = YAP_NO_ERROR;
__android_log_print(ANDROID_LOG_INFO, "YAPDroid ", " open %s, %d", __android_log_print(ANDROID_LOG_INFO, "YAPDroid ", " open %s, %d",
CurrentModule == 0? "prolog": RepAtom(AtomOfTerm(CurrentModule))->StrOfAE, inp_stream); CurrentModule == 0
? "prolog"
: RepAtom(AtomOfTerm(CurrentModule))->StrOfAE,
inp_stream);
LOCAL_SourceFileName = GLOBAL_Stream[inp_stream].name; LOCAL_SourceFileName = GLOBAL_Stream[inp_stream].name;
LOCAL_eot_before_eof = false; LOCAL_eot_before_eof = false;
fe->tpos = StreamPosition(inp_stream); fe->tpos = StreamPosition(inp_stream);
@ -1396,8 +1397,9 @@ static Int start_mega(USES_REGS1) {
Term rval; Term rval;
int sno; int sno;
encoding_t l = ENC_ISO_UTF8; encoding_t l = ENC_ISO_UTF8;
sno = Yap_open_buf_read_stream((char *)s, strlen(s)+1, &l, sno =
MEM_BUF_USER, Yap_LookupAtom(Yap_StrPrefix(s,16)), TermNone ); Yap_open_buf_read_stream((char *)s, strlen(s) + 1, &l, MEM_BUF_USER,
Yap_LookupAtom(Yap_StrPrefix(s, 16)), TermNone);
GLOBAL_Stream[sno].status |= CloseOnException_Stream_f; GLOBAL_Stream[sno].status |= CloseOnException_Stream_f;
rval = Yap_read_term(sno, opts, false); rval = Yap_read_term(sno, opts, false);
@ -1409,8 +1411,9 @@ static Int start_mega(USES_REGS1) {
Term rval; Term rval;
int sno; int sno;
encoding_t l = ENC_ISO_UTF8; encoding_t l = ENC_ISO_UTF8;
sno = Yap_open_buf_read_stream((char *)s, strlen((const char *)s), &l, sno = Yap_open_buf_read_stream(
MEM_BUF_USER, Yap_LookupAtom(Yap_StrPrefix((char *)s,16)), TermNone); (char *)s, strlen((const char *)s), &l, MEM_BUF_USER,
Yap_LookupAtom(Yap_StrPrefix((char *)s, 16)), TermNone);
GLOBAL_Stream[sno].status |= CloseOnException_Stream_f; GLOBAL_Stream[sno].status |= CloseOnException_Stream_f;
rval = Yap_read_term(sno, opts, false); rval = Yap_read_term(sno, opts, false);
Yap_CloseStream(sno); Yap_CloseStream(sno);
@ -1532,7 +1535,9 @@ static Int start_mega(USES_REGS1) {
} }
char *ss = (char *)s; char *ss = (char *)s;
encoding_t enc = ENC_ISO_UTF8; encoding_t enc = ENC_ISO_UTF8;
int sno = Yap_open_buf_read_stream(ss, len, &enc, MEM_BUF_USER, Yap_LookupAtom(Yap_StrPrefix(ss,16)), TermString); int sno = Yap_open_buf_read_stream(ss, len, &enc, MEM_BUF_USER,
Yap_LookupAtom(Yap_StrPrefix(ss, 16)),
TermString);
GLOBAL_Stream[sno].status |= CloseOnException_Stream_f; GLOBAL_Stream[sno].status |= CloseOnException_Stream_f;
rc = Yap_read_term(sno, Deref(ARG3), 3); rc = Yap_read_term(sno, Deref(ARG3), 3);
Yap_CloseStream(sno); Yap_CloseStream(sno);

View File

@ -92,8 +92,9 @@ static Term readFromBuffer(const char *s, Term opts) {
Term rval; Term rval;
int sno; int sno;
encoding_t enc = ENC_ISO_UTF8; encoding_t enc = ENC_ISO_UTF8;
sno = Yap_open_buf_read_stream((char *)s, strlen_utf8((unsigned char *)s), sno = Yap_open_buf_read_stream(
&enc, MEM_BUF_USER, Yap_LookupAtom(Yap_StrPrefix((char *)s,16)), TermNone); (char *)s, strlen_utf8((unsigned char *)s), &enc, MEM_BUF_USER,
Yap_LookupAtom(Yap_StrPrefix((char *)s, 16)), TermNone);
rval = Yap_read_term(sno, opts, 3); rval = Yap_read_term(sno, opts, 3);
Yap_CloseStream(sno); Yap_CloseStream(sno);
@ -593,7 +594,6 @@ static Int writeln(USES_REGS1) {
return false; return false;
} }
int output_stream = Yap_CheckTextStream(ARG1, Output_Stream_f, "writeln/2"); int output_stream = Yap_CheckTextStream(ARG1, Output_Stream_f, "writeln/2");
fprintf(stderr, "writeln %d\n", output_stream);
if (output_stream < 0) { if (output_stream < 0) {
free(args); free(args);
return false; return false;
@ -692,8 +692,8 @@ static Int term_to_atom(USES_REGS1) {
Term t2 = Deref(ARG2), ctl, rc = false; Term t2 = Deref(ARG2), ctl, rc = false;
Atom at; Atom at;
if (IsVarTerm(t2)) { if (IsVarTerm(t2)) {
const char *s = Yap_TermToBuffer(Deref(ARG1), const char *s =
Quote_illegal_f | Handle_vars_f); Yap_TermToBuffer(Deref(ARG1), Quote_illegal_f | Handle_vars_f);
if (!s || !(at = Yap_UTF8ToAtom((const unsigned char *)s))) { if (!s || !(at = Yap_UTF8ToAtom((const unsigned char *)s))) {
Yap_Error(RESOURCE_ERROR_HEAP, t2, Yap_Error(RESOURCE_ERROR_HEAP, t2,
"Could not get memory from the operating system"); "Could not get memory from the operating system");

View File

@ -51,7 +51,6 @@ static PyObject *s_to_python(const char *s, bool eval, PyObject *p0) {
*/ */
X_API PyObject *string_to_python(const char *s, bool eval, PyObject *p0) { X_API PyObject *string_to_python(const char *s, bool eval, PyObject *p0) {
char *buf = malloc(strlen(s) + 1), *child; char *buf = malloc(strlen(s) + 1), *child;
while ((child = strchr(s, '.')) != NULL) { while ((child = strchr(s, '.')) != NULL) {
size_t len = child - s; size_t len = child - s;
@ -108,9 +107,8 @@ static bool copy_to_dictionary(PyObject *dict, term_t targ, term_t taux,
* @return a Python object descriptor or NULL if failed * @return a Python object descriptor or NULL if failed
*/ */
PyObject *term_to_python(term_t t, bool eval, PyObject *o, bool cvt) { PyObject *term_to_python(term_t t, bool eval, PyObject *o, bool cvt) {
// o≈ //
YAP_Term yt = YAP_GetFromSlot(t); YAP_Term yt = YAP_GetFromSlot(t);
Yap_DebugPlWriteln(yt);
switch (PL_term_type(t)) { switch (PL_term_type(t)) {
case PL_VARIABLE: { case PL_VARIABLE: {
if (yt == 0) { if (yt == 0) {

View File

@ -957,7 +957,6 @@ PyObject *compound_to_pyeval(term_t t, PyObject *context, bool cvt) {
lhs = term_to_python(targ, true, NULL, true); lhs = term_to_python(targ, true, NULL, true);
AOK(PL_get_arg(2, t, targ), NULL); AOK(PL_get_arg(2, t, targ), NULL);
rhs = term_to_python(targ, true, NULL, true); rhs = term_to_python(targ, true, NULL, true);
Yap_DebugPlWriteln(YAP_GetFromSlot(targ));
if (PySequence_Check(lhs) && PySequence_Check(rhs)) { if (PySequence_Check(lhs) && PySequence_Check(rhs)) {
return PySequence_Concat(lhs, rhs); return PySequence_Concat(lhs, rhs);
} }
@ -1039,7 +1038,8 @@ PyObject *compound_to_pyeval(term_t t, PyObject *context, bool cvt) {
pArgs = PyTuple_New(i); pArgs = PyTuple_New(i);
} }
} }
fprintf(stderr,"Tuple %p: %s\n", pyDict, PyUnicode_AsUTF8(PyObject_Str(pyDict))); fprintf(stderr, "Tuple %p: %s\n", pyDict,
PyUnicode_AsUTF8(PyObject_Str(pyDict)));
if (!indict) { if (!indict) {
if (PL_is_variable(tleft)) { if (PL_is_variable(tleft)) {
pArg = Py_None; pArg = Py_None;

View File

@ -8,7 +8,6 @@
YAP_Term TermErrStream, TermOutStream; YAP_Term TermErrStream, TermOutStream;
static void pyflush(StreamDesc *st) { static void pyflush(StreamDesc *st) {
#if 0 #if 0
st->u.w_irl.ptr[0] = '\0'; st->u.w_irl.ptr[0] = '\0';
@ -75,8 +74,7 @@ static void *py_open(VFS_t *me, const char *name, const char *io_mode,
} }
StreamDesc *st = YAP_RepStreamFromId(sno); StreamDesc *st = YAP_RepStreamFromId(sno);
st->name = YAP_LookupAtom(name); st->name = YAP_LookupAtom(name);
if (strcmp(name, "sys.stdout") == 0 || if (strcmp(name, "sys.stdout") == 0 || strcmp(name, "sys.stderr") == 0 ||
strcmp(name, "sys.stderr") == 0 ||
strcmp(name, "input") == 0) { strcmp(name, "input") == 0) {
st->status |= Tty_Stream_f; st->status |= Tty_Stream_f;
} }
@ -131,16 +129,19 @@ static bool py_close(int sno) {
static bool getLine(StreamDesc *rl_iostream, int sno) { static bool getLine(StreamDesc *rl_iostream, int sno) {
char *myrl_line = NULL; char *myrl_line = NULL;
term_t ctk = python_acquire_GIL(); // term_t ctk = python_acquire_GIL();
PyObject_Print(rl_iostream->u.private_data, stderr, 0);
/* window of vulnerability opened */ /* window of vulnerability opened */
myrl_line = PyUnicode_AsUTF8(PyObject_CallFunctionObjArgs(rl_iostream->u.private_data, NULL)); PyObject *readl =
python_release_GIL(ctk); PyObject_GetAttrString(rl_iostream->u.private_data, "readline");
PyObject_Print(readl, stderr, 0);
myrl_line = PyUnicode_AsUTF8(
PyObject_CallFunctionObjArgs(readl, rl_iostream->u.private_data, NULL));
// python_release_GIL(ctk);
PyObject *err; PyObject *err;
if ((err = PyErr_Occurred())) { if ((err = PyErr_Occurred())) {
PyErr_SetString( PyErr_SetString(err, "Error in getLine\n");
err,
"Error in getLine\n");
Yap_ThrowError(SYSTEM_ERROR_GET_FAILED, YAP_MkIntTerm(sno), err); Yap_ThrowError(SYSTEM_ERROR_GET_FAILED, YAP_MkIntTerm(sno), err);
} }
size_t size = strlen(myrl_line) + 1; size_t size = strlen(myrl_line) + 1;

View File

@ -79,11 +79,7 @@ close_esh( _Engine , Stream ) :-
p3_message( _Severity, Engine, error(syntax_error(Cause),info(between(_,LN,_), _FileName, CharPos, Details))) :- p3_message( _Severity, Engine, error(syntax_error(Cause),info(between(_,LN,_), _FileName, CharPos, Details))) :-
python_clear_errors, python_clear_errors,
!, !,
writeln(E), Engine.errors := [t(Cause,LN,CharPos,Details)]+Engine.errors.
NE := [t(Cause,LN,CharPos,Details)]+Engine.errors,
writeln(E),
writeln(NE),
Engine.errors := NE.
p3_message(error, Engine, E) :- p3_message(error, Engine, E) :-
python_clear_errors, python_clear_errors,
!. !.
@ -181,4 +177,3 @@ p3_message(error, Engine, E) :-
%% Self.errors := [t(C,L,N,A)] + Self.errors, %% Self.errors := [t(C,L,N,A)] + Self.errors,
%% fail. %% fail.
%% close_events( _ ). %% close_events( _ ).

View File

@ -132,7 +132,7 @@ ypp_file(File,PPFile):-
% Cmdline % Cmdline
defines2string(Defs),ypp_extcmd(Cmd), defines2string(Defs),ypp_extcmd(Cmd),
atom_concat([Cmd,' ',PPFile,' ',Defs,' ',File],Cmdline), atom_concat([Cmd,' ',PPFile,' ',Defs,' ',File],Cmdline),
write(Cmdline),nl, % write(Cmdline),nl,
% current_module(M1,M2), % current_module(M1,M2),
% write(M1:M2),nl, % write(M1:M2),nl,
system(Cmdline), system(Cmdline),