yapi
This commit is contained in:
parent
664c17f3b3
commit
3699a715ce
@ -601,132 +601,6 @@ static long get_len_of_range(long lo, long hi, long step) {
|
|||||||
{"A29", NULL}, {"A29", NULL}, {"A30", NULL}, {"A31", NULL}, {"A32", NULL},
|
{"A29", NULL}, {"A29", NULL}, {"A30", NULL}, {"A31", NULL}, {"A32", NULL},
|
||||||
{NULL, NULL}};
|
{NULL, NULL}};
|
||||||
|
|
||||||
static PyObject *structseq_str(PyStructSequence *obj ) {
|
|
||||||
|
|
||||||
/* buffer and type size were chosen well considered. */
|
|
||||||
#define REPR_BUFFER_SIZE 512
|
|
||||||
#define TYPE_MAXSIZE 100
|
|
||||||
|
|
||||||
bool removelast = false;
|
|
||||||
PyTypeObject *typ = Py_TYPE(obj);
|
|
||||||
const char *type_name = typ->tp_name;
|
|
||||||
Py_ssize_t len, i;
|
|
||||||
char buf[REPR_BUFFER_SIZE];
|
|
||||||
char *endofbuf, *pbuf = buf;
|
|
||||||
/* pointer to end of writeable buffer; safes space for "...)\0" */
|
|
||||||
endofbuf = &buf[REPR_BUFFER_SIZE - 5];
|
|
||||||
|
|
||||||
/* "typename(", limited to TYPE_MAXSIZE */
|
|
||||||
len =
|
|
||||||
strnlen(type_name, TYPE_MAXSIZE);
|
|
||||||
strncpy(pbuf, type_name, len);
|
|
||||||
pbuf += len;
|
|
||||||
*pbuf++ = '(';
|
|
||||||
|
|
||||||
for (i = 0; i < ((PyStructSequence *)obj)->ob_base.ob_size; i++) {
|
|
||||||
PyObject *val, *repr;
|
|
||||||
const char *crepr;
|
|
||||||
|
|
||||||
val = PyStructSequence_GET_ITEM(obj, i);
|
|
||||||
repr = PyObject_Str(val);
|
|
||||||
if (repr == NULL)
|
|
||||||
return Py_None;
|
|
||||||
crepr = PyUnicode_AsUTF8(repr);
|
|
||||||
if (crepr == NULL) {
|
|
||||||
Py_DECREF(repr);
|
|
||||||
return Py_None;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* + 3: keep space for ", " */
|
|
||||||
len = strlen(crepr) + 2;
|
|
||||||
if ((pbuf + len) <= endofbuf) {
|
|
||||||
strcpy(pbuf, crepr);
|
|
||||||
pbuf += strlen(crepr);
|
|
||||||
*pbuf++ = ',';
|
|
||||||
*pbuf++ = ' ';
|
|
||||||
removelast = 1;
|
|
||||||
Py_DECREF(repr);
|
|
||||||
} else {
|
|
||||||
strcpy(pbuf, "...");
|
|
||||||
pbuf += 3;
|
|
||||||
removelast = 0;
|
|
||||||
Py_DECREF(repr);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (removelast) {
|
|
||||||
/* overwrite last ", " */
|
|
||||||
pbuf -= 2;
|
|
||||||
}
|
|
||||||
*pbuf++ = ')';
|
|
||||||
*pbuf = '\0';
|
|
||||||
|
|
||||||
return PyUnicode_FromString(buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
static PyObject *structseq_repr(PyObject *iobj) {
|
|
||||||
|
|
||||||
/* buffer and type size were chosen well considered. */
|
|
||||||
#define REPR_BUFFER_SIZE 512
|
|
||||||
#define TYPE_MAXSIZE 100
|
|
||||||
|
|
||||||
PyStructSequence *obj = (PyStructSequence *)iobj;
|
|
||||||
PyTypeObject *typ = Py_TYPE(obj);
|
|
||||||
const char *type_name = typ->tp_name;
|
|
||||||
bool removelast = false;
|
|
||||||
Py_ssize_t len, i;
|
|
||||||
char buf[REPR_BUFFER_SIZE];
|
|
||||||
char *endofbuf, *pbuf = buf;
|
|
||||||
/* pointer to end of writeable buffer; safes space for "...)\0" */
|
|
||||||
endofbuf = &buf[REPR_BUFFER_SIZE - 5];
|
|
||||||
|
|
||||||
/* "typename(", limited to TYPE_MAXSIZE */
|
|
||||||
len =
|
|
||||||
strnlen(type_name, TYPE_MAXSIZE);
|
|
||||||
strncpy(pbuf, type_name, len);
|
|
||||||
pbuf += len;
|
|
||||||
*pbuf++ = '(';
|
|
||||||
|
|
||||||
for (i = 0; i < ((PyStructSequence *)obj)->ob_base.ob_size; i++) {
|
|
||||||
PyObject *val, *repr;
|
|
||||||
const char *crepr;
|
|
||||||
|
|
||||||
val = PyStructSequence_GET_ITEM(obj, i);
|
|
||||||
repr = PyObject_Repr(val);
|
|
||||||
if (repr == NULL)
|
|
||||||
return NULL;
|
|
||||||
crepr = PyUnicode_AsUTF8(repr);
|
|
||||||
if (crepr == NULL) {
|
|
||||||
Py_DECREF(repr);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* + 3: keep space for ", " */
|
|
||||||
len = strlen(crepr) + 2;
|
|
||||||
if ((pbuf + len) <= endofbuf) {
|
|
||||||
strcpy(pbuf, crepr);
|
|
||||||
pbuf += strlen(crepr);
|
|
||||||
*pbuf++ = ',';
|
|
||||||
*pbuf++ = ' ';
|
|
||||||
removelast = 1;
|
|
||||||
Py_DECREF(repr);
|
|
||||||
} else {
|
|
||||||
strcpy(pbuf, "...");
|
|
||||||
pbuf += 3;
|
|
||||||
removelast = 0;
|
|
||||||
Py_DECREF(repr);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (removelast) {
|
|
||||||
/* overwrite last ", " */
|
|
||||||
pbuf -= 2;
|
|
||||||
}
|
|
||||||
*pbuf++ = ')';
|
|
||||||
*pbuf = '\0';
|
|
||||||
|
|
||||||
return PyUnicode_FromString(buf);
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static bool legal_symbol(const char *s) {
|
static bool legal_symbol(const char *s) {
|
||||||
@ -761,8 +635,9 @@ PyObject *term_to_nametuple(const char *s, arity_t arity, PyObject *tuple) {
|
|||||||
typp = (PyTypeObject *)d;
|
typp = (PyTypeObject *)d;
|
||||||
} else {
|
} else {
|
||||||
PyStructSequence_Desc *desc = PyMem_Calloc(sizeof(PyStructSequence_Desc), 1);
|
PyStructSequence_Desc *desc = PyMem_Calloc(sizeof(PyStructSequence_Desc), 1);
|
||||||
desc->name = PyMem_Malloc(strlen(s) + 1);
|
char *tnp;
|
||||||
strcpy(desc->name, s);
|
desc->name = tnp = PyMem_Malloc(strlen(s) + 1);
|
||||||
|
strcpy(tnp, s);
|
||||||
desc->doc = "YAPTerm";
|
desc->doc = "YAPTerm";
|
||||||
desc->fields = pnull;
|
desc->fields = pnull;
|
||||||
desc->n_in_sequence = arity;
|
desc->n_in_sequence = arity;
|
||||||
@ -773,7 +648,7 @@ PyObject *term_to_nametuple(const char *s, arity_t arity, PyObject *tuple) {
|
|||||||
return NULL;
|
return NULL;
|
||||||
typp->tp_traverse = NULL;
|
typp->tp_traverse = NULL;
|
||||||
typp->tp_flags |=
|
typp->tp_flags |=
|
||||||
Py_TPFLAGS_TUPLE_SUBCLASS|
|
// Py_TPFLAGS_TUPLE_SUBCLASS|
|
||||||
Py_TPFLAGS_BASETYPE|
|
Py_TPFLAGS_BASETYPE|
|
||||||
Py_TPFLAGS_HEAPTYPE;
|
Py_TPFLAGS_HEAPTYPE;
|
||||||
// don't do this: we cannot add a type as an atribute.
|
// don't do this: we cannot add a type as an atribute.
|
||||||
@ -783,8 +658,6 @@ PyObject *term_to_nametuple(const char *s, arity_t arity, PyObject *tuple) {
|
|||||||
Py_INCREF(key);
|
Py_INCREF(key);
|
||||||
Py_INCREF(typp);
|
Py_INCREF(typp);
|
||||||
}
|
}
|
||||||
typp->tp_repr = structseq_repr;
|
|
||||||
typp->tp_str = structseq_str;
|
|
||||||
}
|
}
|
||||||
PyObject *o = PyStructSequence_New(typp);
|
PyObject *o = PyStructSequence_New(typp);
|
||||||
Py_INCREF(typp);
|
Py_INCREF(typp);
|
||||||
@ -915,7 +788,14 @@ PyObject *compound_to_pytree(term_t t, PyObject *context, bool cvt) {
|
|||||||
PyTuple_SET_ITEM(n, 1, out);
|
PyTuple_SET_ITEM(n, 1, out);
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
return term_to_nametuple(s, arity, out);
|
if (cvt)
|
||||||
|
return term_to_nametuple(s, arity, out);
|
||||||
|
else {
|
||||||
|
PyObject *rc = PyTuple_New(2);
|
||||||
|
PyTuple_SetItem(rc, 0, PyUnicode_FromString(s));
|
||||||
|
PyTuple_SetItem(rc, 1, out);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1146,7 +1026,13 @@ PyObject *compound_to_pyeval(term_t t, PyObject *context, bool cvt) {
|
|||||||
// PyObject_Print(rc, stderr, 0);
|
// PyObject_Print(rc, stderr, 0);
|
||||||
// DebugPrintf("CallObject %p\n", rc);
|
// DebugPrintf("CallObject %p\n", rc);
|
||||||
} else {
|
} else {
|
||||||
|
if (cvt)
|
||||||
rc = term_to_nametuple(s, arity, pArgs);
|
rc = term_to_nametuple(s, arity, pArgs);
|
||||||
|
else {
|
||||||
|
rc = PyTuple_New(2);
|
||||||
|
PyTuple_SetItem(rc, 0, ys);
|
||||||
|
PyTuple_SetItem(rc, 1, pArgs);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
|
@ -31,7 +31,7 @@ static foreign_t python_represent( term_t name, term_t tobj) {
|
|||||||
term_t stackp = python_acquire_GIL();
|
term_t stackp = python_acquire_GIL();
|
||||||
PyObject *e;
|
PyObject *e;
|
||||||
|
|
||||||
e = term_to_python(tobj, false, NULL, true);
|
e = term_to_python(tobj, false, NULL, false);
|
||||||
if (e == NULL) {
|
if (e == NULL) {
|
||||||
python_release_GIL(stackp);
|
python_release_GIL(stackp);
|
||||||
pyErrorAndReturn(false);
|
pyErrorAndReturn(false);
|
||||||
|
@ -74,48 +74,46 @@ argi(N,I,I1) :-
|
|||||||
|
|
||||||
python_query( Caller, String ) :-
|
python_query( Caller, String ) :-
|
||||||
atomic_to_term( String, Goal, VarNames ),
|
atomic_to_term( String, Goal, VarNames ),
|
||||||
query_to_answer( Goal, VarNames, Status, Bindings),
|
query_to_answer( Goal, _, Status, VarNames, Bindings),
|
||||||
Caller.port := Status,
|
Caller.port := Status,
|
||||||
write_query_answer( Bindings ),
|
output(Caller, Bindings).
|
||||||
answer := {},
|
|
||||||
foldl(ground_dict(answer), Bindings, [], Ts),
|
output( _, Bindings ) :-
|
||||||
term_variables( Ts, Hidden),
|
write_query_answer( Bindings ),
|
||||||
foldl(bv, Hidden , 0, _),
|
fail.
|
||||||
|
output( Caller, Bindings ) :-
|
||||||
|
answer := {},
|
||||||
|
foldl(ground_dict(answer), Bindings, [], Ts),
|
||||||
|
term_variables( Ts, Hidden),
|
||||||
|
foldl(bv, Hidden , 0, _),
|
||||||
maplist(into_dict(answer),Ts),
|
maplist(into_dict(answer),Ts),
|
||||||
Caller.answer := json.dumps(answer),
|
Caller.answer := json.dumps(answer),
|
||||||
S := Caller.answer,
|
S := Caller.answer,
|
||||||
format(user_error, '~nor ~s~n~n',S).
|
format(user_error, '~nor ~s~n~n',S),
|
||||||
|
fail.
|
||||||
|
output(_Caller, _Bindings).
|
||||||
|
|
||||||
bv(V,I,I1) :-
|
bv(V,I,I1) :-
|
||||||
atomic_concat(['__',I],V),
|
atomic_concat(['__',I],V),
|
||||||
I1 is I+1.
|
I1 is I+1.
|
||||||
|
|
||||||
into_dict(D,V0=T) :-
|
into_dict(D,V0=T) :-
|
||||||
D[V0] := T.
|
python_represents(D[V0], T).
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
ground_dict(_Dict, var([V,V]), I, I) :-
|
ground_dict(_Dict,var([_V]), I, I) :-
|
||||||
!.
|
!.
|
||||||
ground_dict(Dict, nonvar([V0|Vs], T),I0, [V0=T| I0]) :-
|
ground_dict(_Dict,var([V,V]), I, I) :-
|
||||||
|
!.
|
||||||
|
ground_dict(Dict, nonvar([V0|Vs],T),I0, [V0=T| I0]) :-
|
||||||
!,
|
!,
|
||||||
ground_dict( Dict, var([V0|Vs]), I0, I0).
|
ground_dict(Dict, var([V0|Vs]),I0, I0).
|
||||||
ground_dict(Dict, var([V0,V|Vs]), I, I) :-
|
ground_dict(Dict, var([V0,V1|Vs]), I, I) :-
|
||||||
!,
|
!,
|
||||||
Dict[V]=V0,
|
Dict[V1] := V0,
|
||||||
ground_dict( Dict, var([V0|Vs]), I, I).
|
ground_dict(Dict, var([V0|Vs]), I, I).
|
||||||
ground_dict(_, _, _, _).
|
|
||||||
|
|
||||||
|
|
||||||
bound_dict(Dict, nonvar([V0|Vs], T)) :-
|
|
||||||
!,
|
|
||||||
Dict[V0] := T,
|
|
||||||
bound_dict( Dict, var([V0|Vs])).
|
|
||||||
bound_dict(Dict, var([V0,V|Vs])) :-
|
|
||||||
!,
|
|
||||||
Dict[V] := V0,
|
|
||||||
bound_dict( Dict, var([V0|Vs])).
|
|
||||||
bound_dict(_, _).
|
|
||||||
|
|
||||||
|
@ -389,20 +389,22 @@ version(T) :-
|
|||||||
fail.
|
fail.
|
||||||
'$set_toplevel_hook'(_).
|
'$set_toplevel_hook'(_).
|
||||||
|
|
||||||
query_to_answer(G, V, Status, Vs) :-
|
query_to_answer(G, V, Status, Vs, Bindings ) :-
|
||||||
gated_call( true, (G,'$delayed_goals'(G, V, Vs, LGs, _DCP)), Status, '$answer'( Status, LGs, Vs ) ).
|
gated_call( true, (G,'$delayed_goals'(G, V, Vs, LGs, _DCP)), Status, '$answer'( Status, LGs, Vs, Bindings ) ).
|
||||||
|
|
||||||
'$answer'( exit, LGs, Vs) :-
|
'$answer'( exit, LGs, Vs, Bindings ) :-
|
||||||
!. %,
|
!,
|
||||||
%'$process_answer'(Vs, LGs).
|
'$sort'(Vs, NVs),
|
||||||
'$answer'( answer, LGs, Vs) :-
|
'$prep_answer_var_by_var'(NVs, Bindings , LGs).
|
||||||
!. %,
|
'$answer'( answer, LGs, Vs, Bindings) :-
|
||||||
% '$process_answer'(Vs, LGs, Bindings).
|
!,
|
||||||
'$answer'(!, _, _).
|
'$sort'(Vs, NVs),
|
||||||
'$answer'(fail,_,_).
|
'$prep_answer_var_by_var'(NVs, Bindings , LGs).
|
||||||
|
'$answer'(!, _, _,_).
|
||||||
|
'$answer'(fail,_,_,_).
|
||||||
'$answer'(exception(E),_,_,_) :-
|
'$answer'(exception(E),_,_,_) :-
|
||||||
'$LoopError'(E,error).
|
'$LoopError'(E,error).
|
||||||
'$answer'(external_exception(_),_,_).
|
'$answer'(external_exception(_),_,_,_).
|
||||||
|
|
||||||
|
|
||||||
%% @}
|
%% @}
|
||||||
|
@ -113,7 +113,6 @@ undefined_query(G0, M0, Cut) :-
|
|||||||
|
|
||||||
% undef handler
|
% undef handler
|
||||||
'$undefp'([M0|G0],_) :-
|
'$undefp'([M0|G0],_) :-
|
||||||
start_low_level_trace,
|
|
||||||
% make sure we do not loop on undefined predicates
|
% make sure we do not loop on undefined predicates
|
||||||
setup_call_catcher_cleanup(
|
setup_call_catcher_cleanup(
|
||||||
'$undef_set'(Action,Debug,Current),
|
'$undef_set'(Action,Debug,Current),
|
||||||
|
Reference in New Issue
Block a user