if (unary_expr.operator == UnaryOperator.OUT || unary_expr.operator == UnaryOperator.REF) {
is_out = true;
}
- } else if (array_expr is ReferenceTransferExpression) {
- var reftransfer_expr = (ReferenceTransferExpression) array_expr;
- array_expr = reftransfer_expr.inner;
}
List<CCodeExpression> size = get_array_sizes (array_expr);
ccode.add_expression (new CCodeAssignment (get_cvalue (expr.inner), new CCodeConstant ("NULL")));
set_cvalue (expr, cvar);
+
+ 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, 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, get_delegate_target_cexpression (expr.inner, out target_destroy_notify));
+ if (target_destroy_notify != null) {
+ set_delegate_target_destroy_notify (expr, target_destroy_notify);
+ }
+ }
}
public override void visit_binary_expression (BinaryExpression expr) {
public override CCodeExpression get_delegate_target_cexpression (Expression delegate_expr, out CCodeExpression delegate_target_destroy_notify) {
delegate_target_destroy_notify = new CCodeConstant ("NULL");
- if (delegate_expr is ReferenceTransferExpression) {
- var reftransfer_expr = (ReferenceTransferExpression) delegate_expr;
- delegate_expr = reftransfer_expr.inner;
- }
-
if (get_delegate_target_destroy_notify (delegate_expr) != null) {
delegate_target_destroy_notify = get_delegate_target_destroy_notify (delegate_expr);
}