vala r1275 - in trunk: . gobject vala



Author: juergbi
Date: Sat Apr 19 21:17:47 2008
New Revision: 1275
URL: http://svn.gnome.org/viewvc/vala?rev=1275&view=rev

Log:
2008-04-19  Juerg Billeter  <j bitron ch>

	* vala/valasemanticanalyzer.vala,
	  gobject/valaccodeinterfacebinding.vala: support virtual methods
	  in interfaces, fixes bug 443525


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

Modified: trunk/gobject/valaccodeinterfacebinding.vala
==============================================================================
--- trunk/gobject/valaccodeinterfacebinding.vala	(original)
+++ trunk/gobject/valaccodeinterfacebinding.vala	Sat Apr 19 21:17:47 2008
@@ -131,7 +131,16 @@
 		foreach (Signal sig in iface.get_signals ()) {
 			init_block.add_statement (new CCodeExpressionStatement (get_signal_creation (sig, iface)));
 		}
-		
+
+		// connect default implementations
+		foreach (Method m in iface.get_methods ()) {
+			if (m.is_virtual) {
+				var ciface = new CCodeIdentifier ("iface");
+				var cname = m.get_real_cname ();
+				base_init.block.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (ciface, m.vfunc_name), new CCodeIdentifier (cname))));
+			}
+		}
+
 		codegen.source_type_member_definition.append (base_init);
 	}
 }

Modified: trunk/vala/valasemanticanalyzer.vala
==============================================================================
--- trunk/vala/valasemanticanalyzer.vala	(original)
+++ trunk/vala/valasemanticanalyzer.vala	Sat Apr 19 21:17:47 2008
@@ -367,9 +367,9 @@
 				return;
 			}
 		} else if (m.is_virtual) {
-			if (!(m.parent_symbol is Class)) {
+			if (!(m.parent_symbol is Class) && !(m.parent_symbol is Interface)) {
 				m.error = true;
-				Report.error (m.source_reference, "Virtual methods may not be declared outside of classes");
+				Report.error (m.source_reference, "Virtual methods may not be declared outside of classes and interfaces");
 				return;
 			}
 		} else if (m.overrides) {
@@ -497,7 +497,7 @@
 				var sym = type.data_type.scope.lookup (m.name);
 				if (sym is Method) {
 					var base_method = (Method) sym;
-					if (base_method.is_abstract) {
+					if (base_method.is_abstract || base_method.is_virtual) {
 						string invalid_match;
 						if (!m.compatible (base_method, out invalid_match)) {
 							m.error = true;



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