vala r1275 - in trunk: . gobject vala
- From: juergbi svn gnome org
- To: svn-commits-list gnome org
- Subject: vala r1275 - in trunk: . gobject vala
- Date: Sat, 19 Apr 2008 22:17:48 +0100 (BST)
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]