@@ -65,11 +65,10 @@ const vfs_methods = {
6565 } ) ;
6666 }
6767
68- // Convert 64-bit unsigned int in WASM memory to Number. The unsigned
69- // int is assumed to be <= Number.MAX_SAFE_INTEGER;
70- function u64 ( ptr ) {
71- const index = ptr >> 2 ;
72- return HEAPU32 [ index ] + ( HEAPU32 [ index + 1 ] * ( 2 ** 32 ) ) ;
68+ // Emscripten "legalizes" 64-bit integer arguments by passing them as
69+ // two 32-bit signed integers.
70+ function delegalize ( lo32 , hi32 ) {
71+ return ( hi32 * 0x100000000 ) + lo32 + ( lo32 < 0 ? 2 ** 32 : 0 ) ;
7372 }
7473
7574 const closedFiles = hasAsyncify ? new Set ( ) : null ;
@@ -92,23 +91,23 @@ const vfs_methods = {
9291 }
9392
9493 // int xRead(sqlite3_file* file, void* pData, int iAmt, sqlite3_int64 iOffset);
95- _vfsRead = function ( file , pData , iAmt , iOffset ) {
94+ _vfsRead = function ( file , pData , iAmt , iOffsetLo , iOffsetHi ) {
9695 const vfs = mapFileToVFS . get ( file ) ;
9796 const pDataArray = HEAPU8 . subarray ( pData , pData + iAmt ) ;
98- return vfs [ 'xRead' ] ( file , pDataArray , u64 ( iOffset ) ) ;
97+ return vfs [ 'xRead' ] ( file , pDataArray , delegalize ( iOffsetLo , iOffsetHi ) ) ;
9998 }
10099
101100 // int xWrite(sqlite3_file* file, const void* pData, int iAmt, sqlite3_int64 iOffset);
102- _vfsWrite = function ( file , pData , iAmt , iOffset ) {
101+ _vfsWrite = function ( file , pData , iAmt , iOffsetLo , iOffsetHi ) {
103102 const vfs = mapFileToVFS . get ( file ) ;
104103 const pDataArray = HEAPU8 . subarray ( pData , pData + iAmt ) ;
105- return vfs [ 'xWrite' ] ( file , pDataArray , u64 ( iOffset ) ) ;
104+ return vfs [ 'xWrite' ] ( file , pDataArray , delegalize ( iOffsetLo , iOffsetHi ) ) ;
106105 }
107106
108107 // int xTruncate(sqlite3_file* file, sqlite3_int64 size);
109- _vfsTruncate = function ( file , iSize ) {
108+ _vfsTruncate = function ( file , iSizeLo , iSizeHi ) {
110109 const vfs = mapFileToVFS . get ( file ) ;
111- return vfs [ 'xTruncate' ] ( file , u64 ( iSize ) ) ;
110+ return vfs [ 'xTruncate' ] ( file , delegalize ( iSizeLo , iSizeHi ) ) ;
112111 }
113112
114113 // int xSync(sqlite3_file* file, int flags);
0 commit comments