Реализация Javac: Какие инструкции JVM производит вызов метода? - PullRequest
0 голосов
/ 21 декабря 2018

Если у меня есть сайт вызова метода в Java.Каков эквивалентный байт-код jvm (кроме вызова, который переводится в invokevirtual / static и т. Д.)?Меня больше интересуют команды, которые загружают приемник в стек.

-Конечно, одна команда является aload.

-Другим может быть, что другой вызов возвращает рефобъект в стеке

-Три новая инструкция.(например, new A (). foo (). Он получает dupped. Но этот dupped используется конструктором)

-four, возможно (??) Dup.(при наличии a.foo (); a.bar (); есть ли вероятность, что компилятор выдаст aload, а затем dup вместо aload aload?)

Мой самый большой вопрос - остальные команды dup.Потому что они как бы тасуют стек.когда Javac производит их?Использует ли он их при компиляции сайта вызовов?

Я пытался найти документацию без удачи.Затем нашел исходный код, но на это уйдут дни.Я считаю, что файлы Code.java и Gen.java отвечают за процесс перевода / компиляции.

1 Ответ

0 голосов
/ 21 декабря 2018

Почти любая инструкция байт-кода, которая создает ссылку, может использоваться javac для загрузки получателя.

  • aload, invokeX, new + dup
    Те, кого вы уже упомянули.
  • getfield, getstatic

    field.method();
    
  • aaload

    arr[index].method();
    
  • anewarray

    (new Object[0]).hashCode();
    
  • multianewarray

    (new byte[5][10]).getClass();
    
  • checkcast

    ((List) obj).size();
    
  • ldc

    MyClass.class.getName();
    
  • aconst_null

    ((Object) null).getClass();
    
  • dup

    IntSupplier s = field::hashCode;
    

    Здесь dup + invokevirtual используются для излученияхитрый нуль-чек:

    getstatic     #2      // Field field:Ljava/lang/String;
    dup
    invokevirtual #3      // Method java/lang/Object.getClass:()Ljava/lang/Class;
    pop
    invokedynamic #4,  0  // InvokeDynamic #0:getAsInt
    
...