Задний план
В настоящее время я пишу JVM на С# исключительно для академических целей (и, возможно, для создания смешанного приложения .NET и Java/Scala в будущем).
Контекст
Я пишу простой класс JAVA:
public class test
{
public static String hello_world(int i)
{
return "Hello " + i + " World!";
}
}
И скомпилируйте его в test.class
. Когда я декомпилирую его своим декомпилятором (который я написал как часть JVM), я вижу следующие инструкции для этого метода:
iload_0
invokedynamic 2
areturn
Просматривая пул констант для константы с индексом 2
, я вижу запись InvokeDynamic-Constant со следующими данными:
makeConcatWithConstants : (I)Ljava/lang/String;
Думаю, это имеет смысл (я больше пользователь .NET, чем пользователь JAVA).
При выполнении моего метода hello_world
с параметром 1
перед выполнением invokedynamic 2
у меня есть следующий стек:
----TOP---
0x00000001
--BOTTOM--
Вопрос
Мой вопрос: Как мне использовать invokedynamic
?
Я не могу разрешить метод makeConcatWithConstants
, так как InvokeDynamic-Constant не дает мне никакой подсказки, где может находиться makeConcatWithConstants
(см. документацию).
Стек также не содержит ссылки на кучу, указывающую, с каким типом экземпляра может быть связан метод makeConcatWithConstants
.
Я прочитал документы invokedynamic
но я этого не понимаю (может быть, я слишком "поврежден" .NET-Framework).
Может ли кто-нибудь указать мне на какой-нибудь пример того, что происходит под капотом JVM при выполнении этих трех инструкций? (Что ожидает вызываемый invokedynamic
и т. д.)?
Я уже реализовал invokestatic
в своей JVM... но пока не могу понять invokedynamic
.
invokedynamic
для оптимизации конкатенации строк. Это гениально! - person Jörg W Mittag   schedule 04.11.2018invokedynamic
docs, вы связались сами с собой, что довольно исчерпывающе, особенно когда вы также переходите по ссылке. Возможно, полезно прочитать документацию пакета в дополнение. - person Holger   schedule 04.11.2018.class
при использовании старых спецификаций.... - person unknown6656   schedule 04.11.2018