@@ -624,6 +624,8 @@ class INTERPRETER_CLASS
624
624
#endif /* defined(J9VM_OPT_METHOD_HANDLE) */
625
625
}
626
626
627
+ #define isMethodDefaultConflictForMethodHandle (method ) (method == _currentThread->javaVM->initialMethods.throwDefaultConflict)
628
+
627
629
VMINLINE VM_BytecodeAction
628
630
j2iTransition (
629
631
REGISTER_ARGS_LIST
@@ -633,12 +635,17 @@ class INTERPRETER_CLASS
633
635
) {
634
636
VM_JITInterface::disableRuntimeInstrumentation (_currentThread);
635
637
VM_BytecodeAction rc = GOTO_RUN_METHOD;
636
- void * const jitReturnAddress = VM_JITInterface::fetchJITReturnAddress (_currentThread, _sp);
637
- J9ROMMethod* const romMethod = J9_ROM_METHOD_FROM_RAM_METHOD (_sendMethod);
638
- void * const exitPoint = j2iReturnPoint ( J9ROMMETHOD_SIGNATURE (romMethod));
639
- if (J9_ARE_ANY_BITS_SET (romMethod->modifiers , J9AccNative | J9AccAbstract)) {
638
+ void * const jitReturnAddress = VM_JITInterface::fetchJITReturnAddress (_currentThread, _sp);
639
+ J9ROMMethod * const romMethod = isMethodDefaultConflictForMethodHandle (_sendMethod) ? NULL : J9_ROM_METHOD_FROM_RAM_METHOD (_sendMethod);
640
+
641
+ if (isMethodDefaultConflictForMethodHandle (_sendMethod) || J9_ARE_ANY_BITS_SET (romMethod->modifiers , J9AccNative | J9AccAbstract)) {
640
642
_literals = (J9Method*)jitReturnAddress;
641
- _pc = nativeReturnBytecodePC (REGISTER_ARGS, romMethod);
643
+ if (isMethodDefaultConflictForMethodHandle (_sendMethod)) {
644
+ buildJITResolveFrame (REGISTER_ARGS);
645
+ } else {
646
+ _pc = nativeReturnBytecodePC (REGISTER_ARGS, romMethod);
647
+ }
648
+
642
649
#if defined(J9SW_NEEDS_JIT_2_INTERP_CALLEE_ARG_POP)
643
650
/* Variable frame */
644
651
_arg0EA = NULL ;
@@ -658,6 +665,7 @@ class INTERPRETER_CLASS
658
665
rc = GOTO_THROW_CURRENT_EXCEPTION;
659
666
}
660
667
} else {
668
+ void * const exitPoint = j2iReturnPoint (J9ROMMETHOD_SIGNATURE (romMethod));
661
669
bool decompileOccurred = false ;
662
670
_pc = (U_8*)jitReturnAddress;
663
671
UDATA preCount = 0 ;
@@ -9499,6 +9507,20 @@ class INTERPRETER_CLASS
9499
9507
}
9500
9508
9501
9509
#if defined(J9VM_OPT_OPENJDK_METHODHANDLE)
9510
+
9511
+ VMINLINE VM_BytecodeAction
9512
+ nullCheckJ9Obj (j9object_t j9Obj, bool fromJIT, REGISTER_ARGS_LIST, UDATA decSP)
9513
+ {
9514
+ if (J9_UNEXPECTED (NULL == j9Obj)) {
9515
+ if (fromJIT) {
9516
+ _sp -= decSP;
9517
+ buildJITResolveFrame (REGISTER_ARGS);
9518
+ }
9519
+ return THROW_NPE;
9520
+ }
9521
+ return GOTO_RUN_METHOD;
9522
+ }
9523
+
9502
9524
/* This INL only covers invokeBasic dispatched directly from bytecode, invokeBasic calls
9503
9525
* dispatched from linkToVirtual is inlined to avoid need of flags and tempValues to
9504
9526
* pass the correct argCount during VM transition since the ramCP index still points
@@ -9525,12 +9547,7 @@ class INTERPRETER_CLASS
9525
9547
}
9526
9548
9527
9549
j9object_t mhReceiver = ((j9object_t *)_sp)[mhReceiverIndex];
9528
- if (J9_UNEXPECTED (NULL == mhReceiver)) {
9529
- if (fromJIT) {
9530
- buildJITResolveFrame (REGISTER_ARGS);
9531
- }
9532
- return THROW_NPE;
9533
- }
9550
+ if (nullCheckJ9Obj (mhReceiver, fromJIT, REGISTER_ARGS, 0 ) == THROW_NPE) return THROW_NPE;
9534
9551
9535
9552
j9object_t lambdaForm = J9VMJAVALANGINVOKEMETHODHANDLE_FORM (_currentThread, mhReceiver);
9536
9553
j9object_t memberName = J9VMJAVALANGINVOKELAMBDAFORM_VMENTRY (_currentThread, lambdaForm);
@@ -9554,9 +9571,7 @@ class INTERPRETER_CLASS
9554
9571
9555
9572
/* Pop memberNameObject from the stack. */
9556
9573
j9object_t memberNameObject = *(j9object_t *)_sp++;
9557
- if (J9_UNEXPECTED (NULL == memberNameObject)) {
9558
- goto throw_npe;
9559
- }
9574
+ if (nullCheckJ9Obj (memberNameObject, fromJIT, REGISTER_ARGS, true ) == THROW_NPE) return THROW_NPE;
9560
9575
9561
9576
_sendMethod = (J9Method *)(UDATA)J9OBJECT_U64_LOAD (_currentThread, memberNameObject, _vm->vmtargetOffset );
9562
9577
@@ -9566,10 +9581,10 @@ class INTERPRETER_CLASS
9566
9581
9567
9582
if (J9_ARE_NO_BITS_SET (romMethod->modifiers , J9AccStatic)) {
9568
9583
j9object_t mhReceiver = ((j9object_t *)_sp)[methodArgCount - 1 ];
9569
- if (J9_UNEXPECTED (NULL == mhReceiver)) {
9570
- goto throw_npe;
9571
- }
9584
+ if (nullCheckJ9Obj (mhReceiver, false , REGISTER_ARGS, false ) == THROW_NPE) return THROW_NPE;
9572
9585
}
9586
+ } else {
9587
+ goto throwDefaultConflict;
9573
9588
}
9574
9589
9575
9590
if (fromJIT) {
@@ -9611,13 +9626,13 @@ class INTERPRETER_CLASS
9611
9626
9612
9627
return rc;
9613
9628
9614
- throw_npe :
9629
+ throwDefaultConflict :
9615
9630
if (fromJIT) {
9616
- /* Restore SP to before popping memberNameObject. */
9617
9631
_sp -= 1 ;
9618
9632
buildJITResolveFrame (REGISTER_ARGS);
9619
9633
}
9620
- return THROW_NPE;
9634
+ // run() will run throwDefaultConflictForMemberName()
9635
+ return GOTO_RUN_METHOD;
9621
9636
}
9622
9637
9623
9638
VMINLINE VM_BytecodeAction
@@ -9628,14 +9643,7 @@ class INTERPRETER_CLASS
9628
9643
9629
9644
/* Pop memberNameObject from the stack. */
9630
9645
j9object_t memberNameObject = *(j9object_t *)_sp++;
9631
- if (J9_UNEXPECTED (NULL == memberNameObject)) {
9632
- if (fromJIT) {
9633
- /* Restore SP to before popping memberNameObject. */
9634
- _sp -= 1 ;
9635
- buildJITResolveFrame (REGISTER_ARGS);
9636
- }
9637
- return THROW_NPE;
9638
- }
9646
+ if (nullCheckJ9Obj (memberNameObject, fromJIT, REGISTER_ARGS, true ) == THROW_NPE) return THROW_NPE;
9639
9647
9640
9648
J9Method *method = (J9Method *)(UDATA)J9OBJECT_U64_LOAD (_currentThread, memberNameObject, _vm->vmtargetOffset );
9641
9649
J9ROMMethod *romMethod = J9_ROM_METHOD_FROM_RAM_METHOD (method);
@@ -9655,14 +9663,7 @@ class INTERPRETER_CLASS
9655
9663
}
9656
9664
9657
9665
j9object_t receiverObject = ((j9object_t *)_sp)[methodArgCount - 1 ];
9658
- if (J9_UNEXPECTED (NULL == receiverObject)) {
9659
- if (fromJIT) {
9660
- /* Restore SP to before popping memberNameObject. */
9661
- _sp -= 1 ;
9662
- buildJITResolveFrame (REGISTER_ARGS);
9663
- }
9664
- return THROW_NPE;
9665
- }
9666
+ if (nullCheckJ9Obj (receiverObject, fromJIT, REGISTER_ARGS, true ) == THROW_NPE) return THROW_NPE;
9666
9667
9667
9668
/* The vTable offset has been stored in memberNameObject.vmindex.
9668
9669
*
@@ -9721,30 +9722,14 @@ class INTERPRETER_CLASS
9721
9722
9722
9723
/* Pop memberNameObject from the stack. */
9723
9724
j9object_t memberNameObject = *(j9object_t *)_sp++;
9724
- if (J9_UNEXPECTED (NULL == memberNameObject)) {
9725
- if (fromJIT) {
9726
- /* Restore SP to before popping memberNameObject. */
9727
- _sp -= 1 ;
9728
- buildJITResolveFrame (REGISTER_ARGS);
9729
- }
9730
- rc = THROW_NPE;
9731
- goto done;
9732
- }
9725
+ if (nullCheckJ9Obj (memberNameObject, fromJIT, REGISTER_ARGS, true ) == THROW_NPE) return THROW_NPE;
9733
9726
9734
9727
method = (J9Method *)(UDATA)J9OBJECT_U64_LOAD (_currentThread, memberNameObject, _vm->vmtargetOffset );
9735
9728
romMethod = J9_ROM_METHOD_FROM_RAM_METHOD (method);
9736
9729
methodArgCount = romMethod->argCount ;
9737
9730
9738
9731
receiverObject = ((j9object_t *)_sp)[methodArgCount - 1 ];
9739
- if (J9_UNEXPECTED (NULL == receiverObject)) {
9740
- if (fromJIT) {
9741
- /* Restore SP to before popping memberNameObject. */
9742
- _sp -= 1 ;
9743
- buildJITResolveFrame (REGISTER_ARGS);
9744
- }
9745
- rc = THROW_NPE;
9746
- goto done;
9747
- }
9732
+ if (nullCheckJ9Obj (receiverObject, fromJIT, REGISTER_ARGS, true ) == THROW_NPE) return THROW_NPE;
9748
9733
9749
9734
receiverClass = J9OBJECT_CLAZZ (_currentThread, receiverObject);
9750
9735
@@ -9829,14 +9814,7 @@ class INTERPRETER_CLASS
9829
9814
}
9830
9815
9831
9816
j9object_t nativeMH = *(j9object_t *)_sp;
9832
- if (J9_UNEXPECTED (NULL == nativeMH)) {
9833
- if (fromJIT) {
9834
- /* Restore SP to before popping the dummy argument. */
9835
- _sp -= 1 ;
9836
- buildJITResolveFrame (REGISTER_ARGS);
9837
- }
9838
- return THROW_NPE;
9839
- }
9817
+ if (nullCheckJ9Obj (nativeMH, fromJIT, REGISTER_ARGS, true ) == THROW_NPE) return THROW_NPE;
9840
9818
9841
9819
j9object_t nepObject = J9VMJAVALANGINVOKENATIVEMETHODHANDLE_NEP (_currentThread, nativeMH);
9842
9820
j9object_t methodType = J9VMJAVALANGINVOKEMETHODHANDLE_TYPE (_currentThread, nepObject);
0 commit comments