немножко вернемся назад к java-assembler'у на Turbo Pascal.
О верификации и создании структуры stackmap (или stackmaptable).
__________
Повторюсь (писал об этом ранее): в WTK имеется утилита "preverify1.1.exe", и файлы "cldcapi11.jar", "midpapi20.jar". Чтобы легко провести верификацию надо сделать запускной bat-файл и скопировать эти 4-е файла в отдельный каталог, а также создать в нем два подкаталога "class" и "tmp". Для верификации поместить "сырые" class-файлы в подкаталог "tmp" и после запуска bat-файла в подкаталоге "class" появятся проверенные классы с добавленной структурой "stackmap".
Вот пример bat-файла для этого случая:
preverify1.1 -nofp -nofinalize -nonative -classpath midpapi20.jar;cldcapi11.jar; -d "class" "tmp"
pause
Также имеется openSource java-верификатор "proguard" его можно поскать на
http://sourceforge.net/ и о нем писал pilgrim в Canterbury Pascal for J2ME
http://forum.boolean.name/showthread.php?t=6028
Но т.к. текущая разработка без использования java, т.о. его можно посмотреть для ознакомления.
__________
Теперь о собственной реализации и вставке структуры "stackmap"
Более близкое что удалось найти в сети представлено здесь:
http://asm.ow2.org/asm223/javadoc/user/org/objectweb/asm/attrs/StackMapTableAttribute.html
http://www.cs.karelia.ru/alumni/2003mag/hyppenen.ppt
http://sun.tpu.ru/teachingmaterials/download;jsessionid=b7d7cc41754158548d66f8f93900d?path=java/Safonov_Java_Seminar_new/7_JVM_CLASS.pdf
Остальное добыто компиляцией и дизассемблированием c помощью JD.exe (Java Disassembler, TurboPascal) типовых примеров, итак:
Структура "stackmap" содержит список локальных переменных и состояние стека в точках куда передается управление через goto/if_icmpne и т.д. Причем запоминается состояние виртуальной машины на операторе перехода, и записывается в участок "stackmap" со смещением где находится метка, т.о. мы указываем виртуальной машине еще до запуска, что будет в стеке или таблице локальных переменных, если в конкретное место будет переход.
Примечание: т.к. в Pascal'е переменные в подпрограммах создаются в начале, а уничтожаются при выходе, то эта часть "stackmap" будет неизменной, а меняться будет только вторая часть "состояние стека".
--
Теперь необходимо разобраться с формированием "stackmap", если в одну точку переходит несколько операторов
(*) - Общая точка
repeat
repeat
...
until
...
until
и собрать свой алгоритм
____
p.s. нашел ссылку с очень похожей реализацией java-assembler'а и java-disassembler'а (TurboPascal), на языке java:
https://svn.forge.objectweb.org/cgi-...objectweb/asm/