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

Internal JS cleanups. Correct part of [ac136925a645] to account for the eTextRep flag being able to hold flags other than the encoding.

FossilOrigin-Name: 1dfc03ab1e0269807beef27bf884ab9ead7553d4a5f6ed213f812d7fa052045f
This commit is contained in:
stephan
2022-12-23 21:10:49 +00:00
parent 3705f38ab0
commit ab9c2d571e
7 changed files with 90 additions and 81 deletions

View File

@ -53,7 +53,7 @@ self.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
["sqlite3_bind_parameter_index","int", "sqlite3_stmt*", "string"], ["sqlite3_bind_parameter_index","int", "sqlite3_stmt*", "string"],
["sqlite3_bind_pointer", "int", ["sqlite3_bind_pointer", "int",
"sqlite3_stmt*", "int", "*", "string:static", "*"], "sqlite3_stmt*", "int", "*", "string:static", "*"],
["sqlite3_bind_text","int", "sqlite3_stmt*", "int", "string", "int", "int" ["sqlite3_bind_text","int", "sqlite3_stmt*", "int", "string", "int", "*"
/* We should arguably create a hand-written binding of /* We should arguably create a hand-written binding of
bind_text() which does more flexible text conversion, along bind_text() which does more flexible text conversion, along
the lines of sqlite3_prepare_v3(). The slightly problematic the lines of sqlite3_prepare_v3(). The slightly problematic
@ -292,9 +292,9 @@ self.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
{/* Convert Arrays and certain TypedArrays to strings for {/* Convert Arrays and certain TypedArrays to strings for
'string:flexible'-type arguments */ 'string:flexible'-type arguments */
const xString = wasm.xWrap.argAdapter('string'); const __xString = wasm.xWrap.argAdapter('string');
wasm.xWrap.argAdapter( wasm.xWrap.argAdapter(
'string:flexible', (v)=>xString(util.flexibleString(v)) 'string:flexible', (v)=>__xString(util.flexibleString(v))
); );
/** /**
@ -324,12 +324,12 @@ self.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
if(wasm.isPtr(v)) return v; if(wasm.isPtr(v)) return v;
v = ''+v; v = ''+v;
let rc = this[v]; let rc = this[v];
return rc || (rc = this[v] = wasm.allocCString(v)); return rc || (this[v] = wasm.allocCString(v));
}.bind(Object.create(null)) }.bind(Object.create(null))
); );
}/* special-case string-type argument conversions */ }/* special-case string-type argument conversions */
if(1){// WhWasmUtil.xWrap() bindings... if(1){// wasm.xWrap() bindings...
/** /**
Add some descriptive xWrap() aliases for '*' intended to (A) Add some descriptive xWrap() aliases for '*' intended to (A)
initially improve readability/correctness of capi.signatures initially improve readability/correctness of capi.signatures
@ -369,19 +369,22 @@ self.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
VFS in many contexts. We specifically do not want that VFS in many contexts. We specifically do not want that
behavior here. */ behavior here. */
return capi.sqlite3_vfs_find(v) return capi.sqlite3_vfs_find(v)
|| sqlite3.SQLite3Error.toss("Unknown sqlite3_vfs name:",v); || sqlite3.SQLite3Error.toss(
capi.SQLITE_NOTFOUND,
"Unknown sqlite3_vfs name:", v
);
} }
return aPtr((v instanceof (capi.sqlite3_vfs || nilType)) return aPtr((v instanceof (capi.sqlite3_vfs || nilType))
? v.pointer : v); ? v.pointer : v);
}); });
const rPtr = wasm.xWrap.resultAdapter('*'); const __xRcPtr = wasm.xWrap.resultAdapter('*');
wasm.xWrap.resultAdapter('sqlite3*', rPtr) wasm.xWrap.resultAdapter('sqlite3*', __xRcPtr)
('sqlite3_context*', rPtr) ('sqlite3_context*', __xRcPtr)
('sqlite3_stmt*', rPtr) ('sqlite3_stmt*', __xRcPtr)
('sqlite3_value*', rPtr) ('sqlite3_value*', __xRcPtr)
('sqlite3_vfs*', rPtr) ('sqlite3_vfs*', __xRcPtr)
('void*', rPtr); ('void*', __xRcPtr);
/** /**
Populate api object with sqlite3_...() by binding the "raw" wasm Populate api object with sqlite3_...() by binding the "raw" wasm
@ -395,10 +398,12 @@ self.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
} }
/* For C API functions which cannot work properly unless /* For C API functions which cannot work properly unless
wasm.bigIntEnabled is true, install a bogus impl which wasm.bigIntEnabled is true, install a bogus impl which throws
throws if called when bigIntEnabled is false. */ if called when bigIntEnabled is false. The alternative would be
to elide these functions altogether, which seems likely to
cause more confusion. */
const fI64Disabled = function(fname){ const fI64Disabled = function(fname){
return ()=>toss(fname+"() disabled due to lack", return ()=>toss(fname+"() is unavailable due to lack",
"of BigInt support in this build."); "of BigInt support in this build.");
}; };
for(const e of wasm.bindingSignatures.int64){ for(const e of wasm.bindingSignatures.int64){
@ -421,7 +426,7 @@ self.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
- (sqlite3*, int code, string msg) - (sqlite3*, int code, string msg)
- (sqlite3*, Error e [,string msg = ''+e]) - (sqlite3*, Error e [,string msg = ''+e])
If passed a WasmAllocError, the message is ingored and the If passed a WasmAllocError, the message is ignored and the
result code is SQLITE_NOMEM. If passed any other Error type, result code is SQLITE_NOMEM. If passed any other Error type,
the result code defaults to SQLITE_ERROR unless the Error the result code defaults to SQLITE_ERROR unless the Error
object has a resultCode property, in which case that is used object has a resultCode property, in which case that is used
@ -469,8 +474,7 @@ self.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
); );
}; };
if(1){/* Bindings for sqlite3_create_collation() */ if(1){/* Bindings for sqlite3_create_collation[_v2]() */
const __collationContextKey = (argIndex,argv)=>{ const __collationContextKey = (argIndex,argv)=>{
return 'argv['+argIndex+']:sqlite3@'+argv[0]+ return 'argv['+argIndex+']:sqlite3@'+argv[0]+
':'+wasm.cstrToJs(argv[1]).toLowerCase() ':'+wasm.cstrToJs(argv[1]).toLowerCase()
@ -497,15 +501,22 @@ self.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
/** /**
Works exactly like C's sqlite3_create_collation_v2() except that: Works exactly like C's sqlite3_create_collation_v2() except that:
1) It accepts JS functions for its function-pointer arguments, 1) It returns capi.SQLITE_FORMAT if the 3rd argument contains
any encoding-related value other than capi.SQLITE_UTF8. No
other encodings are supported. As a special case, if the
bottom 4 bits of that argument are 0, SQLITE_UTF8 is
assumed.
2) It accepts JS functions for its function-pointer arguments,
for which it will install WASM-bound proxies. The bindings for which it will install WASM-bound proxies. The bindings
are "permanent," in that they will stay in the WASM environment are "permanent," in that they will stay in the WASM environment
until it shuts down unless the client somehow finds and removes until it shuts down unless the client calls this again with the
them. same collation name and a value of 0 or null for the
the function pointer(s).
2) It returns capi.SQLITE_FORMAT if the 3rd argument is not For consistency with the C API, it requires the same number of
capi.SQLITE_UTF8. No other encodings are supported. To simplify arguments. It returns capi.SQLITE_MISUSE if passed any other
usage, any falsy value of eTextRep is treated as SQLITE_UTF8. argument count.
Returns 0 on success, non-0 on error, in which case the error Returns 0 on success, non-0 on error, in which case the error
state of pDb (of type `sqlite3*` or argument-convertible to it) state of pDb (of type `sqlite3*` or argument-convertible to it)
@ -513,9 +524,9 @@ self.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
*/ */
capi.sqlite3_create_collation_v2 = function(pDb,zName,eTextRep,pArg,xCompare,xDestroy){ capi.sqlite3_create_collation_v2 = function(pDb,zName,eTextRep,pArg,xCompare,xDestroy){
if(6!==arguments.length) return __dbArgcMismatch(pDb, 'sqlite3_create_collation_v2', 6); if(6!==arguments.length) return __dbArgcMismatch(pDb, 'sqlite3_create_collation_v2', 6);
else if(!eTextRep){ else if( 0 === (eTextRep & 0xf) ){
eTextRep = capi.SQLITE_UTF8; eTextRep |= capi.SQLITE_UTF8;
}else if(capi.SQLITE_UTF8!==eTextRep){ }else if( capi.SQLITE_UTF8 !== (eTextRep & 0xf) ){
return __errEncoding(pDb); return __errEncoding(pDb);
} }
let rc, pfCompare, pfDestroy; let rc, pfCompare, pfDestroy;
@ -584,13 +595,15 @@ self.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
if(1){/* Special-case handling of sqlite3_create_function_v2() if(1){/* Special-case handling of sqlite3_create_function_v2()
and sqlite3_create_window_function() */ and sqlite3_create_window_function() */
/* Maintenance reminder: FuncPtrAdapter is not expressive enough
to be able to perform these mappings. */
const sqlite3CreateFunction = wasm.xWrap( const sqlite3CreateFunction = wasm.xWrap(
"sqlite3_create_function_v2", "int", "sqlite3_create_function_v2", "int",
["sqlite3*", "string"/*funcName*/, "int"/*nArg*/, ["sqlite3*", "string"/*funcName*/, "int"/*nArg*/,
"int"/*eTextRep*/, "*"/*pApp*/, "int"/*eTextRep*/, "*"/*pApp*/,
"*"/*xStep*/,"*"/*xFinal*/, "*"/*xValue*/, "*"/*xDestroy*/] "*"/*xStep*/,"*"/*xFinal*/, "*"/*xValue*/, "*"/*xDestroy*/]
); );
// TODO: reimplement these using FuncPtrAdapter.
const sqlite3CreateWindowFunction = wasm.xWrap( const sqlite3CreateWindowFunction = wasm.xWrap(
"sqlite3_create_window_function", "int", "sqlite3_create_window_function", "int",
["sqlite3*", "string"/*funcName*/, "int"/*nArg*/, ["sqlite3*", "string"/*funcName*/, "int"/*nArg*/,
@ -643,13 +656,13 @@ self.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
xDestroy: {sig:'v(p)', f:__xDestroy} xDestroy: {sig:'v(p)', f:__xDestroy}
}); });
const __xWrapFuncs = function(theFuncs, tgtUninst){ /* Internal helper for sqlite3_create_function() and friends. */
const __xWrapFuncs = function(theKeys, theFuncs, tgtUninst){
const rc = [] const rc = []
let k; for(const k of theKeys){
for(k in theFuncs){
let fArg = theFuncs[k]; let fArg = theFuncs[k];
if('function'===typeof fArg){ if('function'===typeof fArg){
const w = __xMap[k]; const w = __xMap[k] || toss3("Internal error in __xWrapFuncs: invalid key:",k);
fArg = wasm.installFunction(w.sig, w.f(fArg)); fArg = wasm.installFunction(w.sig, w.f(fArg));
tgtUninst.push(fArg); tgtUninst.push(fArg);
} }
@ -666,18 +679,19 @@ self.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
xFinal, //void (*xFinal)(sqlite3_context*) xFinal, //void (*xFinal)(sqlite3_context*)
xDestroy //void (*xDestroy)(void*) xDestroy //void (*xDestroy)(void*)
){ ){
if(f.length!==arguments.length){ if( f.length!==arguments.length ){
return __dbArgcMismatch(pDb,"sqlite3_create_function_v2",f.length); return __dbArgcMismatch(pDb,"sqlite3_create_function_v2",f.length);
}else if(!eTextRep){ }else if( 0 === (eTextRep & 0xf) ){
eTextRep = capi.SQLITE_UTF8; eTextRep |= capi.SQLITE_UTF8;
}else if(capi.SQLITE_UTF8!==eTextRep){ }else if( capi.SQLITE_UTF8 !== (eTextRep & 0xf) ){
return __errEncoding(pDb); return __errEncoding(pDb);
} }
/* Wrap the callbacks in a WASM-bound functions... */ /* Wrap the callbacks in a WASM-bound functions... */
const uninstall = [/*funcs to uninstall on error*/]; const uninstall = [/*funcs to uninstall on error*/];
let rc; let rc;
try{ try{
const funcArgs = __xWrapFuncs({xFunc, xStep, xFinal, xDestroy}, const funcArgs = __xWrapFuncs(['xFunc','xStep','xFinal','xDestroy'],
{xFunc, xStep, xFinal, xDestroy},
uninstall); uninstall);
rc = sqlite3CreateFunction(pDb, funcName, nArg, eTextRep, rc = sqlite3CreateFunction(pDb, funcName, nArg, eTextRep,
pApp, ...funcArgs); pApp, ...funcArgs);
@ -711,18 +725,19 @@ self.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
xInverse,//void (*xStep)(sqlite3_context*,int,sqlite3_value**) xInverse,//void (*xStep)(sqlite3_context*,int,sqlite3_value**)
xDestroy //void (*xDestroy)(void*) xDestroy //void (*xDestroy)(void*)
){ ){
if(f.length!==arguments.length){ if( f.length!==arguments.length ){
return __dbArgcMismatch(pDb,"sqlite3_create_window_function",f.length); return __dbArgcMismatch(pDb,"sqlite3_create_window_function",f.length);
}else if(!eTextRep){ }else if( 0 === (eTextRep & 0xf) ){
eTextRep = capi.SQLITE_UTF8; eTextRep |= capi.SQLITE_UTF8;
}else if(capi.SQLITE_UTF8!==eTextRep){ }else if( capi.SQLITE_UTF8 !== (eTextRep & 0xf) ){
return __errEncoding(pDb); return __errEncoding(pDb);
} }
/* Wrap the callbacks in a WASM-bound functions... */ /* Wrap the callbacks in a WASM-bound functions... */
const uninstall = [/*funcs to uninstall on error*/]; const uninstall = [/*funcs to uninstall on error*/];
let rc; let rc;
try{ try{
const funcArgs = __xWrapFuncs({xStep, xFinal, xValue, xInverse, xDestroy}, const funcArgs = __xWrapFuncs(['xStep','xFinal','xValue','xInverse','xDestroy'],
{xStep, xFinal, xValue, xInverse, xDestroy},
uninstall); uninstall);
rc = sqlite3CreateWindowFunction(pDb, funcName, nArg, eTextRep, rc = sqlite3CreateWindowFunction(pDb, funcName, nArg, eTextRep,
pApp, ...funcArgs); pApp, ...funcArgs);

View File

@ -1277,29 +1277,14 @@ self.sqlite3ApiBootstrap.initializers.push(function(sqlite3){
so we have no range checking. */ so we have no range checking. */
f._ = { f._ = {
string: function(stmt, ndx, val, asBlob){ string: function(stmt, ndx, val, asBlob){
if(1){
/* _Hypothetically_ more efficient than the impl in the 'else' block. */
const stack = wasm.scopedAllocPush(); const stack = wasm.scopedAllocPush();
try{ try{
const n = wasm.jstrlen(val); const [pStr, n] = wasm.scopedAllocCString(val, true);
const pStr = wasm.scopedAlloc(n);
wasm.jstrcpy(val, wasm.heap8u(), pStr, n, false);
const f = asBlob ? capi.sqlite3_bind_blob : capi.sqlite3_bind_text; const f = asBlob ? capi.sqlite3_bind_blob : capi.sqlite3_bind_text;
return f(stmt.pointer, ndx, pStr, n, capi.SQLITE_TRANSIENT); return f(stmt.pointer, ndx, pStr, n, capi.SQLITE_TRANSIENT);
}finally{ }finally{
wasm.scopedAllocPop(stack); wasm.scopedAllocPop(stack);
} }
}else{
const bytes = wasm.jstrToUintArray(val,false);
const pStr = wasm.alloc(bytes.length || 1);
wasm.heap8u().set(bytes.length ? bytes : [0], pStr);
try{
const f = asBlob ? capi.sqlite3_bind_blob : capi.sqlite3_bind_text;
return f(stmt.pointer, ndx, pStr, bytes.length, capi.SQLITE_TRANSIENT);
}finally{
wasm.dealloc(pStr);
}
}
} }
}; };
}/* static init */ }/* static init */

View File

@ -425,7 +425,9 @@ self.sqlite3ApiBootstrap = function sqlite3ApiBootstrap(
any encoding other than sqlite3.SQLITE_UTF8. The JS API does not any encoding other than sqlite3.SQLITE_UTF8. The JS API does not
currently support any other encoding and likely never currently support any other encoding and likely never
will. This function does not replace that argument on its own will. This function does not replace that argument on its own
because it may contain other flags. because it may contain other flags. As a special case, if
the bottom 4 bits of that argument are 0, SQLITE_UTF8 is
assumed.
2) Any of the four final arguments may be either WASM pointers 2) Any of the four final arguments may be either WASM pointers
(assumed to be function pointers) or JS Functions. In the (assumed to be function pointers) or JS Functions. In the
@ -433,6 +435,10 @@ self.sqlite3ApiBootstrap = function sqlite3ApiBootstrap(
sqlite3.capi.wasm.installFunction() and that wrapper is passed sqlite3.capi.wasm.installFunction() and that wrapper is passed
on to the native implementation. on to the native implementation.
For consistency with the C API, it requires the same number of
arguments. It returns capi.SQLITE_MISUSE if passed any other
argument count.
The semantics of JS functions are: The semantics of JS functions are:
xFunc: is passed `(pCtx, ...values)`. Its return value becomes xFunc: is passed `(pCtx, ...values)`. Its return value becomes

View File

@ -2026,9 +2026,12 @@ self.WhWasmUtilInstaller = function(target){
It throws if no adapter is found. It throws if no adapter is found.
ACHTUNG: the adapter may require that a scopedAllocPush() is ACHTUNG: the adapter may require that a scopedAllocPush() is
active and it may allocate memory within that scope. active and it may allocate memory within that scope. It may also
require additional arguments, depending on the type of
conversion.
*/ */
target.xWrap.testConvertArg = cache.xWrap.convertArg; target.xWrap.testConvertArg = cache.xWrap.convertArg;
/** /**
This function is ONLY exposed in the public API to facilitate This function is ONLY exposed in the public API to facilitate
testing. It should not be used in application-level code, only testing. It should not be used in application-level code, only

View File

@ -2557,7 +2557,7 @@ self.sqlite3InitModule = sqlite3InitModule;
capi.sqlite3_js_vfs_create_file( capi.sqlite3_js_vfs_create_file(
"no-such-vfs", filename, ba "no-such-vfs", filename, ba
); );
}, "Unknown sqlite3_vfs name: no-such-vfs"); }, "SQLITE_NOTFOUND: Unknown sqlite3_vfs name: no-such-vfs");
}finally{ }finally{
if(sh) await sh.close(); if(sh) await sh.close();
unlink(); unlink();

View File

@ -1,5 +1,5 @@
C Consolidate/unify\show\sthe\sJS\sbindings\sof\sthe\screate_function/collation\sfamily\sof\sfunctions\sreact\sto\sa\snon-UTF8\sencoding:\sthey\snow\streat\sa\sfalsy\svalue\sas\sSQLITE_UTF8\sand\sfail\swith\sSQLITE_FORMAT\sfor\san\sinvalid\sencoding. C Internal\sJS\scleanups.\sCorrect\spart\sof\s[ac136925a645]\sto\saccount\sfor\sthe\seTextRep\sflag\sbeing\sable\sto\shold\sflags\sother\sthan\sthe\sencoding.
D 2022-12-23T19:16:45.370 D 2022-12-23T21:10:49.493
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,9 +503,9 @@ 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 72e63574caaf94aca36b40fa18bd76a267dd43ac6e7b5bd7293bc33ecb52230d F ext/wasm/api/sqlite3-api-glue.js f50211dc11f1debf972cdaea87cb4df9772022828072e7100cf5025d1dca2a78
F ext/wasm/api/sqlite3-api-oo1.js c0c4ccc269cccee657ffd03f094da7e270e1367b7928926b3730d543555a12a6 F ext/wasm/api/sqlite3-api-oo1.js 4cce9671e8a31ac9b76bd8559e7827ccc2b121734e460fa9c7d243735a771ec8
F ext/wasm/api/sqlite3-api-prologue.js 1767dfcd94bb4fa9dd4bd9ff6327117783d3656faf1058dcc1369db320d871fc F ext/wasm/api/sqlite3-api-prologue.js 789639d256e3134563c5c9be25ade28b40e06e783885d26cccc01cd1ed4b820d
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
@ -521,7 +521,7 @@ F ext/wasm/c-pp.c 92285f7bce67ed7b7020b40fde8ed0982c442b63dc33df9dfd4b658d4a6c07
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 ff43d28d04e60068ecb3e9a2550581f36be5867ad5ffc00d8479580a12cf9b0f F ext/wasm/common/whwasmutil.js 97807770ec452fdcaa48509c5decd3a2c1e3001164a62a3223a347f66967533e
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 f09266873e1a34d9bdb6d3981ec8c9e382f31f215c9fd2f9016d2394b8ae9b7b F ext/wasm/test-opfs-vfs.js f09266873e1a34d9bdb6d3981ec8c9e382f31f215c9fd2f9016d2394b8ae9b7b
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 10db3bd0415d3b39a75db3bfdef2dbabcad8d1168148708bc7f1718b6f36cefd F ext/wasm/tester1.c-pp.js 50b51af2b5466de0cba8ebc97b86bc886c32f937d8f4b36d3b3936ef9748e534
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 ac136925a6453d3e53c7a380911dfeac5706d49f936294289f6ea0b74e26e18a P deffe6fb211410fa1a1fbca824a52b4e09b54d4b4f4a4e12d71c9e4b7e8606fb
R 9d755119137074f847904c767813a68a R 537077e8e7a576993086a957d5c52d05
U stephan U stephan
Z b32b2adc949da16fb78be22c10d5b0a1 Z 379d99233453fc912eb71dcbaf16b8ce
# Remove this line to create a well-formed Fossil manifest. # Remove this line to create a well-formed Fossil manifest.

View File

@ -1 +1 @@
deffe6fb211410fa1a1fbca824a52b4e09b54d4b4f4a4e12d71c9e4b7e8606fb 1dfc03ab1e0269807beef27bf884ab9ead7553d4a5f6ed213f812d7fa052045f