Skip to content
Closed

Draft #1510

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
107 commits
Select commit Hold shift + click to select a range
9f204dd
qjsc: find module based on path instead of script name
mochaaP Oct 11, 2025
4627478
qjsc: mark all functions as static
mochaaP Oct 11, 2025
5398b54
Update quickjs.c
G-Yong Dec 12, 2025
c1f2e00
Add operation changed handler and emit source locations
G-Yong Dec 12, 2025
9ed51a9
格式对其
G-Yong Dec 13, 2025
c0141e7
Fix comment formatting in quickjs.c
G-Yong Dec 13, 2025
acd4535
Fix comment formatting in quickjs.h
G-Yong Dec 13, 2025
39b5ce8
add `emit_source_loc(s) ` for `for` and `if`
G-Yong Dec 14, 2025
442ab63
remove `emit_source_loc` from `case` `default`; add it for `break`
G-Yong Dec 14, 2025
22d98ce
remove file's UTF8-BOM
G-Yong Dec 14, 2025
e449357
增加try catch finally 语句的位置跟踪语句
G-Yong Dec 15, 2025
942e9dd
Fix number literal parsing error handling (#1)
G-Yong Jan 27, 2026
2fd8274
Merge remote-tracking branch 'upstream/master'
G-Yong Jan 27, 2026
b644d17
Add debug API for stack frames and local variables
G-Yong Jan 31, 2026
564675e
Merge remote-tracking branch 'upstream/master'
G-Yong Jan 31, 2026
9948ffc
Merge branch 'quickjs-ng:master' into master
G-Yong Feb 2, 2026
c185571
fix TailCall's line and column number error.
G-Yong Feb 4, 2026
a009be9
Merge branch 'quickjs-ng:master' into master
G-Yong Feb 10, 2026
eb8981e
Merge branch 'quickjs-ng:master' into master
G-Yong Feb 12, 2026
7123f80
Add libonly option to meson
rkd77 Feb 9, 2026
96412a2
Missing lines
rkd77 Feb 12, 2026
b2531c8
Merge branch 'quickjs-ng:master' into master
G-Yong Feb 24, 2026
2227626
解决函数return语句后假如跟着while会导致得到错误的return行号的问题
G-Yong Mar 3, 2026
5faa3aa
Merge remote-tracking branch 'upstream/master'
G-Yong Mar 3, 2026
afc287f
Merge branch 'quickjs-ng:master' into master
G-Yong Mar 26, 2026
76aec02
Added a compile-time macro QJS_ENABLE_DEBUGGER to gate all the debug…
G-Yong Mar 28, 2026
fc71cbd
Merge remote-tracking branch 'upstream/master'
G-Yong Mar 28, 2026
6d4c96b
Refactor bytecode trace API and debug guards
G-Yong Mar 30, 2026
e1fc1be
Merge branch 'quickjs-ng:master' into master
G-Yong Mar 30, 2026
d98951d
Restore unexpected changes
G-Yong Mar 30, 2026
59e0422
Merge branch 'master' of https://github.com/G-Yong/quickjs
G-Yong Mar 30, 2026
9894306
Remove unnecessary macro definitions
G-Yong Mar 30, 2026
1e05bd7
Add per-context debugger with OP_debug
G-Yong Apr 1, 2026
abdf36c
Merge branch 'quickjs-ng:master' into master
G-Yong Apr 1, 2026
793ced2
Move DEF(debug) to end of opcode list to preserve opcode numbering (#2)
Copilot Apr 1, 2026
765fbf3
Use JS_AtomGetStr for debug break
G-Yong Apr 1, 2026
71b7ddf
Remove some modifications that are unnecessary under the current arch…
G-Yong Apr 1, 2026
6190ff1
Restore the things that were accidentally deleted earlier.
G-Yong Apr 1, 2026
9985cf7
Remove commented-out debug_break code
G-Yong Apr 1, 2026
219046a
Use unlikely() for debug_break check
G-Yong Apr 2, 2026
7e0a42d
Add JS_SetDebugBreakHandler and emit OP_debug
G-Yong Apr 2, 2026
4d34848
fix: do not update last_opcode_pos when emitting OP_debug (#3)
G-Yong Apr 2, 2026
16bb4d7
Rename debug break API to trace and bump BC
G-Yong Apr 2, 2026
87c3115
Merge branch 'quickjs-ng:master' into master
G-Yong Apr 2, 2026
c5a673a
Update api-test.c
G-Yong Apr 2, 2026
5d32778
Regenerate pre-compiled bytecode files (make codegen) to fix version …
Copilot Apr 3, 2026
b23207e
Merge branch 'quickjs-ng:master' into master
G-Yong Apr 3, 2026
1110f2c
Update quickjs-opcode.h
G-Yong Apr 3, 2026
ef48f55
Merge branch 'master' into master
G-Yong Apr 13, 2026
ba4bc03
fix: add missing closing brace for debug_trace() in api-test.c (#5)
Copilot Apr 13, 2026
f3904a4
fix: emit correct source location for return statement with ASI
G-Yong Apr 13, 2026
0a19469
chore: regenerate pre-compiled bytecode files (make codegen) (#6)
Copilot Apr 13, 2026
cade8c9
Add QJS_ENABLE_DEBUGGER build option
G-Yong Apr 15, 2026
bac8c1c
Regenerate pre-compiled bytecode files for BC_VERSION=25 (#7)
Copilot Apr 15, 2026
c581c50
Merge branch 'quickjs-ng:master' into master
G-Yong Apr 15, 2026
c94347a
Guard return parsing with QJS_ENABLE_DEBUGGER
G-Yong Apr 15, 2026
cce8fbc
Regenerate bytecode files via make codegen (#8)
Copilot Apr 15, 2026
f528674
Wrap emit_source_loc with QJS_ENABLE_DEBUGGER
G-Yong Apr 15, 2026
6c7c3c3
make codegen
G-Yong Apr 15, 2026
664577d
fix: regenerate hello_module.c with LF line endings
G-Yong Apr 15, 2026
503964b
emit_source_loc_debug
G-Yong Apr 15, 2026
c2a52b6
fix: guard debug_trace test with QJS_ENABLE_DEBUGGER (#9)
Copilot Apr 15, 2026
d8b5b3f
refactored the implementation to make the debugger a runtime option i…
G-Yong Apr 16, 2026
d25e013
remove unnecessary modification
G-Yong Apr 16, 2026
199785d
Merge remote-tracking branch 'upstream/master'
G-Yong Apr 23, 2026
1011587
Address review feedback on PR #1421
G-Yong Apr 25, 2026
d54dff2
Fix two CI failures: FreeBSD pkg update and Windows format-truncation…
Copilot Apr 25, 2026
b5dc4c1
restore
G-Yong Apr 25, 2026
3505191
quickjs-libc: add TextEncoder and TextDecoder
hhugo May 2, 2026
d1e7882
quickjs-libc: stringify TextEncoder.encodeInto source before validati…
hhugo May 7, 2026
b4b6c87
quickjs-libc: distinguish partial vs invalid trailing UTF-8 in TextDe…
hhugo May 7, 2026
cd3f535
quickjs-libc: replace lone surrogates with U+FFFD in TextEncoder
hhugo May 7, 2026
58df657
quickjs-libc: add tests for TextEncoder/TextDecoder
hhugo May 7, 2026
c994cfb
Merge branch 'quickjs-ng:master' into master
G-Yong May 9, 2026
daf2ddc
Add opaque parameter to JS_SetDebugTraceHandler (like JS_SetInterrupt…
G-Yong May 9, 2026
6bec763
Fix find_var_htab to skip entries with scope_level != 0
jiang1997 May 10, 2026
bf52efb
Add test for find_var_htab scope_level regression
jiang1997 May 16, 2026
4ccd2ea
fix(cutils): handle vsnprintf encoding error in dbuf_printf
claude May 17, 2026
e26bcf6
fix(libc): avoid undefined memcpy in js_worker_postMessage with len==0
claude May 17, 2026
61042f2
fix(libc): correct privilege drop order and sentinel in js_os_exec
claude May 17, 2026
9ec7760
fix(string): reject oversized len in JS_NewStringUTF16
claude May 17, 2026
6e194c8
Merge branch 'quickjs-ng:master' into master
G-Yong May 18, 2026
a1a66ba
add emit_source_loc_debug for using and await using declarations
G-Yong May 19, 2026
1b2fa96
Merge branch 'quickjs-ng:master' into master
G-Yong May 19, 2026
1a1cbea
debug: address reviewer notes from PR #1421
G-Yong May 19, 2026
550df06
resolve conflits with upstream
G-Yong May 20, 2026
0391f09
resolve conflicts with upstream
G-Yong May 20, 2026
0cf7ec3
Merge branch 'master' of https://github.com/G-Yong/quickjs
G-Yong May 20, 2026
aecb149
Fix column reporting for invalid number literals
uxxca1 May 20, 2026
b81a855
Merge pull request #1 from rkd77/master
qr243vbi May 20, 2026
0c197da
Merge pull request #2 from mcha-forks/mochaa-qjsc-resolve
qr243vbi May 20, 2026
e4cade6
Merge pull request #3 from G-Yong/master
qr243vbi May 20, 2026
2822871
Merge pull request #4 from hhugo/feat/text-encoder-decoder
qr243vbi May 20, 2026
3c40017
Merge pull request #5 from jiang1997/fix/find-var-htab-scope-level
qr243vbi May 20, 2026
6f82f3e
Merge pull request #6 from nordstjernen-web/claude/sec-dbuf-vsnprintf…
qr243vbi May 20, 2026
108f873
Merge pull request #7 from nordstjernen-web/claude/sec-worker-null-me…
qr243vbi May 20, 2026
0d2e41f
Merge pull request #8 from nordstjernen-web/claude/sec-newstring-utf1…
qr243vbi May 20, 2026
d964bf4
Merge pull request #9 from nordstjernen-web/claude/sec-os-exec-privdrop
qr243vbi May 20, 2026
c7bca46
Merge pull request #10 from uxxca1/master
qr243vbi May 20, 2026
e141702
Update release.yml
qr243vbi May 20, 2026
882f3da
apple, you're fired
qr243vbi May 20, 2026
48aaf6e
Update ci.yml
qr243vbi May 20, 2026
306b286
Drop watch os and tv os
qr243vbi May 20, 2026
05df9cc
Update quickjs-libc.c
qr243vbi May 20, 2026
8c6d293
Update js_text_decoder_finalizer
qr243vbi May 20, 2026
3fc076e
Update docs.yml
qr243vbi May 20, 2026
4613836
Resolve issues
qr243vbi May 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 0 additions & 73 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -60,12 +60,6 @@ jobs:
- { os: ubuntu-latest, configType: tcc }
- { os: ubuntu-latest, arch: x86, runTest262: true }
- { os: ubuntu-latest, arch: riscv64 }

- { os: macos-14, configType: Debug }
- { os: macos-14, configType: Release }
- { os: macos-14, configType: examples }
- { os: macos-14, configType: shared }
- { os: macos-14, configType: asan+ubsan, runTest262: true }
steps:
- uses: actions/checkout@v6
with:
Expand Down Expand Up @@ -556,18 +550,6 @@ jobs:
"$ANDROID_HOME/cmake/3.22.1/bin/cmake" --build build --target qjs
ls -lh build

ios:
runs-on: macos-latest
steps:
- uses: actions/checkout@v6
- name: configure
run: |
cmake -B build -GXcode -DQJS_BUILD_WERROR=ON -DCMAKE_SYSTEM_NAME:STRING=iOS -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED:BOOL=NO -DQJS_BUILD_LIBC=ON
- name: build
run: |
cmake --build build --config Release --target qjs
ls -lh build

mimalloc-linux:
runs-on: ubuntu-24.04
env:
Expand All @@ -588,33 +570,12 @@ jobs:
run: |
make test

mimalloc-macos:
runs-on: macos-latest
env:
QJS_BUILD_CLI_WITH_STATIC_MIMALLOC: ON
MIMALLOC_SHOW_STATS: 1
steps:
- uses: actions/checkout@v6
- name: install dependencies
run: |
brew install mimalloc
- name: build
run: |
make
- name: cxxtest
run: |
make cxxtest
- name: test
run: |
make test

amalgam:
strategy:
matrix:
# TODO(bnoordhuis) test on windows
config:
- { os: ubuntu-latest }
- { os: macos-latest }
runs-on: ${{ matrix.config.os }}
steps:
- uses: actions/checkout@v6
Expand Down Expand Up @@ -727,16 +688,12 @@ jobs:
platform:
- ubuntu-latest
- windows-latest
- macos-latest

exclude:
# clang-cl only makes sense on windows.
- platform: ubuntu-latest
mode:
name: clang-cl+sanitize
- platform: macos-latest
mode:
name: clang-cl+sanitize

# Use clang-cl instead of MSYS2 clang.
#
Expand All @@ -756,52 +713,22 @@ jobs:
- platform: ubuntu-latest
mode:
name: sanitize+asanonly
- platform: macos-latest
mode:
name: sanitize+asanonly
- platform: windows-latest
mode:
name: sanitize

# clang is the default on macos
# also gcc is an alias to clang
- platform: macos-latest
mode:
name: clang
- platform: macos-latest
mode:
name: gcc

# gcc is the default on linux
- platform: ubuntu-latest
mode:
name: gcc

# only run sanitizer tests on linux
#
# gcc/clang's codegen shouldn't massively change across platforms,
# and linux supports most of the sanitizers.
- platform: macos-latest
mode:
name: clang+sanitize
- platform: macos-latest
mode:
# macos does not support msan
name: clang+msan
- platform: macos-latest
mode:
name: sanitize

steps:
- name: Setup meson
run: |
pipx install meson ninja
- name: Install mimalloc
if: ${{ matrix.platform == 'ubuntu-latest' && matrix.features.name == 'mimalloc' }}
run: sudo apt update && sudo apt -y install libmimalloc-dev
- name: Install mimalloc
if: ${{ matrix.platform == 'macos-latest' && matrix.features.name == 'mimalloc' }}
run: brew install mimalloc
# TODO: Install mimalloc on Windows
# You need to:
# - checkout mimalloc
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/docs.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
name: Docs

on:
workflow_dispatch:
push:
branches:
- master
Expand Down
31 changes: 1 addition & 30 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,35 +52,6 @@ jobs:
with:
name: qjs-linux-${{matrix.arch}}
path: build/*-linux-${{matrix.arch}}

macos:
runs-on: macos-latest
steps:
- uses: actions/checkout@v6
- name: build
run: |
mkdir build
cd build
cmake -DCMAKE_OSX_ARCHITECTURES="x86_64;arm64" -DQJS_BUILD_WERROR=ON ..
make -j$(getconf _NPROCESSORS_ONLN)
make -C .. amalgam # writes build/quickjs-amalgam.zip
mv qjs qjs-darwin
mv qjsc qjsc-darwin
- name: check
run: |
lipo -info build/qjs-darwin build/qjsc-darwin
- name: upload amalgamation
uses: actions/upload-artifact@v7
with:
name: quickjs-amalgam.zip
path: build/quickjs-amalgam.zip
compression-level: 0 # already compressed
- name: upload
uses: actions/upload-artifact@v7
with:
name: qjs-darwin
path: build/*-darwin

windows:
runs-on: windows-latest
strategy:
Expand Down Expand Up @@ -145,7 +116,7 @@ jobs:
build/qjs-wasi-reactor.wasm

upload-to-release:
needs: [linux, macos, windows, wasi, check_meson_version]
needs: [linux, windows, wasi, check_meson_version]
runs-on: ubuntu-22.04
steps:
- name: get assets
Expand Down
12 changes: 0 additions & 12 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -160,12 +160,6 @@ if(WIN32)
endif()
endif()

# MacOS and GCC 11 or later need -Wno-maybe-uninitialized
# https://github.com/quickjs-ng/quickjs/issues/453
if(APPLE AND CMAKE_C_COMPILER_ID STREQUAL "GNU" AND CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 11)
xcheck_add_c_compiler_flag(-Wno-maybe-uninitialized)
endif()

if(CMAKE_SYSTEM_NAME STREQUAL "WASI")
add_compile_definitions(
_WASI_EMULATED_PROCESS_CLOCKS
Expand Down Expand Up @@ -508,18 +502,12 @@ if(QJS_BUILD_EXAMPLES)
PREFIX ""
)
target_link_libraries(fib PRIVATE qjs_module_lib)
if(APPLE)
target_link_options(fib PRIVATE -undefined dynamic_lookup)
endif()

add_library(point MODULE examples/point.c)
set_target_properties(point PROPERTIES
PREFIX ""
)
target_link_libraries(point PRIVATE qjs_module_lib)
if(APPLE)
target_link_options(point PRIVATE -undefined dynamic_lookup)
endif()

add_executable(test_fib
gen/test_fib.c
Expand Down
126 changes: 126 additions & 0 deletions api-test.c
Original file line number Diff line number Diff line change
Expand Up @@ -1013,6 +1013,131 @@ static void get_uint8array(void)
JS_FreeRuntime(rt);
}

static struct {
int call_count;
int last_line;
int last_col;
char last_filename[256];
char last_funcname[256];
int stack_depth;
int max_local_count;
int abort_at; /* abort (return -1) on this call, 0 = never */
} trace_state;

static int debug_trace_cb(JSContext *ctx,
const char *filename,
const char *funcname,
int line,
int col,
void *opaque)
{
trace_state.call_count++;
trace_state.last_line = line;
trace_state.last_col = col;
snprintf(trace_state.last_filename, sizeof(trace_state.last_filename),
"%s", filename);
snprintf(trace_state.last_funcname, sizeof(trace_state.last_funcname),
"%s", funcname);
trace_state.stack_depth = JS_GetStackDepth(ctx);
int count = 0;
JSDebugLocalVar *vars = NULL;
assert(JS_GetLocalVariablesAtLevel(ctx, 0, &vars, &count) == 0);
if (count > trace_state.max_local_count)
trace_state.max_local_count = count;
if (vars)
JS_FreeLocalVariables(ctx, vars, count);
if (trace_state.abort_at > 0 &&
trace_state.call_count >= trace_state.abort_at)
return -1;
return 0;
}

static void debug_trace(void)
{
JSRuntime *rt = JS_NewRuntime();
JSContext *ctx = JS_NewContext(rt);

memset(&trace_state, 0, sizeof(trace_state));
{
JSValue ret = eval(ctx, "1+2");
assert(!JS_IsException(ret));
JS_FreeValue(ctx, ret);
assert(trace_state.call_count == 0);
}

JS_SetDebugTraceHandler(ctx, debug_trace_cb, NULL);
memset(&trace_state, 0, sizeof(trace_state));
{
JSValue ret = eval(ctx, "var x = 1; x + 2");
assert(!JS_IsException(ret));
JS_FreeValue(ctx, ret);
assert(trace_state.call_count > 0);
assert(!strcmp(trace_state.last_filename, "<input>"));
}

{
JSDebugLocalVar *vars = NULL;
int count = -1;
assert(JS_GetLocalVariablesAtLevel(ctx, 0, &vars, &count) == 0);
assert(vars == NULL);
assert(count == 0);
}

memset(&trace_state, 0, sizeof(trace_state));
{
static const char code[] =
"function outer() {\n"
" function inner() {\n"
" return 42;\n"
" }\n"
" return inner();\n"
"}\n"
"outer();\n";
JSValue ret = eval(ctx, code);
assert(!JS_IsException(ret));
JS_FreeValue(ctx, ret);
assert(trace_state.call_count > 0);
assert(trace_state.stack_depth >= 1);
}

memset(&trace_state, 0, sizeof(trace_state));
{
static const char code[] =
"function f(a, b) {\n"
" var c = a + b;\n"
" return c;\n"
"}\n"
"f(10, 20);\n";
JSValue ret = eval(ctx, code);
assert(!JS_IsException(ret));
JS_FreeValue(ctx, ret);
assert(trace_state.call_count > 0);
assert(trace_state.max_local_count >= 2);
}

memset(&trace_state, 0, sizeof(trace_state));
trace_state.abort_at = 1;
{
JSValue ret = eval(ctx, "1+2; 3+4");
assert(JS_IsException(ret));
JS_FreeValue(ctx, ret);
JSValue exc = JS_GetException(ctx);
JS_FreeValue(ctx, exc);
}

JS_SetDebugTraceHandler(ctx, NULL, NULL);
memset(&trace_state, 0, sizeof(trace_state));
{
JSValue ret = eval(ctx, "1+2");
assert(!JS_IsException(ret));
JS_FreeValue(ctx, ret);
assert(trace_state.call_count == 0);
}

JS_FreeContext(ctx);
JS_FreeRuntime(rt);
}

static void new_symbol(void)
{
JSRuntime *rt = new_runtime();
Expand Down Expand Up @@ -1089,6 +1214,7 @@ int main(void)
slice_string_tocstring();
immutable_array_buffer();
get_uint8array();
debug_trace();
new_symbol();
return 0;
}
Loading
Loading