Skip to content

Commit f562def

Browse files
authored
BigInt (-DCONFIG_BIGNUM) support (justjake#104)
* enable CONFIG_BIGNUM * recompile for bignum * bigint basics * vm.dump for bigint * fix bigint call * update changelog * dump
1 parent 8b4675a commit f562def

12 files changed

+99
-21
lines changed

CHANGELOG.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,21 @@
11
# Changelog
22

3+
## v0.22.0 (unreleased)
4+
5+
- [#104](https://github.com/justjake/quickjs-emscripten/pull/104) BigInt support.
6+
7+
- [#100](https://github.com/justjake/quickjs-emscripten/pull/100) **Breaking change** upgrade Emscripten version and switch to `async import(...)` for loading variants.
8+
9+
We also drop support for older browsers and Node versions:
10+
11+
- Node >= 16 is required
12+
- Safari >= 14.1 is required
13+
- Typescript >= 4.7 is recommended, but not required.
14+
15+
## v0.21.2
16+
17+
- [#94](https://github.com/justjake/quickjs-emscripten/pull/94) (thanks to @swimmadude66) allows QuickJS to create many more functions before overflowing.
18+
319
## v0.21.1
420

521
- [#66](https://github.com/justjake/quickjs-emscripten/pull/66) (thanks to @BickelLukas) fixes `ReferenceError` when running in browser due to `global.process`

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ BUILD_TS=ts/generated
4646
# QuickJS
4747
QUICKJS_OBJS=quickjs.o libregexp.o libunicode.o cutils.o quickjs-libc.o libbf.o
4848
QUICKJS_CONFIG_VERSION=$(shell cat $(QUICKJS_ROOT)/VERSION)
49-
QUICKJS_DEFINES:=-D_GNU_SOURCE -DCONFIG_VERSION=\"$(QUICKJS_CONFIG_VERSION)\" -DCONFIG_STACK_CHECK
49+
QUICKJS_DEFINES:=-D_GNU_SOURCE -DCONFIG_VERSION=\"$(QUICKJS_CONFIG_VERSION)\" -DCONFIG_STACK_CHECK -DCONFIG_BIGNUM
5050
VARIANT_QUICKJS_OBJS=$(patsubst %.o, $(BUILD_QUICKJS)/%.$(VARIANT).o, $(QUICKJS_OBJS))
5151

5252
# quickjs-emscripten

c/interface.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -480,7 +480,7 @@ OwnedHeapChar *QTS_Typeof(JSContext *ctx, JSValueConst *value) {
480480

481481
if (JS_IsNumber(*value)) {
482482
result = "number";
483-
} else if (tag == JS_TAG_BIG_INT) {
483+
} else if (JS_IsBigInt(ctx, *value)) {
484484
result = "bigint";
485485
} else if (JS_IsBigFloat(*value)) {
486486
result = "bigfloat";

ts/context.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,8 @@ export class QuickJSContext implements LowLevelJavascriptVm<QuickJSHandle>, Disp
163163
protected _true: QuickJSHandle | undefined = undefined
164164
/** @private */
165165
protected _global: QuickJSHandle | undefined = undefined
166+
/** @private */
167+
protected _BigInt: QuickJSHandle | undefined = undefined
166168

167169
/**
168170
* Use {@link QuickJS.createVm} to create a QuickJSContext instance.
@@ -305,6 +307,23 @@ export class QuickJSContext implements LowLevelJavascriptVm<QuickJSHandle>, Disp
305307
return this.memory.heapValueHandle(ptr)
306308
}
307309

310+
/**
311+
* Create a QuickJS [bigint](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt) value.
312+
*/
313+
newBigInt(num: bigint): QuickJSHandle {
314+
if (!this._BigInt) {
315+
const bigIntHandle = this.getProp(this.global, "BigInt")
316+
this.memory.manage(bigIntHandle)
317+
this._BigInt = new StaticLifetime(bigIntHandle.value as JSValueConstPointer, this.runtime)
318+
}
319+
320+
const bigIntHandle = this._BigInt
321+
const asString = String(num)
322+
return this.newString(asString).consume((handle) =>
323+
this.unwrapResult(this.callFunction(bigIntHandle, this.undefined, handle))
324+
)
325+
}
326+
308327
/**
309328
* `{}`.
310329
* Create a new QuickJS [object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Object_initializer).
@@ -474,6 +493,15 @@ export class QuickJSContext implements LowLevelJavascriptVm<QuickJSHandle>, Disp
474493
return this.memory.consumeJSCharPointer(this.ffi.QTS_GetString(this.ctx.value, handle.value))
475494
}
476495

496+
/**
497+
* Converts `handle` to a Javascript bigint.
498+
*/
499+
getBigInt(handle: QuickJSHandle): bigint {
500+
this.runtime.assertOwned(handle)
501+
const asString = this.getString(handle)
502+
return BigInt(asString)
503+
}
504+
477505
/**
478506
* `Promise.resolve(value)`.
479507
* Convert a handle containing a Promise-like value inside the VM into an
@@ -736,6 +764,8 @@ export class QuickJSContext implements LowLevelJavascriptVm<QuickJSHandle>, Disp
736764
return this.getString(handle)
737765
} else if (type === "number") {
738766
return this.getNumber(handle)
767+
} else if (type === "bigint") {
768+
return this.getBigInt(handle)
739769
} else if (type === "undefined") {
740770
return undefined
741771
}

ts/generated/emscripten-module.WASM_DEBUG_ASYNCIFY.js

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2092,6 +2092,16 @@ var dynCall_iiii = Module["dynCall_iiii"] = createExportWrapper("dynCall_iiii");
20922092
/** @type {function(...*):?} */
20932093
var dynCall_ii = Module["dynCall_ii"] = createExportWrapper("dynCall_ii");
20942094
/** @type {function(...*):?} */
2095+
var dynCall_jiij = Module["dynCall_jiij"] = createExportWrapper("dynCall_jiij");
2096+
/** @type {function(...*):?} */
2097+
var dynCall_iiiijj = Module["dynCall_iiiijj"] = createExportWrapper("dynCall_iiiijj");
2098+
/** @type {function(...*):?} */
2099+
var dynCall_iiiij = Module["dynCall_iiiij"] = createExportWrapper("dynCall_iiiij");
2100+
/** @type {function(...*):?} */
2101+
var dynCall_jiiiii = Module["dynCall_jiiiii"] = createExportWrapper("dynCall_jiiiii");
2102+
/** @type {function(...*):?} */
2103+
var dynCall_jij = Module["dynCall_jij"] = createExportWrapper("dynCall_jij");
2104+
/** @type {function(...*):?} */
20952105
var dynCall_jijjiii = Module["dynCall_jijjiii"] = createExportWrapper("dynCall_jijjiii");
20962106
/** @type {function(...*):?} */
20972107
var dynCall_jiii = Module["dynCall_jiii"] = createExportWrapper("dynCall_jiii");
@@ -2110,6 +2120,8 @@ var dynCall_viji = Module["dynCall_viji"] = createExportWrapper("dynCall_viji");
21102120
/** @type {function(...*):?} */
21112121
var dynCall_vij = Module["dynCall_vij"] = createExportWrapper("dynCall_vij");
21122122
/** @type {function(...*):?} */
2123+
var dynCall_iiijj = Module["dynCall_iiijj"] = createExportWrapper("dynCall_iiijj");
2124+
/** @type {function(...*):?} */
21132125
var dynCall_viii = Module["dynCall_viii"] = createExportWrapper("dynCall_viii");
21142126
/** @type {function(...*):?} */
21152127
var dynCall_iijijjji = Module["dynCall_iijijjji"] = createExportWrapper("dynCall_iijijjji");
@@ -2118,16 +2130,12 @@ var dynCall_iiiji = Module["dynCall_iiiji"] = createExportWrapper("dynCall_iiiji
21182130
/** @type {function(...*):?} */
21192131
var dynCall_iiji = Module["dynCall_iiji"] = createExportWrapper("dynCall_iiji");
21202132
/** @type {function(...*):?} */
2121-
var dynCall_iiiij = Module["dynCall_iiiij"] = createExportWrapper("dynCall_iiiij");
2122-
/** @type {function(...*):?} */
21232133
var dynCall_jijij = Module["dynCall_jijij"] = createExportWrapper("dynCall_jijij");
21242134
/** @type {function(...*):?} */
21252135
var dynCall_iijijji = Module["dynCall_iijijji"] = createExportWrapper("dynCall_iijijji");
21262136
/** @type {function(...*):?} */
21272137
var dynCall_jiiii = Module["dynCall_jiiii"] = createExportWrapper("dynCall_jiiii");
21282138
/** @type {function(...*):?} */
2129-
var dynCall_jij = Module["dynCall_jij"] = createExportWrapper("dynCall_jij");
2130-
/** @type {function(...*):?} */
21312139
var dynCall_jiji = Module["dynCall_jiji"] = createExportWrapper("dynCall_jiji");
21322140
/** @type {function(...*):?} */
21332141
var dynCall_dd = Module["dynCall_dd"] = createExportWrapper("dynCall_dd");
@@ -2136,6 +2144,8 @@ var dynCall_ddd = Module["dynCall_ddd"] = createExportWrapper("dynCall_ddd");
21362144
/** @type {function(...*):?} */
21372145
var dynCall_jii = Module["dynCall_jii"] = createExportWrapper("dynCall_jii");
21382146
/** @type {function(...*):?} */
2147+
var dynCall_iiiiii = Module["dynCall_iiiiii"] = createExportWrapper("dynCall_iiiiii");
2148+
/** @type {function(...*):?} */
21392149
var dynCall_iidiiii = Module["dynCall_iidiiii"] = createExportWrapper("dynCall_iidiiii");
21402150
/** @type {function(...*):?} */
21412151
var _asyncify_start_unwind = createExportWrapper("asyncify_start_unwind");
@@ -2145,8 +2155,8 @@ var _asyncify_stop_unwind = createExportWrapper("asyncify_stop_unwind");
21452155
var _asyncify_start_rewind = createExportWrapper("asyncify_start_rewind");
21462156
/** @type {function(...*):?} */
21472157
var _asyncify_stop_rewind = createExportWrapper("asyncify_stop_rewind");
2148-
var ___start_em_js = Module['___start_em_js'] = 82784;
2149-
var ___stop_em_js = Module['___stop_em_js'] = 83779;
2158+
var ___start_em_js = Module['___start_em_js'] = 86032;
2159+
var ___stop_em_js = Module['___stop_em_js'] = 87027;
21502160

21512161
// include: postamble.js
21522162
// === Auto-generated postamble setup entry stuff ===
Binary file not shown.

ts/generated/emscripten-module.WASM_DEBUG_ASYNCIFY.wasm.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ts/generated/emscripten-module.WASM_DEBUG_SYNC.js

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1537,8 +1537,8 @@ function dbg(text) {
15371537
// === Body ===
15381538

15391539
var ASM_CONSTS = {
1540-
5358123: () => { return withBuiltinMalloc(function () { return allocateUTF8(Module['LSAN_OPTIONS'] || 0); }); },
1541-
5358220: () => { var setting = Module['printWithColors']; if (setting != null) { return setting; } else { return ENVIRONMENT_IS_NODE && process.stderr.isTTY; } }
1540+
5361259: () => { return withBuiltinMalloc(function () { return allocateUTF8(Module['LSAN_OPTIONS'] || 0); }); },
1541+
5361356: () => { var setting = Module['printWithColors']; if (setting != null) { return setting; } else { return ENVIRONMENT_IS_NODE && process.stderr.isTTY; } }
15421542
};
15431543
function qts_host_call_function(ctx,this_ptr,argc,argv,magic_func_id) { const asyncify = undefined; return Module['callbacks']['callFunction'](asyncify, ctx, this_ptr, argc, argv, magic_func_id); }
15441544
function qts_host_interrupt_handler(rt) { const asyncify = undefined; return Module['callbacks']['shouldInterrupt'](asyncify, rt); }
@@ -4980,10 +4980,22 @@ var dynCall_jijiii = Module["dynCall_jijiii"] = createExportWrapper("dynCall_jij
49804980
/** @type {function(...*):?} */
49814981
var dynCall_jijjiii = Module["dynCall_jijjiii"] = createExportWrapper("dynCall_jijjiii");
49824982
/** @type {function(...*):?} */
4983+
var dynCall_jij = Module["dynCall_jij"] = createExportWrapper("dynCall_jij");
4984+
/** @type {function(...*):?} */
4985+
var dynCall_jiiiii = Module["dynCall_jiiiii"] = createExportWrapper("dynCall_jiiiii");
4986+
/** @type {function(...*):?} */
4987+
var dynCall_iiiij = Module["dynCall_iiiij"] = createExportWrapper("dynCall_iiiij");
4988+
/** @type {function(...*):?} */
4989+
var dynCall_iiiijj = Module["dynCall_iiiijj"] = createExportWrapper("dynCall_iiiijj");
4990+
/** @type {function(...*):?} */
4991+
var dynCall_jiij = Module["dynCall_jiij"] = createExportWrapper("dynCall_jiij");
4992+
/** @type {function(...*):?} */
49834993
var dynCall_jijii = Module["dynCall_jijii"] = createExportWrapper("dynCall_jijii");
49844994
/** @type {function(...*):?} */
49854995
var dynCall_jijiiiii = Module["dynCall_jijiiiii"] = createExportWrapper("dynCall_jijiiiii");
49864996
/** @type {function(...*):?} */
4997+
var dynCall_iiijj = Module["dynCall_iiijj"] = createExportWrapper("dynCall_iiijj");
4998+
/** @type {function(...*):?} */
49874999
var dynCall_jijj = Module["dynCall_jijj"] = createExportWrapper("dynCall_jijj");
49885000
/** @type {function(...*):?} */
49895001
var dynCall_jiii = Module["dynCall_jiii"] = createExportWrapper("dynCall_jiii");
@@ -5002,19 +5014,15 @@ var dynCall_iiiji = Module["dynCall_iiiji"] = createExportWrapper("dynCall_iiiji
50025014
/** @type {function(...*):?} */
50035015
var dynCall_iiji = Module["dynCall_iiji"] = createExportWrapper("dynCall_iiji");
50045016
/** @type {function(...*):?} */
5005-
var dynCall_iiiij = Module["dynCall_iiiij"] = createExportWrapper("dynCall_iiiij");
5006-
/** @type {function(...*):?} */
50075017
var dynCall_jijij = Module["dynCall_jijij"] = createExportWrapper("dynCall_jijij");
50085018
/** @type {function(...*):?} */
50095019
var dynCall_iijijji = Module["dynCall_iijijji"] = createExportWrapper("dynCall_iijijji");
50105020
/** @type {function(...*):?} */
50115021
var dynCall_jiiii = Module["dynCall_jiiii"] = createExportWrapper("dynCall_jiiii");
50125022
/** @type {function(...*):?} */
5013-
var dynCall_jij = Module["dynCall_jij"] = createExportWrapper("dynCall_jij");
5014-
/** @type {function(...*):?} */
50155023
var dynCall_jiji = Module["dynCall_jiji"] = createExportWrapper("dynCall_jiji");
5016-
var ___start_em_js = Module['___start_em_js'] = 5357221;
5017-
var ___stop_em_js = Module['___stop_em_js'] = 5358123;
5024+
var ___start_em_js = Module['___start_em_js'] = 5360357;
5025+
var ___stop_em_js = Module['___stop_em_js'] = 5361259;
50185026

50195027
// include: postamble.js
50205028
// === Auto-generated postamble setup entry stuff ===
Binary file not shown.

ts/generated/emscripten-module.WASM_RELEASE_ASYNCIFY.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)