Жасмин, как заставить длинное поле быть длинной постоянной?

Мне удалось выделить мою проблему в этом тестовом примере:

.bytecode 50.0
.class public test
.super java/lang/Object

.field public static final foo1 J = 1

.method public <init>()V
    .limit stack 1
    .limit locals 1
    .var 0 is this Ltest; from init_start to init_end

init_start:
    aload_0
    invokespecial java/lang/Object/<init>()V 
init_end:
    return
.end method

.method public static main([Ljava/lang/String;)V
    .limit stack 1
    .limit locals 1
main_start:
    new test
    invokespecial test/<init>()V
main_end:
    return
.end method

Когда я пытаюсь запустить это, я получаю это:

$ jasmin test.j
$ java test
Exception in thread "main" java.lang.ClassFormatError: Inconsistent constant value type in class file test
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:634)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:277)
    at java.net.URLClassLoader.access$000(URLClassLoader.java:73)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:212)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
Could not find the main class: test. Program will exit.

Некоторое расследование (с javap) раскрывает это:

public static final long foo1;
  Constant value: int 1

Другими словами, значение длинной константы сохраняется в файле класса как целое число. Есть ли способ заставить Жасмин хранить константу в пуле как долго? я пробовал 1L но это не работает Установка значения foo1 быть числом больше, чем INT_MAX (такие как 2147483648) исправляет ошибку, но я надеялся на решение, которое не потребовало бы от меня изменения постоянных значений.

Предоставляет ли Jasmin какой-либо способ сделать это или для этого потребуется изменить исходный код Jasmin?

2 ответа

Решение

Я выпустил модифицированную версию Jasmin, которая позволяет мне это делать. Он доступен по https://github.com/luiscubal/jasmin.

Чтобы использовать длинные константы в этой модифицированной версии, сделайте это:

.field public static foo J = 1l

Такая же проблема существует с открытыми статическими двойными константами:

.field public static PHASE_1 D = 5.0

также кажется, что происходит сбой с той же ошибкой времени выполнения Java.

Я обошел его, убрав флаг final и перенеся инициализацию в конструктор;-)

Другие вопросы по тегам