Annotation of researchv10no/cmd/sml/src/boot/loader.sml, revision 1.1.1.1

1.1       root        1: (* Copyright 1989 by AT&T Bell Laboratories *)
                      2: signature Startup =
                      3:  sig 
                      4:      val core : System.Unsafe.object
                      5:      val initial : System.Unsafe.object
                      6:      val math : System.Unsafe.object
                      7:      val name : string
                      8:  end
                      9: 
                     10: functor Loader ( S : Startup ) : sig end =
                     11: struct
                     12: 
                     13:  open Ref List String IO General System System.Unsafe
                     14:  val boot : string ->
                     15:            unit ->
                     16:            ((object list -> (object * ByteArray.bytearray array)) * string list)
                     17:          = System.Unsafe.boot
                     18: 
                     19:  val dict : (string*object) list ref = 
                     20:        ref [("Initial",S.initial),("Core",S.core),("Math",S.math)]
                     21: 
                     22:  val _ = pstruct := {core=S.core,math=S.math,initial=S.initial}
                     23: 
                     24:  exception Notfound_Loader
                     25: 
                     26:  fun lookup s =
                     27:     let fun f ((s1,stru)::r) = if s=s1 then stru else f r
                     28:          | f nil = raise Notfound_Loader
                     29:      in f (!dict)
                     30:     end
                     31: 
                     32:  fun enter pair = dict := pair::(!dict)
                     33: 
                     34:  fun readfile s =
                     35:        let val stream = open_in s
                     36:            val file = input stream (can_input stream)
                     37:        in  close_in stream;
                     38:            file
                     39:        end
                     40: 
                     41:  fun getmo s =
                     42:     let fun f DATANIL = readfile s
                     43:          | f (DATACONS(s',t,x)) = if s=s' then t else f x
                     44:      in f System.Unsafe.datalist
                     45:     end
                     46: 
                     47:  val say = output std_out
                     48: 
                     49:  fun getstruct s =
                     50:        lookup s handle Notfound_Loader =>
                     51:            let val _ = (say "[Loading "; say s; say "]\n")
                     52:                val g = getmo ("mo/" ^ s ^ ".mo");
                     53:                val (exec,sl) = boot g ()
                     54:                val saver = ref exec  (* save a pointer for the garbage
                     55:                                         collector *)
                     56:                val structs = map getstruct sl
                     57:                val _ = (say "[Executing "; say s; say "]\n")
                     58:                val (str,profile) = exec structs
                     59:            in  enter (s,str);
                     60:                System.Control.ProfileInternals.add profile;
                     61:                saver := !saver;    (* trickery for the g.c. *)
                     62:                str
                     63:            end
                     64: 
                     65:  val _ = (getstruct S.name; System.cleanup())
                     66:            (* this is the global exception handler of the sml system *)
                     67:            handle Io s =>
                     68:                     (say "uncaught Io exception (Loader): ";
                     69:                      say s;
                     70:                      say "\n";
                     71:                      System.cleanup())
                     72:                 | exn =>
                     73:                     (say "uncaught exception (Loader): ";
                     74:                      say (exn_name exn);
                     75:                      say "\n";
                     76:                      System.cleanup())
                     77: 
                     78: end (* functor Loader *)

unix.superglobalmegacorp.com

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