Jvm: В каких местах в байт-коде метода компилятор должен обязательно указывать фреймы стековой карты? - PullRequest
0 голосов
/ 10 июня 2018

Это выдержка из руководства пользователя asm:

Чтобы сэкономить место, скомпилированный метод не содержит один кадр на инструкцию: фактически он содержит только кадры дляинструкции, которые соответствуют целям перехода или обработчикам исключений, или которые следуют безусловным инструкциям перехода.Действительно, другие фреймы могут быть легко и быстро выведены из этих.

Я могу понять, почему jvm нуждается в фреймах стековой карты в целях перехода и для обработчиков исключений, но нет необходимости иметькадр карты стека после goto является ненужным требованием, поскольку где-то в байт-коде метода должна быть инструкция перехода, которая указывает на инструкцию сразу после инструкции goto, и этот случай будет обработан первым требованием.Так должно быть, иначе инструкция после goto будет недоступна и, следовательно, недоступна.

Пример:

Метод и его байт-код приведены ниже:

public class t {
    public static void main(String[] s) {
        int i = 10;
        while ( i > 0 ) {
            i = i + 1;
        }
        int j = 10;
    }
}



  public static void main(java.lang.String[]);
    descriptor: ([Ljava/lang/String;)V
    flags: ACC_PUBLIC, ACC_STATIC
    Code:
      stack=2, locals=3, args_size=1
         0: bipush        10
         2: istore_1
         3: iload_1
         4: ifle          14
         7: iload_1
         8: iconst_1
         9: iadd
        10: istore_1
        11: goto          3
        14: bipush        10
        16: istore_2
        17: return
      LineNumberTable:
        line 9: 0
        line 10: 3
        line 11: 7
        line 13: 14
        line 14: 17
      StackMapTable: number_of_entries = 2
        frame_type = 252 /* append */
          offset_delta = 3
          locals = [ int ]
        frame_type = 10 /* same */
}

Инструкция с индексом 11 - это инструкция goto, а инструкция с индексом 4 имеет 14, инструкцию сразу после 11 в качестве цели перехода.

Что является разумным основаниемкадр карты стека после безусловного перехода?

1 Ответ

0 голосов
/ 10 июня 2018

Цель стековых карт - обеспечить возможность проверки за один линейный проход через код.

Если код, следующий за goto, не имеет переходов, указывающих на него, то код мертв и теоретически не нуждается в проверке.Однако верификатор не знает этого .Поскольку он выполняет один проход через код, невозможно заранее узнать, мертв ли ​​код или нет.Следовательно, он должен проверять все, и это означает, что для начала ему нужен кадр стека.

Обратите внимание, что это отличается от устаревшего верификатора карты, не являющегося стеком.До введения карт стека верификатор просто перебирал весь найденный код (эффективно) после переходов и перебирал до сходимости.Это означает, что под старым верификатором мертвый код никогда не затрагивается.

...