return get_ccode_attribute(node).const_name;
}
+ public static string get_ccode_struct_name (CodeNode node) {
+ unowned DataType? data_type = node as DataType;
+
+ if (data_type is ObjectType) {
+ return get_ccode_name (data_type.type_symbol);
+ } else if (data_type is ValueType && !data_type.nullable) {
+ return get_ccode_name (data_type.type_symbol);
+ } else if (data_type is ClassType || data_type is InterfaceType) {
+ return get_ccode_type_name ((ObjectTypeSymbol) data_type.type_symbol);
+ } else if (data_type is ErrorType) {
+ return "GError";
+ } else if (node is CType) {
+ return ((CType) node).ctype_name;
+ }
+
+ Report.error (node.source_reference, "internal: No type available");
+ return "";
+ }
+
public static string get_ccode_type_name (ObjectTypeSymbol sym) {
return get_ccode_attribute (sym).type_name;
}
public override void visit_sizeof_expression (SizeofExpression expr) {
generate_type_declaration (expr.type_reference, cfile);
+ string struct_name;
+ unowned DataType data_type = expr.type_reference;
+ if (data_type is PointerType) {
+ if (!(((PointerType) data_type).base_type is VoidType)) {
+ Report.warning (expr.source_reference, "Passing a pointer-type to `sizeof()' defaults to `sizeof(void*)'");
+ }
+ struct_name = "void*";
+ } else if (data_type is ValueType && data_type.nullable) {
+ // boxed-types are pointers too
+ Report.warning (expr.source_reference, "Passing a boxed-type to `sizeof()' defaults to `sizeof(void*)'");
+ struct_name = "void*";
+ } else {
+ struct_name = get_ccode_struct_name (data_type);
+ }
+
var csizeof = new CCodeFunctionCall (new CCodeIdentifier ("sizeof"));
- csizeof.add_argument (new CCodeIdentifier (get_ccode_name (expr.type_reference)));
+ csizeof.add_argument (new CCodeIdentifier (struct_name));
set_cvalue (expr, csizeof);
}
objects/bug695671.vala \
objects/bug702736.vala \
objects/bug702846.vala \
+ objects/bug728274.vala \
objects/bug731547.vala \
objects/bug741465.vala \
objects/bug751338.vala \
--- /dev/null
+class Foo {
+}
+
+[Compact]
+class FooCompact {
+ public int i;
+}
+
+class FooObject : Object {
+}
+
+struct Bar {
+ public int i;
+}
+
+enum Manam {
+ NONE;
+}
+
+errordomain FooError {
+ FAIL;
+}
+
+void main () {
+ assert (sizeof (Foo) >= sizeof (GLib.TypeInstance) + sizeof (int) + sizeof (void*));
+ assert (sizeof (FooCompact) == sizeof (int));
+ assert (sizeof (FooObject) == sizeof (GLib.Object) + sizeof (void*));
+
+ assert (sizeof (Bar) == sizeof (int));
+ assert (sizeof (Manam) == sizeof (uint));
+
+ assert (sizeof (FooError) == sizeof (GLib.Quark) + sizeof (int) + sizeof (void*));
+
+ assert (sizeof (Foo*) == sizeof (void*));
+ assert (sizeof (int?) == sizeof (void*));
+}