vala r1622 - in trunk: . gobject tests



Author: juergbi
Date: Sat Jun 21 14:34:56 2008
New Revision: 1622
URL: http://svn.gnome.org/viewvc/vala?rev=1622&view=rev

Log:
2008-06-21  Jared Moore  <jaredm svn gnome org>

	* gobject/valaccodeclassbinding.vala:

	Initialize class fields in class init function

	* gobject/valaccodegenerator.vala:
	* gobject/valaccodememberaccessbinding.vala:

	Fix class field access, fixes bug 530039

	* tests/classes-fields.exp:
	* tests/classes-fields.vala

	Test class field access


Modified:
   trunk/ChangeLog
   trunk/gobject/valaccodeclassbinding.vala
   trunk/gobject/valaccodegenerator.vala
   trunk/gobject/valaccodememberaccessbinding.vala
   trunk/tests/classes-fields.exp
   trunk/tests/classes-fields.vala

Modified: trunk/gobject/valaccodeclassbinding.vala
==============================================================================
--- trunk/gobject/valaccodeclassbinding.vala	(original)
+++ trunk/gobject/valaccodeclassbinding.vala	Sat Jun 21 14:34:56 2008
@@ -424,6 +424,19 @@
 				codegen.instance_priv_struct.add_field ("GDestroyNotify", func_name);
 			}
 
+			/* initialize class fields */
+			var fields = cl.get_fields ();
+			foreach (Field field in fields) {
+				if (field.binding != MemberBinding.CLASS || field.initializer == null) {
+					continue;
+				}
+				CCodeExpression left = new CCodeMemberAccess (new CCodeIdentifier ("klass"),
+				                                              field.get_cname (), true);
+				CCodeExpression right = (CCodeExpression)field.initializer.ccodenode;
+				CCodeAssignment assign = new CCodeAssignment (left, right);
+				init_block.add_statement (new CCodeExpressionStatement (assign));
+			}
+
 			/* create properties */
 			var props = cl.get_properties ();
 			foreach (Property prop in props) {

Modified: trunk/gobject/valaccodegenerator.vala
==============================================================================
--- trunk/gobject/valaccodegenerator.vala	(original)
+++ trunk/gobject/valaccodegenerator.vala	Sat Jun 21 14:34:56 2008
@@ -82,6 +82,7 @@
 	private int next_try_id = 0;
 	public bool in_creation_method = false;
 	private bool in_constructor = false;
+	public bool in_static_or_class_ctor = false;
 	public bool current_method_inner_error = false;
 
 	public DataType bool_type;
@@ -949,7 +950,11 @@
 		current_method_inner_error = false;
 		in_constructor = true;
 
+		if (c.binding == MemberBinding.CLASS || c.binding == MemberBinding.STATIC) {
+			in_static_or_class_ctor = true;
+		}
 		c.accept_children (this);
+		in_static_or_class_ctor = false;
 
 		in_constructor = false;
 

Modified: trunk/gobject/valaccodememberaccessbinding.vala
==============================================================================
--- trunk/gobject/valaccodememberaccessbinding.vala	(original)
+++ trunk/gobject/valaccodememberaccessbinding.vala	Sat Jun 21 14:34:56 2008
@@ -102,7 +102,25 @@
 			} else if (f.binding == MemberBinding.CLASS) {
 				var cl = (Class) f.parent_symbol;
 				var cast = new CCodeFunctionCall (new CCodeIdentifier (cl.get_upper_case_cname (null) + "_CLASS"));
-				cast.add_argument (new CCodeIdentifier ("klass"));
+
+				CCodeExpression klass;
+				if (expr.inner == null) {
+					if (codegen.in_static_or_class_ctor) {
+						// Accessing the field from a static or class constructor
+						klass = new CCodeIdentifier ("klass");
+					} else {
+						// Accessing the field from within an instance method
+						var k = new CCodeFunctionCall (new CCodeIdentifier ("G_OBJECT_GET_CLASS"));
+						k.add_argument (new CCodeIdentifier ("self"));
+						klass = k;
+					}
+				} else {
+					// Accessing the field of an instance
+					var k = new CCodeFunctionCall (new CCodeIdentifier ("G_OBJECT_GET_CLASS"));
+					k.add_argument ((CCodeExpression) expr.inner.ccodenode);
+					klass = k;
+				}
+				cast.add_argument (klass);
 				expr.ccodenode = new CCodeMemberAccess.pointer (cast, f.get_cname ());
 			} else {
 				expr.ccodenode = new CCodeIdentifier (f.get_cname ());

Modified: trunk/tests/classes-fields.exp
==============================================================================
--- trunk/tests/classes-fields.exp	(original)
+++ trunk/tests/classes-fields.exp	Sat Jun 21 14:34:56 2008
@@ -1 +1 @@
-Field Test: 1 2 3 4 5 6 7 8 9 10 11 12
+Field Test: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

Modified: trunk/tests/classes-fields.vala
==============================================================================
--- trunk/tests/classes-fields.vala	(original)
+++ trunk/tests/classes-fields.vala	Sat Jun 21 14:34:56 2008
@@ -2,6 +2,7 @@
 
 class Maman.Foo : Object {
 	public int public_base_field = 2;
+	public class int public_class_field = 23;
 }
 
 class Maman.Bar : Foo {
@@ -9,19 +10,30 @@
 	private int private_field = 4;
 	private static int private_static_field = 5;
 	public static int public_static_field = 6;
-	public class int public_class_field = 7;
-	private class int private_class_field = 8;
+	private class int private_class_field; 
+	public class int public_class_field;
+
+	class construct {
+		private_class_field = 7;
+	}
+	static construct {
+		public_class_field = 8;
+	}
 	
 	void do_action () {
-		stdout.printf (" %d %d %d %d %d", public_base_field, public_field,
-		               private_field, private_static_field, public_static_field);
-		public_base_field = 7;
-		public_field = 8;
-		private_field = 9;
-		private_static_field = 10;
-		public_static_field = 11;
-		stdout.printf (" %d %d %d %d %d", public_base_field, public_field,
-		               private_field, private_static_field, public_static_field);
+		stdout.printf (" %d %d %d %d %d %d %d", public_base_field, public_field,
+		               private_field, private_static_field, public_static_field, 
+					   private_class_field, public_class_field);
+		public_base_field = 9;
+		public_field = 10;
+		private_field = 11;
+		private_static_field = 12;
+		public_static_field = 13;
+		private_class_field = 14;
+		public_class_field = 15;
+		stdout.printf (" %d %d %d %d %d %d %d", public_base_field, public_field,
+		               private_field, private_static_field, public_static_field, 
+					   private_class_field, public_class_field);
 	}
 
 	static int main (string[] args) {
@@ -29,8 +41,21 @@
 		
 		var bar = new Bar ();
 		bar.do_action ();
-		
-		stdout.printf (" 12\n");
+
+		bar.public_base_field = 16;
+		bar.public_field = 17;
+		bar.private_field = 18;
+		bar.private_static_field = 19;
+		bar.public_static_field = 20;
+		bar.private_class_field = 21;
+		((Foo)bar).public_class_field = 22;
+		stdout.printf (" %d %d %d %d %d %d %d", bar.public_base_field, bar.public_field,
+		               bar.private_field, bar.private_static_field, bar.public_static_field, 
+					   bar.private_class_field, ((Foo)bar).public_class_field);
+
+		var foo = new Foo ();
+		stdout.printf (" %d", foo.public_class_field);
+		stdout.printf (" 24\n");
 		
 		return 0;
 	}



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