vala r2188 - in trunk: . gobject vala



Author: juergbi
Date: Tue Dec 16 21:19:10 2008
New Revision: 2188
URL: http://svn.gnome.org/viewvc/vala?rev=2188&view=rev

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

	* vala/valaclass.vala:
	* vala/valaparser.vala:
	* gobject/valaclassregisterfunction.vala:
	* gobject/valagobjectmodule.vala:

	Add support for class destructors, patch by Sebastian DrÃge,
	fixes bug 564011


Modified:
   trunk/ChangeLog
   trunk/gobject/valaclassregisterfunction.vala
   trunk/gobject/valagobjectmodule.vala
   trunk/vala/valaclass.vala
   trunk/vala/valaparser.vala

Modified: trunk/gobject/valaclassregisterfunction.vala
==============================================================================
--- trunk/gobject/valaclassregisterfunction.vala	(original)
+++ trunk/gobject/valaclassregisterfunction.vala	Tue Dec 16 21:19:10 2008
@@ -59,7 +59,7 @@
 	}
 
 	public override string get_base_finalize_func_name () {
-		if (class_reference.has_class_private_fields) {
+		if (class_reference.class_destructor != null || class_reference.has_class_private_fields) {
 			return "%s_base_finalize".printf (class_reference.get_lower_case_cname (null));
 		} else {
 			return "NULL";

Modified: trunk/gobject/valagobjectmodule.vala
==============================================================================
--- trunk/gobject/valagobjectmodule.vala	(original)
+++ trunk/gobject/valagobjectmodule.vala	Tue Dec 16 21:19:10 2008
@@ -207,7 +207,7 @@
 			}
 			add_class_init_function (cl);
 
-			if (cl.has_class_private_fields) {
+			if (cl.class_destructor != null || cl.has_class_private_fields) {
 				add_base_finalize_function (cl);
 			}
 
@@ -1166,6 +1166,10 @@
 		
 		var cblock = new CCodeBlock ();
 
+		if (cl.class_destructor != null) {
+			cblock.add_statement (cl.class_destructor.ccodenode);
+		}
+
 		cblock.add_statement (base_finalize_fragment);
 
 		function.block = cblock;

Modified: trunk/vala/valaclass.vala
==============================================================================
--- trunk/vala/valaclass.vala	(original)
+++ trunk/vala/valaclass.vala	Tue Dec 16 21:19:10 2008
@@ -190,6 +190,11 @@
 			}
 		}
 	}
+	
+	/**
+	 * Specifies the class destructor.
+	 */
+	public Destructor class_destructor { get; set; }
 
 	/**
 	 * Specifies whether this class denotes an error base.
@@ -462,6 +467,10 @@
 		if (destructor != null) {
 			destructor.accept (visitor);
 		}
+
+		if (class_destructor != null) {
+			class_destructor.accept (visitor);
+		}
 		
 		foreach (Class cl in classes) {
 			cl.accept (visitor);
@@ -907,6 +916,10 @@
 			destructor.check (analyzer);
 		}
 		
+		if (class_destructor != null) {
+			class_destructor.check (analyzer);
+		}
+		
 		foreach (Class cl in classes) {
 			cl.check (analyzer);
 		}

Modified: trunk/vala/valaparser.vala
==============================================================================
--- trunk/vala/valaparser.vala	(original)
+++ trunk/vala/valaparser.vala	Tue Dec 16 21:19:10 2008
@@ -2002,7 +2002,14 @@
 				cl.static_constructor = c;
 			}
 		} else if (sym is Destructor) {
-			cl.destructor = (Destructor) sym;
+			var d = (Destructor) sym;
+			if (d.binding == MemberBinding.STATIC) {
+				Report.error (sym.source_reference, "static destructors not supported yet");
+			} else if (d.binding == MemberBinding.CLASS) {
+				cl.class_destructor = (Destructor) d;
+			} else {
+				cl.destructor = (Destructor) d;
+			}
 		} else {
 			Report.error (sym.source_reference, "unexpected declaration in class");
 		}
@@ -2319,11 +2326,17 @@
 
 	Destructor parse_destructor_declaration (Gee.List<Attribute>? attrs) throws ParseError {
 		var begin = get_location ();
+		var flags = parse_member_declaration_modifiers ();
 		expect (TokenType.TILDE);
 		parse_identifier ();
 		expect (TokenType.OPEN_PARENS);
 		expect (TokenType.CLOSE_PARENS);
 		var d = new Destructor (get_src_com (begin));
+		if (ModifierFlags.STATIC in flags) {
+			d.binding = MemberBinding.STATIC;
+		} else if (ModifierFlags.CLASS in flags) {
+			d.binding = MemberBinding.CLASS;
+		}
 		d.body = parse_block ();
 		return d;
 	}



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