From: Juerg Billeter Date: Sun, 25 May 2008 14:02:57 +0000 (+0000) Subject: Add support for [Immutable] class attribute, allow duplication of X-Git-Tag: VALA_0_3_3~128 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=412298b0f3044950ae221d98aaa78c21faee7ce6;p=thirdparty%2Fvala.git Add support for [Immutable] class attribute, allow duplication of 2008-05-25 Juerg Billeter * vala/valaclass.vala: * gobject/valaccodegenerator.vala: * vapi/glib-2.0.vapi: Add support for [Immutable] class attribute, allow duplication of immutable instances svn path=/trunk/; revision=1430 --- diff --git a/ChangeLog b/ChangeLog index b83005312..fa324b76c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2008-05-25 Jürg Billeter + + * vala/valaclass.vala: + * gobject/valaccodegenerator.vala: + * vapi/glib-2.0.vapi: + + Add support for [Immutable] class attribute, allow duplication of + immutable instances + 2008-05-25 Jürg Billeter * vala/valaparser.vala: fix warning with pointer casts diff --git a/gobject/valaccodegenerator.vala b/gobject/valaccodegenerator.vala index 920350b35..64047f2f7 100644 --- a/gobject/valaccodegenerator.vala +++ b/gobject/valaccodegenerator.vala @@ -1254,11 +1254,13 @@ public class Vala.CCodeGenerator : CodeGenerator { } private CCodeExpression? get_dup_func_expression (DataType type, SourceReference? source_reference) { + var cl = type.data_type as Class; if (type.data_type != null) { string dup_function; if (type.data_type.is_reference_counting ()) { dup_function = type.data_type.get_ref_function (); - } else if (type.data_type == string_type.data_type) { + } else if (cl != null && cl.is_immutable) { + // allow duplicates of immutable instances as for example strings dup_function = type.data_type.get_dup_function (); } else if (type is ValueType) { dup_function = ""; diff --git a/vala/valaclass.vala b/vala/valaclass.vala index 3f0276064..bd67bf623 100644 --- a/vala/valaclass.vala +++ b/vala/valaclass.vala @@ -61,6 +61,21 @@ public class Vala.Class : Typesymbol { } } + /** + * Instances of immutable classes are immutable after construction. + */ + public bool is_immutable { + get { + if (base_class != null) { + return base_class.is_immutable; + } + return _is_immutable; + } + set { + _is_immutable = value; + } + } + /** * Specifies whether this class has private fields. */ @@ -80,6 +95,7 @@ public class Vala.Class : Typesymbol { private string set_value_function; private string? type_signature; private bool _is_compact; + private bool _is_immutable; private Gee.List type_parameters = new ArrayList (); @@ -562,6 +578,8 @@ public class Vala.Class : Typesymbol { is_error_base = true; } else if (a.name == "Compact") { is_compact = true; + } else if (a.name == "Immutable") { + is_immutable = true; } } } diff --git a/vapi/glib-2.0.vapi b/vapi/glib-2.0.vapi index c6a472026..85cb01e57 100644 --- a/vapi/glib-2.0.vapi +++ b/vapi/glib-2.0.vapi @@ -545,6 +545,7 @@ public enum UnicodeBreakType { } [Compact] +[Immutable] [CCode (cname = "char", const_cname = "const char", copy_function = "g_strdup", free_function = "g_free", cheader_filename = "stdlib.h,string.h,glib.h", type_id = "G_TYPE_STRING", marshaller_type_name = "STRING", get_value_function = "g_value_get_string", set_value_function = "g_value_set_string", type_signature = "s")] public class string { [CCode (cname = "strstr")]