Нет строгих паролей в Scala - обходные пути?

Я искал в Интернете, как обеспечить соблюдение srictfp в Скале, но не смог найти намека на это. Есть некоторые люди, жалующиеся на это, но реальные решения не могут быть найдены. Об этом есть запись об ошибке, которой почти два года. Кажется, что нет элегантного решения проблемы, когда я ищу обходные пути.

Моя текущая идея состоит в том, чтобы установить флажок подходящего метода ACC_STRICT в сгенерированном байт-коде сам как-то, но я понятия не имею, что будет лучшим решением для этого. Вспоминается плагин компилятора Scala или просто взламывает флаги в шестнадцатеричном редакторе. Может быть, кто-то сталкивался с такой же проблемой и может сказать мне свое решение?

2 ответа

Решение

Вы можете добавить постпроцессор в процесс сборки, который добавит strictfp модификатор сгенерированного класса (т.е. установка ACC_STRICT пометьте как говорите).

Вы можете реализовать такой постпроцессор, используя, например, Javassist. Это может выглядеть так:

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

Затем вам нужно будет найти способ настроить, какие классы / методы должны быть изменены таким образом.

Скала имеет strictfp аннотация сейчас:

@strictfp
def f() = …
Другие вопросы по тегам