68 lines · 1.6 KB · Standard ML
RawDownload
(* To load in-core a compiled bytecode phrase, and execute it *) open List Obj Memory Fnlib Mixture Const Instruct Types;open Symtable Patch Tr_const Opcodes Buffcode Reloc Emitcode Rtvals; fun do_code may_free code entrypoint len =(  if number_of_globals() >= Vector.length global_data then    realloc_global_data(number_of_globals())  else ();  app    (fn (n, sc) => setGlobalVal n (translStructuredConst sc))    (!literal_table);  literal_table := [];  let val res =    interprete may_free code entrypoint len    handle x =>      ((case x of            Interrupt => raise x          | Toplevel => raise x          | Impossible _ => raise x          | Out_of_memory => gc_full_major()          | _ =>              ());       msgIBlock 0;       errPrompt "Uncaught exception: "; msgEOL(); errPrompt "";       printVal (trivial_scheme type_exn) (repr x);       msgEOL();       msgEBlock();       raise Toplevel)  in    res  end); fun loadZamPhrase (phr : ZamPhrase) =(  reloc_reset();  init_out_code();  Labels.reset_label_table();  literal_table := [];  (* It is essential to emit the initialization code *)  (* before the function bodies, in order for all Pset_global *)  (* to appear before all the Pget_global. *)  let val entrypoint = !out_position      val () = emit (#kph_inits phr)      val () = out STOP      val () = emit (#kph_funcs phr)      val len = !out_position      val out_buffer_ = !(magic (!out_buffer) : string ref)  in    patch_object out_buffer_ 0 (get_reloc_info());    do_code (case (#kph_funcs phr) of [] => true | _ => false)            out_buffer_ entrypoint len  end);