diff --git a/C/parser.c b/C/parser.c index 808706e0c..3b475ba49 100755 --- a/C/parser.c +++ b/C/parser.c @@ -1048,7 +1048,7 @@ Term Yap_Parse(UInt prio) { CACHE_REGS Volatile Term t; JMPBUFF FailBuff; - yhandle_t sls = Yap_CurrentSlot(PASS_REGS1); + yhandle_t sls = Yap_StartSlots(); if (!sigsetjmp(FailBuff.JmpBuff, 0)) { diff --git a/H/YapHandles.h b/H/YapHandles.h index 86de7d6ef..02239d1e0 100755 --- a/H/YapHandles.h +++ b/H/YapHandles.h @@ -67,6 +67,7 @@ static inline void Yap_RebootSlots__(int wid USES_REGS) { /// @brief declares a new set of slots. /// Used to tell how many slots we had when we entered a segment of code. +//#define Yap_StartSlots() ( printf("[<<<%s,%s,%d-%ld\n",__FILE__,__FUNCTION__,__LINE__,LOCAL_CurSlot)?Yap_StartSlots__(PASS_REGS1): -1) #define Yap_StartSlots() Yap_StartSlots__(PASS_REGS1) static inline yhandle_t Yap_StartSlots__(USES_REGS1) { @@ -78,7 +79,9 @@ static inline yhandle_t Yap_StartSlots__(USES_REGS1) { return LOCAL_CurSlot; } + /// @brief reset slots to a well-known position in the stack +//#define Yap_CloseSlots(slot) ( printf("- %s,%s,%d %ld>>>]\n",__FILE__,__FUNCTION__,__LINE__, slot)?Yap_CloseSlots__(slot PASS_REGS):-1) #define Yap_CloseSlots(slot) Yap_CloseSlots__(slot PASS_REGS) static inline void Yap_CloseSlots__(yhandle_t slot USES_REGS) { @@ -143,9 +146,10 @@ static inline void ensure_slots(int N USES_REGS) { } } +/// @brief create a new slot with term t +//#define Yap_InitSlot(t) ( printf("+%d %s,%s,%d>>>]\n",1,__FILE__,__FUNCTION__,__LINE__)?Yap_InitSlot__(t PASS_REGS):-1) #define Yap_InitSlot(t) Yap_InitSlot__(t PASS_REGS) -/// @brief create a new slot with term t static inline yhandle_t Yap_InitSlot__(Term t USES_REGS) { yhandle_t old_slots = LOCAL_CurSlot; // fprintf(stderr,"IS %s:%d\n", __FUNCTION__, __LINE__); @@ -156,6 +160,7 @@ static inline yhandle_t Yap_InitSlot__(Term t USES_REGS) { return old_slots; } +//#define Yap_NewSlots(n) ( printf("+%d %s,%s,%d>>>]\n",n,__FILE__,__FUNCTION__,__LINE__)?Yap_NewSlots__(n PASS_REGS):-1) #define Yap_NewSlots(n) Yap_NewSlots__(n PASS_REGS) /// @brief allocate n empty new slots @@ -172,6 +177,7 @@ static inline yhandle_t Yap_NewSlots__(int n USES_REGS) { return old_slots; } +//#define Yap_InitSlots(n, ts) ( printf("+%d %s,%s,%d>>>]\n",n,__FILE__,__FUNCTION__,__LINE__)?Yap_InitSlots__(n, ts PASS_REGS):-1) #define Yap_InitSlots(n, ts) Yap_InitSlots__(n, ts PASS_REGS) /// @brief create n new slots with terms ts[] @@ -190,15 +196,16 @@ static inline yhandle_t Yap_InitSlots__(int n, Term *ts USES_REGS) { /// @brief Succeeds if it is to recover the space allocated for $n$ contiguos /// slots starting at topSlot. static inline bool Yap_RecoverSlots(int n, yhandle_t topSlot USES_REGS) { - if (topSlot + n < LOCAL_CurSlot) + if (topSlot+n < LOCAL_CurSlot) return false; -// fprintf(stderr,"RS %s:%d\n", __FUNCTION__, __LINE__); #ifdef DEBUG - if (topSlot + n > LOCAL_CurSlot) { + if (n > LOCAL_CurSlot) { Yap_Error(SYSTEM_ERROR_INTERNAL, 0 , "Inconsistent slot state in Yap_RecoverSlots.", 0); return false; } #endif + LOCAL_CurSlot -= n; +// fprintf(stderr,"RS %s:%d\n", __FUNCTION__, __LINE__); return true; } diff --git a/include/YapErrors.h b/include/YapErrors.h index 9c230ee99..9b480f0e8 100644 --- a/include/YapErrors.h +++ b/include/YapErrors.h @@ -35,8 +35,9 @@ BEGIN_ERRORS() E(DOMAIN_ERROR_OUT_OF_RANGE, DOMAIN_ERROR, "out_of_range") E(DOMAIN_ERROR_OPERATOR_PRIORITY, DOMAIN_ERROR, "operator_priority") E(DOMAIN_ERROR_OPERATOR_SPECIFIER, DOMAIN_ERROR, "operator_specifier") - E(DOMAIN_ERROR_RADIX, DOMAIN_ERROR, "radix") E(DOMAIN_ERROR_PROLOG_FLAG, DOMAIN_ERROR, "prolog_flag") + E(DOMAIN_ERROR_RADIX, DOMAIN_ERROR, "radix") + E(DOMAIN_ERROR_READ_OPTION, DOMAIN_ERROR, "read_option") E(DOMAIN_ERROR_SHIFT_COUNT_OVERFLOW, DOMAIN_ERROR, "shift_count_overflow") E(DOMAIN_ERROR_SOURCE_SINK, DOMAIN_ERROR, "source_sink") E(DOMAIN_ERROR_SOLUTIONS, DOMAIN_ERROR, "solutions") diff --git a/os/readterm.c b/os/readterm.c index e9be3ee51..e56f300e1 100644 --- a/os/readterm.c +++ b/os/readterm.c @@ -620,6 +620,14 @@ static parser_state_t initParser(Term opts, FEnv *fe, REnv *re, int inp_stream, fe->nargs = nargs; fe->args = setReadEnv(opts, fe, re, inp_stream); } + if (fe->args == NULL) { + if (LOCAL_Error_TYPE == DOMAIN_ERROR_OUT_OF_RANGE) + LOCAL_Error_TYPE = DOMAIN_ERROR_READ_OPTION; + if (LOCAL_Error_TYPE) + Yap_Error(LOCAL_Error_TYPE, LOCAL_Error_Term, NULL); + fe->t = 0; + return YAP_PARSING_FINISHED;; + } if (GLOBAL_Stream[inp_stream].status & Push_Eof_Stream_f) { fe->t = MkAtomTerm(AtomEof); GLOBAL_Stream[inp_stream].status &= ~Push_Eof_Stream_f; @@ -790,7 +798,9 @@ static Int yhandle_t h = Yap_InitSlot(ARG1); if ((rc = Yap_read_term(LOCAL_c_input_stream, ARG2, 2)) == 0) return FALSE; - return Yap_unify(Yap_GetFromSlot(h), rc); + Term tf = Yap_GetFromSlot(h); + Yap_RecoverSlots(1, h PASS_REGS); + return Yap_unify(tf, rc); } static Int read_term( @@ -806,7 +816,9 @@ static Int read_term( } out = Yap_read_term(inp_stream, ARG3, 3); UNLOCK(GLOBAL_Stream[inp_stream].streamlock); - return out != 0L && Yap_unify(Yap_GetFromSlot(h), out); + Term tf = Yap_GetFromSlot(h); + Yap_RecoverSlots(1, h PASS_REGS); + return out != 0L && Yap_unify(tf, out); } #define READ_CLAUSE_DEFS() \ @@ -952,7 +964,9 @@ static Int read_clause2(USES_REGS1) { Term rc; yhandle_t h = Yap_InitSlot(ARG1); rc = Yap_read_term(LOCAL_c_input_stream, Deref(ARG2), -2); - return rc && Yap_unify(Yap_GetFromSlot(h), rc); + Term tf = Yap_GetFromSlot(h); + Yap_RecoverSlots(1, h PASS_REGS); + return rc && Yap_unify(tf, rc); } /** @@ -986,7 +1000,9 @@ static Int read_clause( inp_stream = Yap_CheckTextStream(ARG1, Input_Stream_f, "read/3"); out = Yap_read_term(inp_stream, t3, -3); UNLOCK(GLOBAL_Stream[inp_stream].streamlock); - return out && Yap_unify(Yap_GetFromSlot(h), out); + Term tf = Yap_GetFromSlot(h); + Yap_RecoverSlots(1, h PASS_REGS); + return out && Yap_unify(tf, out); } /** @@ -1139,7 +1155,9 @@ Term Yap_StringToTerm(const char *s, size_t len, encoding_t *encp, int prio, UNLOCK(GLOBAL_Stream[stream].streamlock); if (rval && bindings) { *bindings = Yap_GetFromSlot(sl); - Yap_RecoverSlots(sl, 1 PASS_REGS); + } + if (bindings) { + Yap_RecoverSlots(sl, 1 PASS_REGS); } return rval; }