Пример #1
0
        public override Type GenCode(ILGenerator ilGenerator, TypeBuilder parent, FieldBuilder IsBreakFields, List <FieldBuilder> level, Label endLabel)
        {
            Label begin = ilGenerator.DefineLabel();
            Label end   = ilGenerator.DefineLabel();

            Type         typeInitial = Initial.GenCode(ilGenerator, parent, IsBreakFields, level, endLabel); //genero el codigo del tipo de los elementos del array
            LocalBuilder value       = ilGenerator.DeclareLocal(typeInitial);

            ilGenerator.Emit(OpCodes.Stloc, value);                                                    //guardo la variable que tiene el valor de los elementos del array

            Type         typeSize = Size.GenCode(ilGenerator, parent, IsBreakFields, level, endLabel); //genero el codigo del size y deja en el tope el tamano
            LocalBuilder size     = ilGenerator.DeclareLocal(typeof(int));

            ilGenerator.Emit(OpCodes.Stloc, size);         //guardo el size del array
            ilGenerator.Emit(OpCodes.Ldloc, size);         //lo meto en el tope porque la creacion del array necesita el tamano en el tope
            ilGenerator.Emit(OpCodes.Newarr, typeInitial); //el size esta en el tope

            //ahora tengo que crear la variable del array y guardarla
            LocalBuilder array = ilGenerator.DeclareLocal(typeInitial);

            ilGenerator.Emit(OpCodes.Stloc, array); //guardo el array

            //ahora tengo que empezar a llenarlo
            LocalBuilder index = ilGenerator.DeclareLocal(typeof(int)); //el indice por el que me voy moviendo

            ilGenerator.Emit(OpCodes.Ldc_I4_0);
            ilGenerator.Emit(OpCodes.Stloc, index); //hago index=0
            //comienza el ciclo
            ilGenerator.MarkLabel(begin);
            //ver si no me he pasado
            ilGenerator.Emit(OpCodes.Ldloc, index);
            ilGenerator.Emit(OpCodes.Ldloc, size);
            ilGenerator.Emit(OpCodes.Bge, end);     //si index >= size se acabo el ciclo
            //ahora si lleno (se usa el stelem)
            ilGenerator.Emit(OpCodes.Ldloc, array); //meto el array
            ilGenerator.Emit(OpCodes.Ldloc, index); //meto el indice por el que voy
            ilGenerator.Emit(OpCodes.Ldloc, value); //meto la variable que tiene el valor con el que se va a llenar
            ilGenerator.Emit(OpCodes.Stelem, typeInitial);
            //aumento el indice
            ilGenerator.Emit(OpCodes.Ldc_I4_1);
            ilGenerator.Emit(OpCodes.Ldloc, index);
            ilGenerator.Emit(OpCodes.Add);          //sumo index + 1
            ilGenerator.Emit(OpCodes.Stloc, index); //hago index = index + 1
            ilGenerator.Emit(OpCodes.Br, begin);    //comienza otra iteracion

            //se acabo el ciclo
            ilGenerator.MarkLabel(end);

            //ilGenerator.Emit(OpCodes.Ldarg);
            ilGenerator.Emit(OpCodes.Ldloc, array); //dejo la referencia al array en el tope

            return(Array.MyType());
        }