From c7bd5b05ddf587bb19da29a5162940f9653edb24 Mon Sep 17 00:00:00 2001 From: Jeremy Moeglich Date: Tue, 21 Jan 2025 07:33:46 +0100 Subject: [PATCH 1/5] fix: update indexGetter return type for Node 23 compatibility Node 23 uses V8 version >12.4 which requires property interceptors to return v8::Intercepted instead of void. Updated the indexGetter function to handle both older and newer V8 versions by: - Returning v8::Intercepted{} for V8 >12.4 - Maintaining void return for older versions - Preserving the existing behavior of array access The actual JavaScript return values remain unchanged, only the V8 interception signaling mechanism is updated. --- package-lock.json | 9 +++++---- package.json | 2 +- src/javaObject.cpp | 19 +++++++++++++++---- src/utils.cpp | 4 ++-- 4 files changed, 23 insertions(+), 11 deletions(-) diff --git a/package-lock.json b/package-lock.json index 497e5991..a43071f0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,7 @@ "async": "^3.2.5", "find-java-home": "^2.0.0", "glob": "^10.3.10", - "nan": "^2.18.0", + "nan": "^2.22.0", "node-gyp": "^10.0.1" }, "devDependencies": { @@ -2083,9 +2083,10 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/nan": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.18.0.tgz", - "integrity": "sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==" + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.0.tgz", + "integrity": "sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==", + "license": "MIT" }, "node_modules/negotiator": { "version": "0.6.3", diff --git a/package.json b/package.json index e096d870..189deef6 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "async": "^3.2.5", "find-java-home": "^2.0.0", "glob": "^10.3.10", - "nan": "^2.18.0", + "nan": "^2.22.0", "node-gyp": "^10.0.1" }, "devDependencies": { diff --git a/src/javaObject.cpp b/src/javaObject.cpp index 0d67aa8a..ce168761 100644 --- a/src/javaObject.cpp +++ b/src/javaObject.cpp @@ -242,7 +242,7 @@ NAN_GETTER(JavaObject::fieldGetter) { jmethodID array_getLength = env->GetStaticMethodID(arrayClass, "getLength", "(Ljava/lang/Object;)I"); jint arrayLength = env->CallStaticIntMethod(arrayClass, array_getLength, self->m_obj); assertNoException(env); - info.GetReturnValue().Set(arrayLength); + info.GetReturnValue().Set(static_cast(arrayLength)); return; } } @@ -318,16 +318,27 @@ NAN_INDEX_GETTER(JavaObject::indexGetter) { jmethodID array_getLength = env->GetStaticMethodID(arrayClass, "getLength", "(Ljava/lang/Object;)I"); jint arrayLength = env->CallStaticIntMethod(arrayClass, array_getLength, self->m_obj); assertNoException(env); - if ((jint)index >= arrayLength) { - info.GetReturnValue().SetUndefined(); + if (static_cast(index) >= arrayLength) { + info.GetReturnValue().Set(Nan::Undefined()); +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 12 || \ + (V8_MAJOR_VERSION == 12 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION > 4)) + return v8::Intercepted{}; +#else return; +#endif } jmethodID array_get = env->GetStaticMethodID(arrayClass, "get", "(Ljava/lang/Object;I)Ljava/lang/Object;"); - jobject item = env->CallStaticObjectMethod(arrayClass, array_get, self->m_obj, index); + jobject item = env->CallStaticObjectMethod(arrayClass, array_get, self->m_obj, static_cast(index)); assertNoException(env); v8::Local result = javaToV8(self->m_java, env, item); info.GetReturnValue().Set(result); +#if defined(V8_MAJOR_VERSION) && (V8_MAJOR_VERSION > 12 || \ + (V8_MAJOR_VERSION == 12 && defined(V8_MINOR_VERSION) && V8_MINOR_VERSION > 4)) + return v8::Intercepted{}; +#else + return; +#endif } /*static*/ Nan::Persistent JavaProxyObject::s_proxyCt; diff --git a/src/utils.cpp b/src/utils.cpp index 780a291c..a17e4763 100644 --- a/src/utils.cpp +++ b/src/utils.cpp @@ -548,7 +548,7 @@ v8::Local javaArrayToV8(Java* java, JNIEnv* env, jobjectArray objArra return v8::Int32Array::New(ab, 0, arraySize); #else for(jsize i=0; iSet(i, Nan::New(elems[i])); + result->Set(i, Nan::New(static_cast(elems[i]))); } env->ReleaseIntArrayElements((jintArray)objArray, elems, 0); #endif @@ -728,7 +728,7 @@ v8::Local javaToV8(Java* java, JNIEnv* env, jobject obj, DynamicProxy jmethodID integer_intValue = env->GetMethodID(integerClazz, "intValue", "()I"); jint result = env->CallIntMethod(obj, integer_intValue); checkJavaException(env); - return Nan::New(result); + return Nan::New(static_cast(result)); } case TYPE_SHORT: { From 68983696a3f91b799a55121de11098eb52898723 Mon Sep 17 00:00:00 2001 From: Jeremy Moeglich Date: Tue, 21 Jan 2025 08:09:57 +0100 Subject: [PATCH 2/5] attempt to supress file access log to prevent error when used via git --- binding.gyp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/binding.gyp b/binding.gyp index 06117502..d05d2ca8 100644 --- a/binding.gyp +++ b/binding.gyp @@ -37,6 +37,11 @@ 'src/nodeJavaBridge.cpp', 'src/utils.cpp' ], + "msvs_settings": { + "VCCLCompilerTool": { + "TrackFileAccess": "false" + } + }, 'include_dirs': [ '<(javahome)/include', " Date: Tue, 21 Jan 2025 08:39:56 +0100 Subject: [PATCH 3/5] change name for publish --- binding.gyp | 5 ----- package.json | 8 ++++---- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/binding.gyp b/binding.gyp index d05d2ca8..06117502 100644 --- a/binding.gyp +++ b/binding.gyp @@ -37,11 +37,6 @@ 'src/nodeJavaBridge.cpp', 'src/utils.cpp' ], - "msvs_settings": { - "VCCLCompilerTool": { - "TrackFileAccess": "false" - } - }, 'include_dirs': [ '<(javahome)/include', "", "keywords": [ @@ -7,7 +7,7 @@ "jvm", "bridge" ], - "version": "0.14.0", + "version": "0.14.1", "engines": { "node": ">=7.0.0" }, @@ -18,12 +18,12 @@ } ], "bugs": { - "url": "https://github.com/joeferner/node-java/issues" + "url": "https://github.com/jeremymoeglich/node-java/issues" }, "license": "MIT", "repository": { "type": "git", - "url": "https://github.com/joeferner/node-java.git" + "url": "https://github.com/jeremymoeglich/node-java.git" }, "dependencies": { "async": "^3.2.5", From 9a0b84b71553a1316746522087dcdd524586c291 Mon Sep 17 00:00:00 2001 From: Jeremy Moeglich Date: Thu, 8 May 2025 10:26:26 +0200 Subject: [PATCH 4/5] Support node 24 --- binding.gyp | 21 +++++++++++++++++++++ package-lock.json | 16 ++++++++-------- package.json | 2 +- 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/binding.gyp b/binding.gyp index 06117502..39768d3d 100644 --- a/binding.gyp +++ b/binding.gyp @@ -37,6 +37,27 @@ 'src/nodeJavaBridge.cpp', 'src/utils.cpp' ], + + # === BEGIN C++20 SUPPORT FOR NODE 24+ === + # MSVC & ClangCL: + 'msvs_settings': { + 'VCCLCompilerTool': { + 'AdditionalOptions': [ + '/std:c++20' # MSVC/ClangCL + ] + } + }, + + # clang (if you ever build with plain clang/g++). + 'cflags_cc!': [], # clear any nasty defaults + 'cflags_cc': [ + '-std=c++20' # clang/gcc + ], + 'cxxflags': [ + '-std=c++20' + ], + # === END C++20 SUPPORT === + 'include_dirs': [ '<(javahome)/include', " Date: Thu, 8 May 2025 10:38:57 +0200 Subject: [PATCH 5/5] bump version --- package-lock.json | 4 ++-- package.json | 6 +++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index b5a47bf6..52e25c81 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@jeremymoeglich/java", - "version": "0.14.1", + "version": "0.15.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@jeremymoeglich/java", - "version": "0.14.1", + "version": "0.15.0", "hasInstallScript": true, "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 4389413f..99b6e5ba 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "jvm", "bridge" ], - "version": "0.14.1", + "version": "0.15.0", "engines": { "node": ">=7.0.0" }, @@ -15,6 +15,10 @@ { "name": "Joe Ferner", "email": "joe@fernsroth.com" + }, + { + "name": "Jeremy Moeglich", + "email": "jeremy@moeglich.dev" } ], "bugs": {