Beispiel #1
0
        protected internal override void VisitNewObj(NewObj inst)
        {
            if (TransformDecimalCtorToConstant(inst, out LdcDecimal decimalConstant))
            {
                context.Step("TransformDecimalCtorToConstant", inst);
                inst.ReplaceWith(decimalConstant);
                return;
            }
            Block block;

            if (TransformSpanTCtorContainingStackAlloc(inst, out ILInstruction locallocSpan))
            {
                context.Step("new Span<T>(stackalloc) -> stackalloc Span<T>", inst);
                inst.ReplaceWith(locallocSpan);
                block = null;
                ILInstruction stmt = locallocSpan;
                while (stmt.Parent != null)
                {
                    if (stmt.Parent is Block b)
                    {
                        block = b;
                        break;
                    }
                    stmt = stmt.Parent;
                }
                // Special case to eliminate extra store
                if (stmt.GetNextSibling() is StLoc storeStmt && storeStmt.Value is LdLoc)
                {
                    ILInlining.InlineIfPossible(block, stmt.ChildIndex, context);
                }
                return;
            }
            if (TransformArrayInitializers.TransformSpanTArrayInitialization(inst, context, out block))
            {
                context.Step("TransformSpanTArrayInitialization: single-dim", inst);
                inst.ReplaceWith(block);
                return;
            }
            if (TransformDelegateCtorLdVirtFtnToLdVirtDelegate(inst, out LdVirtDelegate ldVirtDelegate))
            {
                context.Step("new Delegate(target, ldvirtftn Method) -> ldvirtdelegate Delegate Method(target)", inst);
                inst.ReplaceWith(ldVirtDelegate);
                return;
            }
            base.VisitNewObj(inst);
        }