vala r2056 - in trunk: . gobject vala
- From: juergbi svn gnome org
- To: svn-commits-list gnome org
- Subject: vala r2056 - in trunk: . gobject vala
- Date: Fri, 21 Nov 2008 22:28:07 +0000 (UTC)
Author: juergbi
Date: Fri Nov 21 22:28:07 2008
New Revision: 2056
URL: http://svn.gnome.org/viewvc/vala?rev=2056&view=rev
Log:
2008-11-21 JÃrg Billeter <j bitron ch>
* vala/valamethod.vala:
* gobject/valaccodemethodcallmodule.vala:
* gobject/valaccodemethodmodule.vala:
* gobject/valadbusclientmodule.vala:
* gobject/valagasyncmodule.vala:
Various coroutine code generation improvements
Modified:
trunk/ChangeLog
trunk/gobject/valaccodemethodcallmodule.vala
trunk/gobject/valaccodemethodmodule.vala
trunk/gobject/valadbusclientmodule.vala
trunk/gobject/valagasyncmodule.vala
trunk/vala/valamethod.vala
Modified: trunk/gobject/valaccodemethodcallmodule.vala
==============================================================================
--- trunk/gobject/valaccodemethodcallmodule.vala (original)
+++ trunk/gobject/valaccodemethodcallmodule.vala Fri Nov 21 22:28:07 2008
@@ -348,13 +348,18 @@
}
if (m != null && m.coroutine) {
- if (ma.member_name == "begin" && ma.inner.symbol_reference == ma.symbol_reference) {
- // asynchronous begin call
- carg_map.set (get_param_pos (-1), new CCodeConstant ("NULL"));
- carg_map.set (get_param_pos (-0.9), new CCodeConstant ("NULL"));
- } else {
- carg_map.set (get_param_pos (-1), new CCodeIdentifier (current_method.get_cname () + "_ready"));
- carg_map.set (get_param_pos (-0.9), new CCodeIdentifier ("data"));
+ if ((current_method != null && current_method.coroutine)
+ || (ma.member_name == "begin" && ma.inner.symbol_reference == ma.symbol_reference)) {
+ // asynchronous call
+ var cid = (CCodeIdentifier) ccall.call;
+ cid.name += "_async";
+ if (ma.member_name == "begin" && ma.inner.symbol_reference == ma.symbol_reference) {
+ carg_map.set (get_param_pos (-1), new CCodeConstant ("NULL"));
+ carg_map.set (get_param_pos (-0.9), new CCodeConstant ("NULL"));
+ } else {
+ carg_map.set (get_param_pos (-1), new CCodeIdentifier (current_method.get_cname () + "_ready"));
+ carg_map.set (get_param_pos (-0.9), new CCodeIdentifier ("data"));
+ }
}
}
Modified: trunk/gobject/valaccodemethodmodule.vala
==============================================================================
--- trunk/gobject/valaccodemethodmodule.vala (original)
+++ trunk/gobject/valaccodemethodmodule.vala Fri Nov 21 22:28:07 2008
@@ -37,10 +37,6 @@
}
public override string? get_custom_creturn_type (Method m) {
- if (m.coroutine) {
- return "gboolean";
- }
-
var attr = m.get_attribute ("CCode");
if (attr != null) {
string type = attr.get_string ("type");
@@ -167,61 +163,14 @@
var cparam_map = new HashMap<int,CCodeFormalParameter> (direct_hash, direct_equal);
CCodeFunctionDeclarator vdeclarator = null;
-
- if (m.parent_symbol is Class && m is CreationMethod) {
- var cl = (Class) m.parent_symbol;
- if (!cl.is_compact) {
- cparam_map.set (get_param_pos (m.cinstance_parameter_position), new CCodeFormalParameter ("object_type", "GType"));
- }
- } else if (m.binding == MemberBinding.INSTANCE || (m.parent_symbol is Struct && m is CreationMethod)) {
- TypeSymbol parent_type = find_parent_type (m);
- DataType this_type;
- if (parent_type is Class) {
- this_type = new ObjectType ((Class) parent_type);
- } else if (parent_type is Interface) {
- this_type = new ObjectType ((Interface) parent_type);
- } else {
- this_type = new ValueType (parent_type);
- }
-
- CCodeFormalParameter instance_param = null;
- if (m.base_interface_method != null && !m.is_abstract && !m.is_virtual) {
- var base_type = new ObjectType ((Interface) m.base_interface_method.parent_symbol);
- instance_param = new CCodeFormalParameter ("base", base_type.get_cname ());
- } else if (m.overrides) {
- var base_type = new ObjectType ((Class) m.base_method.parent_symbol);
- instance_param = new CCodeFormalParameter ("base", base_type.get_cname ());
- } else {
- if (m.parent_symbol is Struct && !((Struct) m.parent_symbol).is_simple_type ()) {
- instance_param = new CCodeFormalParameter ("*self", this_type.get_cname ());
- } else {
- instance_param = new CCodeFormalParameter ("self", this_type.get_cname ());
- }
- }
- cparam_map.set (get_param_pos (m.cinstance_parameter_position), instance_param);
-
- if (m.is_abstract || m.is_virtual) {
- var vdecl = new CCodeDeclaration (get_creturn_type (m, creturn_type.get_cname ()));
- vdeclarator = new CCodeFunctionDeclarator (m.vfunc_name);
- vdecl.add_declarator (vdeclarator);
- type_struct.add_declaration (vdecl);
- }
- } else if (m.binding == MemberBinding.CLASS) {
- TypeSymbol parent_type = find_parent_type (m);
- DataType this_type;
- this_type = new ClassType ((Class) parent_type);
- var class_param = new CCodeFormalParameter ("klass", this_type.get_cname ());
- cparam_map.set (get_param_pos (m.cinstance_parameter_position), class_param);
+ if (m.is_abstract || m.is_virtual) {
+ var vdecl = new CCodeDeclaration (get_creturn_type (m, creturn_type.get_cname ()));
+ vdeclarator = new CCodeFunctionDeclarator (m.vfunc_name);
+ vdecl.add_declarator (vdeclarator);
+ type_struct.add_declaration (vdecl);
}
- if (!m.coroutine) {
- generate_cparameters (m, creturn_type, in_gtypeinstance_creation_method, cparam_map, function, vdeclarator);
- } else {
- // data struct to hold parameters, local variables, and the return value
- cparam_map.set (get_param_pos (0), new CCodeFormalParameter ("data", Symbol.lower_case_to_camel_case (m.get_cname ()) + "Data*"));
-
- generate_cparameters (m, creturn_type, in_gtypeinstance_creation_method, cparam_map, function, vdeclarator, null, null, 0);
- }
+ generate_cparameters (m, creturn_type, in_gtypeinstance_creation_method, cparam_map, function, vdeclarator);
bool visible = !m.is_internal_symbol ();
@@ -249,6 +198,14 @@
function.block.prepend_statement (cinit);
if (m.coroutine) {
+ var co_function = new CCodeFunction (m.get_real_cname () + "_co", "gboolean");
+
+ // data struct to hold parameters, local variables, and the return value
+ co_function.add_parameter (new CCodeFormalParameter ("data", Symbol.lower_case_to_camel_case (m.get_cname ()) + "Data*"));
+
+ co_function.modifiers |= CCodeModifiers.STATIC;
+ source_type_member_declaration.append (co_function.copy ());
+
var cswitch = new CCodeSwitchStatement (new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), "state"));
// initial coroutine state
@@ -275,8 +232,10 @@
cswitch.add_statement (new CCodeReturnStatement (new CCodeConstant ("FALSE")));
- function.block = new CCodeBlock ();
- function.block.add_statement (cswitch);
+ co_function.block = new CCodeBlock ();
+ co_function.block.add_statement (cswitch);
+
+ source_type_member_definition.append (co_function);
}
if (m.parent_symbol is Class) {
@@ -478,19 +437,9 @@
var vfunc = new CCodeFunction (m.get_cname (), creturn_type.get_cname ());
vfunc.line = function.line;
- ReferenceType this_type;
- if (m.parent_symbol is Class) {
- this_type = new ObjectType ((Class) m.parent_symbol);
- } else {
- this_type = new ObjectType ((Interface) m.parent_symbol);
- }
-
cparam_map = new HashMap<int,CCodeFormalParameter> (direct_hash, direct_equal);
var carg_map = new HashMap<int,CCodeExpression> (direct_hash, direct_equal);
- var cparam = new CCodeFormalParameter ("self", this_type.get_cname ());
- cparam_map.set (get_param_pos (m.cinstance_parameter_position), cparam);
-
var vblock = new CCodeBlock ();
foreach (Expression precondition in m.get_preconditions ()) {
@@ -599,6 +548,45 @@
}
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) {
+ if (m.parent_symbol is Class && m is CreationMethod) {
+ var cl = (Class) m.parent_symbol;
+ if (!cl.is_compact && vcall == null) {
+ cparam_map.set (get_param_pos (m.cinstance_parameter_position), new CCodeFormalParameter ("object_type", "GType"));
+ }
+ } else if (m.binding == MemberBinding.INSTANCE || (m.parent_symbol is Struct && m is CreationMethod)) {
+ TypeSymbol parent_type = find_parent_type (m);
+ DataType this_type;
+ if (parent_type is Class) {
+ this_type = new ObjectType ((Class) parent_type);
+ } else if (parent_type is Interface) {
+ this_type = new ObjectType ((Interface) parent_type);
+ } else {
+ this_type = new ValueType (parent_type);
+ }
+
+ CCodeFormalParameter instance_param = null;
+ if (m.base_interface_method != null && !m.is_abstract && !m.is_virtual) {
+ var base_type = new ObjectType ((Interface) m.base_interface_method.parent_symbol);
+ instance_param = new CCodeFormalParameter ("base", base_type.get_cname ());
+ } else if (m.overrides) {
+ var base_type = new ObjectType ((Class) m.base_method.parent_symbol);
+ instance_param = new CCodeFormalParameter ("base", base_type.get_cname ());
+ } else {
+ if (m.parent_symbol is Struct && !((Struct) m.parent_symbol).is_simple_type ()) {
+ instance_param = new CCodeFormalParameter ("*self", this_type.get_cname ());
+ } else {
+ instance_param = new CCodeFormalParameter ("self", this_type.get_cname ());
+ }
+ }
+ cparam_map.set (get_param_pos (m.cinstance_parameter_position), instance_param);
+ } else if (m.binding == MemberBinding.CLASS) {
+ TypeSymbol parent_type = find_parent_type (m);
+ DataType this_type;
+ this_type = new ClassType ((Class) parent_type);
+ var class_param = new CCodeFormalParameter ("klass", this_type.get_cname ());
+ cparam_map.set (get_param_pos (m.cinstance_parameter_position), class_param);
+ }
+
if (in_gtypeinstance_creation_method) {
// memory management for generic types
int type_param_index = 0;
Modified: trunk/gobject/valadbusclientmodule.vala
==============================================================================
--- trunk/gobject/valadbusclientmodule.vala (original)
+++ trunk/gobject/valadbusclientmodule.vala Fri Nov 21 22:28:07 2008
@@ -52,9 +52,6 @@
var cparam_map = new HashMap<int,CCodeFormalParameter> (direct_hash, direct_equal);
- var instance_param = new CCodeFormalParameter ("obj", dynamic_method.dynamic_type.get_cname ());
- cparam_map.set (get_param_pos (method.cinstance_parameter_position), instance_param);
-
generate_cparameters (method, method.return_type, false, cparam_map, func);
var block = new CCodeBlock ();
@@ -78,7 +75,7 @@
var ccall = new CCodeFunctionCall (new CCodeIdentifier ("dbus_g_proxy_begin_call"));
- ccall.add_argument (new CCodeIdentifier ("obj"));
+ ccall.add_argument (new CCodeIdentifier ("self"));
bool found_out = false;
Expression callback = null;
Modified: trunk/gobject/valagasyncmodule.vala
==============================================================================
--- trunk/gobject/valagasyncmodule.vala (original)
+++ trunk/gobject/valagasyncmodule.vala Fri Nov 21 22:28:07 2008
@@ -61,7 +61,7 @@
source_type_declaration.append (new CCodeTypeDefinition ("struct _" + dataname, new CCodeVariableDeclarator (dataname)));
// generate async function
- var asyncfunc = new CCodeFunction (m.get_cname (), "void");
+ var asyncfunc = new CCodeFunction (m.get_real_cname () + "_async", "void");
asyncfunc.line = function.line;
var cparam_map = new HashMap<int,CCodeFormalParameter> (direct_hash, direct_equal);
@@ -80,31 +80,43 @@
asyncblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), "user_data"), new CCodeIdentifier ("user_data"))));
foreach (FormalParameter param in m.get_parameters ()) {
- asyncblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), param.name), new CCodeIdentifier (param.name))));
+ if (param.direction != ParameterDirection.OUT) {
+ asyncblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), param.name), new CCodeIdentifier (param.name))));
+ }
}
- var ccall = new CCodeFunctionCall (new CCodeIdentifier (m.get_real_cname ()));
+ var ccall = new CCodeFunctionCall (new CCodeIdentifier (m.get_real_cname () + "_co"));
ccall.add_argument (new CCodeIdentifier ("data"));
asyncblock.add_statement (new CCodeExpressionStatement (ccall));
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, creturn_type, false, cparam_map, asyncfunc, null, null, null, 1);
-
- if (visible) {
- header_type_member_declaration.append (asyncfunc.copy ());
- } else {
- asyncfunc.modifiers |= CCodeModifiers.STATIC;
- source_type_member_declaration.append (asyncfunc.copy ());
- }
+ CCodeFunctionDeclarator vdeclarator = null;
+ if (m.is_abstract || m.is_virtual) {
+ var vdecl = new CCodeDeclaration ("void");
+ vdeclarator = new CCodeFunctionDeclarator (m.vfunc_name + "_async");
+ vdecl.add_declarator (vdeclarator);
+ type_struct.add_declaration (vdecl);
+ }
+
+ generate_cparameters (m, creturn_type, false, cparam_map, asyncfunc, vdeclarator, null, null, 1);
+
+ if (!m.is_abstract) {
+ if (visible && m.base_method == null && m.base_interface_method == null) {
+ header_type_member_declaration.append (asyncfunc.copy ());
+ } else {
+ asyncfunc.modifiers |= CCodeModifiers.STATIC;
+ source_type_member_declaration.append (asyncfunc.copy ());
+ }
- asyncfunc.block = asyncblock;
+ asyncfunc.block = asyncblock;
- source_type_member_definition.append (asyncfunc);
+ source_type_member_definition.append (asyncfunc);
+ }
// generate finish function
- var finishfunc = new CCodeFunction (m.get_cname () + "_finish", creturn_type.get_cname ());
+ var finishfunc = new CCodeFunction (m.get_real_cname () + "_finish", creturn_type.get_cname ());
finishfunc.line = function.line;
cparam_map = new HashMap<int,CCodeFormalParameter> (direct_hash, direct_equal);
@@ -113,45 +125,56 @@
cparam_map.set (get_param_pos (0.1), new CCodeFormalParameter ("res", "GAsyncResult*"));
- generate_cparameters (m, creturn_type, false, cparam_map, finishfunc, null, null, null, 2);
-
- if (visible) {
- header_type_member_declaration.append (finishfunc.copy ());
- } else {
- finishfunc.modifiers |= CCodeModifiers.STATIC;
- source_type_member_declaration.append (finishfunc.copy ());
+ if (m.is_abstract || m.is_virtual) {
+ var vdecl = new CCodeDeclaration ("void");
+ vdeclarator = new CCodeFunctionDeclarator (m.vfunc_name + "_finish");
+ vdecl.add_declarator (vdeclarator);
+ type_struct.add_declaration (vdecl);
}
+
+ generate_cparameters (m, creturn_type, false, cparam_map, finishfunc, vdeclarator, null, null, 2);
+
+ if (!m.is_abstract) {
+ if (visible && m.base_method == null && m.base_interface_method == null) {
+ header_type_member_declaration.append (finishfunc.copy ());
+ } else {
+ finishfunc.modifiers |= CCodeModifiers.STATIC;
+ source_type_member_declaration.append (finishfunc.copy ());
+ }
- finishfunc.block = finishblock;
+ finishfunc.block = finishblock;
- source_type_member_definition.append (finishfunc);
+ source_type_member_definition.append (finishfunc);
+ }
- // generate ready callback handler
- var readyfunc = new CCodeFunction (m.get_cname () + "_ready", "void");
- readyfunc.line = function.line;
+ if (!m.is_abstract) {
+ // generate ready callback handler
+ var readyfunc = new CCodeFunction (m.get_cname () + "_ready", "void");
+ readyfunc.line = function.line;
- readyfunc.add_parameter (new CCodeFormalParameter ("source_object", "GObject*"));
- readyfunc.add_parameter (new CCodeFormalParameter ("res", "GAsyncResult*"));
- readyfunc.add_parameter (new CCodeFormalParameter ("user_data", "gpointer"));
+ readyfunc.add_parameter (new CCodeFormalParameter ("source_object", "GObject*"));
+ readyfunc.add_parameter (new CCodeFormalParameter ("res", "GAsyncResult*"));
+ readyfunc.add_parameter (new CCodeFormalParameter ("user_data", "gpointer"));
- var readyblock = new CCodeBlock ();
+ var readyblock = new CCodeBlock ();
- datadecl = new CCodeDeclaration (dataname + "*");
- datadecl.add_declarator (new CCodeVariableDeclarator ("data"));
- readyblock.add_statement (datadecl);
- readyblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeIdentifier ("data"), new CCodeIdentifier ("user_data"))));
- readyblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), "res"), new CCodeIdentifier ("res"))));
+ datadecl = new CCodeDeclaration (dataname + "*");
+ datadecl.add_declarator (new CCodeVariableDeclarator ("data"));
+ readyblock.add_statement (datadecl);
+ readyblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeIdentifier ("data"), new CCodeIdentifier ("user_data"))));
+ readyblock.add_statement (new CCodeExpressionStatement (new CCodeAssignment (new CCodeMemberAccess.pointer (new CCodeIdentifier ("data"), "res"), new CCodeIdentifier ("res"))));
- ccall = new CCodeFunctionCall (new CCodeIdentifier (m.get_real_cname ()));
- ccall.add_argument (new CCodeIdentifier ("data"));
- readyblock.add_statement (new CCodeExpressionStatement (ccall));
+ ccall = new CCodeFunctionCall (new CCodeIdentifier (m.get_real_cname () + "_co"));
+ ccall.add_argument (new CCodeIdentifier ("data"));
+ readyblock.add_statement (new CCodeExpressionStatement (ccall));
- readyfunc.modifiers |= CCodeModifiers.STATIC;
- source_type_member_declaration.append (readyfunc.copy ());
+ readyfunc.modifiers |= CCodeModifiers.STATIC;
+ source_type_member_declaration.append (readyfunc.copy ());
- readyfunc.block = readyblock;
+ readyfunc.block = readyblock;
- source_type_member_definition.append (readyfunc);
+ source_type_member_definition.append (readyfunc);
+ }
}
public override void visit_yield_statement (YieldStatement stmt) {
Modified: trunk/vala/valamethod.vala
==============================================================================
--- trunk/vala/valamethod.vala (original)
+++ trunk/vala/valamethod.vala Fri Nov 21 22:28:07 2008
@@ -340,7 +340,7 @@
* @return the name to be used in C code
*/
public virtual string get_real_cname () {
- if (base_method != null || base_interface_method != null || coroutine) {
+ if (base_method != null || base_interface_method != null) {
return "%sreal_%s".printf (parent_symbol.get_lower_case_cprefix (), name);
} else {
return get_cname ();
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]