Handle tailcall
This commit is contained in:
parent
286a8c1913
commit
25319fccd4
@ -269,7 +269,7 @@ to_bytecode([], Address, Env, Code, Opts) ->
|
|||||||
|
|
||||||
|
|
||||||
to_fun_def([{id, _, Name}, {'(', _} | Rest]) ->
|
to_fun_def([{id, _, Name}, {'(', _} | Rest]) ->
|
||||||
{ArgsType, [{'->', _} | Rest2]} = to_arg_types(Rest),
|
{ArgsType, [{'to', _} | Rest2]} = to_arg_types(Rest),
|
||||||
{RetType, Rest3} = to_type(Rest2),
|
{RetType, Rest3} = to_type(Rest2),
|
||||||
{{Name, ArgsType, RetType}, Rest3}.
|
{{Name, ArgsType, RetType}, Rest3}.
|
||||||
|
|
||||||
|
@ -132,7 +132,8 @@ COMMENT : {token, {mnemonic, TokenLine, 'COMMENT'}}.
|
|||||||
|
|
||||||
|
|
||||||
%% Symbols
|
%% Symbols
|
||||||
\-\> : {token, {'->', TokenLine}}.
|
\-\> : {token, {'to', TokenLine}}.
|
||||||
|
\: : {token, {'to', TokenLine}}.
|
||||||
, : {token, {',', TokenLine}}.
|
, : {token, {',', TokenLine}}.
|
||||||
\. : {token, {'.', TokenLine}}.
|
\. : {token, {'.', TokenLine}}.
|
||||||
\( : {token, {'(', TokenLine}}.
|
\( : {token, {'(', TokenLine}}.
|
||||||
|
@ -30,7 +30,8 @@ mnemonic(?PUSH) -> 'PUSH' ;
|
|||||||
mnemonic(?JUMP) -> 'JUMP' ;
|
mnemonic(?JUMP) -> 'JUMP' ;
|
||||||
mnemonic(?INC) -> 'INC' ;
|
mnemonic(?INC) -> 'INC' ;
|
||||||
mnemonic(?CALL) -> 'CALL' ;
|
mnemonic(?CALL) -> 'CALL' ;
|
||||||
mnemonic(OP) -> {OP, nothandled} ;
|
mnemonic(?CALL_T) -> 'CALL_T' ;
|
||||||
|
mnemonic(OP) -> {OP, nothandled} ;
|
||||||
mnemonic({comment,_}) -> 'COMMENT' .
|
mnemonic({comment,_}) -> 'COMMENT' .
|
||||||
|
|
||||||
m_to_op('NOP') -> ?NOP ;
|
m_to_op('NOP') -> ?NOP ;
|
||||||
@ -40,6 +41,7 @@ m_to_op('PUSH') -> ?PUSH ;
|
|||||||
m_to_op('JUMP') -> ?JUMP ;
|
m_to_op('JUMP') -> ?JUMP ;
|
||||||
m_to_op('INC') -> ?INC ;
|
m_to_op('INC') -> ?INC ;
|
||||||
m_to_op('CALL') -> ?CALL ;
|
m_to_op('CALL') -> ?CALL ;
|
||||||
|
m_to_op('CALL_T') -> ?CALL_T ;
|
||||||
m_to_op(Data) when 0=<Data, Data=<255 -> Data.
|
m_to_op(Data) when 0=<Data, Data=<255 -> Data.
|
||||||
|
|
||||||
args(?NOP) -> 0;
|
args(?NOP) -> 0;
|
||||||
@ -48,10 +50,12 @@ args(?PUSH) -> 1;
|
|||||||
args(?JUMP) -> 1;
|
args(?JUMP) -> 1;
|
||||||
args(?INC) -> 0;
|
args(?INC) -> 0;
|
||||||
args(?CALL) -> hash;
|
args(?CALL) -> hash;
|
||||||
|
args(?CALL_T) -> hash;
|
||||||
args(_) -> 0. %% TODO do not allow this
|
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(?CALL) -> true;
|
end_bb(?CALL) -> true;
|
||||||
end_bb(_) -> false.
|
end_bb(?CALL_T) -> true;
|
||||||
|
end_bb(_) -> false.
|
||||||
|
|
||||||
|
@ -23,6 +23,18 @@ FUNCTION call(integer) -> integer
|
|||||||
INC
|
INC
|
||||||
RETURN
|
RETURN
|
||||||
|
|
||||||
|
|
||||||
|
FUNCTION tailcall(integer) -> integer
|
||||||
|
INC
|
||||||
|
CALL_T inc
|
||||||
|
|
||||||
|
FUNCTION remote_call(integer) : integer
|
||||||
|
PUSH arg0
|
||||||
|
CALL_R remote.add_five
|
||||||
|
INC
|
||||||
|
RETURN
|
||||||
|
|
||||||
|
|
||||||
;; Test the code from the shell
|
;; Test the code from the shell
|
||||||
;; _build/default/rel/aessembler/bin/aessembler console
|
;; _build/default/rel/aessembler/bin/aessembler console
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user