From: Fabrice Bellard Date: Tue, 29 Sep 2026 10:03:16 +0000 (+0200) Subject: fixed module ambiguous export test X-Git-Url: https://git.kaiwu.me/?a=commitdiff_plain;h=1aa74292f26d650c50a76a7cd81f1bfa7a52d493;p=quickjs.git fixed module ambiguous export test --- diff --git a/quickjs.c b/quickjs.c index e30f031..51ea4e2 100644 --- a/quickjs.c +++ b/quickjs.c @@ -30382,8 +30382,16 @@ static JSResolveResultEnum js_resolve_export1(JSContext *ctx, return ret; } else if (ret == JS_RESOLVE_RES_FOUND) { if (*pme != NULL) { - if (*pmodule != res_m || - res_me->local_name != (*pme)->local_name) { + if (res_me->local_name != (*pme)->local_name) + goto ambiguous_result; + if ((*pme)->local_name == JS_ATOM__star_) { + /* namespace exports: compare target modules */ + JSModuleDef *target_m1 = (*pmodule)->req_module_entries[(*pme)->u.req_module_idx].module; + JSModuleDef *target_m2 = res_m->req_module_entries[res_me->u.req_module_idx].module; + if (target_m1 != target_m2) + goto ambiguous_result; + } else if (*pmodule != res_m) { + ambiguous_result: *pmodule = NULL; *pme = NULL; return JS_RESOLVE_RES_AMBIGUOUS; @@ -36149,11 +36157,20 @@ static __exception int compute_stack_size(JSContext *ctx, return -1; } +static int find_import_local(JSFunctionDef *fd, JSModuleDef *m, JSAtom name) +{ + int i; + for(i = 0; i < m->import_entries_count; i++) { + JSImportEntry *mi = &m->import_entries[i]; + if (fd->closure_var[mi->var_idx].var_name == name) + return i; + } + return -1; +} + static int add_global_variables(JSContext *ctx, JSFunctionDef *fd) { int i, idx; - JSModuleDef *m = fd->module; - JSExportEntry *me; JSGlobalVar *hf; BOOL need_global_closures; @@ -36199,6 +36216,32 @@ static int add_global_variables(JSContext *ctx, JSFunctionDef *fd) } if (fd->module) { + JSModuleDef *m = fd->module; + JSExportEntry *me; + + /* Convert local exports to indirect if the local name was imported */ + for(i = 0; i < m->export_entries_count; i++) { + me = &m->export_entries[i]; + if (me->export_type == JS_EXPORT_TYPE_LOCAL) { + JSImportEntry *mi; + int import_idx; + import_idx = find_import_local(fd, m, me->local_name); + if (import_idx >= 0) { + mi = &m->import_entries[import_idx]; + me->export_type = JS_EXPORT_TYPE_INDIRECT; + me->u.req_module_idx = mi->req_module_idx; + JS_FreeAtom(ctx, me->local_name); + if (mi->is_star) { + /* namespace import re-exported */ + me->local_name = JS_DupAtom(ctx, JS_ATOM__star_); + } else { + /* XXX: check */ + me->local_name = JS_DupAtom(ctx, mi->import_name); + } + } + } + } + /* resolve the variable names of the local exports */ for(i = 0; i < m->export_entries_count; i++) { me = &m->export_entries[i]; diff --git a/test262_errors.txt b/test262_errors.txt index 528740a..f4b5020 100644 --- a/test262_errors.txt +++ b/test262_errors.txt @@ -11,10 +11,6 @@ test262/test/language/expressions/compound-assignment/S11.13.2_A6.8_T1.js:24: Te test262/test/language/expressions/compound-assignment/S11.13.2_A6.9_T1.js:24: Test262Error: #1: innerX === 2. Actual: 1 test262/test/language/expressions/compound-assignment/S11.13.2_A6.10_T1.js:24: Test262Error: #1: innerX === 2. Actual: 5 test262/test/language/expressions/compound-assignment/S11.13.2_A6.11_T1.js:24: Test262Error: #1: innerX === 2. Actual: 5 -test262/test/language/module-code/ambiguous-export-bindings/import-and-export-propagates-binding.js:75: SyntaxError: export 'foo' in module 'test262/test/language/module-code/ambiguous-export-bindings/import-and-export-propagates-binding.js' is ambiguous -test262/test/language/module-code/ambiguous-export-bindings/namespace-unambiguous-if-export-star-as-from-and-import-star-as-and-export.js:74: SyntaxError: export 'foo' in module 'test262/test/language/module-code/ambiguous-export-bindings/namespace-unambiguous-if-import-star-as-and-export.js' is ambiguous -test262/test/language/module-code/ambiguous-export-bindings/namespace-unambiguous-if-export-star-as-from.js:75: SyntaxError: export 'foo' in module 'test262/test/language/module-code/ambiguous-export-bindings/namespace-unambiguous-if-export-star-as-from.js' is ambiguous -test262/test/language/module-code/ambiguous-export-bindings/namespace-unambiguous-if-import-star-as-and-export.js:74: SyntaxError: export 'foo' in module 'test262/test/language/module-code/ambiguous-export-bindings/namespace-unambiguous-if-import-star-as-and-export.js' is ambiguous test262/test/language/module-code/namespace/internals/super-access-to-tdz-binding.js:32: Test262Error: Expected a ReferenceError but got a TypeError test262/test/staging/sm/Function/arguments-parameter-shadowing.js:14: Test262Error: Expected SameValue(«true», «false») to be true test262/test/staging/sm/Function/constructor-binding.js:11: Test262Error: Expected SameValue(«"function"», «"undefined"») to be true