vala r2232 - in trunk: . gobject



Author: juergbi
Date: Fri Dec 19 23:07:24 2008
New Revision: 2232
URL: http://svn.gnome.org/viewvc/vala?rev=2232&view=rev

Log:
2008-12-20  JÃrg Billeter  <j bitron ch>

	* gobject/valaccodeassignmentmodule.vala:
	* gobject/valaccodebasemodule.vala:
	* gobject/valaccodecontrolflowmodule.vala:
	* gobject/valaccodemethodcallmodule.vala:
	* gobject/valagasyncmodule.vala:
	* gobject/valagerrormodule.vala:

	More closure fixes


Modified:
   trunk/ChangeLog
   trunk/gobject/valaccodeassignmentmodule.vala
   trunk/gobject/valaccodebasemodule.vala
   trunk/gobject/valaccodecontrolflowmodule.vala
   trunk/gobject/valaccodemethodcallmodule.vala
   trunk/gobject/valagasyncmodule.vala
   trunk/gobject/valagerrormodule.vala

Modified: trunk/gobject/valaccodeassignmentmodule.vala
==============================================================================
--- trunk/gobject/valaccodeassignmentmodule.vala	(original)
+++ trunk/gobject/valaccodeassignmentmodule.vala	Fri Dec 19 23:07:24 2008
@@ -155,7 +155,7 @@
 			
 			var temp_decl = get_temp_variable (assignment.left.value_type);
 			temp_vars.insert (0, temp_decl);
-			ccomma.append_expression (new CCodeAssignment (new CCodeIdentifier (temp_decl.name), rhs));
+			ccomma.append_expression (new CCodeAssignment (get_variable_cexpression (temp_decl.name), rhs));
 			if (unref_old) {
 				/* unref old value */
 				ccomma.append_expression (get_unref_expression ((CCodeExpression) get_ccodenode (assignment.left), assignment.left.value_type, assignment.left));
@@ -174,7 +174,7 @@
 				ccomma.append_expression (new CCodeAssignment (lhs_delegate_target, rhs_delegate_target));
 			}
 			
-			ccomma.append_expression (new CCodeIdentifier (temp_decl.name));
+			ccomma.append_expression (get_variable_cexpression (temp_decl.name));
 			
 			rhs = ccomma;
 		}
@@ -213,10 +213,10 @@
 				temp_vars.insert (0, index_temp_decl);
 				
 				var ccomma = new CCodeCommaExpression ();
-				ccomma.append_expression (new CCodeAssignment (new CCodeIdentifier (index_temp_decl.name), cea.index));
+				ccomma.append_expression (new CCodeAssignment (get_variable_cexpression (index_temp_decl.name), cea.index));
 				ccomma.append_expression (codenode);
 
-				cea.index = new CCodeIdentifier (index_temp_decl.name);
+				cea.index = get_variable_cexpression (index_temp_decl.name);
 				
 				codenode = ccomma;
 			}

Modified: trunk/gobject/valaccodebasemodule.vala
==============================================================================
--- trunk/gobject/valaccodebasemodule.vala	(original)
+++ trunk/gobject/valaccodebasemodule.vala	Fri Dec 19 23:07:24 2008
@@ -1440,7 +1440,7 @@
 
 				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));
@@ -1459,7 +1459,7 @@
 
 					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);
@@ -2112,14 +2112,14 @@
 		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);
@@ -2165,7 +2165,7 @@
 				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;
 
@@ -2175,7 +2175,7 @@
 					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);
@@ -2334,11 +2334,11 @@
 			// 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);
 			
@@ -2422,7 +2422,7 @@
 			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;
@@ -2484,7 +2484,7 @@
 			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) {
@@ -2905,7 +2905,7 @@
 
 					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;
@@ -2963,7 +2963,7 @@
 
 				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 ());
@@ -3001,7 +3001,7 @@
 		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")));
@@ -3444,7 +3444,7 @@
 
 		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));

Modified: trunk/gobject/valaccodecontrolflowmodule.vala
==============================================================================
--- trunk/gobject/valaccodecontrolflowmodule.vala	(original)
+++ trunk/gobject/valaccodecontrolflowmodule.vala	Fri Dec 19 23:07:24 2008
@@ -281,11 +281,17 @@
 		
 		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
@@ -300,22 +306,31 @@
 			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;
@@ -326,17 +341,27 @@
 				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);
+						}
 					}
 				}
 
@@ -355,13 +380,17 @@
 
 				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;
@@ -372,31 +401,41 @@
 				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);
@@ -410,8 +449,8 @@
 				}
 				
 				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))) {
@@ -419,15 +458,19 @@
 
 			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");
@@ -445,21 +488,26 @@
 			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);
 		}
 
