2010-10-27 14 views
8

Ho cercato sul web come applicare srictfp in Scala ma non ho trovato alcun suggerimento. Ci sono alcune persone che si lamentano, ma non è possibile trovare soluzioni reali. C'è uno bugtracker entry su di esso che ha quasi due anni. Sembra che non ci sia una soluzione elegante per il modo in cui sto cercando soluzioni alternative.No strictfp in Scala: soluzioni alternative?

La mia idea attuale è quella di impostare il metodo appropriato flag ACC_STRICT nel codice byte generato da me in qualche modo, ma non ho idea di quale sarebbe la soluzione migliore per farlo. Un plug-in del compilatore di Scala viene in mente o semplicemente un hacking di flag in un editor esadecimale. Forse qualcuno ha affrontato la stessa sfida e può dirmi la sua soluzione?

+0

I scavare il vostro 'approccio ACC_STRICT'! : D – aioobe

+0

Un plugin per compilatore sarebbe molto apprezzato dalla comunità di Scala. –

+0

@Dave Griffith, sicuramente la migliore soluzione sarebbe che Scala supportasse 'strictfp' nativamente (cioè per poter generare il bytecode con questo flag), come riportato nella voce bugtracker. – Bruno

risposta

5

È possibile aggiungere un post-processore nel processo di creazione che aggiungerebbe il modificatore strictfp alla classe generata (ad esempio impostando il flag ACC_STRICT come si dice).

È possibile implementare tale post-processore utilizzando Javassist ad esempio. Questo potrebbe essere il seguente:

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"))); 

Dovresti quindi trovare un modo per configurare quali classi/metodo devono essere modificati in questo modo.

+0

Questo sembra promettente e molto più semplice dello sviluppo di un plugin per compilatore di Scala - lo proverò e attiverò l'impostazione del flag "ACC_STRICT' se è impostata una data annotazione. Dovrebbe essere un gioco da ragazzi. Grazie! :) – Malax

0

Scala ha un'annotazione strictfp ora:

@strictfp 
def f() = … 
Problemi correlati