open Types open Values type 'inst t = 'inst func and 'inst func = | AstFunc of func_type * 'inst * Ast.func | HostFunc of func_type * (value list -> value list) | GasIntrinsic | StackIntrinsic | UnstackIntrinsic let alloc ft inst f = AstFunc (ft, inst, f) let alloc_host ft f = HostFunc (ft, f) let type_of = function | AstFunc (ft, _, _) -> ft | HostFunc (ft, _) -> ft | GasIntrinsic -> (FuncType ([NumType I64Type], [])) | StackIntrinsic -> (FuncType ([NumType I64Type; NumType I64Type], [])) | UnstackIntrinsic -> (FuncType ([NumType I64Type; NumType I64Type], []))