TriAxis.RunSharp.CodeGen.GetStelemOpCode C# (CSharp) Method

GetStelemOpCode() protected static method

protected static GetStelemOpCode ( Type elementType ) : OpCode
elementType IKVM.Reflection.Type
return System.Reflection.Emit.OpCode
        protected internal static OpCode GetStelemOpCode(Type elementType)
        {
            if (elementType.IsPrimitive)
            {
                switch (Type.GetTypeCode(elementType))
                {
                    case TypeCode.Byte:
                    case TypeCode.SByte:
                    case TypeCode.Boolean:
                        return OpCodes.Stelem_I1;

                    case TypeCode.Int16:
                    case TypeCode.UInt16:
                    case TypeCode.Char:
                        return OpCodes.Stelem_I2;

                    case TypeCode.Int32:
                    case TypeCode.UInt32:
                        return OpCodes.Stelem_I4;

                    case TypeCode.Int64:
                    case TypeCode.UInt64:
                        return OpCodes.Stelem_I8;

                    case TypeCode.Single:
                        return OpCodes.Stelem_R4;

                    case TypeCode.Double:
                        return OpCodes.Stelem_R8;

                    default:
                        throw new NotSupportedException();
                }
            }
            else if (elementType.IsValueType)
                return OpCodes.Stobj;
            else
                return OpCodes.Stelem_Ref;
        }

Usage Example

Example #1
0
        public void EmitArgs(CodeGen g, Operand[] args)
        {
            if (args.Length != appliedSignature.Length)
            {
                throw new InvalidOperationException();
            }

            if (IsExpanded)
            {
                int  fixedCount = methodSignature.Length - 1;
                Type expType    = methodSignature[fixedCount].GetElementType();

                for (int i = 0; i < fixedCount; i++)
                {
                    EmitArg(g, i, args[i]);
                }

                int arrayLen = args.Length - methodSignature.Length - 1;
                g.EmitI4Helper(arrayLen);
                g.IL.Emit(OpCodes.Newarr, expType);
                OpCode stelemCode = CodeGen.GetStelemOpCode(expType);
                for (int i = 0; i < arrayLen; i++)
                {
                    g.IL.Emit(OpCodes.Dup);
                    g.EmitI4Helper(i);
                    if (stelemCode == OpCodes.Stobj)
                    {
                        g.IL.Emit(OpCodes.Ldelema, expType);
                    }
                    EmitArg(g, fixedCount + i, args[fixedCount + i]);
                    if (stelemCode == OpCodes.Stobj)
                    {
                        g.IL.Emit(OpCodes.Stobj, expType);
                    }
                    else
                    {
                        g.IL.Emit(stelemCode);
                    }
                }
            }
            else
            {
                for (int i = 0; i < args.Length; i++)
                {
                    EmitArg(g, i, args[i]);
                }
            }
        }