+2008-04-26 Jürg Billeter <j@bitron.ch>
+
+ * vala/valaarraytype.vala:
+ * vala/valaclassinstancetype.vala:
+ * vala/valaclasstype.vala:
+ * vala/valadatatype.vala:
+ * vala/valadelegatetype.vala:
+ * vala/valaerrortype.vala:
+ * vala/valainterfaceinstancetype.vala:
+ * vala/valainterfacetype.vala:
+ * vala/valamethodtype.vala:
+ * vala/valanulltype.vala:
+ * vala/valapointertype.vala:
+ * vala/valasemanticanalyzer.vala:
+ * vala/valasymbolresolver.vala:
+ * vala/valatypeparametertype.vala:
+ * vala/valavaluetype.vala:
+ * vala/valavoidtype.vala:
+ * gobject/valaccodegenerator.vala:
+
+ Fix handling of const types, fixes bug 529851
+
2008-04-26 Marc-André Lureau <marcandre.lureau@gmail.com>
* gobject/valaccodedynamicmethodbinding.vala: fix dbus strv
p.accept_children (this);
if (!p.ellipsis) {
- string ctypename = p.type_reference.get_cname (false, !p.type_reference.transfers_ownership);
+ string ctypename = p.type_reference.get_cname ();
string cname = p.name;
// pass non-simple structs always by reference
this_type = new InterfaceInstanceType ((Interface) t);
}
var cselfparam = new CCodeFormalParameter ("self", this_type.get_cname ());
- var cvalueparam = new CCodeFormalParameter ("value", prop.type_reference.get_cname (false, true));
if (prop.is_abstract || prop.is_virtual) {
if (acc.readable) {
}
function.add_parameter (cselfparam);
if (acc.writable || acc.construction) {
+ var cvalueparam = new CCodeFormalParameter ("value", acc.value_parameter.type_reference.get_cname ());
function.add_parameter (cvalueparam);
}
function.add_parameter (cselfparam);
if (returns_real_struct) {
// return non simple structs as out parameter
- var coutparamname = "%s*".printf (prop.type_reference.get_cname (false, true));
+ var coutparamname = "%s*".printf (prop.type_reference.get_cname ());
var coutparam = new CCodeFormalParameter ("value", coutparamname);
function.add_parameter (coutparam);
} else {
if (acc.writable || acc.construction) {
+ var cvalueparam = new CCodeFormalParameter ("value", acc.value_parameter.type_reference.get_cname ());
function.add_parameter (cvalueparam);
}
}
var cvar = new CCodeVariableDeclarator.with_initializer (get_variable_cname (local.name), rhs);
var cfrag = new CCodeFragment ();
- var cdecl = new CCodeDeclaration (local.variable_type.get_cname (false, !local.variable_type.takes_ownership));
+ var cdecl = new CCodeDeclaration (local.variable_type.get_cname ());
cdecl.add_declarator (cvar);
cfrag.append (cdecl);
private void append_temp_decl (CCodeFragment cfrag, Collection<LocalVariable> temp_vars) {
foreach (LocalVariable local in temp_vars) {
- var cdecl = new CCodeDeclaration (local.variable_type.get_cname (true, !local.variable_type.takes_ownership));
+ var cdecl = new CCodeDeclaration (local.variable_type.get_cname ());
var vardecl = new CCodeVariableDeclarator (local.name);
// sets #line
return result;
}
- public override string? get_cname (bool var_type, bool const_type) {
+ public override string? get_cname () {
+ // FIXME add support for [Immutable] or [Const] attribute to support arrays to const data
return element_type.get_cname () + "*";
}
return result;
}
+
+ public override string? get_cname () {
+ return "%s*".printf (class_symbol.get_cname (!takes_ownership && !transfers_ownership));
+ }
}
return result;
}
- public override string? get_cname (bool var_type, bool const_type) {
+ public override string? get_cname () {
return "%sClass*".printf (class_symbol.get_cname ());
}
}
*
* @return the type string to be used in C code
*/
- public virtual string? get_cname (bool var_type = false, bool const_type = false) {
- if (data_type == null && type_parameter == null) {
- if (var_type) {
- return "gpointer";
- } else {
- return "void";
- }
- }
-
- string ptr;
- if (type_parameter != null || !data_type.is_reference_type ()) {
- ptr = "";
- } else {
- ptr = "*";
- }
- if (data_type != null) {
- return data_type.get_cname (const_type) + ptr;
- } else if (type_parameter != null) {
- if (const_type) {
- return "gconstpointer";
- } else {
- return "gpointer";
- }
- } else {
- /* raise error */
- Report.error (source_reference, "unresolved type reference");
- return null;
- }
+ public virtual string? get_cname () {
+ // raise error
+ Report.error (source_reference, "unresolved type reference");
+ return null;
}
/**
return new DelegateType (delegate_symbol);
}
- public override string? get_cname (bool var_type, bool const_type) {
- return delegate_symbol.get_cname (const_type);
+ public override string? get_cname () {
+ return delegate_symbol.get_cname ();
}
public override Collection<Symbol> get_symbols () {
return new ErrorType (error_domain, source_reference);
}
- public override string? get_cname (bool var_type = false, bool const_type = false) {
+ public override string? get_cname () {
return "GError*";
}
return result;
}
+
+ public override string? get_cname () {
+ return "%s*".printf (interface_symbol.get_cname (!takes_ownership && !transfers_ownership));
+ }
}
return result;
}
- public override string? get_cname (bool var_type, bool const_type) {
+ public override string? get_cname () {
return "%sIface*".printf (interface_symbol.get_cname ());
}
}
return method_symbol.get_full_name ();
}
- public override string? get_cname (bool var_type, bool const_type) {
+ public override string? get_cname () {
return "gpointer";
}
}
public override DataType copy () {
return new NullType (source_reference);
}
+
+ public override string? get_cname () {
+ return "gpointer";
+ }
}
return base_type.to_string () + "*";
}
- public override string? get_cname (bool var_type = false, bool const_type = false) {
+ public override string? get_cname () {
if (base_type.data_type != null && base_type.data_type.is_reference_type ()) {
- return base_type.get_cname (var_type, const_type);
+ return base_type.get_cname ();
} else {
- return base_type.get_cname (var_type, const_type) + "*";
+ return base_type.get_cname () + "*";
}
}
}
if (acc.body != null && (acc.writable || acc.construction)) {
- acc.value_parameter = new FormalParameter ("value", acc.prop.type_reference, acc.source_reference);
+ var value_type = acc.prop.type_reference.copy ();
+ value_type.takes_ownership = value_type.transfers_ownership;
+ acc.value_parameter = new FormalParameter ("value", value_type, acc.source_reference);
acc.body.scope.add (acc.value_parameter.name, acc.value_parameter);
}
}
/* check for array */
if (unresolved_type.array_rank > 0) {
var element_type = type;
+ // array contains strong references by default
+ element_type.takes_ownership = element_type.is_reference_type_or_type_parameter ();
element_type.transfers_ownership = false;
element_type.nullable = false;
return result;
}
+
+ public override string? get_cname () {
+ if (takes_ownership || transfers_ownership) {
+ return "gpointer";
+ } else {
+ return "gconstpointer";
+ }
+ }
}
return result;
}
- public override string? get_cname (bool var_type, bool const_type) {
+ public override string? get_cname () {
string ptr = "";
if (nullable) {
ptr = "*";
}
- return type_symbol.get_cname (const_type) + ptr;
+ return type_symbol.get_cname () + ptr;
}
}
return "void";
}
- public override string? get_cname (bool var_type = false, bool const_type = false) {
+ public override string? get_cname () {
return "void";
}