On Fri, 19 Apr 2024 19:39:09 GMT, Sonia Zaldana Calles <szald...@openjdk.org> 
wrote:

>> Hi folks, 
>> 
>> This PR aims to fix 
>> [JDK-8329581](https://bugs.openjdk.org/browse/JDK-8329581). 
>> 
>> I think the regression got introduced in 
>> [JDK-8315458](https://bugs.openjdk.org/browse/JDK-8315458). 
>> 
>> In the issue linked above, 
>> [LauncherHelper#getMainType](https://github.com/openjdk/jdk/pull/16461/files#diff-108a3a3e3c2d108c8c7f19ea498f641413b7c9239ecd2975a6c27d904c2ba226)
>>  got removed to simplify launcher code.
>> 
>> Previously, we used ```getMainType``` to do the appropriate main method 
>> invocation in ```JavaMain```. However, we currently attempt to do all types 
>> of main method invocations at the same time 
>> [here](https://github.com/openjdk/jdk/blob/master/src/java.base/share/native/libjli/java.c#L623).
>>  
>> 
>> Note how all of these invocations clear the exception reported with 
>> [CHECK_EXCEPTION_FAIL](https://github.com/openjdk/jdk/blob/140f56718bbbfc31bb0c39255c68568fad285a1f/src/java.base/share/native/libjli/java.c#L390).
>>  
>> 
>> Therefore, if a legitimate exception comes up during one of these 
>> invocations, it does not get reported. 
>> 
>> I propose reintroducing ```LauncherHelper#getMainType``` but I'm looking 
>> forward to your suggestions. 
>> 
>> Cheers, 
>> Sonia
>
> Sonia Zaldana Calles has updated the pull request incrementally with one 
> additional commit since the last revision:
> 
>   Fixing space formatting

src/java.base/share/classes/sun/launcher/LauncherHelper.java line 908:

> 906: 
> 907:     private static boolean isStatic = false;
> 908:     private static boolean noArgs = false;

Suggestion:

    private static boolean isStaticMain = false;
    private static boolean noArgMain = false;

src/java.base/share/native/libjli/java.c line 396:

> 394: int
> 395: invokeStaticMainWithArgs(JNIEnv *env, jclass mainClass, jobjectArray 
> mainArgs,
> 396:         JavaVM *vm, int ret) {

As `CHECK_EXCEPTION_xxx_LEAVE` assumes to be used within JavaMain and it 
changes the value of the local `ret` variable, it should call 
`CHECK_EXCEPTION_RETURN_VALUE` and `NULL_CHECK_RETURN_VALUE` instead.  

JavaMain should call `CHECK_EXCEPTION_LEAVE(1);` after this method returns to 
print any exception and exit.

src/java.base/share/native/libjli/java.c line 399:

> 397:     jmethodID mainID = (*env)->GetStaticMethodID(env, mainClass, "main",
> 398:                                   "([Ljava/lang/String;)V");
> 399:     CHECK_EXCEPTION_LEAVE(1);

Is this needed?  `invokeStaticMainWithArgs` should only be called if the main 
method is validated as a static main with args.

A sanity check `NULL_CHECK0(mainID)` may be adequate (to use existing macro and 
so  keeping the return value 0 to indicate error).

src/java.base/share/native/libjli/java.c line 409:

> 407:  */
> 408: int
> 409: invokeInstanceMainWithArgs(JNIEnv *env, jclass mainClass, jobjectArray 
> mainArgs,

int
invokeInstanceMainWithArgs(JNIEnv *env, jclass mainClass, jobjectArray 
mainArgs) {
    jmethodID mainID = (*env)->GetMethodID(env, mainClass, "main",
                                 "([Ljava/lang/String;)V");
    NULL_CHECK0(mainID);                             
    jmethodID constructor = (*env)->GetMethodID(env, mainClass, "<init>", 
"()V");
    NULL_CHECK0(constructor);
    jobject mainObject = (*env)->NewObject(env, mainClass, constructor);
    CHECK_EXCEPTION_RETURN_VALUE(0);
    NULL_CHECK0(mainObject);
    (*env)->CallVoidMethod(env, mainObject, mainID, mainArgs);
    return 1;
}

src/java.base/share/native/libjli/java.c line 431:

> 429:     jmethodID mainID = (*env)->GetStaticMethodID(env, mainClass, "main",
> 430:                                        "()V");
> 431:     CHECK_EXCEPTION_LEAVE(1);

Same comment as `invokeStaticMainWithArgs`.

Suggestion:

    NULL_CHECK0(mainID);

src/java.base/share/native/libjli/java.c line 441:

> 439:  */
> 440: int
> 441: invokeInstanceMainWithoutArgs(JNIEnv *env, jclass mainClass,

See the suggestion for `invokeInstanceMainWithArgs`

src/java.base/share/native/libjli/java.c line 610:

> 608: 
> 609: 
> 610:     jclass helperClass = GetLauncherHelperClass(env);

Follow this file convention, declare all local variables at the beginning of 
this function.

src/java.base/share/native/libjli/java.c line 614:

> 612:         (*env)->GetStaticFieldID(env, helperClass, "isStatic", "Z");
> 613:     jboolean isStatic =
> 614:         (*env)->GetStaticBooleanField(env, helperClass, isStaticField);

Check exception.   Local variable declared at the beginning of the function.

Suggestion:

    isStaticMainField = (*env)->GetStaticFieldID(env, helperClass, 
"isStaticMain", "Z");
    CHECK_EXCEPTION_NULL_LEAVE(isStaticMain);
    isStaticMain = (*env)->GetStaticBooleanField(env, helperClass, 
isStaticMainField);

src/java.base/share/native/libjli/java.c line 619:

> 617:         (*env)->GetStaticFieldID(env, helperClass, "noArgs", "Z");
> 618:     jboolean noArgs =
> 619:         (*env)->GetStaticBooleanField(env, helperClass, noArgsField);

Suggestion:

    noArgMainField = (*env)->GetStaticFieldID(env, helperClass, "noArgMain", 
"Z");
    CHECK_EXCEPTION_NULL_LEAVE(noArgMain);
    noArgMain = (*env)->GetStaticBooleanField(env, helperClass, noArgMainField);

src/java.base/share/native/libjli/java.c line 634:

> 632:        }
> 633:     }
> 634: 

Add `CHECK_EXCEPTION_LEAVE(1);` to check any exception thrown when the main 
method is invoked.

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/18786#discussion_r1575165463
PR Review Comment: https://git.openjdk.org/jdk/pull/18786#discussion_r1575203911
PR Review Comment: https://git.openjdk.org/jdk/pull/18786#discussion_r1575201446
PR Review Comment: https://git.openjdk.org/jdk/pull/18786#discussion_r1575237945
PR Review Comment: https://git.openjdk.org/jdk/pull/18786#discussion_r1575234012
PR Review Comment: https://git.openjdk.org/jdk/pull/18786#discussion_r1575238650
PR Review Comment: https://git.openjdk.org/jdk/pull/18786#discussion_r1575222579
PR Review Comment: https://git.openjdk.org/jdk/pull/18786#discussion_r1575225615
PR Review Comment: https://git.openjdk.org/jdk/pull/18786#discussion_r1575226535
PR Review Comment: https://git.openjdk.org/jdk/pull/18786#discussion_r1575227620

Reply via email to