From 59561e26888f6b4765f346cec22f25a83dccbe2d Mon Sep 17 00:00:00 2001 From: vsc Date: Sun, 13 Mar 2005 06:26:13 +0000 Subject: [PATCH] fix excessive pruning in meta-calls fix Term->int breakage in compiler improve JPL (at least it does something now for amd64). git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@1264 b08c6af1-5177-4d33-ba66-4b1c6b8b522a --- C/absmi.c | 9 +++++--- C/c_interface.c | 9 +++++--- C/compiler.c | 7 +++++-- C/errors.c | 2 +- C/heapgc.c | 2 ++ C/stdpreds.c | 8 +++++-- C/sysbits.c | 7 +++++++ C/threads.c | 10 ++++----- C/utilpreds.c | 2 +- H/threads.h | 2 +- LGPL/JPL/Makefile.in | 2 +- LGPL/JPL/jpl.yap | 47 ++++++++++++++++++++++++++++++++++++++---- LGPL/JPL/src/jpl.c | 17 +++------------ Makefile.in | 4 ++-- configure | 3 ++- configure.in | 2 +- include/YapInterface.h | 2 +- library/swi.yap | 35 ++++++++++++++++++++++++++++++- pl/boot.yap | 14 +++++++++++-- pl/directives.yap | 10 ++++++--- 20 files changed, 146 insertions(+), 48 deletions(-) diff --git a/C/absmi.c b/C/absmi.c index 133354cf6..7e56d71c1 100644 --- a/C/absmi.c +++ b/C/absmi.c @@ -10,8 +10,11 @@ * * * File: absmi.c * * comments: Portable abstract machine interpreter * -* Last rev: $Date: 2005-03-07 17:49:14 $,$Author: vsc $ * +* Last rev: $Date: 2005-03-13 06:26:09 $,$Author: vsc $ * * $Log: not supported by cvs2svn $ +* Revision 1.160 2005/03/07 17:49:14 vsc +* small fixes +* * Revision 1.159 2005/03/04 20:29:55 ricroc * bug fixes for YapTab support * @@ -12505,7 +12508,7 @@ Yap_absmi(int inp) Atom at = AtomOfTerm(d0); arity = 0; if (at == AtomCut) { - choiceptr cut_pt = (choiceptr)ENV[E_CB]; + choiceptr cut_pt = (choiceptr)pt0[E_CB]; /* find where to cut to */ if (SHOULD_CUT_UP_TO(B,cut_pt)) { #ifdef YAPOR @@ -12595,7 +12598,7 @@ Yap_absmi(int inp) ENDP(pt1); CACHE_A1(); } else if ((Atom)(pen->FunctorOfPred) == AtomCut) { - choiceptr cut_pt = (choiceptr)ENV[E_CB]; + choiceptr cut_pt = (choiceptr)pt0[E_CB]; /* find where to cut to */ if (SHOULD_CUT_UP_TO(B,cut_pt)) { #ifdef YAPOR diff --git a/C/c_interface.c b/C/c_interface.c index 3cf38b34a..50e05f73f 100644 --- a/C/c_interface.c +++ b/C/c_interface.c @@ -10,8 +10,11 @@ * File: c_interface.c * * comments: c_interface primitives definition * * * -* Last rev: $Date: 2005-03-04 20:30:10 $,$Author: ricroc $ * +* Last rev: $Date: 2005-03-13 06:26:10 $,$Author: vsc $ * * $Log: not supported by cvs2svn $ +* Revision 1.63 2005/03/04 20:30:10 ricroc +* bug fixes for YapTab support +* * Revision 1.62 2005/03/02 18:35:44 vsc * try to make initialisation process more robust * try to make name more robust (in case Lookup new atom fails) @@ -217,7 +220,7 @@ X_API Term STD_PROTO(YAP_CreateModule,(Atom)); X_API int STD_PROTO(YAP_ThreadSelf,(void)); X_API int STD_PROTO(YAP_GetThreadRefCount,(int)); X_API void STD_PROTO(YAP_SetThreadRefCount,(int,int)); -X_API int STD_PROTO(YAP_ThreadCreateEngine,(thread_attr *)); +X_API CELL STD_PROTO(YAP_ThreadCreateEngine,(thread_attr *)); X_API int STD_PROTO(YAP_ThreadAttachEngine,(int)); X_API int STD_PROTO(YAP_ThreadDetachEngine,(int)); X_API int STD_PROTO(YAP_ThreadDestroyEngine,(int)); @@ -1405,7 +1408,7 @@ YAP_ThreadSelf(void) #endif } -X_API int +X_API CELL YAP_ThreadCreateEngine(thread_attr *attr) { #if USE_THREADS diff --git a/C/compiler.c b/C/compiler.c index 537b092cd..139b95181 100644 --- a/C/compiler.c +++ b/C/compiler.c @@ -11,8 +11,11 @@ * File: compiler.c * * comments: Clause compiler * * * -* Last rev: $Date: 2005-03-04 20:30:11 $,$Author: ricroc $ * +* Last rev: $Date: 2005-03-13 06:26:10 $,$Author: vsc $ * * $Log: not supported by cvs2svn $ +* Revision 1.63 2005/03/04 20:30:11 ricroc +* bug fixes for YapTab support +* * Revision 1.62 2005/02/21 16:49:39 vsc * amd64 fixes * library fixes @@ -1454,7 +1457,7 @@ c_goal(Term Goal, int mod, compiler_struct *cglobs) } else if (f == FunctorComma) { int save = cglobs->onlast; - int t2 = ArgOfTerm(2, Goal); + Term t2 = ArgOfTerm(2, Goal); cglobs->onlast = FALSE; c_goal(ArgOfTerm(1, Goal), mod, cglobs); diff --git a/C/errors.c b/C/errors.c index 1a9e7d81b..23082969c 100644 --- a/C/errors.c +++ b/C/errors.c @@ -373,7 +373,7 @@ Yap_Error(yap_error_number type, Term where, char *format,...) #if DEBUG if (Yap_heap_regs && !(Yap_PrologMode & BootMode)) - fprintf(stderr,"***** Processing Error %d (%x,%x) %s***\n", type, ActiveSignals,Yap_PrologMode,format); + fprintf(stderr,"***** Processing Error %d (%lx,%x) %s***\n", type, (unsigned long int)ActiveSignals,Yap_PrologMode,format); else fprintf(stderr,"***** Processing Error %d (%x) %s***\n", type,Yap_PrologMode,format); #endif diff --git a/C/heapgc.c b/C/heapgc.c index 85d30183a..152fa6c8e 100644 --- a/C/heapgc.c +++ b/C/heapgc.c @@ -2061,7 +2061,9 @@ static void sweep_trail(choiceptr gc_B, tr_fr_ptr old_TR) { tr_fr_ptr trail_ptr, dest; +#if !USE_MALLOC Int OldHeapUsed = HeapUsed; +#endif #ifdef DEBUG Int hp_entrs = 0, hp_erased = 0, hp_not_in_use = 0, hp_in_use_erased = 0, code_entries = 0; diff --git a/C/stdpreds.c b/C/stdpreds.c index bd27e8365..72d914412 100644 --- a/C/stdpreds.c +++ b/C/stdpreds.c @@ -11,8 +11,12 @@ * File: stdpreds.c * * comments: General-purpose C implemented system predicates * * * -* Last rev: $Date: 2005-03-02 19:48:02 $,$Author: vsc $ * +* Last rev: $Date: 2005-03-13 06:26:11 $,$Author: vsc $ * * $Log: not supported by cvs2svn $ +* Revision 1.85 2005/03/02 19:48:02 vsc +* Fix some possible errors in name/2 and friends, and cleanup code a bit +* YAP_Error changed. +* * Revision 1.84 2005/03/02 18:35:46 vsc * try to make initialisation process more robust * try to make name more robust (in case Lookup new atom fails) @@ -501,7 +505,7 @@ showprofres(UInt type) { if (InUnify>0) printf("%p sys: Unify -> %lu (%3.1f%c)\n",(void *) UnifyMode,(unsigned long int)InUnify,(float) InUnify*100/ProfCalls,'%'); if (InCCall>0) printf("%p sys: C Code -> %lu (%3.1f%c)\n",(void *) CCallMode,(unsigned long int)InCCall,(float) InCCall*100/ProfCalls,'%'); if (count>0) printf("Unknown:Unknown -> %lu (%3.1f%c)\n",(unsigned long int)count,(float) count*100/ProfCalls,'%'); - printf("Total of Calls=%u \n",ProfCalls); + printf("Total of Calls=%lu \n",(unsigned long int)ProfCalls); return TRUE; } diff --git a/C/sysbits.c b/C/sysbits.c index 5b5f80c90..5cc4ccea3 100644 --- a/C/sysbits.c +++ b/C/sysbits.c @@ -2219,6 +2219,12 @@ p_host_type(void) { return(Yap_unify(out,ARG1)); } +static Int +p_yap_home(void) { + Term out = MkAtomTerm(Yap_LookupAtom(YAP_HOME_DIR)); + return(Yap_unify(out,ARG1)); +} + /* * This is responsable for the initialization of all machine dependant * predicates @@ -2391,6 +2397,7 @@ Yap_InitSysPreds(void) Yap_InitCPred ("$system", 1, p_system, SafePredFlag|SyncPredFlag|HiddenPredFlag); Yap_InitCPred ("$rename", 2, p_mv, SafePredFlag|SyncPredFlag|HiddenPredFlag); Yap_InitCPred ("$cd", 1, p_cd, SafePredFlag|SyncPredFlag|HiddenPredFlag); + Yap_InitCPred ("$yap_home", 1, p_yap_home, SafePredFlag|SyncPredFlag|HiddenPredFlag); Yap_InitCPred ("$getcwd", 1, p_getcwd, SafePredFlag|SyncPredFlag|HiddenPredFlag); Yap_InitCPred ("$dir_separator", 1, p_dir_sp, SafePredFlag|HiddenPredFlag); Yap_InitCPred ("$alarm", 2, p_alarm, SafePredFlag|SyncPredFlag|HiddenPredFlag); diff --git a/C/threads.c b/C/threads.c index 9925c48c0..553ae7611 100644 --- a/C/threads.c +++ b/C/threads.c @@ -201,7 +201,7 @@ p_thread_self(void) return Yap_unify(MkIntegerTerm(worker_id), ARG1); } -int +Int Yap_thread_self(void) { if (pthread_getspecific(Yap_yaamregs_key) == NULL) @@ -209,7 +209,7 @@ Yap_thread_self(void) return worker_id; } -int +CELL Yap_thread_create_engine(thread_attr *ops) { int new_id = allocate_new_tid(); @@ -225,7 +225,7 @@ Yap_thread_create_engine(thread_attr *ops) return TRUE; } -int +Int Yap_thread_attach_engine(int wid) { pthread_mutex_lock(&(ThreadHandle[wid].tlock)); @@ -241,7 +241,7 @@ Yap_thread_attach_engine(int wid) return TRUE; } -int +Int Yap_thread_detach_engine(int wid) { pthread_mutex_lock(&(ThreadHandle[wid].tlock)); @@ -252,7 +252,7 @@ Yap_thread_detach_engine(int wid) return TRUE; } -int +Int Yap_thread_destroy_engine(int wid) { pthread_mutex_lock(&(ThreadHandle[wid].tlock)); diff --git a/C/utilpreds.c b/C/utilpreds.c index dee9098a1..8dcd5ff94 100644 --- a/C/utilpreds.c +++ b/C/utilpreds.c @@ -1579,7 +1579,7 @@ static int subsumes_complex(register CELL *pt0, register CELL *pt0_end, register { register CELL **to_visit = (CELL **)ASP; tr_fr_ptr OLDTR = TR, new_tr; - int write_mode = TRUE; + UInt write_mode = TRUE; HBREG = H; diff --git a/H/threads.h b/H/threads.h index 074577076..88a2defed 100644 --- a/H/threads.h +++ b/H/threads.h @@ -7,7 +7,7 @@ typedef struct{ Int STD_PROTO(Yap_thread_self,(void)); int STD_PROTO(Yap_get_thread_ref_count,(int)); void STD_PROTO(Yap_set_thread_ref_count,(int,int)); -Int STD_PROTO(Yap_thread_create_engine,(thread_attr *)); +CELL STD_PROTO(Yap_thread_create_engine,(thread_attr *)); Int STD_PROTO(Yap_thread_attach_engine,(int)); Int STD_PROTO(Yap_thread_detach_engine,(int)); Int STD_PROTO(Yap_thread_destroy_engine,(int)); diff --git a/LGPL/JPL/Makefile.in b/LGPL/JPL/Makefile.in index a567f3a46..39be3bc6d 100644 --- a/LGPL/JPL/Makefile.in +++ b/LGPL/JPL/Makefile.in @@ -23,7 +23,7 @@ INSTALL_DATA=@INSTALL_DATA@ INSTALL_PROGRAM=@INSTALL_PROGRAM@ srcdir=@srcdir@ -PROGRAMS= $(srcdir)/jpl.yap +PROGRAMS= $(srcdir)/jpl.yap jpl_paths.yap install: $(PROGRAMS) mkdir -p $(DESTDIR)$(SHAREDIR)/Yap diff --git a/LGPL/JPL/jpl.yap b/LGPL/JPL/jpl.yap index 15e4d0ccd..aec111da9 100644 --- a/LGPL/JPL/jpl.yap +++ b/LGPL/JPL/jpl.yap @@ -1,4 +1,4 @@ -/* $Id: jpl.yap,v 1.1 2004-08-27 20:27:56 vsc Exp $ +/* $Id: jpl.yap,v 1.2 2005-03-13 06:26:12 vsc Exp $ Part of JPL -- SWI-Prolog/Java interface @@ -27,6 +27,9 @@ by the GNU General Public License. This exception does not however invalidate any other reasons why the executable file might be covered by the GNU General Public License. + + Adapted to YAP by Vitor Santos Costa. + */ :- module(jpl, @@ -79,9 +82,10 @@ :- use_module(library(swi)). % suppress debugging this library -:- set_prolog_flag(generate_debug_info, false). +%:- set_prolog_flag(generate_debug_info, false). + +:- initialization(load_jpl_lib). -:- load_foreign_files([jpl], ['/opt/j2sdk1.4.2_04/jre/lib/i386/client/libjvm.so'], jpl_install). %:- load_foreign_files([jpl], [], jpl_install). %------------------------------------------------------------------------------ @@ -4080,7 +4084,8 @@ prolog:error_message(java_exception(Ex)) --> :- multifile user:file_search_path/2. :- dynamic user:file_search_path/2. -user:file_search_path(jar, swi(lib)). +user:(file_search_path(jar, Dir) :- + file_search_path(library, Dir)). /******************************* @@ -4251,5 +4256,39 @@ report_java_setup_problem(E) :- print_message(error, E), check_java_environment. +:- include(jpl_paths). + +load_jpl_lib :- + jpl_java_home(JavaHome), + fetch_arch(Arch), + gen_jvm_lib(JavaHome,Arch,JLib), + write(JLib),nl, + load_foreign_files([jpl], [JLib], jpl_install), !. + +fetch_arch(Arch) :- + current_prolog_flag(host_type,Name), + atom_codes(Name,Codes), + gen_arch(Codes,Arch). + +gen_arch([0'x,0'8,0'6,0'_,0'6,0'4|_],amd64). +gen_arch([0'i,_,0'8,0'6|_],i386). % take all versions of X86 +gen_arch([0's,0'p,0'a,0'r,0'c|_],sparc). + +gen_jvm_lib(JavaHome,Arch,JLib) :- + atom_concat([JavaHome,'/jre/lib/',Arch,'/client/libjvm.so'],JLib), + exists(JLib), !. +gen_jvm_lib(JavaHome,Arch,JLib) :- + atom_concat([JavaHome,'/jre/lib/',Arch,'/server/libjvm.so'],JLib), + exists(JLib), !. +gen_jvm_lib(JavaHome,Arch,JLib) :- + atom_concat([JavaHome,'/jre/lib/',Arch,'/classic/libjvm.so'],JLib), + exists(JLib), !. +gen_jvm_lib(JavaHome,Arch,JLib) :- + atom_concat([JavaHome,'/jre/lib/',Arch,'/libjvm.so'],JLib), + exists(JLib), !. + + +:- load_jpl_lib. + :- initialization setup_jvm. diff --git a/LGPL/JPL/src/jpl.c b/LGPL/JPL/src/jpl.c index 7a78bd9b4..c1581e8e9 100644 --- a/LGPL/JPL/src/jpl.c +++ b/LGPL/JPL/src/jpl.c @@ -1,4 +1,4 @@ -/* $Id: jpl.c,v 1.1 2004-08-27 20:27:32 vsc Exp $ +/* $Id: jpl.c,v 1.2 2005-03-13 06:26:12 vsc Exp $ Part of JPL -- SWI-Prolog/Java interface @@ -20,6 +20,8 @@ You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Ported to YAP by Vitor Santos Costa. */ // this source file (jpl.c) combines my Prolog-calls-Java stuff (mostly prefixed 'JNI' or 'jni' here) @@ -754,18 +756,6 @@ jpl_c_lib_version(void) %T jpl_c_lib_version( -atom) */ -// ... -// -static foreign_t -jpl_c_java_home( - term_t ta - ) - { - - return PL_unify_atom_chars(ta,JAVA_HOME); - } - - // ... // static foreign_t @@ -3394,7 +3384,6 @@ PL_extension predspecs[] = { "jni_func", 6, jni_func_4_plc, 0 }, { "jpl_c_lib_version", 1, jpl_c_lib_version_1_plc, 0 }, { "jpl_c_lib_version", 4, jpl_c_lib_version_4_plc, 0 }, - { "jpl_java_home", 1, jpl_c_java_home, 0 }, { NULL, 0, NULL, 0 } }; diff --git a/Makefile.in b/Makefile.in index 79f2ea800..1c828576a 100644 --- a/Makefile.in +++ b/Makefile.in @@ -404,7 +404,7 @@ stdpreds.o: $(srcdir)/C/stdpreds.c $(CC) -c $(CFLAGS) $(srcdir)/C/stdpreds.c -o $@ sysbits.o: $(srcdir)/C/sysbits.c - $(CC) -c $(CFLAGS) -DLIB_DIR=\"$(YAPLIBDIR)\" -DSHARE_DIR=\"$(SHAREDIR)\" $(srcdir)/C/sysbits.c -o $@ + $(CC) -c $(CFLAGS) -DYAP_HOME_DIR=\"$(ROOTDIR)\" -DLIB_DIR=\"$(YAPLIBDIR)\" -DSHARE_DIR=\"$(SHAREDIR)\" $(srcdir)/C/sysbits.c -o $@ threads.o: $(srcdir)/C/threads.c $(CC) -c $(CFLAGS) $(srcdir)/C/threads.c -o $@ @@ -558,11 +558,11 @@ install_library: @YAPLIB@ $(INSTALL_DATA) libYap.a $(DESTDIR)$(LIBDIR)/libYap.a mkdir -p $(DESTDIR)$(INCLUDEDIR) for h in $(HEADERS); do $(INSTALL) $$h $(DESTDIR)$(INCLUDEDIR); done - @ENABLE_JPL@ (cd LGPL/JPL/java; make install) install_data: (cd library ; make install) @ENABLE_JPL@ (cd LGPL/JPL ; make install) + @ENABLE_JPL@ (cd LGPL/JPL/java; make install) $(INSTALL_DATA) $(srcdir)/LGPL/pillow/icon_address.pl $(DESTDIR)$(SHAREDIR)/Yap/ $(INSTALL_DATA) $(srcdir)/LGPL/pillow/pillow.pl $(DESTDIR)$(SHAREDIR)/Yap/ (cd CLPQR ; make install) diff --git a/configure b/configure index 7785e0a31..a3ba42925 100755 --- a/configure +++ b/configure @@ -13550,7 +13550,7 @@ mkdir -p LGPL/JPL/java/jpl mkdir -p LGPL/JPL/java/jpl/fli mkdir -p LGPL/JPL/src - ac_config_files="$ac_config_files Makefile library/regex/Makefile library/system/Makefile library/random/Makefile library/yap2swi/Makefile library/mpi/Makefile .depend library/Makefile CHR/Makefile CLPBN/Makefile CLPQR/Makefile library/Tries/Makefile LGPL/JPL/Makefile LGPL/JPL/src/Makefile LGPL/JPL/java/Makefile" + ac_config_files="$ac_config_files Makefile library/regex/Makefile library/system/Makefile library/random/Makefile library/yap2swi/Makefile library/mpi/Makefile .depend library/Makefile CHR/Makefile CLPBN/Makefile CLPQR/Makefile library/Tries/Makefile LGPL/JPL/Makefile LGPL/JPL/src/Makefile LGPL/JPL/java/Makefile LGPL/JPL/jpl_paths.yap" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure @@ -14090,6 +14090,7 @@ do "LGPL/JPL/Makefile" ) CONFIG_FILES="$CONFIG_FILES LGPL/JPL/Makefile" ;; "LGPL/JPL/src/Makefile" ) CONFIG_FILES="$CONFIG_FILES LGPL/JPL/src/Makefile" ;; "LGPL/JPL/java/Makefile" ) CONFIG_FILES="$CONFIG_FILES LGPL/JPL/java/Makefile" ;; + "LGPL/JPL/jpl_paths.yap" ) CONFIG_FILES="$CONFIG_FILES LGPL/JPL/jpl_paths.yap" ;; "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 echo "$as_me: error: invalid argument: $ac_config_target" >&2;} diff --git a/configure.in b/configure.in index a76397622..fd6f26a47 100644 --- a/configure.in +++ b/configure.in @@ -1092,7 +1092,7 @@ mkdir -p LGPL/JPL/java/jpl mkdir -p LGPL/JPL/java/jpl/fli mkdir -p LGPL/JPL/src -AC_OUTPUT(Makefile library/regex/Makefile library/system/Makefile library/random/Makefile library/yap2swi/Makefile library/mpi/Makefile .depend library/Makefile CHR/Makefile CLPBN/Makefile CLPQR/Makefile library/Tries/Makefile LGPL/JPL/Makefile LGPL/JPL/src/Makefile LGPL/JPL/java/Makefile) +AC_OUTPUT(Makefile library/regex/Makefile library/system/Makefile library/random/Makefile library/yap2swi/Makefile library/mpi/Makefile .depend library/Makefile CHR/Makefile CLPBN/Makefile CLPQR/Makefile library/Tries/Makefile LGPL/JPL/Makefile LGPL/JPL/src/Makefile LGPL/JPL/java/Makefile LGPL/JPL/jpl_paths.yap) make depend diff --git a/include/YapInterface.h b/include/YapInterface.h index edcf237c0..13dc25371 100644 --- a/include/YapInterface.h +++ b/include/YapInterface.h @@ -351,7 +351,7 @@ extern X_API YAP_Module PROTO(YAP_CreateModule,(YAP_Atom)); /* thread stuff */ extern X_API int PROTO(YAP_ThreadSelf,(void)); -extern X_API int PROTO(YAP_ThreadCreateEngine,(YAP_thread_attr *)); +extern X_API YAP_CELL PROTO(YAP_ThreadCreateEngine,(YAP_thread_attr *)); extern X_API int PROTO(YAP_ThreadAttachEngine,(int)); extern X_API int PROTO(YAP_ThreadDetachEngine,(int)); extern X_API int PROTO(YAP_ThreadDestroyEngine,(int)); diff --git a/library/swi.yap b/library/swi.yap index 1d834085e..1b82e09e8 100644 --- a/library/swi.yap +++ b/library/swi.yap @@ -6,7 +6,40 @@ nth1/3, forall/2, between/3, - concat_atom/2]). + concat_atom/2, + volatile/1]). + + +:- multifile user:file_search_path/2. + +:- dynamic user:file_search_path/2. + +user:file_search_path(swi, Home) :- + current_prolog_flag(home, Home). +user:file_search_path(foreign, swi(ArchLib)) :- + current_prolog_flag(arch, Arch), + atom_concat('lib/', Arch, ArchLib). +user:file_search_path(foreign, swi(lib)). + +% +% maybe a good idea to eventually support this in YAP. +% but for now just ignore it. +% +:- meta_predicate volatile(:). + +:- op(1150, fx, 'volatile'). + +volatile(P) :- var(P), + throw(error(instantiation_error,volatile(P))). +volatile(M:P) :- + do_volatile(P,M). +volatile((G1,G2)) :- + volatile(G1), + volatile(G2). +volatile(P) :- + do_volatile(P,_). + +do_volatile(_,_). :- meta_predicate forall(+,:). diff --git a/pl/boot.yap b/pl/boot.yap index 84e455b79..7a9e16e3a 100644 --- a/pl/boot.yap +++ b/pl/boot.yap @@ -950,8 +950,8 @@ break :- S =.. [Name,File], !, '$dir_separator'(D), atom_codes(A,[D]), - ( user:file_search_path(Name, Dir), '$do_not_creep' ; '$do_not_creep'), - atom_concat([Dir,A,File],NFile), + ( user:file_search_path(Name, Dir), '$do_not_creep' ; '$do_not_creep', fail), + '$extend_path'(Dir,A,File,NFile), '$search_in_path'(NFile, NewFile). '$find_in_path'(File,NewFile,_) :- atom(File), !, '$search_in_path'(File,NewFile),!. @@ -965,6 +965,16 @@ break :- atom_concat([Path,File],New), '$exists'(New,'$csult'). +'$extend_path'(Dir,A,File,NFile) :- + atom(Dir), !, + atom_concat([Dir,A,File],NFile). +'$extend_path'(Name,A,File,NFile) :- + nonvar(Name), + Name =.. [Dir1,Dir2], + ( user:file_search_path(Dir1, Dir), '$do_not_creep' ; '$do_not_creep', fail), + '$extend_path'(Dir2,A,File,EFile), + atom_concat([Dir,A,EFile],NFile). + % term expansion % % return two arguments: Expanded0 is the term after "USER" expansion. diff --git a/pl/directives.yap b/pl/directives.yap index 470d82cd5..857543364 100644 --- a/pl/directives.yap +++ b/pl/directives.yap @@ -194,9 +194,6 @@ yap_flag(dollar_as_lower_case,on) :- !, yap_flag(dollar_as_lower_case,off) :- '$change_type_of_char'(36,7). -yap_flag(profiling,X) :- (var(X); X = on; X = off), !, - '$is_profiled'(X). - yap_flag(call_counting,X) :- (var(X); X = on; X = off), !, '$is_call_counted'(X). @@ -220,6 +217,9 @@ yap_flag(index,X) :- yap_flag(index,X) :- '$do_error'(domain_error(flag_value,index+X),yap_flag(index,X)). +yap_flag(home,X) :- + '$yap_home'(X). + % should match definitions in Yap.h.m4 '$transl_to_index_mode'(0, off). '$transl_to_index_mode'(1, single). @@ -323,6 +323,9 @@ yap_flag(n_of_integer_keys_in_bb,X) :- integer(X), X > 0, !, yap_flag(n_of_integer_keys_in_bb,X) :- '$do_error'(domain_error(flag_value,n_of_integer_keys_in_bb+X),yap_flag(n_of_integer_keys_in_bb,X)). +yap_flag(profiling,X) :- (var(X); X = on; X = off), !, + '$is_profiled'(X). + yap_flag(strict_iso,OUT) :- var(OUT), !, '$access_yap_flags'(9,X), @@ -585,6 +588,7 @@ yap_flag(host_type,X) :- V = gc_margin ; V = gc_trace ; % V = hide ; + V = home ; V = host_type ; V = index ; V = informational_messages ;