Skip to content

Commit 7e8abe1

Browse files
sallmannsaghul
authored andcommitted
JS_DumpMemoryUsage will crash if u use promise
- fixes bellard/quickjs#65 - added regression test
1 parent 272c4d7 commit 7e8abe1

File tree

2 files changed

+35
-2
lines changed

2 files changed

+35
-2
lines changed

api-test.c

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -474,6 +474,38 @@ static void promise_hook(void)
474474
JS_FreeRuntime(rt);
475475
}
476476

477+
static void dump_memory_usage(void)
478+
{
479+
JSMemoryUsage stats;
480+
481+
JSRuntime *rt = NULL;
482+
JSContext *ctx = NULL;
483+
484+
rt = JS_NewRuntime();
485+
ctx = JS_NewContext(rt);
486+
487+
//JS_SetDumpFlags(rt, JS_DUMP_PROMISE);
488+
489+
static const char code[] =
490+
"globalThis.count = 0;"
491+
"globalThis.actual = undefined;" // set by promise_hook_cb
492+
"globalThis.expected = new Promise(resolve => resolve());"
493+
"expected.then(_ => count++)";
494+
495+
JSValue evalVal = JS_Eval(ctx, code, strlen(code), "<input>", 0);
496+
JS_FreeValue(ctx, evalVal);
497+
498+
FILE *temp = tmpfile();
499+
assert(temp != NULL);
500+
JS_ComputeMemoryUsage(rt, &stats);
501+
JS_DumpMemoryUsage(temp, &stats, rt);
502+
// JS_DumpMemoryUsage(stdout, &stats, rt);
503+
fclose(temp);
504+
505+
JS_FreeContext(ctx);
506+
JS_FreeRuntime(rt);
507+
}
508+
477509
int main(void)
478510
{
479511
sync_call();
@@ -485,5 +517,6 @@ int main(void)
485517
two_byte_string();
486518
weak_map_gc_check();
487519
promise_hook();
520+
dump_memory_usage();
488521
return 0;
489522
}

quickjs.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6479,10 +6479,10 @@ void JS_DumpMemoryUsage(FILE *fp, const JSMemoryUsage *s, JSRuntime *rt)
64796479
if (obj_classes[0])
64806480
fprintf(fp, " %5d %2.0d %s\n", obj_classes[0], 0, "none");
64816481
for (class_id = 1; class_id < JS_CLASS_INIT_COUNT; class_id++) {
6482-
if (obj_classes[class_id] && class_id < countof(js_std_class_def)) {
6482+
if (obj_classes[class_id] && class_id < rt->class_count) {
64836483
char buf[ATOM_GET_STR_BUF_SIZE];
64846484
fprintf(fp, " %5d %2.0d %s\n", obj_classes[class_id], class_id,
6485-
JS_AtomGetStrRT(rt, buf, sizeof(buf), js_std_class_def[class_id - 1].class_name));
6485+
JS_AtomGetStrRT(rt, buf, sizeof(buf), rt->class_array[class_id].class_name));
64866486
}
64876487
}
64886488
if (obj_classes[JS_CLASS_INIT_COUNT])

0 commit comments

Comments
 (0)