@@ -467,7 +515,7 @@
 			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);
 			}

Modified: trunk/gobject/valaccodemethodcallmodule.vala
==============================================================================
--- trunk/gobject/valaccodemethodcallmodule.vala	(original)
+++ trunk/gobject/valaccodemethodcallmodule.vala	Fri Dec 19 23:07:24 2008
@@ -106,6 +106,11 @@
 		if (m != null && m.binding == MemberBinding.INSTANCE && !(m is CreationMethod)) {
 			instance = (CCodeExpression) ma.inner.ccodenode;
 
+			if (ma.member_name == "begin" && ma.inner.symbol_reference == ma.symbol_reference) {
+				var inner_ma = (MemberAccess) ma.inner;
+				instance = (CCodeExpression) inner_ma.inner.ccodenode;
+			}
+
 			var st = m.parent_symbol as Struct;
 			if (st != null && !st.is_simple_type ()) {
 				// we need to pass struct instance by reference
@@ -445,20 +450,26 @@
 		}
 
 		// append C arguments in the right order
-		int last_pos = -1;
+		
+		int last_pos;
 		int min_pos;
-		while (true) {
-			min_pos = -1;
-			foreach (int pos in out_arg_map.get_keys ()) {
-				if (pos > last_pos && (min_pos == -1 || pos < min_pos)) {
-					min_pos = pos;
+
+		if (async_call != ccall) {
+			// don't append out arguments for .begin() calls
+			last_pos = -1;
+			while (true) {
+				min_pos = -1;
+				foreach (int pos in out_arg_map.get_keys ()) {
+					if (pos > last_pos && (min_pos == -1 || pos < min_pos)) {
+						min_pos = pos;
+					}
 				}
+				if (min_pos == -1) {
+					break;
+				}
+				ccall.add_argument (out_arg_map.get (min_pos));
+				last_pos = min_pos;
 			}
-			if (min_pos == -1) {
-				break;
-			}
-			ccall.add_argument (out_arg_map.get (min_pos));
-			last_pos = min_pos;
 		}
 
 		if (async_call != null) {

Modified: trunk/gobject/valagasyncmodule.vala
==============================================================================
--- trunk/gobject/valagasyncmodule.vala	(original)
+++ trunk/gobject/valagasyncmodule.vala	Fri Dec 19 23:07:24 2008
@@ -48,6 +48,11 @@
 		closure_struct.add_field ("gpointer", "user_data");
 		closure_struct.add_field ("GAsyncResult*", "res");
 
+		if (m.binding == MemberBinding.INSTANCE) {
+			var type_sym = (TypeSymbol) m.parent_symbol;
+			closure_struct.add_field (type_sym.get_cname () + "*", "self");
+		}
+
 		foreach (FormalParameter param in m.get_parameters ()) {
 			closure_struct.add_field (param.parameter_type.get_cname (), param.name);
 		}
@@ -80,6 +85,10 @@
 		asyncblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), "callback"), new CCodeIdentifier ("callback"))));
 		asyncblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), "user_data"), new CCodeIdentifier ("user_data"))));
 
+		if (m.binding == MemberBinding.INSTANCE) {
+			asyncblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), "self"), new CCodeIdentifier ("self"))));
+		}
+
 		foreach (FormalParameter param in m.get_parameters ()) {
 			if (param.direction != ParameterDirection.OUT) {
 				asyncblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), param.name), new CCodeIdentifier (param.name))));

Modified: trunk/gobject/valagerrormodule.vala
==============================================================================
--- trunk/gobject/valagerrormodule.vala	(original)
+++ trunk/gobject/valagerrormodule.vala	Fri Dec 19 23:07:24 2008
@@ -235,9 +235,14 @@
 			variable_name = "__err";
 		}
 
-		var cdecl = new CCodeDeclaration ("GError *");
-		cdecl.add_declarator (new CCodeVariableDeclarator.with_initializer (variable_name, get_variable_cexpression ("inner_error")));
-		cblock.add_statement (cdecl);
+		if (current_method != null && current_method.coroutine) {
+			closure_struct.add_field ("GError *", variable_name);
+			cblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (get_variable_cexpression (variable_name), get_variable_cexpression ("inner_error"))));
+		} else {
+			var cdecl = new CCodeDeclaration ("GError *");
+			cdecl.add_declarator (new CCodeVariableDeclarator.with_initializer (variable_name, get_variable_cexpression ("inner_error")));
+			cblock.add_statement (cdecl);
+		}
 		cblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (get_variable_cexpression ("inner_error"), new CCodeConstant ("NULL"))));
 
 		cblock.add_statement (clause.body.ccodenode);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]