var temp_var = get_temp_variable (local.variable_type, true, local);
temp_vars.insert (0, temp_var);
- ccomma.append_expression (new CCodeAssignment (new CCodeIdentifier (temp_var.name), rhs));
+ ccomma.append_expression (new CCodeAssignment (get_variable_cexpression (temp_var.name), rhs));
for (int dim = 1; dim <= array_type.rank; dim++) {
var lhs_array_len = get_variable_cexpression (head.get_array_length_cname (get_variable_cname (local.name), dim));
var temp_var = get_temp_variable (local.variable_type, true, local);
temp_vars.insert (0, temp_var);
- ccomma.append_expression (new CCodeAssignment (new CCodeIdentifier (temp_var.name), rhs));
+ ccomma.append_expression (new CCodeAssignment (get_variable_cexpression (temp_var.name), rhs));
var lhs_delegate_target = get_variable_cexpression (get_delegate_target_cname (get_variable_cname (local.name)));
var rhs_delegate_target = get_delegate_target_cexpression (local.initializer);
var return_expr_decl = get_temp_variable (expr_type, true, expr);
var ccomma = new CCodeCommaExpression ();
- ccomma.append_expression (new CCodeAssignment (new CCodeIdentifier (return_expr_decl.name), (CCodeExpression) expr.ccodenode));
+ ccomma.append_expression (new CCodeAssignment (get_variable_cexpression (return_expr_decl.name), (CCodeExpression) expr.ccodenode));
if (!append_local_free_expr (current_symbol, ccomma, false)) {
/* no local variables need to be freed */
return;
}
- ccomma.append_expression (new CCodeIdentifier (return_expr_decl.name));
+ ccomma.append_expression (get_variable_cexpression (return_expr_decl.name));
expr.ccodenode = ccomma;
expr.temp_vars.add (return_expr_decl);
var return_expr_decl = get_temp_variable (stmt.return_expression.value_type, true, stmt);
var ccomma = new CCodeCommaExpression ();
- ccomma.append_expression (new CCodeAssignment (new CCodeIdentifier (return_expr_decl.name), (CCodeExpression) stmt.return_expression.ccodenode));
+ ccomma.append_expression (new CCodeAssignment (get_variable_cexpression (return_expr_decl.name), (CCodeExpression) stmt.return_expression.ccodenode));
var array_type = (ArrayType) current_return_type;
ccomma.append_expression (new CCodeAssignment (len_l, len_r));
}
- ccomma.append_expression (new CCodeIdentifier (return_expr_decl.name));
+ ccomma.append_expression (get_variable_cexpression (return_expr_decl.name));
stmt.return_expression.ccodenode = ccomma;
stmt.return_expression.temp_vars.add (return_expr_decl);
// assign current value to temp variable
var temp_decl = get_temp_variable (prop.property_type, true, expr);
temp_vars.insert (0, temp_decl);
- ccomma.append_expression (new CCodeAssignment (new CCodeIdentifier (temp_decl.name), (CCodeExpression) expr.inner.ccodenode));
+ ccomma.append_expression (new CCodeAssignment (get_variable_cexpression (temp_decl.name), (CCodeExpression) expr.inner.ccodenode));
// increment/decrement property
var op = expr.increment ? CCodeBinaryOperator.PLUS : CCodeBinaryOperator.MINUS;
- var cexpr = new CCodeBinaryExpression (op, new CCodeIdentifier (temp_decl.name), new CCodeConstant ("1"));
+ var cexpr = new CCodeBinaryExpression (op, get_variable_cexpression (temp_decl.name), new CCodeConstant ("1"));
var ccall = get_property_set_call (prop, ma, cexpr);
ccomma.append_expression (ccall);
var decl = get_temp_variable (expression_type, false, node);
temp_vars.insert (0, decl);
- var ctemp = new CCodeIdentifier (decl.name);
+ var ctemp = get_variable_cexpression (decl.name);
var vt = (ValueType) expression_type;
var st = (Struct) vt.type_symbol;
var decl = get_temp_variable (expression_type, false, node);
temp_vars.insert (0, decl);
- var ctemp = new CCodeIdentifier (decl.name);
+ var ctemp = get_variable_cexpression (decl.name);
var cisnull = new CCodeBinaryExpression (CCodeBinaryOperator.EQUALITY, ctemp, new CCodeConstant ("NULL"));
if (expression_type.type_parameter != null) {
var temp_var = get_temp_variable (arg.value_type);
temp_vars.insert (0, temp_var);
- ccomma.append_expression (new CCodeAssignment (new CCodeIdentifier (temp_var.name), cexpr));
+ ccomma.append_expression (new CCodeAssignment (get_variable_cexpression (temp_var.name), cexpr));
ccomma.append_expression (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (temp_var.name)));
return ccomma;
temp_vars.add (temp_decl);
- var ctemp = new CCodeIdentifier (temp_decl.name);
+ var ctemp = get_variable_cexpression (temp_decl.name);
var cinit = new CCodeAssignment (ctemp, (CCodeExpression) expr.inner.ccodenode);
var ccheck = create_type_check (ctemp, expr.type_reference);
var ccast = new CCodeCastExpression (ctemp, expr.type_reference.get_cname ());
var ccomma = new CCodeCommaExpression ();
var temp_decl = get_temp_variable (expr.value_type, true, expr);
temp_vars.insert (0, temp_decl);
- var cvar = new CCodeIdentifier (temp_decl.name);
+ var cvar = get_variable_cexpression (temp_decl.name);
ccomma.append_expression (new CCodeAssignment (cvar, (CCodeExpression) expr.inner.ccodenode));
ccomma.append_expression (new CCodeAssignment ((CCodeExpression) expr.inner.ccodenode, new CCodeConstant ("NULL")));
var ccomma = new CCodeCommaExpression ();
var temp_decl = get_temp_variable (e.value_type);
- var ctemp = new CCodeIdentifier (temp_decl.name);
+ var ctemp = get_variable_cexpression (temp_decl.name);
temp_vars.add (temp_decl);
ccomma.append_expression (new CCodeAssignment (ctemp, ce));
ccomma.append_expression (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, ctemp));
var collection_backup = stmt.collection_variable;
var collection_type = collection_backup.variable_type.copy ();
- var ccoldecl = new CCodeDeclaration (collection_type.get_cname ());
- var ccolvardecl = new CCodeVariableDeclarator.with_initializer (collection_backup.name, (CCodeExpression) stmt.collection.ccodenode);
- ccolvardecl.line = cblock.line;
- ccoldecl.add_declarator (ccolvardecl);
- cblock.add_statement (ccoldecl);
+
+ if (current_method != null && current_method.coroutine) {
+ closure_struct.add_field (collection_type.get_cname (), collection_backup.name);
+ cblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (get_variable_cexpression (collection_backup.name), (CCodeExpression) stmt.collection.ccodenode)));
+ } else {
+ var ccoldecl = new CCodeDeclaration (collection_type.get_cname ());
+ var ccolvardecl = new CCodeVariableDeclarator.with_initializer (collection_backup.name, (CCodeExpression) stmt.collection.ccodenode);
+ ccolvardecl.line = cblock.line;
+ ccoldecl.add_declarator (ccolvardecl);
+ cblock.add_statement (ccoldecl);
+ }
if (stmt.tree_can_fail && stmt.collection.tree_can_fail) {
// exception handling
var array_len = head.get_array_length_cexpression (stmt.collection);
// store array length for use by _vala_array_free
- var clendecl = new CCodeDeclaration ("int");
- clendecl.add_declarator (new CCodeVariableDeclarator.with_initializer (head.get_array_length_cname (collection_backup.name, 1), array_len));
- cblock.add_statement (clendecl);
+ if (current_method != null && current_method.coroutine) {
+ closure_struct.add_field ("int", head.get_array_length_cname (collection_backup.name, 1));
+ cblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (get_variable_cexpression (head.get_array_length_cname (collection_backup.name, 1)), array_len)));
+ } else {
+ var clendecl = new CCodeDeclaration ("int");
+ clendecl.add_declarator (new CCodeVariableDeclarator.with_initializer (head.get_array_length_cname (collection_backup.name, 1), array_len));
+ cblock.add_statement (clendecl);
+ }
if (array_len is CCodeConstant) {
// the array has no length parameter i.e. it is NULL-terminated array
var it_name = "%s_it".printf (stmt.variable_name);
- var citdecl = new CCodeDeclaration (collection_type.get_cname ());
- citdecl.add_declarator (new CCodeVariableDeclarator (it_name));
- cblock.add_statement (citdecl);
+ if (current_method != null && current_method.coroutine) {
+ closure_struct.add_field (collection_type.get_cname (), it_name);
+ } else {
+ var citdecl = new CCodeDeclaration (collection_type.get_cname ());
+ citdecl.add_declarator (new CCodeVariableDeclarator (it_name));
+ cblock.add_statement (citdecl);
+ }
var cbody = new CCodeBlock ();
- CCodeExpression element_expr = new CCodeIdentifier ("*%s".printf (it_name));
+ CCodeExpression element_expr = get_variable_cexpression ("*%s".printf (it_name));
var element_type = array_type.element_type.copy ();
element_type.value_owned = false;
cbody.add_statement (cfrag);
temp_vars.clear ();
- var cdecl = new CCodeDeclaration (stmt.type_reference.get_cname ());
- cdecl.add_declarator (new CCodeVariableDeclarator.with_initializer (stmt.variable_name, element_expr));
- cbody.add_statement (cdecl);
+ if (current_method != null && current_method.coroutine) {
+ closure_struct.add_field (stmt.type_reference.get_cname (), stmt.variable_name);
+ cbody.add_statement (new CCodeExpressionStatement (new CCodeAssignment (get_variable_cexpression (stmt.variable_name), element_expr)));
+ } else {
+ var cdecl = new CCodeDeclaration (stmt.type_reference.get_cname ());
+ cdecl.add_declarator (new CCodeVariableDeclarator.with_initializer (stmt.variable_name, element_expr));
+ cbody.add_statement (cdecl);
+ }
// add array length variable for stacked arrays
if (stmt.type_reference is ArrayType) {
var inner_array_type = (ArrayType) stmt.type_reference;
for (int dim = 1; dim <= inner_array_type.rank; dim++) {
- cdecl = new CCodeDeclaration ("int");
- cdecl.add_declarator (new CCodeVariableDeclarator.with_initializer (head.get_array_length_cname (stmt.variable_name, dim), new CCodeConstant ("-1")));
- cbody.add_statement (cdecl);
+ if (current_method != null && current_method.coroutine) {
+ closure_struct.add_field ("int", head.get_array_length_cname (stmt.variable_name, dim));
+ cbody.add_statement (new CCodeExpressionStatement (new CCodeAssignment (get_variable_cexpression (head.get_array_length_cname (stmt.variable_name, dim)), new CCodeConstant ("-1"))));
+ } else {
+ var cdecl = new CCodeDeclaration ("int");
+ cdecl.add_declarator (new CCodeVariableDeclarator.with_initializer (head.get_array_length_cname (stmt.variable_name, dim), new CCodeConstant ("-1")));
+ cbody.add_statement (cdecl);
+ }
}
}
var it_name = (stmt.variable_name + "_it");
- var citdecl = new CCodeDeclaration ("int");
- citdecl.add_declarator (new CCodeVariableDeclarator (it_name));
- cblock.add_statement (citdecl);
+ if (current_method != null && current_method.coroutine) {
+ closure_struct.add_field ("int", it_name);
+ } else {
+ var citdecl = new CCodeDeclaration ("int");
+ citdecl.add_declarator (new CCodeVariableDeclarator (it_name));
+ cblock.add_statement (citdecl);
+ }
var cbody = new CCodeBlock ();
- CCodeExpression element_expr = new CCodeElementAccess (new CCodeIdentifier (collection_backup.name), new CCodeIdentifier (it_name));
+ CCodeExpression element_expr = new CCodeElementAccess (get_variable_cexpression (collection_backup.name), get_variable_cexpression (it_name));
var element_type = array_type.element_type.copy ();
element_type.value_owned = false;
cbody.add_statement (cfrag);
temp_vars.clear ();
- var cdecl = new CCodeDeclaration (stmt.type_reference.get_cname ());
- cdecl.add_declarator (new CCodeVariableDeclarator.with_initializer (stmt.variable_name, element_expr));
- cbody.add_statement (cdecl);
+ if (current_method != null && current_method.coroutine) {
+ closure_struct.add_field (stmt.type_reference.get_cname (), stmt.variable_name);
+ cbody.add_statement (new CCodeExpressionStatement (new CCodeAssignment (get_variable_cexpression (stmt.variable_name), element_expr)));
+ } else {
+ var cdecl = new CCodeDeclaration (stmt.type_reference.get_cname ());
+ cdecl.add_declarator (new CCodeVariableDeclarator.with_initializer (stmt.variable_name, element_expr));
+ cbody.add_statement (cdecl);
+ }
// add array length variable for stacked arrays
if (stmt.type_reference is ArrayType) {
var inner_array_type = (ArrayType) stmt.type_reference;
for (int dim = 1; dim <= inner_array_type.rank; dim++) {
- cdecl = new CCodeDeclaration ("int");
- cdecl.add_declarator (new CCodeVariableDeclarator.with_initializer (head.get_array_length_cname (stmt.variable_name, dim), new CCodeConstant ("-1")));
- cbody.add_statement (cdecl);
+ if (current_method != null && current_method.coroutine) {
+ closure_struct.add_field ("int", head.get_array_length_cname (stmt.variable_name, dim));
+ cbody.add_statement (new CCodeExpressionStatement (new CCodeAssignment (get_variable_cexpression (head.get_array_length_cname (stmt.variable_name, dim)), new CCodeConstant ("-1"))));
+ } else {
+ var cdecl = new CCodeDeclaration ("int");
+ cdecl.add_declarator (new CCodeVariableDeclarator.with_initializer (head.get_array_length_cname (stmt.variable_name, dim), new CCodeConstant ("-1")));
+ cbody.add_statement (cdecl);
+ }
}
}
cbody.add_statement (stmt.body.ccodenode);
var ccond_ind1 = new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, array_len, new CCodeConstant ("-1"));
- var ccond_ind2 = new CCodeBinaryExpression (CCodeBinaryOperator.LESS_THAN, new CCodeIdentifier (it_name), array_len);
+ var ccond_ind2 = new CCodeBinaryExpression (CCodeBinaryOperator.LESS_THAN, get_variable_cexpression (it_name), array_len);
var ccond_ind = new CCodeBinaryExpression (CCodeBinaryOperator.AND, ccond_ind1, ccond_ind2);
/* only check for null if the containers elements are of reference-type */
CCodeBinaryExpression ccond;
if (array_type.element_type.is_reference_type_or_type_parameter ()) {
var ccond_term1 = new CCodeBinaryExpression (CCodeBinaryOperator.EQUALITY, array_len, new CCodeConstant ("-1"));
- var ccond_term2 = new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, new CCodeElementAccess (new CCodeIdentifier (collection_backup.name), new CCodeIdentifier (it_name)), new CCodeConstant ("NULL"));
+ var ccond_term2 = new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, new CCodeElementAccess (new CCodeIdentifier (collection_backup.name), get_variable_cexpression (it_name)), new CCodeConstant ("NULL"));
var ccond_term = new CCodeBinaryExpression (CCodeBinaryOperator.AND, ccond_term1, ccond_term2);
ccond = new CCodeBinaryExpression (CCodeBinaryOperator.OR, ccond_ind, ccond_term);
}
var cfor = new CCodeForStatement (ccond, cbody);
- cfor.add_initializer (new CCodeAssignment (new CCodeIdentifier (it_name), new CCodeConstant ("0")));
- cfor.add_iterator (new CCodeAssignment (new CCodeIdentifier (it_name), new CCodeBinaryExpression (CCodeBinaryOperator.PLUS, new CCodeIdentifier (it_name), new CCodeConstant ("1"))));
+ cfor.add_initializer (new CCodeAssignment (get_variable_cexpression (it_name), new CCodeConstant ("0")));
+ cfor.add_iterator (new CCodeAssignment (get_variable_cexpression (it_name), new CCodeBinaryExpression (CCodeBinaryOperator.PLUS, get_variable_cexpression (it_name), new CCodeConstant ("1"))));
cblock.add_statement (cfor);
}
} else if (stmt.collection.value_type.compatible (new ObjectType (glist_type)) || stmt.collection.value_type.compatible (new ObjectType (gslist_type))) {
var it_name = "%s_it".printf (stmt.variable_name);
- var citdecl = new CCodeDeclaration (collection_type.get_cname ());
- var citvardecl = new CCodeVariableDeclarator (it_name);
- citvardecl.line = cblock.line;
- citdecl.add_declarator (citvardecl);
- cblock.add_statement (citdecl);
+ if (current_method != null && current_method.coroutine) {
+ closure_struct.add_field (collection_type.get_cname (), it_name);
+ } else {
+ var citdecl = new CCodeDeclaration (collection_type.get_cname ());
+ var citvardecl = new CCodeVariableDeclarator (it_name);
+ citvardecl.line = cblock.line;
+ citdecl.add_declarator (citvardecl);
+ cblock.add_statement (citdecl);
+ }
var cbody = new CCodeBlock ();
- CCodeExpression element_expr = new CCodeMemberAccess.pointer (new CCodeIdentifier (it_name), "data");
+ CCodeExpression element_expr = new CCodeMemberAccess.pointer (get_variable_cexpression (it_name), "data");
if (collection_type.get_type_arguments ().size != 1) {
Report.error (stmt.source_reference, "internal error: missing generic type argument");
cbody.add_statement (cfrag);
temp_vars.clear ();
- var cdecl = new CCodeDeclaration (stmt.type_reference.get_cname ());
- var cvardecl = new CCodeVariableDeclarator.with_initializer (stmt.variable_name, element_expr);
- cvardecl.line = cblock.line;
- cdecl.add_declarator (cvardecl);
- cbody.add_statement (cdecl);
+ if (current_method != null && current_method.coroutine) {
+ closure_struct.add_field (stmt.type_reference.get_cname (), stmt.variable_name);
+ cbody.add_statement (new CCodeExpressionStatement (new CCodeAssignment (get_variable_cexpression (stmt.variable_name), element_expr)));
+ } else {
+ var cdecl = new CCodeDeclaration (stmt.type_reference.get_cname ());
+ var cvardecl = new CCodeVariableDeclarator.with_initializer (stmt.variable_name, element_expr);
+ cvardecl.line = cblock.line;
+ cdecl.add_declarator (cvardecl);
+ cbody.add_statement (cdecl);
+ }
cbody.add_statement (stmt.body.ccodenode);
- var ccond = new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, new CCodeIdentifier (it_name), new CCodeConstant ("NULL"));
+ var ccond = new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, get_variable_cexpression (it_name), new CCodeConstant ("NULL"));
var cfor = new CCodeForStatement (ccond, cbody);
- cfor.add_initializer (new CCodeAssignment (new CCodeIdentifier (it_name), new CCodeIdentifier (collection_backup.name)));
+ cfor.add_initializer (new CCodeAssignment (get_variable_cexpression (it_name), get_variable_cexpression (collection_backup.name)));
- cfor.add_iterator (new CCodeAssignment (new CCodeIdentifier (it_name), new CCodeMemberAccess.pointer (new CCodeIdentifier (it_name), "next")));
+ cfor.add_iterator (new CCodeAssignment (get_variable_cexpression (it_name), new CCodeMemberAccess.pointer (get_variable_cexpression (it_name), "next")));
cblock.add_statement (cfor);
}
if (requires_destroy (local.variable_type)) {
var ma = new MemberAccess.simple (local.name);
ma.symbol_reference = local;
- var cunref = new CCodeExpressionStatement (get_unref_expression (new CCodeIdentifier (get_variable_cname (local.name)), local.variable_type, ma));
+ var cunref = new CCodeExpressionStatement (get_unref_expression (get_variable_cexpression (local.name), local.variable_type, ma));
cunref.line = cblock.line;
cblock.add_statement (cunref);
}