// Create an access to a temporary variable, with proper reference transfer if needed public static Expression create_temp_access(LocalVariable local, DataType target_type) { Expression temp_access = MemberAccess.simple(local.name, local.source_reference); var target_owned = target_type != null && target_type.value_owned; if (target_owned && local.variable_type.is_disposable()) { temp_access = new ReferenceTransferExpression(temp_access, local.source_reference); temp_access.target_type = target_type != null?target_type.copy() : local.variable_type.copy(); temp_access.target_type.value_owned = true; } else { temp_access.target_type = target_type != null?target_type.copy() : null; } return(temp_access); }
public override void visit_reference_transfer_expression(ReferenceTransferExpression expr) { expr.accept_children(this); }
public override bool check(CodeContext context) { if (is_checked) { return(!error); } is_checked = true; if (!value_type.check(context)) { error = true; return(false); } var old_symbol = context.analyzer.current_symbol; context.analyzer.current_symbol = this; if (writable || construction) { value_parameter = new Parameter("value", value_type, source_reference); } if (prop.source_type == SourceFileType.SOURCE) { if (body == null && !prop.interface_only && !prop.is_abstract) { /* no accessor body specified, insert default body */ automatic_body = true; body = new Block(source_reference); var ma = MemberAccess.simple("_%s".printf(prop.name), source_reference); if (readable) { body.add_statement(new ReturnStatement(ma, source_reference)); } else { Expression value = MemberAccess.simple("value", source_reference); if (value_type.value_owned) { value = new ReferenceTransferExpression(value, source_reference); } var assignment = new Assignment(ma, value, AssignmentOperator.SIMPLE, source_reference); body.add_statement(new ExpressionStatement(assignment)); } } } if ((prop.is_abstract || prop.is_virtual || prop.overrides) && access == SymbolAccessibility.PRIVATE) { error = true; Report.error(source_reference, "Property `%s' with private accessor cannot be marked as abstract, virtual or override".printf(prop.get_full_name())); return(false); } if (body != null) { if (writable || construction) { body.scope.add(value_parameter.name, value_parameter); } body.check(context); foreach (DataType body_error_type in body.get_error_types()) { if (!((ErrorType)body_error_type).dynamic_error) { Report.warning(body_error_type.source_reference, "unhandled error `%s'".printf(body_error_type.ToString())); } } } context.analyzer.current_symbol = old_symbol; return(!error); }
/// <summary> /// Visit operation called for reference transfer expressions. /// /// <param name="expr">a reference transfer expression</param> /// </summary> public virtual void visit_reference_transfer_expression(ReferenceTransferExpression expr) { }