]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Pointer-casting-related fixes for JNI on 32-bit ARM (pi4 armv7l).
authorstephan <stephan@noemail.net>
Mon, 2 Oct 2023 14:44:28 +0000 (14:44 +0000)
committerstephan <stephan@noemail.net>
Mon, 2 Oct 2023 14:44:28 +0000 (14:44 +0000)
FossilOrigin-Name: 54441039ae3ebe39e42f008f77ce1be117cbda6daeed8b01739ad42a3c1f0754

ext/jni/GNUmakefile
ext/jni/src/c/sqlite3-jni.c
ext/jni/src/org/sqlite/jni/Tester1.java
manifest
manifest.uuid

index 77b0c3061be16c3f006f6054fa0c8c9d2ce1b0fa..0ff9cb6289a4d962d647d4a4ec723f69501040a5 100644 (file)
@@ -254,6 +254,7 @@ $(sqlite3-jni.h.in): $(dir.bld.c)
 
 #package.dll.cfiles :=
 package.dll.cflags = \
+  -std=c99 \
   -fPIC \
   -I. \
   -I$(dir $(sqlite3.h)) \
index 1a9c3bc35670d6e7e9ceea6274e72e1e4c82d9d0..9381bb0005428070af391f725fdbba28549f80f6 100644 (file)
 #include "sqlite3-jni.h"
 #include <assert.h>
 #include <stdio.h> /* only for testing/debugging */
+#include <stdint.h> /* intptr_t for 32-bit builds */
 
 /* Only for debugging */
 #define MARKER(pfexp)                                               \
 */
 #define S3JniApi(CFunc,ReturnType,Suffix) JniDecl(ReturnType,Suffix)
 
+/*
+** S3JniCast_L2P and P2L cast jlong (64-bit) to/from pointers. This is
+** required for casting warning-free on 32-bit builds, where we
+** otherwise get complaints that we're casting between different-sized
+** int types.
+**
+** This use of intptr_t is the _only_ reason we require <stdint.h>
+** which, in turn, requires building with -std=c99 (or later).
+*/
+#define S3JniCast_L2P(JLongAsPtr) (void*)((intptr_t)(JLongAsPtr))
+#define S3JniCast_P2L(PTR) (jlong)((intptr_t)(PTR))
+
 /*
 ** Shortcuts for the first 2 parameters to all JNI bindings.
 **
@@ -1397,7 +1410,8 @@ static jfieldID s3jni_nphop_field(JNIEnv * const env, S3JniNphOp const* pRef){
 static void NativePointerHolder__set(JNIEnv * const env, S3JniNphOp const* pRef,
                                      jobject jNph, const void * p){
   assert( jNph );
-  (*env)->SetLongField(env, jNph, s3jni_nphop_field(env, pRef), (jlong)p);
+  (*env)->SetLongField(env, jNph, s3jni_nphop_field(env, pRef),
+                       S3JniCast_P2L(p));
   S3JniExceptionIsFatal("Could not set NativePointerHolder.nativePointer.");
 }
 
@@ -1413,7 +1427,9 @@ static void * NativePointerHolder__get(JNIEnv * env, jobject jNph,
                                        S3JniNphOp const* pRef){
   void * rv = 0;
   if( jNph ){
-    rv = (void*)(*env)->GetLongField(env, jNph, s3jni_nphop_field(env, pRef));
+    rv = S3JniCast_L2P(
+      (*env)->GetLongField(env, jNph, s3jni_nphop_field(env, pRef))
+    );
     S3JniExceptionIsFatal("Cannot fetch NativePointerHolder.nativePointer.");
   }
   return rv;
@@ -1451,13 +1467,12 @@ static void * NativePointerHolder__get(JNIEnv * env, jobject jNph,
 ** now do the native pointer extraction in the Java side, rather than
 ** the C side, because it's reportedly significantly faster.
 */
