+2008-06-22 Jürg Billeter <j@bitron.ch>
+
+ * vala/valasemanticanalyzer.vala:
+ * gobject/valaccodeinvocationexpressionbinding.vala:
+
+ Fix pointer member access to value types, fixes bug 539337
+
2008-06-22 Jaap A. Haitsma <jaap@haitsma.org>
* vapi/packages/gio-2.0/gio-2.0.metadata:
CCodeExpression instance;
if (m != null && m.binding == MemberBinding.INSTANCE) {
instance = (CCodeExpression) ma.inner.ccodenode;
- var instance_expression_type = ma.inner.value_type;
- if (instance_expression_type.data_type is Struct
- && !((Struct) instance_expression_type.data_type).is_simple_type ()
- && instance_expression_type.data_type != codegen.current_type_symbol) {
+ var st = m.parent_symbol as Struct;
+ if (st != null && !st.is_simple_type ()) {
+ // we need to pass struct instance by reference
var unary = instance as CCodeUnaryExpression;
if (unary != null && unary.operator == CCodeUnaryOperator.POINTER_INDIRECTION) {
// *expr => expr
// (tmp = expr, &tmp)
var ccomma = new CCodeCommaExpression ();
- var temp_var = codegen.get_temp_variable (instance_expression_type);
+ var temp_var = codegen.get_temp_variable (ma.inner.target_type);
codegen.temp_vars.insert (0, temp_var);
ccomma.append_expression (new CCodeAssignment (new CCodeIdentifier (temp_var.name), instance));
ccomma.append_expression (new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, new CCodeIdentifier (temp_var.name)));
return;
}
+ if (expr.pointer_member_access) {
+ var pointer_type = expr.inner.value_type as PointerType;
+ if (pointer_type != null && pointer_type.base_type is ValueType) {
+ // transform foo->bar to (*foo).bar
+ expr.inner = new PointerIndirection (expr.inner, expr.source_reference);
+ expr.inner.accept (this);
+ expr.pointer_member_access = false;
+ }
+ }
+
if (expr.inner is MemberAccess) {
var ma = (MemberAccess) expr.inner;
if (ma.prototype_access) {