From c32db76718d40e2f47728f2c81c9d68fbd9c9711 Mon Sep 17 00:00:00 2001 From: Caio Lima Date: Thu, 30 Oct 2025 11:10:58 -0300 Subject: [PATCH] [import-defer] adding new test cases to validate evaluation trigger --- src/import-defer/get-in-prototype.case | 18 +++++++ .../hasProperty-in-prototype.case | 18 +++++++ src/import-defer/private-name-access.case | 39 +++++++++++++++ .../ignore-exported-then-get-in-prototype.js | 42 ++++++++++++++++ ...-exported-then-hasProperty-in-prototype.js | 42 ++++++++++++++++ ...nore-not-exported-then-get-in-prototype.js | 42 ++++++++++++++++ ...-exported-then-hasProperty-in-prototype.js | 42 ++++++++++++++++ .../ignore-private-name-access.js | 48 +++++++++++++++++++ .../ignore-symbol-other-get-in-prototype.js | 42 ++++++++++++++++ ...e-symbol-other-hasProperty-in-prototype.js | 42 ++++++++++++++++ ...ore-symbol-toStringTag-get-in-prototype.js | 42 ++++++++++++++++ ...ol-toStringTag-hasProperty-in-prototype.js | 42 ++++++++++++++++ ...rigger-exported-string-get-in-prototype.js | 42 ++++++++++++++++ ...xported-string-hasProperty-in-prototype.js | 42 ++++++++++++++++ ...er-not-exported-string-get-in-prototype.js | 42 ++++++++++++++++ ...xported-string-hasProperty-in-prototype.js | 42 ++++++++++++++++ 16 files changed, 627 insertions(+) create mode 100644 src/import-defer/get-in-prototype.case create mode 100644 src/import-defer/hasProperty-in-prototype.case create mode 100644 src/import-defer/private-name-access.case create mode 100644 test/language/import/import-defer/evaluation-triggers/ignore-exported-then-get-in-prototype.js create mode 100644 test/language/import/import-defer/evaluation-triggers/ignore-exported-then-hasProperty-in-prototype.js create mode 100644 test/language/import/import-defer/evaluation-triggers/ignore-not-exported-then-get-in-prototype.js create mode 100644 test/language/import/import-defer/evaluation-triggers/ignore-not-exported-then-hasProperty-in-prototype.js create mode 100644 test/language/import/import-defer/evaluation-triggers/ignore-private-name-access.js create mode 100644 test/language/import/import-defer/evaluation-triggers/ignore-symbol-other-get-in-prototype.js create mode 100644 test/language/import/import-defer/evaluation-triggers/ignore-symbol-other-hasProperty-in-prototype.js create mode 100644 test/language/import/import-defer/evaluation-triggers/ignore-symbol-toStringTag-get-in-prototype.js create mode 100644 test/language/import/import-defer/evaluation-triggers/ignore-symbol-toStringTag-hasProperty-in-prototype.js create mode 100644 test/language/import/import-defer/evaluation-triggers/trigger-exported-string-get-in-prototype.js create mode 100644 test/language/import/import-defer/evaluation-triggers/trigger-exported-string-hasProperty-in-prototype.js create mode 100644 test/language/import/import-defer/evaluation-triggers/trigger-not-exported-string-get-in-prototype.js create mode 100644 test/language/import/import-defer/evaluation-triggers/trigger-not-exported-string-hasProperty-in-prototype.js diff --git a/src/import-defer/get-in-prototype.case b/src/import-defer/get-in-prototype.case new file mode 100644 index 00000000000..091a8c6ba91 --- /dev/null +++ b/src/import-defer/get-in-prototype.case @@ -0,0 +1,18 @@ +// Copyright (C) 2025 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-module-namespace-exotic-objects-get-p-receiver +desc: _ [[Get]] when namespace object is in the prototype chain +info: | + [[Get]] ( _P_, _Receiver_ ) + 1. If IsSymbolLikeNamespaceKey(_P_, _O_), return ! OrdinaryGet(_O_, _P_, _Receiver_). + 1. Let _exports_ be ? GetModuleExportsList(_O_). + 1. ... + +template: trigger-on-possible-export +---*/ + +//- body +const obj = Object.create(ns); +obj[key]; diff --git a/src/import-defer/hasProperty-in-prototype.case b/src/import-defer/hasProperty-in-prototype.case new file mode 100644 index 00000000000..e184d937211 --- /dev/null +++ b/src/import-defer/hasProperty-in-prototype.case @@ -0,0 +1,18 @@ +// Copyright (C) 2025 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-module-namespace-exotic-objects-hasproperty-p +desc: _ [[HasProperty]] when namespace object is in the prototype chain +info: | + [[HasProperty]] ( _P_, _Receiver_ ) + 1. If IsSymbolLikeNamespaceKey(_P_, _O_), return ! OrdinaryGet(_O_, _P_, _Receiver_). + 1. Let _exports_ be ? GetModuleExportsList(_O_). + 1. ... + +template: trigger-on-possible-export +---*/ + +//- body +const obj = Object.create(ns); +key in obj; diff --git a/src/import-defer/private-name-access.case b/src/import-defer/private-name-access.case new file mode 100644 index 00000000000..b444431a626 --- /dev/null +++ b/src/import-defer/private-name-access.case @@ -0,0 +1,39 @@ +// Copyright (C) 2025 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +/*--- +esid: sec-privateget +desc: PrivateGet and PrivateSet in a namespace object +info: | + PrivateGet ( O, P ) + 1. Let entry be PrivateElementFind(O, P). + 1. If entry is EMPTY, throw a TypeError exception. + 1. If entry.[[Kind]] is either FIELD or METHOD, then + a. Return entry.[[Value]]. + ... + + PrivateSet ( O, P, value ) + 1. Let entry be PrivateElementFind(O, P). + 1. If entry is EMPTY, throw a TypeError exception. + 1. If entry.[[Kind]] is FIELD, then + a. Set entry.[[Value]] to value. + ... + +template: ignore +---*/ + +//- body +class Marker extends function (x) { return x } { + #mark = "bar"; + + static mark(obj) { + new Marker(obj); + } + + static getMark(obj) { + return obj.#mark; + } +} + +Marker.mark(ns); +assert.sameValue(Marker.getMark(ns), "bar"); diff --git a/test/language/import/import-defer/evaluation-triggers/ignore-exported-then-get-in-prototype.js b/test/language/import/import-defer/evaluation-triggers/ignore-exported-then-get-in-prototype.js new file mode 100644 index 00000000000..db62ed4e225 --- /dev/null +++ b/test/language/import/import-defer/evaluation-triggers/ignore-exported-then-get-in-prototype.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/import-defer/get-in-prototype.case +// - src/import-defer/trigger-on-possible-export/then-exported.template +/*--- +description: _ [[Get]] when namespace object is in the prototype chain (of 'then' when it is an exported name, does not trigger execution) +esid: sec-module-namespace-exotic-objects +features: [import-defer] +flags: [generated, module] +info: | + IsSymbolLikeNamespaceKey ( _P_, _O_ ) + 1. If _P_ is a Symbol, return *true*. + 1. If _ns_.[[Deferred]] is *true* and _P_ is "then", return *true*. + 1. Return *false*. + + GetModuleExportsList ( _O_ ) + 1. If _O_.[[Deferred]] is *true*, then + 1. Let _m_ be _O_.[[Module]]. + 1. If _m_ is a Cyclic Module Record, _m_.[[Status]] is not ~evaluated~, and ReadyForSyncExecution(_m_) is *false*, throw a *TypeError* exception. + 1. Perform ? EvaluateSync(_m_). + 1. Return _O_.[[Exports]]. + + + [[Get]] ( _P_, _Receiver_ ) + 1. If IsSymbolLikeNamespaceKey(_P_, _O_), return ! OrdinaryGet(_O_, _P_, _Receiver_). + 1. Let _exports_ be ? GetModuleExportsList(_O_). + 1. ... + +---*/ + + +import "./setup_FIXTURE.js"; + +import defer * as ns from "./dep-then_FIXTURE.js"; + +assert.sameValue(globalThis.evaluations.length, 0, "import defer does not trigger evaluation"); + +var key = "then"; + +const obj = Object.create(ns); +obj[key]; + +assert.sameValue(globalThis.evaluations.length, 0, "It does not trigger evaluation"); diff --git a/test/language/import/import-defer/evaluation-triggers/ignore-exported-then-hasProperty-in-prototype.js b/test/language/import/import-defer/evaluation-triggers/ignore-exported-then-hasProperty-in-prototype.js new file mode 100644 index 00000000000..d36c4e66a43 --- /dev/null +++ b/test/language/import/import-defer/evaluation-triggers/ignore-exported-then-hasProperty-in-prototype.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/import-defer/hasProperty-in-prototype.case +// - src/import-defer/trigger-on-possible-export/then-exported.template +/*--- +description: _ [[HasProperty]] when namespace object is in the prototype chain (of 'then' when it is an exported name, does not trigger execution) +esid: sec-module-namespace-exotic-objects +features: [import-defer] +flags: [generated, module] +info: | + IsSymbolLikeNamespaceKey ( _P_, _O_ ) + 1. If _P_ is a Symbol, return *true*. + 1. If _ns_.[[Deferred]] is *true* and _P_ is "then", return *true*. + 1. Return *false*. + + GetModuleExportsList ( _O_ ) + 1. If _O_.[[Deferred]] is *true*, then + 1. Let _m_ be _O_.[[Module]]. + 1. If _m_ is a Cyclic Module Record, _m_.[[Status]] is not ~evaluated~, and ReadyForSyncExecution(_m_) is *false*, throw a *TypeError* exception. + 1. Perform ? EvaluateSync(_m_). + 1. Return _O_.[[Exports]]. + + + [[HasProperty]] ( _P_, _Receiver_ ) + 1. If IsSymbolLikeNamespaceKey(_P_, _O_), return ! OrdinaryGet(_O_, _P_, _Receiver_). + 1. Let _exports_ be ? GetModuleExportsList(_O_). + 1. ... + +---*/ + + +import "./setup_FIXTURE.js"; + +import defer * as ns from "./dep-then_FIXTURE.js"; + +assert.sameValue(globalThis.evaluations.length, 0, "import defer does not trigger evaluation"); + +var key = "then"; + +const obj = Object.create(ns); +key in obj; + +assert.sameValue(globalThis.evaluations.length, 0, "It does not trigger evaluation"); diff --git a/test/language/import/import-defer/evaluation-triggers/ignore-not-exported-then-get-in-prototype.js b/test/language/import/import-defer/evaluation-triggers/ignore-not-exported-then-get-in-prototype.js new file mode 100644 index 00000000000..d05499ae0fb --- /dev/null +++ b/test/language/import/import-defer/evaluation-triggers/ignore-not-exported-then-get-in-prototype.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/import-defer/get-in-prototype.case +// - src/import-defer/trigger-on-possible-export/then-not-exported.template +/*--- +description: _ [[Get]] when namespace object is in the prototype chain (of 'then' when it is not an exported name, does not trigger execution) +esid: sec-module-namespace-exotic-objects +features: [import-defer] +flags: [generated, module] +info: | + IsSymbolLikeNamespaceKey ( _P_, _O_ ) + 1. If _P_ is a Symbol, return *true*. + 1. If _ns_.[[Deferred]] is *true* and _P_ is "then", return *true*. + 1. Return *false*. + + GetModuleExportsList ( _O_ ) + 1. If _O_.[[Deferred]] is *true*, then + 1. Let _m_ be _O_.[[Module]]. + 1. If _m_ is a Cyclic Module Record, _m_.[[Status]] is not ~evaluated~, and ReadyForSyncExecution(_m_) is *false*, throw a *TypeError* exception. + 1. Perform ? EvaluateSync(_m_). + 1. Return _O_.[[Exports]]. + + + [[Get]] ( _P_, _Receiver_ ) + 1. If IsSymbolLikeNamespaceKey(_P_, _O_), return ! OrdinaryGet(_O_, _P_, _Receiver_). + 1. Let _exports_ be ? GetModuleExportsList(_O_). + 1. ... + +---*/ + + +import "./setup_FIXTURE.js"; + +import defer * as ns from "./dep_FIXTURE.js"; + +assert.sameValue(globalThis.evaluations.length, 0, "import defer does not trigger evaluation"); + +var key = "then"; + +const obj = Object.create(ns); +obj[key]; + +assert.sameValue(globalThis.evaluations.length, 0, "It does not trigger evaluation"); diff --git a/test/language/import/import-defer/evaluation-triggers/ignore-not-exported-then-hasProperty-in-prototype.js b/test/language/import/import-defer/evaluation-triggers/ignore-not-exported-then-hasProperty-in-prototype.js new file mode 100644 index 00000000000..78df5c1a54b --- /dev/null +++ b/test/language/import/import-defer/evaluation-triggers/ignore-not-exported-then-hasProperty-in-prototype.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/import-defer/hasProperty-in-prototype.case +// - src/import-defer/trigger-on-possible-export/then-not-exported.template +/*--- +description: _ [[HasProperty]] when namespace object is in the prototype chain (of 'then' when it is not an exported name, does not trigger execution) +esid: sec-module-namespace-exotic-objects +features: [import-defer] +flags: [generated, module] +info: | + IsSymbolLikeNamespaceKey ( _P_, _O_ ) + 1. If _P_ is a Symbol, return *true*. + 1. If _ns_.[[Deferred]] is *true* and _P_ is "then", return *true*. + 1. Return *false*. + + GetModuleExportsList ( _O_ ) + 1. If _O_.[[Deferred]] is *true*, then + 1. Let _m_ be _O_.[[Module]]. + 1. If _m_ is a Cyclic Module Record, _m_.[[Status]] is not ~evaluated~, and ReadyForSyncExecution(_m_) is *false*, throw a *TypeError* exception. + 1. Perform ? EvaluateSync(_m_). + 1. Return _O_.[[Exports]]. + + + [[HasProperty]] ( _P_, _Receiver_ ) + 1. If IsSymbolLikeNamespaceKey(_P_, _O_), return ! OrdinaryGet(_O_, _P_, _Receiver_). + 1. Let _exports_ be ? GetModuleExportsList(_O_). + 1. ... + +---*/ + + +import "./setup_FIXTURE.js"; + +import defer * as ns from "./dep_FIXTURE.js"; + +assert.sameValue(globalThis.evaluations.length, 0, "import defer does not trigger evaluation"); + +var key = "then"; + +const obj = Object.create(ns); +key in obj; + +assert.sameValue(globalThis.evaluations.length, 0, "It does not trigger evaluation"); diff --git a/test/language/import/import-defer/evaluation-triggers/ignore-private-name-access.js b/test/language/import/import-defer/evaluation-triggers/ignore-private-name-access.js new file mode 100644 index 00000000000..c308afc2270 --- /dev/null +++ b/test/language/import/import-defer/evaluation-triggers/ignore-private-name-access.js @@ -0,0 +1,48 @@ +// This file was procedurally generated from the following sources: +// - src/import-defer/private-name-access.case +// - src/import-defer/ignore/ignore.template +/*--- +description: PrivateGet and PrivateSet in a namespace object (does not trigger execution) +esid: sec-module-namespace-exotic-objects +features: [import-defer] +flags: [generated, module] +info: | + PrivateGet ( O, P ) + 1. Let entry be PrivateElementFind(O, P). + 1. If entry is EMPTY, throw a TypeError exception. + 1. If entry.[[Kind]] is either FIELD or METHOD, then + a. Return entry.[[Value]]. + ... + + PrivateSet ( O, P, value ) + 1. Let entry be PrivateElementFind(O, P). + 1. If entry is EMPTY, throw a TypeError exception. + 1. If entry.[[Kind]] is FIELD, then + a. Set entry.[[Value]] to value. + ... + +---*/ + + +import "./setup_FIXTURE.js"; + +import defer * as ns from "./dep_FIXTURE.js"; + +assert.sameValue(globalThis.evaluations.length, 0, "import defer does not trigger evaluation"); + +class Marker extends function (x) { return x } { + #mark = "bar"; + + static mark(obj) { + new Marker(obj); + } + + static getMark(obj) { + return obj.#mark; + } +} + +Marker.mark(ns); +assert.sameValue(Marker.getMark(ns), "bar"); + +assert.sameValue(globalThis.evaluations.length, 0, "It does not trigger evaluation"); diff --git a/test/language/import/import-defer/evaluation-triggers/ignore-symbol-other-get-in-prototype.js b/test/language/import/import-defer/evaluation-triggers/ignore-symbol-other-get-in-prototype.js new file mode 100644 index 00000000000..ab43c753419 --- /dev/null +++ b/test/language/import/import-defer/evaluation-triggers/ignore-symbol-other-get-in-prototype.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/import-defer/get-in-prototype.case +// - src/import-defer/trigger-on-possible-export/symbol-other.template +/*--- +description: _ [[Get]] when namespace object is in the prototype chain (of a symbol that is not a property of the namespace object, does not trigger execution) +esid: sec-module-namespace-exotic-objects +features: [import-defer] +flags: [generated, module] +info: | + IsSymbolLikeNamespaceKey ( _P_, _O_ ) + 1. If _P_ is a Symbol, return *true*. + 1. If _ns_.[[Deferred]] is *true* and _P_ is "then", return *true*. + 1. Return *false*. + + GetModuleExportsList ( _O_ ) + 1. If _O_.[[Deferred]] is *true*, then + 1. Let _m_ be _O_.[[Module]]. + 1. If _m_ is a Cyclic Module Record, _m_.[[Status]] is not ~evaluated~, and ReadyForSyncExecution(_m_) is *false*, throw a *TypeError* exception. + 1. Perform ? EvaluateSync(_m_). + 1. Return _O_.[[Exports]]. + + + [[Get]] ( _P_, _Receiver_ ) + 1. If IsSymbolLikeNamespaceKey(_P_, _O_), return ! OrdinaryGet(_O_, _P_, _Receiver_). + 1. Let _exports_ be ? GetModuleExportsList(_O_). + 1. ... + +---*/ + + +import "./setup_FIXTURE.js"; + +import defer * as ns from "./dep_FIXTURE.js"; + +assert.sameValue(globalThis.evaluations.length, 0, "import defer does not trigger evaluation"); + +var key = Symbol(); + +const obj = Object.create(ns); +obj[key]; + +assert.sameValue(globalThis.evaluations.length, 0, "It does not trigger evaluation"); diff --git a/test/language/import/import-defer/evaluation-triggers/ignore-symbol-other-hasProperty-in-prototype.js b/test/language/import/import-defer/evaluation-triggers/ignore-symbol-other-hasProperty-in-prototype.js new file mode 100644 index 00000000000..0aec57df2df --- /dev/null +++ b/test/language/import/import-defer/evaluation-triggers/ignore-symbol-other-hasProperty-in-prototype.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/import-defer/hasProperty-in-prototype.case +// - src/import-defer/trigger-on-possible-export/symbol-other.template +/*--- +description: _ [[HasProperty]] when namespace object is in the prototype chain (of a symbol that is not a property of the namespace object, does not trigger execution) +esid: sec-module-namespace-exotic-objects +features: [import-defer] +flags: [generated, module] +info: | + IsSymbolLikeNamespaceKey ( _P_, _O_ ) + 1. If _P_ is a Symbol, return *true*. + 1. If _ns_.[[Deferred]] is *true* and _P_ is "then", return *true*. + 1. Return *false*. + + GetModuleExportsList ( _O_ ) + 1. If _O_.[[Deferred]] is *true*, then + 1. Let _m_ be _O_.[[Module]]. + 1. If _m_ is a Cyclic Module Record, _m_.[[Status]] is not ~evaluated~, and ReadyForSyncExecution(_m_) is *false*, throw a *TypeError* exception. + 1. Perform ? EvaluateSync(_m_). + 1. Return _O_.[[Exports]]. + + + [[HasProperty]] ( _P_, _Receiver_ ) + 1. If IsSymbolLikeNamespaceKey(_P_, _O_), return ! OrdinaryGet(_O_, _P_, _Receiver_). + 1. Let _exports_ be ? GetModuleExportsList(_O_). + 1. ... + +---*/ + + +import "./setup_FIXTURE.js"; + +import defer * as ns from "./dep_FIXTURE.js"; + +assert.sameValue(globalThis.evaluations.length, 0, "import defer does not trigger evaluation"); + +var key = Symbol(); + +const obj = Object.create(ns); +key in obj; + +assert.sameValue(globalThis.evaluations.length, 0, "It does not trigger evaluation"); diff --git a/test/language/import/import-defer/evaluation-triggers/ignore-symbol-toStringTag-get-in-prototype.js b/test/language/import/import-defer/evaluation-triggers/ignore-symbol-toStringTag-get-in-prototype.js new file mode 100644 index 00000000000..73490497d70 --- /dev/null +++ b/test/language/import/import-defer/evaluation-triggers/ignore-symbol-toStringTag-get-in-prototype.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/import-defer/get-in-prototype.case +// - src/import-defer/trigger-on-possible-export/symbol-toStringTag.template +/*--- +description: _ [[Get]] when namespace object is in the prototype chain (of Symbol.toStringTag, does not trigger execution) +esid: sec-module-namespace-exotic-objects +features: [import-defer] +flags: [generated, module] +info: | + IsSymbolLikeNamespaceKey ( _P_, _O_ ) + 1. If _P_ is a Symbol, return *true*. + 1. If _ns_.[[Deferred]] is *true* and _P_ is "then", return *true*. + 1. Return *false*. + + GetModuleExportsList ( _O_ ) + 1. If _O_.[[Deferred]] is *true*, then + 1. Let _m_ be _O_.[[Module]]. + 1. If _m_ is a Cyclic Module Record, _m_.[[Status]] is not ~evaluated~, and ReadyForSyncExecution(_m_) is *false*, throw a *TypeError* exception. + 1. Perform ? EvaluateSync(_m_). + 1. Return _O_.[[Exports]]. + + + [[Get]] ( _P_, _Receiver_ ) + 1. If IsSymbolLikeNamespaceKey(_P_, _O_), return ! OrdinaryGet(_O_, _P_, _Receiver_). + 1. Let _exports_ be ? GetModuleExportsList(_O_). + 1. ... + +---*/ + + +import "./setup_FIXTURE.js"; + +import defer * as ns from "./dep_FIXTURE.js"; + +assert.sameValue(globalThis.evaluations.length, 0, "import defer does not trigger evaluation"); + +var key = Symbol.toStringTag; + +const obj = Object.create(ns); +obj[key]; + +assert.sameValue(globalThis.evaluations.length, 0, "It does not trigger evaluation"); diff --git a/test/language/import/import-defer/evaluation-triggers/ignore-symbol-toStringTag-hasProperty-in-prototype.js b/test/language/import/import-defer/evaluation-triggers/ignore-symbol-toStringTag-hasProperty-in-prototype.js new file mode 100644 index 00000000000..d1243684ab8 --- /dev/null +++ b/test/language/import/import-defer/evaluation-triggers/ignore-symbol-toStringTag-hasProperty-in-prototype.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/import-defer/hasProperty-in-prototype.case +// - src/import-defer/trigger-on-possible-export/symbol-toStringTag.template +/*--- +description: _ [[HasProperty]] when namespace object is in the prototype chain (of Symbol.toStringTag, does not trigger execution) +esid: sec-module-namespace-exotic-objects +features: [import-defer] +flags: [generated, module] +info: | + IsSymbolLikeNamespaceKey ( _P_, _O_ ) + 1. If _P_ is a Symbol, return *true*. + 1. If _ns_.[[Deferred]] is *true* and _P_ is "then", return *true*. + 1. Return *false*. + + GetModuleExportsList ( _O_ ) + 1. If _O_.[[Deferred]] is *true*, then + 1. Let _m_ be _O_.[[Module]]. + 1. If _m_ is a Cyclic Module Record, _m_.[[Status]] is not ~evaluated~, and ReadyForSyncExecution(_m_) is *false*, throw a *TypeError* exception. + 1. Perform ? EvaluateSync(_m_). + 1. Return _O_.[[Exports]]. + + + [[HasProperty]] ( _P_, _Receiver_ ) + 1. If IsSymbolLikeNamespaceKey(_P_, _O_), return ! OrdinaryGet(_O_, _P_, _Receiver_). + 1. Let _exports_ be ? GetModuleExportsList(_O_). + 1. ... + +---*/ + + +import "./setup_FIXTURE.js"; + +import defer * as ns from "./dep_FIXTURE.js"; + +assert.sameValue(globalThis.evaluations.length, 0, "import defer does not trigger evaluation"); + +var key = Symbol.toStringTag; + +const obj = Object.create(ns); +key in obj; + +assert.sameValue(globalThis.evaluations.length, 0, "It does not trigger evaluation"); diff --git a/test/language/import/import-defer/evaluation-triggers/trigger-exported-string-get-in-prototype.js b/test/language/import/import-defer/evaluation-triggers/trigger-exported-string-get-in-prototype.js new file mode 100644 index 00000000000..98103b2f9c8 --- /dev/null +++ b/test/language/import/import-defer/evaluation-triggers/trigger-exported-string-get-in-prototype.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/import-defer/get-in-prototype.case +// - src/import-defer/trigger-on-possible-export/string-exported.template +/*--- +description: _ [[Get]] when namespace object is in the prototype chain (of a string that is an exported name, triggers execution) +esid: sec-module-namespace-exotic-objects +features: [import-defer] +flags: [generated, module] +info: | + IsSymbolLikeNamespaceKey ( _P_, _O_ ) + 1. If _P_ is a Symbol, return *true*. + 1. If _ns_.[[Deferred]] is *true* and _P_ is "then", return *true*. + 1. Return *false*. + + GetModuleExportsList ( _O_ ) + 1. If _O_.[[Deferred]] is *true*, then + 1. Let _m_ be _O_.[[Module]]. + 1. If _m_ is a Cyclic Module Record, _m_.[[Status]] is not ~evaluated~, and ReadyForSyncExecution(_m_) is *false*, throw a *TypeError* exception. + 1. Perform ? EvaluateSync(_m_). + 1. Return _O_.[[Exports]]. + + + [[Get]] ( _P_, _Receiver_ ) + 1. If IsSymbolLikeNamespaceKey(_P_, _O_), return ! OrdinaryGet(_O_, _P_, _Receiver_). + 1. Let _exports_ be ? GetModuleExportsList(_O_). + 1. ... + +---*/ + + +import "./setup_FIXTURE.js"; + +import defer * as ns from "./dep_FIXTURE.js"; + +assert.sameValue(globalThis.evaluations.length, 0, "import defer does not trigger evaluation"); + +var key = "exported"; + +const obj = Object.create(ns); +obj[key]; + +assert(globalThis.evaluations.length > 0, "It triggers evaluation"); diff --git a/test/language/import/import-defer/evaluation-triggers/trigger-exported-string-hasProperty-in-prototype.js b/test/language/import/import-defer/evaluation-triggers/trigger-exported-string-hasProperty-in-prototype.js new file mode 100644 index 00000000000..b7ac7248da9 --- /dev/null +++ b/test/language/import/import-defer/evaluation-triggers/trigger-exported-string-hasProperty-in-prototype.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/import-defer/hasProperty-in-prototype.case +// - src/import-defer/trigger-on-possible-export/string-exported.template +/*--- +description: _ [[HasProperty]] when namespace object is in the prototype chain (of a string that is an exported name, triggers execution) +esid: sec-module-namespace-exotic-objects +features: [import-defer] +flags: [generated, module] +info: | + IsSymbolLikeNamespaceKey ( _P_, _O_ ) + 1. If _P_ is a Symbol, return *true*. + 1. If _ns_.[[Deferred]] is *true* and _P_ is "then", return *true*. + 1. Return *false*. + + GetModuleExportsList ( _O_ ) + 1. If _O_.[[Deferred]] is *true*, then + 1. Let _m_ be _O_.[[Module]]. + 1. If _m_ is a Cyclic Module Record, _m_.[[Status]] is not ~evaluated~, and ReadyForSyncExecution(_m_) is *false*, throw a *TypeError* exception. + 1. Perform ? EvaluateSync(_m_). + 1. Return _O_.[[Exports]]. + + + [[HasProperty]] ( _P_, _Receiver_ ) + 1. If IsSymbolLikeNamespaceKey(_P_, _O_), return ! OrdinaryGet(_O_, _P_, _Receiver_). + 1. Let _exports_ be ? GetModuleExportsList(_O_). + 1. ... + +---*/ + + +import "./setup_FIXTURE.js"; + +import defer * as ns from "./dep_FIXTURE.js"; + +assert.sameValue(globalThis.evaluations.length, 0, "import defer does not trigger evaluation"); + +var key = "exported"; + +const obj = Object.create(ns); +key in obj; + +assert(globalThis.evaluations.length > 0, "It triggers evaluation"); diff --git a/test/language/import/import-defer/evaluation-triggers/trigger-not-exported-string-get-in-prototype.js b/test/language/import/import-defer/evaluation-triggers/trigger-not-exported-string-get-in-prototype.js new file mode 100644 index 00000000000..ac7af3c14ec --- /dev/null +++ b/test/language/import/import-defer/evaluation-triggers/trigger-not-exported-string-get-in-prototype.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/import-defer/get-in-prototype.case +// - src/import-defer/trigger-on-possible-export/string-not-exported.template +/*--- +description: _ [[Get]] when namespace object is in the prototype chain (of a string that is not an exported name, triggers execution) +esid: sec-module-namespace-exotic-objects +features: [import-defer] +flags: [generated, module] +info: | + IsSymbolLikeNamespaceKey ( _P_, _O_ ) + 1. If _P_ is a Symbol, return *true*. + 1. If _ns_.[[Deferred]] is *true* and _P_ is "then", return *true*. + 1. Return *false*. + + GetModuleExportsList ( _O_ ) + 1. If _O_.[[Deferred]] is *true*, then + 1. Let _m_ be _O_.[[Module]]. + 1. If _m_ is a Cyclic Module Record, _m_.[[Status]] is not ~evaluated~, and ReadyForSyncExecution(_m_) is *false*, throw a *TypeError* exception. + 1. Perform ? EvaluateSync(_m_). + 1. Return _O_.[[Exports]]. + + + [[Get]] ( _P_, _Receiver_ ) + 1. If IsSymbolLikeNamespaceKey(_P_, _O_), return ! OrdinaryGet(_O_, _P_, _Receiver_). + 1. Let _exports_ be ? GetModuleExportsList(_O_). + 1. ... + +---*/ + + +import "./setup_FIXTURE.js"; + +import defer * as ns from "./dep_FIXTURE.js"; + +assert.sameValue(globalThis.evaluations.length, 0, "import defer does not trigger evaluation"); + +var key = "notExported"; + +const obj = Object.create(ns); +obj[key]; + +assert(globalThis.evaluations.length > 0, "It triggers evaluation"); diff --git a/test/language/import/import-defer/evaluation-triggers/trigger-not-exported-string-hasProperty-in-prototype.js b/test/language/import/import-defer/evaluation-triggers/trigger-not-exported-string-hasProperty-in-prototype.js new file mode 100644 index 00000000000..f9398e80d67 --- /dev/null +++ b/test/language/import/import-defer/evaluation-triggers/trigger-not-exported-string-hasProperty-in-prototype.js @@ -0,0 +1,42 @@ +// This file was procedurally generated from the following sources: +// - src/import-defer/hasProperty-in-prototype.case +// - src/import-defer/trigger-on-possible-export/string-not-exported.template +/*--- +description: _ [[HasProperty]] when namespace object is in the prototype chain (of a string that is not an exported name, triggers execution) +esid: sec-module-namespace-exotic-objects +features: [import-defer] +flags: [generated, module] +info: | + IsSymbolLikeNamespaceKey ( _P_, _O_ ) + 1. If _P_ is a Symbol, return *true*. + 1. If _ns_.[[Deferred]] is *true* and _P_ is "then", return *true*. + 1. Return *false*. + + GetModuleExportsList ( _O_ ) + 1. If _O_.[[Deferred]] is *true*, then + 1. Let _m_ be _O_.[[Module]]. + 1. If _m_ is a Cyclic Module Record, _m_.[[Status]] is not ~evaluated~, and ReadyForSyncExecution(_m_) is *false*, throw a *TypeError* exception. + 1. Perform ? EvaluateSync(_m_). + 1. Return _O_.[[Exports]]. + + + [[HasProperty]] ( _P_, _Receiver_ ) + 1. If IsSymbolLikeNamespaceKey(_P_, _O_), return ! OrdinaryGet(_O_, _P_, _Receiver_). + 1. Let _exports_ be ? GetModuleExportsList(_O_). + 1. ... + +---*/ + + +import "./setup_FIXTURE.js"; + +import defer * as ns from "./dep_FIXTURE.js"; + +assert.sameValue(globalThis.evaluations.length, 0, "import defer does not trigger evaluation"); + +var key = "notExported"; + +const obj = Object.create(ns); +key in obj; + +assert(globalThis.evaluations.length > 0, "It triggers evaluation");