public static void ResolveArrayElement(ArrayElementExpression arrayElement, Table.Table table, bool asAdressor = false) { if (table.CheckIdentifier(arrayElement.ArrayName) && asAdressor) { TableIdentifier tableIdentifier = table.FetchIdentifier(arrayElement.ArrayName); if (tableIdentifier.Type is String) { ReportError(new CannotChangeTheString(arrayElement.SourceContext)); } } if (table.CheckIdentifier(arrayElement.ArrayName) && table.FetchIdentifier(arrayElement.ArrayName).Type is ArrayType) { TableIdentifier tableIdentifier = table.FetchIdentifier(arrayElement.ArrayName); arrayElement.ArrayDimension = (ushort)((ArrayType)tableIdentifier.Type).Dimension; arrayElement.Type = ((ArrayType)tableIdentifier.Type).GetDimensionElementType(arrayElement.Dimension); arrayElement.ArrayType = tableIdentifier.Type; if (arrayElement.Type is null || arrayElement.ArrayDimension != arrayElement.Dimension) { ReportError(new WrongArrayElementDimension(arrayElement.SourceContext)); } } else { ReportError(new ArrayIsNotDeclared(arrayElement.ArrayName, arrayElement.SourceContext)); } }
public static void TryToCastArrayElementExpression(ArrayElementExpression arrayElement, InnerType toType) { SyntaxTreeNode parent = arrayElement.Parent; if (CanCast(arrayElement.Type, toType, false)) { CastCase castCase = DefineCastCase(arrayElement.Type, toType); Expression castMethod = CreateCastMethod(parent, toType, new ParameterDeclaration[] { new ParameterDeclaration(arrayElement) }, castCase); Replace(parent, arrayElement, castMethod); } }
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); } } } }
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); } }
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); } }
public static InnerType ResolveArrayElementExpressionType(ArrayElementExpression arrayElement) { return(arrayElement.Type); }