(* 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");inval 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;
(* 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;