if (array_expr is UnaryExpression) {
var unary_expr = (UnaryExpression) array_expr;
if (unary_expr.operator == UnaryOperator.OUT || unary_expr.operator == UnaryOperator.REF) {
- array_expr = unary_expr.inner;
is_out = true;
}
} else if (array_expr is ReferenceTransferExpression) {
List<CCodeExpression> size = get_array_sizes (array_expr);
if (size != null && size.size >= dim) {
- if (is_out) {
- // passing array as out/ref
- return new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, size[dim - 1]);
- } else {
- return size[dim - 1];
- }
+ return size[dim - 1];
}
if (!is_out) {
}
public override void visit_unary_expression (UnaryExpression expr) {
+ if (expr.operator == UnaryOperator.REF || expr.operator == UnaryOperator.OUT) {
+ set_cvalue (expr, new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, get_cvalue (expr.inner)));
+
+ var array_type = expr.value_type as ArrayType;
+ if (array_type != null) {
+ for (int dim = 1; dim <= array_type.rank; dim++) {
+ append_array_size (expr, new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, get_array_length_cexpression (expr.inner, dim)));
+ }
+ }
+
+ var delegate_type = expr.value_type as DelegateType;
+ if (delegate_type != null && delegate_type.delegate_symbol.has_target) {
+ CCodeExpression target_destroy_notify;
+ set_delegate_target (expr, new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, get_delegate_target_cexpression (expr.inner, out target_destroy_notify)));
+ if (target_destroy_notify != null) {
+ set_delegate_target_destroy_notify (expr, new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, target_destroy_notify));
+ }
+ }
+
+ return;
+ }
+
CCodeUnaryOperator op;
if (expr.operator == UnaryOperator.PLUS) {
op = CCodeUnaryOperator.PLUS;
op = CCodeUnaryOperator.PREFIX_INCREMENT;
} else if (expr.operator == UnaryOperator.DECREMENT) {
op = CCodeUnaryOperator.PREFIX_DECREMENT;
- } else if (expr.operator == UnaryOperator.REF) {
- op = CCodeUnaryOperator.ADDRESS_OF;
- } else if (expr.operator == UnaryOperator.OUT) {
- op = CCodeUnaryOperator.ADDRESS_OF;
} else {
assert_not_reached ();
}
}
public override CCodeExpression get_delegate_target_cexpression (Expression delegate_expr, out CCodeExpression delegate_target_destroy_notify) {
- bool is_out = false;
-
delegate_target_destroy_notify = new CCodeConstant ("NULL");
- if (delegate_expr is UnaryExpression) {
- var unary_expr = (UnaryExpression) delegate_expr;
- if (unary_expr.operator == UnaryOperator.OUT || unary_expr.operator == UnaryOperator.REF) {
- delegate_expr = unary_expr.inner;
- is_out = true;
- }
- }
-
- bool expr_owned = delegate_expr.value_type.value_owned;
-
if (delegate_expr is ReferenceTransferExpression) {
var reftransfer_expr = (ReferenceTransferExpression) delegate_expr;
delegate_expr = reftransfer_expr.inner;
var target_expr = get_delegate_target (delegate_expr);
if (target_expr == null) {
return new CCodeConstant ("NULL");
- } else if (is_out) {
- // passing delegate as out/ref
- if (expr_owned) {
- delegate_target_destroy_notify = new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, delegate_target_destroy_notify);
- }
- return new CCodeUnaryExpression (CCodeUnaryOperator.ADDRESS_OF, target_expr);
} else {
return target_expr;
}
cexpr = handle_struct_argument (param, arg, cexpr);
} else {
+ arg.target_value = null;
+
var temp_var = get_temp_variable (param.variable_type, param.variable_type.value_owned);
emit_temp_var (temp_var);
set_cvalue (arg, get_variable_cexpression (temp_var.name));