diff --git a/quickjs.c b/quickjs.c index 7d800092..401c48a5 100644 --- a/quickjs.c +++ b/quickjs.c @@ -26774,6 +26774,11 @@ static JSValue js_build_module_ns(JSContext *ctx, JSModuleDef *m) case EXPORTED_NAME_NORMAL: { JSVarRef *var_ref = en->u.var_ref; + if (!var_ref) { + js_resolve_export_throw_error(ctx, JS_RESOLVE_RES_CIRCULAR, + m, en->export_name); + goto fail; + } pr = add_property(ctx, p, en->export_name, JS_PROP_ENUMERABLE | JS_PROP_WRITABLE | JS_PROP_VARREF); diff --git a/tests.conf b/tests.conf index 30ee794d..0a3808eb 100644 --- a/tests.conf +++ b/tests.conf @@ -4,5 +4,6 @@ verbose=yes testdir=tests [exclude] +tests/fixture_cyclic_import.js tests/microbench.js tests/test_worker_module.js diff --git a/tests/fixture_cyclic_import.js b/tests/fixture_cyclic_import.js new file mode 100644 index 00000000..bac80d8b --- /dev/null +++ b/tests/fixture_cyclic_import.js @@ -0,0 +1,2 @@ +import * as a from "./test_cyclic_import.js" +export function f(x) { return 2 * a.g(x) } diff --git a/tests/test_cyclic_import.js b/tests/test_cyclic_import.js new file mode 100644 index 00000000..bf51d9b1 --- /dev/null +++ b/tests/test_cyclic_import.js @@ -0,0 +1,12 @@ +/*--- +negative: + phase: resolution + type: SyntaxError +---*/ +// FIXME(bnoordhuis) shouldn't throw SyntaxError but that's still better +// than segfaulting, see https://github.com/quickjs-ng/quickjs/issues/567 +import {assert} from "./assert.js" +import {f} from "./fixture_cyclic_import.js" +export {f} +export function g(x) { return x + 1 } +assert(f(1), 4)