summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJürg Billeter <j@bitron.ch>2010-08-05 21:10:20 +0200
committerJürg Billeter <j@bitron.ch>2010-08-05 21:14:42 +0200
commit0045f1b9394f4272b7b901f7d6c9a55b5767bc8e (patch)
tree53dbdd430ab0a50ff1e9a625bab8b5e15fb239b3
parent1852b4cfb278fbf0746251a94d2a8040e5670562 (diff)
downloadvala-0045f1b9394f4272b7b901f7d6c9a55b5767bc8e.tar.gz
dova: Do not generate empty structs
-rw-r--r--ccode/valaccodestruct.vala6
-rw-r--r--codegen/valadovaobjectmodule.vala66
2 files changed, 61 insertions, 11 deletions
diff --git a/ccode/valaccodestruct.vala b/ccode/valaccodestruct.vala
index 20cae7996..76f7679f2 100644
--- a/ccode/valaccodestruct.vala
+++ b/ccode/valaccodestruct.vala
@@ -1,6 +1,6 @@
/* valaccodestruct.vala
*
- * Copyright (C) 2006-2007 Jürg Billeter
+ * Copyright (C) 2006-2010 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
@@ -35,7 +35,9 @@ public class Vala.CCodeStruct : CCodeNode {
* Whether the struct is deprecated.
*/
public bool deprecated { get; set; default = false; }
-
+
+ public bool is_empty { get { return declarations.size == 0; } }
+
private List<CCodeDeclaration> declarations = new ArrayList<CCodeDeclaration> ();
public CCodeStruct (string name) {
diff --git a/codegen/valadovaobjectmodule.vala b/codegen/valadovaobjectmodule.vala
index cf700faf3..809b6a04f 100644
--- a/codegen/valadovaobjectmodule.vala
+++ b/codegen/valadovaobjectmodule.vala
@@ -111,6 +111,32 @@ internal class Vala.DovaObjectModule : DovaArrayModule {
type_struct.add_declaration (vdecl);
}
+ bool has_instance_struct (Class cl) {
+ foreach (Field f in cl.get_fields ()) {
+ if (f.binding == MemberBinding.INSTANCE) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ bool has_type_struct (Class cl) {
+ if (cl.get_type_parameters ().size > 0) {
+ return true;
+ }
+ foreach (Method m in cl.get_methods ()) {
+ if (m.is_abstract || m.is_virtual) {
+ return true;
+ }
+ }
+ foreach (Property prop in cl.get_properties ()) {
+ if (prop.is_abstract || prop.is_virtual) {
+ return true;
+ }
+ }
+ return false;
+ }
+
void generate_class_private_declaration (Class cl, CCodeDeclarationSpace decl_space) {
if (decl_space.add_symbol_declaration (cl, cl.get_cname () + "Private")) {
return;
@@ -221,11 +247,15 @@ internal class Vala.DovaObjectModule : DovaArrayModule {
}
}
- decl_space.add_type_declaration (new CCodeTypeDefinition ("struct %s".printf (instance_priv_struct.name), new CCodeVariableDeclarator ("%sPrivate".printf (cl.get_cname ()))));
- decl_space.add_type_definition (instance_priv_struct);
+ if (!instance_priv_struct.is_empty) {
+ decl_space.add_type_declaration (new CCodeTypeDefinition ("struct %s".printf (instance_priv_struct.name), new CCodeVariableDeclarator ("%sPrivate".printf (cl.get_cname ()))));
+ decl_space.add_type_definition (instance_priv_struct);
+ }
- decl_space.add_type_declaration (new CCodeTypeDefinition ("struct %s".printf (type_priv_struct.name), new CCodeVariableDeclarator ("%sTypePrivate".printf (cl.get_cname ()))));
- decl_space.add_type_definition (type_priv_struct);
+ if (!type_priv_struct.is_empty) {
+ decl_space.add_type_declaration (new CCodeTypeDefinition ("struct %s".printf (type_priv_struct.name), new CCodeVariableDeclarator ("%sTypePrivate".printf (cl.get_cname ()))));
+ decl_space.add_type_definition (type_priv_struct);
+ }
var cdecl = new CCodeDeclaration ("int");
cdecl.add_declarator (new CCodeVariableDeclarator ("_%s_object_offset".printf (cl.get_lower_case_cname ()), new CCodeConstant ("0")));
@@ -249,7 +279,9 @@ internal class Vala.DovaObjectModule : DovaArrayModule {
macro = "((%sPrivate *) (((char *) o) + _%s_object_offset))".printf (cl.get_cname (), cl.get_lower_case_cname ());
type_offset = new CCodeConstant ("0");
}
- decl_space.add_type_member_declaration (new CCodeMacroReplacement ("%s_GET_PRIVATE(o)".printf (cl.get_upper_case_cname (null)), macro));
+ if (!instance_priv_struct.is_empty) {
+ decl_space.add_type_member_declaration (new CCodeMacroReplacement ("%s_GET_PRIVATE(o)".printf (cl.get_upper_case_cname (null)), macro));
+ }
cdecl = new CCodeDeclaration ("int");
cdecl.add_declarator (new CCodeVariableDeclarator ("_%s_type_offset".printf (cl.get_lower_case_cname ()), type_offset));
@@ -443,8 +475,16 @@ internal class Vala.DovaObjectModule : DovaArrayModule {
var alloc_call = new CCodeFunctionCall (new CCodeIdentifier ("dova_type_alloc"));
alloc_call.add_argument (base_type);
- alloc_call.add_argument (new CCodeConstant ("sizeof (%sPrivate)".printf (cl.get_cname ())));
- alloc_call.add_argument (new CCodeConstant ("sizeof (%sTypePrivate)".printf (cl.get_cname ())));
+ if (!(cl is Class) || has_instance_struct ((Class) cl)) {
+ alloc_call.add_argument (new CCodeConstant ("sizeof (%sPrivate)".printf (cl.get_cname ())));
+ } else {
+ alloc_call.add_argument (new CCodeConstant ("0"));
+ }
+ if (!(cl is Class) || has_type_struct ((Class) cl)) {
+ alloc_call.add_argument (new CCodeConstant ("sizeof (%sTypePrivate)".printf (cl.get_cname ())));
+ } else {
+ alloc_call.add_argument (new CCodeConstant ("0"));
+ }
alloc_call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier ("%s_type".printf (cl.get_lower_case_cname ()))));
alloc_call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier ("_%s_object_offset".printf (cl.get_lower_case_cname ()))));
alloc_call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier ("_%s_type_offset".printf (cl.get_lower_case_cname ()))));
@@ -501,8 +541,16 @@ internal class Vala.DovaObjectModule : DovaArrayModule {
var alloc_call = new CCodeFunctionCall (new CCodeIdentifier ("dova_type_alloc"));
alloc_call.add_argument (base_type);
- alloc_call.add_argument (new CCodeConstant ("sizeof (%sPrivate)".printf (cl.get_cname ())));
- alloc_call.add_argument (new CCodeConstant ("sizeof (%sTypePrivate)".printf (cl.get_cname ())));
+ if (!(cl is Class) || has_instance_struct ((Class) cl)) {
+ alloc_call.add_argument (new CCodeConstant ("sizeof (%sPrivate)".printf (cl.get_cname ())));
+ } else {
+ alloc_call.add_argument (new CCodeConstant ("0"));
+ }
+ if (!(cl is Class) || has_type_struct ((Class) cl)) {
+ alloc_call.add_argument (new CCodeConstant ("sizeof (%sTypePrivate)".printf (cl.get_cname ())));
+ } else {
+ alloc_call.add_argument (new CCodeConstant ("0"));
+ }
alloc_call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier ("result")));
alloc_call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier ("_%s_object_offset".printf (cl.get_lower_case_cname ()))));
alloc_call.add_argument (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier ("_%s_type_offset".printf (cl.get_lower_case_cname ()))));