return "%s_length%d".printf (array_cname, dim);
}
+ public override string get_parameter_array_length_cname (FormalParameter param, int dim) {
+ if (param.has_array_length_cname) {
+ return param.get_array_length_cname ();
+ } else {
+ return get_array_length_cname (get_variable_cname (param.name), dim);
+ }
+ }
+
public override CCodeExpression get_array_length_cexpression (Expression array_expr, int dim = -1) {
var array_type = array_expr.value_type as ArrayType;
if (param.captured) {
// captured variables are stored on the heap
var block = ((Method) param.parent_symbol).body;
- var length_expr = new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_array_length_cname (get_variable_cname (param.name), dim));
+ var length_expr = new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (get_block_id (block))), get_parameter_array_length_cname (param, dim));
if (is_out) {
// passing array as out/ref
return new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, length_expr);
len_call.add_argument (carray_expr);
return len_call;
} else if (!param.no_array_length) {
- CCodeExpression length_expr = get_variable_cexpression (get_array_length_cname (get_variable_cname (param.name), dim));
+ CCodeExpression length_expr = get_variable_cexpression (get_parameter_array_length_cname (param, dim));
if (param.direction != ParameterDirection.IN) {
// accessing argument of out/ref param
length_expr = new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, length_expr);
}
for (int dim = 1; dim <= array_type.rank; dim++) {
- var cparam = new CCodeFormalParameter (get_array_length_cname (get_variable_cname (param.name), dim), length_ctype);
+ var cparam = new CCodeFormalParameter (get_parameter_array_length_cname (param, dim), length_ctype);
cparam_map.set (get_param_pos (param.carray_length_parameter_position + 0.01 * dim), cparam);
if (carg_map != null) {
carg_map.set (get_param_pos (param.carray_length_parameter_position + 0.01 * dim), get_variable_cexpression (cparam.name));
if (param.variable_type is ArrayType) {
var array_type = (ArrayType) param.variable_type;
for (int dim = 1; dim <= array_type.rank; dim++) {
- data.add_field ("gint", get_array_length_cname (get_variable_cname (param.name), dim));
- cblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (block_id)), get_array_length_cname (get_variable_cname (param.name), dim)), new CCodeIdentifier (get_array_length_cname (get_variable_cname (param.name), dim)))));
+ data.add_field ("gint", get_parameter_array_length_cname (param, dim));
+ cblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (get_variable_cexpression ("_data%d_".printf (block_id)), get_parameter_array_length_cname (param, dim)), new CCodeIdentifier (get_parameter_array_length_cname (param, dim)))));
}
} else if (param.variable_type is DelegateType) {
data.add_field ("gpointer", get_delegate_target_cname (get_variable_cname (param.name)));
return "";
}
+ public virtual string get_parameter_array_length_cname (FormalParameter param, int dim) {
+ return "";
+ }
+
public virtual CCodeExpression get_array_length_cexpression (Expression array_expr, int dim = -1) {
return new CCodeConstant ("");
}
}
for (int dim = 1; dim <= array_type.rank; dim++) {
- var cparam = new CCodeFormalParameter (get_array_length_cname (get_variable_cname (param.name), dim), length_ctype);
+ var cparam = new CCodeFormalParameter (get_parameter_array_length_cname (param, dim), length_ctype);
cfundecl.add_parameter (cparam);
}
}
} else if (d_params.get (i).no_array_length) {
clength = new CCodeConstant ("-1");
} else {
- clength = new CCodeIdentifier (get_array_length_cname (d_params.get (i).name, dim));
+ clength = new CCodeIdentifier (get_parameter_array_length_cname (d_params.get (i), dim));
}
carg_map.set (get_param_pos (param.carray_length_parameter_position + 0.01 * dim), clength);
}
cdecl = new CCodeDeclaration ("GPtrArray*");
array_construct = new CCodeFunctionCall (new CCodeIdentifier ("g_ptr_array_sized_new"));
- array_construct.add_argument (new CCodeIdentifier (get_array_length_cname (param.name, 1)));
+ array_construct.add_argument (new CCodeIdentifier (get_parameter_array_length_cname (param, 1)));
} else {
cdecl = new CCodeDeclaration ("GArray*");
var memcpy_call = new CCodeFunctionCall (new CCodeIdentifier ("memcpy"));
memcpy_call.add_argument (new CCodeMemberAccess.pointer (new CCodeIdentifier ("dbus_%s".printf (param.name)), "pdata"));
memcpy_call.add_argument (new CCodeIdentifier (param.name));
- memcpy_call.add_argument (new CCodeBinaryExpression (CCodeBinaryOperator.MUL, new CCodeIdentifier (get_array_length_cname (param.name, 1)), sizeof_call));
+ memcpy_call.add_argument (new CCodeBinaryExpression (CCodeBinaryOperator.MUL, new CCodeIdentifier (get_parameter_array_length_cname (param, 1)), sizeof_call));
block.add_statement (new CCodeExpressionStatement (memcpy_call));
- var len_assignment = new CCodeAssignment (new CCodeMemberAccess.pointer (new CCodeIdentifier ("dbus_%s".printf (param.name)), "len"), new CCodeIdentifier (get_array_length_cname (param.name, 1)));
+ var len_assignment = new CCodeAssignment (new CCodeMemberAccess.pointer (new CCodeIdentifier ("dbus_%s".printf (param.name)), "len"), new CCodeIdentifier (get_parameter_array_length_cname (param, 1)));
block.add_statement (new CCodeExpressionStatement (len_assignment));
} else {
var cappend_call = new CCodeFunctionCall (new CCodeIdentifier ("g_array_append_vals"));
cappend_call.add_argument (new CCodeIdentifier ("dbus_%s".printf (param.name)));
cappend_call.add_argument (new CCodeIdentifier (param.name));
- cappend_call.add_argument (new CCodeIdentifier (get_array_length_cname (param.name, 1)));
+ cappend_call.add_argument (new CCodeIdentifier (get_parameter_array_length_cname (param, 1)));
block.add_statement (new CCodeExpressionStatement (cappend_call));
}
var array_type = (ArrayType) param.variable_type;
for (int dim = 1; dim <= array_type.rank; dim++) {
- string length_cname = get_array_length_cname (param.name, dim);
+ string length_cname = get_parameter_array_length_cname (param, dim);
cdecl = new CCodeDeclaration ("int");
cdecl.add_declarator (new CCodeVariableDeclarator (length_cname, new CCodeConstant ("0")));
var array_type = (ArrayType) param.variable_type;
for (int dim = 1; dim <= array_type.rank; dim++) {
- string length_cname = get_array_length_cname (param.name, dim);
+ string length_cname = get_parameter_array_length_cname (param, dim);
cdecl = new CCodeDeclaration ("int");
cdecl.add_declarator (new CCodeVariableDeclarator (length_cname, new CCodeConstant ("0")));
if (param.variable_type is ArrayType) {
var array_type = (ArrayType) param.variable_type;
for (int dim = 1; dim <= array_type.rank; dim++) {
- function.add_parameter (new CCodeFormalParameter (get_array_length_cname (param.name, dim), "int"));
+ function.add_parameter (new CCodeFormalParameter (get_parameter_array_length_cname (param, dim), "int"));
}
}
}
var array_type = (ArrayType) param.variable_type;
if (!param.no_array_length) {
for (int dim = 1; dim <= array_type.rank; dim++) {
- data.add_field ("gint", get_array_length_cname (get_variable_cname (param.name), dim));
+ data.add_field ("gint", get_parameter_array_length_cname (param, dim));
}
}
} else if (param.variable_type is DelegateType) {
var array_type = (ArrayType) param.variable_type;
if (!param.no_array_length) {
for (int dim = 1; dim <= array_type.rank; dim++) {
- asyncblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (data_var, get_array_length_cname (get_variable_cname (param.name), dim)), new CCodeIdentifier (get_array_length_cname (get_variable_cname (param.name), dim)))));
+ asyncblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (data_var, get_parameter_array_length_cname (param, dim)), new CCodeIdentifier (get_parameter_array_length_cname (param, dim)))));
}
}
} else if (param.variable_type is DelegateType) {
var array_type = (ArrayType) param.variable_type;
for (int dim = 1; dim <= array_type.rank; dim++) {
- string length_cname = get_array_length_cname (param.name, dim);
+ string length_cname = get_parameter_array_length_cname (param, dim);
cdecl = new CCodeDeclaration ("int");
cdecl.add_declarator (new CCodeVariableDeclarator (length_cname, new CCodeConstant ("0")));
var array_type = (ArrayType) param.variable_type;
for (int dim = 1; dim <= array_type.rank; dim++) {
- string length_cname = get_array_length_cname (param.name, dim);
+ string length_cname = get_parameter_array_length_cname (param, dim);
cdecl = new CCodeDeclaration ("int");
cdecl.add_declarator (new CCodeVariableDeclarator (length_cname, new CCodeConstant ("0")));
if (param.variable_type is ArrayType) {
var array_type = (ArrayType) param.variable_type;
for (int dim = 1; dim <= array_type.rank; dim++) {
- function.add_parameter (new CCodeFormalParameter (get_array_length_cname (param.name, dim), "int"));
+ function.add_parameter (new CCodeFormalParameter (get_parameter_array_length_cname (param, dim), "int"));
}
}
}
ccode_params.append_printf ("%sarray_length_type = \"%s\"", separator, param.array_length_type);
separator = ", ";
}
+ if (param.get_array_length_cname () != null && param.variable_type is ArrayType) {
+ ccode_params.append_printf ("%sarray_length_cname = \"%s\"", separator, param.get_array_length_cname ());
+ separator = ", ";
+ }
if (!float_equal (param.carray_length_parameter_position, i + 0.1)) {
ccode_params.append_printf ("%sarray_length_pos = %g", separator, param.carray_length_parameter_position);
separator = ", ";
*/
public bool array_null_terminated { get; set; }
+ /**
+ * Specifies whether the array length parameter uses a custom name in C.
+ */
+ public bool has_array_length_cname {
+ get { return (array_length_cname != null); }
+ }
+
/**
* Specifies a custom type for the array length.
*/
public bool captured { get; set; }
+ private string? array_length_cname;
+
/**
* Creates a new formal parameter.
*
}
}
+ /**
+ * Returns the name of the array length parameter as it is used in C code
+ *
+ * @return the name of the array length parameter to be used in C code
+ */
+ public string? get_array_length_cname () {
+ return this.array_length_cname;
+ }
+
+ /**
+ * Sets the name of the array length parameter as it is used in C code
+ *
+ * @param array_length_cname the name of the array length parameter to be
+ * used in C code
+ */
+ public void set_array_length_cname (string? array_length_cname) {
+ this.array_length_cname = array_length_cname;
+ }
+
private void process_ccode_attribute (Attribute a) {
if (a.has_argument ("type")) {
ctype = a.get_string ("type");
if (a.has_argument ("array_length_pos")) {
carray_length_parameter_position = a.get_double ("array_length_pos");
}
+ if (a.has_argument ("array_length_cname")) {
+ set_array_length_cname (a.get_string ("array_length_cname"));
+ }
if (a.has_argument ("delegate_target_pos")) {
cdelegate_target_parameter_position = a.get_double ("delegate_target_pos");
}