Annotation of researchv10no/cmd/sml/src/build/process.sml, revision 1.1

1.1     ! root        1: (* Copyright 1989 by AT&T Bell Laboratories *)
        !             2: signature PROCESSFILE =
        !             3: sig
        !             4:   exception Stop
        !             5:   val dumpMap : unit -> unit
        !             6:   val prLambda : unit -> unit
        !             7:   val prFun : int -> unit
        !             8:   val printslots : string -> unit
        !             9:   val timemsg : string -> bool
        !            10:   val process : string * (Lambda.lexp * string -> unit) option -> unit
        !            11:   val load : string -> unit
        !            12:   val reset : unit -> unit
        !            13:   val primeEnv : unit -> unit
        !            14:   val getCore : unit -> int list
        !            15:   val bootEnv : (string -> unit) -> int * int * int
        !            16: end
        !            17: 
        !            18: structure ProcessFile : PROCESSFILE =
        !            19: struct
        !            20: 
        !            21:   open Access Basics PrintUtil EnvAccess
        !            22: 
        !            23:   exception Stop
        !            24: 
        !            25:   fun timemsg (s : string) =
        !            26:     if !System.Control.timings then (print s; newline(); true) else false
        !            27: 
        !            28:   val saveLambda = System.Control.saveLambda
        !            29:   val lambda = ref (Lambda.RECORD [])
        !            30:   (* really needed only for interactive version *)
        !            31:   val _ = System.Control.prLambda := fn () => (MCprint.printLexp (!lambda); newline())
        !            32:   fun prLambda() = (MCprint.printLexp(!lambda); newline())
        !            33:   fun prFun lv = (MCprint.printFun(!lambda) lv; newline())
        !            34: 
        !            35: 
        !            36:  (* debugging aid--print the slots of a structure
        !            37:     -- this belongs somewhere else *)
        !            38: 
        !            39:   fun printslot {name,access=SLOT s} =
        !            40:          (print "Slot "; print s; print " : ";
        !            41:           print(Symbol.name name);
        !            42:           print "\n")
        !            43:     | printslot {name,access=LVAR s} =
        !            44:          (print "Lvar "; print s; print " : ";
        !            45:           print(Symbol.name name);
        !            46:           print "\n")
        !            47:     | printslot {name,access=INLINE s} =
        !            48:          (print "Inline "; print(Prim.inLineName s); print " : ";
        !            49:           print(Symbol.name name);
        !            50:           print "\n")
        !            51:     | printslot {name,access=PATH _} =
        !            52:          (print "Path?? :";
        !            53:           print(Symbol.name name);
        !            54:           print "\n")
        !            55: 
        !            56:   val usl : {name:Symbol.symbol,access:access} list ref = ref nil
        !            57: 
        !            58:   fun buildlist (_,_,VARbind(VALvar{name=[n],access,...})) =
        !            59:                  usl := {name=n,access=access} :: !usl
        !            60:     | buildlist (_,_,STRbind(STRvar{name=[n],access,...})) =
        !            61:                  usl := {name=n,access=access} :: !usl
        !            62:     | buildlist (_,_,CONbind(DATACON{name,rep=(VARIABLE access),...})) =
        !            63:                  usl := {name=name,access=access} :: !usl
        !            64:     | buildlist _ = ()
        !            65: 
        !            66:   fun slotgt ({access=SLOT s1,name},{access=SLOT s2,name=_}) = s1 > s2
        !            67:     | slotgt ({access=SLOT _,...},_) = true
        !            68:     | slotgt ({access=LVAR v1,...},{access=LVAR v2,...}) = v1 > v2
        !            69:     | slotgt ({access=LVAR _,...},_) = true
        !            70:     | slotgt ({access=INLINE i1,...},{access=INLINE i2,...}) =
        !            71:         ErrorMsg.impossible "why do you sort slots" (* i1 > i2 *)
        !            72:     | slotgt ({access=INLINE _,...},_) = true
        !            73:     | slotgt _ = ErrorMsg.impossible "Path access in printslots"
        !            74: 
        !            75:   fun symPath s =
        !            76:     let fun f nil = (nil,nil)
        !            77:          | f ("."::m) =
        !            78:                  let val (s,syms) = f m
        !            79:                  in  (nil,Symbol.symbol(implode s)::syms)
        !            80:                  end
        !            81:          | f (a::m) =
        !            82:                  let val (s,syms) = f m
        !            83:                  in  (a::s,syms)
        !            84:                  end
        !            85:         val (s,syms) = f(explode s)
        !            86:     in  Symbol.symbol(implode s)::syms
        !            87:     end
        !            88: 
        !            89:   fun qid symlist =
        !            90:     let fun getStr([],str) = str
        !            91:          | getStr(id::rest,STRstr{table,env,...}) =
        !            92:              let val STRvar{access=SLOT n,binding,...} = 
        !            93:                      lookSTRinTable(table,id)
        !            94:                      handle Env.UnboundTable =>
        !            95:                      (print ("unbound intermediate structure in path: "
        !            96:                                ^ Symbol.name id ^ "\n"); raise Stop)
        !            97:                  val str = case (binding,env)
        !            98:                             of (INDstr i,REL{s,...}) => s sub i
        !            99:                              | (SHRstr(i::r),REL{s,...}) =>
        !           100:                                   TypesUtil.getEpath(r,s sub i)
        !           101:                              | (STRstr _, _) => binding
        !           102:                              | _ => ErrorMsg.impossible "Process.qid.getStr"
        !           103:               in getStr(rest,str)
        !           104:              end
        !           105:        val firstId::rest = symPath symlist
        !           106:        val STRvar{binding,...} = lookSTR firstId
        !           107:              handle Unbound => (print("unbound structure at head of path: "
        !           108:                                        ^ Symbol.name firstId ^ "\n"); raise Stop)
        !           109:     in  getStr(rest,binding)
        !           110:     end
        !           111: 
        !           112:   fun printslots s =
        !           113:       let val STRstr{table,...} = qid s
        !           114:          val unsortedlist = (usl := nil; IntStrMap.app buildlist table; !usl)
        !           115:          val sortedlist = Sort.sort slotgt unsortedlist
        !           116:       in  print "module "; print s; print "\n";
        !           117:          app printslot sortedlist
        !           118:       end
        !           119:       handle Bind => ErrorMsg.impossible "Weird structure in printslots"
        !           120: 
        !           121: 
        !           122:   open ErrorMsg BareAbsyn Lambda System.Timer
        !           123: 
        !           124:   fun for l f = app f l
        !           125:   val update = System.Stats.update
        !           126:   val printDepth = System.Control.Print.printDepth
        !           127: 
        !           128:   fun opt lam =
        !           129:       let val timer = start_timer()
        !           130:          val lam = if !CGoptions.reduce then Opt.reduce lam else lam
        !           131:          val _ = if !anyErrors then raise Stop else ()
        !           132:          val lam = if !CGoptions.hoist then Opt.hoist lam else lam
        !           133:          val time = check_timer timer
        !           134:       in  update(System.Stats.codeopt,time);
        !           135:          timemsg("codeopt, " ^ makestring time ^ "s")
        !           136:                orelse debugmsg "codeopt";
        !           137:          if !anyErrors then raise Stop else ();
        !           138:          lam
        !           139:       end
        !           140: 
        !           141:   fun parse (lex: Lex.lexer) =
        !           142:       let val ref linenum = ErrorMsg.lineNum
        !           143:          val timer = start_timer()
        !           144:          val _ = debugmsg "about to parse"
        !           145:           val _ = while !(#nextToken lex) = Token.SEMICOLON 
        !           146:                            do (#advance lex)();
        !           147:          val absyn = (anyErrors := false; Parse.interdec lex)
        !           148:          val time = check_timer timer
        !           149:          val lines = !ErrorMsg.lineNum - linenum
        !           150:        in update(System.Stats.parse,time);
        !           151:          System.Stats.lines := !System.Stats.lines + lines;
        !           152:          timemsg("parse, " ^ Integer.makestring lines
        !           153:                        ^ " lines, " ^ makestring time ^ "s")
        !           154:                orelse debugmsg "parse completed";
        !           155:          if !anyErrors then raise Stop else ();
        !           156:          absyn
        !           157:       end
        !           158: 
        !           159:   fun transStrb sb =
        !           160:       let val timer = start_timer()
        !           161:          val (sb,profil) = Prof.instrumStrb sb
        !           162:          val Absyn.STRB{strvar=STRvar{access=LVAR v,...},...} = sb
        !           163:           val lam = Translate.transDec (Absyn.STRdec[sb]) (Lambda.VAR v)
        !           164:          val lam = Prof.bindLambda(lam,profil)
        !           165:          val time = check_timer timer
        !           166:        in update(System.Stats.translate,time);
        !           167:          timemsg("translate, " ^ makestring time ^ "s")
        !           168:                orelse debugmsg "translate";
        !           169:          if !anyErrors then raise Stop else ();
        !           170:          lam
        !           171:       end
        !           172: 
        !           173:   fun transFctb fb =
        !           174:       let val timer = start_timer()
        !           175:          val (fb,profil) = Prof.instrumFctb fb
        !           176:          val Absyn.FCTB{fctvar=FCTvar{access=LVAR v,...},...} = fb
        !           177:           val lam = Translate.transDec (Absyn.FCTdec[fb]) (Lambda.VAR v)
        !           178:          val lam = Prof.bindLambda(lam,profil)
        !           179:          val time = check_timer timer
        !           180:        in update(System.Stats.translate,time);
        !           181:          timemsg("translate, " ^ makestring time ^ "s")
        !           182:                orelse debugmsg "translate";
        !           183:          if !anyErrors then raise Stop else ();
        !           184:          lam
        !           185:       end
        !           186: 
        !           187:   (* lvar -> string environment used by batch compiler to map module
        !           188:      lvars to names of modules *)
        !           189:   exception Modname
        !           190:   val m : string Intmap.intmap = Intmap.new(32, Modname)
        !           191:   val lookup = Intmap.map m
        !           192:   val enterName = Intmap.add m
        !           193:   fun lookupName v =
        !           194:       lookup v 
        !           195:       handle Modname => 
        !           196:        let val s = Access.lvarName v
        !           197:         in ErrorMsg.complain ("Bad free variable: " ^ Access.lvarName v);
        !           198:            s
        !           199:        end
        !           200:   fun dumpMap() =
        !           201:       let fun p(i:int,s:string) = (print i; print " -> "; print s; print "\n")
        !           202:       in  print "lvar -> structure mapping:\n"; Intmap.app p m
        !           203:       end
        !           204: 
        !           205:   val is_core = ref false;
        !           206: 
        !           207:   fun getCore () = if !is_core then [] else tl(!CoreInfo.stringequalPath)
        !           208: 
        !           209:   fun process(fname, gencode) =
        !           210:       let val stream = open_in fname
        !           211:          val lex = Lex.mkLex{stream=stream, interactive=false}
        !           212:           val _ = (ErrorMsg.fileName := fname; ErrorMsg.lineNum := 1;
        !           213:                   System.interactive := false)
        !           214:          val _ = Env.commit()
        !           215:          fun cleanup() = (print("[closing " ^ fname ^ "]\n");
        !           216:                           close_in stream)
        !           217:          fun proc(name,lvar,mkLam) =
        !           218:              (enterName(lvar, name);
        !           219:               case gencode of
        !           220:                 NONE => ()
        !           221:               | SOME gencode =>
        !           222:                 let val lam = Opt.closestr(lookupName,opt(mkLam()), getCore())
        !           223:                 in debugmsg "closed";
        !           224:                    if !saveLambda then lambda := lam else ();
        !           225:                    gencode(lam, name);
        !           226:                    if !anyErrors then raise Stop else ()
        !           227:                 end)
        !           228:          fun loop() =
        !           229:            let val absyn = parse lex
        !           230:            in  case absyn
        !           231:                  of SIGdec _ =>
        !           232:                        (PrintAbsyn.printDec(absyn,0,!printDepth);
        !           233:                         newline())
        !           234:                   | OPENdec _ =>
        !           235:                        (PrintAbsyn.printDec(absyn,0,!printDepth);
        !           236:                         newline())
        !           237:                   | STRdec sbs =>
        !           238:                        for sbs
        !           239:                          (fn sb as
        !           240:                              STRB{strvar=STRvar{name=[n],access=LVAR v,...},...} =>
        !           241:                             (print "structure "; printSym n; newline();
        !           242:                              let val mkLam = fn () => transStrb sb
        !           243:                              in  proc(Symbol.name n, v, mkLam)
        !           244:                              end))
        !           245:                   | ABSdec sbs =>
        !           246:                        for sbs
        !           247:                          (fn sb as
        !           248:                              STRB{strvar=STRvar{name=[n],access=LVAR v,...},...} =>
        !           249:                             (print "abstraction "; printSym n; newline();
        !           250:                              let val mkLam = fn () => transStrb sb
        !           251:                              in  proc(Symbol.name n, v, mkLam)
        !           252:                              end))
        !           253:                   | FCTdec fbs =>
        !           254:                        for fbs
        !           255:                          (fn fb as
        !           256:                              FCTB{fctvar=FCTvar{name,access=LVAR v,...},...} =>
        !           257:                             (print "functor "; printSym name; newline();
        !           258:                              let val mkLam = fn () => transFctb fb
        !           259:                              in  proc(Symbol.name name, v, mkLam)
        !           260:                              end))
        !           261:                    | _ => ErrorMsg.condemn "signature, functor, or structure expected";
        !           262:                loop()
        !           263:            end
        !           264:       in  loop() 
        !           265:            handle Parse.Eof =>
        !           266:                     (cleanup();
        !           267:                      if !anyErrors
        !           268:                      then (Env.restore(); raise Stop)
        !           269:                      else Env.consolidate())
        !           270:                 | e => (Env.restore(); cleanup(); raise e)
        !           271:       end
        !           272: 
        !           273:   fun load fname = process(fname,NONE)
        !           274: 
        !           275:  (* initializing static environment *)
        !           276: 
        !           277:  (* priming structures: PrimTypes and InLine *)
        !           278:   val nameofPT = Symbol.symbol "PrimTypes"
        !           279:   val varofPT = STRvar{name=[nameofPT],access=LVAR 0,binding=Prim.primTypes}
        !           280:   val varofPT' = STRvar{name=[nameofPT],access=PATH[0],binding=Prim.primTypes}
        !           281:   val nameofIL = Symbol.symbol "InLine"
        !           282:   val varofIL = STRvar{name=[nameofIL],access=LVAR 0,binding=Prim.inLine}
        !           283: 
        !           284:   fun reset() =
        !           285:       (Env.reset();
        !           286:        EnvAccess.reset();
        !           287:        Typecheck.reset())
        !           288: 
        !           289:   fun primeEnv() =
        !           290:       (reset();
        !           291:        openStructureVar varofPT';
        !           292:        bindSTR(nameofPT,varofPT);
        !           293:        bindSTR(nameofIL,varofIL);
        !           294:        ())
        !           295: 
        !           296:   fun bootEnv (loader:string -> unit) =
        !           297:       (primeEnv();
        !           298:        load "boot/assembly.sig";
        !           299:        is_core := true;
        !           300:        (loader "boot/core.sml" handle e => (is_core := false; raise e));
        !           301:        is_core := false;
        !           302:        load "boot/dummy.sml";
        !           303:        let val svCore as STRvar{access=PATH[lvCore],...} =
        !           304:                 lookSTR (Symbol.symbol "Core")
        !           305:         in CoreInfo.setCore(svCore);
        !           306:           load "boot/perv.sig";
        !           307:           load "boot/system.sig";
        !           308:           loader "boot/math.sml";
        !           309:           loader "boot/perv.sml";
        !           310:           load "boot/overloads.sml";
        !           311:           let val STRvar{access=PATH[lvMath],...} =
        !           312:                     lookSTR (Symbol.symbol "Math")
        !           313:               and svInitial as STRvar{access=PATH[lvInitial],
        !           314:                                       binding=strInitial as STRstr{table,...},...} =
        !           315:                     lookSTR (Symbol.symbol "Initial")
        !           316:               and STRvar{binding=STRstr{table=otable,...},...} =
        !           317:                     lookSTR (Symbol.symbol "Overloads")
        !           318:               val sigs = map (fn s => lookSIG(Symbol.symbol s))
        !           319:                              ["REF","LIST","ARRAY","BYTEARRAY","BASICIO",
        !           320:                               "IO","BOOL","STRING","INTEGER","REAL","GENERAL"]
        !           321:               val NJsymbol = Symbol.symbol "NewJersey"
        !           322:            in Env.reset();
        !           323:                (* merge overload bindings into Initial's symtable *)
        !           324:               IntStrMap.app (IntStrMap.add table) otable;
        !           325:               openStructureVar(svInitial);
        !           326:               app (fn (sgn as SIGvar{name,...}) => bindSIG(name,sgn))
        !           327:                   sigs;
        !           328:               bindSTR(NJsymbol, STRvar{name=[NJsymbol],access=LVAR(lvInitial),
        !           329:                                        binding=strInitial});
        !           330:               (lvCore,lvInitial,lvMath)
        !           331:           end
        !           332:        end)
        !           333: 
        !           334: end (* structure ProcessFile *)

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.