diff --git a/Compilation/ILEmitter.Calls.Constructors.cs b/Compilation/ILEmitter.Calls.Constructors.cs index 465c0353..df364aff 100644 --- a/Compilation/ILEmitter.Calls.Constructors.cs +++ b/Compilation/ILEmitter.Calls.Constructors.cs @@ -298,6 +298,10 @@ private void EmitFallbackConstruction(string className, Expr.New n) private void EmitCalleeExprConstruction(Expr.New n) { EmitExpression(n.Callee); + // Box value-typed callees (e.g. `new true;`, `new 1;`) before storing to an + // object slot — without this the JIT crashes with a fatal CLR error on + // the upcoming Stloc/Ldloc into `object`. + EmitBoxIfNeeded(n.Callee); var objTemp = IL.DeclareLocal(_ctx.Types.Object); IL.Emit(OpCodes.Stloc, objTemp); diff --git a/Parsing/Parser.Expressions.cs b/Parsing/Parser.Expressions.cs index 7eb7311d..b0888d37 100644 --- a/Parsing/Parser.Expressions.cs +++ b/Parsing/Parser.Expressions.cs @@ -388,21 +388,11 @@ private Expr Unary() List? typeArgs = TryParseTypeArguments(); // Parse arguments. `new X` without parens is valid JS — - // equivalent to `new X()`. + // equivalent to `new X()`. Spread args (`new X(...iter)`) are allowed. List arguments = []; if (Match(TokenType.LEFT_PAREN)) { - if (!Check(TokenType.RIGHT_PAREN)) - { - while (true) - { - arguments.Add(Expression()); - if (!Match(TokenType.COMMA)) break; - // ES2017 trailing comma: `new X(a, b,)`. - if (Check(TokenType.RIGHT_PAREN)) break; - } - } - Consume(TokenType.RIGHT_PAREN, "Expect ')' after arguments."); + ParseNewArgumentList(arguments); } // Allow operations on new expressions @@ -595,46 +585,87 @@ private Expr FinishCall(Expr callee, List? typeArgs = null, bool optiona } /// - /// Parses the callee expression for a 'new' expression. - /// Handles: identifiers, member access chains, and parenthesized expressions. - /// Does NOT handle type arguments or call arguments (those are parsed by caller). + /// Parses the callee expression for a 'new' expression — a MemberExpression per + /// ECMA-262 §13.3. Accepts any PrimaryExpression (identifier, literal, function/class + /// expression, parenthesized expression, this, etc.), followed by a member-access + /// chain of `.name` and `[index]` (but NOT call arguments — those bind to the `new`). + /// Also handles nested `new` (e.g. `new new X()`). /// private Expr ParseNewCallee() { Expr callee; - // Check for parenthesized expression: new (condition ? A : B)() - if (Match(TokenType.LEFT_PAREN)) - { - callee = Expression(); - Consume(TokenType.RIGHT_PAREN, "Expect ')' after expression in new callee."); - return callee; - } - - // `new this(...)` — subclass-creating static method pattern used in - // yaml's `YAMLMap.from(...)` etc. Treat `this` as the callee expr. - if (Match(TokenType.THIS)) + // Nested `new`: `new new X()` parses as `new (new X())` — the inner `new X()` + // is itself a MemberExpression callee. + if (Match(TokenType.NEW)) { - callee = new Expr.This(Previous()); + Expr innerCallee = ParseNewCallee(); + List? innerTypeArgs = TryParseTypeArguments(); + List innerArgs = []; + if (Match(TokenType.LEFT_PAREN)) + { + ParseNewArgumentList(innerArgs); + } + callee = new Expr.New(innerCallee, innerTypeArgs, innerArgs); } else { - // Otherwise expect an identifier (class name or start of namespace path) - Token firstIdent = ConsumeIdentifierName("Expect class name after 'new'."); - callee = new Expr.Variable(firstIdent); + // Any PrimaryExpression: literals (`new true`, `new 1`), function/class + // expressions (`new function() {}(...)`), identifiers, parenthesized exprs, + // `this`, array/object literals, etc. + callee = Primary(); } - // Handle member access chain: Namespace.SubNamespace.ClassName. + // Member-access chain (no call args — those bind to the enclosing `new`). // Property-name position after `.` accepts any keyword (JS semantics). - while (Match(TokenType.DOT)) + while (true) { - Token name = ConsumePropertyName("Expect identifier after '.' in new expression."); - callee = new Expr.Get(callee, name); + if (Match(TokenType.DOT)) + { + Token name = ConsumePropertyName("Expect identifier after '.' in new expression."); + callee = new Expr.Get(callee, name); + } + else if (Match(TokenType.LEFT_BRACKET)) + { + Expr index = Expression(); + Consume(TokenType.RIGHT_BRACKET, "Expect ']' after index in new expression."); + callee = new Expr.GetIndex(callee, index); + } + else + { + break; + } } return callee; } + /// + /// Parses the argument list of a `new` expression after the opening `(`. + /// Supports spread (`...iter`) and ES2017 trailing comma. Consumes the closing `)`. + /// + private void ParseNewArgumentList(List arguments) + { + if (!Check(TokenType.RIGHT_PAREN)) + { + while (true) + { + if (Match(TokenType.DOT_DOT_DOT)) + { + arguments.Add(new Expr.Spread(Expression())); + } + else + { + arguments.Add(Expression()); + } + if (!Match(TokenType.COMMA)) break; + // ES2017 trailing comma: `new X(a, b,)`. + if (Check(TokenType.RIGHT_PAREN)) break; + } + } + Consume(TokenType.RIGHT_PAREN, "Expect ')' after arguments."); + } + private Expr Primary() { if (Match(TokenType.FALSE)) return new Expr.Literal(false); diff --git a/SharpTS.Test262/baselines/compiled.txt b/SharpTS.Test262/baselines/compiled.txt index 074614e1..b59bd360 100644 --- a/SharpTS.Test262/baselines/compiled.txt +++ b/SharpTS.Test262/baselines/compiled.txt @@ -587,7 +587,7 @@ test/built-ins/Array/prototype/every/15.4.4.16-7-c-iii-13.js TypeCheckError test/built-ins/Array/prototype/every/15.4.4.16-7-c-iii-14.js TypeCheckError test/built-ins/Array/prototype/every/15.4.4.16-7-c-iii-15.js TypeCheckError test/built-ins/Array/prototype/every/15.4.4.16-7-c-iii-16.js TypeCheckError -test/built-ins/Array/prototype/every/15.4.4.16-7-c-iii-17.js Fail +test/built-ins/Array/prototype/every/15.4.4.16-7-c-iii-17.js Pass test/built-ins/Array/prototype/every/15.4.4.16-7-c-iii-18.js Pass test/built-ins/Array/prototype/every/15.4.4.16-7-c-iii-19.js Pass test/built-ins/Array/prototype/every/15.4.4.16-7-c-iii-2.js Pass @@ -848,7 +848,7 @@ test/built-ins/Array/prototype/filter/15.4.4.20-9-c-iii-14.js TypeCheckError test/built-ins/Array/prototype/filter/15.4.4.20-9-c-iii-15.js TypeCheckError test/built-ins/Array/prototype/filter/15.4.4.20-9-c-iii-16.js TypeCheckError test/built-ins/Array/prototype/filter/15.4.4.20-9-c-iii-17.js Pass -test/built-ins/Array/prototype/filter/15.4.4.20-9-c-iii-18.js Fail +test/built-ins/Array/prototype/filter/15.4.4.20-9-c-iii-18.js Pass test/built-ins/Array/prototype/filter/15.4.4.20-9-c-iii-19.js Pass test/built-ins/Array/prototype/filter/15.4.4.20-9-c-iii-2.js Pass test/built-ins/Array/prototype/filter/15.4.4.20-9-c-iii-20.js Pass @@ -2758,7 +2758,7 @@ test/built-ins/Array/prototype/some/15.4.4.17-7-c-iii-13.js TypeCheckError test/built-ins/Array/prototype/some/15.4.4.17-7-c-iii-14.js TypeCheckError test/built-ins/Array/prototype/some/15.4.4.17-7-c-iii-15.js TypeCheckError test/built-ins/Array/prototype/some/15.4.4.17-7-c-iii-16.js Pass -test/built-ins/Array/prototype/some/15.4.4.17-7-c-iii-17.js Fail +test/built-ins/Array/prototype/some/15.4.4.17-7-c-iii-17.js Pass test/built-ins/Array/prototype/some/15.4.4.17-7-c-iii-18.js Pass test/built-ins/Array/prototype/some/15.4.4.17-7-c-iii-19.js Pass test/built-ins/Array/prototype/some/15.4.4.17-7-c-iii-2.js Pass @@ -3112,7 +3112,7 @@ test/built-ins/Boolean/prototype/S15.6.4_A2.js Pass test/built-ins/Boolean/prototype/constructor/S15.6.4.1_A1.js Pass test/built-ins/Boolean/prototype/toString/S15.6.4.2_A1_T1.js Pass test/built-ins/Boolean/prototype/toString/S15.6.4.2_A1_T2.js Pass -test/built-ins/Boolean/prototype/toString/S15.6.4.2_A2_T1.js Fail +test/built-ins/Boolean/prototype/toString/S15.6.4.2_A2_T1.js Pass test/built-ins/Boolean/prototype/toString/S15.6.4.2_A2_T2.js Pass test/built-ins/Boolean/prototype/toString/S15.6.4.2_A2_T3.js TypeCheckError test/built-ins/Boolean/prototype/toString/S15.6.4.2_A2_T4.js Pass @@ -3122,7 +3122,7 @@ test/built-ins/Boolean/prototype/toString/name.js TypeCheckError test/built-ins/Boolean/prototype/toString/not-a-constructor.js Pass test/built-ins/Boolean/prototype/valueOf/S15.6.4.3_A1_T1.js Pass test/built-ins/Boolean/prototype/valueOf/S15.6.4.3_A1_T2.js Pass -test/built-ins/Boolean/prototype/valueOf/S15.6.4.3_A2_T1.js Fail +test/built-ins/Boolean/prototype/valueOf/S15.6.4.3_A2_T1.js Pass test/built-ins/Boolean/prototype/valueOf/S15.6.4.3_A2_T2.js Pass test/built-ins/Boolean/prototype/valueOf/S15.6.4.3_A2_T3.js TypeCheckError test/built-ins/Boolean/prototype/valueOf/S15.6.4.3_A2_T4.js Pass @@ -3153,22 +3153,22 @@ test/built-ins/Error/isError/prop-desc.js TypeCheckError test/built-ins/Error/isError/symbols.js Fail test/built-ins/Error/length.js TypeCheckError test/built-ins/Error/message_property.js TypeCheckError -test/built-ins/Error/name.js Fail +test/built-ins/Error/name.js Pass test/built-ins/Error/prop-desc.js TypeCheckError test/built-ins/Error/proto-from-ctor-realm.js TypeCheckError test/built-ins/Error/prototype/S15.11.3.1_A1_T1.js TypeCheckError test/built-ins/Error/prototype/S15.11.3.1_A2_T1.js Pass test/built-ins/Error/prototype/S15.11.3.1_A3_T1.js TypeCheckError test/built-ins/Error/prototype/S15.11.3.1_A4_T1.js Pass -test/built-ins/Error/prototype/S15.11.4_A1.js Fail -test/built-ins/Error/prototype/S15.11.4_A2.js Fail +test/built-ins/Error/prototype/S15.11.4_A1.js Pass +test/built-ins/Error/prototype/S15.11.4_A2.js Pass test/built-ins/Error/prototype/S15.11.4_A3.js Fail test/built-ins/Error/prototype/S15.11.4_A4.js Pass -test/built-ins/Error/prototype/constructor/S15.11.4.1_A1_T2.js RuntimeError +test/built-ins/Error/prototype/constructor/S15.11.4.1_A1_T2.js Fail test/built-ins/Error/prototype/constructor/prop-desc.js TypeCheckError test/built-ins/Error/prototype/message/prop-desc.js TypeCheckError test/built-ins/Error/prototype/name/prop-desc.js TypeCheckError -test/built-ins/Error/prototype/no-error-data.js Fail +test/built-ins/Error/prototype/no-error-data.js Pass test/built-ins/Error/prototype/toString/15.11.4.4-10-1.js Pass test/built-ins/Error/prototype/toString/15.11.4.4-6-1.js Pass test/built-ins/Error/prototype/toString/15.11.4.4-6-2.js Pass @@ -3177,15 +3177,15 @@ test/built-ins/Error/prototype/toString/15.11.4.4-8-2.js Pass test/built-ins/Error/prototype/toString/15.11.4.4-9-1.js Pass test/built-ins/Error/prototype/toString/S15.11.4.4_A2.js Pass test/built-ins/Error/prototype/toString/called-as-function.js RuntimeError -test/built-ins/Error/prototype/toString/invalid-receiver.js Fail +test/built-ins/Error/prototype/toString/invalid-receiver.js RuntimeError test/built-ins/Error/prototype/toString/length.js TypeCheckError test/built-ins/Error/prototype/toString/name.js TypeCheckError -test/built-ins/Error/prototype/toString/not-a-constructor.js Fail +test/built-ins/Error/prototype/toString/not-a-constructor.js Pass test/built-ins/Error/prototype/toString/prop-desc.js TypeCheckError -test/built-ins/Error/prototype/toString/tostring-get-throws.js Fail -test/built-ins/Error/prototype/toString/tostring-message-throws-symbol.js Fail +test/built-ins/Error/prototype/toString/tostring-get-throws.js Pass +test/built-ins/Error/prototype/toString/tostring-message-throws-symbol.js Pass test/built-ins/Error/prototype/toString/tostring-message-throws-toprimitive.js Fail -test/built-ins/Error/prototype/toString/undefined-props.js Fail +test/built-ins/Error/prototype/toString/undefined-props.js Pass test/built-ins/Error/the-initial-value-of-errorprototypemessage-is-the-empty-string.js TypeCheckError test/built-ins/Error/tostring-1.js Fail test/built-ins/Error/tostring-2.js Fail @@ -3305,7 +3305,7 @@ test/built-ins/JSON/stringify/replacer-array-proxy-revoked.js Fail test/built-ins/JSON/stringify/replacer-array-proxy.js Fail test/built-ins/JSON/stringify/replacer-array-string-object.js Fail test/built-ins/JSON/stringify/replacer-array-undefined.js Pass -test/built-ins/JSON/stringify/replacer-array-wrong-type.js Fail +test/built-ins/JSON/stringify/replacer-array-wrong-type.js Pass test/built-ins/JSON/stringify/replacer-function-abrupt.js Pass test/built-ins/JSON/stringify/replacer-function-arguments.js RuntimeError test/built-ins/JSON/stringify/replacer-function-array-circular.js Pass @@ -3349,7 +3349,7 @@ test/built-ins/JSON/stringify/value-string-escape-unicode.js Pass test/built-ins/JSON/stringify/value-string-object.js Fail test/built-ins/JSON/stringify/value-symbol.js Pass test/built-ins/JSON/stringify/value-tojson-abrupt.js Pass -test/built-ins/JSON/stringify/value-tojson-arguments.js Fail +test/built-ins/JSON/stringify/value-tojson-arguments.js Pass test/built-ins/JSON/stringify/value-tojson-array-circular.js Fail test/built-ins/JSON/stringify/value-tojson-not-function.js Pass test/built-ins/JSON/stringify/value-tojson-object-circular.js TypeCheckError @@ -3924,7 +3924,7 @@ test/built-ins/Number/prototype/toString/S15.7.4.2_A3_T01.js Pass test/built-ins/Number/prototype/toString/S15.7.4.2_A3_T02.js Pass test/built-ins/Number/prototype/toString/S15.7.4.2_A3_T03.js Pass test/built-ins/Number/prototype/toString/S15.7.4.2_A3_T04.js Pass -test/built-ins/Number/prototype/toString/S15.7.4.2_A4_T01.js Fail +test/built-ins/Number/prototype/toString/S15.7.4.2_A4_T01.js Pass test/built-ins/Number/prototype/toString/S15.7.4.2_A4_T02.js Pass test/built-ins/Number/prototype/toString/S15.7.4.2_A4_T03.js TypeCheckError test/built-ins/Number/prototype/toString/S15.7.4.2_A4_T04.js Pass @@ -3975,7 +3975,7 @@ test/built-ins/Number/prototype/toString/numeric-literal-tostring-radix-poisoned test/built-ins/Number/prototype/toString/prop-desc.js TypeCheckError test/built-ins/Number/prototype/valueOf/S15.7.4.4_A1_T01.js Pass test/built-ins/Number/prototype/valueOf/S15.7.4.4_A1_T02.js Pass -test/built-ins/Number/prototype/valueOf/S15.7.4.4_A2_T01.js Fail +test/built-ins/Number/prototype/valueOf/S15.7.4.4_A2_T01.js Pass test/built-ins/Number/prototype/valueOf/S15.7.4.4_A2_T02.js Pass test/built-ins/Number/prototype/valueOf/S15.7.4.4_A2_T03.js TypeCheckError test/built-ins/Number/prototype/valueOf/S15.7.4.4_A2_T04.js Pass @@ -4021,11 +4021,11 @@ test/built-ins/Number/string-numeric-separator-literal-sign-minus-dds-nsl-dd.js test/built-ins/Number/string-numeric-separator-literal-sign-plus-dds-nsl-dd.js Pass test/built-ins/Number/string-octal-literal-invald.js Pass test/built-ins/Number/string-octal-literal.js Pass -test/built-ins/String/15.5.5.5.2-1-1.js Fail +test/built-ins/String/15.5.5.5.2-1-1.js Pass test/built-ins/String/15.5.5.5.2-1-2.js Pass test/built-ins/String/15.5.5.5.2-3-1.js Pass test/built-ins/String/15.5.5.5.2-3-2.js Pass -test/built-ins/String/15.5.5.5.2-3-3.js Fail +test/built-ins/String/15.5.5.5.2-3-3.js Pass test/built-ins/String/15.5.5.5.2-3-4.js Pass test/built-ins/String/15.5.5.5.2-3-5.js Pass test/built-ins/String/15.5.5.5.2-3-6.js Fail @@ -4063,18 +4063,18 @@ test/built-ins/String/S15.5.2.1_A1_T13.js TypeCheckError test/built-ins/String/S15.5.2.1_A1_T16.js Fail test/built-ins/String/S15.5.2.1_A1_T17.js Fail test/built-ins/String/S15.5.2.1_A1_T18.js Fail -test/built-ins/String/S15.5.2.1_A1_T19.js Fail +test/built-ins/String/S15.5.2.1_A1_T19.js Pass test/built-ins/String/S15.5.2.1_A1_T2.js Fail test/built-ins/String/S15.5.2.1_A1_T3.js Fail -test/built-ins/String/S15.5.2.1_A1_T4.js Fail +test/built-ins/String/S15.5.2.1_A1_T4.js Pass test/built-ins/String/S15.5.2.1_A1_T5.js TypeCheckError test/built-ins/String/S15.5.2.1_A1_T6.js Fail test/built-ins/String/S15.5.2.1_A1_T7.js Fail test/built-ins/String/S15.5.2.1_A1_T8.js TypeCheckError -test/built-ins/String/S15.5.2.1_A1_T9.js Fail -test/built-ins/String/S15.5.2.1_A2_T1.js Fail -test/built-ins/String/S15.5.2.1_A2_T2.js Fail -test/built-ins/String/S15.5.2.1_A3.js Fail +test/built-ins/String/S15.5.2.1_A1_T9.js Pass +test/built-ins/String/S15.5.2.1_A2_T1.js Pass +test/built-ins/String/S15.5.2.1_A2_T2.js Pass +test/built-ins/String/S15.5.2.1_A3.js Pass test/built-ins/String/S15.5.3_A1.js Pass test/built-ins/String/S15.5.3_A2_T1.js TypeCheckError test/built-ins/String/S15.5.3_A2_T2.js TypeCheckError @@ -4087,7 +4087,7 @@ test/built-ins/String/S15.5.5.1_A5.js Fail test/built-ins/String/S15.5.5_A1_T1.js Fail test/built-ins/String/S15.5.5_A1_T2.js Fail test/built-ins/String/S15.5.5_A2_T1.js Pass -test/built-ins/String/S15.5.5_A2_T2.js ParseError +test/built-ins/String/S15.5.5_A2_T2.js Pass test/built-ins/String/S8.12.8_A1.js Pass test/built-ins/String/S8.12.8_A2.js Pass test/built-ins/String/S9.1_A1_T2.js TypeCheckError @@ -4201,10 +4201,10 @@ test/built-ins/String/prototype/charCodeAt/S15.5.4.5_A1_T10.js TypeCheckError test/built-ins/String/prototype/charCodeAt/S15.5.4.5_A1_T2.js TypeCheckError test/built-ins/String/prototype/charCodeAt/S15.5.4.5_A1_T4.js TypeCheckError test/built-ins/String/prototype/charCodeAt/S15.5.4.5_A1_T5.js TypeCheckError -test/built-ins/String/prototype/charCodeAt/S15.5.4.5_A1_T6.js RuntimeError +test/built-ins/String/prototype/charCodeAt/S15.5.4.5_A1_T6.js Pass test/built-ins/String/prototype/charCodeAt/S15.5.4.5_A1_T7.js RuntimeError test/built-ins/String/prototype/charCodeAt/S15.5.4.5_A1_T8.js RuntimeError -test/built-ins/String/prototype/charCodeAt/S15.5.4.5_A1_T9.js RuntimeError +test/built-ins/String/prototype/charCodeAt/S15.5.4.5_A1_T9.js Pass test/built-ins/String/prototype/charCodeAt/S15.5.4.5_A2.js Pass test/built-ins/String/prototype/charCodeAt/S15.5.4.5_A3.js Pass test/built-ins/String/prototype/charCodeAt/S15.5.4.5_A4.js Pass @@ -4246,7 +4246,7 @@ test/built-ins/String/prototype/concat/S15.5.4.6_A1_T7.js Pass test/built-ins/String/prototype/concat/S15.5.4.6_A1_T8.js Pass test/built-ins/String/prototype/concat/S15.5.4.6_A1_T9.js Pass test/built-ins/String/prototype/concat/S15.5.4.6_A2.js Pass -test/built-ins/String/prototype/concat/S15.5.4.6_A3.js Pass +test/built-ins/String/prototype/concat/S15.5.4.6_A3.js Fail test/built-ins/String/prototype/concat/S15.5.4.6_A4_T1.js TypeCheckError test/built-ins/String/prototype/concat/S15.5.4.6_A4_T2.js TypeCheckError test/built-ins/String/prototype/concat/S15.5.4.6_A6.js Pass @@ -4323,7 +4323,7 @@ test/built-ins/String/prototype/indexOf/S15.5.4.7_A1_T5.js TypeCheckError test/built-ins/String/prototype/indexOf/S15.5.4.7_A1_T6.js RuntimeError test/built-ins/String/prototype/indexOf/S15.5.4.7_A1_T7.js RuntimeError test/built-ins/String/prototype/indexOf/S15.5.4.7_A1_T8.js RuntimeError -test/built-ins/String/prototype/indexOf/S15.5.4.7_A1_T9.js RuntimeError +test/built-ins/String/prototype/indexOf/S15.5.4.7_A1_T9.js Pass test/built-ins/String/prototype/indexOf/S15.5.4.7_A2_T1.js Pass test/built-ins/String/prototype/indexOf/S15.5.4.7_A2_T2.js Pass test/built-ins/String/prototype/indexOf/S15.5.4.7_A2_T3.js Pass @@ -4338,10 +4338,10 @@ test/built-ins/String/prototype/indexOf/S15.5.4.7_A4_T4.js Pass test/built-ins/String/prototype/indexOf/S15.5.4.7_A4_T5.js Pass test/built-ins/String/prototype/indexOf/S15.5.4.7_A5_T1.js Pass test/built-ins/String/prototype/indexOf/S15.5.4.7_A5_T2.js Pass -test/built-ins/String/prototype/indexOf/S15.5.4.7_A5_T3.js Pass +test/built-ins/String/prototype/indexOf/S15.5.4.7_A5_T3.js Fail test/built-ins/String/prototype/indexOf/S15.5.4.7_A5_T4.js Pass test/built-ins/String/prototype/indexOf/S15.5.4.7_A5_T5.js Pass -test/built-ins/String/prototype/indexOf/S15.5.4.7_A5_T6.js Pass +test/built-ins/String/prototype/indexOf/S15.5.4.7_A5_T6.js Fail test/built-ins/String/prototype/indexOf/S15.5.4.7_A6.js Pass test/built-ins/String/prototype/indexOf/S15.5.4.7_A7.js Pass test/built-ins/String/prototype/indexOf/S15.5.4.7_A8.js Pass @@ -4375,7 +4375,7 @@ test/built-ins/String/prototype/lastIndexOf/S15.5.4.8_A1_T12.js Pass test/built-ins/String/prototype/lastIndexOf/S15.5.4.8_A1_T2.js Pass test/built-ins/String/prototype/lastIndexOf/S15.5.4.8_A1_T4.js TypeCheckError test/built-ins/String/prototype/lastIndexOf/S15.5.4.8_A1_T5.js TypeCheckError -test/built-ins/String/prototype/lastIndexOf/S15.5.4.8_A1_T6.js Fail +test/built-ins/String/prototype/lastIndexOf/S15.5.4.8_A1_T6.js RuntimeError test/built-ins/String/prototype/lastIndexOf/S15.5.4.8_A1_T7.js Pass test/built-ins/String/prototype/lastIndexOf/S15.5.4.8_A1_T8.js Pass test/built-ins/String/prototype/lastIndexOf/S15.5.4.8_A1_T9.js Pass @@ -4407,13 +4407,13 @@ test/built-ins/String/prototype/localeCompare/not-a-constructor.js Pass test/built-ins/String/prototype/localeCompare/this-value-not-obj-coercible.js Pass test/built-ins/String/prototype/match/S15.5.4.10_A1_T10.js Pass test/built-ins/String/prototype/match/S15.5.4.10_A1_T11.js Pass -test/built-ins/String/prototype/match/S15.5.4.10_A1_T12.js Pass +test/built-ins/String/prototype/match/S15.5.4.10_A1_T12.js Fail test/built-ins/String/prototype/match/S15.5.4.10_A1_T13.js Pass test/built-ins/String/prototype/match/S15.5.4.10_A1_T14.js Pass test/built-ins/String/prototype/match/S15.5.4.10_A1_T3.js TypeCheckError test/built-ins/String/prototype/match/S15.5.4.10_A1_T4.js Fail test/built-ins/String/prototype/match/S15.5.4.10_A1_T5.js Pass -test/built-ins/String/prototype/match/S15.5.4.10_A1_T6.js Pass +test/built-ins/String/prototype/match/S15.5.4.10_A1_T6.js Fail test/built-ins/String/prototype/match/S15.5.4.10_A1_T7.js Fail test/built-ins/String/prototype/match/S15.5.4.10_A1_T8.js Fail test/built-ins/String/prototype/match/S15.5.4.10_A1_T9.js Fail @@ -4643,7 +4643,7 @@ test/built-ins/String/prototype/search/S15.5.4.12_A11.js Pass test/built-ins/String/prototype/search/S15.5.4.12_A1_T1.js Fail test/built-ins/String/prototype/search/S15.5.4.12_A1_T10.js Pass test/built-ins/String/prototype/search/S15.5.4.12_A1_T11.js Pass -test/built-ins/String/prototype/search/S15.5.4.12_A1_T12.js Pass +test/built-ins/String/prototype/search/S15.5.4.12_A1_T12.js Fail test/built-ins/String/prototype/search/S15.5.4.12_A1_T13.js Pass test/built-ins/String/prototype/search/S15.5.4.12_A1_T14.js Pass test/built-ins/String/prototype/search/S15.5.4.12_A1_T2.js Fail @@ -4652,14 +4652,14 @@ test/built-ins/String/prototype/search/S15.5.4.12_A1_T5.js Pass test/built-ins/String/prototype/search/S15.5.4.12_A1_T6.js Fail test/built-ins/String/prototype/search/S15.5.4.12_A1_T7.js Pass test/built-ins/String/prototype/search/S15.5.4.12_A1_T8.js Pass -test/built-ins/String/prototype/search/S15.5.4.12_A1_T9.js Pass -test/built-ins/String/prototype/search/S15.5.4.12_A2_T1.js Pass -test/built-ins/String/prototype/search/S15.5.4.12_A2_T2.js Pass -test/built-ins/String/prototype/search/S15.5.4.12_A2_T3.js Pass -test/built-ins/String/prototype/search/S15.5.4.12_A2_T4.js Pass -test/built-ins/String/prototype/search/S15.5.4.12_A2_T5.js Pass -test/built-ins/String/prototype/search/S15.5.4.12_A2_T6.js Pass -test/built-ins/String/prototype/search/S15.5.4.12_A2_T7.js Pass +test/built-ins/String/prototype/search/S15.5.4.12_A1_T9.js Fail +test/built-ins/String/prototype/search/S15.5.4.12_A2_T1.js Fail +test/built-ins/String/prototype/search/S15.5.4.12_A2_T2.js Fail +test/built-ins/String/prototype/search/S15.5.4.12_A2_T3.js Fail +test/built-ins/String/prototype/search/S15.5.4.12_A2_T4.js Fail +test/built-ins/String/prototype/search/S15.5.4.12_A2_T5.js Fail +test/built-ins/String/prototype/search/S15.5.4.12_A2_T6.js Fail +test/built-ins/String/prototype/search/S15.5.4.12_A2_T7.js Fail test/built-ins/String/prototype/search/S15.5.4.12_A3_T1.js Pass test/built-ins/String/prototype/search/S15.5.4.12_A3_T2.js Pass test/built-ins/String/prototype/search/S15.5.4.12_A6.js Pass @@ -4673,7 +4673,7 @@ test/built-ins/String/prototype/search/cstm-search-on-bigint-primitive.js TypeCh test/built-ins/String/prototype/search/cstm-search-on-boolean-primitive.js RuntimeError test/built-ins/String/prototype/search/cstm-search-on-number-primitive.js RuntimeError test/built-ins/String/prototype/search/cstm-search-on-string-primitive.js RuntimeError -test/built-ins/String/prototype/search/invoke-builtin-search-searcher-undef.js Fail +test/built-ins/String/prototype/search/invoke-builtin-search-searcher-undef.js RuntimeError test/built-ins/String/prototype/search/invoke-builtin-search.js Fail test/built-ins/String/prototype/search/name.js TypeCheckError test/built-ins/String/prototype/search/not-a-constructor.js Pass @@ -4718,37 +4718,37 @@ test/built-ins/String/prototype/slice/not-a-constructor.js Pass test/built-ins/String/prototype/slice/this-value-not-obj-coercible.js Pass test/built-ins/String/prototype/slice/this-value-tostring-throws-symbol.js Pass test/built-ins/String/prototype/slice/this-value-tostring-throws-toprimitive.js Fail -test/built-ins/String/prototype/split/argument-is-new-reg-exp-and-instance-is-string-hello.js Pass +test/built-ins/String/prototype/split/argument-is-new-reg-exp-and-instance-is-string-hello.js Fail test/built-ins/String/prototype/split/argument-is-null-and-instance-is-function-call-that-returned-string.js TypeCheckError -test/built-ins/String/prototype/split/argument-is-reg-exp-a-z-and-instance-is-string-abc.js Pass -test/built-ins/String/prototype/split/argument-is-regexp-a-z-and-instance-is-string-abc.js Pass +test/built-ins/String/prototype/split/argument-is-reg-exp-a-z-and-instance-is-string-abc.js Fail +test/built-ins/String/prototype/split/argument-is-regexp-a-z-and-instance-is-string-abc.js Fail test/built-ins/String/prototype/split/argument-is-regexp-and-instance-is-number.js Fail -test/built-ins/String/prototype/split/argument-is-regexp-d-and-instance-is-string-dfe23iu-34-65.js Pass -test/built-ins/String/prototype/split/argument-is-regexp-l-and-instance-is-string-hello.js Pass -test/built-ins/String/prototype/split/argument-is-regexp-reg-exp-d-and-instance-is-string-dfe23iu-34-65.js Pass -test/built-ins/String/prototype/split/argument-is-regexp-s-and-instance-is-string-a-b-c-de-f.js Pass +test/built-ins/String/prototype/split/argument-is-regexp-d-and-instance-is-string-dfe23iu-34-65.js Fail +test/built-ins/String/prototype/split/argument-is-regexp-l-and-instance-is-string-hello.js Fail +test/built-ins/String/prototype/split/argument-is-regexp-reg-exp-d-and-instance-is-string-dfe23iu-34-65.js Fail +test/built-ins/String/prototype/split/argument-is-regexp-s-and-instance-is-string-a-b-c-de-f.js Fail test/built-ins/String/prototype/split/argument-is-regexp-x-and-instance-is-string-a-b-c-de-f.js Pass test/built-ins/String/prototype/split/argument-is-undefined-and-instance-is-string.js Pass test/built-ins/String/prototype/split/argument-is-void-0-and-instance-is-string-object-object-have-overrided-to-string-function.js Pass test/built-ins/String/prototype/split/arguments-are-boolean-expression-function-call-and-null-and-instance-is-boolean.js Fail test/built-ins/String/prototype/split/arguments-are-false-and-true-and-instance-is-object.js Fail -test/built-ins/String/prototype/split/arguments-are-new-reg-exp-and-0-and-instance-is-string-hello.js Pass -test/built-ins/String/prototype/split/arguments-are-new-reg-exp-and-1-and-instance-is-string-hello.js Pass -test/built-ins/String/prototype/split/arguments-are-new-reg-exp-and-2-and-instance-is-string-hello.js Pass -test/built-ins/String/prototype/split/arguments-are-new-reg-exp-and-3-and-instance-is-string-hello.js Pass -test/built-ins/String/prototype/split/arguments-are-new-reg-exp-and-4-and-instance-is-string-hello.js Pass +test/built-ins/String/prototype/split/arguments-are-new-reg-exp-and-0-and-instance-is-string-hello.js Fail +test/built-ins/String/prototype/split/arguments-are-new-reg-exp-and-1-and-instance-is-string-hello.js Fail +test/built-ins/String/prototype/split/arguments-are-new-reg-exp-and-2-and-instance-is-string-hello.js Fail +test/built-ins/String/prototype/split/arguments-are-new-reg-exp-and-3-and-instance-is-string-hello.js Fail +test/built-ins/String/prototype/split/arguments-are-new-reg-exp-and-4-and-instance-is-string-hello.js Fail test/built-ins/String/prototype/split/arguments-are-new-reg-exp-and-hi-and-instance-is-string-hello.js Fail -test/built-ins/String/prototype/split/arguments-are-new-reg-exp-and-undefined-and-instance-is-string-hello.js Pass -test/built-ins/String/prototype/split/arguments-are-new-reg-exp-and-void-0-and-instance-is-string-hello.js Pass -test/built-ins/String/prototype/split/arguments-are-regexp-l-and-0-and-instance-is-string-hello.js Pass -test/built-ins/String/prototype/split/arguments-are-regexp-l-and-1-and-instance-is-string-hello.js Pass -test/built-ins/String/prototype/split/arguments-are-regexp-l-and-2-and-instance-is-string-hello.js Pass -test/built-ins/String/prototype/split/arguments-are-regexp-l-and-3-and-instance-is-string-hello.js Pass -test/built-ins/String/prototype/split/arguments-are-regexp-l-and-4-and-instance-is-string-hello.js Pass +test/built-ins/String/prototype/split/arguments-are-new-reg-exp-and-undefined-and-instance-is-string-hello.js Fail +test/built-ins/String/prototype/split/arguments-are-new-reg-exp-and-void-0-and-instance-is-string-hello.js Fail +test/built-ins/String/prototype/split/arguments-are-regexp-l-and-0-and-instance-is-string-hello.js Fail +test/built-ins/String/prototype/split/arguments-are-regexp-l-and-1-and-instance-is-string-hello.js Fail +test/built-ins/String/prototype/split/arguments-are-regexp-l-and-2-and-instance-is-string-hello.js Fail +test/built-ins/String/prototype/split/arguments-are-regexp-l-and-3-and-instance-is-string-hello.js Fail +test/built-ins/String/prototype/split/arguments-are-regexp-l-and-4-and-instance-is-string-hello.js Fail test/built-ins/String/prototype/split/arguments-are-regexp-l-and-hi-and-instance-is-string-hello.js Fail -test/built-ins/String/prototype/split/arguments-are-regexp-l-and-undefined-and-instance-is-string-hello.js Pass -test/built-ins/String/prototype/split/arguments-are-regexp-l-and-void-0-and-instance-is-string-hello.js Pass -test/built-ins/String/prototype/split/arguments-are-regexp-s-and-3-and-instance-is-string-a-b-c-de-f.js Pass +test/built-ins/String/prototype/split/arguments-are-regexp-l-and-undefined-and-instance-is-string-hello.js Fail +test/built-ins/String/prototype/split/arguments-are-regexp-l-and-void-0-and-instance-is-string-hello.js Fail +test/built-ins/String/prototype/split/arguments-are-regexp-s-and-3-and-instance-is-string-a-b-c-de-f.js Fail test/built-ins/String/prototype/split/call-split-1-0-instance-is-number.js Fail test/built-ins/String/prototype/split/call-split-1-1-instance-is-number.js Fail test/built-ins/String/prototype/split/call-split-1-100-instance-is-number.js Pass @@ -4758,7 +4758,7 @@ test/built-ins/String/prototype/split/call-split-1-instance-is-number.js Pass test/built-ins/String/prototype/split/call-split-1-math-pow-2-32-1-instance-is-number.js TypeCheckError test/built-ins/String/prototype/split/call-split-1-void-0-instance-is-number.js Pass test/built-ins/String/prototype/split/call-split-123-instance-is-this123is123a123string123object.js TypeCheckError -test/built-ins/String/prototype/split/call-split-2-instance-is-string-one-two-three-four-five.js Pass +test/built-ins/String/prototype/split/call-split-2-instance-is-string-one-two-three-four-five.js Fail test/built-ins/String/prototype/split/call-split-4-instance-is-string-one-1-two-2-four-4.js Pass test/built-ins/String/prototype/split/call-split-h-instance-is-string-hello.js Pass test/built-ins/String/prototype/split/call-split-hello-instance-is-string-hello.js Pass @@ -4768,15 +4768,15 @@ test/built-ins/String/prototype/split/call-split-instance-is-string-one-1-two-2- test/built-ins/String/prototype/split/call-split-instance-is-string-one-two-three-four-five.js Pass test/built-ins/String/prototype/split/call-split-instance-is-string-one-two-three.js Pass test/built-ins/String/prototype/split/call-split-instance-is-string.js Pass -test/built-ins/String/prototype/split/call-split-l-0-instance-is-string-hello.js Pass -test/built-ins/String/prototype/split/call-split-l-1-instance-is-string-hello.js Pass -test/built-ins/String/prototype/split/call-split-l-2-instance-is-string-hello.js Pass +test/built-ins/String/prototype/split/call-split-l-0-instance-is-string-hello.js Fail +test/built-ins/String/prototype/split/call-split-l-1-instance-is-string-hello.js Fail +test/built-ins/String/prototype/split/call-split-l-2-instance-is-string-hello.js Fail test/built-ins/String/prototype/split/call-split-l-3-instance-is-string-hello.js Pass test/built-ins/String/prototype/split/call-split-l-4-instance-is-string-hello.js Pass test/built-ins/String/prototype/split/call-split-l-instance-is-string-hello.js Pass test/built-ins/String/prototype/split/call-split-l-na-n-instance-is-string-hello.js Fail test/built-ins/String/prototype/split/call-split-ll-instance-is-string-hello.js Pass -test/built-ins/String/prototype/split/call-split-new-reg-exp.js Pass +test/built-ins/String/prototype/split/call-split-new-reg-exp.js Fail test/built-ins/String/prototype/split/call-split-null-instance-is-thisnullisnullanullstringnullobject.js TypeCheckError test/built-ins/String/prototype/split/call-split-o-instance-is-string-hello.js Pass test/built-ins/String/prototype/split/call-split-on-instance-is-string-one-1-two-2-four-4.js Pass @@ -4805,12 +4805,12 @@ test/built-ins/String/prototype/split/instance-is-array-1-2-3-4-5.js Pass test/built-ins/String/prototype/split/instance-is-boolean.js Pass test/built-ins/String/prototype/split/instance-is-function.js TypeCheckError test/built-ins/String/prototype/split/instance-is-math.js Pass -test/built-ins/String/prototype/split/instance-is-new-string.js Fail +test/built-ins/String/prototype/split/instance-is-new-string.js Pass test/built-ins/String/prototype/split/instance-is-number-1234567890.js Pass test/built-ins/String/prototype/split/instance-is-number-1e21.js Pass test/built-ins/String/prototype/split/instance-is-number-na-n.js Pass test/built-ins/String/prototype/split/instance-is-object.js Pass -test/built-ins/String/prototype/split/instance-is-string-one-two-three-four-five.js Fail +test/built-ins/String/prototype/split/instance-is-string-one-two-three-four-five.js Pass test/built-ins/String/prototype/split/instance-is-string.js Pass test/built-ins/String/prototype/split/limit-touint32-error.js TypeCheckError test/built-ins/String/prototype/split/name.js TypeCheckError @@ -4820,12 +4820,12 @@ test/built-ins/String/prototype/split/separator-comma-instance-is-string-one-two test/built-ins/String/prototype/split/separator-empty-string-instance-is-string.js Pass test/built-ins/String/prototype/split/separator-number-limit-math-pow-2-32-1-instance-is-number.js Pass test/built-ins/String/prototype/split/separator-override-tostring-limit-override-valueof-throws.js TypeCheckError -test/built-ins/String/prototype/split/separator-override-tostring-limit-override-valueof-tostring-throws.js Pass +test/built-ins/String/prototype/split/separator-override-tostring-limit-override-valueof-tostring-throws.js Fail test/built-ins/String/prototype/split/separator-override-tostring-limit-override-valueof-tostring.js TypeCheckError test/built-ins/String/prototype/split/separator-override-tostring-limit-override-valueof.js TypeCheckError test/built-ins/String/prototype/split/separator-override-tostring-throws-limit-override-valueof-throws.js Fail -test/built-ins/String/prototype/split/separator-override-valueof.js Pass -test/built-ins/String/prototype/split/separator-regexp-comma-instance-is-string-one-1-two-2-four-4.js Pass +test/built-ins/String/prototype/split/separator-override-valueof.js Fail +test/built-ins/String/prototype/split/separator-regexp-comma-instance-is-string-one-1-two-2-four-4.js Fail test/built-ins/String/prototype/split/separator-regexp-limit-string-via-eval.js TypeCheckError test/built-ins/String/prototype/split/separator-regexp.js RuntimeError test/built-ins/String/prototype/split/separator-string-instance-is-empty-string-object.js Pass @@ -4976,7 +4976,7 @@ test/built-ins/String/prototype/toLowerCase/S15.5.4.16_A1_T6.js Pass test/built-ins/String/prototype/toLowerCase/S15.5.4.16_A1_T7.js Pass test/built-ins/String/prototype/toLowerCase/S15.5.4.16_A1_T8.js Pass test/built-ins/String/prototype/toLowerCase/S15.5.4.16_A1_T9.js TypeCheckError -test/built-ins/String/prototype/toLowerCase/S15.5.4.16_A2_T1.js Fail +test/built-ins/String/prototype/toLowerCase/S15.5.4.16_A2_T1.js Pass test/built-ins/String/prototype/toLowerCase/S15.5.4.16_A6.js Pass test/built-ins/String/prototype/toLowerCase/S15.5.4.16_A7.js Pass test/built-ins/String/prototype/toLowerCase/S15.5.4.16_A8.js Pass @@ -5012,7 +5012,7 @@ test/built-ins/String/prototype/toUpperCase/S15.5.4.18_A1_T6.js Pass test/built-ins/String/prototype/toUpperCase/S15.5.4.18_A1_T7.js Pass test/built-ins/String/prototype/toUpperCase/S15.5.4.18_A1_T8.js Pass test/built-ins/String/prototype/toUpperCase/S15.5.4.18_A1_T9.js TypeCheckError -test/built-ins/String/prototype/toUpperCase/S15.5.4.18_A2_T1.js Fail +test/built-ins/String/prototype/toUpperCase/S15.5.4.18_A2_T1.js Pass test/built-ins/String/prototype/toUpperCase/S15.5.4.18_A6.js Pass test/built-ins/String/prototype/toUpperCase/S15.5.4.18_A7.js Pass test/built-ins/String/prototype/toUpperCase/S15.5.4.18_A8.js Pass @@ -5247,59 +5247,59 @@ test/built-ins/String/symbol-wrapping.js Pass test/language/expressions/new/S11.2.2_A1.1.js TypeCheckError test/language/expressions/new/S11.2.2_A1.2.js TypeCheckError test/language/expressions/new/S11.2.2_A2.js TypeCheckError -test/language/expressions/new/S11.2.2_A3_T1.js ParseError -test/language/expressions/new/S11.2.2_A3_T2.js ParseError -test/language/expressions/new/S11.2.2_A3_T3.js ParseError -test/language/expressions/new/S11.2.2_A3_T4.js TypeCheckError -test/language/expressions/new/S11.2.2_A3_T5.js ParseError -test/language/expressions/new/S11.2.2_A4_T1.js ParseError -test/language/expressions/new/S11.2.2_A4_T2.js ParseError -test/language/expressions/new/S11.2.2_A4_T3.js ParseError +test/language/expressions/new/S11.2.2_A3_T1.js Pass +test/language/expressions/new/S11.2.2_A3_T2.js Pass +test/language/expressions/new/S11.2.2_A3_T3.js Pass +test/language/expressions/new/S11.2.2_A3_T4.js Pass +test/language/expressions/new/S11.2.2_A3_T5.js Pass +test/language/expressions/new/S11.2.2_A4_T1.js Pass +test/language/expressions/new/S11.2.2_A4_T2.js Pass +test/language/expressions/new/S11.2.2_A4_T3.js Pass test/language/expressions/new/S11.2.2_A4_T4.js Pass -test/language/expressions/new/S11.2.2_A4_T5.js ParseError +test/language/expressions/new/S11.2.2_A4_T5.js Pass test/language/expressions/new/ctorExpr-fn-ref-before-args-eval-fn-wrapup.js TypeCheckError test/language/expressions/new/ctorExpr-fn-ref-before-args-eval.js TypeCheckError test/language/expressions/new/ctorExpr-isCtor-after-args-eval-fn-wrapup.js TypeCheckError -test/language/expressions/new/ctorExpr-isCtor-after-args-eval.js TypeCheckError +test/language/expressions/new/ctorExpr-isCtor-after-args-eval.js Pass test/language/expressions/new/non-ctor-err-realm.js TypeCheckError -test/language/expressions/new/spread-err-mult-err-expr-throws.js ParseError -test/language/expressions/new/spread-err-mult-err-iter-get-value.js ParseError -test/language/expressions/new/spread-err-mult-err-itr-get-call.js ParseError -test/language/expressions/new/spread-err-mult-err-itr-get-get.js ParseError -test/language/expressions/new/spread-err-mult-err-itr-step.js ParseError -test/language/expressions/new/spread-err-mult-err-itr-value.js ParseError -test/language/expressions/new/spread-err-mult-err-obj-unresolvable.js ParseError -test/language/expressions/new/spread-err-mult-err-unresolvable.js ParseError -test/language/expressions/new/spread-err-sngl-err-expr-throws.js ParseError -test/language/expressions/new/spread-err-sngl-err-itr-get-call.js ParseError -test/language/expressions/new/spread-err-sngl-err-itr-get-get.js ParseError -test/language/expressions/new/spread-err-sngl-err-itr-get-value.js ParseError -test/language/expressions/new/spread-err-sngl-err-itr-step.js ParseError -test/language/expressions/new/spread-err-sngl-err-itr-value.js ParseError -test/language/expressions/new/spread-err-sngl-err-obj-unresolvable.js ParseError -test/language/expressions/new/spread-err-sngl-err-unresolvable.js ParseError -test/language/expressions/new/spread-mult-empty.js ParseError -test/language/expressions/new/spread-mult-expr.js ParseError -test/language/expressions/new/spread-mult-iter.js ParseError -test/language/expressions/new/spread-mult-literal.js ParseError -test/language/expressions/new/spread-mult-obj-ident.js ParseError -test/language/expressions/new/spread-mult-obj-null.js ParseError -test/language/expressions/new/spread-mult-obj-undefined.js ParseError -test/language/expressions/new/spread-obj-getter-descriptor.js ParseError -test/language/expressions/new/spread-obj-getter-init.js ParseError -test/language/expressions/new/spread-obj-manipulate-outter-obj-in-getter.js ParseError -test/language/expressions/new/spread-obj-mult-spread-getter.js ParseError -test/language/expressions/new/spread-obj-mult-spread.js ParseError -test/language/expressions/new/spread-obj-null.js ParseError -test/language/expressions/new/spread-obj-override-immutable.js ParseError -test/language/expressions/new/spread-obj-overrides-prev-properties.js ParseError -test/language/expressions/new/spread-obj-skip-non-enumerable.js ParseError -test/language/expressions/new/spread-obj-spread-order.js ParseError -test/language/expressions/new/spread-obj-symbol-property.js ParseError -test/language/expressions/new/spread-obj-undefined.js ParseError -test/language/expressions/new/spread-obj-with-overrides.js ParseError -test/language/expressions/new/spread-sngl-empty.js ParseError -test/language/expressions/new/spread-sngl-expr.js ParseError -test/language/expressions/new/spread-sngl-iter.js ParseError -test/language/expressions/new/spread-sngl-literal.js ParseError -test/language/expressions/new/spread-sngl-obj-ident.js ParseError +test/language/expressions/new/spread-err-mult-err-expr-throws.js Pass +test/language/expressions/new/spread-err-mult-err-iter-get-value.js Pass +test/language/expressions/new/spread-err-mult-err-itr-get-call.js TypeCheckError +test/language/expressions/new/spread-err-mult-err-itr-get-get.js Fail +test/language/expressions/new/spread-err-mult-err-itr-step.js TypeCheckError +test/language/expressions/new/spread-err-mult-err-itr-value.js TypeCheckError +test/language/expressions/new/spread-err-mult-err-obj-unresolvable.js TypeCheckError +test/language/expressions/new/spread-err-mult-err-unresolvable.js TypeCheckError +test/language/expressions/new/spread-err-sngl-err-expr-throws.js Pass +test/language/expressions/new/spread-err-sngl-err-itr-get-call.js TypeCheckError +test/language/expressions/new/spread-err-sngl-err-itr-get-get.js Fail +test/language/expressions/new/spread-err-sngl-err-itr-get-value.js TypeCheckError +test/language/expressions/new/spread-err-sngl-err-itr-step.js TypeCheckError +test/language/expressions/new/spread-err-sngl-err-itr-value.js TypeCheckError +test/language/expressions/new/spread-err-sngl-err-obj-unresolvable.js TypeCheckError +test/language/expressions/new/spread-err-sngl-err-unresolvable.js TypeCheckError +test/language/expressions/new/spread-mult-empty.js RuntimeError +test/language/expressions/new/spread-mult-expr.js RuntimeError +test/language/expressions/new/spread-mult-iter.js TypeCheckError +test/language/expressions/new/spread-mult-literal.js RuntimeError +test/language/expressions/new/spread-mult-obj-ident.js TypeCheckError +test/language/expressions/new/spread-mult-obj-null.js TypeCheckError +test/language/expressions/new/spread-mult-obj-undefined.js TypeCheckError +test/language/expressions/new/spread-obj-getter-descriptor.js TypeCheckError +test/language/expressions/new/spread-obj-getter-init.js RuntimeError +test/language/expressions/new/spread-obj-manipulate-outter-obj-in-getter.js TypeCheckError +test/language/expressions/new/spread-obj-mult-spread-getter.js RuntimeError +test/language/expressions/new/spread-obj-mult-spread.js RuntimeError +test/language/expressions/new/spread-obj-null.js TypeCheckError +test/language/expressions/new/spread-obj-override-immutable.js TypeCheckError +test/language/expressions/new/spread-obj-overrides-prev-properties.js RuntimeError +test/language/expressions/new/spread-obj-skip-non-enumerable.js RuntimeError +test/language/expressions/new/spread-obj-spread-order.js RuntimeError +test/language/expressions/new/spread-obj-symbol-property.js RuntimeError +test/language/expressions/new/spread-obj-undefined.js TypeCheckError +test/language/expressions/new/spread-obj-with-overrides.js RuntimeError +test/language/expressions/new/spread-sngl-empty.js RuntimeError +test/language/expressions/new/spread-sngl-expr.js RuntimeError +test/language/expressions/new/spread-sngl-iter.js TypeCheckError +test/language/expressions/new/spread-sngl-literal.js RuntimeError +test/language/expressions/new/spread-sngl-obj-ident.js TypeCheckError diff --git a/SharpTS.Test262/baselines/interpreted.txt b/SharpTS.Test262/baselines/interpreted.txt index c772dbd2..a90b1777 100644 --- a/SharpTS.Test262/baselines/interpreted.txt +++ b/SharpTS.Test262/baselines/interpreted.txt @@ -4446,8 +4446,8 @@ test/built-ins/Promise/prototype/then/S25.4.5.3_A4.2_T2.js Skipped:async-done-de test/built-ins/Promise/prototype/then/S25.4.5.3_A5.1_T1.js Skipped:async-done-deferred test/built-ins/Promise/prototype/then/S25.4.5.3_A5.2_T1.js Skipped:async-done-deferred test/built-ins/Promise/prototype/then/S25.4.5.3_A5.3_T1.js Skipped:async-done-deferred -test/built-ins/Promise/prototype/then/capability-executor-called-twice.js ParseError -test/built-ins/Promise/prototype/then/capability-executor-not-callable.js ParseError +test/built-ins/Promise/prototype/then/capability-executor-called-twice.js TypeCheckError +test/built-ins/Promise/prototype/then/capability-executor-not-callable.js TypeCheckError test/built-ins/Promise/prototype/then/context-check-on-entry.js Pass test/built-ins/Promise/prototype/then/ctor-access-count.js Skipped:async-done-deferred test/built-ins/Promise/prototype/then/ctor-custom.js TypeCheckError @@ -4764,7 +4764,7 @@ test/built-ins/String/S15.5.5.1_A5.js RuntimeError test/built-ins/String/S15.5.5_A1_T1.js Pass test/built-ins/String/S15.5.5_A1_T2.js Pass test/built-ins/String/S15.5.5_A2_T1.js Pass -test/built-ins/String/S15.5.5_A2_T2.js ParseError +test/built-ins/String/S15.5.5_A2_T2.js Pass test/built-ins/String/S8.12.8_A1.js Pass test/built-ins/String/S8.12.8_A2.js Pass test/built-ins/String/S9.1_A1_T2.js TypeCheckError @@ -5924,59 +5924,59 @@ test/built-ins/String/symbol-wrapping.js Pass test/language/expressions/new/S11.2.2_A1.1.js TypeCheckError test/language/expressions/new/S11.2.2_A1.2.js TypeCheckError test/language/expressions/new/S11.2.2_A2.js TypeCheckError -test/language/expressions/new/S11.2.2_A3_T1.js ParseError -test/language/expressions/new/S11.2.2_A3_T2.js ParseError -test/language/expressions/new/S11.2.2_A3_T3.js ParseError -test/language/expressions/new/S11.2.2_A3_T4.js TypeCheckError -test/language/expressions/new/S11.2.2_A3_T5.js ParseError -test/language/expressions/new/S11.2.2_A4_T1.js ParseError -test/language/expressions/new/S11.2.2_A4_T2.js ParseError -test/language/expressions/new/S11.2.2_A4_T3.js ParseError +test/language/expressions/new/S11.2.2_A3_T1.js Pass +test/language/expressions/new/S11.2.2_A3_T2.js Pass +test/language/expressions/new/S11.2.2_A3_T3.js Pass +test/language/expressions/new/S11.2.2_A3_T4.js Pass +test/language/expressions/new/S11.2.2_A3_T5.js Pass +test/language/expressions/new/S11.2.2_A4_T1.js Pass +test/language/expressions/new/S11.2.2_A4_T2.js Pass +test/language/expressions/new/S11.2.2_A4_T3.js Pass test/language/expressions/new/S11.2.2_A4_T4.js Pass -test/language/expressions/new/S11.2.2_A4_T5.js ParseError +test/language/expressions/new/S11.2.2_A4_T5.js Pass test/language/expressions/new/ctorExpr-fn-ref-before-args-eval-fn-wrapup.js TypeCheckError test/language/expressions/new/ctorExpr-fn-ref-before-args-eval.js TypeCheckError test/language/expressions/new/ctorExpr-isCtor-after-args-eval-fn-wrapup.js TypeCheckError -test/language/expressions/new/ctorExpr-isCtor-after-args-eval.js TypeCheckError +test/language/expressions/new/ctorExpr-isCtor-after-args-eval.js Pass test/language/expressions/new/non-ctor-err-realm.js TypeCheckError -test/language/expressions/new/spread-err-mult-err-expr-throws.js ParseError -test/language/expressions/new/spread-err-mult-err-iter-get-value.js ParseError -test/language/expressions/new/spread-err-mult-err-itr-get-call.js ParseError -test/language/expressions/new/spread-err-mult-err-itr-get-get.js ParseError -test/language/expressions/new/spread-err-mult-err-itr-step.js ParseError -test/language/expressions/new/spread-err-mult-err-itr-value.js ParseError -test/language/expressions/new/spread-err-mult-err-obj-unresolvable.js ParseError -test/language/expressions/new/spread-err-mult-err-unresolvable.js ParseError -test/language/expressions/new/spread-err-sngl-err-expr-throws.js ParseError -test/language/expressions/new/spread-err-sngl-err-itr-get-call.js ParseError -test/language/expressions/new/spread-err-sngl-err-itr-get-get.js ParseError -test/language/expressions/new/spread-err-sngl-err-itr-get-value.js ParseError -test/language/expressions/new/spread-err-sngl-err-itr-step.js ParseError -test/language/expressions/new/spread-err-sngl-err-itr-value.js ParseError -test/language/expressions/new/spread-err-sngl-err-obj-unresolvable.js ParseError -test/language/expressions/new/spread-err-sngl-err-unresolvable.js ParseError -test/language/expressions/new/spread-mult-empty.js ParseError -test/language/expressions/new/spread-mult-expr.js ParseError -test/language/expressions/new/spread-mult-iter.js ParseError -test/language/expressions/new/spread-mult-literal.js ParseError -test/language/expressions/new/spread-mult-obj-ident.js ParseError -test/language/expressions/new/spread-mult-obj-null.js ParseError -test/language/expressions/new/spread-mult-obj-undefined.js ParseError -test/language/expressions/new/spread-obj-getter-descriptor.js ParseError -test/language/expressions/new/spread-obj-getter-init.js ParseError -test/language/expressions/new/spread-obj-manipulate-outter-obj-in-getter.js ParseError -test/language/expressions/new/spread-obj-mult-spread-getter.js ParseError -test/language/expressions/new/spread-obj-mult-spread.js ParseError -test/language/expressions/new/spread-obj-null.js ParseError -test/language/expressions/new/spread-obj-override-immutable.js ParseError -test/language/expressions/new/spread-obj-overrides-prev-properties.js ParseError -test/language/expressions/new/spread-obj-skip-non-enumerable.js ParseError -test/language/expressions/new/spread-obj-spread-order.js ParseError -test/language/expressions/new/spread-obj-symbol-property.js ParseError -test/language/expressions/new/spread-obj-undefined.js ParseError -test/language/expressions/new/spread-obj-with-overrides.js ParseError -test/language/expressions/new/spread-sngl-empty.js ParseError -test/language/expressions/new/spread-sngl-expr.js ParseError -test/language/expressions/new/spread-sngl-iter.js ParseError -test/language/expressions/new/spread-sngl-literal.js ParseError -test/language/expressions/new/spread-sngl-obj-ident.js ParseError +test/language/expressions/new/spread-err-mult-err-expr-throws.js Pass +test/language/expressions/new/spread-err-mult-err-iter-get-value.js Pass +test/language/expressions/new/spread-err-mult-err-itr-get-call.js TypeCheckError +test/language/expressions/new/spread-err-mult-err-itr-get-get.js Pass +test/language/expressions/new/spread-err-mult-err-itr-step.js TypeCheckError +test/language/expressions/new/spread-err-mult-err-itr-value.js TypeCheckError +test/language/expressions/new/spread-err-mult-err-obj-unresolvable.js TypeCheckError +test/language/expressions/new/spread-err-mult-err-unresolvable.js TypeCheckError +test/language/expressions/new/spread-err-sngl-err-expr-throws.js Pass +test/language/expressions/new/spread-err-sngl-err-itr-get-call.js TypeCheckError +test/language/expressions/new/spread-err-sngl-err-itr-get-get.js Pass +test/language/expressions/new/spread-err-sngl-err-itr-get-value.js TypeCheckError +test/language/expressions/new/spread-err-sngl-err-itr-step.js TypeCheckError +test/language/expressions/new/spread-err-sngl-err-itr-value.js TypeCheckError +test/language/expressions/new/spread-err-sngl-err-obj-unresolvable.js TypeCheckError +test/language/expressions/new/spread-err-sngl-err-unresolvable.js TypeCheckError +test/language/expressions/new/spread-mult-empty.js Pass +test/language/expressions/new/spread-mult-expr.js Pass +test/language/expressions/new/spread-mult-iter.js TypeCheckError +test/language/expressions/new/spread-mult-literal.js Pass +test/language/expressions/new/spread-mult-obj-ident.js TypeCheckError +test/language/expressions/new/spread-mult-obj-null.js TypeCheckError +test/language/expressions/new/spread-mult-obj-undefined.js TypeCheckError +test/language/expressions/new/spread-obj-getter-descriptor.js TypeCheckError +test/language/expressions/new/spread-obj-getter-init.js Pass +test/language/expressions/new/spread-obj-manipulate-outter-obj-in-getter.js TypeCheckError +test/language/expressions/new/spread-obj-mult-spread-getter.js Pass +test/language/expressions/new/spread-obj-mult-spread.js Pass +test/language/expressions/new/spread-obj-null.js TypeCheckError +test/language/expressions/new/spread-obj-override-immutable.js TypeCheckError +test/language/expressions/new/spread-obj-overrides-prev-properties.js Pass +test/language/expressions/new/spread-obj-skip-non-enumerable.js Pass +test/language/expressions/new/spread-obj-spread-order.js Pass +test/language/expressions/new/spread-obj-symbol-property.js Pass +test/language/expressions/new/spread-obj-undefined.js TypeCheckError +test/language/expressions/new/spread-obj-with-overrides.js Pass +test/language/expressions/new/spread-sngl-empty.js Pass +test/language/expressions/new/spread-sngl-expr.js Pass +test/language/expressions/new/spread-sngl-iter.js TypeCheckError +test/language/expressions/new/spread-sngl-literal.js Pass +test/language/expressions/new/spread-sngl-obj-ident.js TypeCheckError diff --git a/SharpTS.Tests/ParserTests/ExpressionParsingTests.cs b/SharpTS.Tests/ParserTests/ExpressionParsingTests.cs index d40fcffc..062b26ae 100644 --- a/SharpTS.Tests/ParserTests/ExpressionParsingTests.cs +++ b/SharpTS.Tests/ParserTests/ExpressionParsingTests.cs @@ -581,6 +581,92 @@ public void New_WithArguments() Assert.Equal(2, newExpr.Arguments.Count); } + [Fact] + public void New_NoParens_OnIdentifier() + { + // Issue #78: `new X` without arg list — equivalent to `new X()`. + var expr = ParseExpression("new Foo;"); + var newExpr = Assert.IsType(expr); + var callee = Assert.IsType(newExpr.Callee); + Assert.Equal("Foo", callee.Name.Lexeme); + Assert.Empty(newExpr.Arguments); + } + + [Fact] + public void New_LiteralCallee_Boolean() + { + // Issue #78: `new true` parses; runtime throws TypeError. + var expr = ParseExpression("new true;"); + var newExpr = Assert.IsType(expr); + var lit = Assert.IsType(newExpr.Callee); + Assert.Equal(true, lit.Value); + } + + [Fact] + public void New_LiteralCallee_Number() + { + var expr = ParseExpression("new 1;"); + var newExpr = Assert.IsType(expr); + Assert.IsType(newExpr.Callee); + } + + [Fact] + public void New_LiteralCallee_String() + { + var expr = ParseExpression("new \"abc\";"); + var newExpr = Assert.IsType(expr); + Assert.IsType(newExpr.Callee); + } + + [Fact] + public void New_FunctionExpressionCallee() + { + // Issue #78: `new function() {}(...)` from spread-err-* test262 bucket. + var expr = ParseExpression("new function() {}();"); + var newExpr = Assert.IsType(expr); + Assert.IsType(newExpr.Callee); + Assert.Empty(newExpr.Arguments); + } + + [Fact] + public void New_FunctionExpressionCallee_WithArgs() + { + var expr = ParseExpression("new function(a, b) {}(1, 2);"); + var newExpr = Assert.IsType(expr); + Assert.IsType(newExpr.Callee); + Assert.Equal(2, newExpr.Arguments.Count); + } + + [Fact] + public void New_IndexedCallee() + { + // `new ctors[0]()` — index access in MemberExpression position. + var expr = ParseExpression("new ctors[0]();"); + var newExpr = Assert.IsType(expr); + Assert.IsType(newExpr.Callee); + } + + [Fact] + public void New_SpreadArgument() + { + // ECMA-262: spread in `new` arg list. Used by spread-err-* test262 bucket. + var expr = ParseExpression("new Foo(0, ...args);"); + var newExpr = Assert.IsType(expr); + Assert.Equal(2, newExpr.Arguments.Count); + Assert.IsType(newExpr.Arguments[1]); + } + + [Fact] + public void New_Nested() + { + // `new new X()` parses as `new (new X())`. + var expr = ParseExpression("new new X();"); + var outer = Assert.IsType(expr); + var inner = Assert.IsType(outer.Callee); + var calleeVar = Assert.IsType(inner.Callee); + Assert.Equal("X", calleeVar.Name.Lexeme); + } + #endregion #region This and Super diff --git a/TypeSystem/TypeChecker.Properties.New.cs b/TypeSystem/TypeChecker.Properties.New.cs index bc7920db..84a0a0f3 100644 --- a/TypeSystem/TypeChecker.Properties.New.cs +++ b/TypeSystem/TypeChecker.Properties.New.cs @@ -680,15 +680,15 @@ private TypeInfo CheckNew(Expr.New newExpr) return new TypeInfo.Instance(classType); } - // Handle function-typed constructors (e.g., imported Agent constructor from http module) - if (calleeType is TypeInfo.Function || calleeType is TypeInfo.Any) - { - foreach (var arg in newExpr.Arguments) - CheckExpr(arg); - return new TypeInfo.Any(); - } - - throw new TypeCheckException($" '{qualifiedName}' is not a class."); + // Handle function-typed constructors and any other non-class callee. + // Per ECMA-262 §13.3, `new MemberExpression` is syntactically valid for any + // expression — if the value isn't a constructor, runtime throws TypeError. + // Don't block at the type-check phase; let runtime decide. This covers literal + // callees (`new true`, `new 1`), function expressions (`new function() {}(...)`), + // and any value whose static type isn't a known class. + foreach (var arg in newExpr.Arguments) + CheckExpr(arg); + return new TypeInfo.Any(); } ///