From b58dbff72727313a700d6e41046d3a3f0ab77762 Mon Sep 17 00:00:00 2001 From: vsc Date: Tue, 28 May 2002 16:26:00 +0000 Subject: [PATCH] fix restore git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@498 b08c6af1-5177-4d33-ba66-4b1c6b8b522a --- C/amasm.c | 2 +- C/cdmgr.c | 4 +- C/compiler.c | 4 +- C/exec.c | 2 +- C/init.c | 26 +++++++-- C/iopreds.c | 140 +++++++++++-------------------------------------- C/save.c | 100 +++++++++++++++++++++++------------ C/tracer.c | 2 +- C/unify.c | 48 ++++++++--------- H/iopreds.h | 122 ++++++++++++++++++++++++++++++++++++++++++ Makefile.in | 8 +-- m4/Yatom.h.m4 | 4 +- m4/sshift.h.m4 | 14 ++--- 13 files changed, 282 insertions(+), 194 deletions(-) create mode 100644 H/iopreds.h diff --git a/C/amasm.c b/C/amasm.c index 8383e0b76..187ac1afa 100644 --- a/C/amasm.c +++ b/C/amasm.c @@ -714,7 +714,7 @@ a_p(op_numbers opcode) int comit_ok = (comit_lab == 0); Prop fe = (Prop) (cpc->rnd1); CELL Flags = RepPredProp(fe)->PredFlags; - if (Flags & BasicPredFlag) { + if (Flags & AsmPredFlag) { op_numbers op; check_alloc(); diff --git a/C/cdmgr.c b/C/cdmgr.c index a9854b397..755f1afee 100644 --- a/C/cdmgr.c +++ b/C/cdmgr.c @@ -1632,7 +1632,7 @@ p_undefined(void) if (pe == RepPredProp(NIL)) return (TRUE); READ_LOCK(pe->PRWLock); - if (pe->PredFlags & (CPredFlag|UserCPredFlag|TestPredFlag|BasicPredFlag|DynamicPredFlag)) { + if (pe->PredFlags & (CPredFlag|UserCPredFlag|TestPredFlag|AsmPredFlag|DynamicPredFlag)) { READ_UNLOCK(pe->PRWLock); return(FALSE); } @@ -2258,7 +2258,7 @@ p_system_pred(void) return (FALSE); if (EndOfPAEntr(pe)) return(FALSE); - return(pe->ModuleOfPred == 0 || pe->PredFlags & (UserCPredFlag|CPredFlag|BinaryTestPredFlag|BasicPredFlag|TestPredFlag)); + return(pe->ModuleOfPred == 0 || pe->PredFlags & (UserCPredFlag|CPredFlag|BinaryTestPredFlag|AsmPredFlag|TestPredFlag)); } static Int /* $cut_transparent(P) */ diff --git a/C/compiler.c b/C/compiler.c index ff371158c..1977a98d5 100644 --- a/C/compiler.c +++ b/C/compiler.c @@ -1453,7 +1453,7 @@ c_goal(Term Goal, int mod) #endif } return; - } else if (p->PredFlags & BasicPredFlag) { + } else if (p->PredFlags & AsmPredFlag) { int op = p->PredFlags & 0x7f; if (profiling) emit(enter_profiling_op, (CELL)p, Zero); @@ -1600,7 +1600,7 @@ c_goal(Term Goal, int mod) } } else { - if (p->PredFlags & (CPredFlag | BasicPredFlag)) { + if (p->PredFlags & (CPredFlag | AsmPredFlag)) { #ifdef YAPOR if (p->PredFlags & SyncPredFlag) emit(sync_op, (CELL)p, (CELL)(p->ArityOfPE)); diff --git a/C/exec.c b/C/exec.c index bf2ce2866..f68c04137 100644 --- a/C/exec.c +++ b/C/exec.c @@ -1111,7 +1111,7 @@ RunTopGoal(Term t) } if (pe == NIL || ppe->OpcodeOfPred == UNDEF_OPCODE || - ppe->PredFlags & (UserCPredFlag|CPredFlag|BasicPredFlag) ) + ppe->PredFlags & (UserCPredFlag|CPredFlag|AsmPredFlag) ) { if (pe != NIL) { READ_UNLOCK(ppe->PRWLock); diff --git a/C/init.c b/C/init.c index b78c752eb..389e62669 100644 --- a/C/init.c +++ b/C/init.c @@ -513,7 +513,13 @@ InitCPred(char *Name, int Arity, CPredicate code, int flags) { Atom atom = LookupAtom(Name); PredEntry *pe; - yamop *p_code = (yamop *)AllocCodeSpace((CELL)NEXTOP(NEXTOP(((yamop *)NULL),sla),e)); + yamop *p_code = ((Clause *)NULL)->ClCode; + Clause *cl = (Clause *)AllocCodeSpace((CELL)NEXTOP(NEXTOP(((yamop *)p_code),sla),e)); + + cl->u.ClValue = 0; + cl->ClFlags = 0; + cl->Owner = LookupAtom("user"); + p_code = cl->ClCode; if (Arity) pe = RepPredProp(PredPropByFunc(MkFunctor(atom, Arity),CurrentModule)); @@ -548,8 +554,13 @@ InitCmpPred(char *Name, int Arity, CmpPredicate cmp_code, CPredicate code, int f { Atom atom = LookupAtom(Name); PredEntry *pe; - yamop *p_code = (yamop *)AllocCodeSpace((CELL)NEXTOP(NEXTOP(((yamop *)NULL),sla),e)); + yamop *p_code = ((Clause *)NULL)->ClCode; + Clause *cl = (Clause *)AllocCodeSpace((CELL)NEXTOP(NEXTOP(((yamop *)p_code),sla),e)); + cl->u.ClValue = 0; + cl->ClFlags = 0; + cl->Owner = LookupAtom("user"); + p_code = cl->ClCode; if (Arity) pe = RepPredProp(PredPropByFunc(MkFunctor(atom, Arity),CurrentModule)); else @@ -589,10 +600,15 @@ InitAsmPred(char *Name, int Arity, int code, CPredicate def, int flags) pe = RepPredProp(PredPropByFunc(MkFunctor(atom, Arity),CurrentModule)); else pe = RepPredProp(PredPropByAtom(atom,CurrentModule)); - pe->PredFlags = flags | StandardPredFlag | (code); + pe->PredFlags = flags | AsmPredFlag | StandardPredFlag | (code); if (def != NULL) { - yamop *p_code = (yamop *)AllocCodeSpace((CELL)NEXTOP(NEXTOP(((yamop *)NULL),sla),e)); + yamop *p_code = ((Clause *)NULL)->ClCode; + Clause *cl = (Clause *)AllocCodeSpace((CELL)NEXTOP(NEXTOP(((yamop *)p_code),sla),e)); + cl->u.ClValue = 0; + cl->ClFlags = 0; + cl->Owner = LookupAtom("user"); + p_code = cl->ClCode; p_code->u.sla.l = pe->TrueCodeOfPred = (CODEADDR) def; pe->CodeOfPred = pe->FirstClause = pe->LastClause = (CODEADDR) p_code; pe->ModuleOfPred = CurrentModule; @@ -606,7 +622,7 @@ InitAsmPred(char *Name, int Arity, int code, CPredicate def, int flags) pe->StateOfPred = NUMBER_OF_CPREDS; NUMBER_OF_CPREDS++; } else { - pe->FirstClause = pe->LastClause = NIL; + pe->FirstClause = pe->LastClause = NULL; pe->OpcodeOfPred = opcode(_undef_p); pe->TrueCodeOfPred = pe->CodeOfPred = (CODEADDR)(&(pe->OpcodeOfPred)); diff --git a/C/iopreds.c b/C/iopreds.c index e2190b395..a38888b8c 100644 --- a/C/iopreds.c +++ b/C/iopreds.c @@ -28,7 +28,7 @@ static char SccsId[] = "%W% %G%"; #include "Yatom.h" #include "Heap.h" #include "yapio.h" - +#include "iopreds.h" #include #if HAVE_STDARG_H #include @@ -80,57 +80,6 @@ static char SccsId[] = "%W% %G%"; #endif #endif -/* if we botched in a LongIO operation */ -jmp_buf IOBotch; - -#if HAVE_LIBREADLINE - -#if _MSC_VER || defined(__MINGW32__) -FILE *rl_instream, *rl_outstream; -#endif - -#endif - -typedef struct - { - union { - struct { - Atom name; - Term user_name; - YP_File file; - } file; - struct { - char *buf; /* where the file is being read from/written to */ - Int max_size; /* maximum buffer size (may be changed dynamically) */ - Int pos; - } mem_string; - struct { -#if defined(__MINGW32__) || _MSC_VER - HANDLE hdl; -#else - int fd; -#endif - } pipe; -#if USE_SOCKET - struct { - socket_domain domain; - socket_info flags; - int fd; - } socket; -#endif - } u; - int (* stream_putc)(int, int); /* function the stream uses for writing */ - int (* stream_getc)(int); /* function the stream uses for reading */ - /* function the stream uses for parser. It may be different if the ISO - character conversion is on */ - int (* stream_getc_for_read)(int); - Int charcount, linecount, linepos; - Int status; - Int och; - } -StreamDesc; - -STATIC_PROTO (void InitStdStream, (int, SMALLUNSGN, YP_File, Atom)); STATIC_PROTO (Int PlIOError, (yap_error_number, Term, char *)); STATIC_PROTO (int FilePutc, (int, int)); STATIC_PROTO (int MemPutc, (int, int)); @@ -220,35 +169,12 @@ STATIC_PROTO (Int p_type_of_char, (void)); STATIC_PROTO (Int GetArgSizeFromChar, (Term *)); -#define YAP_ERROR NIL +static int parser_error_style = FAIL_ON_PARSER_ERROR; -#define MaxStreams 32 - -StreamDesc Stream[MaxStreams]; - -#define Free_Stream_f 0x000001 -#define Output_Stream_f 0x000002 -#define Input_Stream_f 0x000004 -#define Append_Stream_f 0x000008 -#define Eof_Stream_f 0x000010 -#define Null_Stream_f 0x000020 -#define Tty_Stream_f 0x000040 -#define Socket_Stream_f 0x000080 -#define Binary_Stream_f 0x000100 -#define Eof_Error_Stream_f 0x000200 -#define Reset_Eof_Stream_f 0x000400 -#define Past_Eof_Stream_f 0x000800 -#define Push_Eof_Stream_f 0x001000 -#define Seekable_Stream_f 0x002000 -#define Promptable_Stream_f 0x004000 -#if USE_SOCKET -#define Client_Socket_Stream_f 0x008000 -#define Server_Socket_Stream_f 0x010000 +#if EMACS +static int first_char; #endif -#define InMemory_Stream_f 0x020000 -#define Pipe_Stream_f 0x040000 -#define Popen_Stream_f 0x080000 int YP_stdin = 0; int YP_stdout = 1; @@ -256,27 +182,6 @@ int YP_stderr = 2; int c_input_stream, c_output_stream; -#if EMACS -static int first_char; -#endif - -#define FAIL_ON_PARSER_ERROR 0 -#define QUIET_ON_PARSER_ERROR 1 -#define CONTINUE_ON_PARSER_ERROR 2 -#define EXCEPTION_ON_PARSER_ERROR 3 - -static int parser_error_style = FAIL_ON_PARSER_ERROR; - -#define StdInStream 0 -#define StdOutStream 1 -#define StdErrStream 2 - -#define ALIASES_BLOCK_SIZE 8 - -#if USE_SOCKET -extern int YP_sockets_io; -#endif - /* note: fprintf may be called from anywhere, so please don't try to be smart and allocate stack from somewhere else */ int @@ -426,6 +331,15 @@ p_always_prompt_user(void) return(TRUE); } +static int +is_same_tty(YP_File f1, YP_File f2) +{ +#if HAVE_TTYNAME + return(ttyname(YP_fileno(f1)) == ttyname(YP_fileno(f1))); +#else + return(TRUE); +#endif +} static void InitStdStream (int sno, SMALLUNSGN flags, YP_File file, Atom name) @@ -463,7 +377,7 @@ InitStdStream (int sno, SMALLUNSGN flags, YP_File file, Atom name) #if HAVE_LIBREADLINE if (s->status & Tty_Stream_f) { if (Stream[0].status & Tty_Stream_f && - s->u.file.name == Stream[0].u.file.name) + is_same_tty(s->u.file.file,Stream[0].u.file.file)) s->stream_putc = ReadlinePutc; s->stream_getc = ReadlineGetc; } else @@ -498,7 +412,7 @@ InitStdStream (int sno, SMALLUNSGN flags, YP_File file, Atom name) s->status |= Tty_Stream_f|Promptable_Stream_f; #endif #if HAVE_SETBUF - if ((s->status & Tty_Stream_f) && file == stdin) + if (s->status & Tty_Stream_f) /* make sure input is unbuffered if it comes from stdin, this makes life simpler for interrupt handling */ YP_setbuf (stdin, NULL); @@ -508,19 +422,13 @@ InitStdStream (int sno, SMALLUNSGN flags, YP_File file, Atom name) void -InitPlIO (void) +InitStdStreams (void) { - Int i; - - for (i = 0; i < MaxStreams; ++i) - Stream[i].status = Free_Stream_f; InitStdStream (StdInStream, Input_Stream_f, stdin, AtomUsrIn); InitStdStream (StdOutStream, Output_Stream_f, stdout, AtomUsrOut); InitStdStream (StdErrStream, Output_Stream_f, stderr, AtomUsrErr); c_input_stream = StdInStream; c_output_stream = StdOutStream; - /* alloca alias array */ - FileAliases = (AliasDesc)AllocCodeSpace(sizeof(struct AliasDescS)*ALIASES_BLOCK_SIZE); /* init standard aliases */ FileAliases[0].name = AtomUsrIn; FileAliases[0].alias_stream = 0; @@ -532,6 +440,18 @@ InitPlIO (void) SzOfFileAliases = ALIASES_BLOCK_SIZE; } +void +InitPlIO (void) +{ + Int i; + + for (i = 0; i < MaxStreams; ++i) + Stream[i].status = Free_Stream_f; + /* alloca alias array */ + FileAliases = (AliasDesc)AllocCodeSpace(sizeof(struct AliasDescS)*ALIASES_BLOCK_SIZE); + InitStdStreams(); +} + static Int PlIOError (yap_error_number type, Term culprit, char *who) { @@ -1006,7 +926,7 @@ EOFGetc(int sno) if (s->status & Tty_Stream_f) { s->stream_getc = ReadlineGetc; if (Stream[0].status & Tty_Stream_f && - s->u.file.name == Stream[0].u.file.name) + is_same_tty(s->u.file.file,Stream[0].u.file.file)) s->stream_putc = ReadlinePutc; } else #endif @@ -1349,7 +1269,7 @@ PlUnGetc (int sno) if (s->status & Tty_Stream_f) { s->stream_getc = ReadlineGetc; if (Stream[0].status & Tty_Stream_f && - s->u.file.name == Stream[0].u.file.name) + is_same_tty(s->u.file.file,Stream[0].u.file.file)) s->stream_putc = ReadlinePutc; } else #endif diff --git a/C/save.c b/C/save.c index bc304b47c..a736788eb 100644 --- a/C/save.c +++ b/C/save.c @@ -23,6 +23,7 @@ static char SccsId[] = "@(#)save.c 1.3 3/15/90"; #include "yapio.h" #include "sshift.h" #include "Foreign.h" +#include "iopreds.h" #if HAVE_STRING_H #include #endif @@ -59,11 +60,11 @@ static char end_msg[256] ="*** End of YAP saved state *****"; #ifdef DEBUG /* - * FOR DEBUGGING define DEBUG_RESTORE0 to check the file stuff, -define DEBUG_RESTORE1 to see if it is able to prepare the chain, -define DEBUG_RESTORE2 to see how things are going, -define DEBUG_RESTORE3 to check if the atom chain is still a working - * chain, + * + #FOR DEBUGGING define DEBUG_RESTORE0 to check the file stuff, + #define DEBUG_RESTORE1 to see if it is able to prepare the chain, + #define DEBUG_RESTORE2 to see how things are going, + #define DEBUG_RESTORE3 to check if the atom chain is still a working chain, * define DEBUG_RESTORE4 if you want to set the output for some * particular file, * define DEBUG_RESTORE5 if you want to see how the stacks are being @@ -75,8 +76,6 @@ define DEBUG_RESTORE3 to check if the atom chain is still a working * Good Luck */ -#define DEBUG_RESTORE2 1 - #endif STATIC_PROTO(void myread, (int, char *, Int)); @@ -999,6 +998,7 @@ restore_codes(void) for (i = 0; i < heap_regs->no_of_modules; i++) { heap_regs->module_name[i] = AtomTermAdjust(heap_regs->module_name[i]); + heap_regs->module_pred[i] = PtoPredAdjust(heap_regs->module_pred[i]); } } heap_regs->atom_abol = AtomAdjust(heap_regs->atom_abol); @@ -1116,10 +1116,14 @@ restore_codes(void) #endif heap_regs->term_prolog = AtomTermAdjust(heap_regs->term_prolog); heap_regs->term_refound_var = AtomTermAdjust(heap_regs->term_refound_var); - heap_regs->dyn_array_list = - (struct array_entry *)AddrAdjust((ADDR)heap_regs->dyn_array_list); - heap_regs->file_aliases = - (struct AliasDescS *)AddrAdjust((ADDR)heap_regs->file_aliases); + if (heap_regs->dyn_array_list != NULL) { + heap_regs->dyn_array_list = + (struct array_entry *)AddrAdjust((ADDR)heap_regs->dyn_array_list); + } + if (heap_regs->file_aliases != NULL) { + heap_regs->file_aliases = + (struct AliasDescS *)AddrAdjust((ADDR)heap_regs->file_aliases); + } heap_regs->yap_lib_dir = (char *)AddrAdjust((ADDR)heap_regs->yap_lib_dir); heap_regs->pred_goal_expansion = @@ -1132,6 +1136,8 @@ restore_codes(void) (PredEntry *)AddrAdjust((ADDR)heap_regs->pred_throw); heap_regs->pred_handle_throw = (PredEntry *)AddrAdjust((ADDR)heap_regs->pred_handle_throw); + if (heap_regs->dyn_array_list != NULL) + heap_regs->dyn_array_list = PtoArrayEAdjust(heap_regs->dyn_array_list); if (heap_regs->undef_code != NULL) heap_regs->undef_code = (PredEntry *)PtoHeapCellAdjust((CELL *)(heap_regs->undef_code)); if (heap_regs->creep_code != NULL) @@ -1266,11 +1272,12 @@ AdjustDBTerm(Term trm) if (IsApplTerm(trm)) { Functor f; Term *p0 = p = PtoHeapCellAdjust(RepAppl(trm)); - f = FuncAdjust((Functor)(*p)); - *p = (Term)f ; + f = (Functor)*p; if (!IsExtensionFunctor(f)) { int Arity, i; + f = FuncAdjust(f); + *p = (Term)f; Arity = ArityOfFunctor(f); p++; for (i = 0; i < Arity; ++i) { @@ -1553,15 +1560,24 @@ RestoreClause(Clause *Cl) { yamop *pc; - OPREG cl_type = Cl->ClFlags; + OPREG cl_type = FirstArgOfClType(Cl->ClFlags); if (cl_type == ApplCl || - (cl_type == ListCl && HeadOfClType(cl_type) == ApplCl)) + (cl_type == ListCl && HeadOfClType(cl_type) == ApplCl)) { +#ifdef DEBUG_RESTORE2 + YP_fprintf(errout, "at %p, appl: %lx -> %lx", Cl, Cl->u.ClValue, + (CELL)FuncAdjust((Functor)(Cl->u.ClValue))); +#endif Cl->u.ClValue = (CELL)FuncAdjust((Functor)(Cl->u.ClValue)); - else if ((cl_type == AtCl || + } else if ((cl_type == AtCl || (cl_type == ListCl && HeadOfClType(cl_type) == AtCl)) && - IsAtomTerm(Cl->u.ClValue)) + IsAtomTerm(Cl->u.ClValue)) { +#ifdef DEBUG_RESTORE2 + YP_fprintf(errout, "at %p, atom: %lx -> %lx", Cl, Cl->u.ClValue, + (CELL)FuncAdjust((Functor)(Cl->u.ClValue))); +#endif Cl->u.ClValue = AtomTermAdjust(Cl->u.ClValue); + } /* TO DO: log update semantics */ /* Get the stored operator */ pc = Cl->ClCode; @@ -2436,22 +2452,26 @@ CleanCode(PredEntry *pp) if (pp->OwnerFile) pp->OwnerFile = AtomAdjust(pp->OwnerFile); pp->OpcodeOfPred = opcode(op_from_opcode(pp->OpcodeOfPred)); - if (pp->PredFlags & (CPredFlag|BasicPredFlag)) { - if (pp->CodeOfPred != NULL) { - if (pp->CodeOfPred == pp->TrueCodeOfPred) { - if (pp->PredFlags & CPredFlag) - /* C, assembly + C */ - pp->CodeOfPred = pp->TrueCodeOfPred = CCodeAdjust(pp); - else - /* assembly */ - pp->CodeOfPred = (CODEADDR)AddrAdjust((ADDR)(pp->CodeOfPred)); - } else { - /* comparison */ - if (pp->PredFlags & BinaryTestPredFlag) { - pp->CodeOfPred = CCodeAdjust(pp); - pp->TrueCodeOfPred = DirectCCodeAdjust(pp); - } - } + if (pp->PredFlags & CPredFlag) { + if (pp->PredFlags & BinaryTestPredFlag) { + pp->TrueCodeOfPred = DirectCCodeAdjust(pp); + } else { + /* C, assembly + C */ + pp->CodeOfPred = pp->TrueCodeOfPred = CCodeAdjust(pp); + } + pp->CodeOfPred = pp->FirstClause = pp->LastClause = + (CODEADDR)AddrAdjust((ADDR)(pp->LastClause)); + CleanClauses(pp->FirstClause, pp->FirstClause); + } else if (pp->PredFlags & AsmPredFlag) { + /* assembly */ + if (pp->FirstClause) { + pp->CodeOfPred = (CODEADDR)AddrAdjust((ADDR)(pp->CodeOfPred)); + pp->FirstClause = (CODEADDR)AddrAdjust((ADDR)(pp->FirstClause)); + pp->LastClause = (CODEADDR)AddrAdjust((ADDR)(pp->LastClause)); + CleanClauses(pp->FirstClause, pp->FirstClause); + } else { + pp->TrueCodeOfPred = pp->CodeOfPred = + (CODEADDR)(&(pp->OpcodeOfPred)); } } else { if (pp->FirstClause) @@ -2460,6 +2480,8 @@ CleanCode(PredEntry *pp) pp->LastClause = CodeAddrAdjust(pp->LastClause); pp->CodeOfPred = CodeAddrAdjust(pp->CodeOfPred); pp->TrueCodeOfPred = CodeAddrAdjust(pp->TrueCodeOfPred); + if (pp->NextPredOfModule) + pp->NextPredOfModule = PtoPredAdjust(pp->NextPredOfModule); flag = pp->PredFlags; FirstC = pp->FirstClause; LastC = pp->LastClause; @@ -2525,6 +2547,8 @@ RestoreEntries(PropEntry *pp) if (ae->ArrayEArity < 0) { restore_static_array((StaticArrayEntry *)ae); } else { + if (ae->NextArrayE != NULL) + ae->NextArrayE = PtoArrayEAdjust(ae->NextArrayE); if (IsVarTerm(ae->ValueOfVE)) RESET_VARIABLE(&(ae->ValueOfVE)); else { @@ -2659,6 +2683,13 @@ RestoreForeignCodeStructure(void) } } +/* restore the atom entries which are invisible for the user */ +static void +RestoreIOStructures(void) +{ + InitStdStreams(); +} + /* restores the list of free space, with its curious structure */ static void RestoreFreeSpace(void) @@ -2713,6 +2744,7 @@ restore_heap(void) } RestoreInvisibleAtoms(); RestoreForeignCodeStructure(); + RestoreIOStructures(); } @@ -2952,7 +2984,7 @@ UnmarkTrEntries(void) if (IsVarTerm(entry)) { RESET_VARIABLE((CELL *)entry); } else if (IsPairTerm(entry)) { - CODEADDR ent = (CODEADDR)RepPair(entry); + CODEADDR ent = CodeAddrAdjust((CODEADDR)RepPair(entry)); register CELL flags; flags = Flags(ent); diff --git a/C/tracer.c b/C/tracer.c index fe331934b..1be4ff6ae 100644 --- a/C/tracer.c +++ b/C/tracer.c @@ -113,7 +113,7 @@ low_level_trace(yap_low_level_port port, PredEntry *pred, CELL *args) vsc_count++; /* if (vsc_count < 618000) return; */ - if (vsc_count == 131) { + if (vsc_count == 64) { printf("Here I go\n"); } /* if (vsc_count > 500000) exit(0); */ diff --git a/C/unify.c b/C/unify.c index 399dbcc73..9f7d4af2b 100644 --- a/C/unify.c +++ b/C/unify.c @@ -1718,31 +1718,31 @@ InitUnify(void) InitCPred("unify_with_occurs_check", 2, p_ocunify, SafePredFlag); InitCPred("cyclic_term", 1, p_cyclic, SafePredFlag|TestPredFlag); InitCPred("acyclic_term", 1, p_acyclic, SafePredFlag|TestPredFlag); - InitAsmPred("$$cut_by", 1, _cut_by, p_cut_by, SafePredFlag | BasicPredFlag); + InitAsmPred("$$cut_by", 1, _cut_by, p_cut_by, SafePredFlag); - InitAsmPred("atom", 1, _atom, p_atom, SafePredFlag | BasicPredFlag); - InitAsmPred("atomic", 1, _atomic, p_atomic, SafePredFlag | BasicPredFlag); - InitAsmPred("integer", 1, _integer, p_integer, SafePredFlag | BasicPredFlag); - InitAsmPred("nonvar", 1, _nonvar, p_nonvar, SafePredFlag | BasicPredFlag); - InitAsmPred("number", 1, _number, p_number, SafePredFlag | BasicPredFlag); - InitAsmPred("var", 1, _var, p_var, SafePredFlag | BasicPredFlag); - InitAsmPred("db_reference", 1, _db_ref, p_db_ref, SafePredFlag | BasicPredFlag); - InitAsmPred("primitive", 1, _primitive, p_primitive, SafePredFlag | BasicPredFlag); - InitAsmPred("compound", 1, _compound, p_compound, SafePredFlag | BasicPredFlag); - InitAsmPred("float", 1, _float, p_float, SafePredFlag | BasicPredFlag); - InitAsmPred("=", 2, _equal, p_equal, SafePredFlag | BasicPredFlag); - InitAsmPred("\\=", 2, _dif, p_dif, SafePredFlag | BasicPredFlag); - InitAsmPred("==", 2, _eq, p_eq, SafePredFlag | BasicPredFlag); - InitAsmPred("arg", 3, _arg, p_arg, SafePredFlag | BasicPredFlag); - InitAsmPred("functor", 3, _functor, p_functor, SafePredFlag | BasicPredFlag); - InitAsmPred("$plus", 3, _plus, p_erroneous_call, SafePredFlag | BasicPredFlag); - InitAsmPred("$minus", 3, _minus, p_erroneous_call, SafePredFlag | BasicPredFlag); - InitAsmPred("$times", 3, _times, p_erroneous_call, SafePredFlag | BasicPredFlag); - InitAsmPred("$div", 3, _div, p_erroneous_call, SafePredFlag | BasicPredFlag); - InitAsmPred("$and", 3, _and, p_erroneous_call, SafePredFlag | BasicPredFlag); - InitAsmPred("$or", 3, _or, p_erroneous_call, SafePredFlag | BasicPredFlag); - InitAsmPred("$sll", 3, _sll, p_erroneous_call, SafePredFlag | BasicPredFlag); - InitAsmPred("$slr", 3, _slr, p_erroneous_call, SafePredFlag | BasicPredFlag); + InitAsmPred("atom", 1, _atom, p_atom, SafePredFlag); + InitAsmPred("atomic", 1, _atomic, p_atomic, SafePredFlag); + InitAsmPred("integer", 1, _integer, p_integer, SafePredFlag); + InitAsmPred("nonvar", 1, _nonvar, p_nonvar, SafePredFlag); + InitAsmPred("number", 1, _number, p_number, SafePredFlag); + InitAsmPred("var", 1, _var, p_var, SafePredFlag); + InitAsmPred("db_reference", 1, _db_ref, p_db_ref, SafePredFlag); + InitAsmPred("primitive", 1, _primitive, p_primitive, SafePredFlag); + InitAsmPred("compound", 1, _compound, p_compound, SafePredFlag); + InitAsmPred("float", 1, _float, p_float, SafePredFlag); + InitAsmPred("=", 2, _equal, p_equal, SafePredFlag); + InitAsmPred("\\=", 2, _dif, p_dif, SafePredFlag); + InitAsmPred("==", 2, _eq, p_eq, SafePredFlag); + InitAsmPred("arg", 3, _arg, p_arg, SafePredFlag); + InitAsmPred("functor", 3, _functor, p_functor, SafePredFlag); + InitAsmPred("$plus", 3, _plus, p_erroneous_call, SafePredFlag); + InitAsmPred("$minus", 3, _minus, p_erroneous_call, SafePredFlag); + InitAsmPred("$times", 3, _times, p_erroneous_call, SafePredFlag); + InitAsmPred("$div", 3, _div, p_erroneous_call, SafePredFlag); + InitAsmPred("$and", 3, _and, p_erroneous_call, SafePredFlag); + InitAsmPred("$or", 3, _or, p_erroneous_call, SafePredFlag); + InitAsmPred("$sll", 3, _sll, p_erroneous_call, SafePredFlag); + InitAsmPred("$slr", 3, _slr, p_erroneous_call, SafePredFlag); } diff --git a/H/iopreds.h b/H/iopreds.h new file mode 100644 index 000000000..f2a924c5e --- /dev/null +++ b/H/iopreds.h @@ -0,0 +1,122 @@ +/************************************************************************* +* * +* YAP Prolog * +* * +* Yap Prolog was developed at NCCUP - Universidade do Porto * +* * +* Copyright L.Damas, V.S.Costa and Universidade do Porto 1985-1997 * +* * +************************************************************************** +* * +* File: iopreds.c * +* Last rev: 5/2/88 * +* mods: * +* comments: Input/Output C implemented predicates * +* * +*************************************************************************/ +#ifdef SCCS +static char SccsId[] = "%W% %G%"; +#endif + +/* + * This file defines main data-structure for stream management, + * + */ + +/* if we botched in a LongIO operation */ +jmp_buf IOBotch; + +#if HAVE_LIBREADLINE + +#if _MSC_VER || defined(__MINGW32__) +FILE *rl_instream, *rl_outstream; +#endif + +#endif + +typedef struct + { + union { + struct { + Atom name; + Term user_name; + YP_File file; + } file; + struct { + char *buf; /* where the file is being read from/written to */ + Int max_size; /* maximum buffer size (may be changed dynamically) */ + Int pos; + } mem_string; + struct { +#if defined(__MINGW32__) || _MSC_VER + HANDLE hdl; +#else + int fd; +#endif + } pipe; +#if USE_SOCKET + struct { + socket_domain domain; + socket_info flags; + int fd; + } socket; +#endif + } u; + int (* stream_putc)(int, int); /* function the stream uses for writing */ + int (* stream_getc)(int); /* function the stream uses for reading */ + /* function the stream uses for parser. It may be different if the ISO + character conversion is on */ + int (* stream_getc_for_read)(int); + Int charcount, linecount, linepos; + Int status; + Int och; + } +StreamDesc; + +#define YAP_ERROR NIL + +#define MaxStreams 32 + +StreamDesc Stream[MaxStreams]; + +#define Free_Stream_f 0x000001 +#define Output_Stream_f 0x000002 +#define Input_Stream_f 0x000004 +#define Append_Stream_f 0x000008 +#define Eof_Stream_f 0x000010 +#define Null_Stream_f 0x000020 +#define Tty_Stream_f 0x000040 +#define Socket_Stream_f 0x000080 +#define Binary_Stream_f 0x000100 +#define Eof_Error_Stream_f 0x000200 +#define Reset_Eof_Stream_f 0x000400 +#define Past_Eof_Stream_f 0x000800 +#define Push_Eof_Stream_f 0x001000 +#define Seekable_Stream_f 0x002000 +#define Promptable_Stream_f 0x004000 +#if USE_SOCKET +#define Client_Socket_Stream_f 0x008000 +#define Server_Socket_Stream_f 0x010000 +#endif +#define InMemory_Stream_f 0x020000 +#define Pipe_Stream_f 0x040000 +#define Popen_Stream_f 0x080000 + +#define FAIL_ON_PARSER_ERROR 0 +#define QUIET_ON_PARSER_ERROR 1 +#define CONTINUE_ON_PARSER_ERROR 2 +#define EXCEPTION_ON_PARSER_ERROR 3 + +#define StdInStream 0 +#define StdOutStream 1 +#define StdErrStream 2 + +#define ALIASES_BLOCK_SIZE 8 + +#if USE_SOCKET +extern int YP_sockets_io; +#endif + +void STD_PROTO (InitStdStreams, (void)); + + diff --git a/Makefile.in b/Makefile.in index 2c73507f5..bcd385253 100644 --- a/Makefile.in +++ b/Makefile.in @@ -102,13 +102,15 @@ INTERFACE_HEADERS = $(srcdir)/include/c_interface.h $(srcdir)/include/yap_struct HEADERS = \ $(GHEADERS) $(INTERFACE_HEADERS) \ + $(srcdir)/H/Heap.h \ $(srcdir)/H/Regs.h $(srcdir)/H/Yapproto.h \ - $(srcdir)/H/absmi.h $(srcdir)/H/alloc.h $(srcdir)/H/Heap.h \ + $(srcdir)/H/absmi.h $(srcdir)/H/alloc.h \ $(srcdir)/H/amidefs.h $(srcdir)/H/amiops.h $(srcdir)/H/arrays.h \ + $(srcdir)/H/arith2.h $(srcdir)/H/attvar.h \ $(srcdir)/H/clause.h $(srcdir)/H/compile.h \ $(srcdir)/H/corout.h $(srcdir)/H/eval.h $(srcdir)/H/heapgc.h \ - $(srcdir)/H/index.h $(srcdir)/H/yapio.h $(srcdir)/H/tracer.h \ - $(srcdir)/H/attvar.h $(srcdir)/H/arith2.h \ + $(srcdir)/H/index.h $(srcdir)/H/iopreds.h \ + $(srcdir)/H/tracer.h $(srcdir)/H/yapio.h \ $(srcdir)/OPTYap/opt.config.h \ $(srcdir)/OPTYap/opt.proto.h $(srcdir)/OPTYap/opt.structs.h \ $(srcdir)/OPTYap/opt.macros.h $(srcdir)/OPTYap/or.macros.h \ diff --git a/m4/Yatom.h.m4 b/m4/Yatom.h.m4 index f5c01b971..83f4e73d8 100644 --- a/m4/Yatom.h.m4 +++ b/m4/Yatom.h.m4 @@ -154,7 +154,7 @@ Constructor(Prop,AbsVal,ValEntry *,p,p) Inline(IsValProperty, PropFlags, int, flags, (flags == ValProperty) ) /* predicate property entry structure */ -/* BasicPreds are things like var, nonvar, atom ...which are implemented +/* AsmPreds are things like var, nonvar, atom ...which are implemented through dedicated machine instructions. In this case the 8 lower bits of PredFlags are used to hold the machine instruction code for the pred. @@ -171,7 +171,7 @@ typedef enum { MultiFileFlag = 0x040000L, /* is multi-file */ FastPredFlag = 0x020000L, /* is "compiled" */ TestPredFlag = 0x010000L, /* is a test (optim. comit) */ - BasicPredFlag = 0x008000L, /* inline */ + AsmPredFlag = 0x008000L, /* inline */ StandardPredFlag= 0x004000L, /* system predicate */ DynamicPredFlag= 0x002000L, /* dynamic predicate */ CPredFlag = 0x001000L, /* written in C */ diff --git a/m4/sshift.h.m4 b/m4/sshift.h.m4 index b2a396d3e..571801c5c 100644 --- a/m4/sshift.h.m4 +++ b/m4/sshift.h.m4 @@ -60,17 +60,12 @@ Inline(FuncAdjust, Functor, Functor, f, (Functor)(CharP(f)+HDiff) ) Inline(CellPtoHeapAdjust, CELL *, CELL *, ptr, ((CELL *)(CharP(ptr) + HDiff)) ) #if USE_OFFSETS Inline(AtomAdjust, Atom, Atom, at, (at) ) -Inline(AtomTermAdjust, Term, Term, at, (at) ) Inline(PropAdjust, Prop, Prop, p, (p) ) #else -Inline(AtomAdjust, Atom, Atom, at, (Atom)(CharP(at)+HDiff) ) -#if MMAP_ADDR >= 0x40000000 +Inline(AtomAdjust, Atom, Atom, at, (at == NULL ? (at) : (Atom)(CharP(at)+HDiff) )) +Inline(PropAdjust, Prop, Prop, p, (p == NULL ? (p) : (Prop)(CharP(p)+HDiff)) ) +#endif Inline(AtomTermAdjust, Term, Term, at, (at) ) -#else -Inline(AtomTermAdjust, Term, Term, at, MkAtomTerm((Atom)(CharP(AtomOfTerm(at)+HDiff))) ) -#endif -Inline(PropAdjust, Prop, Prop, p, (Prop)(CharP(p)+HDiff) ) -#endif #if TAGS_FAST_OPS Inline(BlobTermAdjust, Term, Term, t, (t-HDiff) ) #else @@ -85,7 +80,8 @@ Inline(CodeAddrAdjust, CODEADDR, CODEADDR, addr, (CODEADDR)(CharP(addr)+HDiff) ) Inline(BlockAdjust, BlockHeader *, BlockHeader *, addr, (BlockHeader *)(CharP(addr)+HDiff) ) Inline(PtoOpAdjust, yamop *, yamop *, ptr, ((yamop *)(CharP(ptr) + HDiff)) ) Inline(PtoHeapCellAdjust, CELL *, CELL *, ptr, ((CELL *)(CharP(ptr) + HDiff)) ) -Inline(PtoPredAdjust, PredEntry *, PredEntry *, ptr, ((CELL *)(CharP(ptr) + HDiff)) ) +Inline(PtoPredAdjust, PredEntry *, PredEntry *, ptr, ((PredEntry *)(CharP(ptr) + HDiff)) ) +Inline(PtoArrayEAdjust, ArrayEntry *, ArrayEntry *, ptr, ((ArrayEntry *)(CharP(ptr) + HDiff)) ) #if PRECOMPUTE_REGADDRESS Inline(XAdjust, AREG, AREG, reg, (AREG)((reg)+XDiff) ) #else