diff --git a/C/absmi.c b/C/absmi.c index c63851073..e6acff277 100755 --- a/C/absmi.c +++ b/C/absmi.c @@ -13818,7 +13818,7 @@ Yap_absmi(int inp) ENDP(pt1); ENDD(d1); } else if (mod != CurrentModule) { - goto execute2_metacall; + goto execute2_metacall; } } if (PRED_GOAL_EXPANSION_ALL) { diff --git a/C/c_interface.c b/C/c_interface.c index c0a0c4fce..4ff55d9d6 100755 --- a/C/c_interface.c +++ b/C/c_interface.c @@ -2647,6 +2647,9 @@ YAP_Init(YAP_init_args *yap_init) else Yap_AttsSize = 2048*sizeof(CELL); if (restore_result == DO_ONLY_CODE) { + /* first, initialise the saved state */ + Term t_goal = MkAtomTerm(AtomStartupSavedState); + YAP_RunGoalOnce(t_goal); return YAP_BOOT_FROM_SAVED_CODE; } else { return YAP_BOOT_FROM_SAVED_STACKS; diff --git a/C/init.c b/C/init.c index e4726f528..dda09cc91 100755 --- a/C/init.c +++ b/C/init.c @@ -484,6 +484,24 @@ InitDebug(void) Yap_PutValue(At, MkIntTerm(15)); } +static UInt +update_flags_from_prolog(UInt flags, PredEntry *pe) +{ + if (pe->PredFlags & MetaPredFlag) + flags |= MetaPredFlag; + if (pe->PredFlags & SourcePredFlag) + flags |= SourcePredFlag; + if (pe->PredFlags & SequentialPredFlag) + flags |= SequentialPredFlag; + if (pe->PredFlags & MyddasPredFlag) + flags |= MyddasPredFlag; + if (pe->PredFlags & UDIPredFlag) + flags |= UDIPredFlag; + if (pe->PredFlags & ModuleTransparentPredFlag) + flags |= ModuleTransparentPredFlag; + return flags; +} + void Yap_InitCPred(char *Name, unsigned long int Arity, CPredicate code, UInt flags) { @@ -521,8 +539,9 @@ Yap_InitCPred(char *Name, unsigned long int Arity, CPredicate code, UInt flags) } if (pe->PredFlags & CPredFlag) { /* already exists */ + flags = update_flags_from_prolog(flags, pe); cl = ClauseCodeToStaticClause(pe->CodeOfPred); - if ((flags | StandardPredFlag | CPredFlag) != pe->PredFlags) { + if ((flags | StandardPredFlag | CPredFlag ) != pe->PredFlags) { Yap_ClauseSpace -= cl->ClSize; Yap_FreeCodeSpace((ADDR)cl); cl = NULL; @@ -618,6 +637,7 @@ Yap_InitCmpPred(char *Name, unsigned long int Arity, CmpPredicate cmp_code, UInt } } if (pe->PredFlags & CPredFlag) { + flags = update_flags_from_prolog(flags, pe); p_code = pe->CodeOfPred; /* already exists */ } else { @@ -691,7 +711,12 @@ Yap_InitAsmPred(char *Name, unsigned long int Arity, int code, CPredicate def, return; } } - pe->PredFlags = flags | AsmPredFlag | StandardPredFlag | (code); + flags |= AsmPredFlag | StandardPredFlag | (code); + if (pe->PredFlags & AsmPredFlag) { + flags = update_flags_from_prolog(flags, pe); + /* already exists */ + } + pe->PredFlags = flags; pe->cs.f_code = def; pe->ModuleOfPred = CurrentModule; if (def != NULL) { @@ -859,6 +884,7 @@ Yap_InitCPredBack(char *Name, unsigned long int Arity, } if (pe->cs.p_code.FirstClause != NIL) { + flags = update_flags_from_prolog(flags, pe); #ifdef CUT_C CleanBack(pe, Start, Cont, Cut); #else diff --git a/H/iatoms.h b/H/iatoms.h index 620af5390..7d0ac0618 100644 --- a/H/iatoms.h +++ b/H/iatoms.h @@ -266,6 +266,7 @@ AtomSpy = Yap_FullLookupAtom("$spy"); AtomStack = Yap_LookupAtom("stack"); AtomStackFree = Yap_LookupAtom("stackfree"); + AtomStartupSavedState = Yap_FullLookupAtom("$startup_saved_state"); AtomStaticClause = Yap_FullLookupAtom("$static_clause"); AtomStaticProcedure = Yap_LookupAtom("static_procedure"); AtomStream = Yap_FullLookupAtom("$stream"); diff --git a/H/ratoms.h b/H/ratoms.h index dc609e0a9..7b0136fa0 100644 --- a/H/ratoms.h +++ b/H/ratoms.h @@ -266,6 +266,7 @@ AtomSpy = AtomAdjust(AtomSpy); AtomStack = AtomAdjust(AtomStack); AtomStackFree = AtomAdjust(AtomStackFree); + AtomStartupSavedState = AtomAdjust(AtomStartupSavedState); AtomStaticClause = AtomAdjust(AtomStaticClause); AtomStaticProcedure = AtomAdjust(AtomStaticProcedure); AtomStream = AtomAdjust(AtomStream); diff --git a/H/tatoms.h b/H/tatoms.h index 0ac10a304..bcfe9eb76 100644 --- a/H/tatoms.h +++ b/H/tatoms.h @@ -530,6 +530,8 @@ #define AtomStack Yap_heap_regs->AtomStack_ Atom AtomStackFree_; #define AtomStackFree Yap_heap_regs->AtomStackFree_ + Atom AtomStartupSavedState_; +#define AtomStartupSavedState Yap_heap_regs->AtomStartupSavedState_ Atom AtomStaticClause_; #define AtomStaticClause Yap_heap_regs->AtomStaticClause_ Atom AtomStaticProcedure_; diff --git a/misc/ATOMS b/misc/ATOMS index 0a6a26df0..27bd9d6c0 100644 --- a/misc/ATOMS +++ b/misc/ATOMS @@ -271,6 +271,7 @@ A SourceSink N "source_sink" A Spy F "$spy" A Stack N "stack" A StackFree N "stackfree" +A StartupSavedState F "$startup_saved_state" A StaticClause F "$static_clause" A StaticProcedure N "static_procedure" A Stream F "$stream" diff --git a/pl/boot.yap b/pl/boot.yap index 6381c2168..3b240c7cf 100755 --- a/pl/boot.yap +++ b/pl/boot.yap @@ -88,6 +88,8 @@ true :- true. ) ), '$db_clean_queues'(0), +% this must be executed from C-code. +% '$startup_saved_state', '$startup_reconsult', '$startup_goals', '$set_input'(user_input),'$set_output'(user), @@ -196,24 +198,38 @@ true :- true. '$sync_mmapped_arrays', set_value('$live','$false'). -'$startup_goals' :- +% +% first, recover what we need from the saved state... +% +'$startup_saved_state' :- get_value('$extend_file_search_path',P), P \= [], set_value('$extend_file_search_path',[]), '$extend_file_search_path'(P), fail. % use if we come from a save_program and we have SWI's shlib -'$startup_goals' :- +'$startup_saved_state' :- recorded('$reload_foreign_libraries',G,R), erase(R), shlib:reload_foreign_libraries, fail. % use if we come from a save_program and we have a goal to execute -'$startup_goals' :- +'$startup_saved_state' :- recorded('$restore_goal',G,R), erase(R), prompt(_,' | '), '$system_catch'('$do_yes_no'((G->true),user),user,Error,user:'$Error'(Error)), fail. +'$startup_saved_state'. + +% then recover program. +'$startup_reconsult' :- + get_value('$consult_on_boot',X), X \= [], !, + set_value('$consult_on_boot',[]), + '$do_startup_reconsult'(X). +'$startup_reconsult'. + + +% then we can execute the programs. '$startup_goals' :- recorded('$startup_goal',G,_), '$current_module'(Module), @@ -252,12 +268,6 @@ true :- true. fail. '$startup_goals'. -'$startup_reconsult' :- - get_value('$consult_on_boot',X), X \= [], !, - set_value('$consult_on_boot',[]), - '$do_startup_reconsult'(X). -'$startup_reconsult'. - % % MYDDAS: Import all the tables from one database %