Pas strictfp à Scala - solutions de contournement?
Question
Je recherche sur le web pour savoir comment appliquer srictfp
à Scala, mais n'a pas pu trouver aucune trace de celui-ci. Il y a des gens qui se plaignent, mais des solutions réelles ne peuvent pas être trouvées. Il y a un bugtracker entrée à ce qui est presque deux ans. Comme il semble qu'il n'y ait pas de solution élégante pour elle sur la façon dont je suis à la recherche de solutions de contournement.
Mon idée actuelle est de définir le ACC_STRICT
de drapeau de la méthode dans le bytecode correspond le produit par moi-même en quelque sorte, mais je ne sais pas quelle serait la meilleure solution pour le faire. Un Scala compilateur Plugin vient à l'esprit ou tout simplement des drapeaux dans un hacking éditeur hexadécimal. Peut-être que quelqu'un a fait face au même défi et peut me dire sa solution?
La solution
Vous pouvez ajouter un post-processeur dans votre processus de construction qui ajouterait le modificateur de strictfp
à la classe générée (à savoir la définition du drapeau de ACC_STRICT
comme vous le dites).
Vous pouvez mettre en œuvre un tel post-processeur en utilisant Javassist par exemple. Cela pourrait ressembler à ceci:
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")));
Vous auriez alors de trouver un moyen de configurer les besoins des classes / méthode pour modifier cette façon.
Autres conseils
Scala a une annotation strictfp
maintenant:
@strictfp
def f() = …