55 lines
2.2 KiB
OCaml
55 lines
2.2 KiB
OCaml
open Proto_alpha_utils
|
|
open Trace
|
|
open Mini_c
|
|
open! Compiler.Program
|
|
open Memory_proto_alpha.Script_ir_translator
|
|
|
|
let run_aux ?options (program:compiled_program) (input_michelson:Michelson.t) : ex_typed_value result =
|
|
let Compiler.Program.{input;output;body} : compiled_program = program in
|
|
let (Ex_ty input_ty) = input in
|
|
let (Ex_ty output_ty) = output in
|
|
let%bind input =
|
|
Trace.trace_tzresult_lwt (simple_error "error parsing input") @@
|
|
Memory_proto_alpha.parse_michelson_data input_michelson input_ty in
|
|
let body = Michelson.strip_annots body in
|
|
let%bind descr =
|
|
Trace.trace_tzresult_lwt (simple_error "error parsing program code") @@
|
|
Memory_proto_alpha.parse_michelson body
|
|
(Stack.(input_ty @: nil)) (Stack.(output_ty @: nil)) in
|
|
let open! Memory_proto_alpha.Script_interpreter in
|
|
let%bind (Item(output, Empty)) =
|
|
Trace.trace_tzresult_lwt (simple_error "error of execution") @@
|
|
Memory_proto_alpha.interpret ?options descr (Item(input, Empty)) in
|
|
ok (Ex_typed_value (output_ty, output))
|
|
|
|
let run_entry ?(debug_michelson = false) ?options (entry:anon_function) (input:value) : value result =
|
|
let%bind compiled =
|
|
let error =
|
|
let title () = "compile entry" in
|
|
let content () =
|
|
Format.asprintf "%a" PP.function_ entry
|
|
in
|
|
error title content in
|
|
trace error @@
|
|
translate_entry entry in
|
|
let%bind input_michelson = translate_value input in
|
|
if debug_michelson then (
|
|
Format.printf "Program: %a\n" Michelson.pp compiled.body ;
|
|
Format.printf "Expression: %a\n" PP.expression entry.result ;
|
|
Format.printf "Input: %a\n" PP.value input ;
|
|
Format.printf "Input Type: %a\n" PP.type_ entry.input ;
|
|
Format.printf "Compiled Input: %a\n" Michelson.pp input_michelson ;
|
|
) ;
|
|
let%bind ex_ty_value = run_aux ?options compiled input_michelson in
|
|
if debug_michelson then (
|
|
let (Ex_typed_value (ty , v)) = ex_ty_value in
|
|
ignore @@
|
|
let%bind michelson_value =
|
|
trace_tzresult_lwt (simple_error "debugging run_mini_c") @@
|
|
Proto_alpha_utils.Memory_proto_alpha.unparse_michelson_data ty v in
|
|
Format.printf "Compiled Output: %a\n" Michelson.pp michelson_value ;
|
|
ok ()
|
|
) ;
|
|
let%bind (result : value) = Compiler.Uncompiler.translate_value ex_ty_value in
|
|
ok result
|