vala r2398 - in trunk: . ccode gobject
- From: juergbi svn gnome org
- To: svn-commits-list gnome org
- Subject: vala r2398 - in trunk: . ccode gobject
- Date: Fri, 23 Jan 2009 16:28:52 +0000 (UTC)
Author: juergbi
Date: Fri Jan 23 16:28:52 2009
New Revision: 2398
URL: http://svn.gnome.org/viewvc/vala?rev=2398&view=rev
Log:
2009-01-23 JÃrg Billeter <j bitron ch>
* ccode/valaccodefunction.vala:
* gobject/valaccodebasemodule.vala:
* gobject/valaccodemethodmodule.vala:
* gobject/valaccodemodule.vala:
* gobject/valadbusclientmodule.vala:
* gobject/valagasyncmodule.vala:
* gobject/valagobjectmodule.vala:
Refactor method parameter and result code generation
Modified:
trunk/ChangeLog
trunk/ccode/valaccodefunction.vala
trunk/gobject/valaccodebasemodule.vala
trunk/gobject/valaccodemethodmodule.vala
trunk/gobject/valaccodemodule.vala
trunk/gobject/valadbusclientmodule.vala
trunk/gobject/valagasyncmodule.vala
trunk/gobject/valagobjectmodule.vala
Modified: trunk/ccode/valaccodefunction.vala
==============================================================================
--- trunk/ccode/valaccodefunction.vala (original)
+++ trunk/ccode/valaccodefunction.vala Fri Jan 23 16:28:52 2009
@@ -1,6 +1,6 @@
/* valaccodefunction.vala
*
- * Copyright (C) 2006-2007 JÃrg Billeter
+ * Copyright (C) 2006-2009 JÃrg Billeter
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -49,9 +49,9 @@
private Gee.List<CCodeFormalParameter> parameters = new ArrayList<CCodeFormalParameter> ();
- public CCodeFunction (string name, string return_type) {
- this.return_type = return_type;
+ public CCodeFunction (string name, string return_type = "void") {
this.name = name;
+ this.return_type = return_type;
}
/**
Modified: trunk/gobject/valaccodebasemodule.vala
==============================================================================
--- trunk/gobject/valaccodebasemodule.vala (original)
+++ trunk/gobject/valaccodebasemodule.vala Fri Jan 23 16:28:52 2009
@@ -3648,8 +3648,12 @@
var cnonnull = new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, new CCodeIdentifier (var_name), new CCodeConstant ("NULL"));
ccheck.add_argument (cnonnull);
}
-
- if (ret_type is VoidType) {
+
+ var cm = method_node as CreationMethod;
+ if (cm != null && cm.parent_symbol is ObjectTypeSymbol) {
+ ccheck.call = new CCodeIdentifier ("g_return_val_if_fail");
+ ccheck.add_argument (new CCodeConstant ("NULL"));
+ } else if (ret_type is VoidType) {
/* void function */
ccheck.call = new CCodeIdentifier ("g_return_if_fail");
} else {
Modified: trunk/gobject/valaccodemethodmodule.vala
==============================================================================
--- trunk/gobject/valaccodemethodmodule.vala (original)
+++ trunk/gobject/valaccodemethodmodule.vala Fri Jan 23 16:28:52 2009
@@ -55,6 +55,62 @@
return type;
}
+ bool is_gtypeinstance_creation_method (Method m) {
+ bool result = false;
+
+ var cl = m.parent_symbol as Class;
+ if (m is CreationMethod && cl != null && !cl.is_compact) {
+ result = true;
+ }
+
+ return result;
+ }
+
+ public virtual void generate_method_result_declaration (Method m, CCodeFunction cfunc, Map<int,CCodeFormalParameter> cparam_map, Map<int,CCodeExpression>? carg_map) {
+ var creturn_type = m.return_type;
+ if (m is CreationMethod) {
+ var cl = current_type_symbol as Class;
+ if (cl != null) {
+ // object creation methods return the new object in C
+ // in Vala they have no return type
+ creturn_type = new ObjectType (cl);
+ }
+ }
+ cfunc.return_type = get_creturn_type (m, creturn_type.get_cname ());
+
+ if (!m.no_array_length && m.return_type is ArrayType) {
+ // return array length if appropriate
+ var array_type = (ArrayType) m.return_type;
+
+ for (int dim = 1; dim <= array_type.rank; dim++) {
+ var cparam = new CCodeFormalParameter (head.get_array_length_cname ("result", dim), "int*");
+ cparam_map.set (get_param_pos (m.carray_length_parameter_position + 0.01 * dim), cparam);
+ if (carg_map != null) {
+ carg_map.set (get_param_pos (m.carray_length_parameter_position + 0.01 * dim), new CCodeIdentifier (cparam.name));
+ }
+ }
+ } else if (m.return_type is DelegateType) {
+ // return delegate target if appropriate
+ var deleg_type = (DelegateType) m.return_type;
+ var d = deleg_type.delegate_symbol;
+ if (d.has_target) {
+ var cparam = new CCodeFormalParameter (get_delegate_target_cname ("result"), "void*");
+ cparam_map.set (get_param_pos (m.cdelegate_target_parameter_position), cparam);
+ if (carg_map != null) {
+ carg_map.set (get_param_pos (m.cdelegate_target_parameter_position), new CCodeIdentifier (cparam.name));
+ }
+ }
+ }
+
+ if (m.get_error_types ().size > 0) {
+ var cparam = new CCodeFormalParameter ("error", "GError**");
+ cparam_map.set (get_param_pos (-1), cparam);
+ if (carg_map != null) {
+ carg_map.set (get_param_pos (-1), new CCodeIdentifier (cparam.name));
+ }
+ }
+ }
+
public override void visit_method (Method m) {
var old_type_symbol = current_type_symbol;
var old_symbol = current_symbol;
@@ -76,7 +132,6 @@
variable_name_map = new HashMap<string,string> (str_hash, str_equal);
current_try = null;
- bool in_gtypeinstance_creation_method = false;
bool in_gobject_creation_method = false;
bool in_fundamental_creation_method = false;
@@ -86,17 +141,12 @@
in_creation_method = true;
var cl = current_type_symbol as Class;
if (cl != null && !cl.is_compact) {
- in_gtypeinstance_creation_method = true;
if (cl.base_class == null) {
in_fundamental_creation_method = true;
} else if (cl.is_subtype_of (gobject_type)) {
in_gobject_creation_method = true;
}
}
-
- if (cl != null) {
- current_return_type = new ObjectType (cl);
- }
} else {
in_creation_method = false;
}
@@ -170,7 +220,7 @@
variable_name_map = old_variable_name_map;
current_try = old_try;
- function = new CCodeFunction (m.get_real_cname (), get_creturn_type (m, creturn_type.get_cname ()));
+ function = new CCodeFunction (m.get_real_cname ());
m.ccodenode = function;
if (m.is_inline) {
@@ -187,7 +237,7 @@
type_struct.add_declaration (vdecl);
}
- generate_cparameters (m, creturn_type, in_gtypeinstance_creation_method, cparam_map, function, vdeclarator);
+ generate_cparameters (m, cparam_map, function, vdeclarator);
bool visible = !m.is_internal_symbol ();
@@ -362,7 +412,7 @@
param_name = new CCodeIdentifier ("%s_destroy_func".printf (type_param.name.down ()));
cinit.append (new CCodeExpressionStatement (get_construct_property_assignment (prop_name, new PointerType (new VoidType ()), param_name)));
}
- } else if (in_gtypeinstance_creation_method) {
+ } else if (is_gtypeinstance_creation_method (m)) {
var cl = (Class) m.parent_symbol;
var cdeclaration = new CCodeDeclaration (cl.get_cname () + "*");
var cdecl = new CCodeVariableDeclarator ("self");
@@ -522,7 +572,7 @@
}
}
- public override void generate_cparameters (Method m, DataType creturn_type, bool in_gtypeinstance_creation_method, Map<int,CCodeFormalParameter> cparam_map, CCodeFunction func, CCodeFunctionDeclarator? vdeclarator = null, Map<int,CCodeExpression>? carg_map = null, CCodeFunctionCall? vcall = null, int direction = 3) {
+ public override void generate_cparameters (Method m, Map<int,CCodeFormalParameter> cparam_map, CCodeFunction func, CCodeFunctionDeclarator? vdeclarator = null, Map<int,CCodeExpression>? carg_map = null, CCodeFunctionCall? vcall = null, int direction = 3) {
if (m.parent_symbol is Class && m is CreationMethod) {
var cl = (Class) m.parent_symbol;
if (!cl.is_compact && vcall == null) {
@@ -566,7 +616,7 @@
cparam_map.set (get_param_pos (m.cinstance_parameter_position), class_param);
}
- if (in_gtypeinstance_creation_method) {
+ if (is_gtypeinstance_creation_method (m)) {
// memory management for generic types
int type_param_index = 0;
foreach (TypeParameter type_param in current_class.get_type_parameters ()) {
@@ -599,37 +649,7 @@
}
if ((direction & 2) != 0) {
- if (!m.no_array_length && creturn_type is ArrayType) {
- // return array length if appropriate
- var array_type = (ArrayType) creturn_type;
-
- for (int dim = 1; dim <= array_type.rank; dim++) {
- var cparam = new CCodeFormalParameter (head.get_array_length_cname ("result", dim), "int*");
- cparam_map.set (get_param_pos (m.carray_length_parameter_position + 0.01 * dim), cparam);
- if (carg_map != null) {
- carg_map.set (get_param_pos (m.carray_length_parameter_position + 0.01 * dim), new CCodeIdentifier (cparam.name));
- }
- }
- } else if (creturn_type is DelegateType) {
- // return delegate target if appropriate
- var deleg_type = (DelegateType) creturn_type;
- var d = deleg_type.delegate_symbol;
- if (d.has_target) {
- var cparam = new CCodeFormalParameter (get_delegate_target_cname ("result"), "void*");
- cparam_map.set (get_param_pos (m.cdelegate_target_parameter_position), cparam);
- if (carg_map != null) {
- carg_map.set (get_param_pos (m.cdelegate_target_parameter_position), new CCodeIdentifier (cparam.name));
- }
- }
- }
-
- if (m.get_error_types ().size > 0) {
- var cparam = new CCodeFormalParameter ("error", "GError**");
- cparam_map.set (get_param_pos (-1), cparam);
- if (carg_map != null) {
- carg_map.set (get_param_pos (-1), new CCodeIdentifier (cparam.name));
- }
- }
+ generate_method_result_declaration (m, func, cparam_map, carg_map);
}
// append C parameters in the right order
@@ -659,7 +679,7 @@
public void generate_vfunc (Method m, DataType return_type, Map<int,CCodeFormalParameter> cparam_map, Map<int,CCodeExpression> carg_map, string suffix = "", int direction = 3) {
bool visible = !m.is_internal_symbol ();
- var vfunc = new CCodeFunction (m.get_cname () + suffix, return_type.get_cname ());
+ var vfunc = new CCodeFunction (m.get_cname () + suffix);
vfunc.line = function.line;
var vblock = new CCodeBlock ();
@@ -686,7 +706,7 @@
var vcall = new CCodeFunctionCall (new CCodeMemberAccess.pointer (vcast, m.vfunc_name + suffix));
carg_map.set (get_param_pos (m.cinstance_parameter_position), new CCodeIdentifier ("self"));
- generate_cparameters (m, return_type, false, cparam_map, vfunc, null, carg_map, vcall, direction);
+ generate_cparameters (m, cparam_map, vfunc, null, carg_map, vcall, direction);
CCodeStatement cstmt;
if (return_type is VoidType) {
@@ -849,7 +869,7 @@
}
if (current_type_symbol is Class && !current_class.is_compact) {
- var vfunc = new CCodeFunction (m.get_cname (), creturn_type.get_cname ());
+ var vfunc = new CCodeFunction (m.get_cname ());
vfunc.line = function.line;
var cparam_map = new HashMap<int,CCodeFormalParameter> (direct_hash, direct_equal);
@@ -860,7 +880,7 @@
var vcall = new CCodeFunctionCall (new CCodeIdentifier (m.get_real_cname ()));
vcall.add_argument (new CCodeIdentifier (current_class.get_type_id ()));
- generate_cparameters (m, creturn_type, true, cparam_map, vfunc, null, carg_map, vcall);
+ generate_cparameters (m, cparam_map, vfunc, null, carg_map, vcall);
CCodeStatement cstmt = new CCodeReturnStatement (vcall);
cstmt.line = vfunc.line;
vblock.add_statement (cstmt);
Modified: trunk/gobject/valaccodemodule.vala
==============================================================================
--- trunk/gobject/valaccodemodule.vala (original)
+++ trunk/gobject/valaccodemodule.vala Fri Jan 23 16:28:52 2009
@@ -332,8 +332,8 @@
next.visit_assignment (a);
}
- public virtual void generate_cparameters (Method m, DataType creturn_type, bool in_gtypeinstance_creation_method, Map<int,CCodeFormalParameter> cparam_map, CCodeFunction func, CCodeFunctionDeclarator? vdeclarator = null, Map<int,CCodeExpression>? carg_map = null, CCodeFunctionCall? vcall = null, int direction = 3) {
- next.generate_cparameters (m, creturn_type, in_gtypeinstance_creation_method, cparam_map, func, vdeclarator, carg_map, vcall, direction);
+ public virtual void generate_cparameters (Method m, Map<int,CCodeFormalParameter> cparam_map, CCodeFunction func, CCodeFunctionDeclarator? vdeclarator = null, Map<int,CCodeExpression>? carg_map = null, CCodeFunctionCall? vcall = null, int direction = 3) {
+ next.generate_cparameters (m, cparam_map, func, vdeclarator, carg_map, vcall, direction);
}
public virtual string? get_custom_creturn_type (Method m) {
Modified: trunk/gobject/valadbusclientmodule.vala
==============================================================================
--- trunk/gobject/valadbusclientmodule.vala (original)
+++ trunk/gobject/valadbusclientmodule.vala Fri Jan 23 16:28:52 2009
@@ -48,11 +48,11 @@
public override void generate_dynamic_method_wrapper (DynamicMethod method) {
var dynamic_method = (DynamicMethod) method;
- var func = new CCodeFunction (method.get_cname (), method.return_type.get_cname ());
+ var func = new CCodeFunction (method.get_cname ());
var cparam_map = new HashMap<int,CCodeFormalParameter> (direct_hash, direct_equal);
- generate_cparameters (method, method.return_type, false, cparam_map, func);
+ generate_cparameters (method, cparam_map, func);
var block = new CCodeBlock ();
if (dynamic_method.dynamic_type.data_type == dbus_object_type) {
@@ -1039,12 +1039,12 @@
CCodeDeclaration cdecl;
- var function = new CCodeFunction (proxy_name, m.return_type.get_cname ());
+ var function = new CCodeFunction (proxy_name);
function.modifiers = CCodeModifiers.STATIC;
var cparam_map = new HashMap<int,CCodeFormalParameter> (direct_hash, direct_equal);
- generate_cparameters (m, m.return_type, false, cparam_map, function);
+ generate_cparameters (m, cparam_map, function);
var block = new CCodeBlock ();
var prefragment = new CCodeFragment ();
@@ -1140,7 +1140,7 @@
cparam_map.set (get_param_pos (-1), new CCodeFormalParameter ("callback", "GAsyncReadyCallback"));
cparam_map.set (get_param_pos (-0.9), new CCodeFormalParameter ("user_data", "gpointer"));
- generate_cparameters (m, m.return_type, false, cparam_map, function, null, null, null, 1);
+ generate_cparameters (m, cparam_map, function, null, null, null, 1);
var block = new CCodeBlock ();
var prefragment = new CCodeFragment ();
@@ -1261,14 +1261,14 @@
CCodeDeclaration cdecl;
- var function = new CCodeFunction (proxy_name, m.return_type.get_cname ());
+ var function = new CCodeFunction (proxy_name);
function.modifiers = CCodeModifiers.STATIC;
var cparam_map = new HashMap<int,CCodeFormalParameter> (direct_hash, direct_equal);
cparam_map.set (get_param_pos (0.1), new CCodeFormalParameter ("res", "GAsyncResult*"));
- generate_cparameters (m, m.return_type, false, cparam_map, function, null, null, null, 2);
+ generate_cparameters (m, cparam_map, function, null, null, null, 2);
var block = new CCodeBlock ();
var prefragment = new CCodeFragment ();
Modified: trunk/gobject/valagasyncmodule.vala
==============================================================================
--- trunk/gobject/valagasyncmodule.vala (original)
+++ trunk/gobject/valagasyncmodule.vala Fri Jan 23 16:28:52 2009
@@ -1,6 +1,6 @@
/* valagasyncmodule.vala
*
- * Copyright (C) 2008 JÃrg Billeter
+ * Copyright (C) 2008-2009 JÃrg Billeter
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -110,7 +110,7 @@
type_struct.add_declaration (vdecl);
}
- generate_cparameters (m, creturn_type, false, cparam_map, asyncfunc, vdeclarator, null, null, 1);
+ generate_cparameters (m, cparam_map, asyncfunc, vdeclarator, null, null, 1);
if (!m.is_abstract) {
if (visible && m.base_method == null && m.base_interface_method == null) {
@@ -126,7 +126,7 @@
}
// generate finish function
- var finishfunc = new CCodeFunction (m.get_real_cname () + "_finish", creturn_type.get_cname ());
+ var finishfunc = new CCodeFunction (m.get_real_cname () + "_finish");
finishfunc.line = function.line;
cparam_map = new HashMap<int,CCodeFormalParameter> (direct_hash, direct_equal);
@@ -142,7 +142,7 @@
type_struct.add_declaration (vdecl);
}
- generate_cparameters (m, creturn_type, false, cparam_map, finishfunc, vdeclarator, null, null, 2);
+ generate_cparameters (m, cparam_map, finishfunc, vdeclarator, null, null, 2);
if (!m.is_abstract) {
if (visible && m.base_method == null && m.base_interface_method == null) {
Modified: trunk/gobject/valagobjectmodule.vala
==============================================================================
--- trunk/gobject/valagobjectmodule.vala (original)
+++ trunk/gobject/valagobjectmodule.vala Fri Jan 23 16:28:52 2009
@@ -1,6 +1,7 @@
/* valagobjectmodule.vala
*
- * Copyright (C) 2006-2008 JÃrg Billeter, Raffaele Sandrini
+ * Copyright (C) 2006-2009 JÃrg Billeter
+ * Copyright (C) 2006-2008 Raffaele Sandrini
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
@@ -21,7 +22,7 @@
* Raffaele Sandrini <raffaele sandrini ch>
*/
-using GLib;
+using Gee;
public class Vala.GObjectModule : GTypeModule {
int dynamic_property_id;
@@ -31,6 +32,18 @@
base (codegen, next);
}
+ public override void generate_parameter (FormalParameter param, Map<int,CCodeFormalParameter> cparam_map, Map<int,CCodeExpression>? carg_map) {
+ if (!(param.parameter_type is ObjectType)) {
+ base.generate_parameter (param, cparam_map, carg_map);
+ return;
+ }
+
+ cparam_map.set (get_param_pos (param.cparameter_position), (CCodeFormalParameter) param.ccodenode);
+ if (carg_map != null) {
+ carg_map.set (get_param_pos (param.cparameter_position), new CCodeIdentifier (param.name));
+ }
+ }
+
public override void visit_class (Class cl) {
var old_symbol = current_symbol;
var old_type_symbol = current_type_symbol;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]