Handle comp ops.
This commit is contained in:
parent
56a2553698
commit
78a2cf9eb1
@ -7,7 +7,7 @@
|
|||||||
-define('CALL_T' , 16#04).
|
-define('CALL_T' , 16#04).
|
||||||
-define('CALL_TR' , 16#05).
|
-define('CALL_TR' , 16#05).
|
||||||
-define('JUMP' , 16#06).
|
-define('JUMP' , 16#06).
|
||||||
-define('JUMPI' , 16#07).
|
-define('JUMPIF' , 16#07).
|
||||||
-define('SWITCH' , 16#08).
|
-define('SWITCH' , 16#08).
|
||||||
-define('PUSH' , 16#09).
|
-define('PUSH' , 16#09).
|
||||||
-define('DUP' , 16#0a).
|
-define('DUP' , 16#0a).
|
||||||
|
@ -217,7 +217,7 @@ deserialize_op(Op, Rest, Code) ->
|
|||||||
end.
|
end.
|
||||||
|
|
||||||
|
|
||||||
serialize(#{functions := Functions} = Env) ->
|
serialize(#{functions := Functions} =_Env) ->
|
||||||
Code = [[?FUNCTION, Name, serialize_signature(Sig), C] ||
|
Code = [[?FUNCTION, Name, serialize_signature(Sig), C] ||
|
||||||
{Name, {Sig, C}} <- maps:to_list(Functions)],
|
{Name, {Sig, C}} <- maps:to_list(Functions)],
|
||||||
serialize_code(lists:flatten(Code)).
|
serialize_code(lists:flatten(Code)).
|
||||||
@ -419,25 +419,13 @@ to_list_of_types(Tokens) ->
|
|||||||
case to_type(Tokens) of
|
case to_type(Tokens) of
|
||||||
{Type, [{',', _} | Rest]} ->
|
{Type, [{',', _} | Rest]} ->
|
||||||
{MoreTypes, Rest2} = to_list_of_types(Rest),
|
{MoreTypes, Rest2} = to_list_of_types(Rest),
|
||||||
{[Type|MoreTypes], Rest2};
|
{[Type|MoreTypes], Rest2}
|
||||||
{Type, [{']', _} | Rest]} ->
|
{Type, [{']', _} | Rest]} ->
|
||||||
{[Type], Rest}
|
{[Type], Rest}
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
%% Also reverses the code (back to unreversed state).
|
|
||||||
resolve_refs([{ref, ID} | Rest], Env, Code) ->
|
|
||||||
Address = maps:get(ID, Env),
|
|
||||||
resolve_refs(Rest, Env, [Address | Code]);
|
|
||||||
resolve_refs([Op | Rest], Env, Code) ->
|
|
||||||
resolve_refs(Rest, Env, [Op | Code]);
|
|
||||||
resolve_refs([],_Env, Code) -> Code.
|
|
||||||
|
|
||||||
expand_args([OP | Rest]) ->
|
|
||||||
[OP | expand_args(Rest)];
|
|
||||||
expand_args([]) -> [].
|
|
||||||
|
|
||||||
insert_fun(none, [], Env) -> Env;
|
insert_fun(none, [], Env) -> Env;
|
||||||
insert_fun({Name, Type, RetType}, Code, #{functions := Functions} = Env) ->
|
insert_fun({Name, Type, RetType}, Code, #{functions := Functions} = Env) ->
|
||||||
{Hash, Env2} = insert_symbol(Name, Env),
|
{Hash, Env2} = insert_symbol(Name, Env),
|
||||||
|
@ -34,7 +34,7 @@ CALL_R : {token, {mnemonic, TokenLine, 'CALL_R'}}.
|
|||||||
CALL_T : {token, {mnemonic, TokenLine, 'CALL_T'}}.
|
CALL_T : {token, {mnemonic, TokenLine, 'CALL_T'}}.
|
||||||
CALL_TR : {token, {mnemonic, TokenLine, 'CALL_TR'}}.
|
CALL_TR : {token, {mnemonic, TokenLine, 'CALL_TR'}}.
|
||||||
JUMP : {token, {mnemonic, TokenLine, 'JUMP'}}.
|
JUMP : {token, {mnemonic, TokenLine, 'JUMP'}}.
|
||||||
JUMPI : {token, {mnemonic, TokenLine, 'JUMPI'}}.
|
JUMPIF : {token, {mnemonic, TokenLine, 'JUMPIF'}}.
|
||||||
SWITCH : {token, {mnemonic, TokenLine, 'SWITCH'}}.
|
SWITCH : {token, {mnemonic, TokenLine, 'SWITCH'}}.
|
||||||
|
|
||||||
PUSH : {token, {mnemonic, TokenLine, 'PUSH'}}.
|
PUSH : {token, {mnemonic, TokenLine, 'PUSH'}}.
|
||||||
|
@ -28,12 +28,18 @@ mnemonic(?NOP) -> 'NOP' ;
|
|||||||
mnemonic(?RETURN) -> 'RETURN' ;
|
mnemonic(?RETURN) -> 'RETURN' ;
|
||||||
mnemonic(?PUSH) -> 'PUSH' ;
|
mnemonic(?PUSH) -> 'PUSH' ;
|
||||||
mnemonic(?JUMP) -> 'JUMP' ;
|
mnemonic(?JUMP) -> 'JUMP' ;
|
||||||
|
mnemonic(?JUMPIF) -> 'JUMPIF' ;
|
||||||
mnemonic(?INC) -> 'INC' ;
|
mnemonic(?INC) -> 'INC' ;
|
||||||
mnemonic(?CALL) -> 'CALL' ;
|
mnemonic(?CALL) -> 'CALL' ;
|
||||||
mnemonic(?CALL_T) -> 'CALL_T' ;
|
mnemonic(?CALL_T) -> 'CALL_T' ;
|
||||||
mnemonic(?CALL_R) -> 'CALL_R' ;
|
mnemonic(?CALL_R) -> 'CALL_R' ;
|
||||||
mnemonic(?CALL_TR) -> 'CALL_TR' ;
|
mnemonic(?CALL_TR) -> 'CALL_TR' ;
|
||||||
mnemonic(?ADD) -> 'ADD' ;
|
mnemonic(?ADD) -> 'ADD' ;
|
||||||
|
mnemonic(?SUB) -> 'SUB' ;
|
||||||
|
mnemonic(?MUL) -> 'MUL' ;
|
||||||
|
mnemonic(?DIV) -> 'DIV' ;
|
||||||
|
mnemonic(?MOD) -> 'MOD' ;
|
||||||
|
mnemonic(?POW) -> 'POW' ;
|
||||||
mnemonic(?AND) -> 'AND' ;
|
mnemonic(?AND) -> 'AND' ;
|
||||||
mnemonic(?OR) -> 'OR' ;
|
mnemonic(?OR) -> 'OR' ;
|
||||||
mnemonic(?NOT) -> 'NOT' ;
|
mnemonic(?NOT) -> 'NOT' ;
|
||||||
@ -50,8 +56,14 @@ m_to_op('COMMENT') -> ?COMMENT("") ;
|
|||||||
m_to_op('RETURN') -> ?RETURN ;
|
m_to_op('RETURN') -> ?RETURN ;
|
||||||
m_to_op('PUSH') -> ?PUSH ;
|
m_to_op('PUSH') -> ?PUSH ;
|
||||||
m_to_op('JUMP') -> ?JUMP ;
|
m_to_op('JUMP') -> ?JUMP ;
|
||||||
|
m_to_op('JUMPIF') -> ?JUMPIF ;
|
||||||
m_to_op('INC') -> ?INC ;
|
m_to_op('INC') -> ?INC ;
|
||||||
m_to_op('ADD') -> ?ADD ;
|
m_to_op('ADD') -> ?ADD ;
|
||||||
|
m_to_op('SUB') -> ?SUB ;
|
||||||
|
m_to_op('MUL') -> ?MUL ;
|
||||||
|
m_to_op('DIV') -> ?DIV ;
|
||||||
|
m_to_op('MOD') -> ?MOD ;
|
||||||
|
m_to_op('POW') -> ?POW ;
|
||||||
m_to_op('AND') -> ?AND ;
|
m_to_op('AND') -> ?AND ;
|
||||||
m_to_op('OR') -> ?OR ;
|
m_to_op('OR') -> ?OR ;
|
||||||
m_to_op('NOT') -> ?NOT ;
|
m_to_op('NOT') -> ?NOT ;
|
||||||
@ -69,14 +81,23 @@ m_to_op('CALL_TR') -> ?CALL_TR .
|
|||||||
args(?NOP) -> 0;
|
args(?NOP) -> 0;
|
||||||
args(?RETURN) -> 0;
|
args(?RETURN) -> 0;
|
||||||
args(?INC) -> 0;
|
args(?INC) -> 0;
|
||||||
|
|
||||||
args(?PUSH) -> 1;
|
args(?PUSH) -> 1;
|
||||||
args(?JUMP) -> 1;
|
args(?JUMP) -> 1;
|
||||||
args(?CALL) -> 1;
|
args(?CALL) -> 1;
|
||||||
args(?CALL_T) -> 1;
|
args(?CALL_T) -> 1;
|
||||||
|
|
||||||
|
args(?JUMPIF) -> 2;
|
||||||
args(?CALL_R) -> 2;
|
args(?CALL_R) -> 2;
|
||||||
args(?CALL_TR) -> 2;
|
args(?CALL_TR) -> 2;
|
||||||
args(?NOT) -> 2;
|
args(?NOT) -> 2;
|
||||||
|
|
||||||
args(?ADD) -> 3;
|
args(?ADD) -> 3;
|
||||||
|
args(?SUB) -> 3;
|
||||||
|
args(?MUL) -> 3;
|
||||||
|
args(?DIV) -> 3;
|
||||||
|
args(?MOD) -> 3;
|
||||||
|
args(?POW) -> 3;
|
||||||
args(?AND) -> 3;
|
args(?AND) -> 3;
|
||||||
args(?OR) -> 3;
|
args(?OR) -> 3;
|
||||||
args(?LT) -> 3;
|
args(?LT) -> 3;
|
||||||
@ -89,6 +110,7 @@ args(_) -> 0. %% TODO do not allow this
|
|||||||
|
|
||||||
end_bb(?RETURN) -> true;
|
end_bb(?RETURN) -> true;
|
||||||
end_bb(?JUMP) -> true;
|
end_bb(?JUMP) -> true;
|
||||||
|
end_bb(?JUMPIF) -> true;
|
||||||
end_bb(?CALL) -> true;
|
end_bb(?CALL) -> true;
|
||||||
end_bb(?CALL_T) -> true;
|
end_bb(?CALL_T) -> true;
|
||||||
end_bb(?CALL_R) -> true;
|
end_bb(?CALL_R) -> true;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user