summaryrefslogtreecommitdiff
path: root/offsets.c
diff options
context:
space:
mode:
authorSøren Sandmann <sandmann@redhat.com>2007-09-01 04:00:02 -0400
committerSøren Sandmann <sandmann@redhat.com>2007-09-01 04:00:02 -0400
commit2aa5498b09225eebf864d19100389d11bb521263 (patch)
tree08bbabfc9c95d7405e1a9b444da9e289dd80d564 /offsets.c
parent478320a817412f8d42f91838740f89e0f1033a80 (diff)
Add support for statement expressions
Diffstat (limited to 'offsets.c')
-rw-r--r--offsets.c44
1 files changed, 27 insertions, 17 deletions
diff --git a/offsets.c b/offsets.c
index 2d76170..cab14fb 100644
--- a/offsets.c
+++ b/offsets.c
@@ -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: