vala r1628 - in trunk: . gobject vala



Author: juergbi
Date: Sun Jun 22 19:04:49 2008
New Revision: 1628
URL: http://svn.gnome.org/viewvc/vala?rev=1628&view=rev

Log:
2008-06-22  JÃrg Billeter  <j bitron ch>

	* vala/valasemanticanalyzer.vala:
	* gobject/valaccodeinvocationexpressionbinding.vala:

	Fix pointer member access to value types, fixes bug 539337


Modified:
   trunk/ChangeLog
   trunk/gobject/valaccodeinvocationexpressionbinding.vala
   trunk/vala/valasemanticanalyzer.vala

Modified: trunk/gobject/valaccodeinvocationexpressionbinding.vala
==============================================================================
--- trunk/gobject/valaccodeinvocationexpressionbinding.vala	(original)
+++ trunk/gobject/valaccodeinvocationexpressionbinding.vala	Sun Jun 22 19:04:49 2008
@@ -75,11 +75,10 @@
 		CCodeExpression instance;
 		if (m != null && m.binding == MemberBinding.INSTANCE) {
 			instance = (CCodeExpression) ma.inner.ccodenode;
-			var instance_expression_type = ma.inner.value_type;
 
-			if (instance_expression_type.data_type is Struct
-			    && !((Struct) instance_expression_type.data_type).is_simple_type ()
-			    && instance_expression_type.data_type != codegen.current_type_symbol) {
+			var st = m.parent_symbol as Struct;
+			if (st != null && !st.is_simple_type ()) {
+				// we need to pass struct instance by reference
 				var unary = instance as CCodeUnaryExpression;
 				if (unary != null && unary.operator == CCodeUnaryOperator.POINTER_INDIRECTION) {
 					// *expr => expr
@@ -91,7 +90,7 @@
 					// (tmp = expr, &tmp)
 					var ccomma = new CCodeCommaExpression ();
 
-					var temp_var = codegen.get_temp_variable (instance_expression_type);
+					var temp_var = codegen.get_temp_variable (ma.inner.target_type);
 					codegen.temp_vars.insert (0, temp_var);
 					ccomma.append_expression (new CCodeAssignment (new CCodeIdentifier (temp_var.name), instance));
 					ccomma.append_expression (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (temp_var.name)));

Modified: trunk/vala/valasemanticanalyzer.vala
==============================================================================
--- trunk/vala/valasemanticanalyzer.vala	(original)
+++ trunk/vala/valasemanticanalyzer.vala	Sun Jun 22 19:04:49 2008
@@ -1599,6 +1599,16 @@
 				return;
 			}
 
+			if (expr.pointer_member_access) {
+				var pointer_type = expr.inner.value_type as PointerType;
+				if (pointer_type != null && pointer_type.base_type is ValueType) {
+					// transform foo->bar to (*foo).bar
+					expr.inner = new PointerIndirection (expr.inner, expr.source_reference);
+					expr.inner.accept (this);
+					expr.pointer_member_access = false;
+				}
+			}
+
 			if (expr.inner is MemberAccess) {
 				var ma = (MemberAccess) expr.inner;
 				if (ma.prototype_access) {



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