1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-07-29 08:01:23 +03:00

Rename the oft-used, verbose sqlite3.wasm.get/setMemValue() and get/setPtrValue() to peek/poke() and peek/pokePtr(). The old names are retained as aliases just in case any client code actually uses them, but they are now deprecated.

FossilOrigin-Name: ad0a8139b0b025f8e9d2eca0c303557ef10fdfab8c8b65afb08c510a804073d5
This commit is contained in:
stephan
2022-12-09 09:23:27 +00:00
parent 5a83f52f48
commit 81a3683174
10 changed files with 145 additions and 138 deletions

View File

@ -197,8 +197,8 @@ self.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
try { try {
let aVals = [], aNames = [], i = 0, offset = 0; let aVals = [], aNames = [], i = 0, offset = 0;
for( ; i < nCols; offset += (wasm.ptrSizeof * ++i) ){ for( ; i < nCols; offset += (wasm.ptrSizeof * ++i) ){
aVals.push( wasm.cstrToJs(wasm.getPtrValue(pColVals + offset)) ); aVals.push( wasm.cstrToJs(wasm.peekPtr(pColVals + offset)) );
aNames.push( wasm.cstrToJs(wasm.getPtrValue(pColNames + offset)) ); aNames.push( wasm.cstrToJs(wasm.peekPtr(pColNames + offset)) );
} }
rc = callback(pVoid, nCols, aVals, aNames) | 0; rc = callback(pVoid, nCols, aVals, aNames) | 0;
/* The first 2 args of the callback are useless for JS but /* The first 2 args of the callback are useless for JS but
@ -294,7 +294,7 @@ self.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
let i, pVal, valType, arg; let i, pVal, valType, arg;
const tgt = []; const tgt = [];
for(i = 0; i < argc; ++i){ for(i = 0; i < argc; ++i){
pVal = wasm.getPtrValue(pArgv + (wasm.ptrSizeof * i)); pVal = wasm.peekPtr(pArgv + (wasm.ptrSizeof * i));
/** /**
Curiously: despite ostensibly requiring 8-byte Curiously: despite ostensibly requiring 8-byte
alignment, the pArgv array is parcelled into chunks of alignment, the pArgv array is parcelled into chunks of
@ -693,7 +693,7 @@ self.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
pstack = wasm.pstack; pstack = wasm.pstack;
const kvvfsStorage = (zClass)=> const kvvfsStorage = (zClass)=>
((115/*=='s'*/===wasm.getMemValue(zClass)) ((115/*=='s'*/===wasm.peek(zClass))
? sessionStorage : localStorage); ? sessionStorage : localStorage);
/** /**
@ -717,13 +717,13 @@ self.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
C-string's byte length. */; C-string's byte length. */;
if(nBuf<=0) return nV; if(nBuf<=0) return nV;
else if(1===nBuf){ else if(1===nBuf){
wasm.setMemValue(zBuf, 0); wasm.poke(zBuf, 0);
return nV; return nV;
} }
const zV = wasm.scopedAllocCString(jV); const zV = wasm.scopedAllocCString(jV);
if(nBuf > nV + 1) nBuf = nV + 1; if(nBuf > nV + 1) nBuf = nV + 1;
wasm.heap8u().copyWithin(zBuf, zV, zV + nBuf - 1); wasm.heap8u().copyWithin(zBuf, zV, zV + nBuf - 1);
wasm.setMemValue(zBuf + nBuf - 1, 0); wasm.poke(zBuf + nBuf - 1, 0);
return nBuf - 1; return nBuf - 1;
}catch(e){ }catch(e){
console.error("kvstorageRead()",e); console.error("kvstorageRead()",e);

View File

@ -156,7 +156,7 @@ self.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
try { try {
const pPtr = wasm.pstack.allocPtr() /* output (sqlite3**) arg */; const pPtr = wasm.pstack.allocPtr() /* output (sqlite3**) arg */;
let rc = capi.sqlite3_open_v2(fn, pPtr, oflags, vfsName || 0); let rc = capi.sqlite3_open_v2(fn, pPtr, oflags, vfsName || 0);
pDb = wasm.getPtrValue(pPtr); pDb = wasm.peekPtr(pPtr);
checkSqlite3Rc(pDb, rc); checkSqlite3Rc(pDb, rc);
if(flagsStr.indexOf('t')>=0){ if(flagsStr.indexOf('t')>=0){
capi.sqlite3_trace_v2(pDb, capi.SQLITE_TRACE_STMT, capi.sqlite3_trace_v2(pDb, capi.SQLITE_TRACE_STMT,
@ -636,7 +636,7 @@ self.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
try{ try{
ppStmt = wasm.pstack.alloc(8)/* output (sqlite3_stmt**) arg */; ppStmt = wasm.pstack.alloc(8)/* output (sqlite3_stmt**) arg */;
DB.checkRc(this, capi.sqlite3_prepare_v2(this.pointer, sql, -1, ppStmt, null)); DB.checkRc(this, capi.sqlite3_prepare_v2(this.pointer, sql, -1, ppStmt, null));
pStmt = wasm.getPtrValue(ppStmt); pStmt = wasm.peekPtr(ppStmt);
} }
finally { finally {
wasm.pstack.restore(stack); wasm.pstack.restore(stack);
@ -816,8 +816,8 @@ self.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
const pSqlEnd = pSql + sqlByteLen; const pSqlEnd = pSql + sqlByteLen;
if(isTA) wasm.heap8().set(arg.sql, pSql); if(isTA) wasm.heap8().set(arg.sql, pSql);
else wasm.jstrcpy(arg.sql, wasm.heap8(), pSql, sqlByteLen, false); else wasm.jstrcpy(arg.sql, wasm.heap8(), pSql, sqlByteLen, false);
wasm.setMemValue(pSql + sqlByteLen, 0/*NUL terminator*/); wasm.poke(pSql + sqlByteLen, 0/*NUL terminator*/);
while(pSql && wasm.getMemValue(pSql, 'i8') while(pSql && wasm.peek(pSql, 'i8')
/* Maintenance reminder:^^^ _must_ be 'i8' or else we /* Maintenance reminder:^^^ _must_ be 'i8' or else we
will very likely cause an endless loop. What that's will very likely cause an endless loop. What that's
doing is checking for a terminating NUL byte. If we doing is checking for a terminating NUL byte. If we
@ -825,12 +825,12 @@ self.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
around the NUL terminator, and get stuck in and around the NUL terminator, and get stuck in and
endless loop at the end of the SQL, endlessly endless loop at the end of the SQL, endlessly
re-preparing an empty statement. */ ){ re-preparing an empty statement. */ ){
wasm.setPtrValue([ppStmt, pzTail], 0); wasm.pokePtr([ppStmt, pzTail], 0);
DB.checkRc(this, capi.sqlite3_prepare_v3( DB.checkRc(this, capi.sqlite3_prepare_v3(
this.pointer, pSql, sqlByteLen, 0, ppStmt, pzTail this.pointer, pSql, sqlByteLen, 0, ppStmt, pzTail
)); ));
const pStmt = wasm.getPtrValue(ppStmt); const pStmt = wasm.peekPtr(ppStmt);
pSql = wasm.getPtrValue(pzTail); pSql = wasm.peekPtr(pzTail);
sqlByteLen = pSqlEnd - pSql; sqlByteLen = pSqlEnd - pSql;
if(!pStmt) continue; if(!pStmt) continue;
if(Array.isArray(opt.saveSql)){ if(Array.isArray(opt.saveSql)){

View File

@ -586,7 +586,7 @@ self.sqlite3ApiBootstrap = function sqlite3ApiBootstrap(
It returns its result and compiled statement as documented in It returns its result and compiled statement as documented in
the C API. Fetching the output pointers (5th and 6th the C API. Fetching the output pointers (5th and 6th
parameters) requires using `capi.wasm.getMemValue()` (or parameters) requires using `capi.wasm.peek()` (or
equivalent) and the `pzTail` will point to an address relative to equivalent) and the `pzTail` will point to an address relative to
the `sqlAsPointer` value. the `sqlAsPointer` value.
@ -1121,7 +1121,7 @@ self.sqlite3ApiBootstrap = function sqlite3ApiBootstrap(
space managed by Emscripten's stack-management, so does not space managed by Emscripten's stack-management, so does not
collide with Emscripten-provided stack allocation APIs. The collide with Emscripten-provided stack allocation APIs. The
memory lives in the WASM heap and can be used with routines such memory lives in the WASM heap and can be used with routines such
as wasm.setMemValue() and any wasm.heap8u().slice(). as wasm.poke() and any wasm.heap8u().slice().
*/ */
wasm.pstack = Object.assign(Object.create(null),{ wasm.pstack = Object.assign(Object.create(null),{
/** /**
@ -1180,7 +1180,7 @@ self.sqlite3ApiBootstrap = function sqlite3ApiBootstrap(
When a returned pointers will refer to a 64-bit value, e.g. a When a returned pointers will refer to a 64-bit value, e.g. a
double or int64, and that value must be written or fetched, double or int64, and that value must be written or fetched,
e.g. using wasm.setMemValue() or wasm.getMemValue(), it is e.g. using wasm.poke() or wasm.peek(), it is
important that the pointer in question be aligned to an 8-byte important that the pointer in question be aligned to an 8-byte
boundary or else it will not be fetched or written properly and boundary or else it will not be fetched or written properly and
will corrupt or read neighboring memory. will corrupt or read neighboring memory.
@ -1413,8 +1413,8 @@ self.sqlite3ApiBootstrap = function sqlite3ApiBootstrap(
toss3("Database serialization failed with code", toss3("Database serialization failed with code",
sqlite3.capi.sqlite3_js_rc_str(rc)); sqlite3.capi.sqlite3_js_rc_str(rc));
} }
pOut = wasm.getPtrValue(ppOut); pOut = wasm.peekPtr(ppOut);
const nOut = wasm.getMemValue(pSize, 'i64'); const nOut = wasm.peek(pSize, 'i64');
rc = nOut rc = nOut
? wasm.heap8u().slice(pOut, pOut + Number(nOut)) ? wasm.heap8u().slice(pOut, pOut + Number(nOut))
: new Uint8Array(); : new Uint8Array();

View File

@ -386,7 +386,7 @@ self.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
*/ */
create: (ppOut)=>{ create: (ppOut)=>{
const rc = __xWrap(); const rc = __xWrap();
wasm.setPtrValue(ppOut, rc.pointer); wasm.pokePtr(ppOut, rc.pointer);
return rc; return rc;
}, },
/** /**
@ -544,7 +544,7 @@ self.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
implementations. It must be passed the final argument to one of implementations. It must be passed the final argument to one of
those methods (an output pointer to an int64 row ID) and the those methods (an output pointer to an int64 row ID) and the
value to store at the output pointer's address. Returns the same value to store at the output pointer's address. Returns the same
as wasm.setMemValue() and will throw if the 1st or 2nd arguments as wasm.poke() and will throw if the 1st or 2nd arguments
are invalid for that function. are invalid for that function.
Example xRowid impl: Example xRowid impl:
@ -557,7 +557,7 @@ self.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
}; };
``` ```
*/ */
vtab.xRowid = (ppRowid64, value)=>wasm.setMemValue(ppRowid64, value, 'i64'); vtab.xRowid = (ppRowid64, value)=>wasm.poke(ppRowid64, value, 'i64');
/** /**
A helper to initialize and set up an sqlite3_module object for A helper to initialize and set up an sqlite3_module object for
@ -650,8 +650,8 @@ self.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
try{return func(...arguments) || 0} try{return func(...arguments) || 0}
catch(e){ catch(e){
if(!(e instanceof sqlite3.WasmAllocError)){ if(!(e instanceof sqlite3.WasmAllocError)){
wasm.dealloc(wasm.getPtrValue(pzErr)); wasm.dealloc(wasm.peekPtr(pzErr));
wasm.setPtrValue(pzErr, wasm.allocCString(e.message)); wasm.pokePtr(pzErr, wasm.allocCString(e.message));
} }
return vtab.xError(methodName, e); return vtab.xError(methodName, e);
} }

View File

@ -678,7 +678,7 @@ const installOpfsVfs = function callee(options){
given pFile is open. given pFile is open.
*/ */
const f = __openFiles[pFile]; const f = __openFiles[pFile];
wasm.setMemValue(pOut, f.lockType ? 1 : 0, 'i32'); wasm.poke(pOut, f.lockType ? 1 : 0, 'i32');
return 0; return 0;
}, },
xClose: function(pFile){ xClose: function(pFile){
@ -711,7 +711,7 @@ const installOpfsVfs = function callee(options){
if(0==rc){ if(0==rc){
try { try {
const sz = state.s11n.deserialize()[0]; const sz = state.s11n.deserialize()[0];
wasm.setMemValue(pSz64, sz, 'i64'); wasm.poke(pSz64, sz, 'i64');
}catch(e){ }catch(e){
error("Unexpected error reading xFileSize() result:",e); error("Unexpected error reading xFileSize() result:",e);
rc = state.sq3Codes.SQLITE_IOERR; rc = state.sq3Codes.SQLITE_IOERR;
@ -804,20 +804,20 @@ const installOpfsVfs = function callee(options){
xAccess: function(pVfs,zName,flags,pOut){ xAccess: function(pVfs,zName,flags,pOut){
mTimeStart('xAccess'); mTimeStart('xAccess');
const rc = opRun('xAccess', wasm.cstrToJs(zName)); const rc = opRun('xAccess', wasm.cstrToJs(zName));
wasm.setMemValue( pOut, (rc ? 0 : 1), 'i32' ); wasm.poke( pOut, (rc ? 0 : 1), 'i32' );
mTimeEnd(); mTimeEnd();
return 0; return 0;
}, },
xCurrentTime: function(pVfs,pOut){ xCurrentTime: function(pVfs,pOut){
/* If it turns out that we need to adjust for timezone, see: /* If it turns out that we need to adjust for timezone, see:
https://stackoverflow.com/a/11760121/1458521 */ https://stackoverflow.com/a/11760121/1458521 */
wasm.setMemValue(pOut, 2440587.5 + (new Date().getTime()/86400000), wasm.poke(pOut, 2440587.5 + (new Date().getTime()/86400000),
'double'); 'double');
return 0; return 0;
}, },
xCurrentTimeInt64: function(pVfs,pOut){ xCurrentTimeInt64: function(pVfs,pOut){
// TODO: confirm that this calculation is correct // TODO: confirm that this calculation is correct
wasm.setMemValue(pOut, (2440587.5 * 86400000) + new Date().getTime(), wasm.poke(pOut, (2440587.5 * 86400000) + new Date().getTime(),
'i64'); 'i64');
return 0; return 0;
}, },
@ -867,7 +867,7 @@ const installOpfsVfs = function callee(options){
/* Recall that sqlite3_vfs::xClose() will be called, even on /* Recall that sqlite3_vfs::xClose() will be called, even on
error, unless pFile->pMethods is NULL. */ error, unless pFile->pMethods is NULL. */
if(fh.readOnly){ if(fh.readOnly){
wasm.setMemValue(pOutFlags, capi.SQLITE_OPEN_READONLY, 'i32'); wasm.poke(pOutFlags, capi.SQLITE_OPEN_READONLY, 'i32');
} }
__openFiles[pFile] = fh; __openFiles[pFile] = fh;
fh.sabView = state.sabFileBufView; fh.sabView = state.sabFileBufView;
@ -1202,7 +1202,7 @@ const installOpfsVfs = function callee(options){
log("deserialize() says:",rc); log("deserialize() says:",rc);
if("This is ä string."!==rc[0]) toss("String d13n error."); if("This is ä string."!==rc[0]) toss("String d13n error.");
vfsSyncWrappers.xAccess(opfsVfs.pointer, zDbFile, 0, pOut); vfsSyncWrappers.xAccess(opfsVfs.pointer, zDbFile, 0, pOut);
rc = wasm.getMemValue(pOut,'i32'); rc = wasm.peek(pOut,'i32');
log("xAccess(",dbFile,") exists ?=",rc); log("xAccess(",dbFile,") exists ?=",rc);
rc = vfsSyncWrappers.xOpen(opfsVfs.pointer, zDbFile, rc = vfsSyncWrappers.xOpen(opfsVfs.pointer, zDbFile,
fid, openFlags, pOut); fid, openFlags, pOut);
@ -1213,21 +1213,21 @@ const installOpfsVfs = function callee(options){
return; return;
} }
vfsSyncWrappers.xAccess(opfsVfs.pointer, zDbFile, 0, pOut); vfsSyncWrappers.xAccess(opfsVfs.pointer, zDbFile, 0, pOut);
rc = wasm.getMemValue(pOut,'i32'); rc = wasm.peek(pOut,'i32');
if(!rc) toss("xAccess() failed to detect file."); if(!rc) toss("xAccess() failed to detect file.");
rc = ioSyncWrappers.xSync(sq3File.pointer, 0); rc = ioSyncWrappers.xSync(sq3File.pointer, 0);
if(rc) toss('sync failed w/ rc',rc); if(rc) toss('sync failed w/ rc',rc);
rc = ioSyncWrappers.xTruncate(sq3File.pointer, 1024); rc = ioSyncWrappers.xTruncate(sq3File.pointer, 1024);
if(rc) toss('truncate failed w/ rc',rc); if(rc) toss('truncate failed w/ rc',rc);
wasm.setMemValue(pOut,0,'i64'); wasm.poke(pOut,0,'i64');
rc = ioSyncWrappers.xFileSize(sq3File.pointer, pOut); rc = ioSyncWrappers.xFileSize(sq3File.pointer, pOut);
if(rc) toss('xFileSize failed w/ rc',rc); if(rc) toss('xFileSize failed w/ rc',rc);
log("xFileSize says:",wasm.getMemValue(pOut, 'i64')); log("xFileSize says:",wasm.peek(pOut, 'i64'));
rc = ioSyncWrappers.xWrite(sq3File.pointer, zDbFile, 10, 1); rc = ioSyncWrappers.xWrite(sq3File.pointer, zDbFile, 10, 1);
if(rc) toss("xWrite() failed!"); if(rc) toss("xWrite() failed!");
const readBuf = wasm.scopedAlloc(16); const readBuf = wasm.scopedAlloc(16);
rc = ioSyncWrappers.xRead(sq3File.pointer, readBuf, 6, 2); rc = ioSyncWrappers.xRead(sq3File.pointer, readBuf, 6, 2);
wasm.setMemValue(readBuf+6,0); wasm.poke(readBuf+6,0);
let jRead = wasm.cstrToJs(readBuf); let jRead = wasm.cstrToJs(readBuf);
log("xRead() got:",jRead); log("xRead() got:",jRead);
if("sanity"!==jRead) toss("Unexpected xRead() value."); if("sanity"!==jRead) toss("Unexpected xRead() value.");
@ -1241,7 +1241,7 @@ const installOpfsVfs = function callee(options){
log("Deleting file:",dbFile); log("Deleting file:",dbFile);
vfsSyncWrappers.xDelete(opfsVfs.pointer, zDbFile, 0x1234); vfsSyncWrappers.xDelete(opfsVfs.pointer, zDbFile, 0x1234);
vfsSyncWrappers.xAccess(opfsVfs.pointer, zDbFile, 0, pOut); vfsSyncWrappers.xAccess(opfsVfs.pointer, zDbFile, 0, pOut);
rc = wasm.getMemValue(pOut,'i32'); rc = wasm.peek(pOut,'i32');
if(rc) toss("Expecting 0 from xAccess(",dbFile,") after xDelete()."); if(rc) toss("Expecting 0 from xAccess(",dbFile,") after xDelete().");
warn("End of OPFS sanity checks."); warn("End of OPFS sanity checks.");
}finally{ }finally{

View File

@ -227,20 +227,20 @@
const pSqlEnd = pSqlBegin + sqlByteLen; const pSqlEnd = pSqlBegin + sqlByteLen;
t = performance.now(); t = performance.now();
wasm.heap8().set(sql, pSql); wasm.heap8().set(sql, pSql);
wasm.setMemValue(pSql + sqlByteLen, 0); wasm.poke(pSql + sqlByteLen, 0);
metrics.strcpy = performance.now() - t; metrics.strcpy = performance.now() - t;
let breaker = 0; let breaker = 0;
while(pSql && wasm.getMemValue(pSql,'i8')){ while(pSql && wasm.peek(pSql,'i8')){
wasm.setPtrValue(ppStmt, 0); wasm.pokePtr(ppStmt, 0);
wasm.setPtrValue(pzTail, 0); wasm.pokePtr(pzTail, 0);
t = performance.now(); t = performance.now();
let rc = capi.sqlite3_prepare_v3( let rc = capi.sqlite3_prepare_v3(
db.handle, pSql, sqlByteLen, 0, ppStmt, pzTail db.handle, pSql, sqlByteLen, 0, ppStmt, pzTail
); );
metrics.prepTotal += performance.now() - t; metrics.prepTotal += performance.now() - t;
checkSqliteRc(db.handle, rc); checkSqliteRc(db.handle, rc);
pStmt = wasm.getPtrValue(ppStmt); pStmt = wasm.peekPtr(ppStmt);
pSql = wasm.getPtrValue(pzTail); pSql = wasm.peekPtr(pzTail);
sqlByteLen = pSqlEnd - pSql; sqlByteLen = pSqlEnd - pSql;
if(!pStmt) continue/*empty statement*/; if(!pStmt) continue/*empty statement*/;
++metrics.stmtCount; ++metrics.stmtCount;
@ -495,7 +495,7 @@
const oFlags = capi.SQLITE_OPEN_CREATE | capi.SQLITE_OPEN_READWRITE; const oFlags = capi.SQLITE_OPEN_CREATE | capi.SQLITE_OPEN_READWRITE;
const ppDb = wasm.scopedAllocPtr(); const ppDb = wasm.scopedAllocPtr();
const rc = capi.sqlite3_open_v2(d.filename, ppDb, oFlags, null); const rc = capi.sqlite3_open_v2(d.filename, ppDb, oFlags, null);
pDb = wasm.getPtrValue(ppDb) pDb = wasm.peekPtr(ppDb)
if(rc) toss("sqlite3_open_v2() failed with code",rc); if(rc) toss("sqlite3_open_v2() failed with code",rc);
capi.sqlite3_exec(pDb, "PRAGMA cache_size="+cacheSize, 0, 0, 0); capi.sqlite3_exec(pDb, "PRAGMA cache_size="+cacheSize, 0, 0, 0);
this.logHtml(dbId,"cache_size =",cacheSize); this.logHtml(dbId,"cache_size =",cacheSize);

View File

@ -608,15 +608,15 @@ self.WhWasmUtilInstaller = function(target){
be a pointer type and is treated as the WASM numeric type be a pointer type and is treated as the WASM numeric type
appropriate for the pointer size (`i32`). appropriate for the pointer size (`i32`).
While likely not obvious, this routine and its setMemValue() While likely not obvious, this routine and its poke()
counterpart are how pointer-to-value _output_ parameters counterpart are how pointer-to-value _output_ parameters
in WASM-compiled C code can be interacted with: in WASM-compiled C code can be interacted with:
``` ```
const ptr = alloc(4); const ptr = alloc(4);
setMemValue(ptr, 0, 'i32'); // clear the ptr's value poke(ptr, 0, 'i32'); // clear the ptr's value
aCFuncWithOutputPtrToInt32Arg( ptr ); // e.g. void foo(int *x); aCFuncWithOutputPtrToInt32Arg( ptr ); // e.g. void foo(int *x);
const result = getMemValue(ptr, 'i32'); // fetch ptr's value const result = peek(ptr, 'i32'); // fetch ptr's value
dealloc(ptr); dealloc(ptr);
``` ```
@ -628,15 +628,15 @@ self.WhWasmUtilInstaller = function(target){
const scope = scopedAllocPush(); const scope = scopedAllocPush();
try{ try{
const ptr = scopedAlloc(4); const ptr = scopedAlloc(4);
setMemValue(ptr, 0, 'i32'); poke(ptr, 0, 'i32');
aCFuncWithOutputPtrArg( ptr ); aCFuncWithOutputPtrArg( ptr );
result = getMemValue(ptr, 'i32'); result = peek(ptr, 'i32');
}finally{ }finally{
scopedAllocPop(scope); scopedAllocPop(scope);
} }
``` ```
As a rule setMemValue() must be called to set (typically zero As a rule poke() must be called to set (typically zero
out) the pointer's value, else it will contain an essentially out) the pointer's value, else it will contain an essentially
random value. random value.
@ -644,9 +644,9 @@ self.WhWasmUtilInstaller = function(target){
painful impact on performance. Rather than doing so, use painful impact on performance. Rather than doing so, use
heapForSize() to fetch the heap object and read directly from it. heapForSize() to fetch the heap object and read directly from it.
See: setMemValue() See: poke()
*/ */
target.getMemValue = function f(ptr, type='i8'){ target.peek = function f(ptr, type='i8'){
if(type.endsWith('*')) type = ptrIR; if(type.endsWith('*')) type = ptrIR;
const c = (cache.memory && cache.heapSize === cache.memory.buffer.byteLength) const c = (cache.memory && cache.heapSize === cache.memory.buffer.byteLength)
? cache : heapWrappers(); ? cache : heapWrappers();
@ -668,7 +668,7 @@ self.WhWasmUtilInstaller = function(target){
} }
/* fallthru */ /* fallthru */
default: default:
toss('Invalid type for getMemValue():',type); toss('Invalid type for peek():',type);
} }
if(list) list.push(rc); if(list) list.push(rc);
}while(list && arguments[0].length); }while(list && arguments[0].length);
@ -676,10 +676,10 @@ self.WhWasmUtilInstaller = function(target){
}; };
/** /**
The counterpart of getMemValue(), this sets a numeric value at The counterpart of peek(), this sets a numeric value at
the given WASM heap address, using the type to define how many the given WASM heap address, using the type to define how many
bytes are written. Throws if given an invalid type. See bytes are written. Throws if given an invalid type. See
getMemValue() for details about the type argument. If the 3rd peek() for details about the type argument. If the 3rd
argument ends with `*` then it is treated as a pointer type and argument ends with `*` then it is treated as a pointer type and
this function behaves as if the 3rd argument were `i32`. this function behaves as if the 3rd argument were `i32`.
@ -693,7 +693,7 @@ self.WhWasmUtilInstaller = function(target){
heapForSize() to fetch the heap object and assign directly to it heapForSize() to fetch the heap object and assign directly to it
or use the heap's set() method. or use the heap's set() method.
*/ */
target.setMemValue = function(ptr, value, type='i8'){ target.poke = function(ptr, value, type='i8'){
if (type.endsWith('*')) type = ptrIR; if (type.endsWith('*')) type = ptrIR;
const c = (cache.memory && cache.heapSize === cache.memory.buffer.byteLength) const c = (cache.memory && cache.heapSize === cache.memory.buffer.byteLength)
? cache : heapWrappers(); ? cache : heapWrappers();
@ -712,30 +712,37 @@ self.WhWasmUtilInstaller = function(target){
} }
/* fallthru */ /* fallthru */
default: default:
toss('Invalid type for setMemValue(): ' + type); toss('Invalid type for poke(): ' + type);
} }
} }
return this; return this;
}; };
/** /**
Convenience form of getMemValue() intended for fetching Convenience form of peek() intended for fetching
pointer-to-pointer values. If passed a single non-array argument pointer-to-pointer values. If passed a single non-array argument
it returns the value of that one pointer address. If passed it returns the value of that one pointer address. If passed
multiple arguments, or a single array of arguments, it returns an multiple arguments, or a single array of arguments, it returns an
array of their values. array of their values.
*/ */
target.getPtrValue = function(...ptr){ target.peekPtr = (...ptr)=>target.peek( (1===ptr.length ? ptr[0] : ptr), ptrIR );
return target.getMemValue( (1===ptr.length ? ptr[0] : ptr), ptrIR );
};
/** /**
A variant of setMemValue() intended for setting A variant of poke() intended for setting
pointer-to-pointer values. Its differences from setMemValue() are pointer-to-pointer values. Its differences from poke() are
that (1) it defaults to a value of 0, (2) it always writes that (1) it defaults to a value of 0, (2) it always writes
to the pointer-sized heap view, and (3) it returns `this`. to the pointer-sized heap view, and (3) it returns `this`.
*/ */
target.setPtrValue = (ptr, value=0)=>target.setMemValue(ptr, value, ptrIR); target.pokePtr = (ptr, value=0)=>target.poke(ptr, value, ptrIR);
/** Deprecated alias for getMemValue() */
target.getMemValue = target.peek;
/** Deprecated alias for peekPtr() */
target.getPtrValue = target.peekPtr;
/** Deprecated alias for poke() */
target.setMemValue = target.poke;
/** Deprecated alias for pokePtr() */
target.setPtrValue = target.pokePtr;
/** /**
Returns true if the given value appears to be legal for use as Returns true if the given value appears to be legal for use as
@ -1129,12 +1136,12 @@ self.WhWasmUtilInstaller = function(target){
]((list.length + 1) * target.ptrSizeof); ]((list.length + 1) * target.ptrSizeof);
let i = 0; let i = 0;
list.forEach((e)=>{ list.forEach((e)=>{
target.setPtrValue(pList + (target.ptrSizeof * i++), target.pokePtr(pList + (target.ptrSizeof * i++),
target[ target[
isScoped ? 'scopedAllocCString' : 'allocCString' isScoped ? 'scopedAllocCString' : 'allocCString'
](""+e)); ](""+e));
}); });
target.setPtrValue(pList + (target.ptrSizeof * i), 0); target.pokePtr(pList + (target.ptrSizeof * i), 0);
return pList; return pList;
}; };
@ -1179,7 +1186,7 @@ self.WhWasmUtilInstaller = function(target){
target.cArgvToJs = (argc, pArgv)=>{ target.cArgvToJs = (argc, pArgv)=>{
const list = []; const list = [];
for(let i = 0; i < argc; ++i){ for(let i = 0; i < argc; ++i){
const arg = target.getPtrValue(pArgv + (target.ptrSizeof * i)); const arg = target.peekPtr(pArgv + (target.ptrSizeof * i));
list.push( arg ? target.cstrToJs(arg) : null ); list.push( arg ? target.cstrToJs(arg) : null );
} }
return list; return list;
@ -1203,7 +1210,7 @@ self.WhWasmUtilInstaller = function(target){
__affirmAlloc(target, method); __affirmAlloc(target, method);
const pIr = safePtrSize ? 'i64' : ptrIR; const pIr = safePtrSize ? 'i64' : ptrIR;
let m = target[method](howMany * (safePtrSize ? 8 : ptrSizeof)); let m = target[method](howMany * (safePtrSize ? 8 : ptrSizeof));
target.setMemValue(m, 0, pIr) target.poke(m, 0, pIr)
if(1===howMany){ if(1===howMany){
return m; return m;
} }
@ -1211,7 +1218,7 @@ self.WhWasmUtilInstaller = function(target){
for(let i = 1; i < howMany; ++i){ for(let i = 1; i < howMany; ++i){
m += (safePtrSize ? 8 : ptrSizeof); m += (safePtrSize ? 8 : ptrSizeof);
a[i] = m; a[i] = m;
target.setMemValue(m, 0, pIr); target.poke(m, 0, pIr);
} }
return a; return a;
}; };
@ -1242,7 +1249,7 @@ self.WhWasmUtilInstaller = function(target){
When one of the returned pointers will refer to a 64-bit value, When one of the returned pointers will refer to a 64-bit value,
e.g. a double or int64, an that value must be written or fetched, e.g. a double or int64, an that value must be written or fetched,
e.g. using setMemValue() or getMemValue(), it is important that e.g. using poke() or peek(), it is important that
the pointer in question be aligned to an 8-byte boundary or else the pointer in question be aligned to an 8-byte boundary or else
it will not be fetched or written properly and will corrupt or it will not be fetched or written properly and will corrupt or
read neighboring memory. It is only safe to pass false when the read neighboring memory. It is only safe to pass false when the
@ -1521,8 +1528,8 @@ self.WhWasmUtilInstaller = function(target){
- Figure out how/whether we can (semi-)transparently handle - Figure out how/whether we can (semi-)transparently handle
pointer-type _output_ arguments. Those currently require pointer-type _output_ arguments. Those currently require
explicit handling by allocating pointers, assigning them before explicit handling by allocating pointers, assigning them before
the call using setMemValue(), and fetching them with the call using poke(), and fetching them with
getMemValue() after the call. We may be able to automate some peek() after the call. We may be able to automate some
or all of that. or all of that.
- Figure out whether it makes sense to extend the arg adapter - Figure out whether it makes sense to extend the arg adapter

View File

@ -472,13 +472,13 @@ self.sqlite3InitModule = sqlite3InitModule;
m = w.allocFromTypedArray(u); m = w.allocFromTypedArray(u);
for(let i = 0; i < u.length; ++i){ for(let i = 0; i < u.length; ++i){
T.assert(u[i] === byteList[i]) T.assert(u[i] === byteList[i])
.assert(u[i] === w.getMemValue(m + i, 'i8')); .assert(u[i] === w.peek(m + i, 'i8'));
} }
w.dealloc(m); w.dealloc(m);
m = w.allocFromTypedArray(u.buffer); m = w.allocFromTypedArray(u.buffer);
for(let i = 0; i < u.length; ++i){ for(let i = 0; i < u.length; ++i){
T.assert(u[i] === byteList[i]) T.assert(u[i] === byteList[i])
.assert(u[i] === w.getMemValue(m + i, 'i8')); .assert(u[i] === w.peek(m + i, 'i8'));
} }
w.dealloc(m); w.dealloc(m);
T.mustThrowMatching( T.mustThrowMatching(
@ -557,14 +557,14 @@ self.sqlite3InitModule = sqlite3InitModule;
let rc = w.cstrncpy(cpy, cStr, n+10); let rc = w.cstrncpy(cpy, cStr, n+10);
T.assert(n+1 === rc). T.assert(n+1 === rc).
assert("hello" === w.cstrToJs(cpy)). assert("hello" === w.cstrToJs(cpy)).
assert(chr('o') === w.getMemValue(cpy+n-1)). assert(chr('o') === w.peek(cpy+n-1)).
assert(0 === w.getMemValue(cpy+n)); assert(0 === w.peek(cpy+n));
let cStr2 = w.scopedAllocCString("HI!!!"); let cStr2 = w.scopedAllocCString("HI!!!");
rc = w.cstrncpy(cpy, cStr2, 3); rc = w.cstrncpy(cpy, cStr2, 3);
T.assert(3===rc). T.assert(3===rc).
assert("HI!lo" === w.cstrToJs(cpy)). assert("HI!lo" === w.cstrToJs(cpy)).
assert(chr('!') === w.getMemValue(cpy+2)). assert(chr('!') === w.peek(cpy+2)).
assert(chr('l') === w.getMemValue(cpy+3)); assert(chr('l') === w.peek(cpy+3));
}finally{ }finally{
w.scopedAllocPop(scope); w.scopedAllocPop(scope);
} }
@ -587,8 +587,8 @@ self.sqlite3InitModule = sqlite3InitModule;
const jstr = "hällo, world!"; const jstr = "hällo, world!";
const [cstr, n] = w.allocCString(jstr, true); const [cstr, n] = w.allocCString(jstr, true);
T.assert(14 === n) T.assert(14 === n)
.assert(0===w.getMemValue(cstr+n)) .assert(0===w.peek(cstr+n))
.assert(chr('!')===w.getMemValue(cstr+n-1)); .assert(chr('!')===w.peek(cstr+n-1));
w.dealloc(cstr); w.dealloc(cstr);
} }
@ -624,8 +624,8 @@ self.sqlite3InitModule = sqlite3InitModule;
const [z1, z2, z3] = w.scopedAllocPtr(3); const [z1, z2, z3] = w.scopedAllocPtr(3);
T.assert('number'===typeof z1).assert(z2>z1).assert(z3>z2) T.assert('number'===typeof z1).assert(z2>z1).assert(z3>z2)
.assert(0===w.getMemValue(z1,'i32'), 'allocPtr() must zero the targets') .assert(0===w.peek(z1,'i32'), 'allocPtr() must zero the targets')
.assert(0===w.getMemValue(z3,'i32')); .assert(0===w.peek(z3,'i32'));
}finally{ }finally{
// Pop them in "incorrect" order to make sure they behave: // Pop them in "incorrect" order to make sure they behave:
w.scopedAllocPop(asc); w.scopedAllocPop(asc);
@ -645,8 +645,8 @@ self.sqlite3InitModule = sqlite3InitModule;
T.assert(1===w.scopedAlloc.level); T.assert(1===w.scopedAlloc.level);
const [cstr, n] = w.scopedAllocCString("hello, world", true); const [cstr, n] = w.scopedAllocCString("hello, world", true);
T.assert(12 === n) T.assert(12 === n)
.assert(0===w.getMemValue(cstr+n)) .assert(0===w.peek(cstr+n))
.assert(chr('d')===w.getMemValue(cstr+n-1)); .assert(chr('d')===w.peek(cstr+n-1));
}); });
}/*scopedAlloc()*/ }/*scopedAlloc()*/
@ -708,9 +708,9 @@ self.sqlite3InitModule = sqlite3InitModule;
w.scopedAllocCall(function(){ w.scopedAllocCall(function(){
const pI1 = w.scopedAlloc(8), pI2 = pI1+4; const pI1 = w.scopedAlloc(8), pI2 = pI1+4;
w.setPtrValue([pI1, pI2], 0); w.pokePtr([pI1, pI2], 0);
const f = w.xWrap('sqlite3_wasm_test_int64_minmax',undefined,['i64*','i64*']); const f = w.xWrap('sqlite3_wasm_test_int64_minmax',undefined,['i64*','i64*']);
const [r1, r2] = w.getMemValue([pI1, pI2], 'i64'); const [r1, r2] = w.peek([pI1, pI2], 'i64');
T.assert(!Number.isSafeInteger(r1)).assert(!Number.isSafeInteger(r2)); T.assert(!Number.isSafeInteger(r1)).assert(!Number.isSafeInteger(r2));
}); });
} }
@ -954,8 +954,8 @@ self.sqlite3InitModule = sqlite3InitModule;
try{ try{
const n = 520; const n = 520;
const p = wasm.pstack.alloc(n); const p = wasm.pstack.alloc(n);
T.assert(0===wasm.getMemValue(p)) T.assert(0===wasm.peek(p))
.assert(0===wasm.getMemValue(p+n-1)); .assert(0===wasm.peek(p+n-1));
T.assert(undefined === capi.sqlite3_randomness(n - 10, p)); T.assert(undefined === capi.sqlite3_randomness(n - 10, p));
let j, check = 0; let j, check = 0;
const heap = wasm.heap8u(); const heap = wasm.heap8u();
@ -1070,7 +1070,7 @@ self.sqlite3InitModule = sqlite3InitModule;
rc = capi.sqlite3_db_status(this.db, capi.SQLITE_DBSTATUS_LOOKASIDE_USED, rc = capi.sqlite3_db_status(this.db, capi.SQLITE_DBSTATUS_LOOKASIDE_USED,
pCur, pHi, 0); pCur, pHi, 0);
T.assert(0===rc); T.assert(0===rc);
if(wasm.getMemValue(pCur, 'i32')){ if(wasm.peek(pCur, 'i32')){
warn("Cannot test db_config(SQLITE_DBCONFIG_LOOKASIDE)", warn("Cannot test db_config(SQLITE_DBCONFIG_LOOKASIDE)",
"while lookaside memory is in use."); "while lookaside memory is in use.");
}else{ }else{
@ -1078,22 +1078,22 @@ self.sqlite3InitModule = sqlite3InitModule;
0, 4096, 12); 0, 4096, 12);
T.assert(0 === rc); T.assert(0 === rc);
} }
wasm.setPtrValue([pCur, pHi], 0); wasm.pokePtr([pCur, pHi], 0);
let [vCur, vHi] = wasm.getPtrValue(pCur, pHi); let [vCur, vHi] = wasm.peekPtr(pCur, pHi);
T.assert(0===vCur).assert(0===vHi); T.assert(0===vCur).assert(0===vHi);
rc = capi.sqlite3_status(capi.SQLITE_STATUS_MEMORY_USED, rc = capi.sqlite3_status(capi.SQLITE_STATUS_MEMORY_USED,
pCur, pHi, 0); pCur, pHi, 0);
[vCur, vHi] = wasm.getPtrValue([pCur, pHi]); [vCur, vHi] = wasm.peekPtr([pCur, pHi]);
//console.warn("i32 vCur,vHi",vCur,vHi); //console.warn("i32 vCur,vHi",vCur,vHi);
T.assert(0 === rc).assert(vCur > 0).assert(vHi >= vCur); T.assert(0 === rc).assert(vCur > 0).assert(vHi >= vCur);
if(wasm.bigIntEnabled){ if(wasm.bigIntEnabled){
// Again in 64-bit. Recall that pCur and pHi are allocated // Again in 64-bit. Recall that pCur and pHi are allocated
// large enough to account for this re-use. // large enough to account for this re-use.
wasm.setPtrValue([pCur, pHi], 0) wasm.pokePtr([pCur, pHi], 0)
.setMemValue([vCur, vHi], 0, 'i64'); .poke([vCur, vHi], 0, 'i64');
rc = capi.sqlite3_status64(capi.SQLITE_STATUS_MEMORY_USED, rc = capi.sqlite3_status64(capi.SQLITE_STATUS_MEMORY_USED,
pCur, pHi, 0); pCur, pHi, 0);
[vCur, vHi] = wasm.getMemValue([pCur, pHi], 'i64'); [vCur, vHi] = wasm.peek([pCur, pHi], 'i64');
//console.warn("i64 vCur,vHi",vCur,vHi); //console.warn("i64 vCur,vHi",vCur,vHi);
T.assert(0 === rc).assert(vCur > 0).assert(vHi >= vCur); T.assert(0 === rc).assert(vCur > 0).assert(vHi >= vCur);
} }
@ -1303,11 +1303,11 @@ self.sqlite3InitModule = sqlite3InitModule;
pzDT, pzColl, pNotNull, pPK, pAuto pzDT, pzColl, pNotNull, pPK, pAuto
); );
T.assert(0===rc) T.assert(0===rc)
.assert("INTEGER"===wasm.cstrToJs(wasm.getPtrValue(pzDT))) .assert("INTEGER"===wasm.cstrToJs(wasm.peekPtr(pzDT)))
.assert("BINARY"===wasm.cstrToJs(wasm.getPtrValue(pzColl))) .assert("BINARY"===wasm.cstrToJs(wasm.peekPtr(pzColl)))
.assert(0===wasm.getMemValue(pNotNull,'i32')) .assert(0===wasm.peek(pNotNull,'i32'))
.assert(1===wasm.getMemValue(pPK,'i32')) .assert(1===wasm.peek(pPK,'i32'))
.assert(0===wasm.getMemValue(pAuto,'i32')) .assert(0===wasm.peek(pAuto,'i32'))
}finally{ }finally{
wasm.pstack.restore(stack); wasm.pstack.restore(stack);
} }
@ -1449,11 +1449,11 @@ self.sqlite3InitModule = sqlite3InitModule;
name: 'summer', name: 'summer',
xStep: (pCtx, n)=>{ xStep: (pCtx, n)=>{
const ac = sjac(pCtx, 4); const ac = sjac(pCtx, 4);
wasm.setMemValue(ac, wasm.getMemValue(ac,'i32') + Number(n), 'i32'); wasm.poke(ac, wasm.peek(ac,'i32') + Number(n), 'i32');
}, },
xFinal: (pCtx)=>{ xFinal: (pCtx)=>{
const ac = sjac(pCtx, 0); const ac = sjac(pCtx, 0);
return ac ? wasm.getMemValue(ac,'i32') : 0; return ac ? wasm.peek(ac,'i32') : 0;
} }
}); });
let v = db.selectValue([ let v = db.selectValue([
@ -1472,13 +1472,13 @@ self.sqlite3InitModule = sqlite3InitModule;
arity: -1, arity: -1,
xStep: (pCtx, ...args)=>{ xStep: (pCtx, ...args)=>{
const ac = sjac(pCtx, 4); const ac = sjac(pCtx, 4);
let sum = wasm.getMemValue(ac, 'i32'); let sum = wasm.peek(ac, 'i32');
for(const v of args) sum += Number(v); for(const v of args) sum += Number(v);
wasm.setMemValue(ac, sum, 'i32'); wasm.poke(ac, sum, 'i32');
}, },
xFinal: (pCtx)=>{ xFinal: (pCtx)=>{
const ac = sjac(pCtx, 0); const ac = sjac(pCtx, 0);
capi.sqlite3_result_int( pCtx, ac ? wasm.getMemValue(ac,'i32') : 0 ); capi.sqlite3_result_int( pCtx, ac ? wasm.peek(ac,'i32') : 0 );
// xFinal() may either return its value directly or call // xFinal() may either return its value directly or call
// sqlite3_result_xyz() and return undefined. Both are // sqlite3_result_xyz() and return undefined. Both are
// functionally equivalent. // functionally equivalent.
@ -1519,11 +1519,11 @@ self.sqlite3InitModule = sqlite3InitModule;
name: 'summer64', name: 'summer64',
xStep: (pCtx, n)=>{ xStep: (pCtx, n)=>{
const ac = sjac(pCtx, 8); const ac = sjac(pCtx, 8);
wasm.setMemValue(ac, wasm.getMemValue(ac,'i64') + BigInt(n), 'i64'); wasm.poke(ac, wasm.peek(ac,'i64') + BigInt(n), 'i64');
}, },
xFinal: (pCtx)=>{ xFinal: (pCtx)=>{
const ac = sjac(pCtx, 0); const ac = sjac(pCtx, 0);
return ac ? wasm.getMemValue(ac,'i64') : 0n; return ac ? wasm.peek(ac,'i64') : 0n;
} }
}); });
let v = db.selectValue([ let v = db.selectValue([
@ -1545,11 +1545,11 @@ self.sqlite3InitModule = sqlite3InitModule;
const sjac = (cx,n=4)=>capi.sqlite3_js_aggregate_context(cx,n); const sjac = (cx,n=4)=>capi.sqlite3_js_aggregate_context(cx,n);
const xValueFinal = (pCtx)=>{ const xValueFinal = (pCtx)=>{
const ac = sjac(pCtx, 0); const ac = sjac(pCtx, 0);
return ac ? wasm.getMemValue(ac,'i32') : 0; return ac ? wasm.peek(ac,'i32') : 0;
}; };
const xStepInverse = (pCtx, n)=>{ const xStepInverse = (pCtx, n)=>{
const ac = sjac(pCtx); const ac = sjac(pCtx);
wasm.setMemValue(ac, wasm.getMemValue(ac,'i32') + Number(n), 'i32'); wasm.poke(ac, wasm.peek(ac,'i32') + Number(n), 'i32');
}; };
db.createFunction({ db.createFunction({
name: 'winsumint', name: 'winsumint',
@ -1670,32 +1670,32 @@ self.sqlite3InitModule = sqlite3InitModule;
const ptrValType = 'i32'; const ptrValType = 'i32';
try{ try{
ptrInt = w.scopedAlloc(4); ptrInt = w.scopedAlloc(4);
w.setMemValue(ptrInt,origValue, ptrValType); w.poke(ptrInt,origValue, ptrValType);
const cf = w.xGet('sqlite3_wasm_test_intptr'); const cf = w.xGet('sqlite3_wasm_test_intptr');
const oldPtrInt = ptrInt; const oldPtrInt = ptrInt;
//log('ptrInt',ptrInt); //log('ptrInt',ptrInt);
//log('getMemValue(ptrInt)',w.getMemValue(ptrInt)); //log('peek(ptrInt)',w.peek(ptrInt));
T.assert(origValue === w.getMemValue(ptrInt, ptrValType)); T.assert(origValue === w.peek(ptrInt, ptrValType));
const rc = cf(ptrInt); const rc = cf(ptrInt);
//log('cf(ptrInt)',rc); //log('cf(ptrInt)',rc);
//log('ptrInt',ptrInt); //log('ptrInt',ptrInt);
//log('getMemValue(ptrInt)',w.getMemValue(ptrInt,ptrValType)); //log('peek(ptrInt)',w.peek(ptrInt,ptrValType));
T.assert(2*origValue === rc). T.assert(2*origValue === rc).
assert(rc === w.getMemValue(ptrInt,ptrValType)). assert(rc === w.peek(ptrInt,ptrValType)).
assert(oldPtrInt === ptrInt); assert(oldPtrInt === ptrInt);
const pi64 = w.scopedAlloc(8)/*ptr to 64-bit integer*/; const pi64 = w.scopedAlloc(8)/*ptr to 64-bit integer*/;
const o64 = 0x010203040506/*>32-bit integer*/; const o64 = 0x010203040506/*>32-bit integer*/;
const ptrType64 = 'i64'; const ptrType64 = 'i64';
if(w.bigIntEnabled){ if(w.bigIntEnabled){
w.setMemValue(pi64, o64, ptrType64); w.poke(pi64, o64, ptrType64);
//log("pi64 =",pi64, "o64 = 0x",o64.toString(16), o64); //log("pi64 =",pi64, "o64 = 0x",o64.toString(16), o64);
const v64 = ()=>w.getMemValue(pi64,ptrType64) const v64 = ()=>w.peek(pi64,ptrType64)
//log("getMemValue(pi64)",v64()); //log("peek(pi64)",v64());
T.assert(v64() == o64); T.assert(v64() == o64);
//T.assert(o64 === w.getMemValue(pi64, ptrType64)); //T.assert(o64 === w.peek(pi64, ptrType64));
const cf64w = w.xGet('sqlite3_wasm_test_int64ptr'); const cf64w = w.xGet('sqlite3_wasm_test_int64ptr');
cf64w(pi64); cf64w(pi64);
//log("getMemValue(pi64)",v64()); //log("peek(pi64)",v64());
T.assert(v64() == BigInt(2 * o64)); T.assert(v64() == BigInt(2 * o64));
cf64w(pi64); cf64w(pi64);
T.assert(v64() == BigInt(4 * o64)); T.assert(v64() == BigInt(4 * o64));
@ -1707,8 +1707,8 @@ self.sqlite3InitModule = sqlite3InitModule;
const pMin = w.scopedAlloc(16); const pMin = w.scopedAlloc(16);
const pMax = pMin + 8; const pMax = pMin + 8;
const g64 = (p)=>w.getMemValue(p,ptrType64); const g64 = (p)=>w.peek(p,ptrType64);
w.setMemValue([pMin, pMax], 0, ptrType64); w.poke([pMin, pMax], 0, ptrType64);
const minMaxI64 = [ const minMaxI64 = [
w.xCall('sqlite3_wasm_test_int64_min'), w.xCall('sqlite3_wasm_test_int64_min'),
w.xCall('sqlite3_wasm_test_int64_max') w.xCall('sqlite3_wasm_test_int64_max')
@ -1720,7 +1720,7 @@ self.sqlite3InitModule = sqlite3InitModule;
T.assert(g64(pMin) === minMaxI64[0], "int64 mismatch"). T.assert(g64(pMin) === minMaxI64[0], "int64 mismatch").
assert(g64(pMax) === minMaxI64[1], "int64 mismatch"); assert(g64(pMax) === minMaxI64[1], "int64 mismatch");
//log("pMin",g64(pMin), "pMax",g64(pMax)); //log("pMin",g64(pMin), "pMax",g64(pMax));
w.setMemValue(pMin, minMaxI64[0], ptrType64); w.poke(pMin, minMaxI64[0], ptrType64);
T.assert(g64(pMin) === minMaxI64[0]). T.assert(g64(pMin) === minMaxI64[0]).
assert(minMaxI64[0] === db.selectValue("select ?",g64(pMin))). assert(minMaxI64[0] === db.selectValue("select ?",g64(pMin))).
assert(minMaxI64[1] === db.selectValue("select ?",g64(pMax))); assert(minMaxI64[1] === db.selectValue("select ?",g64(pMax)));
@ -1775,13 +1775,13 @@ self.sqlite3InitModule = sqlite3InitModule;
); );
if(0===rc){ if(0===rc){
const t = VT.xVtab.create(ppVtab); const t = VT.xVtab.create(ppVtab);
T.assert(t === VT.xVtab.get(wasm.getPtrValue(ppVtab))); T.assert(t === VT.xVtab.get(wasm.peekPtr(ppVtab)));
} }
return rc; return rc;
}catch(e){ }catch(e){
if(!(e instanceof sqlite3.WasmAllocError)){ if(!(e instanceof sqlite3.WasmAllocError)){
wasm.dealloc(wasm.getPtrValue, pzErr); wasm.dealloc(wasm.peekPtr, pzErr);
wasm.setPtrValue(pzErr, wasm.allocCString(e.message)); wasm.pokePtr(pzErr, wasm.allocCString(e.message));
} }
return VT.xError('xConnect',e); return VT.xError('xConnect',e);
} }
@ -1986,7 +1986,7 @@ self.sqlite3InitModule = sqlite3InitModule;
); );
if(0===rc){ if(0===rc){
const t = VT.xVtab.create(ppVtab); const t = VT.xVtab.create(ppVtab);
T.assert(t === VT.xVtab.get(wasm.getPtrValue(ppVtab))); T.assert(t === VT.xVtab.get(wasm.peekPtr(ppVtab)));
vtabTrace("xCreate",...arguments," ppVtab =",t.pointer); vtabTrace("xCreate",...arguments," ppVtab =",t.pointer);
} }
return rc; return rc;

View File

@ -1,5 +1,5 @@
C Micro-optimization\sin\sthe\soft-activated\sJS-to-WASM\sarguments\sconversion\sstep. C Rename\sthe\soft-used,\sverbose\ssqlite3.wasm.get/setMemValue()\sand\sget/setPtrValue()\sto\speek/poke()\sand\speek/pokePtr().\sThe\sold\snames\sare\sretained\sas\saliases\sjust\sin\scase\sany\sclient\scode\sactually\suses\sthem,\sbut\sthey\sare\snow\sdeprecated.
D 2022-12-09T08:44:22.095 D 2022-12-09T09:23:27.874
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@ -503,25 +503,25 @@ F ext/wasm/api/post-js-footer.js cd0a8ec768501d9bd45d325ab0442037fb0e33d1f3b4f08
F ext/wasm/api/post-js-header.js 47b6b281f39ad59fa6e8b658308cd98ea292c286a68407b35ff3ed9cfd281a62 F ext/wasm/api/post-js-header.js 47b6b281f39ad59fa6e8b658308cd98ea292c286a68407b35ff3ed9cfd281a62
F ext/wasm/api/pre-js.c-pp.js b88499dc303c21fc3f55f2c364a0f814f587b60a95784303881169f9e91c1d5f F ext/wasm/api/pre-js.c-pp.js b88499dc303c21fc3f55f2c364a0f814f587b60a95784303881169f9e91c1d5f
F ext/wasm/api/sqlite3-api-cleanup.js 680d5ccfff54459db136a49b2199d9f879c8405d9c99af1dda0cc5e7c29056f4 F ext/wasm/api/sqlite3-api-cleanup.js 680d5ccfff54459db136a49b2199d9f879c8405d9c99af1dda0cc5e7c29056f4
F ext/wasm/api/sqlite3-api-glue.js c1d0dac2b00a3341f1caf3f8422140b93d2f7c5196a6133d13409f678655babc F ext/wasm/api/sqlite3-api-glue.js f687f921f10a52800228445d10c7f7f4f5dab6059097e93d7749629b5fe5fe88
F ext/wasm/api/sqlite3-api-oo1.js 70747d6482c1dda91d43bacc9b807642200b3631c4be50c372cf4ea98e90976e F ext/wasm/api/sqlite3-api-oo1.js 6d10849609231ccd46fa11b1d3fbbe0f45d9fe84c66a0b054601036540844300
F ext/wasm/api/sqlite3-api-prologue.js b0e1ca687b4470f3ee409c3d5938c3be7ac0c854b1401e217f0d56ba96636346 F ext/wasm/api/sqlite3-api-prologue.js 496a4158e9904265d75715c57830d34ce528c4578b741d6f47c037d1a86fbe0d
F ext/wasm/api/sqlite3-api-worker1.js e94ba98e44afccfa482874cd9acb325883ade50ed1f9f9526beb9de1711f182f F ext/wasm/api/sqlite3-api-worker1.js e94ba98e44afccfa482874cd9acb325883ade50ed1f9f9526beb9de1711f182f
F ext/wasm/api/sqlite3-license-version-header.js a661182fc93fc2cf212dfd0b987f8e138a3ac98f850b1112e29b5fbdaecc87c3 F ext/wasm/api/sqlite3-license-version-header.js a661182fc93fc2cf212dfd0b987f8e138a3ac98f850b1112e29b5fbdaecc87c3
F ext/wasm/api/sqlite3-opfs-async-proxy.js 7795b84b66a7a8dedc791340709b310bb497c3c72a80bef364fa2a58e2ddae3f F ext/wasm/api/sqlite3-opfs-async-proxy.js 7795b84b66a7a8dedc791340709b310bb497c3c72a80bef364fa2a58e2ddae3f
F ext/wasm/api/sqlite3-v-helper.js 181117ad4c604500599dc07f07314a75f111dd06aab756e77ac8db64dff59d1d F ext/wasm/api/sqlite3-v-helper.js 64bb3559446eb441ce87afe942f6f924ee135a9f069a82705ffefdcd55fc6481
F ext/wasm/api/sqlite3-vfs-opfs.c-pp.js 78133d710bee4c48a1a30262b44a284bc017a3751caa7967bdc030f5d0178daa F ext/wasm/api/sqlite3-vfs-opfs.c-pp.js 66daf6fb6843bea615fe193109e1542efbeca24f560ee9da63375a910bb48115
F ext/wasm/api/sqlite3-wasi.h 25356084cfe0d40458a902afb465df8c21fc4152c1d0a59b563a3fba59a068f9 F ext/wasm/api/sqlite3-wasi.h 25356084cfe0d40458a902afb465df8c21fc4152c1d0a59b563a3fba59a068f9
F ext/wasm/api/sqlite3-wasm.c ecf7af7259c7db4b467b7a3fec2faaa766777f370f201f5e6533593911d4acde F ext/wasm/api/sqlite3-wasm.c ecf7af7259c7db4b467b7a3fec2faaa766777f370f201f5e6533593911d4acde
F ext/wasm/api/sqlite3-worker1-promiser.js 0c7a9826dbf82a5ed4e4f7bf7816e825a52aff253afbf3350431f5773faf0e4b F ext/wasm/api/sqlite3-worker1-promiser.js 0c7a9826dbf82a5ed4e4f7bf7816e825a52aff253afbf3350431f5773faf0e4b
F ext/wasm/api/sqlite3-worker1.js 1e54ea3d540161bcfb2100368a2fc0cad871a207b8336afee1c445715851ec54 F ext/wasm/api/sqlite3-worker1.js 1e54ea3d540161bcfb2100368a2fc0cad871a207b8336afee1c445715851ec54
F ext/wasm/batch-runner.html 4deeed44fe41496dc6898d9fb17938ea3291f40f4bfb977e29d0cef96fbbe4c8 F ext/wasm/batch-runner.html 4deeed44fe41496dc6898d9fb17938ea3291f40f4bfb977e29d0cef96fbbe4c8
F ext/wasm/batch-runner.js 49609e89aaac9989d6c1ad3fae268e4878e1ad7bc5fd3e5c2f44959660780b2e F ext/wasm/batch-runner.js 0dad6a02ad796f1003d3b7048947d275c4d6277f63767b8e685c27df8fdac93e
F ext/wasm/c-pp.c 92285f7bce67ed7b7020b40fde8ed0982c442b63dc33df9dfd4b658d4a6c0779 F ext/wasm/c-pp.c 92285f7bce67ed7b7020b40fde8ed0982c442b63dc33df9dfd4b658d4a6c0779
F ext/wasm/common/SqliteTestUtil.js d8bf97ecb0705a2299765c8fc9e11b1a5ac7f10988bbf375a6558b7ca287067b F ext/wasm/common/SqliteTestUtil.js d8bf97ecb0705a2299765c8fc9e11b1a5ac7f10988bbf375a6558b7ca287067b
F ext/wasm/common/emscripten.css 11bd104b6c0d597c67d40cc8ecc0a60dae2b965151e3b6a37fa5708bac3acd15 F ext/wasm/common/emscripten.css 11bd104b6c0d597c67d40cc8ecc0a60dae2b965151e3b6a37fa5708bac3acd15
F ext/wasm/common/testing.css 0ff15602a3ab2bad8aef2c3bd120c7ee3fd1c2054ad2ace7e214187ae68d926f F ext/wasm/common/testing.css 0ff15602a3ab2bad8aef2c3bd120c7ee3fd1c2054ad2ace7e214187ae68d926f
F ext/wasm/common/whwasmutil.js 96085c3fb17e019ac8e92a1310d6c976acdbc3dc1caec056ae7288d60df0f1b6 F ext/wasm/common/whwasmutil.js ab8da0ba4133f44694f5c26687d954af09ba9e2cfa536596f641cd5ac147aebc
F ext/wasm/demo-123-worker.html a0b58d9caef098a626a1a1db567076fca4245e8d60ba94557ede8684350a81ed F ext/wasm/demo-123-worker.html a0b58d9caef098a626a1a1db567076fca4245e8d60ba94557ede8684350a81ed
F ext/wasm/demo-123.html 8c70a412ce386bd3796534257935eb1e3ea5c581e5d5aea0490b8232e570a508 F ext/wasm/demo-123.html 8c70a412ce386bd3796534257935eb1e3ea5c581e5d5aea0490b8232e570a508
F ext/wasm/demo-123.js ebae30756585bca655b4ab2553ec9236a87c23ad24fc8652115dcedb06d28df6 F ext/wasm/demo-123.js ebae30756585bca655b4ab2553ec9236a87c23ad24fc8652115dcedb06d28df6
@ -555,7 +555,7 @@ F ext/wasm/test-opfs-vfs.html 1f2d672f3f3fce810dfd48a8d56914aba22e45c6834e262555
F ext/wasm/test-opfs-vfs.js 44363db07b2a20e73b0eb1808de4400ca71b703af718d0fa6d962f15e73bf2ac F ext/wasm/test-opfs-vfs.js 44363db07b2a20e73b0eb1808de4400ca71b703af718d0fa6d962f15e73bf2ac
F ext/wasm/tester1-worker.html d43f3c131d88f10d00aff3e328fed13c858d674ea2ff1ff90225506137f85aa9 F ext/wasm/tester1-worker.html d43f3c131d88f10d00aff3e328fed13c858d674ea2ff1ff90225506137f85aa9
F ext/wasm/tester1.c-pp.html d34bef3d48e5cbc1c7c06882ad240fec49bf88f5f65696cc2c72c416933aa406 F ext/wasm/tester1.c-pp.html d34bef3d48e5cbc1c7c06882ad240fec49bf88f5f65696cc2c72c416933aa406
F ext/wasm/tester1.c-pp.js 323f83c0aee8ae44bfacfc2d7e77cf2f3f1f2b3475ae63bb90772d882741f4e2 F ext/wasm/tester1.c-pp.js c5555f271bf10db2cda8550549178ec7b9a6f77236592f0a9c3132c46c4ca5cf
F ext/wasm/tests/opfs/concurrency/index.html 86d8ac435074d1e7007b91105f4897f368c165e8cecb6a9aa3d81f5cf5dcbe70 F ext/wasm/tests/opfs/concurrency/index.html 86d8ac435074d1e7007b91105f4897f368c165e8cecb6a9aa3d81f5cf5dcbe70
F ext/wasm/tests/opfs/concurrency/test.js a98016113eaf71e81ddbf71655aa29b0fed9a8b79a3cdd3620d1658eb1cc9a5d F ext/wasm/tests/opfs/concurrency/test.js a98016113eaf71e81ddbf71655aa29b0fed9a8b79a3cdd3620d1658eb1cc9a5d
F ext/wasm/tests/opfs/concurrency/worker.js 0a8c1a3e6ebb38aabbee24f122693f1fb29d599948915c76906681bb7da1d3d2 F ext/wasm/tests/opfs/concurrency/worker.js 0a8c1a3e6ebb38aabbee24f122693f1fb29d599948915c76906681bb7da1d3d2
@ -2067,8 +2067,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
P f07141b7500c36169c2c96e045acf37ec97a0d75c0a5f4d0ebed4dc1d2094ccf P ee47e9b83ca668b37dc1d8e519048a635693cf33d9967a2d81ff0824b7eea4ba
R bbdb4e606f2496a8e678d46149d27e66 R 51ad3b31f5be17cf2dd5876e95922a5a
U stephan U stephan
Z a13be2222b1eb37b716fa4d706c4fcde Z 8e66df1e6b7cf683557d1817b0c14d69
# Remove this line to create a well-formed Fossil manifest. # Remove this line to create a well-formed Fossil manifest.

View File

@ -1 +1 @@
ee47e9b83ca668b37dc1d8e519048a635693cf33d9967a2d81ff0824b7eea4ba ad0a8139b0b025f8e9d2eca0c303557ef10fdfab8c8b65afb08c510a804073d5