Handle comp ops.

This commit is contained in:
Erik Stenman 2019-02-14 15:38:19 +01:00
parent 56a2553698
commit 78a2cf9eb1
4 changed files with 26 additions and 16 deletions

View File

@ -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).

View File

@ -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),

View File

@ -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'}}.

View File

@ -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;