【问题标题】:No strictfp in Scala - workarounds?Scala 中没有 strictfp - 解决方法?
【发布时间】:2010-10-27 15:09:29
【问题描述】:

我在网上搜索了如何在 Scala 中强制执行 srictfp,但找不到任何提示。有人抱怨它,但找不到真正的解决方案。有一个关于它的bugtracker entry 已经快两年了。在我寻找解决方法的过程中,似乎没有优雅的解决方法。

我目前的想法是我自己在生成的字节码中设置适当的方法标志ACC_STRICT,但我不知道这样做的最佳解决方案是什么。想到一个 Scala 编译器插件,或者只是在十六进制编辑器中修改标志。也许有人面临同样的挑战,可以告诉我他或她的解决方案吗?

【问题讨论】:

  • 我喜欢你的ACC_STRICT 方法! :D
  • 编译器插件会受到 Scala 社区的欢迎。
  • @Dave Griffith,当然最好的解决方案是让 Scala 原生支持 strictfp(即能够使用此标志生成字节码),正如 bugtracker 条目中所报告的那样。

标签: scala strictfp


【解决方案1】:

您可以在构建过程中添加一个后处理器,将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")));

然后,您必须找到一种方法来配置需要以这种方式修改哪些类/方法。

【讨论】:

  • 这看起来很有希望,而且比开发 Scala 编译器插件更容易——我会尝试这样做,如果设置了给定的注释,则会触发设置 ACC_STRICT 标志。应该是不言而喻的。谢谢! :)
【解决方案2】:

Scala 现在有一个strictfp 注释:

@strictfp
def f() = …

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-07
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 2020-02-01
    • 2021-05-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多