Skip to content

Commit 83b377e

Browse files
authored
Merge pull request rhashimoto#135 from rhashimoto/int64
Pass 64-bit arguments to javascript with Emscripten legalization.
2 parents 60d065c + 4897e2d commit 83b377e

File tree

7 files changed

+151
-163
lines changed

7 files changed

+151
-163
lines changed

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ EMFLAGS_COMMON = \
4949

5050
EMFLAGS_DEBUG = \
5151
-s ASSERTIONS=1 \
52-
-g \
52+
-g -Oz \
5353
$(EMFLAGS_COMMON)
5454

5555
EMFLAGS_DIST = \

dist/wa-sqlite-async.mjs

Lines changed: 57 additions & 57 deletions
Large diffs are not rendered by default.

dist/wa-sqlite-async.wasm

-45 Bytes
Binary file not shown.

dist/wa-sqlite.mjs

Lines changed: 77 additions & 77 deletions
Large diffs are not rendered by default.

dist/wa-sqlite.wasm

-75 Bytes
Binary file not shown.

src/libvfs.c

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
// sqlite3_io_methods javascript handlers
88
// 64-bit integer parameters are passed by pointer.
99
extern int vfsClose(sqlite3_file* file);
10-
extern int vfsRead(sqlite3_file* file, void* pData, int iAmt, const sqlite3_int64* iOffset);
11-
extern int vfsWrite(sqlite3_file* file, const void* pData, int iAmt, const sqlite3_int64* iOffset);
12-
extern int vfsTruncate(sqlite3_file* file, const sqlite3_int64* size);
10+
extern int vfsRead(sqlite3_file* file, void* pData, int iAmt, sqlite3_int64 iOffset);
11+
extern int vfsWrite(sqlite3_file* file, const void* pData, int iAmt, sqlite3_int64 iOffset);
12+
extern int vfsTruncate(sqlite3_file* file, sqlite3_int64 size);
1313
extern int vfsSync(sqlite3_file* file, int flags);
1414
extern int vfsFileSize(sqlite3_file* file, sqlite3_int64* pSize);
1515
extern int vfsLock(sqlite3_file* file, int flags);
@@ -23,24 +23,13 @@ extern int vfsOpen(sqlite3_vfs* vfs, const char *zName, sqlite3_file* file, int
2323
extern int vfsDelete(sqlite3_vfs* vfs, const char *zName, int syncDir);
2424
extern int vfsAccess(sqlite3_vfs* vfs, const char *zName, int flags, int *pResOut);
2525

26-
// Glue functions to pass 64-bit integers by pointer.
27-
static int xRead(sqlite3_file* file, void* pData, int iAmt, sqlite3_int64 iOffset) {
28-
return vfsRead(file, pData, iAmt, &iOffset);
29-
}
30-
static int xWrite(sqlite3_file* file, const void* pData, int iAmt, sqlite3_int64 iOffset) {
31-
return vfsWrite(file, pData, iAmt, &iOffset);
32-
}
33-
static int xTruncate(sqlite3_file* file, sqlite3_int64 size) {
34-
return vfsTruncate(file, &size);
35-
}
36-
3726
static int xOpen(sqlite3_vfs* vfs, const char* zName, sqlite3_file* file, int flags, int* pOutFlags) {
3827
static sqlite3_io_methods io_methods = {
3928
1,
4029
vfsClose,
41-
xRead,
42-
xWrite,
43-
xTruncate,
30+
vfsRead,
31+
vfsWrite,
32+
vfsTruncate,
4433
vfsSync,
4534
vfsFileSize,
4635
vfsLock,

src/libvfs.js

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)