|
|
1.1 ! root 1: (* Copyright 1989 by AT&T Bell Laboratories *) ! 2: functor Batch(structure M: CODEGENERATOR and A:ASSEMBLER) : sig end = ! 3: struct ! 4: ! 5: val pr = output std_out ! 6: open PrintUtil ProcessFile ! 7: ! 8: (* command parsing *) ! 9: ! 10: fun skip_white stream = ! 11: case lookahead stream ! 12: of " " => (input stream 1; skip_white stream) ! 13: | "\t" => (input stream 1; skip_white stream) ! 14: | "\n" => (input stream 1; skip_white stream) ! 15: | _ => () ! 16: ! 17: fun getword stream = ! 18: let val nextchar = input stream 1 ! 19: in case nextchar ! 20: of "" => "" ! 21: | " " => "" ! 22: | "\t" => "" ! 23: | "\n" => "" ! 24: | _ => nextchar ^ getword stream ! 25: end ! 26: ! 27: (* The commandline interpreter *) ! 28: ! 29: val dir = ref "" ! 30: val globalhandle = ref true ! 31: val dumpCore = ref false ! 32: ! 33: fun compile fname = ! 34: let val file = !dir ^ fname ! 35: fun p(lexp,s) = ! 36: let val code = M.generate lexp ! 37: val outfile = open_out(s ^ ".mo") ! 38: in output outfile code; close_out outfile ! 39: end ! 40: in pr ("[Compiling " ^ file ^ "]\n"); process(file, SOME p) ! 41: end ! 42: ! 43: fun assemble s = ! 44: let val file = !dir ^ s ! 45: fun p(lexp,s) = ! 46: let val f = open_out(s ^ ".s") ! 47: in A.generate (lexp, f); close_out f ! 48: end ! 49: in pr ("[Assembling " ^ file ^ "]\n"); process(file, SOME p) ! 50: end ! 51: ! 52: fun load s = ! 53: let val file = !dir ^ s ! 54: in pr ("[Loading " ^ file ^ "]\n"); ProcessFile.load file ! 55: end ! 56: ! 57: fun export s = ! 58: let val file = !dir ^ s ! 59: in pr("[Exporting to " ^ file ^ "]\n"); exportML file; pr "hello there\n" ! 60: end ! 61: ! 62: exception Notfound_Compile of string ! 63: local open System.Control ! 64: open CG Profile ! 65: val flags = [ ! 66: ("internals",internals), ! 67: ("tailrecur",tailrecur), ! 68: ("recordopt",recordopt), ! 69: ("tail",tail), ! 70: ("profile",profile), ! 71: ("closureprint",closureprint), ! 72: ("hoist",hoist), ! 73: ("reduce",reduce), ! 74: ("foldconst",foldconst), ! 75: ("etasplit",etasplit), ! 76: ("comment",comment), ! 77: ("alphac",alphac), ! 78: ("printsize",printsize), ! 79: ("scheduling",scheduling), ! 80: ("MC.printArgs",MC.printArgs), ! 81: ("MC.printRet",MC.printRet), ! 82: ("MC.bindContainsVar",MC.bindContainsVar), ! 83: ("MC.bindExhaustive",MC.bindExhaustive), ! 84: ("MC.matchExhaustive",MC.matchExhaustive), ! 85: ("MC.matchRedundant",MC.matchRedundant), ! 86: ("MC.expandResult",MC.expandResult), ! 87: ("saveLvarNames",Access.saveLvarNames), ! 88: ("saveLambda",saveLambda), ! 89: ("printit",printit), ! 90: ("debugging",debugging), ! 91: ("debugLook",debugLook), ! 92: ("debugBind",debugBind), ! 93: ("timings",timings), ! 94: ("dumpCore",dumpCore), ! 95: ("globalhandle",globalhandle), ! 96: ("profiling",profiling)] ! 97: in ! 98: fun getflag f = ! 99: let fun get nil = raise Notfound_Compile f ! 100: | get ((name,flag)::tl) = if f=name then flag else get tl ! 101: in get flags ! 102: end ! 103: ! 104: fun printflags () = ! 105: (pr "[Flags:\n"; ! 106: app (fn(name,flag:bool ref) => (pr name; pr " = "; print(!flag); pr "\n")) ! 107: flags; ! 108: pr "]\n") ! 109: end ! 110: ! 111: fun toggle "" = printflags() ! 112: | toggle arg = ! 113: let val flag = getflag arg ! 114: val new = not(!flag) ! 115: in pr ("["^arg^" := "^makestring new^"]\n"); flag := new ! 116: end ! 117: ! 118: fun lsave () = (toggle "saveLambda"; toggle "saveLvarNames") ! 119: ! 120: fun atoi s = ! 121: let val dtoi = fn "0" => 0 | "1" => 1 | "2" => 2 | "3" => 3 | "4" => 4 ! 122: | "5" => 5 | "6" => 6 | "7" => 7 | "8" => 8 | "9" => 9 ! 123: | _ => (pr "[garbled integer input]\n"; raise ProcessFile.Stop) ! 124: in case explode s ! 125: of "~" :: s' => ~ (revfold (fn(a,b) => b * 10 + dtoi a) s' 0) ! 126: | s' => revfold (fn(a,b) => b * 10 + dtoi a) s' 0 ! 127: end ! 128: ! 129: fun gcmessage() = ! 130: let val f = System.Control.Runtime.gcmessages ! 131: in f := (!f + 1) mod 4; pr "[gcmessages := "; print(!f); pr "]\n" ! 132: end ! 133: ! 134: fun summary() = ! 135: (System.Stats.summary(); ! 136: pr(makestring(!System.Control.CG.knowngen)); ! 137: pr " knowngen\n"; ! 138: pr(makestring(!System.Control.CG.knowncl)); ! 139: pr " knowncl\n"; ! 140: pr(makestring(!System.Control.CG.stdgen)); ! 141: pr " stdgen\n"; ! 142: ()) ! 143: ! 144: val execs = ! 145: [("lsave",lsave), ! 146: ("summary",summary), ! 147: ("prFun",fn () => ! 148: ProcessFile.prFun(atoi(skip_white std_in; getword std_in))), ! 149: ("gcmessages",gcmessage), ! 150: ("setratio",fn () => ! 151: let val i = atoi(skip_white std_in; getword std_in) ! 152: in pr "[ratio := "; print i; pr "]\n"; ! 153: System.Control.Runtime.ratio := i ! 154: end), ! 155: ("setsoftmax",fn () => ! 156: let val i = atoi(skip_white std_in; getword std_in) ! 157: in pr "[softmax := "; print i; pr "]\n"; ! 158: System.Control.Runtime.softmax := i ! 159: end), ! 160: ("setbodysize",fn () => ! 161: let val i = atoi(skip_white std_in; getword std_in) ! 162: in pr "[bodysize := "; print i; pr "]\n"; ! 163: System.Control.CG.bodysize := i ! 164: end), ! 165: ("setrounds",fn () => ! 166: let val i = atoi(skip_white std_in; getword std_in) ! 167: in pr "[rounds := "; print i; pr "]\n"; ! 168: System.Control.CG.rounds := i ! 169: end), ! 170: ("setreducemore",fn () => ! 171: let val i = atoi(skip_white std_in; getword std_in) ! 172: in pr "[reducemore := "; print i; pr "]\n"; ! 173: System.Control.CG.reducemore := i ! 174: end), ! 175: ("setclosureStrategy",fn () => ! 176: let val i = atoi(skip_white std_in; getword std_in) ! 177: in pr "[closureStrategy := "; print i; pr "]\n"; ! 178: CGoptions.closureStrategy := i ! 179: end), ! 180: ("printslots",fn () => ProcessFile.printslots(skip_white std_in; ! 181: getword std_in)), ! 182: ("flushstdout",fn () => set_term_out(std_out,true)), ! 183: ("dumpMap",ProcessFile.dumpMap), ! 184: ("asBoot",fn () => (ProcessFile.bootEnv assemble; ())), ! 185: ("mBoot",fn () => (ProcessFile.bootEnv compile; ())), ! 186: ("primeEnv",ProcessFile.primeEnv), ! 187: ("clear",System.Control.Profile.clear), ! 188: ("reset",System.Control.Profile.reset), ! 189: ("report",fn () => System.Control.Profile.report std_out), ! 190: ("profileOff",System.Control.Profile.profileOff), ! 191: ("profileOn",System.Control.Profile.profileOn)] ! 192: ! 193: fun getexec f = ! 194: let fun get nil = raise Notfound_Compile f ! 195: | get ((name,exec)::tl) = if f=name then exec else get tl ! 196: in get execs ! 197: end ! 198: ! 199: fun printexecs () = ! 200: (pr "[Available execs:\n"; ! 201: app (fn ("setbodysize",_) => ! 202: (pr "setbodysize <int> (currently "; ! 203: Integer.print(!System.Control.CG.bodysize); pr ")\n") ! 204: | ("setreducemore",_) => ! 205: (pr "setreducemore <int> (currently "; ! 206: Integer.print(!System.Control.CG.reducemore); pr ")\n") ! 207: | ("setclosureStrategy",_) => ! 208: (pr "setclosureStrategy <int> (currently "; ! 209: Integer.print(!CGoptions.closureStrategy); ! 210: pr ")\n") ! 211: | ("prFun",_) => pr "prFun <lvar>\n" ! 212: | ("printslots",_) => pr "printslots <structure>\n" ! 213: | (name,_) => (pr name; pr "\n")) ! 214: execs; ! 215: pr "]\n") ! 216: ! 217: fun execute "" = printexecs() ! 218: | execute arg = ! 219: let val exec = getexec arg ! 220: in pr("["^arg^"()]\n"); ! 221: exec() ! 222: end ! 223: ! 224: fun help() = pr "\ ! 225: \!file => compile the file.\n\ ! 226: \*file => assemble the file.\n\ ! 227: \<file => parse the file.\n\ ! 228: \>file => export to a file.\n\ ! 229: \% => print the last generated lambda.\n\ ! 230: \#word => comment; ignored.\n\ ! 231: \@directory => look for files in a directory. directory should end in /.\n\ ! 232: \~function => execute a function.\n\ ! 233: \^flag => toggle a flag.\n\ ! 234: \? => print this help message.\n" ! 235: ! 236: fun interp "" = () ! 237: | interp word = ! 238: let val arg = substring(word,1,size word - 1) handle Substring => "" ! 239: in (case substring(word,0,1) of ! 240: "!" => compile arg ! 241: | "*" => assemble arg ! 242: | "<" => load arg ! 243: | ">" => export arg ! 244: | "%" => ProcessFile.prLambda() ! 245: | "#" => () (* comment *) ! 246: | "@" => dir := arg (* change load directory *) ! 247: | "~" => execute arg (* execute function *) ! 248: | "^" => toggle arg (* toggle flag *) ! 249: | "?" => help() ! 250: | _ => pr ("[What is \""^word^"\"?]\n") ! 251: ) handle e as Notfound_Compile f => ! 252: (pr("[flag \""^f^"\" not recognized]\n"); ! 253: raise e) ! 254: end ! 255: ! 256: fun interp1 word = ! 257: if !globalhandle ! 258: then (interp word ! 259: handle ProcessFile.Stop => ! 260: (pr "[Failed on "; ! 261: pr_mlstr word; ! 262: pr "]\n"; ! 263: flush_out std_out) ! 264: | e => ! 265: (pr "[Failed on "; ! 266: pr_mlstr word; pr " with "; ! 267: pr(System.exn_name e); pr "]\n"; ! 268: flush_out std_out)) ! 269: else interp word ! 270: handle e => ! 271: (pr "[Failed on "; ! 272: pr_mlstr word; pr " with "; ! 273: pr(System.exn_name e); pr "]\n"; ! 274: flush_out std_out; ! 275: if !dumpCore ! 276: then (toggle "globalhandle"; ! 277: toggle "dumpCore"; ! 278: pr "[Saving state]\n[Exporting to sml.save]\n"; ! 279: flush_out std_out; ! 280: if exportML "sml.save" ! 281: then pr "hello there\n" ! 282: else (summary(); raise e)) ! 283: else raise e) ! 284: ! 285: (* command-line interpreter top-level loop *) ! 286: fun toplevel () = ! 287: if end_of_stream std_in ! 288: then () ! 289: else (skip_white std_in; ! 290: if (end_of_stream std_in) ! 291: then () ! 292: else (interp1(getword std_in); toplevel ())) ! 293: ! 294: (* load the pervasives (no .mo files generated) *) ! 295: val _ = ProcessFile.bootEnv load ! 296: ! 297: (* start up command interpreter *) ! 298: val _ = (pr "hello there\n"; toplevel ()) ! 299: ! 300: end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.