diff options
author | Søren Sandmann <sandmann@redhat.com> | 2007-09-01 04:00:02 -0400 |
---|---|---|
committer | Søren Sandmann <sandmann@redhat.com> | 2007-09-01 04:00:02 -0400 |
commit | 2aa5498b09225eebf864d19100389d11bb521263 (patch) | |
tree | 08bbabfc9c95d7405e1a9b444da9e289dd80d564 /offsets.c | |
parent | 478320a817412f8d42f91838740f89e0f1033a80 (diff) |
Add support for statement expressions
Diffstat (limited to 'offsets.c')
-rw-r--r-- | offsets.c | 44 |
1 files changed, 27 insertions, 17 deletions
@@ -27,9 +27,14 @@ static void offsets_function (ast_function_definition_t *function, int level); +/* This function is void since any variable declared in an expression + * is not visible outside that expression + */ static void offsets_expression (ast_expression_t *expr, - int level) + int level, + int offset, + int *max) { int i; @@ -43,18 +48,18 @@ offsets_expression (ast_expression_t *expr, break; case AST_UNARY_EXPRESSION: - offsets_expression (expr->unary.expr, level); + offsets_expression (expr->unary.expr, level, offset, max); break; case AST_BINARY_EXPRESSION: - offsets_expression (expr->binary.left, level); - offsets_expression (expr->binary.right, level); + offsets_expression (expr->binary.left, level, offset, max); + offsets_expression (expr->binary.right, level, offset, max); break; case AST_TERNARY_EXPRESSION: - offsets_expression (expr->ternary.left, level); - offsets_expression (expr->ternary.middle, level); - offsets_expression (expr->ternary.right, level); + offsets_expression (expr->ternary.left, level, offset, max); + offsets_expression (expr->ternary.middle, level, offset, max); + offsets_expression (expr->ternary.right, level, offset, max); break; case AST_LAMBDA_EXPRESSION: @@ -62,9 +67,14 @@ offsets_expression (ast_expression_t *expr, break; case AST_CALL_EXPRESSION: - offsets_expression (expr->call.callee, level); + offsets_expression (expr->call.callee, level, offset, max); for (i = 0; expr->call.args[i] != NULL; ++i) - offsets_expression (expr->call.args[i], level); + offsets_expression (expr->call.args[i], level, offset, max); + break; + + case AST_STATEMENT_EXPRESSION: + offsets_statement (expr->statement.statement, level, offset, max); + offsets_expression (expr->statement.expression, level, offset, max); break; case AST_VOID_EXPRESSION: @@ -175,19 +185,19 @@ offsets_statement (ast_statement_t *statement, break; case AST_WHILE_STATEMENT: - offsets_expression (statement->while_.condition, level); + offsets_expression (statement->while_.condition, level, offset, max); offset = offsets_statement (statement->while_.body, level, offset, max); break; case AST_FOR_STATEMENT: - offsets_expression (statement->for_.first, level); - offsets_expression (statement->for_.second, level); + offsets_expression (statement->for_.first, level, offset, max); + offsets_expression (statement->for_.second, level, offset, max); offset = offsets_statement (statement->for_.body, level, offset, max); - offsets_expression (statement->for_.third, level); + offsets_expression (statement->for_.third, level, offset, max); break; case AST_IF_STATEMENT: - offsets_expression (statement->if_.condition, level); + offsets_expression (statement->if_.condition, level, offset, max); offsets_statement (statement->if_.then_part, level, offset, max); offsets_statement (statement->if_.else_part, level, offset, max); break; @@ -202,15 +212,15 @@ offsets_statement (ast_statement_t *statement, break; case AST_PRINT_STATEMENT: - offsets_expression (statement->print.expr, level); + offsets_expression (statement->print.expr, level, offset, max); break; case AST_EXPRESSION_STATEMENT: - offsets_expression (statement->expression.expr, level); + offsets_expression (statement->expression.expr, level, offset, max); break; case AST_RETURN_STATEMENT: - offsets_expression (statement->return_.expr, level); + offsets_expression (statement->return_.expr, level, offset, max); break; case AST_LABEL_STATEMENT: |