2016-05-18 6 views
6

Я изучаю библиотеку ASM для генерации байт-кода. В каком-то момент я сделал какую-то ошибку с плохим локальным переменным типом и получил ошибку:Что такое таблица stackmap в байт-коде jvm?

Exception in thread "main" java.lang.VerifyError: Bad local variable type 
Exception Details: 
    Location: 
    Loops.start()V @56: aload_1 
    Reason: 
    Type top (current frame, locals[1]) is not assignable to reference type 


    Stackmap Table: 
    full_frame(@24,{Object[#2],Object[#9]},{Integer}) 
    full_frame(@25,{Object[#2],Object[#9]},{Integer,Integer}) 
    same_locals_1_stack_item_frame(@44,Integer) 
    full_frame(@45,{Object[#2],Object[#9]},{Integer,Integer}) 
    full_frame(@48,{Object[#2]},{Integer}) 
    full_frame(@80,{Object[#2],Integer},{Integer}) 
    full_frame(@81,{Object[#2],Integer},{Integer,Integer}) 
    full_frame(@87,{Object[#2]},{Integer}) 
    full_frame(@119,{Object[#2],Integer},{Integer}) 
    full_frame(@120,{Object[#2],Integer},{Integer,Integer}) 
    same_locals_1_stack_item_frame(@123,Integer) 

Проблема не трудно было найти и исправить, но мне любопытно, что это это stackmap стол вещь?

ответ

8

StackMapTable - это атрибут в классах, скомпилированных с Java 6 или выше. Он используется JVM в процессе verification by type checking.

В принципе, кадр карты стека определяет ожидаемые типы локальных переменных и стек операнда (то есть состояние кадра) метода во время его выполнения. Во время выполнения JVM выбрасывает VerifyError, если ожидается, и фактические типы несовместимы.

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

+3

Да, в основном это «особенность», которую добавило солнце, потому что их верификатор был болезненно медленным, и они были слишком плотными, чтобы увидеть любой другой способ ускорить его. –

Смежные вопросы