From: Juerg Billeter Date: Sat, 15 Mar 2008 02:48:42 +0000 (+0000) Subject: fix runtime crash when using nullable struct parameters, patch by Alberto X-Git-Tag: VALA_0_2_0~59 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=890cd9adaca46dc22c044407c7a2ba5ce690256a;p=thirdparty%2Fvala.git fix runtime crash when using nullable struct parameters, patch by Alberto 2008-03-15 Juerg Billeter * gobject/valaccodegenerator.vala, gobject/valaccodegeneratormemberaccess.vala, gobject/valaccodegeneratormethod.vala: fix runtime crash when using nullable struct parameters, patch by Alberto Ruiz, fixes bug 514864 svn path=/trunk/; revision=1127 --- diff --git a/ChangeLog b/ChangeLog index fcd63fb51..83c06da7e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2008-03-15 Jürg Billeter + + * gobject/valaccodegenerator.vala, + gobject/valaccodegeneratormemberaccess.vala, + gobject/valaccodegeneratormethod.vala: fix runtime crash when + using nullable struct parameters, + patch by Alberto Ruiz, fixes bug 514864 + 2008-03-14 Jürg Billeter * vapi/packages/gdk-2.0/, vapi/packages/gtk+-2.0/: fix gdk/gtk_init diff --git a/gobject/valaccodegenerator.vala b/gobject/valaccodegenerator.vala index 636b9db22..9c4261866 100644 --- a/gobject/valaccodegenerator.vala +++ b/gobject/valaccodegenerator.vala @@ -600,7 +600,6 @@ public class Vala.CCodeGenerator : CodeGenerator { var st = (Struct) p.type_reference.data_type; if (!st.is_simple_type () && !p.type_reference.is_ref && !p.type_reference.is_out) { ctypename += "*"; - cname = "_%s_p".printf (p.name); } } @@ -3031,6 +3030,9 @@ public class Vala.CCodeGenerator : CodeGenerator { if (expr.operator == BinaryOperator.EQUALITY || expr.operator == BinaryOperator.INEQUALITY) { + var left_type_as_struct = expr.left.static_type.data_type as Struct; + var right_type_as_struct = expr.right.static_type.data_type as Struct; + if (expr.left.static_type.data_type is Class && ((Class) expr.left.static_type.data_type).is_subtype_of (gobject_type) && expr.right.static_type.data_type is Class && ((Class) expr.right.static_type.data_type).is_subtype_of (gobject_type)) { var left_cl = (Class) expr.left.static_type.data_type; @@ -3043,6 +3045,10 @@ public class Vala.CCodeGenerator : CodeGenerator { cright = new InstanceCast (cright, left_cl); } } + } else if (left_type_as_struct != null && expr.right.static_type is NullType) { + cleft = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, cleft); + } else if (right_type_as_struct != null && expr.left.static_type is NullType) { + cright = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, cright); } } diff --git a/gobject/valaccodegeneratormemberaccess.vala b/gobject/valaccodegeneratormemberaccess.vala index 4c1a7097d..9ba17ec43 100644 --- a/gobject/valaccodegeneratormemberaccess.vala +++ b/gobject/valaccodegeneratormemberaccess.vala @@ -178,7 +178,10 @@ public class Vala.CCodeGenerator { if (p.name == "this") { expr.ccodenode = pub_inst; } else { - if (p.type_reference.is_out || p.type_reference.is_ref) { + var type_as_struct = p.type_reference.data_type as Struct; + if (p.type_reference.is_out + || p.type_reference.is_ref + || (type_as_struct != null && !type_as_struct.is_simple_type ())) { expr.ccodenode = new CCodeIdentifier ("(*%s)".printf (p.name)); } else { // Property setters of non simple structs shall replace all occurences diff --git a/gobject/valaccodegeneratormethod.vala b/gobject/valaccodegeneratormethod.vala index f222de89f..ab8b860c8 100644 --- a/gobject/valaccodegeneratormethod.vala +++ b/gobject/valaccodegeneratormethod.vala @@ -312,13 +312,6 @@ public class Vala.CCodeGenerator { var a = new CCodeAssignment (new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, new CCodeIdentifier (param.name)), new CCodeConstant ("NULL")); cinit.append (new CCodeExpressionStatement (a)); } - } else if (t is Struct) { - var st = (Struct) t; - if (!st.is_simple_type () && !param.type_reference.is_ref && !param.type_reference.is_out) { - var cdecl = new CCodeDeclaration (param.type_reference.get_cname ()); - cdecl.add_declarator (new CCodeVariableDeclarator.with_initializer (param.name, new CCodeUnaryExpression (CCodeUnaryOperator.POINTER_INDIRECTION, new CCodeIdentifier ("_%s_p".printf (param.name))))); - cinit.append (cdecl); - } } }