public virtual void generate_error_domain_declaration (ErrorDomain edomain, CCodeDeclarationSpace decl_space) {
}
- public void add_generic_type_arguments (CCodeFunctionCall ccall, Gee.List<DataType> type_args, CodeNode expr, bool is_chainup = false) {
+ public void add_generic_type_arguments (Map<int,CCodeExpression> arg_map, Gee.List<DataType> type_args, CodeNode expr, bool is_chainup = false) {
+ int type_param_index = 0;
foreach (var type_arg in type_args) {
- ccall.add_argument (get_type_id_expression (type_arg, is_chainup));
+ arg_map.set (get_param_pos (0.1 * type_param_index + 0.01), get_type_id_expression (type_arg, is_chainup));
if (requires_copy (type_arg)) {
var dup_func = get_dup_func_expression (type_arg, type_arg.source_reference, is_chainup);
if (dup_func == null) {
expr.error = true;
return;
}
- ccall.add_argument (new CCodeCastExpression (dup_func, "GBoxedCopyFunc"));
- ccall.add_argument (get_destroy_func_expression (type_arg, is_chainup));
+ arg_map.set (get_param_pos (0.1 * type_param_index + 0.02), new CCodeCastExpression (dup_func, "GBoxedCopyFunc"));
+ arg_map.set (get_param_pos (0.1 * type_param_index + 0.03), get_destroy_func_expression (type_arg, is_chainup));
} else {
- ccall.add_argument (new CCodeConstant ("NULL"));
- ccall.add_argument (new CCodeConstant ("NULL"));
+ arg_map.set (get_param_pos (0.1 * type_param_index + 0.02), new CCodeConstant ("NULL"));
+ arg_map.set (get_param_pos (0.1 * type_param_index + 0.03), new CCodeConstant ("NULL"));
}
+ type_param_index++;
}
}
generate_type_declaration (expr.type_reference, source_declarations);
+ var carg_map = new HashMap<int,CCodeExpression> (direct_hash, direct_equal);
+
if (cl != null && !cl.is_compact) {
- add_generic_type_arguments (creation_call, expr.type_reference.get_type_arguments (), expr);
+ add_generic_type_arguments (carg_map, expr.type_reference.get_type_arguments (), expr);
}
- var carg_map = new HashMap<int,CCodeExpression> (direct_hash, direct_equal);
-
bool ellipsis = false;
int i = 1;
foreach (DataType base_type in current_class.get_base_types ()) {
if (base_type.data_type is Class) {
- add_generic_type_arguments (ccall, base_type.get_type_arguments (), expr, true);
+ add_generic_type_arguments (in_arg_map, base_type.get_type_arguments (), expr, true);
break;
}
}
} else if (m != null && m.get_type_parameters ().size > 0) {
// generic method
- add_generic_type_arguments (ccall, ma.get_type_arguments (), expr);
+ add_generic_type_arguments (in_arg_map, ma.get_type_arguments (), expr);
}
// the complete call expression, might include casts, comma expressions, and/or assignments