Serialize only code blocks that have operators in right order

This commit is contained in:
Thomas Arts 2019-05-28 18:09:05 +02:00
parent aa9d2bf893
commit 453f68fa39

View File

@ -160,16 +160,33 @@ serialize_bbs(BBs, N, Acc) ->
serialize_bbs(BBs, N + 1, [serialize_bb(BB, [])|Acc])
end.
serialize_bb([Op], Acc) ->
lists:reverse([serialize_op(true, Op)|Acc]);
serialize_bb([Op|Rest], Acc) ->
serialize_bb(Rest, [serialize_op(Op)|Acc]);
serialize_bb([], Acc) ->
lists:reverse(Acc).
serialize_bb(Rest, [serialize_op(false, Op)|Acc]).
%% serialize_bb([], Acc) ->
%% lists:reverse(Acc).
serialize_op(Kind, Op) ->
[Mnemonic|Args] =
case is_tuple(Op) of
true -> tuple_to_list(Op);
false -> [Op]
end,
safe_serialize(Kind, aeb_fate_opcodes:m_to_op(Mnemonic), Args).
safe_serialize(Last, Op, Args) ->
case length(Args) == aeb_fate_opcodes:args(Op) of
true ->
case Last == aeb_fate_opcodes:end_bb(Op) of
true -> [Op|serialize_code(Args)];
false ->
error({wrong_opcode_in_bb, Op})
end;
false ->
error({wrong_nr_args_opcode, Op})
end.
serialize_op(Op) when is_tuple(Op) ->
[Opcode|Args] = tuple_to_list(Op),
[aeb_fate_opcodes:m_to_op(Opcode)|serialize_code(Args)];
serialize_op(Opcode) ->
[aeb_fate_opcodes:m_to_op(Opcode)].
%% Argument encoding
%% Argument Specification Byte