[vala] codegen: Move array length handling to load_variable
- From: Jürg Billeter <juergbi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala] codegen: Move array length handling to load_variable
- Date: Tue, 15 Feb 2011 15:14:02 +0000 (UTC)
commit 7722f1fed70e25190d7aa7d40122bc1704e930e5
Author: Jürg Billeter <j bitron ch>
Date: Tue Feb 15 16:04:47 2011 +0100
codegen: Move array length handling to load_variable
codegen/valaccodememberaccessmodule.vala | 63 +++++++++++++++--------------
1 files changed, 33 insertions(+), 30 deletions(-)
---
diff --git a/codegen/valaccodememberaccessmodule.vala b/codegen/valaccodememberaccessmodule.vala
index f1937c2..640d2ac 100644
--- a/codegen/valaccodememberaccessmodule.vala
+++ b/codegen/valaccodememberaccessmodule.vala
@@ -680,7 +680,37 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
}
TargetValue load_variable (Variable variable, TargetValue value) {
- return value;
+ var result = (GLibValue) value;
+ var array_type = result.value_type as ArrayType;
+ if (array_type != null) {
+ if (variable.array_null_terminated) {
+ requires_array_length = true;
+ var len_call = new CCodeFunctionCall (new CCodeIdentifier ("_vala_array_length"));
+ len_call.add_argument (result.cvalue);
+
+ result.array_length_cvalues = null;
+ result.append_array_length_cvalue (len_call);
+ } else if (variable.has_array_length_cexpr) {
+ var length_expr = new CCodeConstant (variable.get_array_length_cexpr ());
+
+ result.array_length_cvalues = null;
+ result.append_array_length_cvalue (length_expr);
+ } else if (variable.no_array_length) {
+ result.array_length_cvalues = null;
+ for (int dim = 1; dim <= array_type.rank; dim++) {
+ result.append_array_length_cvalue (new CCodeConstant ("-1"));
+ }
+ } else if (variable.array_length_type != null) {
+ for (int dim = 1; dim <= array_type.rank; dim++) {
+ // cast if variable does not use int for array length
+ result.array_length_cvalues[dim - 1] = new CCodeCastExpression (result.array_length_cvalues[dim - 1], "gint");
+ }
+ }
+ } else if (result.value_type is DelegateType) {
+ result.delegate_target_destroy_notify_cvalue = new CCodeConstant ("NULL");
+ }
+ result.value_type.value_owned = false;
+ return result;
}
/* Returns lvalue access to the given symbol */
@@ -696,38 +726,11 @@ public abstract class Vala.CCodeMemberAccessModule : CCodeControlFlowModule {
/* Returns unowned access to the given local variable */
public override TargetValue load_local (LocalVariable local) {
- var result = (GLibValue) get_local_cvalue (local);
- if (local.variable_type is DelegateType) {
- result.delegate_target_destroy_notify_cvalue = new CCodeConstant ("NULL");
- }
- result.value_type.value_owned = false;
- return load_variable (local, result);
+ return load_variable (local, get_local_cvalue (local));
}
/* Returns unowned access to the given parameter */
public override TargetValue load_parameter (Parameter param) {
- var result = (GLibValue) get_parameter_cvalue (param);
- if (result.value_type is DelegateType) {
- result.delegate_target_destroy_notify_cvalue = new CCodeConstant ("NULL");
- }
- if (result.value_type is ArrayType) {
- if (param.array_null_terminated) {
- string name = param.name;
- if (param.direction == ParameterDirection.OUT) {
- name = "_" + name;
- }
- var carray_expr = get_variable_cexpression (name);
- requires_array_length = true;
- var len_call = new CCodeFunctionCall (new CCodeIdentifier ("_vala_array_length"));
- len_call.add_argument (carray_expr);
- result.append_array_length_cvalue (len_call);
- } else if (param.no_array_length) {
- for (int dim = 1; dim <= ((ArrayType) result.value_type).rank; dim++) {
- result.append_array_length_cvalue (new CCodeConstant ("-1"));
- }
- }
- }
- result.value_type.value_owned = false;
- return load_variable (param, result);
+ return load_variable (param, get_parameter_cvalue (param));
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]