On Wed, 8 Mar 2023 11:30:27 GMT, Daniel Jeliński <djelin...@openjdk.org> wrote:
> This patch modifies the `getLastErrorString` method to return a `jstring`. > Thanks to that we can avoid unnecessary back and forth conversions between > Unicode and other charsets on Windows. > > Other changes include: > - the Windows implementation of `getLastErrorString` no longer checks > `errno`. I verified all uses of the method and confirmed that `errno` is not > used anywhere. > - While at it, I found and fixed a few calls to > `JNU_ThrowIOExceptionWithLastError` that were done in context where > `LastError` was not set. > - jdk.hotspot.agent was modified to use `JNU_ThrowByNameWithLastError` and > `JNU_ThrowByName` instead of `getLastErrorString`; the code is expected to > have identical behavior. > - zip_util was modified to return static messages instead of generated ones. > The generated messages were not observed anywhere, because they were replaced > by a static message in ZIP_Open, which is the only method used by other > native code. > - `getLastErrorString` is no longer exported by libjava. > > Tier1-3 tests continue to pass. > > No new automated regression test; testing this requires installing a language > pack that cannot be displayed in the current code page. > Tested this manually by installing Chinese language pack on English Windows > 11, selecting Chinese language, then checking if the message on exception > thrown by `InetAddress.getByName("nonexistent.local");` starts with > `"不知道这样的主机。"` (or > `"\u4e0d\u77e5\u9053\u8fd9\u6837\u7684\u4e3b\u673a\u3002"`). Without the > change, the exception message started with a row of question marks. src/java.base/share/native/libjava/jni_util.c line 133: > 131: if (s != NULL) { > 132: jobject x = NULL; > 133: if (messagelen) { Avoid implicit compare with 0; use `messagelen > 0` or similar. src/java.base/share/native/libjava/jni_util.c line 137: > 135: size_t messageextlen = messagelen + 4; > 136: char *str1 = (char *)malloc((messageextlen) * sizeof(char)); > 137: if (str1 == 0) { Use NULL when comparing to a pointer. src/java.base/unix/native/libjava/jni_util_md.c line 69: > 67: if (errno == 0) return NULL; > 68: getErrorString(errno, buf, sizeof(buf)); > 69: return (*buf) ? JNU_NewStringPlatform(env, buf) : NULL; I would have used `buf[0] != 0` since its declared as a local buffer; but this file doesn't have much of a style to follow. ------------- PR: https://git.openjdk.org/jdk/pull/12922