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()); }
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); } } }
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); }