wenzelm@26215: (* Title: Pure/ML-Systems/polyml_common.ML wenzelm@26215: wenzelm@26215: Compatibility file for Poly/ML -- common part for 4.x and 5.x. wenzelm@26215: *) wenzelm@26215: wenzelm@28443: exception Interrupt = SML90.Interrupt; wenzelm@28443: wenzelm@26215: use "ML-Systems/exn.ML"; wenzelm@26215: use "ML-Systems/multithreading.ML"; wenzelm@26215: use "ML-Systems/time_limit.ML"; wenzelm@26220: use "ML-Systems/system_shell.ML"; wenzelm@28268: use "ML-Systems/ml_name_space.ML"; wenzelm@26215: wenzelm@26215: wenzelm@26215: (** ML system and platform related **) wenzelm@26215: wenzelm@26474: val forget_structure = PolyML.Compiler.forgetStructure; wenzelm@26474: wenzelm@26474: wenzelm@26215: (* Compiler options *) wenzelm@26215: wenzelm@26215: val ml_system_fix_ints = false; wenzelm@26215: wenzelm@26215: PolyML.Compiler.printInAlphabeticalOrder := false; wenzelm@26215: PolyML.Compiler.maxInlineSize := 80; wenzelm@26215: wenzelm@26215: wenzelm@26215: (* old Poly/ML emulation *) wenzelm@26215: wenzelm@26215: local wenzelm@26215: val orig_exit = exit; wenzelm@26215: in wenzelm@26215: open PolyML; wenzelm@26215: val exit = orig_exit; wenzelm@26215: fun quit () = exit 0; wenzelm@26215: end; wenzelm@26215: wenzelm@26215: wenzelm@26215: (* restore old-style character / string functions *) wenzelm@26215: wenzelm@26215: val ord = SML90.ord; wenzelm@26215: val chr = SML90.chr; wenzelm@26215: val explode = SML90.explode; wenzelm@26215: val implode = SML90.implode; wenzelm@26215: wenzelm@26215: wenzelm@26215: (* compiler-independent timing functions *) wenzelm@26215: wenzelm@26215: fun start_timing () = wenzelm@30187: let wenzelm@30187: val timer = Timer.startCPUTimer (); wenzelm@30187: val time = Timer.checkCPUTimer timer; wenzelm@30187: in (timer, time) end; wenzelm@26215: wenzelm@30187: fun end_timing (timer, {sys, usr}) = wenzelm@30187: let wenzelm@30187: open Time; (*...for Time.toString, Time.+ and Time.- *) wenzelm@30187: val {sys = sys2, usr = usr2} = Timer.checkCPUTimer timer; wenzelm@30187: val user = usr2 - usr; wenzelm@30187: val all = user + sys2 - sys; wenzelm@30187: val message = "User " ^ toString user ^ " All "^ toString all ^ " secs" handle Time => ""; wenzelm@30187: in {message = message, user = user, all = all} end; wenzelm@26215: wenzelm@26215: fun check_timer timer = wenzelm@26215: let wenzelm@26215: val {sys, usr} = Timer.checkCPUTimer timer; wenzelm@26215: val gc = Timer.checkGCTime timer; (* FIXME already included in usr? *) wenzelm@26215: in (sys, usr, gc) end; wenzelm@26215: wenzelm@26215: wenzelm@26215: (* prompts *) wenzelm@26215: wenzelm@26215: fun ml_prompts p1 p2 = (PolyML.Compiler.prompt1 := p1; PolyML.Compiler.prompt2 := p2); wenzelm@26215: wenzelm@26215: wenzelm@26215: (* toplevel pretty printing (see also Pure/pure_setup.ML) *) wenzelm@26215: wenzelm@26215: fun make_pp _ pprint (str, blk, brk, en) _ _ obj = wenzelm@26215: pprint obj (str, fn ind => blk (ind, false), fn wd => brk (wd, 0), wenzelm@26215: fn () => brk (99999, 0), en); wenzelm@26215: wenzelm@26215: (*print depth*) wenzelm@26215: local wenzelm@26215: val depth = ref 10; wenzelm@26215: in wenzelm@26215: fun get_print_depth () = ! depth; wenzelm@26215: fun print_depth n = (depth := n; PolyML.print_depth n); wenzelm@26215: end; wenzelm@26215: wenzelm@26215: wenzelm@26215: wenzelm@26215: (** interrupts **) wenzelm@26215: wenzelm@26215: local wenzelm@26215: wenzelm@26215: val sig_int = 2; wenzelm@26215: val default_handler = Signal.SIG_HANDLE (fn _ => Process.interruptConsoleProcesses ()); wenzelm@26215: wenzelm@26215: val _ = Signal.signal (sig_int, default_handler); wenzelm@26380: val _ = PolyML.onEntry (fn () => (Signal.signal (sig_int, default_handler); ())); wenzelm@26215: wenzelm@26215: fun change_signal new_handler f x = wenzelm@26215: let wenzelm@26215: (*RACE wrt. other signals!*) wenzelm@26215: val old_handler = Signal.signal (sig_int, new_handler); wenzelm@26215: val result = Exn.capture (f old_handler) x; wenzelm@26215: val _ = Signal.signal (sig_int, old_handler); wenzelm@26215: in Exn.release result end; wenzelm@26215: wenzelm@26215: in wenzelm@26215: wenzelm@26215: fun interruptible f = change_signal default_handler (fn _ => f); wenzelm@26215: wenzelm@26215: fun uninterruptible f = wenzelm@26215: change_signal Signal.SIG_IGN wenzelm@26215: (fn old_handler => f (fn g => change_signal old_handler (fn _ => g))); wenzelm@26215: wenzelm@26215: end; wenzelm@26215: wenzelm@26215: wenzelm@26215: wenzelm@26215: (** OS related **) wenzelm@26215: wenzelm@26215: (* current directory *) wenzelm@26215: wenzelm@26215: val cd = OS.FileSys.chDir; wenzelm@26215: val pwd = OS.FileSys.getDir; wenzelm@26215: wenzelm@28488: fun process_id () = wenzelm@28488: Word.fmt StringCvt.DEC (Word.fromLargeWord (Posix.Process.pidToWord (Posix.ProcEnv.getpid ()))); wenzelm@26215: wenzelm@26215: wenzelm@26215: (* getenv *) wenzelm@26215: wenzelm@26215: fun getenv var = wenzelm@26215: (case OS.Process.getEnv var of wenzelm@26215: NONE => "" wenzelm@26215: | SOME txt => txt); wenzelm@26215: wenzelm@26215: wenzelm@26215: (* profile execution *) wenzelm@26215: wenzelm@26215: fun profile 0 f x = f x wenzelm@26215: | profile n f x = wenzelm@26215: let wenzelm@26215: val _ = RunCall.run_call1 RuntimeCalls.POLY_SYS_profiler n; wenzelm@26215: val res = Exn.capture f x; wenzelm@26215: val _ = RunCall.run_call1 RuntimeCalls.POLY_SYS_profiler 0; wenzelm@26215: in Exn.release res end; wenzelm@26215: