[vala] Fix closures in constructors
- From: Jürg Billeter <juergbi src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [vala] Fix closures in constructors
- Date: Wed, 10 Feb 2010 14:40:49 +0000 (UTC)
commit 2d5245bed59457118e3b3ece8cc5adef2313fd48
Author: Jürg Billeter <j bitron ch>
Date: Wed Feb 10 10:55:34 2010 +0100
Fix closures in constructors
Fixes bug 602138.
codegen/valaccodebasemodule.vala | 3 ++-
codegen/valaccodemethodcallmodule.vala | 8 ++++++++
2 files changed, 10 insertions(+), 1 deletions(-)
---
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index 8374812..101149d 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -1800,7 +1800,8 @@ internal class Vala.CCodeBaseModule : CCodeModule {
ref_call.add_argument (get_variable_cexpression ("_data%d_".printf (parent_block_id)));
cblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (block_id)), "_data%d_".printf (parent_block_id)), ref_call)));
- } else if (in_constructor || (current_method != null && current_method.binding == MemberBinding.INSTANCE)) {
+ } else if (in_constructor || (current_method != null && current_method.binding == MemberBinding.INSTANCE &&
+ (!(current_method is CreationMethod) || current_method.body != b))) {
var ref_call = new CCodeFunctionCall (get_dup_func_expression (new ObjectType (current_class), b.source_reference));
ref_call.add_argument (get_result_cexpression ("self"));
diff --git a/codegen/valaccodemethodcallmodule.vala b/codegen/valaccodemethodcallmodule.vala
index f42117e..5c88ef9 100644
--- a/codegen/valaccodemethodcallmodule.vala
+++ b/codegen/valaccodemethodcallmodule.vala
@@ -265,6 +265,14 @@ internal class Vala.CCodeMethodCallModule : CCodeAssignmentModule {
} else if (m is CreationMethod && context.profile == Profile.GOBJECT && m.parent_symbol is Class) {
ccall_expr = new CCodeAssignment (new CCodeIdentifier ("self"), new CCodeCastExpression (ccall, current_class.get_cname () + "*"));
+ if (current_method.body.captured) {
+ // capture self after setting it
+ var ref_call = new CCodeFunctionCall (get_dup_func_expression (new ObjectType (current_class), expr.source_reference));
+ ref_call.add_argument (ccall_expr);
+
+ ccall_expr = new CCodeAssignment (new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (current_method.body))), "self"), ref_call);
+ }
+
if (!current_class.is_compact && current_class.get_type_parameters ().size > 0) {
var ccomma = new CCodeCommaExpression ();
ccomma.append_expression (ccall_expr);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]