summaryrefslogtreecommitdiff
path: root/codegen/valagobjectmodule.vala
diff options
context:
space:
mode:
authorLuca Bruno <lucabru@src.gnome.org>2013-06-11 23:02:44 +0200
committerLuca Bruno <lucabru@src.gnome.org>2013-06-11 23:07:16 +0200
commit73e553ac3488d641fb08b275bcf2636e3cf0de67 (patch)
tree8fa7995b9d3cee870be6b5b51cbca357d4cdf6bc /codegen/valagobjectmodule.vala
parenta3c2589cf39f9dd6efcb403e47c68e1b0fba76d5 (diff)
downloadvala-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.vala21
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 ();
+ }
+ }
}
}