From: Jürg Billeter Date: Wed, 21 Mar 2007 20:38:20 +0000 (+0000) Subject: default to reference type for boxed types, improve array and value-type X-Git-Tag: VALA_0_0_8~6 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1abcaae57d9dd40604dda90e67dba5013f356f77;p=thirdparty%2Fvala.git default to reference type for boxed types, improve array and value-type 2007-03-21 Jürg Billeter * vapigen/valagidlparser.vala: default to reference type for boxed types, improve array and value-type handling * packages/atk/atk.metadata, packages/gdk-2.0/gdk-2.0.metadata, packages/gtk+-2.0/gtk+-2.0.metadata, packages/pango/pango.metadata: add more value-types svn path=/trunk/; revision=257 --- diff --git a/vapigen/ChangeLog b/vapigen/ChangeLog index 1e78dbff3..c634752f7 100644 --- a/vapigen/ChangeLog +++ b/vapigen/ChangeLog @@ -1,3 +1,11 @@ +2007-03-21 Jürg Billeter + + * vapigen/valagidlparser.vala: default to reference type for boxed + types, improve array and value-type handling + * packages/atk/atk.metadata, packages/gdk-2.0/gdk-2.0.metadata, + packages/gtk+-2.0/gtk+-2.0.metadata, packages/pango/pango.metadata: + add more value-types + 2007-03-21 Jürg Billeter * vapigen/valagidlparser.vala: adapt to current Vala SVN by using weak diff --git a/vapigen/packages/atk/atk.metadata b/vapigen/packages/atk/atk.metadata index eb28f14bc..19fa8679f 100644 --- a/vapigen/packages/atk/atk.metadata +++ b/vapigen/packages/atk/atk.metadata @@ -1,2 +1,3 @@ Atk cheader_filename="atk/atk.h" +AtkRectangle is_value_type="1" diff --git a/vapigen/packages/gdk-2.0/gdk-2.0.metadata b/vapigen/packages/gdk-2.0/gdk-2.0.metadata index fcf1c2e14..2457f273a 100644 --- a/vapigen/packages/gdk-2.0/gdk-2.0.metadata +++ b/vapigen/packages/gdk-2.0/gdk-2.0.metadata @@ -2,5 +2,6 @@ Gdk cheader_filename="gdk/gdk.h" GdkAtom is_value_type="1" GdkColor is_value_type="1" GdkCursor is_value_type="0" +GdkRectangle is_value_type="1" GdkWindowAttr is_value_type="1" diff --git a/vapigen/packages/gtk+-2.0/gtk+-2.0.metadata b/vapigen/packages/gtk+-2.0/gtk+-2.0.metadata index 4959c9d6e..e009afec9 100644 --- a/vapigen/packages/gtk+-2.0/gtk+-2.0.metadata +++ b/vapigen/packages/gtk+-2.0/gtk+-2.0.metadata @@ -3,6 +3,8 @@ GtkAction::activate has_emitter="1" GtkActionEntry is_value_type="1" GtkAdjustment::changed has_emitter="1" GtkAdjustment::value_changed has_emitter="1" +GtkAllocation is_value_type="1" +GtkBorder is_value_type="1" GtkButton::clicked has_emitter="1" GtkButton::enter has_emitter="1" GtkButton::leave has_emitter="1" @@ -41,6 +43,7 @@ gtk_printer_accepts_ps hidden="1" experimental="1" gtk_printer_is_virtual hidden="1" experimental="1" gtk_quit_add_full hidden="1" GtkRadioActionEntry is_value_type="1" +GtkRequisition is_value_type="1" gtk_show_about_dialog ellipsis="1" GtkTextBuffer::apply_tag has_emitter="1" GtkTextBuffer::begin_user_action has_emitter="1" @@ -48,11 +51,13 @@ GtkTextBuffer::end_user_action has_emitter="1" GtkTextBuffer::insert_child_anchor has_emitter="1" GtkTextBuffer::insert_pixbuf has_emitter="1" GtkTextBuffer::remove_tag has_emitter="1" +GtkTextIter is_value_type="1" GtkTextTag::event has_emitter="1" GtkToggleAction::toggled has_emitter="1" GtkToggleActionEntry is_value_type="1" GtkToggleButton::toggled has_emitter="1" GtkToolItem::set_tooltip has_emitter="1" +GtkTreeIter is_value_type="1" GtkTreeModel::row_changed has_emitter="1" GtkTreeModel::row_deleted has_emitter="1" GtkTreeModel::row_has_child_toggled has_emitter="1" diff --git a/vapigen/packages/pango/pango.metadata b/vapigen/packages/pango/pango.metadata index 1d1800df1..955446632 100644 --- a/vapigen/packages/pango/pango.metadata +++ b/vapigen/packages/pango/pango.metadata @@ -1,2 +1,6 @@ Pango cheader_filename="pango/pango.h" pango_attr_size_new_absolute hidden="1" +PangoColor is_value_type="1" +PangoMatrix is_value_type="1" +PangoRectangle is_value_type="1" + diff --git a/vapigen/vapigen/valagidlparser.vala b/vapigen/vapigen/valagidlparser.vala index f8229ba0f..d4e7fbe55 100644 --- a/vapigen/vapigen/valagidlparser.vala +++ b/vapigen/vapigen/valagidlparser.vala @@ -121,6 +121,7 @@ public class Vala.GIdlParser : CodeVisitor { st.name = st.name.offset (module.name.len ()); } ns.add_struct (st); + st.set_type_id (st.get_upper_case_cname ("TYPE_")); } else if (node.type == IdlNodeTypeId.ENUM) { var en = parse_enum ((IdlNodeEnum) node); if (en.name.has_prefix (module.name)) { @@ -233,13 +234,15 @@ public class Vala.GIdlParser : CodeVisitor { var st = new Struct (node.name, current_source_reference); st.access = MemberAccessibility.PUBLIC; - + + st.set_is_reference_type (true); + var st_attributes = get_attributes (node.name); if (st_attributes != null) { foreach (string attr in st_attributes) { var nv = attr.split ("=", 2); - if (nv[0] == "is_value_type" && eval (nv[1]) == "0") { - st.set_is_reference_type (true); + if (nv[0] == "is_value_type" && eval (nv[1]) == "1") { + st.set_is_reference_type (false); } } } @@ -516,6 +519,9 @@ public class Vala.GIdlParser : CodeVisitor { type.type_name = "File"; } else { parse_type_string (type, n); + if (type_node.is_pointer && is_value_type (n)) { + type.reference_to_value_type = true; + } } } else { stdout.printf ("%d\n", type_node.tag); @@ -523,6 +529,21 @@ public class Vala.GIdlParser : CodeVisitor { return type; } + private bool is_value_type (string! type_name) { + // FIXME only works if both types are in current package, e.g. doesn't work when Gtk uses GdkRectangle + var type_attributes = get_attributes (type_name); + if (type_attributes != null) { + foreach (string attr in type_attributes) { + var nv = attr.split ("=", 2); + if (nv[0] == "is_value_type" && eval (nv[1]) == "1") { + return true; + } + } + } + + return false; + } + private void parse_type_string (TypeReference! type, string! n) { // Generated GIDL misses explicit namespace specifier, // so try to guess namespace @@ -665,6 +686,7 @@ public class Vala.GIdlParser : CodeVisitor { m.set_cname (f.symbol); bool first = true; + FormalParameter last_param = null; foreach (IdlNodeParam param in f.parameters) { weak IdlNode param_node = (IdlNode) param; @@ -690,6 +712,14 @@ public class Vala.GIdlParser : CodeVisitor { var p = new FormalParameter (param_node.name, parse_param (param)); m.add_parameter (p); + + if (last_param != null && p.name == "n_" + last_param.name) { + // last_param is array, p is array length + last_param.type_reference.array_rank = 1; + last_param.type_reference.reference_to_value_type = false; + } + + last_param = p; } if (first) {