On Sep 2, 2009, at 7:44 AM, Christian Thalinger wrote:
I'm currently porting the interpreter to x86_64 and there is a problem
that took me almost two days to find: it's the MethodHandle.vmentry
field-type change.
For whatever reason on 64-bit it calculates the offset to 24, which
actually should be 16, and that results to this:
sun.dyn.DirectMethodHandle
- klass: 'sun/dyn/DirectMethodHandle'
- ---- fields (total size 6 words):
- private 'vmentry' 'J' @24 4329412000 (20d95a0 1)
- protected 'vmtarget' 'Ljava/lang/Object;' @24 ### BAD OOP
0x1020d95a0 ### (20d95a0 1)
- private 'type' 'Ljava/dyn/MethodType;' @32 a 'java/dyn/
MethodType' =
(II)I (5040e38 1)
- private final 'vmindex' 'I' @40 -2 (fffffffe)
Nice, isn't it? :-)
I didn't know we had unions in Java! :-)
So, there is a problem somewhere in
ClassFileParser::java_dyn_MethodHandle_fix_pre and the attached patch
fix it. But I'm very sure this is not correct as the field should
really be a double field and not a word field. What is the "correct"
fix for this problem?
The MH.vmentry fields needs to be an unmanaged void* field, which
means (as far as Java is concerned) either I or J (not L).
The current implementation of sun.dyn.MHI patches the type this way.
I'm surprised that the layout logic fails after that. Probably the
patching is inconsistent somehow.
But in the longer run, this doesn't matter, since MHI has to go away.
This is the bug:
6839872 remove implementation inheritance from JSR 292 APIs
The vmentry field needs to disappear from Java code and get
automagically installed on java.dyn.MethodHandle, the same way the
hidden klassOop field gets installed on java.lang.Class.
-- John
_______________________________________________
mlvm-dev mailing list
[email protected]
http://mail.openjdk.java.net/mailman/listinfo/mlvm-dev