예제 #1
0
        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));
            }
        }
예제 #2
0
파일: TypeResolver.cs 프로젝트: almeswe/alm
        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);
            }
        }
예제 #3
0
파일: Emitter.cs 프로젝트: almeswe/alm
 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);
             }
         }
     }
 }
예제 #4
0
파일: Emitter.cs 프로젝트: almeswe/alm
        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);
            }
        }
예제 #5
0
파일: Emitter.cs 프로젝트: almeswe/alm
        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);
            }
        }
예제 #6
0
파일: TypeResolver.cs 프로젝트: almeswe/alm
 public static InnerType ResolveArrayElementExpressionType(ArrayElementExpression arrayElement)
 {
     return(arrayElement.Type);
 }