2010-10-27 18 views
8

Ich suchte im Internet nach, wie man in Scala srictfp erzwingt, konnte aber keinen Hinweis darauf finden. Es gibt einige Leute, die sich darüber beschweren, aber echte Lösungen können nicht gefunden werden. Es gibt eine bugtracker entry darüber, die fast zwei Jahre alt ist. Wie es scheint, gibt es keine elegante Lösung für die Suche nach Workarounds.Nein strictfp in Scala - Umgehungslösungen?

Meine aktuelle Idee ist es, das entsprechende Methodenflag ACC_STRICT im generierten Bytecode irgendwie selbst zu setzen, aber ich habe keine Ahnung, was die beste Lösung dafür wäre. Man denke nur an ein Scala Compiler Plugin oder hackt nur Flags in einem Hexeditor. Vielleicht hat jemand die gleiche Herausforderung und kann mir seine Lösung sagen?

+0

ich Ihre 'ACC_STRICT' Ansatz graben! : D – aioobe

+0

Ein Compiler-Plugin würde von der Scala-Community sehr geschätzt werden. –

+0

@Dave Griffith, sicherlich wäre die beste Lösung für Scala, 'strictfp' nativ zu unterstützen (d. H. Den Bytecode mit diesem Flag erzeugen zu können), wie im Bugtracker-Eintrag berichtet. – Bruno

Antwort

5

Sie könnten einen Postprozessor in Ihrem Build-Prozess hinzufügen, der den Modifikator strictfp zu der generierten Klasse hinzufügt (d. H. Das Flag ACC_STRICT wie Sie sagen) setzt.

Sie können einen solchen Postprozessor beispielsweise mit Javassist implementieren. Dies könnte wie folgt aussehen:

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

Sie müssten dann einen Weg finden zu konfigurieren, welche Klassen/Methoden auf diese Weise geändert werden müssen.

+0

Dies sieht vielversprechend und viel einfacher als die Entwicklung eines Scala Compiler Plugins aus - ich werde es versuchen und das Flag 'ACC_STRICT' setzen, wenn eine bestimmte Anmerkung gesetzt ist. Sollte ein Kinderspiel sein. Vielen Dank! :) – Malax

0

Scala hat eine strictfp Anmerkung jetzt:

@strictfp 
def f() = …