diff --git a/ChangeLog b/ChangeLog index 7cfdd78..bc859a5 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,13 @@ 2007-08-16 Mathias Hasselmann + * gobject/valacodegeneratorinvocationexpression.vala, + vala/valainterfacewriter.vala, vala/valamethod.vala, + vapigen/valagidlparser.vala: consider sentinel information + * vapi/packages/gtk+-2.0/gtk+-2.0.metadata: provide sentinel + information for functions with variable length argument lists + +2007-08-16 Mathias Hasselmann + * vapi/packages/gtk+-2.0/gtk+-2.0.metadata: properly inform vapigen about the ellipsis off gtk_cell_layout_set_attributes and gtk_tree_view_column_set_attributes diff --git a/gobject/valacodegeneratorinvocationexpression.vala b/gobject/valacodegeneratorinvocationexpression.vala index 888f794..96699ab 100644 --- a/gobject/valacodegeneratorinvocationexpression.vala +++ b/gobject/valacodegeneratorinvocationexpression.vala @@ -322,7 +322,7 @@ public class Vala.CodeGenerator { /* ensure variable argument list ends with NULL * except when using printf-style arguments */ if ((m == null || !m.printf_format) && !(m is DBusMethod)) { - ccall.add_argument (new CCodeConstant ("NULL")); + ccall.add_argument (new CCodeConstant (m.sentinel)); } } diff --git a/vala/valainterfacewriter.vala b/vala/valainterfacewriter.vala index 06ea9f0..fc976fc 100644 --- a/vala/valainterfacewriter.vala +++ b/vala/valainterfacewriter.vala @@ -460,9 +460,22 @@ public class Vala.InterfaceWriter : CodeVisitor { write_indent (); write_string ("[InstanceByReference]"); } + + var ccode_params = new String (); + var separator = ""; + if (m.get_cname () != m.get_default_cname ()) { + ccode_params.append_printf ("%scname = \"%s\"", separator, m.get_cname ()); + separator = ", "; + } + if (m.sentinel != m.DEFAULT_SENTINEL) { + ccode_params.append_printf ("%ssentinel = \"%s\"", separator, m.sentinel); + separator = ", "; + } + + if (ccode_params.len > 0) { write_indent (); - write_string ("[CCode (cname = \"%s\")]".printf (m.get_cname ())); + write_string ("[CCode (%s)]".printf (ccode_params.str)); } write_indent (); diff --git a/vala/valamethod.vala b/vala/valamethod.vala index 2c3ca73..2163d05 100644 --- a/vala/valamethod.vala +++ b/vala/valamethod.vala @@ -28,6 +28,8 @@ using Gee; * Represents a type or namespace method. */ public class Vala.Method : Member, Invokable { + public const string DEFAULT_SENTINEL = "0"; + /** * The return type of this method. */ @@ -71,6 +73,22 @@ public class Vala.Method : Member, Invokable { } } + /** + * The sentinel to use for terminating variable length argument lists. + */ + public string! sentinel { + get { + if (_sentinel == null) { + return DEFAULT_SENTINEL; + } + + return _sentinel; + } + + set { + _sentinel = value; + } + } /** * Specifies whether this method is abstract. Abstract methods have no @@ -152,6 +170,7 @@ public class Vala.Method : Member, Invokable { private Gee.List parameters = new ArrayList (); private string cname; private string _vfunc_name; + private string _sentinel; private bool _no_array_length; private Gee.List error_domains = new ArrayList (); @@ -278,6 +297,9 @@ public class Vala.Method : Member, Invokable { if (a.has_argument ("vfunc_name")) { this.vfunc_name = a.get_string ("vfunc_name"); } + if (a.has_argument ("sentinel")) { + this.sentinel = a.get_string ("sentinel"); + } } /** diff --git a/vapi/gtk+-2.0.vala b/vapi/gtk+-2.0.vala index 7b2a9ea..33504a2 100644 --- a/vapi/gtk+-2.0.vala +++ b/vapi/gtk+-2.0.vala @@ -1803,6 +1803,7 @@ namespace Gtk { public Dialog (); public Dialog.with_buttons (string title, Gtk.Window parent, Gtk.DialogFlags flags, ...); public int run (); + [CCode (sentinel = "-1")] public void set_alternative_button_order (...); public void set_alternative_button_order_from_array (int n_params, int new_order); public void set_default_response (int response_id); @@ -2536,6 +2537,7 @@ namespace Gtk { public void insert (out Gtk.TreeIter iter, int position); public void insert_after (out Gtk.TreeIter iter, out Gtk.TreeIter sibling); public void insert_before (out Gtk.TreeIter iter, out Gtk.TreeIter sibling); + [CCode (sentinel = "-1")] public void insert_with_values (out Gtk.TreeIter iter, int position, ...); [NoArrayLength] public void insert_with_valuesv (out Gtk.TreeIter iter, int position, int columns, GLib.Value[] values, int n_values); @@ -2548,9 +2550,9 @@ namespace Gtk { public void prepend (out Gtk.TreeIter iter); public bool remove (out Gtk.TreeIter iter); public void reorder (int new_order); + [CCode (sentinel = "-1")] public void set (out Gtk.TreeIter iter, ...); - [NoArrayLength] - public void set_column_types (int n_types, GLib.Type[] types); + public void set_column_types (int n_columns, GLib.Type types); public void set_valist (out Gtk.TreeIter iter, pointer var_args); public void set_value (out Gtk.TreeIter iter, int column, GLib.Value value); [NoArrayLength] @@ -4214,6 +4216,7 @@ namespace Gtk { public void insert (out Gtk.TreeIter iter, out Gtk.TreeIter parent, int position); public void insert_after (out Gtk.TreeIter iter, out Gtk.TreeIter parent, out Gtk.TreeIter sibling); public void insert_before (out Gtk.TreeIter iter, out Gtk.TreeIter parent, out Gtk.TreeIter sibling); + [CCode (sentinel = "-1")] public void insert_with_values (out Gtk.TreeIter iter, out Gtk.TreeIter parent, int position, ...); [NoArrayLength] public void insert_with_valuesv (out Gtk.TreeIter iter, out Gtk.TreeIter parent, int position, int columns, GLib.Value[] values, int n_values); @@ -4228,9 +4231,9 @@ namespace Gtk { public void prepend (out Gtk.TreeIter iter, out Gtk.TreeIter parent); public bool remove (out Gtk.TreeIter iter); public void reorder (out Gtk.TreeIter parent, int new_order); + [CCode (sentinel = "-1")] public void set (out Gtk.TreeIter iter, ...); - [NoArrayLength] - public void set_column_types (int n_types, GLib.Type[] types); + public void set_column_types (int n_columns, GLib.Type types); public void set_valist (out Gtk.TreeIter iter, pointer var_args); public void set_value (out Gtk.TreeIter iter, int column, GLib.Value value); [NoArrayLength] @@ -4532,14 +4535,6 @@ namespace Gtk { public Gtk.Requisition requisition; public Gtk.Allocation allocation; public weak Gdk.Window window; - - [CCode (cname = "GTK_WIDGET_SET_FLAGS")] - public void set_flags (WidgetFlags flags); - [CCode (cname = "GTK_WIDGET_UNSET_FLAGS")] - public void unset_flags (WidgetFlags flags); - [CCode (cname = "GTK_WIDGET_FLAGS")] - public WidgetFlags get_flags (); - public bool activate (); public void add_accelerator (string accel_signal, Gtk.AccelGroup accel_group, uint accel_key, Gdk.ModifierType accel_mods, Gtk.AccelFlags accel_flags); public void add_events (int events); @@ -5098,6 +5093,7 @@ namespace Gtk { [CCode (cheader_filename = "gtk/gtk.h")] public interface TreeModel { public void @foreach (Gtk.TreeModelForeachFunc func, pointer user_data); + [CCode (sentinel = "-1")] public void get (out Gtk.TreeIter iter, ...); public abstract GLib.Type get_column_type (int index_); public abstract Gtk.TreeModelFlags get_flags (); @@ -5954,6 +5950,7 @@ namespace Gtk { public bool is_descendant (Gtk.TreePath ancestor); public TreePath (); public TreePath.first (); + [CCode (sentinel = "-1")] public TreePath.from_indices (...); public TreePath.from_string (string path); public void next (); diff --git a/vapi/packages/gtk+-2.0/gtk+-2.0.metadata b/vapi/packages/gtk+-2.0/gtk+-2.0.metadata index d37d3cb..6c761fa 100644 --- a/vapi/packages/gtk+-2.0/gtk+-2.0.metadata +++ b/vapi/packages/gtk+-2.0/gtk+-2.0.metadata @@ -20,6 +20,7 @@ GtkContainer::add has_emitter="1" GtkContainer::check_resize has_emitter="1" GtkContainer::remove has_emitter="1" GtkContainer::set_focus_child has_emitter="1" +gtk_dialog_set_alternative_button_order sentinel="-1" GtkDialog::response has_emitter="1" GtkEditable::delete_text has_emitter="1" GtkEditable::insert_text has_emitter="1" @@ -32,8 +33,8 @@ GtkItem::deselect has_emitter="1" GtkItem::select has_emitter="1" GtkItem::toggle has_emitter="1" gtk_list_store_new ellipsis="1" -gtk_list_store_insert_with_values ellipsis="1" -gtk_list_store_set ellipsis="1" +gtk_list_store_insert_with_values ellipsis="1" sentinel="-1" +gtk_list_store_set ellipsis="1" sentinel="-1" GtkMenuItem::activate has_emitter="1" GtkMenuItem::toggle_size_allocate has_emitter="1" GtkMenuItem::toggle_size_request has_emitter="1" @@ -61,7 +62,7 @@ GtkToggleActionEntry is_value_type="1" GtkToggleButton::toggled has_emitter="1" GtkToolItem::set_tooltip has_emitter="1" GtkTreeIter is_value_type="1" -gtk_tree_model_get ellipsis="1" +gtk_tree_model_get ellipsis="1" sentinel="-1" gtk_tree_model_get_path transfer_ownership="1" gtk_tree_model_get_string_from_iter transfer_ownership="1" GtkTreeModel::row_changed has_emitter="1" @@ -69,10 +70,11 @@ GtkTreeModel::row_deleted has_emitter="1" GtkTreeModel::row_has_child_toggled has_emitter="1" GtkTreeModel::row_inserted has_emitter="1" GtkTreeModel::rows_reordered has_emitter="1" +gtk_tree_path_new_from_indices sentinel="-1" GtkTreePath is_value_type="0" gtk_tree_store_new ellipsis="1" -gtk_tree_store_insert_with_values ellipsis="1" -gtk_tree_store_set ellipsis="1" +gtk_tree_store_insert_with_values ellipsis="1" sentinel="-1" +gtk_tree_store_set ellipsis="1" sentinel="-1" GtkTreeSortable::sort_column_changed has_emitter="1" gtk_tree_view_insert_column_with_attributes ellipsis="1" GtkTreeView::row_activated has_emitter="1" diff --git a/vapigen/valagidlparser.vala b/vapigen/valagidlparser.vala index c7785be..4ee58a3 100644 --- a/vapigen/valagidlparser.vala +++ b/vapigen/valagidlparser.vala @@ -799,6 +799,8 @@ public class Vala.GIdlParser : CodeVisitor { if (eval (nv[1]) == "1") { return_type.transfers_ownership = true; } + } else if (nv[0] == "sentinel") { + m.sentinel = eval (nv[1]); } } }