Generación de saltos y código fuente de Java

Estoy generando código Java sobre la marcha que luego se compilará y volverá a cargar. Mi problema es que esencialmente necesito saltos porque cuando regreso de la función deseo continuar la ejecución desde el punto en el bucle desde donde salí. Con suerte, el código aquí ilustra mi deseo. Aunque el código real también tendrá algunos ifs y será mucho más profundo.

MyIter a,b,c;

boolean func() {
 jump to correct state here

 state0:

 a = ...;
 while (a.next()) {
   state1: while (b.next()) {
     return true; // start again at state1
   }
   b = ...;
 }

 c = ...;
 state2:
 while (c.next()) {
   return true; // start again at state2
 }
 return false;
}

En CI probablemente usaría una tabla de salto y una variable de estado. El rendimiento es la clave aquí y el código interactúa con la aplicación Java.

Mis mejores conjeturas hasta ahora han sido:

  • Volteando el anidamiento de bucles y la lógica. Eso se volvió demasiado engorroso y problemático.
  • Agregar lógica para permitir que el flujo vuelva a donde estaba, pero esto puede ser complicado.
  • Supongo que el código de bytes puede saltar para poder generar el código de bytes yo mismo, pero eso no parece ideal (¿hay alguna buena biblioteca para esto?)
  • Continuar pasando el estilo para evitar regresar, pero eso implicaría una reestructuración importante, aunque actualmente es el camino a seguir.

Me preguntaba si alguien tenía alguna idea.

preguntado el 08 de enero de 11 a las 20:01

Creo que le resultará difícil hacer saltos incluso en el código de bytes: el verificador tiene todo tipo de reglas que hacen que el código de bytes sea mucho menos flexible de lo que podría pensar. -

2 Respuestas

La opción más simple es usar un bloque de interruptores (o si es necesario, declaraciones de interruptores anidadas)

enum State {
   state1, state2, state3;
}

State state = State.state1;

public boolean func() {
   while(true) {
     switch(state) {
        case state1:
            if(test()) return true;
            state = state2;
            break;
        case state2:
            if(test2()) return false;
            state = state3;
            break;
        case state3:
            if(test3()) return true;
            state = state1;
            break;
      }
   }
}

Respondido el 08 de enero de 11 a las 23:01

Gracias. Después de jugar y pensar un poco más esta parece la mejor opción para mis propósitos. Una implementación rápida está funcionando bien, aunque lamentablemente estará anidada a veces. - Topera

Es posible que pueda aplanar los estados si tiene state3_1, state3_2, ... state3_N. Eso puede aclarar las cosas o no. - Peter Lawrey

Una biblioteca de corrutinas de Java podría adaptarse a sus propósitos. Ver esta pregunta relacionada con StackOverflow para algunos punteros

contestado el 23 de mayo de 17 a las 15:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.