From: Juerg Billeter Date: Sat, 19 Apr 2008 21:17:47 +0000 (+0000) Subject: support virtual methods in interfaces, fixes bug 443525 X-Git-Tag: VALA_0_3_1~27 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d86047af615386fdc83e680be2af75faf015c02c;p=platform%2Fupstream%2Fvala.git support virtual methods in interfaces, fixes bug 443525 2008-04-19 Juerg Billeter * vala/valasemanticanalyzer.vala, gobject/valaccodeinterfacebinding.vala: support virtual methods in interfaces, fixes bug 443525 svn path=/trunk/; revision=1275 --- diff --git a/ChangeLog b/ChangeLog index b3e6ce4..ffc8f76 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2008-04-19 Jürg Billeter + * vala/valasemanticanalyzer.vala, + gobject/valaccodeinterfacebinding.vala: support virtual methods + in interfaces, fixes bug 443525 + +2008-04-19 Jürg Billeter + * vala/valaattributeprocessor.vala, vala/valaerrortype.vala, vapi/dbus-glib-1.vapi, gobject/valaccodegenerator.vala: get D-Bus sample working again diff --git a/gobject/valaccodeinterfacebinding.vala b/gobject/valaccodeinterfacebinding.vala index c4009cc..bde841e 100644 --- a/gobject/valaccodeinterfacebinding.vala +++ b/gobject/valaccodeinterfacebinding.vala @@ -131,7 +131,16 @@ public class Vala.CCodeInterfaceBinding : CCodeTypesymbolBinding { 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); } } diff --git a/vala/valasemanticanalyzer.vala b/vala/valasemanticanalyzer.vala index 27616ea..3cd8517 100644 --- a/vala/valasemanticanalyzer.vala +++ b/vala/valasemanticanalyzer.vala @@ -367,9 +367,9 @@ public class Vala.SemanticAnalyzer : CodeVisitor { 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 @@ public class Vala.SemanticAnalyzer : CodeVisitor { 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;