2010-10-27 5 views
8

He buscado en la web cómo hacer cumplir srictfp en Scala, pero no he podido encontrar ningún indicio de ello. Hay algunas personas que se quejan de ello, pero las soluciones reales no se pueden encontrar. Hay un bugtracker entry que tiene casi dos años. Como parece que no hay una solución elegante en el camino, estoy buscando soluciones.No strictfp en Scala: ¿soluciones temporales?

Mi idea actual es establecer el indicador de método apropiado ACC_STRICT en el bytecode generado de alguna manera, pero no tengo idea de cuál sería la mejor solución para hacerlo. Me viene a la mente un plugin de compilador de Scala o simplemente piratear banderas en un editor hexadecimal. ¿Tal vez alguien se enfrentó al mismo desafío y puede decirme su solución?

+0

cavo su enfoque 'ACC_STRICT'! : D – aioobe

+0

Un plugin de compilación sería muy apreciado por la comunidad de Scala. –

+0

@Dave Griffith, seguramente la mejor solución sería que Scala admitiera 'strictfp' de forma nativa (es decir, para poder generar el bytecode con esta bandera), como se informó en la entrada del rastreador de errores. – Bruno

Respuesta

5

Puede agregar un postprocesador en su proceso de compilación que agregue el modificador strictfp a la clase generada (es decir, establecer el indicador ACC_STRICT como usted dice).

Puede implementar dicho postprocesador usando Javassist por ejemplo. Esto podría verse así:

CtClass clazz = ClassPool.getDefault().makeClass(
        new FileInputStream("old/HelloWorld.class")); 

CtMethod method = clazz.getDeclaredMethod("testMethod"); 

method.setModifiers(method.getModifiers() | Modifier.STRICT); 

clazz.detach(); 
clazz.toBytecode(new DataOutputStream(new FileOutputStream(
    "new/HelloWorld.class"))); 

Luego, debe encontrar la forma de configurar qué clases/método deben modificarse de esta manera.

+0

Esto parece prometedor y mucho más fácil que desarrollar un complemento de compilación de Scala; lo intentaré y activará la configuración del indicador 'ACC_STRICT' si se establece una anotación determinada. Debería ser una obviedad. ¡Gracias! :) – Malax

0

Scala tiene una anotación strictfp ahora:

@strictfp 
def f() = … 
Cuestiones relacionadas