summaryrefslogtreecommitdiff
path: root/ecomp-c/ec.c
diff options
context:
space:
mode:
Diffstat (limited to 'ecomp-c/ec.c')
-rw-r--r--ecomp-c/ec.c46
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 );