From 81c2584bb269911f8090ad6ff837d30f0ae359ed Mon Sep 17 00:00:00 2001 From: Don Isaac Date: Sun, 6 Sep 2026 16:40:06 -0400 Subject: [PATCH] fix: SetFunctionName always includes prefix --- .../builtins/ecmascript_function.rs | 22 +++++++++++-------- tests/expectations.json | 5 ----- tests/metrics.json | 4 ++-- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/nova_vm/src/ecmascript/builtins/ecmascript_function.rs b/nova_vm/src/ecmascript/builtins/ecmascript_function.rs index d2ebc374b..78a534cb9 100644 --- a/nova_vm/src/ecmascript/builtins/ecmascript_function.rs +++ b/nova_vm/src/ecmascript/builtins/ecmascript_function.rs @@ -1095,15 +1095,19 @@ pub(crate) fn set_function_name<'a>( // a. Let description be name's [[Description]] value. // b. If description is undefined, set name to the empty String. // c. Else, set name to the string-concatenation of "[", description, and "]". - s.description(agent) - .map_or(String::EMPTY_STRING, |descriptor| { - let descriptor = descriptor.to_string_lossy_(agent); - String::from_string( - agent, - format!("{}[{descriptor}]", prefix_into_str(prefix)), - gc, - ) - }) + if let Some(descriptor) = s.description(agent) { + let descriptor = descriptor.to_string_lossy_(agent); + String::from_string( + agent, + format!("{}[{descriptor}]", prefix_into_str(prefix)), + gc, + ) + } else if let Some(prefix) = prefix { + // Step 5 applies even when description is None + String::from_static_str(agent, prefix.into_str(), gc) + } else { + String::EMPTY_STRING + } } PropertyKey::Integer(integer) => String::from_string( diff --git a/tests/expectations.json b/tests/expectations.json index 8fb7142c7..487d02552 100644 --- a/tests/expectations.json +++ b/tests/expectations.json @@ -5787,8 +5787,6 @@ "language/expressions/logical-or/tco-right.js": "FAIL", "language/expressions/multiplication/S11.5.1_A4_T7.js": "FAIL", "language/expressions/object/computed-property-name-topropertykey-before-value-evaluation.js": "FAIL", - "language/expressions/object/fn-name-accessor-get.js": "FAIL", - "language/expressions/object/fn-name-accessor-set.js": "FAIL", "language/expressions/object/identifier-shorthand-static-init-await-valid.js": "FAIL", "language/expressions/object/method-definition/generator-prototype-prop.js": "FAIL", "language/expressions/object/method-definition/static-init-await-binding-accessor.js": "FAIL", @@ -6157,8 +6155,6 @@ "language/statements/class/decorator/syntax/valid/decorator-member-expr-identifier-reference.js": "FAIL", "language/statements/class/decorator/syntax/valid/decorator-parenthesized-expr-identifier-reference.js": "FAIL", "language/statements/class/definition/constructor-strict-by-default.js": "FAIL", - "language/statements/class/definition/fn-name-accessor-get.js": "FAIL", - "language/statements/class/definition/fn-name-accessor-set.js": "FAIL", "language/statements/class/elements/arrow-body-derived-cls-direct-eval-contains-superproperty-1.js": "FAIL", "language/statements/class/elements/arrow-body-derived-cls-direct-eval-contains-superproperty-2.js": "FAIL", "language/statements/class/elements/arrow-body-direct-eval-err-contains-arguments.js": "FAIL", @@ -6540,7 +6536,6 @@ "staging/sm/Function/function-caller-restrictions.js": "FAIL", "staging/sm/Function/function-name-assignment.js": "FAIL", "staging/sm/Function/function-name-for.js": "FAIL", - "staging/sm/Function/function-name-method.js": "FAIL", "staging/sm/Function/function-name-property.js": "FAIL", "staging/sm/Function/function-toString-builtin-name.js": "FAIL", "staging/sm/Function/function-toString-builtin.js": "FAIL", diff --git a/tests/metrics.json b/tests/metrics.json index e81399db9..a3f6bc541 100644 --- a/tests/metrics.json +++ b/tests/metrics.json @@ -1,8 +1,8 @@ { "results": { "crash": 52, - "fail": 6785, - "pass": 40515, + "fail": 6780, + "pass": 40520, "skip": 3326, "timeout": 18, "unresolved": 37