public override void GenerateCode(ILGenerator codeGenerator, TypeBuilder typeBuilder, ModuleBuilder moduleBuilder)
{
Type elementType = Environment.GetCLRType(((ArrayType)ReturnType).ElementsType);
codeGenerator.BeginScope();
Label forStart = codeGenerator.DefineLabel();
Label forEnd = codeGenerator.DefineLabel();
LocalBuilder lengthBuilder = codeGenerator.DeclareLocal(typeof(int));
LocalBuilder i = codeGenerator.DeclareLocal(typeof(int));
codeGenerator.Emit(OpCodes.Ldc_I4_M1);
codeGenerator.Emit(OpCodes.Stloc, i);
SizeExp.GenerateCode(codeGenerator, typeBuilder, moduleBuilder);
codeGenerator.Emit(OpCodes.Stloc, lengthBuilder);
codeGenerator.Emit(OpCodes.Ldloc, lengthBuilder);
codeGenerator.Emit(OpCodes.Newarr, elementType);
codeGenerator.MarkLabel(forStart);
// i++
codeGenerator.Emit(OpCodes.Dup);
codeGenerator.Emit(OpCodes.Ldloc, i);
codeGenerator.Emit(OpCodes.Ldc_I4_1);
codeGenerator.Emit(OpCodes.Add);
codeGenerator.Emit(OpCodes.Stloc, i);
codeGenerator.Emit(OpCodes.Ldloc, i);
// if i >= lengthBuilder goto END
codeGenerator.Emit(OpCodes.Ldloc, lengthBuilder);
codeGenerator.Emit(OpCodes.Bge, forEnd);
// Stack: arrayRef / i / obj / Stelem
codeGenerator.Emit(OpCodes.Ldloc, i);
InitialValueExp.GenerateCode(codeGenerator, typeBuilder, moduleBuilder);
codeGenerator.Emit(OpCodes.Stelem, elementType);
codeGenerator.Emit(OpCodes.Br, forStart);
codeGenerator.MarkLabel(forEnd);
codeGenerator.Emit(OpCodes.Pop);
codeGenerator.EndScope();
}