staload Cnt = "ats_counter.sats"
staload Err = "ats_error.sats"
staload IntInf = "ats_intinf.sats"
staload Lab = "ats_label.sats"
staload "ats_staexp2.sats"
staload "ats_dynexp2.sats"
staload "ats_hiexp.sats"; staload "ats_ccomp.sats"
macdef fprint_label = $Lab.fprint_label
implement print_tmplab (tl) = print_mac (fprint_tmplab, tl)
implement prerr_tmplab (tl) = prerr_mac (fprint_tmplab, tl)
implement print_tmpvar (tmp) = print_mac (fprint_tmpvar, tmp)
implement prerr_tmpvar (tmp) = prerr_mac (fprint_tmpvar, tmp)
implement fprint_tmpvarlst {m} (pf | out, tmps) = let
fun aux (out: &FILE m, i: int, tmps: tmpvarlst): void =
case+ tmps of
| list_cons (tmp, tmps) => begin
if i > 0 then fprint1_string (pf | out, ", ");
fprint_tmpvar (pf | out, tmp); aux (out, i+1, tmps)
end | list_nil () => ()
in
aux (out, 0, tmps)
end
implement print_tmpvarlst (tmps) = print_mac (fprint_tmpvarlst, tmps)
implement prerr_tmpvarlst (tmps) = prerr_mac (fprint_tmpvarlst, tmps)
implement print_funlab (fl) = print_mac (fprint_funlab, fl)
implement prerr_funlab (fl) = prerr_mac (fprint_funlab, fl)
implement fprint_funlablst {m} (pf | out, fls) = let
fun aux (out: &FILE m, i: int, fls: funlablst): void =
case+ fls of
| list_cons (fl, fls) => begin
if i > 0 then fprint1_string (pf | out, ", ");
fprint_funlab (pf | out, fl); aux (out, i+1, fls)
end | list_nil () => ()
in
aux (out, 0, fls)
end
implement print_funlablst (fls) = print_mac (fprint_funlablst, fls)
implement prerr_funlablst (fls) = prerr_mac (fprint_funlablst, fls)
implement
fprint_valprim (pf | out, vp) = let
macdef prstr (s) = fprint1_string (pf | out, ,(s))
in
case+ vp.valprim_node of
| VParg i => begin
prstr "VParg("; fprint1_int (pf | out, i); prstr ")"
end | VPargref i => begin
prstr "VPargref("; fprint1_int (pf | out, i); prstr ")"
end | VPbool b => begin
prstr "VPbool("; fprint1_bool (pf | out, b); prstr ")"
end | VPcastfn (d2c, vp) => begin
prstr "VPcast(";
fprint_d2cst (pf | out, d2c); prstr ", "; fprint_valprim (pf | out, vp);
prstr ")"
end | VPchar c => begin
prstr "VPchar("; fprint1_char (pf | out, c); prstr ")"
end | VPclo (knd, fl, ctx) => begin
prstr "VPclo(";
fprint1_int (pf | out, knd);
prstr "; ";
fprint_funlab (pf | out, fl);
prstr "; ";
fprint1_string (pf | out, "...");
prstr ")"
end
| VPcst (d2c) => begin
prstr "VPcst("; fprint_d2cst (pf | out, d2c); prstr ")"
end | VPcstsp _ => begin
prstr "VPcstsp("; fprint1_string (pf | out, "..."); prstr ")"
end | VPenv vtp => begin
prstr "VPenv("; fprint_vartyp (pf | out, vtp); prstr ")"
end | VPext code => begin
fprintf1_exn (pf | out, "VPext(\"%s\")", @(code));
end | VPfix vpr => begin
prstr "VPfix("; fprint_valprim (pf | out, !vpr); prstr ")"
end | VPfloat f => begin
fprintf1_exn (pf | out, "VPfloat(%s)", @(f))
end | VPfloatsp f => begin
fprintf1_exn (pf | out, "VPfloatsp(%s)", @(f))
end | VPfun fl => begin
prstr "VPfun("; fprint_funlab (pf | out, fl); prstr ")"
end | VPint (int) => begin
prstr "VPint("; $IntInf.fprint_intinf (pf | out, int); prstr ")"
end | VPintsp (str, int) => begin
fprintf1_exn (pf | out, "VPintsp(%s)", @(str))
end | VPptrof vp => begin
prstr "VPptrof("; fprint_valprim (pf | out, vp); prstr ")"
end | VPptrof_ptr_offs (vp, offs) => begin
prstr "VPptrof_ptr_offs(";
fprint_valprim (pf | out, vp);
prstr "; ";
fprint_offsetlst (pf | out, offs);
prstr ")"
end | VPptrof_var_offs (vp, offs) => begin
prstr "VPptrof_var_offs(";
fprint_valprim (pf | out, vp);
prstr "; ";
fprint_offsetlst (pf | out, offs);
prstr ")"
end | VPsizeof hit => begin
prstr "VPsizeof(";
fprint_hityp (pf | out, hityp_decode hit);
prstr ")"
end | VPstring (str, len) => begin
fprint1_string (pf | out, "VPstring(...)")
end | VPtmp tmp => begin
prstr "VPtmp("; fprint_tmpvar (pf | out, tmp); prstr ")"
end | VPtmpref tmp => begin
prstr "VPtmpref("; fprint_tmpvar (pf | out, tmp); prstr ")"
end | VPtop () => begin
fprint1_string (pf | out, "VPtop()")
end | VPvoid () => begin
fprint1_string (pf | out, "VPvoid()")
end
end
implement
fprint_valprimlst {m} (pf | out, vps) = let
fun aux (out: &FILE m, i: int, vps: valprimlst): void =
case+ vps of
| list_cons (vp, vps) => begin
if i > 0 then fprint1_string (pf | out, ", ");
fprint_valprim (pf | out, vp); aux (out, i+1, vps)
end | list_nil () => ()
in
aux (out, 0, vps)
end
implement fprint_labvalprimlst {m} (pf | out, lvps) = let
fun aux (out: &FILE m, i: int, lvps: labvalprimlst): void =
case+ lvps of
| LABVALPRIMLSTcons (l, vp, lvps) => begin
if i > 0 then fprint1_string (pf | out, ", ");
fprint_label (pf | out, l); fprint1_string (pf | out, "= ");
fprint_valprim (pf | out, vp); aux (out, i+1, lvps)
end
| LABVALPRIMLSTnil () => ()
in
aux (out, 0, lvps)
end
implement fprint_offset {m} (pf | out, off) = begin
case+ off of
| OFFSETlab (l, _) => begin
fprint1_string (pf | out, "."); fprint_label (pf | out, l)
end | OFFSETind (vpss, _) => aux (out, vpss) where {
fun aux (out: &FILE m, vpss: valprimlstlst)
: void = begin case+ vpss of
| list_cons (vps, vpss) => begin
fprint1_string (pf | out, "[");
fprint_valprimlst (pf | out, vps);
fprint1_string (pf | out, "]");
aux (out, vpss)
end
| list_nil () => ()
end } end
implement fprint_offsetlst {m} (pf | out, offs) = let
fun aux (out: &FILE m, i: int, offs: offsetlst): void =
case+ offs of
| list_cons (off, offs) => begin
if i > 0 then fprint1_string (pf | out, ", ");
fprint_offset (pf | out, off); aux (out, i+1, offs)
end | list_nil () => ()
in
aux (out, 0, offs)
end
implement fprint_patck (pf | out, patck) = let
macdef prstr (s) = fprint1_string (pf | out, ,(s))
in
case+ patck of
| PATCKbool b => begin
prstr "PATCKbool("; fprint1_bool (pf | out, b); prstr ")"
end
| PATCKchar c => begin
prstr "PATCKchar("; fprint1_char (pf | out, c); prstr ")"
end
| PATCKcon d2c => begin
prstr "PATCKcon("; fprint_d2con (pf | out, d2c); prstr ")"
end
| PATCKexn d2c => begin
prstr "PATCKexn("; fprint_d2con (pf | out, d2c); prstr ")"
end
| PATCKfloat f => begin
prstr "PATCKfloat("; fprint1_string (pf | out, f); prstr ")"
end
| PATCKint i => begin
prstr "PATCKint(";
$IntInf.fprint_intinf (pf | out, i);
prstr ")"
end
| PATCKstring s => begin
fprintf1_exn (pf | out, "PATCKstring(\"%s\")", @(s))
end
end
implement fprint_patcklst {m} (pf | out, patcks) = let
fun aux (out: &FILE m, i: int, patcks: patcklst): void =
case+ patcks of
| list_cons (patck, patcks) => begin
if i > 0 then fprint1_string (pf | out, ", ");
fprint_patck (pf | out, patck); aux (out, i+1, patcks)
end | list_nil () => ()
in
aux (out, 0, patcks)
end
implement fprint_kont {m} (pf | out, k) = let
macdef prstr (s) = fprint1_string (pf | out, ,(s))
in
case+ k of
| KONTtmplab tl => begin
prstr "KONTtmplab(";
fprint_tmplab (pf | out, tl);
prstr ")"
end | KONTtmplabint (tl, i) => begin
prstr "KONTtmplabint(";
fprint_tmplab (pf | out, tl);
prstr ", ";
fprint1_int (pf | out, i);
prstr ")"
end | KONTcaseof_fail (loc) => begin
fprint1_string (pf | out, "KONTcaseof_fail(...)")
end | KONTfunarg_fail (loc, fl) => begin
prstr "KONTfunarg_fail(..., "; fprint_funlab (pf | out, fl); prstr ")"
end | KONTmatpnt mpt => begin
fprint1_string (pf | out, "KONTmatpnt(...)")
end | KONTraise vp => begin
prstr "KONTraise("; fprint_valprim (pf | out, vp); prstr ")"
end | KONTnone () => begin
fprint1_string (pf | out, "KONTnone()")
end end
implement fprint_kontlst {m} (pf | out, ks) = let
fun aux (out: &FILE m, i: int, ks: kontlst): void =
case+ ks of
| list_cons (k, ks) => begin
if i > 0 then fprint1_string (pf | out, ", ");
fprint_kont (pf | out, k); aux (out, i+1, ks)
end
| list_nil () => ()
in
aux (out, 0, ks)
end
implement fprint_instr (pf | out, ins) = let
macdef prstr (s) = fprint1_string (pf | out, ,(s))
in
case+ ins.instr_node of
| INSTRarr_heap (tmp, asz, hit_elt) => begin
prstr "INSTRarr_heap(";
fprint_tmpvar (pf | out, tmp);
prstr "; ";
fprint_int (pf | out, asz);
prstr "; ";
fprint_hityp (pf | out, hityp_decode hit_elt);
prstr ")";
end | INSTRarr_stack (tmp, level, vp_asz, hit_elt) => begin
prstr "INSTRarr_stack(";
fprint_tmpvar (pf | out, tmp);
prstr "; ";
fprint_int (pf | out, level);
prstr "; ";
fprint_valprim (pf | out, vp_asz);
prstr "; ";
fprint_hityp (pf | out, hityp_decode hit_elt);
prstr ")";
end | INSTRassgn_arr (vp_arr, vp_asz, tmp_elt, vp_tsz) => begin
prstr "INSTRassgn_arr(";
fprint_valprim (pf | out, vp_arr);
prstr "; ";
fprint_valprim (pf | out, vp_asz);
prstr "; ";
fprint_tmpvar (pf | out, tmp_elt);
prstr "; ";
fprint_valprim (pf | out, vp_tsz);
prstr ")";
end | INSTRassgn_clo (vp_clo, fl, env) => begin
prstr "INSTRassgn_clo(";
fprint_valprim (pf | out, vp_clo);
prstr "; ";
fprint_funlab (pf | out, fl);
prstr "; ";
fprint1_string (pf | out, "...");
prstr ")";
end | INSTRcall (tmp, hit_fun, vp_fun, vps_arg) => begin
prstr "INSTRcall(";
fprint_tmpvar (pf | out, tmp);
prstr "; ";
fprint_hityp (pf | out, hityp_decode hit_fun);
prstr "; ";
fprint_valprim (pf | out, vp_fun);
prstr "; ";
fprint_valprimlst (pf | out, vps_arg);
prstr ")"
end | INSTRcall_tail (fl) => begin
prstr "INSTRcall_tail("; fprint_funlab (pf | out, fl); prstr ")"
end | INSTRcond (vp, inss1, inss2) => begin
prstr "INSTRcond(";
fprint_valprim (pf | out, vp);
fprint_newline (pf | out);
prstr "INSTRcond_then:";
fprint_newline (pf | out);
fprint_instrlst (pf | out, inss1);
fprint_newline (pf | out);
prstr "INSTRcond_else:";
fprint_newline (pf | out);
fprint_instrlst (pf | out, inss2);
fprint_newline (pf | out);
prstr ")"
end | INSTRdefine_clo (d2c, fl) => begin
prstr "INSTRdefine_clo(";
fprint_d2cst (pf | out, d2c);
prstr ", ";
fprint_funlab (pf | out, fl);
prstr ")"
end | INSTRdefine_fun (d2c, fl) => begin
prstr "INSTRdefine_fun(";
fprint_d2cst (pf | out, d2c);
prstr ", ";
fprint_funlab (pf | out, fl);
prstr ")"
end | INSTRdefine_val (d2c, vp) => begin
prstr "INSTRdefine_val(";
fprint_d2cst (pf | out, d2c);
prstr ", ";
fprint_valprim (pf | out, vp);
prstr ")"
end | INSTRextern cmd => begin
fprintf1_exn (pf | out, "INSTRextern(\"%s\")", @(cmd))
end | INSTRextval (name, vp) => begin
prstr "INSTRextval(";
fprint1_string (pf | out, name);
prstr ", ";
fprint_valprim (pf | out, vp);
prstr ")"
end | INSTRfreeptr vp => begin
prstr "INSTRfreeptr("; fprint_valprim (pf | out, vp); prstr ")"
end | INSTRfunction _ => begin
fprint1_string (pf | out, "INSTRfunction(...)")
end | INSTRfunlab fl => begin
prstr "INSTRfunlab("; fprint_funlab (pf | out, fl); prstr ")"
end | INSTRdynload_file (fil) => begin
prstr "INSTRdynload_file(";
$Fil.fprint_filename (pf | out, fil);
prstr ")"
end | INSTRload_ptr (tmp, vp_ptr) => begin
prstr "INSTRload_ptr(";
fprint_tmpvar (pf | out, tmp);
prstr "; ";
fprint_valprim (pf | out, vp_ptr);
prstr ")"
end | INSTRload_ptr_offs (tmp, vp_ptr, offs) => begin
prstr "INSTRload_ptr_offs(";
fprint_tmpvar (pf | out, tmp);
prstr "; ";
fprint_valprim (pf | out, vp_ptr);
prstr "; ";
fprint_offsetlst (pf | out, offs);
prstr ")"
end | INSTRload_var (tmp, vp_var) => begin
prstr "INSTRload_var(";
fprint_tmpvar (pf | out, tmp);
prstr "; ";
fprint_valprim (pf | out, vp_var);
prstr ")"
end | INSTRload_var_offs (tmp, vp_var, offs) => begin
prstr "INSTRload_var_offs(";
fprint_tmpvar (pf | out, tmp);
prstr "; ";
fprint_valprim (pf | out, vp_var);
prstr "; ";
fprint_offsetlst (pf | out, offs);
prstr ")"
end | INSTRloop _ => begin
fprint1_string (pf | out, "INSTRloop(...)")
end | INSTRloopexn (knd, tl) => begin
prstr "INSTRloopexn(";
fprint1_int (pf | out, knd);
prstr "; ";
fprint_tmplab (pf | out, tl);
prstr ")"
end | INSTRmove_arg (arg, vp) => begin
prstr "INSTRmove_arg(";
fprint1_int (pf | out, arg);
prstr ", ";
fprint_valprim (pf | out, vp);
prstr ")"
end | INSTRmove_con (tmp, hit_sum, d2c, vps_arg) => begin
prstr "INSTRmove_con(";
fprint_tmpvar (pf | out, tmp);
prstr "; ";
fprint_hityp (pf | out, hityp_decode hit_sum);
prstr "; ";
fprint_d2con (pf | out, d2c);
prstr "; ";
fprint_valprimlst (pf | out, vps_arg);
prstr ")"
end | INSTRmove_lazy_delay (tmp, lin, hit, vp) => begin
prstr "INSTRmove_lazy_delay(";
fprint_tmpvar (pf | out, tmp);
prstr "; ";
fprint_int (pf | out, lin);
prstr "; ";
fprint_hityp (pf | out, hityp_decode hit);
prstr "; ";
fprint_valprim (pf | out, vp);
prstr ")"
end | INSTRmove_lazy_force (tmp, lin, hit, vp) => begin
prstr "INSTRmove_lazy_force(";
fprint_tmpvar (pf | out, tmp);
prstr "; ";
fprint_int (pf | out, lin);
prstr "; ";
fprint_hityp (pf | out, hityp_decode hit);
prstr "; ";
fprint_valprim (pf | out, vp);
prstr ")"
end | INSTRmove_rec_box (tmp, hit_rec, lvps) => begin
prstr "INSTRmove_rec_box(";
fprint_tmpvar (pf | out, tmp);
prstr "; ";
fprint_hityp (pf | out, hityp_decode hit_rec);
prstr "; ";
fprint_labvalprimlst (pf | out, lvps);
prstr ")"
end | INSTRmove_rec_flt (tmp, hit_rec, lvps) => begin
prstr "INSTRmove_rec_flt(";
fprint_tmpvar (pf | out, tmp);
prstr "; ";
fprint_hityp (pf | out, hityp_decode hit_rec);
prstr "; ";
fprint_labvalprimlst (pf | out, lvps);
prstr ")"
end | INSTRmove_val (tmp, vp) => begin
prstr "INSTRmove_val(";
fprint_tmpvar (pf | out, tmp);
prstr "; ";
fprint_valprim (pf | out, vp);
prstr ")"
end | INSTRmove_ref (tmp, vp) => begin
prstr "INSTRmove_ref(";
fprint_tmpvar (pf | out, tmp);
prstr "; ";
fprint_valprim (pf | out, vp);
prstr ")"
end | INSTRpatck (vp, patck, k_fail) => begin
prstr "INSTRpatck(";
fprint_valprim (pf | out, vp);
prstr "; ";
fprint_patck (pf | out, patck);
prstr "; ";
fprint_kont (pf | out, k_fail);
prstr ")"
end | INSTRraise (tmp, vp) => begin
prstr "INSTRraise(";
fprint_tmpvar (pf | out, tmp);
prstr "; ";
fprint_valprim (pf | out, vp);
prstr ")"
end | INSTRselcon (tmp, vp_sum, hit_sum, i) => begin
prstr "INSTRselcon(";
fprint_tmpvar (pf | out, tmp);
prstr "; ";
fprint_valprim (pf | out, vp_sum);
prstr "; ";
fprint_hityp (pf | out, hityp_decode hit_sum);
prstr "; ";
fprint1_int (pf | out, i);
prstr ")"
end | INSTRselcon_ptr (tmp, vp_sum, hit_sum, i) => begin
prstr "INSTRselcon_ptr(";
fprint_tmpvar (pf | out, tmp);
prstr "; ";
fprint_valprim (pf | out, vp_sum);
prstr "; ";
fprint_hityp (pf | out, hityp_decode hit_sum);
prstr "; ";
fprint_int (pf | out, i);
prstr ")"
end | INSTRselect (tmp, vp_root, offs) => begin
prstr "INSTRselect(";
fprint_tmpvar (pf | out, tmp);
prstr "; ";
fprint_valprim (pf | out, vp_root);
prstr "; ";
fprint_offsetlst (pf | out, offs);
prstr ")"
end | INSTRstore_ptr (vp_ptr, vp_val) => begin
prstr "INSTRstore_ptr(";
fprint_valprim (pf | out, vp_ptr);
prstr "; ";
fprint_valprim (pf | out, vp_val);
prstr ")"
end | INSTRstore_ptr_offs (vp_ptr, offs, vp_val) => begin
prstr "INSTRstore_ptr_offs(";
fprint_valprim (pf | out, vp_ptr);
prstr "; ";
fprint_offsetlst (pf | out, offs);
prstr "; ";
fprint_valprim (pf | out, vp_val);
prstr ")"
end | INSTRstore_var (vp_var, vp_val) => begin
prstr "INSTRstore_var(";
fprint_valprim (pf | out, vp_var);
prstr "; ";
fprint_valprim (pf | out, vp_val);
prstr ")"
end | INSTRstore_var_offs (vp_var, offs, vp_val) => begin
prstr "INSTRstore_var_offs(";
fprint_valprim (pf | out, vp_var);
prstr "; ";
fprint_offsetlst (pf | out, offs);
prstr "; ";
fprint_valprim (pf | out, vp_val);
prstr ")"
end | INSTRswitch _ => begin
fprint1_string (pf | out, "INSTRswitch(...)")
end | INSTRtmplabint (tl, i) => begin
prstr "INSTRtmplabint(";
fprint_tmplab (pf | out, tl);
prstr "_";
fprint1_int (pf | out, i);
prstr ")"
end | INSTRprfck_beg (d2c) => begin
prstr "INSTRprfck_beg("; fprint_d2cst (pf | out, d2c); prstr ")"
end | INSTRprfck_end (d2c) => begin
prstr "INSTRprfck_end("; fprint_d2cst (pf | out, d2c); prstr ")"
end | INSTRprfck_tst (d2c) => begin prstr "INSTRprfck_tst("; fprint_d2cst (pf | out, d2c); prstr ")"
end | INSTRtrywith _ => begin
fprint1_string (pf | out, "INSTRtrywith(...)")
end | INSTRvardec tmp => begin
prstr "INSTRvardec("; fprint_tmpvar (pf | out, tmp); prstr ")"
end
end
implement fprint_instrlst {m} (pf | out, inss) = let
fun aux (out: &FILE m, inss: instrlst): void = begin
case+ inss of
| list_cons (ins, inss) => begin
fprint_instr (pf | out, ins); fprint_newline (pf | out);
aux (out, inss)
end | list_nil () => ()
end in
aux (out, inss)
end
implement
fprint_branch {m} (pf | out, br) = begin
fprint_tmplab (pf | out, br.branch_lab);
fprint1_string (pf | out, ": "); fprint_newline (pf | out);
fprint_instrlst (pf | out, br.branch_inss);
end
implement
fprint_branchlst {m} (pf | out, brs) = let
fun aux (out: &FILE m, brs: branchlst): void =
case+ brs of
| list_cons (br, brs) => begin
fprint_branch (pf | out, br); aux (out, brs)
end | list_nil () => ()
in
aux (out, brs)
end
implement print_valprim (vp) = print_mac (fprint_valprim, vp)
implement prerr_valprim (vp) = prerr_mac (fprint_valprim, vp)
implement print_valprimlst (vps) = print_mac (fprint_valprimlst, vps)
implement prerr_valprimlst (vps) = prerr_mac (fprint_valprimlst, vps)
implement print_instr (ins) = print_mac (fprint_instr, ins)
implement prerr_instr (ins) = prerr_mac (fprint_instr, ins)
implement print_instrlst (inss) = print_mac (fprint_instrlst, inss)
implement prerr_instrlst (inss) = prerr_mac (fprint_instrlst, inss)