Пример #1
0
 private static void EmitArrayElementIndexes(ArrayElementExpression arrayElement, ILGenerator methodIL)
 {
     for (int i = 0; i < arrayElement.Indexes.Length; i++)
     {
         EmitExpression(arrayElement.Indexes[i], methodIL);
         if (arrayElement.IsArrayPrimitive())
         {
             if (i != arrayElement.Indexes.Length - 1)
             {
                 methodIL.Emit(OpCodes.Ldelem_Ref);
             }
         }
     }
 }
Пример #2
0
        private static void EmitArrayElementAsAdressor(ArrayElementExpression arrayElement, Expression adressableExpression, ILGenerator methodIL)
        {
            if (IsArgument(arrayElement.ArrayName))
            {
                methodIL.Emit(OpCodes.Ldarg, GetArgumentsIndex(arrayElement.ArrayName));
            }
            else if (IsField(arrayElement.ArrayName))
            {
                methodIL.Emit(OpCodes.Ldsfld, GetCreatedField(arrayElement.ArrayName));
            }
            else
            {
                methodIL.Emit(OpCodes.Ldloc, (LocalBuilder)GetCreatedLocal(arrayElement.ArrayName));
            }

            for (int i = 0; i < arrayElement.Indexes.Length; i++)
            {
                EmitExpression(arrayElement.Indexes[i], methodIL);
            }
            EmitExpression(adressableExpression, methodIL);

            if (arrayElement.IsArrayPrimitive())
            {
                if (arrayElement.Type is InnerTypes.String)
                {
                    methodIL.Emit(OpCodes.Stelem_Ref);
                }
                else
                {
                    methodIL.Emit(OpCodes.Stelem, arrayElement.Type.GetEquivalence());
                }
            }
            else
            {
                Type[] args = Int32FilledArray(arrayElement.ArrayDimension + 1);
                args[arrayElement.ArrayDimension] = arrayElement.Type.GetEquivalence();
                methodIL.EmitCall(OpCodes.Call, arrayElement.Type.CreateArrayInstance(arrayElement.ArrayDimension).GetEquivalence().GetMethod("Set", args), null);
            }
        }
Пример #3
0
        private static void EmitArrayElement(ArrayElementExpression arrayElement, ILGenerator methodIL)
        {
            if (IsArgument(arrayElement.ArrayName))
            {
                methodIL.Emit(OpCodes.Ldarg, GetArgumentsIndex(arrayElement.ArrayName));
            }
            else if (IsField(arrayElement.ArrayName))
            {
                methodIL.Emit(OpCodes.Ldsfld, GetCreatedField(arrayElement.ArrayName));
            }
            else
            {
                methodIL.Emit(OpCodes.Ldloc, (LocalBuilder)GetCreatedLocal(arrayElement.ArrayName));
            }

            EmitArrayElementIndexes(arrayElement, methodIL);

            if (arrayElement.IsArrayPrimitive())
            {
                if (arrayElement.ArrayType is InnerTypes.String && arrayElement.Type is InnerTypes.Char)
                {
                    EmitGetCharsMethod(methodIL);
                }
                else if (arrayElement.ArrayType.ALMRepresentation.Contains("System.Char") && arrayElement.Type is InnerTypes.Char)
                {
                    methodIL.Emit(OpCodes.Ldelem_U2);
                }
                else
                {
                    methodIL.Emit(OpCodes.Ldelem, arrayElement.Type.GetEquivalence());
                }
            }
            else
            {
                methodIL.EmitCall(OpCodes.Call, arrayElement.Type.CreateArrayInstance(arrayElement.ArrayDimension).GetEquivalence().GetMethod("Get", Int32FilledArray(arrayElement.ArrayDimension)), null);
            }
        }