public override BoundNode VisitReadOnlySpanFromArray(BoundReadOnlySpanFromArray node) { BoundSpillSequenceBuilder builder = null; BoundExpression operand = VisitExpression(ref builder, node.Operand); return(UpdateExpression(builder, node.Update(operand, node.ConversionMethod, node.Type))); }
private void EmitReadOnlySpanFromArrayExpression( BoundReadOnlySpanFromArray expression, bool used ) { BoundExpression operand = expression.Operand; var typeTo = (NamedTypeSymbol)expression.Type; Debug.Assert( (operand.Type.IsArray()) && this._module.Compilation.IsReadOnlySpanType(typeTo), "only special kinds of conversions involving ReadOnlySpan may be handled in emit" ); if (!TryEmitReadonlySpanAsBlobWrapper(typeTo, operand, used, inPlace: false)) { // there are several reasons that could prevent us from emitting a wrapper // in such case we just emit the operand and then invoke the conversion method EmitExpression(operand, used); if (used) { // consumes 1 argument (array) and produces one result (span) _builder.EmitOpCode(ILOpCode.Call, stackAdjustment: 0); EmitSymbolToken( expression.ConversionMethod, expression.Syntax, optArgList: null ); } } }
public override BoundNode VisitReadOnlySpanFromArray(BoundReadOnlySpanFromArray node) { BoundExpression operand = (BoundExpression)this.Visit(node.Operand); MethodSymbol method = VisitMethodSymbol(node.ConversionMethod); TypeSymbol type = this.VisitType(node.Type); return(node.Update(operand, method, type)); }