-#define S3JniLongPtr_T(T,JLongPtr) (T*)(JLongPtr)
-#define S3JniLongPtr_sqlite3(JLongPtr) S3JniLongPtr_T(sqlite3,JLongPtr)
-#define S3JniLongPtr_sqlite3_backup(JLongPtr) S3JniLongPtr_T(sqlite3_backup,JLongPtr)
-#define S3JniLongPtr_sqlite3_blob(JLongPtr) S3JniLongPtr_T(sqlite3_blob,JLongPtr)
-#define S3JniLongPtr_sqlite3_stmt(JLongPtr) S3JniLongPtr_T(sqlite3_stmt,JLongPtr)
-#define S3JniLongPtr_sqlite3_value(JLongPtr) S3JniLongPtr_T(sqlite3_value,JLongPtr)
-
+#define S3JniLongPtr_T(T,JLongAsPtr) (T*)((intptr_t)(JLongAsPtr))
+#define S3JniLongPtr_sqlite3(JLongAsPtr) S3JniLongPtr_T(sqlite3,JLongAsPtr)
+#define S3JniLongPtr_sqlite3_backup(JLongAsPtr) S3JniLongPtr_T(sqlite3_backup,JLongAsPtr)
+#define S3JniLongPtr_sqlite3_blob(JLongAsPtr) S3JniLongPtr_T(sqlite3_blob,JLongAsPtr)
+#define S3JniLongPtr_sqlite3_stmt(JLongAsPtr) S3JniLongPtr_T(sqlite3_stmt,JLongAsPtr)
+#define S3JniLongPtr_sqlite3_value(JLongAsPtr) S3JniLongPtr_T(sqlite3_value,JLongAsPtr)
 /*
 ** Extracts the new S3JniDb instance from the free-list, or allocates
 ** one if needed, associates it with pDb, and returns.  Returns NULL
@@ -2109,7 +2124,7 @@ S3JniApi(sqlite3_aggregate_context(),jlong,1aggregate_1context)(
                                            ? (int)sizeof(void*)
                                            : 0))
     : 0;
-  return (jlong)p;
+  return S3JniCast_P2L(p);
 }
 
 /* Central auto-extension handler. */
@@ -5169,9 +5184,11 @@ static void s3jni_phraseIter_NToJ(JNIEnv *const env,
                                   jobject jIter){
   S3JniGlobalType * const g = &S3JniGlobal;
   assert(g->fts5.jPhraseIter.fidA);
-  (*env)->SetLongField(env, jIter, g->fts5.jPhraseIter.fidA, (jlong)pSrc->a);
+  (*env)->SetLongField(env, jIter, g->fts5.jPhraseIter.fidA,
+                       S3JniCast_P2L(pSrc->a));
   S3JniExceptionIsFatal("Cannot set Fts5PhraseIter.a field.");
-  (*env)->SetLongField(env, jIter, g->fts5.jPhraseIter.fidB, (jlong)pSrc->b);
+  (*env)->SetLongField(env, jIter, g->fts5.jPhraseIter.fidB,
+                       S3JniCast_P2L(pSrc->b));
   S3JniExceptionIsFatal("Cannot set Fts5PhraseIter.b field.");
 }
 
@@ -5180,11 +5197,13 @@ static void s3jni_phraseIter_JToN(JNIEnv *const env,  jobject jIter,
                                   Fts5PhraseIter * const pDest){
   S3JniGlobalType * const g = &S3JniGlobal;
   assert(g->fts5.jPhraseIter.fidA);
-  pDest->a =
-    (const unsigned char *)(*env)->GetLongField(env, jIter, g->fts5.jPhraseIter.fidA);
+  pDest->a = S3JniCast_L2P(
+    (*env)->GetLongField(env, jIter, g->fts5.jPhraseIter.fidA)
+  );
   S3JniExceptionIsFatal("Cannot get Fts5PhraseIter.a field.");
-  pDest->b =
-    (const unsigned char *)(*env)->GetLongField(env, jIter, g->fts5.jPhraseIter.fidB);
+  pDest->b = S3JniCast_L2P(
+    (*env)->GetLongField(env, jIter, g->fts5.jPhraseIter.fidB)
+  );
   S3JniExceptionIsFatal("Cannot get Fts5PhraseIter.b field.");
 }
 
