[vala/0.48] codegen: Don't call *_instance_init() in compact class chainup
- From: Rico Tzschichholz <ricotz src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala/0.48] codegen: Don't call *_instance_init() in compact class chainup
- Date: Thu, 8 Apr 2021 07:32:54 +0000 (UTC)
commit 375a31f07af7ba2bb00c2e1011431d425e07b736
Author: Rico Tzschichholz <ricotz ubuntu com>
Date: Wed Apr 7 18:14:16 2021 +0200
codegen: Don't call *_instance_init() in compact class chainup
Found by -fsanitize=address
codegen/valaccodemethodmodule.vala | 2 +-
tests/Makefile.am | 1 +
tests/chainup/class-compact-this.vala | 34 ++++++++++++++++++++++++++++++++++
3 files changed, 36 insertions(+), 1 deletion(-)
---
diff --git a/codegen/valaccodemethodmodule.vala b/codegen/valaccodemethodmodule.vala
index 561b1fbbe..f29463ea4 100644
--- a/codegen/valaccodemethodmodule.vala
+++ b/codegen/valaccodemethodmodule.vala
@@ -645,7 +645,7 @@ public abstract class Vala.CCodeMethodModule : CCodeStructModule {
ccode.add_assignment (get_this_cexpression (), ccall);
}
- if (cl.base_class == null) {
+ if (cl.base_class == null && !(((CreationMethod) m).chain_up
&& cl.is_compact)) {
var cinitcall = new CCodeFunctionCall (new
CCodeIdentifier ("%s_instance_init".printf (get_ccode_lower_case_name (cl, null))));
cinitcall.add_argument (get_this_cexpression ());
if (!cl.is_compact) {
diff --git a/tests/Makefile.am b/tests/Makefile.am
index c136ab715..8f5ff2360 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -142,6 +142,7 @@ TESTS = \
chainup/class-base.vala \
chainup/class-base-foo.vala \
chainup/class-compact-base.vala \
+ chainup/class-compact-this.vala \
chainup/class-object.vala \
chainup/class-this.vala \
chainup/class-this-foo.vala \
diff --git a/tests/chainup/class-compact-this.vala b/tests/chainup/class-compact-this.vala
new file mode 100644
index 000000000..3ace7a7eb
--- /dev/null
+++ b/tests/chainup/class-compact-this.vala
@@ -0,0 +1,34 @@
+[Compact]
+class Foo {
+ public string s = "foo";
+ public int i = 42;
+ public int j;
+
+ public Foo () {
+ assert (s == "foo");
+ assert (i == 42);
+ j = 23;
+ }
+
+ public Foo.bar () {
+ this ();
+ assert (s == "foo");
+ assert (i == 42);
+ assert (j == 23);
+ }
+}
+
+void main () {
+ {
+ var foo = new Foo ();
+ assert (foo.s == "foo");
+ assert (foo.i == 42);
+ assert (foo.j == 23);
+ }
+ {
+ var foo = new Foo.bar ();
+ assert (foo.s == "foo");
+ assert (foo.i == 42);
+ assert (foo.j == 23);
+ }
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]