Make code easier to test

This commit is contained in:
Thomas Arts 2019-05-27 14:11:52 +02:00
parent f1298870e5
commit ccbb0ed6c7

View File

@ -26,6 +26,11 @@
-include("../include/aeb_fate_opcodes.hrl"). -include("../include/aeb_fate_opcodes.hrl").
-include("../include/aeb_fate_data.hrl"). -include("../include/aeb_fate_data.hrl").
-ifdef(EQC).
-export([update_annotations/2
, update_functions/2
, update_symbols/2]).
-endif.
-record(fcode, { functions = #{} :: map() -record(fcode, { functions = #{} :: map()
, symbols = #{} :: map() , symbols = #{} :: map()
@ -50,14 +55,23 @@ functions(#fcode{ functions = Fs }) ->
symbols(#fcode{ symbols = Ss}) -> symbols(#fcode{ symbols = Ss}) ->
Ss. Ss.
update_annotations(#fcode{ annotations = As } = FCode, Anns) ->
FCode#fcode{ annotations = maps:merge(As, Anns) }.
update_functions(#fcode{ functions = Fs } = FCode, Funs) ->
FCode#fcode{ functions = maps:merge(Fs, Funs) }.
update_symbols(#fcode{ symbols = Ss } = FCode, Symbs) ->
FCode#fcode{ symbols = maps:merge(Ss, Symbs) }.
symbol_identifier(Bin) -> symbol_identifier(Bin) ->
%% First 4 bytes of blake hash %% First 4 bytes of blake hash
{ok, <<X:4/binary,_/binary>> } = eblake2:blake2b(?HASH_BYTES, Bin), {ok, <<X:4/binary,_/binary>> } = eblake2:blake2b(?HASH_BYTES, Bin),
X. X.
insert_fun(Name, {ArgType, RetType}, #{} = BBs, #fcode{ functions = Funs } = F) -> insert_fun(Name, {ArgType, RetType}, #{} = BBs, FCode) ->
{F1, ID} = insert_symbol(Name, F), {F1, ID} = insert_symbol(Name, FCode),
F1#fcode{ functions = Funs#{ ID => {{ArgType, RetType}, BBs}} }. update_functions(F1, #{ID => {{ArgType, RetType}, BBs}}).
insert_symbol(Name, #fcode{ symbols = Syms } = F) -> insert_symbol(Name, #fcode{ symbols = Syms } = F) ->
ID = symbol_identifier(Name), ID = symbol_identifier(Name),
@ -67,13 +81,13 @@ insert_symbol(Name, #fcode{ symbols = Syms } = F) ->
{ok, X} -> {ok, X} ->
error({two_symbols_with_same_hash, Name, X}); error({two_symbols_with_same_hash, Name, X});
error -> error ->
{F#fcode{symbols = Syms#{ ID => Name}}, ID} {update_symbols(F, #{ID => Name}), ID}
end. end.
insert_annotation(comment =_Type, Line, Comment, #fcode{ annotations = Anns} = F) -> insert_annotation(comment =_Type, Line, Comment, FCode) ->
Key = aeb_fate_data:make_tuple({aeb_fate_data:make_string("comment"), Line}), Key = aeb_fate_data:make_tuple({aeb_fate_data:make_string("comment"), Line}),
Value = aeb_fate_data:make_string(Comment), Value = aeb_fate_data:make_string(Comment),
F#fcode{ annotations = Anns#{ Key => Value}}. update_annotations(FCode, #{ Key => Value }).
%%%=================================================================== %%%===================================================================
%%% Serialization %%% Serialization