summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRico Tzschichholz <ricotz@ubuntu.com>2017-04-11 14:42:46 +0200
committerRico Tzschichholz <ricotz@ubuntu.com>2017-04-17 10:58:45 +0200
commit0815e5e89da94d02f6d6cd66e5c3acbf6d765e96 (patch)
treeff4b89f2eb10706a34a6a408af053b401c5afb97
parentc9aa4716b2645af40080bd6523065e78fceba3b4 (diff)
downloadvala-0815e5e89da94d02f6d6cd66e5c3acbf6d765e96.tar.gz
codegen: Use g_object_notify_by_pspec() to notify property-changes
-rw-r--r--codegen/valaccodebasemodule.vala10
-rw-r--r--codegen/valagtypemodule.vala30
2 files changed, 33 insertions, 7 deletions
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index 8a95c6431..3e51c96a2 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -1787,9 +1787,9 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
if (is_gobject_property (prop) &&
prop.notify &&
(acc.writable || acc.construction)) {
- var notify_call = new CCodeFunctionCall (new CCodeIdentifier ("g_object_notify"));
+ var notify_call = new CCodeFunctionCall (new CCodeIdentifier ("g_object_notify_by_pspec"));
notify_call.add_argument (new CCodeCastExpression (new CCodeIdentifier ("self"), "GObject *"));
- notify_call.add_argument (get_property_canonical_cconstant (prop));
+ notify_call.add_argument (get_param_spec_cexpression (prop));
var get_accessor = prop.get_accessor;
if (get_accessor != null && get_accessor.automatic_body) {
@@ -6614,7 +6614,11 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
return false;
}
- public virtual CCodeFunctionCall get_param_spec (Property prop) {
+ public virtual CCodeExpression get_param_spec_cexpression (Property prop) {
+ return new CCodeFunctionCall (new CCodeIdentifier (""));
+ }
+
+ public virtual CCodeExpression get_param_spec (Property prop) {
return new CCodeFunctionCall (new CCodeIdentifier (""));
}
diff --git a/codegen/valagtypemodule.vala b/codegen/valagtypemodule.vala
index 86a6474a1..6d0f0d2eb 100644
--- a/codegen/valagtypemodule.vala
+++ b/codegen/valagtypemodule.vala
@@ -522,7 +522,6 @@ public class Vala.GTypeModule : GErrorModule {
string macro = "(G_TYPE_CLASS_GET_PRIVATE (klass, %s, %sClassPrivate))".printf (get_ccode_type_id (cl), get_ccode_name (cl));
decl_space.add_type_member_declaration (new CCodeMacroReplacement ("%s_GET_CLASS_PRIVATE(klass)".printf (get_ccode_upper_case_name (cl, null)), macro));
}
- decl_space.add_type_member_declaration (prop_enum);
} else {
if (cl.has_private_fields) {
Report.error (cl.source_reference, "Private fields not supported in compact classes");
@@ -563,10 +562,19 @@ public class Vala.GTypeModule : GErrorModule {
instance_init_context = new EmitContext (cl);
instance_finalize_context = new EmitContext (cl);
-
generate_class_struct_declaration (cl, cfile);
generate_class_private_declaration (cl, cfile);
+ var last_prop = "%s_LAST_PROPERTY".printf (get_ccode_upper_case_name (cl));
+ if (is_gtypeinstance) {
+ cfile.add_type_declaration (prop_enum);
+
+ var prop_array_decl = new CCodeDeclaration ("GParamSpec*");
+ prop_array_decl.modifiers |= CCodeModifiers.STATIC;
+ prop_array_decl.add_declarator (new CCodeVariableDeclarator ("%s_properties".printf (get_ccode_lower_case_name (cl)), null, new CCodeDeclaratorSuffix.with_array (new CCodeIdentifier (last_prop))));
+ cfile.add_type_declaration (prop_array_decl);
+ }
+
if (!cl.is_internal_symbol ()) {
generate_class_struct_declaration (cl, header_file);
}
@@ -619,6 +627,8 @@ public class Vala.GTypeModule : GErrorModule {
pop_context ();
}
+ prop_enum.add_value (new CCodeEnumValue (last_prop));
+
if (cl.get_signals ().size > 0) {
var last_signal = "%s_LAST_SIGNAL".printf (get_ccode_upper_case_name (cl));
signal_enum.add_value (new CCodeEnumValue (last_signal));
@@ -1719,7 +1729,15 @@ public class Vala.GTypeModule : GErrorModule {
cfile.add_function (instance_finalize_context.ccode);
}
- public override CCodeFunctionCall get_param_spec (Property prop) {
+ public override CCodeExpression get_param_spec_cexpression (Property prop) {
+ var cl = (TypeSymbol) prop.parent_symbol;
+ var prop_array = new CCodeIdentifier ("%s_properties".printf (get_ccode_lower_case_name (cl)));
+ var prop_enum_value = new CCodeIdentifier (get_ccode_upper_case_name (prop));
+
+ return new CCodeElementAccess (prop_array, prop_enum_value);
+ }
+
+ public override CCodeExpression get_param_spec (Property prop) {
var cspec = new CCodeFunctionCall ();
cspec.add_argument (get_property_canonical_cconstant (prop));
cspec.add_argument (new CCodeConstant ("\"%s\"".printf (prop.nick)));
@@ -1900,7 +1918,11 @@ public class Vala.GTypeModule : GErrorModule {
}
cspec.add_argument (new CCodeConstant (pflags));
- return cspec;
+ if (prop.parent_symbol is Interface) {
+ return cspec;
+ } else {
+ return new CCodeAssignment (get_param_spec_cexpression (prop), cspec);
+ }
}
public override void generate_interface_declaration (Interface iface, CCodeFile decl_space) {