48 lines · 1.1 KB · Standard ML
RawDownload
(* To buffer bytecode during emission *) local  open Obj Fnlib Mixture Config Opcodes;   prim_val andb_      : int -> int -> int = 2 "and";  prim_val rshiftsig_ : int -> int -> int = 2 "shift_right_signed";  prim_val rshiftuns_ : int -> int -> int = 2 "shift_right_unsigned";   fun make_buffer n = CharArray.array(n, #"\000"); in val out_buffer = ref (make_buffer 64);val out_position = ref 0; fun realloc_out_buffer () =  let val len = CharArray.length (!out_buffer)      val new_buffer = make_buffer (2 * len)  in    CharArray.copy { src = !out_buffer, si = 0, len = NONE,                     dst = new_buffer, di = 0 };    out_buffer := new_buffer  end; fun init_out_code () = (out_position := 0); fun out (b : int) =(  if !out_position < CharArray.length (!out_buffer) then () else    realloc_out_buffer();  CharArray.update(!out_buffer, !out_position, Char.chr(andb_ b 255));  incr out_position); fun out_short s =  (out s; out (rshiftuns_ s 8)); fun out_long l =(  out l;  out (rshiftuns_ l 8);  out (rshiftuns_ l 16);  out (rshiftsig_ l 24)); end;