2012-05-17 3 views
0

мне удалось изолировать мою проблему в этом тесте:Jasmin Как заставить длинное поле быть постоянным?

.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?

ответ

0

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

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

.field public static foo J = 1l 
0

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

.field общественность статической PHASE_1 D = 5.0

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

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