Ejemplo n.º 1
0
        private static void Process(this ArrayElementAssignment arrayElementAssignment)
        {
            arrayElementAssignment.ArrayElementReference.Process();
            arrayElementAssignment.AssignmentExpression.Process();

            var arrItemType = arrayElementAssignment.ArrayElementReference.ReturnType
                              //.CastTo<ArrayReturnType>()
                              //.InnerType
            ;

            if (arrItemType != arrayElementAssignment.AssignmentExpression.ReturnType)
            {
                if (arrayElementAssignment.AssignmentExpression.ReturnType.IsCastableTo(arrItemType))
                {
                    arrayElementAssignment.AssignmentExpression.CastToType = arrItemType;
                }

                else
                {
                    throw new ExpressionException($"Cannot assign to the element of array " +
                                                  $"{arrayElementAssignment.ArrayElementReference.Name} " +
                                                  $"({arrayElementAssignment.ArrayElementReference.ReturnType}) " +
                                                  $"expression of type {arrayElementAssignment.AssignmentExpression.ReturnType}");
                }
            }

            //blockStatement.Statements.ForEach(st => st.Process());
        }
Ejemplo n.º 2
0
        public void GenerateArrayElementAssignment(ArrayElementAssignment arrayElementAssignmentNode, ILGenerator ilGenerator)
        {
            LoadOntoStack(arrayElementAssignmentNode.ArrayElementReference.Name, ilGenerator);

            //load arr index onto stack
            GenerateExpression(arrayElementAssignmentNode.ArrayElementReference.ArrayIndex, ilGenerator);
            //load value onto stack
            GenerateExpression(arrayElementAssignmentNode.AssignmentExpression, ilGenerator);

            if (arrayElementAssignmentNode.ArrayElementReference.ReturnType.ConvertToType() == typeof(char))
            {
                ilGenerator.Emit(OpCodes.Stelem_I2);
            }
            else
            {
                if (arrayElementAssignmentNode.ArrayElementReference.ReturnType.ConvertToType() == typeof(bool))
                {
                    ilGenerator.Emit(OpCodes.Stelem_I1);
                }
                else
                {
                    ilGenerator.Emit(OpCodes.Stelem_I4);
                }
            }
        }
Ejemplo n.º 3
0
        private static IEnumerable <IInstruction> GetArrayElementAssignmentInstructions(
            this ArrayElementAssignment arrayElementAssignment)
        {
            List <IInstruction> instructions = new List <IInstruction>();

            instructions.Add(GetLoadInstruction(arrayElementAssignment.ArrayElementReference.ArrayDeclaration));
            instructions.AddRange(arrayElementAssignment.ArrayElementReference.ArrayIndex.GetInstructions());
            instructions.AddRange(arrayElementAssignment.AssignmentExpression.GetInstructions());
            instructions.Add(GetArrayStoreInstruction(arrayElementAssignment.AssignmentExpression.ReturnType));
            return(instructions);
        }