Strange bytecode generated for anonymous lambda class

Issue #286 resolved
Jesper Öqvist created an issue

ExtendJ 8.1.0-47-gdeb1b1c Java SE 8

ExtendJ generates weird bytecode for the anonymous class implementing the second lambda expression in this test:

import java.util.*;
import java.util.stream.*;
public class Test {
  public static void main(String[] args) {
    String[] names = { "Alice", "Bob", "Acorn" };
    IntStream ints = strLen(Arrays.asList(names));
    ints.forEach(i -> System.out.println(i));
  }

  static IntStream strLen(List<? extends String> names) {
    return names.stream().mapToInt(name -> name.length());
  }
}

The test compiles and runs fine, but the generated bytecode is strange. The relevant parts of the class Test$2 are:

  public int applyAsInt(wildcards.? extends String);
    flags: ACC_PUBLIC
    Code:
      stack=1, locals=2, args_size=2
         0: aload_1       
         1: invokevirtual #24                 // Method java/lang/String.length:()I
         4: ireturn       
      LineNumberTable:
        line 11: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
               0       5     0  this   LTest$2;
               0       5     1  name   Ljava/lang/String;
    Signature: #27                          // (Lwildcards/? extends String;)I

  public int applyAsInt(java.lang.Object);
    flags: ACC_PUBLIC, ACC_BRIDGE, ACC_SYNTHETIC
    Code:
      stack=2, locals=2, args_size=2
         0: aload_0       
         1: aload_1       
         2: checkcast     #20                 // class java/lang/String
         5: invokevirtual #32                 // Method applyAsInt:(Ljava/lang/String;)I
         8: ireturn       
      LineNumberTable:
        line 0: 0
      LocalVariableTable:
        Start  Length  Slot  Name   Signature
               0       9     0  this   LTest$2;
               0       9     1    p0   Ljava/lang/Object;

The method type signature for the first method is strange, and the second bridge method should not be needed if the first method argument is reified.

Comments (2)

  1. Log in to comment