Annotation of researchv10no/cmd/sml/src/boot/loader.sml, revision 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.