示例#1
0
        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)));
        }
示例#2
0
        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
                        );
                }
            }
        }
示例#3
0
        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));
        }