From 5f3ff4fc73ff9c3d4a64509cf64f1d22072dad1a Mon Sep 17 00:00:00 2001 From: Vitor Santos Costa Date: Wed, 20 Nov 2013 22:25:27 +0000 Subject: [PATCH] use SWI opts for read --- C/iopreds.c | 360 +--------------------------------------------------- C/pl-yap.c | 8 +- C/qlyr.c | 1 - C/save.c | 6 +- 4 files changed, 8 insertions(+), 367 deletions(-) diff --git a/C/iopreds.c b/C/iopreds.c index 12cc7478b..4f52c1e05 100755 --- a/C/iopreds.c +++ b/C/iopreds.c @@ -242,7 +242,7 @@ int beam_write (void) { Yap_StartSlots(); Yap_plwrite (ARG1, NULL, 0, 0, 1200); - Yap_CloseSlots(); + LOCAL_CurSlot = CurSlot; if (EX != 0L) { Term ball = Yap_PopTermFromDB(EX); EX = 0L; @@ -615,9 +615,9 @@ Yap_read_term(term_t t0, IOSTREAM *inp_stream, struct read_data_t *rd) } { Term terror; - GenerateSyntaxError(&terror, tokstart, inp_stream, MkAtomTerm(Yap_LookupAtom(LOCAL_ErrorMessage)) PASS_REGS); if (LOCAL_ErrorMessage == NULL) LOCAL_ErrorMessage = "SYNTAX ERROR"; + GenerateSyntaxError(&terror, tokstart, inp_stream, MkAtomTerm(Yap_LookupAtom(LOCAL_ErrorMessage)) PASS_REGS); Yap_clean_tokenizer(tokstart, LOCAL_VarTable, LOCAL_AnonVarTable, LOCAL_Comments); rd->has_exception = TRUE; @@ -707,360 +707,6 @@ Yap_read_term(term_t t0, IOSTREAM *inp_stream, struct read_data_t *rd) return TRUE; } - -/* - Assumes - Flag: ARG1 - Term: ARG2 - Module: ARG3 - Vars: ARG4 - Pos: ARG5 - Err: ARG6 - Comments: ARG7 - */ -static Int - do_read(IOSTREAM *inp_stream, int nargs USES_REGS) -{ - Term t, v; - TokEntry *tokstart; - Term tmod = Deref(ARG3), OCurrentModule = CurrentModule, tpos; - Term tcomms = Deref(ARG7); - int store_comments = IsVarTerm(tcomms); - - if (IsVarTerm(tmod)) { - tmod = CurrentModule; - } else if (!IsAtomTerm(tmod)) { - Yap_Error(TYPE_ERROR_ATOM, tmod, "read_term/2"); - return FALSE; - } - LOCAL_Error_TYPE = YAP_NO_ERROR; - while (TRUE) { - CELL *old_H; - int64_t cpos = 0; - int seekable = inp_stream->functions->seek != NULL; - - /* two cases where we can seek: memory and console */ - if (seekable) { - cpos = inp_stream->posbuf.byteno; - } - /* Scans the term using stack space */ - while (TRUE) { - old_H = H; - tpos = Yap_StreamPosition(inp_stream); - LOCAL_Comments = TermNil; - LOCAL_CommentsNextChar = LOCAL_CommentsTail = NULL; - tokstart = LOCAL_tokptr = LOCAL_toktide = Yap_tokenizer(inp_stream, store_comments, &tpos); - if (LOCAL_Error_TYPE != YAP_NO_ERROR && seekable) { - H = old_H; - Yap_clean_tokenizer(tokstart, LOCAL_VarTable, LOCAL_AnonVarTable, LOCAL_Comments); - if (seekable) { - Sseek64(inp_stream, cpos, SIO_SEEK_SET); - } - if (LOCAL_Error_TYPE == OUT_OF_TRAIL_ERROR) { - LOCAL_Error_TYPE = YAP_NO_ERROR; - if (!Yap_growtrail (sizeof(CELL) * K16, FALSE)) { - return FALSE; - } - } else if (LOCAL_Error_TYPE == OUT_OF_AUXSPACE_ERROR) { - LOCAL_Error_TYPE = YAP_NO_ERROR; - if (!Yap_ExpandPreAllocCodeSpace(0, NULL, TRUE)) { - return FALSE; - } - } else if (LOCAL_Error_TYPE == OUT_OF_HEAP_ERROR) { - LOCAL_Error_TYPE = YAP_NO_ERROR; - if (!Yap_growheap(FALSE, 0, NULL)) { - return FALSE; - } - } else if (LOCAL_Error_TYPE == OUT_OF_STACK_ERROR) { - LOCAL_Error_TYPE = YAP_NO_ERROR; - if (!Yap_gcl(LOCAL_Error_Size, nargs, ENV, CP)) { - return FALSE; - } - } - } else { - /* done with this */ - break; - } - } - if (!Yap_unify(tpos,ARG5)) { - /* do this early so that we do not have to protect it in case of stack expansion */ - return FALSE; - } - LOCAL_Error_TYPE = YAP_NO_ERROR; - /* preserve value of H after scanning: otherwise we may lose strings - and floats */ - old_H = H; - if (tokstart != NULL && tokstart->Tok == Ord (eot_tok)) { - /* did we get the end of file from an abort? */ - if (LOCAL_ErrorMessage && - !strcmp(LOCAL_ErrorMessage,"Abort")) { - Yap_clean_tokenizer(tokstart, LOCAL_VarTable, LOCAL_AnonVarTable, LOCAL_Comments); - return FALSE; - } else { - Yap_clean_tokenizer(tokstart, LOCAL_VarTable, LOCAL_AnonVarTable, LOCAL_Comments); - - if (store_comments && !Yap_unify(LOCAL_Comments, ARG7)) - return FALSE; - return Yap_unify_constant(ARG2, MkAtomTerm (AtomEof)) - && Yap_unify_constant(ARG4, TermNil); - } - } - repeat_cycle: - CurrentModule = tmod; - if (LOCAL_ErrorMessage || (t = Yap_Parse()) == 0) { - CurrentModule = OCurrentModule; - if (LOCAL_ErrorMessage) { - int res; - - if (!strcmp(LOCAL_ErrorMessage,"Stack Overflow") || - !strcmp(LOCAL_ErrorMessage,"Trail Overflow") || - !strcmp(LOCAL_ErrorMessage,"Heap Overflow")) { - /* ignore term we just built */ - tr_fr_ptr old_TR = TR; - - - H = old_H; - TR = (tr_fr_ptr)LOCAL_ScannerStack; - - if (!strcmp(LOCAL_ErrorMessage,"Stack Overflow")) - res = Yap_growstack_in_parser(&old_TR, &tokstart, &LOCAL_VarTable); - else if (!strcmp(LOCAL_ErrorMessage,"Heap Overflow")) - res = Yap_growheap_in_parser(&old_TR, &tokstart, &LOCAL_VarTable); - else - res = Yap_growtrail_in_parser(&old_TR, &tokstart, &LOCAL_VarTable); - if (res) { - LOCAL_ScannerStack = (char *)TR; - TR = old_TR; - old_H = H; - LOCAL_tokptr = LOCAL_toktide = tokstart; - LOCAL_ErrorMessage = NULL; - goto repeat_cycle; - } - LOCAL_ScannerStack = (char *)TR; - TR = old_TR; - } - } - if (ParserErrorStyle == QUIET_ON_PARSER_ERROR) { - /* just fail */ - Yap_clean_tokenizer(tokstart, LOCAL_VarTable, LOCAL_AnonVarTable, LOCAL_Comments); - return FALSE; - } else if (ParserErrorStyle == CONTINUE_ON_PARSER_ERROR) { - LOCAL_ErrorMessage = NULL; - /* try again */ - goto repeat_cycle; - } else { - Term terr = syntax_error(tokstart, inp_stream, &ARG2); - if (LOCAL_ErrorMessage == NULL) - LOCAL_ErrorMessage = "SYNTAX ERROR"; - - if (ParserErrorStyle == EXCEPTION_ON_PARSER_ERROR) { - Yap_clean_tokenizer(tokstart, LOCAL_VarTable, LOCAL_AnonVarTable, LOCAL_Comments); - Yap_Error(SYNTAX_ERROR,terr,LOCAL_ErrorMessage); - return FALSE; - } else /* FAIL ON PARSER ERROR */ { - Term t[2]; - t[0] = terr; - t[1] = MkAtomTerm(Yap_LookupAtom(LOCAL_ErrorMessage)); - Yap_clean_tokenizer(tokstart, LOCAL_VarTable, LOCAL_AnonVarTable, LOCAL_Comments); - return Yap_unify(ARG6,Yap_MkApplTerm(Yap_MkFunctor(AtomError,2),2,t)); - } - } - } else { - CurrentModule = OCurrentModule; - /* parsing succeeded */ - break; - } - } - if (!Yap_unify(t, ARG2)) - return FALSE; - if (store_comments && !Yap_unify(LOCAL_Comments, ARG7)) - return FALSE; - if (AtomOfTerm (Deref (ARG1)) == AtomTrue) { - while (TRUE) { - CELL *old_H = H; - - if (setjmp(LOCAL_IOBotch) == 0) { - v = Yap_VarNames(LOCAL_VarTable, TermNil); - break; - } else { - tr_fr_ptr old_TR; - restore_machine_regs(); - - old_TR = TR; - /* restart global */ - H = old_H; - TR = (tr_fr_ptr)LOCAL_ScannerStack; - Yap_growstack_in_parser(&old_TR, &tokstart, &LOCAL_VarTable); - LOCAL_ScannerStack = (char *)TR; - TR = old_TR; - } - } - Yap_clean_tokenizer(tokstart, LOCAL_VarTable, LOCAL_AnonVarTable, LOCAL_Comments); - return Yap_unify (v, ARG4); - } else { - Yap_clean_tokenizer(tokstart, LOCAL_VarTable, LOCAL_AnonVarTable, LOCAL_Comments); - return TRUE; - } -} - -static Int -p_read ( USES_REGS1 ) -{ /* '$read'(+Flag,?Term,?Module,?Vars,-Pos,-Err) */ - IOSTREAM *Yap_Scurin(void); - - return do_read(Yap_Scurin(), 7 PASS_REGS); -} - -static Int -p_read2 ( USES_REGS1 ) -{ /* '$read2'(+Flag,?Term,?Module,?Vars,-Pos,-Err,+Stream) */ - IOSTREAM *inp_stream; - Int out; - Term t8 = Deref(ARG8); - - if (IsVarTerm(t8)) { - Yap_Error(INSTANTIATION_ERROR,t8,"read_term/3"); - return FALSE; - } - if (!IsAtomTerm(t8)) { - Yap_Error(TYPE_ERROR_LIST,t8,"read_term/3"); - return(FALSE); - } - if (!(inp_stream = Yap_GetInputStream(AtomOfTerm(t8))) ) { - return(FALSE); - } - out = do_read(inp_stream, 8 PASS_REGS); - return out; -} - - -#if HAVE_SELECT && FALSE -/* stream_select(+Streams,+TimeOut,-Result) */ -static Int -p_stream_select( USES_REGS1 ) -{ - Term t1 = Deref(ARG1), t2; - fd_set readfds, writefds, exceptfds; - struct timeval timeout, *ptime; - -#if _MSC_VER - u_int fdmax=0; -#else - int fdmax=0; -#endif - Term tout = TermNil, ti, Head; - - if (IsVarTerm(t1)) { - Yap_Error(INSTANTIATION_ERROR,t1,"stream_select/3"); - return FALSE; - } - if (!IsPairTerm(t1)) { - Yap_Error(TYPE_ERROR_LIST,t1,"stream_select/3"); - return(FALSE); - } - FD_ZERO(&readfds); - FD_ZERO(&writefds); - FD_ZERO(&exceptfds); - ti = t1; - while (ti != TermNil) { -#if _MSC_VER - u_int fd; -#else - int fd; -#endif - int sno; - - Head = HeadOfTerm(ti); - sno = CheckStream(Head, Input_Stream_f, "stream_select/3"); - if (sno < 0) - return(FALSE); - fd = GetStreamFd(sno); - FD_SET(fd, &readfds); - UNLOCK(Stream[sno].streamlock); - if (fd > fdmax) - fdmax = fd; - ti = TailOfTerm(ti); - } - t2 = Deref(ARG2); - if (IsVarTerm(t2)) { - Yap_Error(INSTANTIATION_ERROR,t2,"stream_select/3"); - return(FALSE); - } - if (IsAtomTerm(t2)) { - if (t2 == MkAtomTerm(AtomOff)) { - /* wait indefinitely */ - ptime = NULL; - } else { - Yap_Error(DOMAIN_ERROR_TIMEOUT_SPEC,t1,"stream_select/3"); - return(FALSE); - } - } else { - Term t21, t22; - - if (!IsApplTerm(t2) || FunctorOfTerm(t2) != FunctorModule) { - Yap_Error(DOMAIN_ERROR_TIMEOUT_SPEC,t2,"stream_select/3"); - return(FALSE); - } - t21 = ArgOfTerm(1, t2); - if (IsVarTerm(t21)) { - Yap_Error(INSTANTIATION_ERROR,t2,"stream_select/3"); - return(FALSE); - } - if (!IsIntegerTerm(t21)) { - Yap_Error(DOMAIN_ERROR_TIMEOUT_SPEC,t2,"stream_select/3"); - return(FALSE); - } - timeout.tv_sec = IntegerOfTerm(t21); - if (timeout.tv_sec < 0) { - Yap_Error(DOMAIN_ERROR_TIMEOUT_SPEC,t2,"stream_select/3"); - return(FALSE); - } - t22 = ArgOfTerm(2, t2); - if (IsVarTerm(t22)) { - Yap_Error(INSTANTIATION_ERROR,t2,"stream_select/3"); - return(FALSE); - } - if (!IsIntegerTerm(t22)) { - Yap_Error(DOMAIN_ERROR_TIMEOUT_SPEC,t2,"stream_select/3"); - return(FALSE); - } - timeout.tv_usec = IntegerOfTerm(t22); - if (timeout.tv_usec < 0) { - Yap_Error(DOMAIN_ERROR_TIMEOUT_SPEC,t2,"stream_select/3"); - return(FALSE); - } - ptime = &timeout; - } - /* do the real work */ - if (select(fdmax+1, &readfds, &writefds, &exceptfds, ptime) < 0) { -#if HAVE_STRERROR - Yap_Error(SYSTEM_ERROR, TermNil, - "stream_select/3 (select: %s)", strerror(errno)); -#else - Yap_Error(SYSTEM_ERROR, TermNil, - "stream_select/3 (select)"); -#endif - } - while (t1 != TermNil) { - int fd; - int sno; - - Head = HeadOfTerm(t1); - sno = CheckStream(Head, Input_Stream_f, "stream_select/3"); - fd = GetStreamFd(sno); - if (FD_ISSET(fd, &readfds)) - tout = MkPairTerm(Head,tout); - else - tout = MkPairTerm(TermNil,tout); - UNLOCK(Stream[sno].streamlock); - t1 = TailOfTerm(t1); - } - /* we're done, just pass the info back */ - return(Yap_unify(ARG3,tout)); - -} -#endif - static Int p_change_type_of_char ( USES_REGS1 ) { /* change_type_of_char(+char,+type) */ @@ -1282,8 +928,6 @@ Yap_InitIOPreds(void) /* here the Input/Output predicates */ Yap_InitCPred ("$set_read_error_handler", 1, p_set_read_error_handler, SafePredFlag|SyncPredFlag); Yap_InitCPred ("$get_read_error_handler", 1, p_get_read_error_handler, SafePredFlag|SyncPredFlag); - Yap_InitCPred ("$read", 7, p_read, SyncPredFlag|UserCPredFlag); - Yap_InitCPred ("$read", 8, p_read2, SyncPredFlag|UserCPredFlag); #ifdef DEBUG Yap_InitCPred ("write_string", 2, p_write_string, SyncPredFlag|UserCPredFlag); #endif diff --git a/C/pl-yap.c b/C/pl-yap.c index fc72b4285..5518073c5 100755 --- a/C/pl-yap.c +++ b/C/pl-yap.c @@ -865,9 +865,9 @@ char * Yap_TermToString(Term t, char *s, size_t sz, size_t *length, int *encoding, int flags) { CACHE_REGS - Int l; + Int l, CurSlot; - Yap_StartSlots( PASS_REGS1 ); + CurSlot = Yap_StartSlots( PASS_REGS1 ); l = Yap_InitSlot(t PASS_REGS ); { IOENC encodings[3]; @@ -910,8 +910,6 @@ Yap_TermToString(Term t, char *s, size_t sz, size_t *length, int *encoding, int strncpy(bf,buf,*length+1); r = bf; } - /* go away */ - Yap_CloseSlots( PASS_REGS1 ); return r; } else { Sclose(fd); @@ -922,7 +920,7 @@ Yap_TermToString(Term t, char *s, size_t sz, size_t *length, int *encoding, int Sfree(r); } } - Yap_CloseSlots( PASS_REGS1 ); + LOCAL_CurSlot = CurSlot; return NULL; } diff --git a/C/qlyr.c b/C/qlyr.c index c7497859e..0a066e9bc 100755 --- a/C/qlyr.c +++ b/C/qlyr.c @@ -1058,7 +1058,6 @@ p_read_program( USES_REGS1 ) read_module(stream); Sclose( stream ); /* back to the top level we go */ - Yap_CloseSlots(PASS_REGS1); ReInitProlog(); Yap_RestartYap( 3 ); return TRUE; diff --git a/C/save.c b/C/save.c index 460852654..c968a1147 100755 --- a/C/save.c +++ b/C/save.c @@ -617,7 +617,7 @@ do_save(int mode USES_REGS) { static Int p_save2( USES_REGS1 ) { - Int res; + Int res, CurSlot; Term t; #ifdef YAPOR @@ -640,9 +640,9 @@ p_save2( USES_REGS1 ) if (!Yap_unify(ARG2,MkIntTerm(1))) return FALSE; which_save = 2; - Yap_StartSlots( PASS_REGS1 ); + CurSlot = Yap_StartSlots( PASS_REGS1 ); res = do_save(DO_EVERYTHING PASS_REGS); - Yap_CloseSlots( PASS_REGS1 ); + LOCAL_CurSlot = CurSlot; return res; }