index 722ff0e3a725ab14020ba700a04aa59c7b81c38d..621cbf2f8d66777526225b6aaf4bedeccf5cb175 100644 (file)
@@ -249,7 +249,7 @@ public class Tester1 implements Runnable {
     ++metrics.dbOpen;
     sqlite3 db = out.get();
     affirm(0 == rc);
-    affirm(0 < db.getNativePointer());
+    affirm(db.getNativePointer()!=0);
     sqlite3_db_config(db, SQLITE_DBCONFIG_DEFENSIVE, 1, null)
       /* This function has different mangled names in jdk8 vs jdk19,
          and this call is here to ensure that the build fails
@@ -273,7 +273,7 @@ public class Tester1 implements Runnable {
     ++metrics.dbOpen;
     affirm(0 == rc);
     sqlite3 db = out.get();
-    affirm(0 < db.getNativePointer());
+    affirm(0 != db.getNativePointer());
     sqlite3_close_v2(db);
     affirm(0 == db.getNativePointer());
   }
index fa128f906f39835ba935fbbaf8bc5c09a3546739..86a145f0d294d95f752ea1b95841b0477104590d 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\sJNI\sbinding\sfor\ssqlite3_normalized_sql().
-D 2023-10-01T12:15:38.078
+C Pointer-casting-related\sfixes\sfor\sJNI\son\s32-bit\sARM\s(pi4\sarmv7l).
+D 2023-10-02T14:44:28.216
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -235,10 +235,10 @@ F ext/fts5/tool/showfts5.tcl d54da0e067306663e2d5d523965ca487698e722c
 F ext/icu/README.txt 7ab7ced8ae78e3a645b57e78570ff589d4c672b71370f5aa9e1cd7024f400fc9
 F ext/icu/icu.c c074519b46baa484bb5396c7e01e051034da8884bad1a1cb7f09bbe6be3f0282
 F ext/icu/sqliteicu.h fa373836ed5a1ee7478bdf8a1650689294e41d0c89c1daab26e9ae78a32075a8
-F ext/jni/GNUmakefile 795caa6318c9ddbe6d3677b63e43dcdf3d20bc517b124819e6ba480e6e1c33b1
+F ext/jni/GNUmakefile 7278812b41ced95fe67a9e5823aee027d641fd26fdfabe66c62b102a3a4e0631
 F ext/jni/README.md 9fceaeb17cecdc5d699dfc83c0cbc3a03fdb3b86bf676381894166c73375ee75
 F ext/jni/jar-dist.make 030aaa4ae71dd86e4ec5e7c1e6cd86f9dfa47c4592c070d2e35157e42498e1fa
-F ext/jni/src/c/sqlite3-jni.c f308c04cc96e3aca5e58655a796ecbd688dac5ab778b702238ebd4f4a72cee0d
+F ext/jni/src/c/sqlite3-jni.c 8710e78156b35f5e79d96c0d317bb203317c9976af99fd124d0b2ce4ad7093e0
 F ext/jni/src/c/sqlite3-jni.h 74e3da791f748f02d0d684562126cf6bfdd2a85cbb6a5d1354b14fcd46e187bc
 F ext/jni/src/org/sqlite/jni/AbstractCollationCallback.java 95e88ba04f4aac51ffec65693e878e234088b2f21b387f4e4285c8b72b33e436
 F ext/jni/src/org/sqlite/jni/AggregateFunction.java 7312486bc65fecdb91753c0a4515799194e031f45edbe16a6373cea18f404dc4
@@ -263,7 +263,7 @@ F ext/jni/src/org/sqlite/jni/SQLTester.java da42be06a2d644e0b915b40508934c1f3239
 F ext/jni/src/org/sqlite/jni/SQLite3Jni.java 9860c1cebd8a38041306f2ee7563f2898fcbdf77e4bfa393fba25b4924edcb5d
 F ext/jni/src/org/sqlite/jni/ScalarFunction.java 6d387bb499fbe3bc13c53315335233dbf6a0c711e8fa7c521683219b041c614c
 F ext/jni/src/org/sqlite/jni/TableColumnMetadata.java 54511b4297fa28dcb3f49b24035e34ced10e3fd44fd0e458e784f4d6b0096dab
-F ext/jni/src/org/sqlite/jni/Tester1.java b5f68ff18f701ca7d1f6fe8bd0642de9289ed7aee422aabcaf92d03937ab097c
+F ext/jni/src/org/sqlite/jni/Tester1.java ced62ed417c3326f93d2e90b3bb64ac2db58ac42a7ad7a5965b24545434e3200
 F ext/jni/src/org/sqlite/jni/TesterFts5.java 854c737bb5c9463ee92a8ee230013e924236dd4b74d4688dd62c17f38d5837db
 F ext/jni/src/org/sqlite/jni/TraceV2Callback.java beb0b064c1a5f8bfe585a324ed39a4e33edbe379a3fc60f1401661620d3ca7c0
 F ext/jni/src/org/sqlite/jni/UpdateHookCallback.java 8376f4a931f2d5612b295c003c9515ba933ee76d8f95610e89c339727376e36c
@@ -2122,8 +2122,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 906e2ed3e9647f5c2355e9fea2beee141767cae7016da9fa1fe88283726b9369
-R 9775e917ddc66cb5e22618dc202f56cc
+P 2532e5662a2bbb3e6b4c4be3fad035734b684bdf59b178cb64b444ca6d8b956b
+R a83650bf5f7797eddfc74482addb44c4
 U stephan
-Z 848b571ca2c05c3bd6bf9bbe466709a2
+Z c1992b9ab6d0229ceafa8f585205277d
 # Remove this line to create a well-formed Fossil manifest.
index 475068361acb4e5f09e297de0747035d008f1473..84af8afc7548797c1a78e1799ec15e26c303c40d 100644 (file)
@@ -1 +1 @@
-2532e5662a2bbb3e6b4c4be3fad035734b684bdf59b178cb64b444ca6d8b956b
\ No newline at end of file
+54441039ae3ebe39e42f008f77ce1be117cbda6daeed8b01739ad42a3c1f0754
\ No newline at end of file