mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-01 06:27:03 +03:00
Add sqlite3.wasm.irSizeof() and extend certain allocation functions to make use of it.
FossilOrigin-Name: 1cbc7b1875e8611b9db7a747b4c9499501450deaf90c929d212511837d6f72b6
This commit is contained in:
@ -1020,12 +1020,20 @@ self.sqlite3ApiBootstrap = function sqlite3ApiBootstrap(
|
||||
to the memory. On error, returns throws a WasmAllocError. The
|
||||
memory must eventually be released using restore().
|
||||
|
||||
If n is a string, it must be a WASM "IR" value in the set
|
||||
accepted by wasm.irSizeof(), which is mapped to the size of
|
||||
that data type. If passed a string not in that set, it throws a
|
||||
WasmAllocError.
|
||||
|
||||
This method always adjusts the given value to be a multiple
|
||||
of 8 bytes because failing to do so can lead to incorrect
|
||||
results when reading and writing 64-bit values from/to the WASM
|
||||
heap. Similarly, the returned address is always 8-byte aligned.
|
||||
*/
|
||||
alloc: (n)=>{
|
||||
alloc: function(n){
|
||||
if('string'===typeof n && !(n = wasm.irSizeof(n))){
|
||||
WasmAllocError.toss("Invalid value for pstack.alloc(",arguments[0],")");
|
||||
}
|
||||
return wasm.exports.sqlite3_wasm_pstack_alloc(n)
|
||||
|| WasmAllocError.toss("Could not allocate",n,
|
||||
"bytes from the pstack.");
|
||||
@ -1035,6 +1043,8 @@ self.sqlite3ApiBootstrap = function sqlite3ApiBootstrap(
|
||||
returns the addresses as an array of n element, each holding
|
||||
the address of one chunk.
|
||||
|
||||
sz may optionally be an IR string accepted by wasm.irSizeof().
|
||||
|
||||
Throws a WasmAllocError if allocation fails.
|
||||
|
||||
Example:
|
||||
@ -1043,7 +1053,10 @@ self.sqlite3ApiBootstrap = function sqlite3ApiBootstrap(
|
||||
const [p1, p2, p3] = wasm.pstack.allocChunks(3,4);
|
||||
```
|
||||
*/
|
||||
allocChunks: (n,sz)=>{
|
||||
allocChunks: function(n,sz){
|
||||
if('string'===typeof sz && !(sz = wasm.irSizeof(sz))){
|
||||
WasmAllocError.toss("Invalid size value for allocChunks(",arguments[1],")");
|
||||
}
|
||||
const mem = wasm.pstack.alloc(n * sz);
|
||||
const rc = [];
|
||||
let i = 0, offset = 0;
|
||||
|
@ -246,6 +246,25 @@ self.WhWasmUtilInstaller = function(target){
|
||||
cache.utf8Decoder = new TextDecoder();
|
||||
cache.utf8Encoder = new TextEncoder('utf-8');
|
||||
|
||||
/**
|
||||
For the given IR-like string in the set ('i8', 'i16', 'i32',
|
||||
'f32', 'float', 'i64', 'f64', 'double', '*'), or any string value
|
||||
ending in '*', returns the sizeof for that value
|
||||
(target.ptrSizeof in the latter case). For any other value, it
|
||||
returns the undefined value.
|
||||
*/
|
||||
target.irSizeof = (n)=>{
|
||||
switch(n){
|
||||
case 'i8': return 1;
|
||||
case 'i16': return 2;
|
||||
case 'i32': case 'f32': case 'float': return 4;
|
||||
case 'i64': case 'f64': case 'double': return 8;
|
||||
case '*': return ptrSizeof;
|
||||
default:
|
||||
return (''+n).endsWith('*') ? ptrSizeof : undefined;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
If (cache.heapSize !== cache.memory.buffer.byteLength), i.e. if
|
||||
the heap has grown since the last call, updates cache.HEAPxyz.
|
||||
|
Reference in New Issue
Block a user