public static void GetSingleDimensionArrayCtor( IType arrayType, ITypeResolver typeResolver, out object[] code, out IList <object> tokenResolutions, out IList <IType> locals, out IList <IParameter> parameters) { Debug.Assert(arrayType.IsArray && !arrayType.IsMultiArray, "This is for single dim arrays only"); var codeList = new List <object>(); var arrayRank = arrayType.ArrayRank; var elementType = arrayType.GetElementType(); var typeCode = elementType.GetTypeCode(); var elementSize = elementType.GetTypeSize(typeResolver, true); codeList.AddRange( new object[] { Code.Ldarg_0, Code.Dup, Code.Dup, Code.Dup, }); codeList.AppendLoadInt(arrayRank); codeList.AppendInt(Code.Stfld, 1); codeList.AppendLoadInt(typeCode); codeList.AppendInt(Code.Stfld, 2); codeList.AppendLoadInt(elementSize); codeList.AppendInt(Code.Stfld, 3); codeList.AppendLoadArgument(1); codeList.AppendInt(Code.Stfld, 4); // return codeList.AddRange( new object[] { Code.Ret }); // locals locals = new List <IType>(); locals.Add(typeResolver.System.System_Int32.ToArrayType(1)); locals.Add(typeResolver.System.System_Int32.ToArrayType(1)); // tokens tokenResolutions = new List <object>(); tokenResolutions.Add(arrayType.GetFieldByName("rank", typeResolver)); tokenResolutions.Add(arrayType.GetFieldByName("typeCode", typeResolver)); tokenResolutions.Add(arrayType.GetFieldByName("elementSize", typeResolver)); tokenResolutions.Add(arrayType.GetFieldByName("length", typeResolver)); // code code = codeList.ToArray(); // parameters parameters = ArrayMultiDimensionGen.GetParameters(arrayType, typeResolver); }
private static void GetCalculationPartOfSingleDimArrayAllocationSizeMethodBody( ITypeResolver typeResolver, IType arrayType, out object[] code, out IList <object> tokenResolutions, out IList <IType> locals, out IList <IParameter> parameters) { var codeList = new List <object>(); // add element size var elementType = arrayType.GetElementType(); var elementSize = elementType.GetTypeSize(typeResolver, true); codeList.AppendLoadInt(elementSize); // load length codeList.AppendLoadArgument(0); codeList.Add(Code.Mul); var arrayTypeSizeWithoutArrayData = arrayType.GetTypeSize(typeResolver); codeList.AppendLoadInt(arrayTypeSizeWithoutArrayData); codeList.Add(Code.Add); // calculate alignment codeList.Add(Code.Dup); var alignForType = Math.Max(LlvmWriter.PointerSize, !elementType.IsStructureType() ? elementSize : LlvmWriter.PointerSize); codeList.AppendLoadInt(alignForType - 1); codeList.Add(Code.Add); codeList.AppendLoadInt(~(alignForType - 1)); codeList.Add(Code.And); // locals locals = new List <IType>(); // tokens tokenResolutions = new List <object>(); // parameters parameters = ArrayMultiDimensionGen.GetParameters(arrayType, typeResolver); code = codeList.ToArray(); }