diff options
Diffstat (limited to 'ecomp-c/ec.c')
-rw-r--r-- | ecomp-c/ec.c | 46 |
1 files changed, 32 insertions, 14 deletions
diff --git a/ecomp-c/ec.c b/ecomp-c/ec.c index 5d42355..f6e1926 100644 --- a/ecomp-c/ec.c +++ b/ecomp-c/ec.c @@ -1548,15 +1548,34 @@ static void parseParameterList( Scope *scope ) ExpressionNode *node; Expect( S_lparen ); + Emit( "( " ); do { node = parseExpression( scope ); + generate_expression_comment( node ); if( sym == S_comma ) { sym = getSym( ); } } while( sym != S_rparen ); Expect( S_rparen ); - - (void)node; + + Emit( ")\n" ); + + emit_expression_code( node, scope ); +} + +static void parseProcedureCall( Scope *scope ) +{ + Symbol *symbol; + + symbol = get_symbol( scope, ident ); + + Emit( "; CALL %s", symbol->label ); + if( sym == S_lparen ) { + parseParameterList( scope ); + } else { + Emit( "\n" ); + } + Emit( "call %s\n", symbol->label ); } static void parseStatement( Scope *scope ) @@ -1576,10 +1595,7 @@ static void parseStatement( Scope *scope ) Abort( "Unknown indentifier '%s'", ident ); } if( symbol->class == SYMBOL_CLASS_PROCEDURE_TYPE ) { - if( sym == S_lparen ) { - parseParameterList( scope ); - } - Emit( "call %s\n", symbol->label ); + parseProcedureCall( scope ); } else { parseAssignment( scope ); } @@ -2082,7 +2098,7 @@ static void parseProcedureDeclaration( Scope *scope ) param = symbol->scope->symbol; size_params = 0; - offset = 0; + offset = -4; while( param != NULL ) { if( param->class == SYMBOL_CLASS_VARIABLE ) { int size = get_size( param ); @@ -2143,7 +2159,7 @@ static void parseProcedureDeclaration( Scope *scope ) * at runtime (every time the stack is created for that procedure) */ param_or_local = symbol->scope->symbol; while( param_or_local != NULL ) { - if( param_or_local->class == SYMBOL_CLASS_VARIABLE ) { + if( param_or_local->class == SYMBOL_CLASS_VARIABLE && param_or_local->offset >= 0 ) { /* TODO: use type here! */ int size = get_size( param_or_local ); if( param_or_local->type == integer_type || param_or_local->type == boolean_type ) { @@ -2187,15 +2203,17 @@ static void parseProcedureDeclaration( Scope *scope ) parseStatementBlock( symbol->scope ); - /* discard locals, discard params, reset base pointer */ - if( size_locals + size_params > 0 ) { - Emit( "mov eax, %d\n", size_locals + size_params ); + /* discard locals, restore base pointer, discard params */ + if( size_locals > 0 ) { + Emit( "mov eax, %d\n", size_locals ); Emit( "add esp, eax\n" ); } - Emit( "pop ebp\n" ); - - Emit( "ret\n" ); + if( size_params > 0 ) { + Emit( "ret %d\n", size_params ); + } else { + Emit( "ret\n" ); + } } free_scope( symbol->scope ); |