summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--codegen/valaccodebasemodule.vala36
-rw-r--r--codegen/valaccodememberaccessmodule.vala10
-rw-r--r--codegen/valagobjectmodule.vala69
-rw-r--r--tests/objects/dynamic.c-expected119
-rw-r--r--tests/objects/dynamic.vala7
5 files changed, 92 insertions, 149 deletions
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index edf72b5a6..65a6df560 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -6456,19 +6456,15 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
var set_func = "g_object_set";
- if (!get_ccode_no_accessor_method (prop)) {
- if (prop is DynamicProperty) {
- set_func = get_dynamic_property_setter_cname ((DynamicProperty) prop);
- } else {
- generate_property_accessor_declaration (base_prop.set_accessor, cfile);
- set_func = get_ccode_name (base_prop.set_accessor);
-
- if (!prop.external && prop.external_package) {
- // internal VAPI properties
- // only add them once per source file
- if (add_generated_external_symbol (prop)) {
- visit_property (prop);
- }
+ if (!get_ccode_no_accessor_method (prop) && !(prop is DynamicProperty)) {
+ generate_property_accessor_declaration (base_prop.set_accessor, cfile);
+ set_func = get_ccode_name (base_prop.set_accessor);
+
+ if (!prop.external && prop.external_package) {
+ // internal VAPI properties
+ // only add them once per source file
+ if (add_generated_external_symbol (prop)) {
+ visit_property (prop);
}
}
}
@@ -6491,7 +6487,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
ccall.add_argument (cinstance);
}
- if (get_ccode_no_accessor_method (prop)) {
+ if (get_ccode_no_accessor_method (prop) || prop is DynamicProperty) {
/* property name is second argument of g_object_set */
ccall.add_argument (get_property_canonical_cconstant (prop));
}
@@ -6525,7 +6521,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
}
}
- if (get_ccode_no_accessor_method (prop)) {
+ if (get_ccode_no_accessor_method (prop) || prop is DynamicProperty) {
ccall.add_argument (new CCodeConstant ("NULL"));
}
@@ -6821,16 +6817,6 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
public virtual void register_dbus_info (CCodeBlock block, ObjectTypeSymbol bindable) {
}
- public virtual string get_dynamic_property_getter_cname (DynamicProperty node) {
- Report.error (node.source_reference, "dynamic properties are not supported for %s", node.dynamic_type.to_string ());
- return "";
- }
-
- public virtual string get_dynamic_property_setter_cname (DynamicProperty node) {
- Report.error (node.source_reference, "dynamic properties are not supported for %s", node.dynamic_type.to_string ());
- return "";
- }
-
public virtual string get_dynamic_signal_cname (DynamicSignal node) {
return "";
}
diff --git a/codegen/valaccodememberaccessmodule.vala b/codegen/valaccodememberaccessmodule.vala
index 1603dff01..6f01e8a0b 100644
--- a/codegen/valaccodememberaccessmodule.vala
+++ b/codegen/valaccodememberaccessmodule.vala
@@ -246,14 +246,8 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
inst = new CCodeMemberAccess.pointer (inst, "priv");
}
set_cvalue (expr, new CCodeMemberAccess.pointer (inst, get_ccode_name (prop.field)));
- } else if (!get_ccode_no_accessor_method (prop)) {
- string getter_cname;
- if (prop is DynamicProperty) {
- getter_cname = get_dynamic_property_getter_cname ((DynamicProperty) prop);
- } else {
- getter_cname = get_ccode_name (prop.get_accessor);
- }
- var ccall = new CCodeFunctionCall (new CCodeIdentifier (getter_cname));
+ } else if (!get_ccode_no_accessor_method (prop) && !(prop is DynamicProperty)) {
+ var ccall = new CCodeFunctionCall (new CCodeIdentifier (get_ccode_name (prop.get_accessor)));
if (prop.binding == MemberBinding.INSTANCE) {
if (prop.parent_symbol is Struct && !((Struct) prop.parent_symbol).is_simple_type ()) {
diff --git a/codegen/valagobjectmodule.vala b/codegen/valagobjectmodule.vala
index 114692139..638aab367 100644
--- a/codegen/valagobjectmodule.vala
+++ b/codegen/valagobjectmodule.vala
@@ -24,7 +24,6 @@
public class Vala.GObjectModule : GTypeModule {
- int dynamic_property_id;
int signal_wrapper_id;
public override void visit_class (Class cl) {
@@ -654,74 +653,6 @@ public class Vala.GObjectModule : GTypeModule {
pop_line ();
}
- public override string get_dynamic_property_getter_cname (DynamicProperty prop) {
- if (prop.dynamic_type.type_symbol == null
- || !prop.dynamic_type.type_symbol.is_subtype_of (gobject_type)) {
- return base.get_dynamic_property_getter_cname (prop);
- }
-
- string getter_cname = "_dynamic_get_%s%d".printf (prop.name, dynamic_property_id++);
-
- var func = new CCodeFunction (getter_cname, get_ccode_name (prop.property_type));
- func.modifiers |= CCodeModifiers.STATIC | CCodeModifiers.INLINE;
-
- func.add_parameter (new CCodeParameter ("obj", get_ccode_name (prop.dynamic_type)));
-
- push_function (func);
-
- ccode.add_declaration (get_ccode_name (prop.property_type), new CCodeVariableDeclarator ("result"));
-
- var call = new CCodeFunctionCall (new CCodeIdentifier ("g_object_get"));
- call.add_argument (new CCodeIdentifier ("obj"));
- call.add_argument (get_property_canonical_cconstant (prop));
- call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier ("result")));
- call.add_argument (new CCodeConstant ("NULL"));
-
- ccode.add_expression (call);
-
- ccode.add_return (new CCodeIdentifier ("result"));
-
- pop_function ();
-
- // append to C source file
- cfile.add_function_declaration (func);
- cfile.add_function (func);
-
- return getter_cname;
- }
-
- public override string get_dynamic_property_setter_cname (DynamicProperty prop) {
- if (prop.dynamic_type.type_symbol == null
- || !prop.dynamic_type.type_symbol.is_subtype_of (gobject_type)) {
- return base.get_dynamic_property_setter_cname (prop);
- }
-
- string setter_cname = "_dynamic_set_%s%d".printf (prop.name, dynamic_property_id++);
-
- var func = new CCodeFunction (setter_cname, "void");
- func.modifiers |= CCodeModifiers.STATIC | CCodeModifiers.INLINE;
- func.add_parameter (new CCodeParameter ("obj", get_ccode_name (prop.dynamic_type)));
- func.add_parameter (new CCodeParameter ("value", get_ccode_name (prop.property_type)));
-
- push_function (func);
-
- var call = new CCodeFunctionCall (new CCodeIdentifier ("g_object_set"));
- call.add_argument (new CCodeIdentifier ("obj"));
- call.add_argument (get_property_canonical_cconstant (prop));
- call.add_argument (new CCodeIdentifier ("value"));
- call.add_argument (new CCodeConstant ("NULL"));
-
- ccode.add_expression (call);
-
- pop_function ();
-
- // append to C source file
- cfile.add_function_declaration (func);
- cfile.add_function (func);
-
- return setter_cname;
- }
-
public override string get_dynamic_signal_cname (DynamicSignal node) {
return "dynamic_%s%d_".printf (node.name, signal_wrapper_id++);
}
diff --git a/tests/objects/dynamic.c-expected b/tests/objects/dynamic.c-expected
index 52bbb89bd..c1a3aed50 100644
--- a/tests/objects/dynamic.c-expected
+++ b/tests/objects/dynamic.c-expected
@@ -29,6 +29,7 @@ typedef struct _FooPrivate FooPrivate;
enum {
FOO_0_PROPERTY,
FOO_PROP_PROPERTY,
+ FOO_PROP2_PROPERTY,
FOO_NUM_PROPERTIES
};
static GParamSpec* foo_properties[FOO_NUM_PROPERTIES];
@@ -71,6 +72,7 @@ struct _FooClass {
struct _FooPrivate {
gchar* _prop;
+ gint _prop2;
};
struct _Bar {
@@ -93,9 +95,12 @@ VALA_EXTERN GType foo_get_type (void) G_GNUC_CONST ;
G_DEFINE_AUTOPTR_CLEANUP_FUNC (Foo, g_object_unref)
VALA_EXTERN Foo* foo_new (void);
VALA_EXTERN Foo* foo_construct (GType object_type);
-VALA_EXTERN const gchar* foo_get_prop (Foo* self);
+VALA_EXTERN gchar* foo_get_prop (Foo* self);
VALA_EXTERN void foo_set_prop (Foo* self,
const gchar* value);
+VALA_EXTERN gint foo_get_prop2 (Foo* self);
+VALA_EXTERN void foo_set_prop2 (Foo* self,
+ gint value);
static void foo_finalize (GObject * obj);
static GType foo_get_type_once (void);
static void _vala_foo_get_property (GObject * object,
@@ -117,9 +122,6 @@ static GType bar_get_type_once (void);
VALA_EXTERN void sig_cb (void);
VALA_EXTERN void sig_after_cb (void);
static void _vala_main (void);
-static inline void _dynamic_set_prop0 (GObject* obj,
- const gchar* value);
-static inline gchar* _dynamic_get_prop1 (GObject* obj);
static void _sig_after_cb_dynamic_sig0_ (GObject* _sender,
gpointer self);
static void _sig_cb_dynamic_sig1_ (GObject* _sender,
@@ -149,14 +151,16 @@ foo_new (void)
return foo_construct (TYPE_FOO);
}
-const gchar*
+gchar*
foo_get_prop (Foo* self)
{
- const gchar* result;
+ gchar* result;
const gchar* _tmp0_;
+ gchar* _tmp1_;
g_return_val_if_fail (IS_FOO (self), NULL);
_tmp0_ = self->priv->_prop;
- result = _tmp0_;
+ _tmp1_ = g_strdup (_tmp0_);
+ result = _tmp1_;
return result;
}
@@ -174,6 +178,29 @@ foo_set_prop (Foo* self,
self->priv->_prop = _tmp0_;
g_object_notify_by_pspec ((GObject *) self, foo_properties[FOO_PROP_PROPERTY]);
}
+ _g_free0 (old_value);
+}
+
+gint
+foo_get_prop2 (Foo* self)
+{
+ gint result;
+ g_return_val_if_fail (IS_FOO (self), 0);
+ result = self->priv->_prop2;
+ return result;
+}
+
+void
+foo_set_prop2 (Foo* self,
+ gint value)
+{
+ gint old_value;
+ g_return_if_fail (IS_FOO (self));
+ old_value = foo_get_prop2 (self);
+ if (old_value != value) {
+ self->priv->_prop2 = value;
+ g_object_notify_by_pspec ((GObject *) self, foo_properties[FOO_PROP2_PROPERTY]);
+ }
}
static void
@@ -186,6 +213,7 @@ foo_class_init (FooClass * klass,
G_OBJECT_CLASS (klass)->set_property = _vala_foo_set_property;
G_OBJECT_CLASS (klass)->finalize = foo_finalize;
g_object_class_install_property (G_OBJECT_CLASS (klass), FOO_PROP_PROPERTY, foo_properties[FOO_PROP_PROPERTY] = g_param_spec_string ("prop", "prop", "prop", NULL, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE));
+ g_object_class_install_property (G_OBJECT_CLASS (klass), FOO_PROP2_PROPERTY, foo_properties[FOO_PROP2_PROPERTY] = g_param_spec_int ("prop2", "prop2", "prop2", G_MININT, G_MAXINT, 0, G_PARAM_STATIC_STRINGS | G_PARAM_READABLE | G_PARAM_WRITABLE));
foo_signals[FOO_SIG_SIGNAL] = g_signal_new ("sig", TYPE_FOO, G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
}
@@ -237,7 +265,10 @@ _vala_foo_get_property (GObject * object,
self = G_TYPE_CHECK_INSTANCE_CAST (object, TYPE_FOO, Foo);
switch (property_id) {
case FOO_PROP_PROPERTY:
- g_value_set_string (value, foo_get_prop (self));
+ g_value_take_string (value, foo_get_prop (self));
+ break;
+ case FOO_PROP2_PROPERTY:
+ g_value_set_int (value, foo_get_prop2 (self));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -257,6 +288,9 @@ _vala_foo_set_property (GObject * object,
case FOO_PROP_PROPERTY:
foo_set_prop (self, g_value_get_string (value));
break;
+ case FOO_PROP2_PROPERTY:
+ foo_set_prop2 (self, g_value_get_int (value));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
@@ -353,21 +387,6 @@ _g_object_ref0 (gpointer self)
return self ? g_object_ref (self) : NULL;
}
-static inline void
-_dynamic_set_prop0 (GObject* obj,
- const gchar* value)
-{
- g_object_set (obj, "prop", value, NULL);
-}
-
-static inline gchar*
-_dynamic_get_prop1 (GObject* obj)
-{
- gchar* result;
- g_object_get (obj, "prop", &result, NULL);
- return result;
-}
-
static void
_sig_after_cb_dynamic_sig0_ (GObject* _sender,
gpointer self)
@@ -407,24 +426,32 @@ _vala_main (void)
gchar* s = NULL;
gchar* _tmp2_;
gchar* _tmp3_;
+ gint i = 0;
+ gint _tmp4_;
+ gint _tmp5_;
gulong id1 = 0UL;
- gulong _tmp4_;
+ gulong _tmp6_;
gulong id2 = 0UL;
- gulong _tmp5_;
+ gulong _tmp7_;
_tmp0_ = foo_new ();
real = _tmp0_;
_tmp1_ = _g_object_ref0 (G_TYPE_CHECK_INSTANCE_CAST (real, G_TYPE_OBJECT, GObject));
foo = _tmp1_;
- _dynamic_set_prop0 (foo, "foo");
- _tmp2_ = _dynamic_get_prop1 (foo);
+ g_object_set (foo, "prop", "foo", NULL);
+ g_object_get (foo, "prop", &_tmp2_, NULL);
_tmp3_ = _tmp2_;
s = _tmp3_;
_vala_assert (g_strcmp0 (s, "foo") == 0, "s == \"foo\"");
+ g_object_set (foo, "prop2", 42, NULL);
+ g_object_get (foo, "prop2", &_tmp4_, NULL);
+ _tmp5_ = _tmp4_;
+ i = _tmp5_;
+ _vala_assert (i == 42, "i == 42");
success = FALSE;
- _tmp4_ = g_signal_connect_after (foo, "sig", (GCallback) _sig_after_cb_dynamic_sig0_, NULL);
- id1 = _tmp4_;
- _tmp5_ = g_signal_connect (foo, "sig", (GCallback) _sig_cb_dynamic_sig1_, NULL);
- id2 = _tmp5_;
+ _tmp6_ = g_signal_connect_after (foo, "sig", (GCallback) _sig_after_cb_dynamic_sig0_, NULL);
+ id1 = _tmp6_;
+ _tmp7_ = g_signal_connect (foo, "sig", (GCallback) _sig_cb_dynamic_sig1_, NULL);
+ id2 = _tmp7_;
g_signal_emit (real, foo_signals[FOO_SIG_SIGNAL], 0);
_vala_assert (success, "success");
success = FALSE;
@@ -438,26 +465,26 @@ _vala_main (void)
}
{
Foo* real = NULL;
- Foo* _tmp6_;
+ Foo* _tmp8_;
GObject* foo = NULL;
- GObject* _tmp7_;
+ GObject* _tmp9_;
Bar* bar = NULL;
- Bar* _tmp8_;
+ Bar* _tmp10_;
gulong id1 = 0UL;
- gulong _tmp9_;
+ gulong _tmp11_;
gulong id2 = 0UL;
- gulong _tmp10_;
- _tmp6_ = foo_new ();
- real = _tmp6_;
- _tmp7_ = _g_object_ref0 (G_TYPE_CHECK_INSTANCE_CAST (real, G_TYPE_OBJECT, GObject));
- foo = _tmp7_;
- _tmp8_ = bar_new ();
- bar = _tmp8_;
+ gulong _tmp12_;
+ _tmp8_ = foo_new ();
+ real = _tmp8_;
+ _tmp9_ = _g_object_ref0 (G_TYPE_CHECK_INSTANCE_CAST (real, G_TYPE_OBJECT, GObject));
+ foo = _tmp9_;
+ _tmp10_ = bar_new ();
+ bar = _tmp10_;
bar->success = FALSE;
- _tmp9_ = g_signal_connect_object (foo, "sig", (GCallback) _bar_sig_after_cb_dynamic_sig2_, bar, G_CONNECT_AFTER);
- id1 = _tmp9_;
- _tmp10_ = g_signal_connect_object (foo, "sig", (GCallback) _bar_sig_cb_dynamic_sig3_, bar, 0);
- id2 = _tmp10_;
+ _tmp11_ = g_signal_connect_object (foo, "sig", (GCallback) _bar_sig_after_cb_dynamic_sig2_, bar, G_CONNECT_AFTER);
+ id1 = _tmp11_;
+ _tmp12_ = g_signal_connect_object (foo, "sig", (GCallback) _bar_sig_cb_dynamic_sig3_, bar, 0);
+ id2 = _tmp12_;
g_signal_emit (real, foo_signals[FOO_SIG_SIGNAL], 0);
_vala_assert (bar->success, "bar.success");
bar->success = FALSE;
diff --git a/tests/objects/dynamic.vala b/tests/objects/dynamic.vala
index ff9c9dddb..38f5e6a11 100644
--- a/tests/objects/dynamic.vala
+++ b/tests/objects/dynamic.vala
@@ -1,6 +1,7 @@
class Foo : Object {
public signal void sig ();
- public string prop { get; set; }
+ public string prop { owned get; set; }
+ public int prop2 { get; set; }
}
class Bar : Object {
@@ -34,6 +35,10 @@ void main () {
string s = foo.prop;
assert (s == "foo");
+ foo.prop2 = 42;
+ int i = foo.prop2;
+ assert (i == 42);
+
success = false;
var id1 = foo.sig.connect_after (sig_after_cb);
var id2 = foo.sig.connect (sig_cb);