From ed1648868c35ab0a0ecbb69480b0420adc80aad9 Mon Sep 17 00:00:00 2001 From: Erik Stenman Date: Thu, 28 Feb 2019 22:20:30 +0100 Subject: [PATCH] Fix bits formatting and parsing. --- src/aeb_fate_asm.erl | 3 ++- src/aeb_fate_data.erl | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/aeb_fate_asm.erl b/src/aeb_fate_asm.erl index 5606894..17f8f60 100644 --- a/src/aeb_fate_asm.erl +++ b/src/aeb_fate_asm.erl @@ -632,7 +632,8 @@ to_bytecode([{'(',_line}|Rest], Address, Env, Code, Opts) -> Tuple = aeb_fate_data:make_tuple(list_to_tuple(Elements)), to_bytecode(Rest2, Address, Env, [{immediate, Tuple}|Code], Opts); to_bytecode([{bits,_line, Bits}|Rest], Address, Env, Code, Opts) -> - to_bytecode(Rest, Address, Env, [{immediate, Bits}|Code], Opts); + to_bytecode(Rest, Address, Env, + [{immediate, aeb_fate_data:make_bits(Bits)}|Code], Opts); to_bytecode([{comment, Line, Comment}|Rest], Address, Env, Code, Opts) -> Env2 = insert_annotation(comment, Line, Comment, Env), diff --git a/src/aeb_fate_data.erl b/src/aeb_fate_data.erl index 3037d64..5ddab1e 100644 --- a/src/aeb_fate_data.erl +++ b/src/aeb_fate_data.erl @@ -137,6 +137,10 @@ format(?FATE_UNIT) -> "()"; format(?FATE_TUPLE(T)) -> ["( ", lists:join(", ", [ format(E) || E <- erlang:tuple_to_list(T)]), " )"]; format(S) when ?IS_FATE_STRING(S) -> [S]; +format(?FATE_BITS(B)) when B >= 0 -> + ["<", format_bits(B, "") , ">"]; +format(?FATE_BITS(B)) when B < 0 -> + ["!< ", format_nbits(-B-1, "") , " >"]; format(?FATE_VARIANT(Size, Tag, T)) -> ["(| ", lists:join("| ", [integer_to_list(Size), integer_to_list(Tag) | @@ -147,6 +151,21 @@ format(M) when ?IS_FATE_MAP(M) -> format(?FATE_ADDRESS(Address)) -> ["#", address_to_base58(Address)]; format(V) -> exit({not_a_fate_type, V}). +format_bits(0, Acc) -> Acc; +format_bits(N, Acc) -> + case N band 1 of + 1 -> format_bits(N bsr 1, [$1|Acc]); + 0 -> format_bits(N bsr 1, [$0|Acc]) + end. + +format_nbits(0, Acc) -> Acc; +format_nbits(N, Acc) -> + case N band 1 of + 1 -> format_nbits(N bsr 1, [$0|Acc]); + 0 -> format_nbits(N bsr 1, [$1|Acc]) + end. + + format_list(List) -> ["[ ", lists:join(", ", [format(E) || E <- List]), " ]"].