strange ClassFormatError with indy
Jochen Theodorou
blackdrag at gmx.org
Thu Aug 30 10:28:55 PDT 2012
Hi,
To me it did read like Remi says the name is wrong. I was wondering if
it is related to void as well...
Maybe it is better to give the method name as explicit argument and use
the bytecode name for something else instead. Only... the bytecode
started to read well again just now... But I guess I have to do that
step, since Groovy allows in theory method names, that are not legal in
bytecode.
Am 30.08.2012 15:59, schrieb Douglas Simon:
> Is is something to do with the fact that <init> methods always have a void return type?
>
> On Aug 30, 2012, at 3:35 PM, Remi Forax <forax at univ-mlv.fr> wrote:
>
>> The JVMS says the name must be a method name,
>> http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-5.html#jvms-5.1
>>
>> A symbolic reference to a call site specifier is derived from a CONSTANT_InvokeDynamic_info structure (§4.4.10) in the binary representation of a class or interface. Such a reference gives:
>> • a symbolic reference to a method handle, which will serve as a bootstrap method for an invokedynamic instruction (§invokedynamic);
>>
>> • a sequence of symbolic references (to classes, method types, and method handles), string literals, and runtime constants (i.e. primitive numeric values), which will serve as static arguments to a bootstrap method;
>>
>> • a method name and method descriptor.
>>
>>
>> so "<init>" should be possible, but I don't think the EG discuss this corner case.
>>
>> Rémi
>>
>> On 08/30/2012 03:19 PM, Jochen Theodorou wrote:
>>> Hi all,
>>>
>>> I originally wrote that to the asm list, but nobody seems to know there.
>>> Anyway, for my generated bytecode the verifier complains with this message:
>>>
>>> java.lang.ClassFormatError: Method "<init>" in class test has illegal
>>> signature "(Ljava/lang/Class;Ljava/util/Map;)Ljava/lang/Object;"
>>>
>>> Now... there is not a single <init> method of that signature in the
>>> class test. What is new though (before it worked) is this indy call:
>>>
>>>
>>>> INVOKEDYNAMIC <init>(Ljava/lang/Class;Ljava/util/Map;)Ljava/lang/Object; [
>>>> // handle kind 0x6 : INVOKESTATIC
>>>> org/codehaus/groovy/vmplugin/v7/IndyInterface.bootstrap((Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite;)
>>>> // arguments: none
>>>>
>>> And this call has the signature the verifier complains about. Is this an
>>> illegal invokedynamic call?
>>>
>>> bye blackdrag
>>>
>>>
>>
>> _______________________________________________
>> mlvm-dev mailing list
>> mlvm-dev at openjdk.java.net
>> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev
>
> _______________________________________________
> mlvm-dev mailing list
> mlvm-dev at openjdk.java.net
> http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev
>
--
Jochen "blackdrag" Theodorou - Groovy Project Tech Lead
blog: http://blackdragsview.blogspot.com/
german groovy discussion newsgroup: de.comp.lang.misc
For Groovy programming sources visit http://groovy-lang.org
More information about the mlvm-dev
mailing list