emscripten-core/emscripten#2374
Just download and run compile.sh
$ node unoptimized.js # Works (returns nothing)
$ node optimized.js # Assertion error
emscripten-core/emscripten#2374
Just download and run compile.sh
$ node unoptimized.js # Works (returns nothing)
$ node optimized.js # Assertion error
| EMSCRIPTEN=/path/to/emscripten/ | |
| OPTIONS=-s RESERVED_FUNCTION_POINTERS=2 -s EXPORTED_FUNCTIONS="['_sqlite3_open', '_sqlite3_close', '_sqlite3_exec', '_sqlite3_free', '_sqlite3_data_count', '_sqlite3_column_type', '_sqlite3_column_text', '_sqlite3_column_double', '_sqlite3_prepare_v2', '_sqlite3_step', '_sqlite3_bind_text', '_sqlite3_bind_double', '_sqlite3_reset', '_sqlite3_finalize']" | |
| wget -O sqlite3.c https://raw.githubusercontent.com/lovasoa/sql.js/master/c/sqlite3.c | |
| wget -O post.js https://gist.githubusercontent.com/lovasoa/3d44eaa8b2f74433f6a3/raw/66ec8d477a049fb5ab9b255455ea014bc2dfff54/post.js | |
| $EMSCRIPTEN/emcc $OPTIONS -O0 -g sqlite3.c --post-js post.js -o unoptimized.js | |
| $EMSCRIPTEN/emcc $OPTIONS -O1 -g sqlite3.c --post-js post.js -o optimized.js |
| // Optimized | |
| function _sqlite3_bind_double($pStmt,$i,$rValue) { | |
| $pStmt = $pStmt|0; | |
| $i = $i|0; | |
| $rValue = +$rValue; | |
| var $0 = 0, $1 = 0, $2 = 0, $3 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0, $8 = 0, label = 0, sp = 0; | |
| sp = STACKTOP; | |
| $0 = (_vdbeUnbind($pStmt,$i)|0); | |
| $1 = ($0|0)==(0); | |
| if (!($1)) { | |
| STACKTOP = sp;return ($0|0); | |
| } | |
| $2 = (($i) + -1)|0; | |
| $3 = (($pStmt) + 60|0); | |
| $4 = HEAP32[$3>>2]|0; | |
| $5 = (($4) + (($2*40)|0)|0); | |
| _sqlite3VdbeMemSetDouble($5,$rValue); | |
| $6 = HEAP32[$pStmt>>2]|0; | |
| $7 = (($6) + 12|0); | |
| $8 = HEAP32[$7>>2]|0; | |
| _sqlite3_mutex_leave($8); | |
| STACKTOP = sp;return ($0|0); | |
| } | |
| // Unoptimized | |
| function _sqlite3_bind_double($pStmt,$i,$rValue) { | |
| $pStmt = $pStmt|0; | |
| $i = $i|0; | |
| $rValue = +$rValue; | |
| var $0 = 0, $1 = 0, $10 = 0, $11 = 0, $12 = 0, $13 = 0, $14 = 0, $15 = 0.0, $16 = 0, $17 = 0, $18 = 0, $19 = 0, $2 = 0.0, $20 = 0, $3 = 0, $4 = 0, $5 = 0, $6 = 0, $7 = 0, $8 = 0; | |
| var $9 = 0, $p = 0, $rc = 0, label = 0, sp = 0; | |
| sp = STACKTOP; | |
| STACKTOP = STACKTOP + 32|0; | |
| $0 = $pStmt; | |
| $1 = $i; | |
| $2 = $rValue; | |
| $3 = $0; //@line 66466 "c/sqlite3.c" | |
| $p = $3; //@line 66466 "c/sqlite3.c" | |
| $4 = $p; //@line 66467 "c/sqlite3.c" | |
| $5 = $1; //@line 66467 "c/sqlite3.c" | |
| $6 = (_vdbeUnbind($4,$5)|0); //@line 66467 "c/sqlite3.c" | |
| $rc = $6; //@line 66467 "c/sqlite3.c" | |
| $7 = $rc; //@line 66468 "c/sqlite3.c" | |
| $8 = ($7|0)==(0); //@line 66468 "c/sqlite3.c" | |
| if (!($8)) { | |
| $20 = $rc; //@line 66472 "c/sqlite3.c" | |
| STACKTOP = sp;return ($20|0); //@line 66472 "c/sqlite3.c" | |
| } | |
| $9 = $1; //@line 66469 "c/sqlite3.c" | |
| $10 = (($9) - 1)|0; //@line 66469 "c/sqlite3.c" | |
| $11 = $p; //@line 66469 "c/sqlite3.c" | |
| $12 = (($11) + 60|0); //@line 66469 "c/sqlite3.c" | |
| $13 = HEAP32[$12>>2]|0; //@line 66469 "c/sqlite3.c" | |
| $14 = (($13) + (($10*40)|0)|0); //@line 66469 "c/sqlite3.c" | |
| $15 = $2; //@line 66469 "c/sqlite3.c" | |
| _sqlite3VdbeMemSetDouble($14,$15); //@line 66469 "c/sqlite3.c" | |
| $16 = $p; //@line 66470 "c/sqlite3.c" | |
| $17 = HEAP32[$16>>2]|0; //@line 66470 "c/sqlite3.c" | |
| $18 = (($17) + 12|0); //@line 66470 "c/sqlite3.c" | |
| $19 = HEAP32[$18>>2]|0; //@line 66470 "c/sqlite3.c" | |
| _sqlite3_mutex_leave($19); //@line 66470 "c/sqlite3.c" | |
| $20 = $rc; //@line 66472 "c/sqlite3.c" | |
| STACKTOP = sp;return ($20|0); //@line 66472 "c/sqlite3.c" | |
| } |
| var assert = require('assert'); | |
| var sqlite3_open = Module['cwrap'] ( 'sqlite3_open', 'number', ['string', 'number'] ); | |
| var sqlite3_exec = Module['cwrap'] ( 'sqlite3_exec', 'number', ['number', 'string', 'number', 'number', 'number'] ); | |
| var sqlite3_prepare_v2 = Module['cwrap'] ( 'sqlite3_prepare_v2', 'number', ['number', 'string', 'number', 'number', 'number'] ); | |
| var sqlite3_bind_text = Module['cwrap'] ( 'sqlite3_bind_text', 'number', ['number', 'number', 'string', 'number', 'number'] ); | |
| var sqlite3_bind_double = Module['cwrap'] ( 'sqlite3_bind_double', 'number', ['number', 'number', 'number'] ); | |
| var sqlite3_step = Module['cwrap'] ('sqlite3_step', 'number', ['number']); | |
| var apiTemp = Runtime.stackAlloc(4); | |
| sqlite3_open(':memory:', apiTemp); | |
| var db = getValue(apiTemp, 'i32'); | |
| var sql = "CREATE TABLE test (a text NOT NULL, b real);"; | |
| var res = sqlite3_exec(db, sql, 0,0,0); | |
| assert.equal(res, 0); | |
| sql = "INSERT INTO test VALUES (?,?)"; | |
| sqlite3_prepare_v2 (db, sql, -1, apiTemp, 0); | |
| var stmt = getValue(apiTemp, 'i32'); | |
| sqlite3_bind_text(stmt, 1, "hello", 5, 0); | |
| sqlite3_bind_double(stmt, 2, 6.66); // BUG: This erases the first value, that was bound to "hello" | |
| var res = sqlite3_step(stmt); | |
| var SQLITE_DONE = 101; | |
| assert.equal(res, SQLITE_DONE); | |
| var callback = Runtime.addFunction(function (notUsed, argc, argv, colNames) { | |
| assert.equal('hello', Pointer_stringify(getValue(argv, 'i32'))); | |
| assert.equal('6.66', Pointer_stringify(getValue(argv+4, 'i32'))); | |
| return 0; | |
| }); | |
| sql = "SELECT * FROM test;"; | |
| sqlite3_exec(db, sql, callback, 0, 0); |