summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuca Bruno <lucabru@src.gnome.org>2011-01-18 10:21:00 +0100
committerJürg Billeter <j@bitron.ch>2011-01-19 22:08:19 +0100
commit373eafc7d85570d2e13bd56dc8fa532bdcbc2395 (patch)
tree403e0ecc71637592da6655e18b57849f4309d6a6
parentfccb973576e493f71d3a5833be0af878fff8f7c6 (diff)
downloadvala-373eafc7d85570d2e13bd56dc8fa532bdcbc2395.tar.gz
codegen: Add convenience is_in_coroutine() function
-rw-r--r--codegen/valaccodebasemodule.vala26
-rw-r--r--codegen/valaccodecontrolflowmodule.vala18
-rw-r--r--codegen/valaccodememberaccessmodule.vala8
-rw-r--r--codegen/valagasyncmodule.vala6
-rw-r--r--codegen/valagerrormodule.vala6
5 files changed, 34 insertions, 30 deletions
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index c0c249092..e6df5df1f 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -136,6 +136,10 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
}
}
+ public bool is_in_coroutine () {
+ return current_method != null && current_method.coroutine;
+ }
+
public bool is_in_constructor () {
if (current_method != null) {
// make sure to not return true in lambda expression inside constructor
@@ -1683,7 +1687,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
} else if (param.variable_type is DelegateType) {
CCodeExpression target_expr;
CCodeExpression delegate_target_destroy_notify;
- if (current_method != null && current_method.coroutine) {
+ if (is_in_coroutine ()) {
target_expr = new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), get_delegate_target_cname (get_variable_cname (param.name)));
delegate_target_destroy_notify = new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), get_delegate_target_destroy_notify_cname (get_variable_cname (param.name)));
} else {
@@ -1810,7 +1814,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
var data_alloc = new CCodeFunctionCall (new CCodeIdentifier ("g_slice_new0"));
data_alloc.add_argument (new CCodeIdentifier (struct_name));
- if (current_method != null && current_method.coroutine) {
+ if (is_in_coroutine ()) {
closure_struct.add_field (struct_name + "*", "_data%d_".printf (block_id));
} else {
ccode.add_declaration (struct_name + "*", new CCodeVariableDeclarator ("_data%d_".printf (block_id)));
@@ -1959,7 +1963,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
}
public CCodeExpression get_variable_cexpression (string name) {
- if (current_method != null && current_method.coroutine) {
+ if (is_in_coroutine ()) {
return new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), get_variable_cname (name));
} else {
return new CCodeIdentifier (get_variable_cname (name));
@@ -1985,7 +1989,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
}
public CCodeExpression get_result_cexpression (string cname = "result") {
- if (current_method != null && current_method.coroutine) {
+ if (is_in_coroutine ()) {
return new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), cname);
} else {
return new CCodeIdentifier (cname);
@@ -3023,7 +3027,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
vardecl.init0 = true;
}
- if (current_method != null && current_method.coroutine) {
+ if (is_in_coroutine ()) {
closure_struct.add_field (local.variable_type.get_cname (), local.name);
// even though closure struct is zerod, we need to initialize temporary variables
@@ -3188,7 +3192,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
for (int dim = 1; dim <= array_type.rank; dim++) {
var len_l = get_result_cexpression (get_array_length_cname ("result", dim));
- if (current_method == null || !current_method.coroutine) {
+ if (!is_in_coroutine ()) {
len_l = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, len_l);
}
var len_r = get_array_length_cexpression (stmt.return_expression, dim);
@@ -3206,7 +3210,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
ccode.add_assignment (get_variable_cexpression (return_expr_decl.name), get_cvalue (stmt.return_expression));
var target_l = get_result_cexpression (get_delegate_target_cname ("result"));
- if (current_method == null || !current_method.coroutine) {
+ if (!is_in_coroutine ()) {
target_l = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, target_l);
}
CCodeExpression target_r_destroy_notify;
@@ -3214,7 +3218,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
ccode.add_assignment (target_l, target_r);
if (delegate_type.value_owned) {
var target_l_destroy_notify = get_result_cexpression (get_delegate_target_destroy_notify_cname ("result"));
- if (current_method == null || !current_method.coroutine) {
+ if (!is_in_coroutine ()) {
target_l_destroy_notify = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, target_l_destroy_notify);
}
ccode.add_assignment (target_l_destroy_notify, target_r_destroy_notify);
@@ -3229,7 +3233,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
if (stmt.return_expression != null) {
// assign method result to `result'
CCodeExpression result_lhs = get_result_cexpression ();
- if (current_return_type.is_real_non_null_struct_type () && (current_method == null || !current_method.coroutine)) {
+ if (current_return_type.is_real_non_null_struct_type () && !is_in_coroutine ()) {
result_lhs = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, result_lhs);
}
ccode.add_assignment (result_lhs, get_cvalue (stmt.return_expression));
@@ -3265,7 +3269,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
ccode.add_goto ("_return");
} else if (current_method is CreationMethod) {
ccode.add_return (new CCodeIdentifier ("self"));
- } else if (current_method != null && current_method.coroutine) {
+ } else if (is_in_coroutine ()) {
} else if (current_return_type is VoidType || current_return_type.is_real_non_null_struct_type ()) {
// structs are returned via out parameter
ccode.add_return ();
@@ -3531,7 +3535,7 @@ public abstract class Vala.CCodeBaseModule : CodeGenerator {
public override void visit_base_access (BaseAccess expr) {
CCodeExpression this_access;
- if (current_method != null && current_method.coroutine) {
+ if (is_in_coroutine ()) {
// use closure
this_access = new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), "self");
} else {
diff --git a/codegen/valaccodecontrolflowmodule.vala b/codegen/valaccodecontrolflowmodule.vala
index b51fe5fe4..6ad5f014d 100644
--- a/codegen/valaccodecontrolflowmodule.vala
+++ b/codegen/valaccodecontrolflowmodule.vala
@@ -230,7 +230,7 @@ public abstract class Vala.CCodeControlFlowModule : CCodeMethodModule {
array_type.fixed_length = false;
}
- if (current_method != null && current_method.coroutine) {
+ if (is_in_coroutine ()) {
closure_struct.add_field (collection_type.get_cname (), collection_backup.name);
} else {
var ccolvardecl = new CCodeVariableDeclarator (collection_backup.name);
@@ -249,7 +249,7 @@ public abstract class Vala.CCodeControlFlowModule : CCodeMethodModule {
var array_len = get_array_length_cexpression (stmt.collection);
// store array length for use by _vala_array_free
- if (current_method != null && current_method.coroutine) {
+ if (is_in_coroutine ()) {
closure_struct.add_field ("int", get_array_length_cname (collection_backup.name, 1));
} else {
ccode.add_declaration ("int", new CCodeVariableDeclarator (get_array_length_cname (collection_backup.name, 1)));
@@ -258,7 +258,7 @@ public abstract class Vala.CCodeControlFlowModule : CCodeMethodModule {
var it_name = (stmt.variable_name + "_it");
- if (current_method != null && current_method.coroutine) {
+ if (is_in_coroutine ()) {
closure_struct.add_field ("int", it_name);
} else {
ccode.add_declaration ("int", new CCodeVariableDeclarator (it_name));
@@ -276,7 +276,7 @@ public abstract class Vala.CCodeControlFlowModule : CCodeMethodModule {
element_type.value_owned = false;
element_expr = transform_expression (element_expr, element_type, stmt.type_reference);
- if (current_method != null && current_method.coroutine) {
+ if (is_in_coroutine ()) {
closure_struct.add_field (stmt.type_reference.get_cname (), stmt.variable_name);
} else {
ccode.add_declaration (stmt.type_reference.get_cname (), new CCodeVariableDeclarator (stmt.variable_name));
@@ -287,7 +287,7 @@ public abstract class Vala.CCodeControlFlowModule : CCodeMethodModule {
if (stmt.type_reference is ArrayType) {
var inner_array_type = (ArrayType) stmt.type_reference;
for (int dim = 1; dim <= inner_array_type.rank; dim++) {
- if (current_method != null && current_method.coroutine) {
+ if (is_in_coroutine ()) {
closure_struct.add_field ("int", get_array_length_cname (stmt.variable_name, dim));
ccode.add_assignment (get_variable_cexpression (get_array_length_cname (stmt.variable_name, dim)), new CCodeConstant ("-1"));
} else {
@@ -304,7 +304,7 @@ public abstract class Vala.CCodeControlFlowModule : CCodeMethodModule {
var it_name = "%s_it".printf (stmt.variable_name);
- if (current_method != null && current_method.coroutine) {
+ if (is_in_coroutine ()) {
closure_struct.add_field (collection_type.get_cname (), it_name);
} else {
ccode.add_declaration (collection_type.get_cname (), new CCodeVariableDeclarator (it_name));
@@ -329,7 +329,7 @@ public abstract class Vala.CCodeControlFlowModule : CCodeMethodModule {
element_expr = convert_from_generic_pointer (element_expr, element_data_type);
element_expr = transform_expression (element_expr, element_data_type, stmt.type_reference);
- if (current_method != null && current_method.coroutine) {
+ if (is_in_coroutine ()) {
closure_struct.add_field (stmt.type_reference.get_cname (), stmt.variable_name);
} else {
ccode.add_declaration (stmt.type_reference.get_cname (), new CCodeVariableDeclarator (stmt.variable_name));
@@ -344,7 +344,7 @@ public abstract class Vala.CCodeControlFlowModule : CCodeMethodModule {
var arr_index = "%s_index".printf (stmt.variable_name);
- if (current_method != null && current_method.coroutine) {
+ if (is_in_coroutine ()) {
closure_struct.add_field (uint_type.get_cname (), arr_index);
} else {
ccode.add_declaration (uint_type.get_cname (), new CCodeVariableDeclarator (arr_index));
@@ -366,7 +366,7 @@ public abstract class Vala.CCodeControlFlowModule : CCodeMethodModule {
element_expr = get_ref_cexpression (stmt.type_reference, element_expr, null, new StructValueType (gvalue_type));
}
- if (current_method != null && current_method.coroutine) {
+ if (is_in_coroutine ()) {
closure_struct.add_field (stmt.type_reference.get_cname (), stmt.variable_name);
} else {
ccode.add_declaration (stmt.type_reference.get_cname (), new CCodeVariableDeclarator (stmt.variable_name));
diff --git a/codegen/valaccodememberaccessmodule.vala b/codegen/valaccodememberaccessmodule.vala
index bad542dca..6e8d1a372 100644
--- a/codegen/valaccodememberaccessmodule.vala
+++ b/codegen/valaccodememberaccessmodule.vala
@@ -560,7 +560,7 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
result.array_size_cvalue = get_variable_cexpression (get_array_size_cname (get_variable_cname (local.name)));
}
} else if (delegate_type != null && delegate_type.delegate_symbol.has_target) {
- if (current_method != null && current_method.coroutine) {
+ if (is_in_coroutine ()) {
result.delegate_target_cvalue = new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), get_delegate_target_cname (get_variable_cname (local.name)));
result.delegate_target_destroy_notify_cvalue = new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), get_delegate_target_destroy_notify_cname (get_variable_cname (local.name)));
} else {
@@ -578,7 +578,7 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
/* Returns access values to the given parameter */
public TargetValue get_parameter_cvalue (Parameter param) {
var result = new GLibValue (param.variable_type.copy ());
- if (param.captured || current_method != null && current_method.coroutine) {
+ if (param.captured || is_in_coroutine ()) {
result.value_type.value_owned = true;
}
@@ -586,7 +586,7 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
var delegate_type = result.value_type as DelegateType;
if (param.name == "this") {
- if (current_method != null && current_method.coroutine) {
+ if (is_in_coroutine ()) {
// use closure
result.cvalue = new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), "self");
} else {
@@ -615,7 +615,7 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
result.delegate_target_cvalue = new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_delegate_target_cname (get_variable_cname (param.name)));
result.delegate_target_destroy_notify_cvalue = new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_delegate_target_destroy_notify_cname (get_variable_cname (param.name)));
}
- } else if (current_method != null && current_method.coroutine) {
+ } else if (is_in_coroutine ()) {
// use closure
result.cvalue = get_variable_cexpression (param.name);
if (delegate_type != null && delegate_type.delegate_symbol.has_target) {
diff --git a/codegen/valagasyncmodule.vala b/codegen/valagasyncmodule.vala
index 9f78a9861..d4ce037ab 100644
--- a/codegen/valagasyncmodule.vala
+++ b/codegen/valagasyncmodule.vala
@@ -556,7 +556,7 @@ public class Vala.GAsyncModule : GSignalModule {
}
public override void visit_yield_statement (YieldStatement stmt) {
- if (current_method == null || !current_method.coroutine) {
+ if (!is_in_coroutine ()) {
return;
}
@@ -595,7 +595,7 @@ public class Vala.GAsyncModule : GSignalModule {
public override void return_with_exception (CCodeExpression error_expr)
{
- if (!current_method.coroutine) {
+ if (!is_in_coroutine ()) {
base.return_with_exception (error_expr);
return;
}
@@ -617,7 +617,7 @@ public class Vala.GAsyncModule : GSignalModule {
public override void visit_return_statement (ReturnStatement stmt) {
base.visit_return_statement (stmt);
- if (current_method == null || !current_method.coroutine) {
+ if (!is_in_coroutine ()) {
return;
}
diff --git a/codegen/valagerrormodule.vala b/codegen/valagerrormodule.vala
index 7329582d8..0918a20be 100644
--- a/codegen/valagerrormodule.vala
+++ b/codegen/valagerrormodule.vala
@@ -107,7 +107,7 @@ public class Vala.GErrorModule : CCodeDelegateModule {
var unref_call = get_unref_expression (new CCodeIdentifier ("self"), new ObjectType (cl), null);
ccode.add_expression (unref_call);
ccode.add_return (new CCodeConstant ("NULL"));
- } else if (current_method != null && current_method.coroutine) {
+ } else if (is_in_coroutine ()) {
ccode.add_return (new CCodeConstant ("FALSE"));
} else {
return_default_value (current_return_type);
@@ -143,7 +143,7 @@ public class Vala.GErrorModule : CCodeDelegateModule {
} else {
ccode.add_return (new CCodeConstant ("NULL"));
}
- } else if (current_method != null && current_method.coroutine) {
+ } else if (is_in_coroutine ()) {
ccode.add_return (new CCodeConstant ("FALSE"));
} else if (current_return_type != null) {
return_default_value (current_return_type);
@@ -353,7 +353,7 @@ public class Vala.GErrorModule : CCodeDelegateModule {
}
if (clause.variable_name != null) {
- if (current_method != null && current_method.coroutine) {
+ if (is_in_coroutine ()) {
closure_struct.add_field ("GError *", variable_name);
} else {
ccode.add_declaration ("GError *", new CCodeVariableDeclarator (variable_name));