return size[dim - 1];
}
} else if (array_expr.symbol_reference != null) {
- if (array_expr.symbol_reference is FormalParameter) {
+ if (array_expr.symbol_reference is FormalParameter || array_expr.symbol_reference is LocalVariable) {
List<CCodeExpression> size = get_array_sizes (array_expr);
if (size != null && size.size >= dim) {
if (is_out) {
return size[dim - 1];
}
}
- } else if (array_expr.symbol_reference is LocalVariable) {
- var local = (LocalVariable) array_expr.symbol_reference;
- if (local.captured) {
- // captured variables are stored on the heap
- var block = (Block) local.parent_symbol;
- var length_expr = new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_array_length_cname (get_variable_cname (local.name), dim));
- if (is_out) {
- // passing array as out/ref
- return new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, length_expr);
- } else {
- return length_expr;
- }
- } else {
- var length_expr = get_variable_cexpression (get_array_length_cname (get_variable_cname (local.name), dim));
- if (is_out) {
- return new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, length_expr);
- } else {
- return length_expr;
- }
- }
} else if (array_expr.symbol_reference is Field) {
var field = (Field) array_expr.symbol_reference;
if (field.array_null_terminated) {
var ma = new MemberAccess.simple (local.name);
ma.symbol_reference = local;
ma.value_type = local.variable_type.copy ();
+ visit_member_access (ma);
ccode.add_expression (get_unref_expression (get_variable_cexpression (local.name), local.variable_type, ma));
}
var ma = new MemberAccess.simple (local.name);
ma.symbol_reference = local;
ma.value_type = local.variable_type.copy ();
+ visit_member_access (ma);
free_block.add_statement (new CCodeExpressionStatement (get_unref_expression (new CCodeMemberAccess.pointer (new CCodeIdentifier ("_data%d_".printf (block_id)), get_variable_cname (local.name)), local.variable_type, ma)));
if (old_coroutine) {
var ma = new MemberAccess.simple (local.name);
ma.symbol_reference = local;
ma.value_type = local.variable_type.copy ();
+ visit_member_access (ma);
ccode.add_expression (get_unref_expression (get_variable_cexpression (local.name), local.variable_type, ma));
}
}
var ma = new MemberAccess.simple (local.name);
ma.symbol_reference = local;
ma.value_type = local.variable_type.copy ();
+ visit_member_access (ma);
rhs = get_cvalue (local.initializer);
var ma = new MemberAccess.simple (local.name);
ma.symbol_reference = local;
ma.value_type = local.variable_type.copy ();
+ visit_member_access (ma);
expr_list.append_expression (get_unref_expression (get_variable_cexpression (local.name), local.variable_type, ma));
}
var ma = new MemberAccess.simple (local.name);
ma.symbol_reference = local;
ma.value_type = local.variable_type.copy ();
+ visit_member_access (ma);
ccode.add_expression (get_unref_expression (get_variable_cexpression (local.name), local.variable_type, ma));
}
var ma = new MemberAccess.simple (local.name);
ma.symbol_reference = local;
ma.value_type = local.variable_type.copy ();
+ visit_member_access (ma);
ccode.add_expression (get_unref_expression (get_variable_cexpression (local.name), local.variable_type, ma));
}
}
if (!local.unreachable && local.active && !local.floating && !local.captured && requires_destroy (local.variable_type)) {
var ma = new MemberAccess.simple (local.name);
ma.symbol_reference = local;
+ ma.value_type = local.variable_type.copy ();
+ visit_member_access (ma);
ccode.add_expression (get_unref_expression (get_variable_cexpression (local.name), local.variable_type, ma));
}
}
// captured variables are stored on the heap
var block = (Block) local.parent_symbol;
set_cvalue (expr, new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_variable_cname (local.name)));
+ if (array_type != null) {
+ for (int dim = 1; dim <= array_type.rank; dim++) {
+ append_array_size (expr, new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_array_length_cname (get_variable_cname (local.name), dim)));
+ }
+ }
} else {
set_cvalue (expr, get_variable_cexpression (local.name));
+ if (array_type != null) {
+ for (int dim = 1; dim <= array_type.rank; dim++) {
+ append_array_size (expr, get_variable_cexpression (get_array_length_cname (get_variable_cname (local.name), dim)));
+ }
+ }
if (expr.parent_node is ReturnStatement &&
current_return_type.value_owned &&
var v = new LocalVariable (m.return_type, ".result");
var ma = new MemberAccess.simple (".result");
ma.symbol_reference = v;
+ ma.value_type = v.variable_type.copy ();
+ visit_member_access (ma);
var unref_expr = get_unref_expression (new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), "result"), m.return_type, ma);
freeblock.add_statement (new CCodeExpressionStatement (unref_expr));
}
foreach (LocalVariable local in temp_ref_vars) {
var ma = new MemberAccess.simple (local.name);
ma.symbol_reference = local;
+ ma.value_type = local.variable_type.copy ();
+ visit_member_access (ma);
ccode.add_expression (get_unref_expression (new CCodeIdentifier (local.name), local.variable_type, ma));
}