if (!local.floating && requires_destroy (local.variable_type)) {
var ma = new MemberAccess.simple (local.name);
ma.symbol_reference = local;
- cblock.add_statement (new CCodeExpressionStatement (get_unref_expression (new CCodeIdentifier (get_variable_cname (local.name)), local.variable_type, ma)));
+ cblock.add_statement (new CCodeExpressionStatement (get_unref_expression (get_variable_cexpression (local.name), local.variable_type, ma)));
}
}
if (requires_destroy (param.parameter_type) && param.direction == ParameterDirection.IN) {
var ma = new MemberAccess.simple (param.name);
ma.symbol_reference = param;
- cblock.add_statement (new CCodeExpressionStatement (get_unref_expression (new CCodeIdentifier (get_variable_cname (param.name)), param.parameter_type, ma)));
+ cblock.add_statement (new CCodeExpressionStatement (get_unref_expression (get_variable_cexpression (param.name), param.parameter_type, ma)));
}
}
}
temp_vars.clear ();
}
+ public CCodeExpression get_variable_cexpression (string name) {
+ if (current_method != null && current_method.coroutine) {
+ return new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), get_variable_cname (name));
+ } else {
+ return new CCodeIdentifier (get_variable_cname (name));
+ }
+ }
+
public string get_variable_cname (string name) {
if (name[0] == '.') {
// compiler-internal variable
if (local.active && !local.floating && requires_destroy (local.variable_type)) {
var ma = new MemberAccess.simple (local.name);
ma.symbol_reference = local;
- cfrag.append (new CCodeExpressionStatement (get_unref_expression (new CCodeIdentifier (get_variable_cname (local.name)), local.variable_type, ma)));
+ cfrag.append (new CCodeExpressionStatement (get_unref_expression (get_variable_cexpression (local.name), local.variable_type, ma)));
}
}
if (requires_destroy (param.parameter_type) && param.direction == ParameterDirection.IN) {
var ma = new MemberAccess.simple (param.name);
ma.symbol_reference = param;
- cfrag.append (new CCodeExpressionStatement (get_unref_expression (new CCodeIdentifier (get_variable_cname (param.name)), param.parameter_type, ma)));
+ cfrag.append (new CCodeExpressionStatement (get_unref_expression (get_variable_cexpression (param.name), param.parameter_type, ma)));
}
}
}
found = true;
var ma = new MemberAccess.simple (local.name);
ma.symbol_reference = local;
- ccomma.append_expression (get_unref_expression (new CCodeIdentifier (get_variable_cname (local.name)), local.variable_type, ma));
+ ccomma.append_expression (get_unref_expression (get_variable_cexpression (local.name), local.variable_type, ma));
}
}
found = true;
var ma = new MemberAccess.simple (param.name);
ma.symbol_reference = param;
- ccomma.append_expression (get_unref_expression (new CCodeIdentifier (get_variable_cname (param.name)), param.parameter_type, ma));
+ ccomma.append_expression (get_unref_expression (get_variable_cexpression (param.name), param.parameter_type, ma));
}
}
expr.ccodenode = new CCodeConstant (ev.get_cname ());
} else if (expr.symbol_reference is LocalVariable) {
var local = (LocalVariable) expr.symbol_reference;
- if (current_method != null && current_method.coroutine) {
- // use closure
- expr.ccodenode = new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), get_variable_cname (local.name));
- } else {
- expr.ccodenode = new CCodeIdentifier (get_variable_cname (local.name));
- }
+ expr.ccodenode = get_variable_cexpression (local.name);
} else if (expr.symbol_reference is FormalParameter) {
var p = (FormalParameter) expr.symbol_reference;
if (p.name == "this") {
if (current_method != null && current_method.coroutine) {
// use closure
- expr.ccodenode = new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), "self");
+ expr.ccodenode = get_variable_cexpression ("self");
} else {
var st = current_type_symbol as Struct;
if (st != null && !st.is_simple_type ()) {
} else {
if (current_method != null && current_method.coroutine) {
// use closure
- expr.ccodenode = new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), p.name);
+ expr.ccodenode = get_variable_cexpression (p.name);
} else {
var type_as_struct = p.parameter_type.data_type as Struct;
if (p.direction != ParameterDirection.IN