From: Juerg Billeter Date: Sat, 19 Apr 2008 08:34:33 +0000 (+0000) Subject: Mark generic type parameter properties as construct-only, fixes bug 528567 X-Git-Tag: VALA_0_3_1~37 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=bca35cdb27d0c75828af665d6ab32c26517a4c07;p=platform%2Fupstream%2Fvala.git Mark generic type parameter properties as construct-only, fixes bug 528567 2008-04-19 Juerg Billeter * gobject/valaccodeassignmentbinding.vala, gobject/valaccodebinding.vala, gobject/valaccodeclassbinding.vala, gobject/valaccodemethodbinding.vala: Mark generic type parameter properties as construct-only, fixes bug 528567 svn path=/trunk/; revision=1265 --- diff --git a/ChangeLog b/ChangeLog index c192a73..2b7e1f8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,14 @@ 2008-04-19 Jürg Billeter + * gobject/valaccodeassignmentbinding.vala, + gobject/valaccodebinding.vala, gobject/valaccodeclassbinding.vala, + gobject/valaccodemethodbinding.vala: + + Mark generic type parameter properties as construct-only, + fixes bug 528567 + +2008-04-19 Jürg Billeter + * vala/valasemanticanalyzer.vala: disable null warnings with --disable-non-null diff --git a/gobject/valaccodeassignmentbinding.vala b/gobject/valaccodeassignmentbinding.vala index 2165f87..ffa3e69 100644 --- a/gobject/valaccodeassignmentbinding.vala +++ b/gobject/valaccodeassignmentbinding.vala @@ -41,33 +41,7 @@ public class Vala.CCodeAssignmentBinding : CCodeExpressionBinding { var prop = (Property) assignment.left.symbol_reference; if (prop.set_accessor.construction && codegen.current_type_symbol is Class && codegen.current_class.is_subtype_of (codegen.gobject_type) && codegen.in_creation_method) { - // this property is used as a construction parameter - var cpointer = new CCodeIdentifier ("__params_it"); - - var ccomma = new CCodeCommaExpression (); - // set name in array for current parameter - var cnamemember = new CCodeMemberAccess.pointer (cpointer, "name"); - var cnameassign = new CCodeAssignment (cnamemember, prop.get_canonical_cconstant ()); - ccomma.append_expression (cnameassign); - - var gvaluearg = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeMemberAccess.pointer (cpointer, "value")); - - // initialize GValue in array for current parameter - var cvalueinit = new CCodeFunctionCall (new CCodeIdentifier ("g_value_init")); - cvalueinit.add_argument (gvaluearg); - cvalueinit.add_argument (new CCodeIdentifier (prop.type_reference.get_type_id ())); - ccomma.append_expression (cvalueinit); - - // set GValue for current parameter - var cvalueset = new CCodeFunctionCall (get_value_setter_function (prop.type_reference)); - cvalueset.add_argument (gvaluearg); - cvalueset.add_argument ((CCodeExpression) assignment.right.ccodenode); - ccomma.append_expression (cvalueset); - - // move pointer to next parameter in array - ccomma.append_expression (new CCodeUnaryExpression (CCodeUnaryOperator.POSTFIX_INCREMENT, cpointer)); - - codenode = ccomma; + codenode = get_construct_property_assignment (prop.get_canonical_cconstant (), prop.type_reference, (CCodeExpression) assignment.right.ccodenode); } else { CCodeExpression cexpr = (CCodeExpression) assignment.right.ccodenode; diff --git a/gobject/valaccodebinding.vala b/gobject/valaccodebinding.vala index 1d5f306..b0aeda3 100644 --- a/gobject/valaccodebinding.vala +++ b/gobject/valaccodebinding.vala @@ -44,6 +44,36 @@ public abstract class Vala.CCodeBinding : CodeBinding { } } + public CCodeExpression get_construct_property_assignment (CCodeConstant canonical_cconstant, DataType property_type, CCodeExpression value) { + // this property is used as a construction parameter + var cpointer = new CCodeIdentifier ("__params_it"); + + var ccomma = new CCodeCommaExpression (); + // set name in array for current parameter + var cnamemember = new CCodeMemberAccess.pointer (cpointer, "name"); + var cnameassign = new CCodeAssignment (cnamemember, canonical_cconstant); + ccomma.append_expression (cnameassign); + + var gvaluearg = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeMemberAccess.pointer (cpointer, "value")); + + // initialize GValue in array for current parameter + var cvalueinit = new CCodeFunctionCall (new CCodeIdentifier ("g_value_init")); + cvalueinit.add_argument (gvaluearg); + cvalueinit.add_argument (new CCodeIdentifier (property_type.get_type_id ())); + ccomma.append_expression (cvalueinit); + + // set GValue for current parameter + var cvalueset = new CCodeFunctionCall (get_value_setter_function (property_type)); + cvalueset.add_argument (gvaluearg); + cvalueset.add_argument (value); + ccomma.append_expression (cvalueset); + + // move pointer to next parameter in array + ccomma.append_expression (new CCodeUnaryExpression (CCodeUnaryOperator.POSTFIX_INCREMENT, cpointer)); + + return ccomma; + } + public CCodeBinding? code_binding (CodeNode node) { return (CCodeBinding) node.get_code_binding (codegen); } diff --git a/gobject/valaccodeclassbinding.vala b/gobject/valaccodeclassbinding.vala index e766134..e4ac3c7 100644 --- a/gobject/valaccodeclassbinding.vala +++ b/gobject/valaccodeclassbinding.vala @@ -371,7 +371,7 @@ public class Vala.CCodeClassBinding : CCodeTypesymbolBinding { cspec.add_argument (new CCodeConstant ("\"type\"")); cspec.add_argument (new CCodeConstant ("\"type\"")); cspec.add_argument (new CCodeIdentifier ("G_TYPE_NONE")); - cspec.add_argument (new CCodeConstant ("G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_WRITABLE")); + cspec.add_argument (new CCodeConstant ("G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY")); cinst.add_argument (cspec); init_block.add_statement (new CCodeExpressionStatement (cinst)); codegen.prop_enum.add_value (new CCodeEnumValue (enum_value)); @@ -389,7 +389,7 @@ public class Vala.CCodeClassBinding : CCodeTypesymbolBinding { cspec.add_argument (func_name_constant); cspec.add_argument (new CCodeConstant ("\"dup func\"")); cspec.add_argument (new CCodeConstant ("\"dup func\"")); - cspec.add_argument (new CCodeConstant ("G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_WRITABLE")); + cspec.add_argument (new CCodeConstant ("G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY")); cinst.add_argument (cspec); init_block.add_statement (new CCodeExpressionStatement (cinst)); codegen.prop_enum.add_value (new CCodeEnumValue (enum_value)); @@ -407,7 +407,7 @@ public class Vala.CCodeClassBinding : CCodeTypesymbolBinding { cspec.add_argument (func_name_constant); cspec.add_argument (new CCodeConstant ("\"destroy func\"")); cspec.add_argument (new CCodeConstant ("\"destroy func\"")); - cspec.add_argument (new CCodeConstant ("G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_WRITABLE")); + cspec.add_argument (new CCodeConstant ("G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY")); cinst.add_argument (cspec); init_block.add_statement (new CCodeExpressionStatement (cinst)); codegen.prop_enum.add_value (new CCodeEnumValue (enum_value)); diff --git a/gobject/valaccodemethodbinding.vala b/gobject/valaccodemethodbinding.vala index c710dd2..1c6c46b 100644 --- a/gobject/valaccodemethodbinding.vala +++ b/gobject/valaccodemethodbinding.vala @@ -92,7 +92,7 @@ public class Vala.CCodeMethodBinding : CCodeBinding { } } - add_object_creation (cblock, ((CreationMethod) m).n_construction_params > 0); + add_object_creation (cblock, ((CreationMethod) m).n_construction_params > 0 || codegen.current_class.get_type_parameters ().size > 0); foreach (CodeNode stmt in m.body.get_statements ()) { if (!((ExpressionStatement) stmt).assigned_property ().set_accessor.construction) { @@ -348,11 +348,11 @@ public class Vala.CCodeMethodBinding : CCodeBinding { if (in_gobject_creation_method) { int n_params = ((CreationMethod) m).n_construction_params; - if (n_params > 0) { + if (n_params > 0 || codegen.current_class.get_type_parameters ().size > 0) { // declare construction parameter array var cparamsinit = new CCodeFunctionCall (new CCodeIdentifier ("g_new0")); cparamsinit.add_argument (new CCodeIdentifier ("GParameter")); - cparamsinit.add_argument (new CCodeConstant (n_params.to_string ())); + cparamsinit.add_argument (new CCodeConstant ((n_params + 3 * codegen.current_class.get_type_parameters ().size).to_string ())); var cdecl = new CCodeDeclaration ("GParameter *"); cdecl.add_declarator (new CCodeVariableDeclarator.with_initializer ("__params", cparamsinit)); @@ -365,24 +365,20 @@ public class Vala.CCodeMethodBinding : CCodeBinding { /* type, dup func, and destroy func properties for generic types */ foreach (TypeParameter type_param in codegen.current_class.get_type_parameters ()) { - string func_name; - CCodeMemberAccess cmember; - CCodeAssignment cassign; - - func_name = "%s_type".printf (type_param.name.down ()); - cmember = new CCodeMemberAccess.pointer (new CCodeMemberAccess.pointer (new CCodeIdentifier ("self"), "priv"), func_name); - cassign = new CCodeAssignment (cmember, new CCodeIdentifier (func_name)); - codegen.function.block.add_statement (new CCodeExpressionStatement (cassign)); - - func_name = "%s_dup_func".printf (type_param.name.down ()); - cmember = new CCodeMemberAccess.pointer (new CCodeMemberAccess.pointer (new CCodeIdentifier ("self"), "priv"), func_name); - cassign = new CCodeAssignment (cmember, new CCodeIdentifier (func_name)); - codegen.function.block.add_statement (new CCodeExpressionStatement (cassign)); - - func_name = "%s_destroy_func".printf (type_param.name.down ()); - cmember = new CCodeMemberAccess.pointer (new CCodeMemberAccess.pointer (new CCodeIdentifier ("self"), "priv"), func_name); - cassign = new CCodeAssignment (cmember, new CCodeIdentifier (func_name)); - codegen.function.block.add_statement (new CCodeExpressionStatement (cassign)); + CCodeConstant prop_name; + CCodeIdentifier param_name; + + prop_name = new CCodeConstant ("\"%s-type\"".printf (type_param.name.down ())); + param_name = new CCodeIdentifier ("%s_type".printf (type_param.name.down ())); + cinit.append (new CCodeExpressionStatement (get_construct_property_assignment (prop_name, new ValueType (codegen.gtype_type), param_name))); + + prop_name = new CCodeConstant ("\"%s-dup-func\"".printf (type_param.name.down ())); + param_name = new CCodeIdentifier ("%s_dup_func".printf (type_param.name.down ())); + cinit.append (new CCodeExpressionStatement (get_construct_property_assignment (prop_name, new PointerType (new VoidType ()), param_name))); + + prop_name = new CCodeConstant ("\"%s-destroy-func\"".printf (type_param.name.down ())); + 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_fundamental_creation_method) { var cl = (Class) m.parent_symbol; @@ -587,7 +583,8 @@ public class Vala.CCodeMethodBinding : CCodeBinding { } if (m is CreationMethod) { - if (((CreationMethod) m).n_construction_params > 0) { + if (codegen.current_class != null && codegen.current_class.is_subtype_of (codegen.gobject_type) + && (((CreationMethod) m).n_construction_params > 0 || codegen.current_class.get_type_parameters ().size > 0)) { var ccond = new CCodeBinaryExpression (CCodeBinaryOperator.GREATER_THAN, new CCodeIdentifier ("__params_it"), new CCodeIdentifier ("__params")); var cdofreeparam = new CCodeBlock (); cdofreeparam.add_statement (new CCodeExpressionStatement (new CCodeUnaryExpression (CCodeUnaryOperator.PREFIX_DECREMENT, new CCodeIdentifier ("__params_it"))));