[prev in list] [next in list] [prev in thread] [next in thread]
List: openjdk-2d-dev
Subject: Re: [OpenJDK 2D-Dev] RFR: 8260616: Removing remaining JNF dependencies in the java.desktop module [v
From: Phil Race <prr () openjdk ! java ! net>
Date: 2021-01-29 19:56:45
Message-ID: Qbm3YYbnAeQycSXj8M4mukJXusNpxlRDTSwWELN6nQM=.e3325063-cf69-4816-adaa-6a54c6a867a1 () github ! com
[Download RAW message or body]
On Fri, 29 Jan 2021 16:23:20 GMT, Gerard Ziemski <gziemski@openjdk.org> wrote:
> > Phil Race has updated the pull request incrementally with one additional commit \
> > since the last revision:
> > 8260616: Removing remaining JNF dependencies in the java.desktop modul
>
> src/java.desktop/macosx/native/libawt_lwawt/awt/CTextPipe.m line 601:
>
> > 599: jchar unichars[len];
> > 600: (*env)->GetStringRegion(env, str, 0, len, unichars);
> > 601: CHECK_EXCEPTION();
>
> Are `JNF_CHECK_AND_RETHROW_EXCEPTION` and `CHECK_EXCEPTION` equivalent?
>
> `JNF_CHECK_AND_RETHROW_EXCEPTION` seems to throw exception, but `CHECK_EXCEPTION` \
> does not?
JNF_CHECK_AND_RETHROW_EXCEPTION is this
// JNF_CHECK_AND_RETHROW_EXCEPTION - rethrows exceptions from Java
//
// Takes an exception thrown from Java, and transforms it into an
// NSException. The NSException should bubble up to the upper-most
// JNF_COCOA_ENTER/JNF_COCOA_EXIT pair, and then be re-thrown as
// a Java exception when returning from JNI. This check should be
// done after raw JNI operations which could cause a Java exception
// to be be thrown. The JNF{Get/Set/Call} macros below do this
// check automatically.
#define JNF_CHECK_AND_RETHROW_EXCEPTION(env) \
\ { \
\ jthrowable _exception = (*env)->ExceptionOccurred(env); \
if (_exception) [JNFException raise:env throwable:_exception]; \
}
So what it actually does is clear the exception, raise an NSException and when
the code reaches JNF_COCOA_EXIT - which then has to be there - it clears the \
NSException and re-throws the Java exception.
So the name of the macro is misleading since this does NOT itself rethrow the \
exception, it relies on other code to do that.
CHECK_EXCEPTION will amount to the same - it throws an NSException if there is a Java \
exception pending. And it will clear the NSException before exiting back to Java.
The difference is that it doesn't clear the Java Exception and later rethrow it since \
there is no need There is one exception to this in CHECK_EXCEPTION - if this is the \
main (ie appkit) thread the java exception is cleared since there's no one to return \
it to ...
> src/java.desktop/macosx/native/libawt_lwawt/awt/CTextPipe.m line 608:
>
> > 606: {
> > 607: // Get string to draw and the length
> > 608: const jchar *unichars = JNFGetStringUTF16UniChars(env, str);
>
> According to `JNFString.h`, the `JNFGetStringUTF16UniChars()` API:
>
> /*
> * Gets UTF16 unichars from a Java string, and checks for errors and raises a \
> JNFException if
> * the unichars cannot be obtained from Java.
> */
>
> raises a (JNFException) if it can't get the chars, but now we simply return if \
> `GetStringChars()` can not return the chars.
> Seems like we handle this case differently in the new code now - is this change \
> desired and correct?
You are correct, but I decided that here it is fine.
If GetStringChars fails it will return NULL (it does not raise any excptions itself).
I added a check for NULL if NULL we then return from the JNI method to Java.
In the old case it also would return but would additionally propagate that raised \
exception to Java which JNF decided to throw into the mix when there's already a \
standard way of testing failure. And since we already know str != NULL we are in the \
realms of something went badly wrong inside the VM for this to fail. So I decided \
this was all fine.
> src/java.desktop/macosx/native/libosxapp/JNIUtilities.m line 83:
>
> > 81: stringWithFileSystemRepresentation:chs length:len];
> > 82: return result;
> > 83: }
>
> Why are we doing:
>
> `java_string -> chars -> NSString -> chars -> [NSFileManager \
> stringWithFileSystemRepresentation]`
> ?
>
> Why not just get the raw characters form JNI and feed them directly into \
> `[NSFileManager stringWithFileSystemRepresentation]`, ie:
> `java_string -> chars -> [NSFileManager stringWithFileSystemRepresentation]`
>
> and skip the `JavaStringToNSString` step altogether?
I tried to explain the odd-ness of this in the comments preceding the function \
definition. Near as I could figure out that intermediate call is needed to do the \
decomposition since the NSFileManager won't do that. But this is not exactly my area \
of expertise and there may be a better way. Who is an expert on the intricacies of \
the macOS file system naming ?
-------------
PR: https://git.openjdk.java.net/jdk/pull/2305
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic