Entrada "! *" Estranha em LocalVariableTypeTable ao compilar com o compilador eclipse
Vamos compilar o seguinte código com o compilador ECJ do pacote Eclipse Mars.2:
import java.util.stream.*;
public class Test {
String test(Stream<?> s) {
return s.collect(Collector.of(() -> "", (a, t) -> {}, (a1, a2) -> a1));
}
}
O comando de compilação é o seguinte:
$ java -jar org.eclipse.jdt.core_3.11.2.v20160128-0629.jar -8 -g Test.java
Após a compilação bem-sucedida, vamos verificar o arquivo de classe resultante comjavap -v -p Test.class
. O mais interessante é o método sintético gerado para o(a, t) -> {}
lambda:
private static void lambda$1(java.lang.String, java.lang.Object);
descriptor: (Ljava/lang/String;Ljava/lang/Object;)V
flags: ACC_PRIVATE, ACC_STATIC, ACC_SYNTHETIC
Code:
stack=0, locals=2, args_size=2
0: return
LineNumberTable:
line 5: 0
LocalVariableTable:
Start Length Slot Name Signature
0 1 0 a Ljava/lang/String;
0 1 1 t Ljava/lang/Object;
LocalVariableTypeTable:
Start Length Slot Name Signature
0 1 1 t !*
Fiquei bastante surpreso ao ver isso!*
entrada emLocalVariableTypeTable
. Especificação JVMcobre Atributo LocalVariableTypeTable e diz:
oconstant_pool
A entrada nesse índice deve conter umCONSTANT_Utf8_info
estrutura (§4.4.7) representando uma assinatura de campo que codifica o tipo de uma variável local no programa de origem (§4.7.9.1)
§4.7.9.1 define uma gramática para assinaturas de campo que, se bem entendi, não cobre algo semelhante a!*
.
Note-se também que nem o compilador javac nem as versões anteriores do ECJ 3.10.x geram esseLocalVariableTypeTable
entrada. É!*
alguma extensão não-padrão do Eclipse ou estou faltando alguma coisa nas especificações da JVM? Isso significa que o ECJ não está em conformidade com as especificações da JVM? o que!*
realmente significa e existem outras seqüências semelhantes que podem aparecer emLocalVariableTypeTable
atributo?