diff options
author | Luca Bruno <lucabru@src.gnome.org> | 2013-06-11 23:02:44 +0200 |
---|---|---|
committer | Luca Bruno <lucabru@src.gnome.org> | 2013-06-11 23:07:16 +0200 |
commit | 73e553ac3488d641fb08b275bcf2636e3cf0de67 (patch) | |
tree | 8fa7995b9d3cee870be6b5b51cbca357d4cdf6bc /codegen/valagobjectmodule.vala | |
parent | a3c2589cf39f9dd6efcb403e47c68e1b0fba76d5 (diff) | |
download | vala-73e553ac3488d641fb08b275bcf2636e3cf0de67.tar.gz |
codegen: Support non-auto property initializer in gobjects
Fixes bug 701978
Diffstat (limited to 'codegen/valagobjectmodule.vala')
-rw-r--r-- | codegen/valagobjectmodule.vala | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/codegen/valagobjectmodule.vala b/codegen/valagobjectmodule.vala index d2e81e35e..cddbc5e67 100644 --- a/codegen/valagobjectmodule.vala +++ b/codegen/valagobjectmodule.vala @@ -668,6 +668,27 @@ public class Vala.GObjectModule : GTypeModule { if (is_gobject_property (prop) && prop.parent_symbol is Class) { prop_enum.add_value (new CCodeEnumValue (get_ccode_upper_case_name (prop))); + + if (prop.initializer != null && prop.set_accessor != null && !prop.set_accessor.automatic_body) { + // generate a custom initializer if it couldn't be done at class_init time + bool has_spec_initializer = prop.property_type.data_type is Enum; + if (!has_spec_initializer && prop.property_type.data_type is Struct) { + var param_spec_func = get_ccode_param_spec_function (prop.property_type.data_type); + has_spec_initializer = param_spec_func != "g_param_spec_boxed"; + } + if (!has_spec_initializer) { + push_context (instance_init_context); + + prop.initializer.emit (this); + + var inst_ma = new MemberAccess.simple ("this"); + inst_ma.target_value = new GLibValue (get_data_type_for_symbol ((Class) prop.parent_symbol), new CCodeIdentifier ("self"), true); + store_property (prop, inst_ma, prop.initializer.target_value); + + temp_ref_values.clear (); + pop_context (); + } + } } } |