Changeset 238365 in webkit


Ignore:
Timestamp:
Nov 18, 2018 11:10:08 AM (5 years ago)
Author:
yusukesuzuki@slowstart.org
Message:

Unreviewed, rolling in the rest of r237254
https://bugs.webkit.org/show_bug.cgi?id=190340

JSTests:

  • ChakraCore/test/Function/FuncBodyES5.baseline-jsc:
  • stress/function-cache-with-parameters-end-position.js: Added.

(shouldBe):
(shouldThrow):
(i.anonymous):

  • stress/function-constructor-name.js: Added.

(shouldBe):
(GeneratorFunction):
(AsyncFunction.async):
(AsyncGeneratorFunction.async):
(anonymous):
(async.anonymous):

  • test262/expectations.yaml:

LayoutTests/imported/w3c:

  • web-platform-tests/html/webappapis/scripting/events/inline-event-handler-ordering-expected.txt:
  • web-platform-tests/html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-late-expected.txt:
  • web-platform-tests/html/webappapis/scripting/processing-model-2/compile-error-in-attribute-expected.txt:
  • web-platform-tests/html/webappapis/scripting/processing-model-2/compile-error-in-body-onerror-expected.txt:

Source/JavaScriptCore:

  • parser/ParserModes.h:
  • parser/ParserTokens.h:

(JSC::JSTextPosition::JSTextPosition):
(JSC::JSTokenLocation::JSTokenLocation): Deleted.

  • runtime/CodeCache.cpp:

(JSC::CodeCache::getUnlinkedGlobalFunctionExecutable):

  • runtime/FunctionConstructor.cpp:

(JSC::constructFunctionSkippingEvalEnabledCheck):

LayoutTests:

  • fast/dom/attribute-event-listener-errors-expected.txt:
  • fast/events/attribute-listener-deletion-crash-expected.txt:
  • fast/events/window-onerror-syntax-error-in-attr-expected.txt:
  • js/dom/invalid-syntax-for-function-expected.txt:
  • js/dom/script-start-end-locations-expected.txt:
Location:
trunk
Files:
2 added
19 edited

Legend:

Unmodified
Added
Removed
  • trunk/JSTests/ChakraCore/test/Function/FuncBodyES5.baseline-jsc

    r237299 r238365  
    1010PASS: 9: new Function succeeded as expected
    1111PASS: 10: new Function succeeded as expected
    12 PASS: 100: new Function failed as expected. SyntaxError: Unexpected token '{'. Expected ')' to end a compound expression.
    13 PASS: 100: new Function failed as expected. SyntaxError: Unexpected token '{'. Expected ')' to end a compound expression.
    14 PASS: 101: new Function failed as expected. SyntaxError: Unexpected keyword 'function'. Expected ')' to end a compound expression.
    15 PASS: 102: new Function failed as expected. SyntaxError: Unexpected keyword 'function'. Expected ')' to end a compound expression.
    16 PASS: 103: new Function failed as expected. SyntaxError: Unexpected keyword 'function'. Expected ')' to end a compound expression.
    17 PASS: 104: new Function failed as expected. SyntaxError: Unexpected token ';'. Expected ')' to end a compound expression.
    18 PASS: 105: new Function failed as expected. SyntaxError: Unexpected token ';'. Expected ')' to end a compound expression.
     12PASS: 100: new Function failed as expected. SyntaxError: Parser error
     13PASS: 100: new Function failed as expected. SyntaxError: Parser error
     14PASS: 101: new Function failed as expected. SyntaxError: Parser error
     15PASS: 102: new Function failed as expected. SyntaxError: Parameters should match arguments offered as parameters in Function constructor.
     16PASS: 103: new Function failed as expected. SyntaxError: Parser error
     17PASS: 104: new Function failed as expected. SyntaxError: Parameters should match arguments offered as parameters in Function constructor.
     18PASS: 105: new Function failed as expected. SyntaxError: Parser error
    1919PASS: 200: new Function failed as expected. SyntaxError: Unexpected token ','. Expected a parameter pattern or a ')' in parameter list.
    2020PASS: 200: new Function failed as expected. SyntaxError: Unexpected token ','. Expected a parameter pattern or a ')' in parameter list.
  • trunk/JSTests/ChangeLog

    r238326 r238365  
     12018-11-18  Yusuke Suzuki  <yusukesuzuki@slowstart.org>
     2
     3        Unreviewed, rolling in the rest of r237254
     4        https://bugs.webkit.org/show_bug.cgi?id=190340
     5
     6        * ChakraCore/test/Function/FuncBodyES5.baseline-jsc:
     7        * stress/function-cache-with-parameters-end-position.js: Added.
     8        (shouldBe):
     9        (shouldThrow):
     10        (i.anonymous):
     11        * stress/function-constructor-name.js: Added.
     12        (shouldBe):
     13        (GeneratorFunction):
     14        (AsyncFunction.async):
     15        (AsyncGeneratorFunction.async):
     16        (anonymous):
     17        (async.anonymous):
     18        * test262/expectations.yaml:
     19
    1202018-11-16  Filip Pizlo  <fpizlo@apple.com>
    221
  • trunk/JSTests/test262/expectations.yaml

    r238004 r238365  
    901901  strict mode: "ReferenceError: Can't find variable: verifyNotEnumerable"
    902902test/built-ins/Function/prototype/toString/AsyncFunction.js:
    903   default: "SyntaxError: Unexpected token '}'. Expected a ')' or a ',' after a parameter declaration."
    904   strict mode: "SyntaxError: Unexpected token '}'. Expected a ')' or a ',' after a parameter declaration."
     903  default: "SyntaxError: Unexpected token ';'. Expected a ')' or a ',' after a parameter declaration."
     904  strict mode: "SyntaxError: Unexpected token ';'. Expected a ')' or a ',' after a parameter declaration."
    905905test/built-ins/Function/prototype/toString/Function.js:
    906   default: "SyntaxError: Unexpected token '}'. Expected a ')' or a ',' after a parameter declaration."
    907   strict mode: "SyntaxError: Unexpected token '}'. Expected a ')' or a ',' after a parameter declaration."
     906  default: "SyntaxError: Unexpected token ';'. Expected a ')' or a ',' after a parameter declaration."
     907  strict mode: "SyntaxError: Unexpected token ';'. Expected a ')' or a ',' after a parameter declaration."
    908908test/built-ins/Function/prototype/toString/GeneratorFunction.js:
    909   default: "SyntaxError: Unexpected token '}'. Expected a ')' or a ',' after a parameter declaration."
    910   strict mode: "SyntaxError: Unexpected token '}'. Expected a ')' or a ',' after a parameter declaration."
     909  default: "SyntaxError: Unexpected keyword 'yield'. Expected a ')' or a ',' after a parameter declaration."
     910  strict mode: "SyntaxError: Unexpected keyword 'yield'. Expected a ')' or a ',' after a parameter declaration."
    911911test/built-ins/Function/prototype/toString/async-arrow-function.js:
    912912  default: "Test262Error: Conforms to NativeFunction Syntax: 'async ( /* b */ a /* c */ , /* d */ b /* e */ ) /* f */ => /* g */ { /* h */ ; /* i */ }'.(async /* a */ ( /* b */ a /* c */ , /* d */ b /* e */ ) /* f */ => /* g */ { /* h */ ; /* i */ })"
  • trunk/LayoutTests/ChangeLog

    r238350 r238365  
     12018-11-18  Yusuke Suzuki  <yusukesuzuki@slowstart.org>
     2
     3        Unreviewed, rolling in the rest of r237254
     4        https://bugs.webkit.org/show_bug.cgi?id=190340
     5
     6        * fast/dom/attribute-event-listener-errors-expected.txt:
     7        * fast/events/attribute-listener-deletion-crash-expected.txt:
     8        * fast/events/window-onerror-syntax-error-in-attr-expected.txt:
     9        * js/dom/invalid-syntax-for-function-expected.txt:
     10        * js/dom/script-start-end-locations-expected.txt:
     11
    1122018-11-17  Devin Rousso  <drousso@apple.com>
    213
  • trunk/LayoutTests/fast/dom/attribute-event-listener-errors-expected.txt

    r237299 r238365  
    11CONSOLE MESSAGE: line 4: ReferenceError: Can't find variable: error
    2 CONSOLE MESSAGE: line 9: SyntaxError: Invalid character: '@'
     2CONSOLE MESSAGE: line 5: SyntaxError: Invalid character: '@'
    33This test verifies that an attribute event listener error shows the right line number even if the attribute contains newlines.
    44 
  • trunk/LayoutTests/fast/events/attribute-listener-deletion-crash-expected.txt

    r237299 r238365  
    1 CONSOLE MESSAGE: line 2: SyntaxError: Unexpected token '|'
    2 CONSOLE MESSAGE: line 2: SyntaxError: Unexpected token '|'
    3 CONSOLE MESSAGE: line 2: SyntaxError: Unexpected token '|'
    4 CONSOLE MESSAGE: line 2: SyntaxError: Unexpected token '|'
    5 CONSOLE MESSAGE: line 2: SyntaxError: Unexpected token '|'
    6 CONSOLE MESSAGE: line 2: SyntaxError: Unexpected token '|'
    7 CONSOLE MESSAGE: line 2: SyntaxError: Unexpected token '|'
    8 CONSOLE MESSAGE: line 2: SyntaxError: Unexpected token '|'
    9 CONSOLE MESSAGE: line 2: SyntaxError: Unexpected token '|'
    10 CONSOLE MESSAGE: line 2: SyntaxError: Unexpected token '|'
    11 CONSOLE MESSAGE: line 2: SyntaxError: Unexpected token '|'
    12 CONSOLE MESSAGE: line 2: SyntaxError: Unexpected token '|'
    13 CONSOLE MESSAGE: line 2: SyntaxError: Unexpected token '|'
    14 CONSOLE MESSAGE: line 2: SyntaxError: Unexpected token '|'
    15 CONSOLE MESSAGE: line 2: SyntaxError: Unexpected token '|'
    16 CONSOLE MESSAGE: line 2: SyntaxError: Unexpected token '|'
    17 CONSOLE MESSAGE: line 2: SyntaxError: Unexpected token '|'
    18 CONSOLE MESSAGE: line 2: SyntaxError: Unexpected token '|'
    19 CONSOLE MESSAGE: line 2: SyntaxError: Unexpected token '|'
    20 CONSOLE MESSAGE: line 2: SyntaxError: Unexpected token '|'
     1CONSOLE MESSAGE: line 1: SyntaxError: Unexpected token '|'
     2CONSOLE MESSAGE: line 1: SyntaxError: Unexpected token '|'
     3CONSOLE MESSAGE: line 1: SyntaxError: Unexpected token '|'
     4CONSOLE MESSAGE: line 1: SyntaxError: Unexpected token '|'
     5CONSOLE MESSAGE: line 1: SyntaxError: Unexpected token '|'
     6CONSOLE MESSAGE: line 1: SyntaxError: Unexpected token '|'
     7CONSOLE MESSAGE: line 1: SyntaxError: Unexpected token '|'
     8CONSOLE MESSAGE: line 1: SyntaxError: Unexpected token '|'
     9CONSOLE MESSAGE: line 1: SyntaxError: Unexpected token '|'
     10CONSOLE MESSAGE: line 1: SyntaxError: Unexpected token '|'
     11CONSOLE MESSAGE: line 1: SyntaxError: Unexpected token '|'
     12CONSOLE MESSAGE: line 1: SyntaxError: Unexpected token '|'
     13CONSOLE MESSAGE: line 1: SyntaxError: Unexpected token '|'
     14CONSOLE MESSAGE: line 1: SyntaxError: Unexpected token '|'
     15CONSOLE MESSAGE: line 1: SyntaxError: Unexpected token '|'
     16CONSOLE MESSAGE: line 1: SyntaxError: Unexpected token '|'
     17CONSOLE MESSAGE: line 1: SyntaxError: Unexpected token '|'
     18CONSOLE MESSAGE: line 1: SyntaxError: Unexpected token '|'
     19CONSOLE MESSAGE: line 1: SyntaxError: Unexpected token '|'
     20CONSOLE MESSAGE: line 1: SyntaxError: Unexpected token '|'
    2121PASS
  • trunk/LayoutTests/fast/events/window-onerror-syntax-error-in-attr-expected.txt

    r237299 r238365  
    11Test that window.onerror is called on window object when there is a syntax error in attribute handler. Bug 70991.
    22
    3 Main frame window.onerror: SyntaxError: Unexpected token '%' at window-onerror-syntax-error-in-attr.html:11:38 SyntaxError: Unexpected token '%'
    4 Main frame window.onerror: SyntaxError: Unexpected token '%' at window-onerror-syntax-error-in-attr.html:37:38 SyntaxError: Unexpected token '%'
    5 Main frame window.onerror: SyntaxError: Unexpected token '%' at window-onerror-syntax-error-in-attr.html:37:14 SyntaxError: Unexpected token '%'
     3Main frame window.onerror: SyntaxError: Unexpected token '%' at window-onerror-syntax-error-in-attr.html:10:38 SyntaxError: Unexpected token '%'
     4Main frame window.onerror: SyntaxError: Unexpected token '%' at window-onerror-syntax-error-in-attr.html:36:38 SyntaxError: Unexpected token '%'
     5Main frame window.onerror: SyntaxError: Unexpected token '%' at window-onerror-syntax-error-in-attr.html:36:14 SyntaxError: Unexpected token '%'
    66Button 1 Button 2 Button 3
  • trunk/LayoutTests/imported/w3c/ChangeLog

    r238262 r238365  
     12018-11-18  Yusuke Suzuki  <yusukesuzuki@slowstart.org>
     2
     3        Unreviewed, rolling in the rest of r237254
     4        https://bugs.webkit.org/show_bug.cgi?id=190340
     5
     6        * web-platform-tests/html/webappapis/scripting/events/inline-event-handler-ordering-expected.txt:
     7        * web-platform-tests/html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-late-expected.txt:
     8        * web-platform-tests/html/webappapis/scripting/processing-model-2/compile-error-in-attribute-expected.txt:
     9        * web-platform-tests/html/webappapis/scripting/processing-model-2/compile-error-in-body-onerror-expected.txt:
     10
    1112018-11-15  Truitt Savell  <tsavell@apple.com>
    212
  • trunk/LayoutTests/imported/w3c/web-platform-tests/html/webappapis/scripting/events/inline-event-handler-ordering-expected.txt

    r237299 r238365  
    11CONSOLE MESSAGE: line 19: SyntaxError: Unexpected token '}'
    2 CONSOLE MESSAGE: line 54: SyntaxError: Unexpected token '}'
     2CONSOLE MESSAGE: line 52: SyntaxError: Unexpected token '}'
    33
    44PASS Inline event handlers retain their ordering when invalid and force-compiled
  • trunk/LayoutTests/imported/w3c/web-platform-tests/html/webappapis/scripting/events/invalid-uncompiled-raw-handler-compiled-late-expected.txt

    r237299 r238365  
    1 CONSOLE MESSAGE: line 26: SyntaxError: Unexpected token '}'. Expected ')' to end a compound expression.
    2 CONSOLE MESSAGE: line 21: SyntaxError: Unexpected token '}'. Expected ')' to end a compound expression.
     1CONSOLE MESSAGE: line 24: SyntaxError: Parser error
     2CONSOLE MESSAGE: line 21: SyntaxError: Parser error
    33
    44FAIL Invalid uncompiled raw handlers should only be compiled when about to call them. assert_array_equals: lengths differ, expected 3 got 4
  • trunk/LayoutTests/imported/w3c/web-platform-tests/html/webappapis/scripting/processing-model-2/compile-error-in-attribute-expected.txt

    r237299 r238365  
    1 CONSOLE MESSAGE: line 26: SyntaxError: Unexpected token ')'
     1CONSOLE MESSAGE: line 24: SyntaxError: Unexpected end of script
    22
    33PASS window.onerror - compile error in attribute
  • trunk/LayoutTests/imported/w3c/web-platform-tests/html/webappapis/scripting/processing-model-2/compile-error-in-body-onerror-expected.txt

    r237299 r238365  
    11CONSOLE MESSAGE: line 19: SyntaxError: Unexpected token ')'
    2 CONSOLE MESSAGE: line 18: SyntaxError: Unexpected token ')'
     2CONSOLE MESSAGE: line 16: SyntaxError: Unexpected end of script
    33
    44PASS window.onerror - compile error in <body onerror>
  • trunk/LayoutTests/js/dom/invalid-syntax-for-function-expected.txt

    r237299 r238365  
    1 CONSOLE MESSAGE: line 2: SyntaxError: Invalid character: '#'
     1CONSOLE MESSAGE: line 1: SyntaxError: Invalid character: '#'
    22This test ensures we don't crash when we are given garbage for an attribute expecting a function.
    33https://bugs.webkit.org/show_bug.cgi?id=19025
  • trunk/LayoutTests/js/dom/script-start-end-locations-expected.txt

    r237299 r238365  
    244244
    245245  new Function Object:
    246 function "anonymous" { 1:20 - 2:228 }
     246function "anonymous" { 1:19 - 2:228 }
    247247function "nf1a" { 2:57 - 2:219 }
    248248function "nf1b" { 2:87 - 2:209 }
    249249function "nf1c" { 2:117 - 2:199 }
    250250eval { 1:1 - 1:56 }
    251 function "anonymous" { 1:20 - 18:8 }
     251function "anonymous" { 1:19 - 18:8 }
    252252function "nf2a" { 5:18 - 16:5 }
    253253function "nf2b" { 7:22 - 14:9 }
    254254function "nf2c" { 9:26 - 12:13 }
    255255eval { 1:1 - 1:56 }
    256 function "anonymous" { 1:20 - 2:228 }
     256function "anonymous" { 1:19 - 2:228 }
    257257function "nf1a" { 2:57 - 2:219 }
    258258function "nf1b" { 2:87 - 2:209 }
    259259function "nf1c" { 2:117 - 2:199 }
    260260eval { 1:1 - 1:56 }
    261 function "anonymous" { 1:20 - 2:237 }
     261function "anonymous" { 1:19 - 2:237 }
    262262function "nfi1a" { 2:58 - 2:227 }
    263263function "nfi1b" { 2:90 - 2:216 }
    264264function "nfi1c" { 2:122 - 2:205 }
    265265eval { 1:1 - 1:56 }
    266 function "anonymous" { 1:20 - 18:8 }
     266function "anonymous" { 1:19 - 18:8 }
    267267function "nf2a" { 5:18 - 16:5 }
    268268function "nf2b" { 7:22 - 14:9 }
    269269function "nf2c" { 9:26 - 12:13 }
    270270eval { 1:1 - 1:56 }
    271 function "anonymous" { 1:20 - 18:9 }
     271function "anonymous" { 1:19 - 18:9 }
    272272function "nfi2a" { 5:19 - 16:5 }
    273273function "nfi2b" { 7:23 - 14:9 }
  • trunk/Source/JavaScriptCore/ChangeLog

    r238350 r238365  
     12018-11-18  Yusuke Suzuki  <yusukesuzuki@slowstart.org>
     2
     3        Unreviewed, rolling in the rest of r237254
     4        https://bugs.webkit.org/show_bug.cgi?id=190340
     5
     6        * parser/ParserModes.h:
     7        * parser/ParserTokens.h:
     8        (JSC::JSTextPosition::JSTextPosition):
     9        (JSC::JSTokenLocation::JSTokenLocation): Deleted.
     10        * runtime/CodeCache.cpp:
     11        (JSC::CodeCache::getUnlinkedGlobalFunctionExecutable):
     12        * runtime/FunctionConstructor.cpp:
     13        (JSC::constructFunctionSkippingEvalEnabledCheck):
     14
    1152018-11-17  Devin Rousso  <drousso@apple.com>
    216
  • trunk/Source/JavaScriptCore/parser/ParserModes.h

    r237478 r238365  
    3434enum class JSParserBuiltinMode { NotBuiltin, Builtin };
    3535enum class JSParserScriptMode { Classic, Module };
    36 enum class JSParserCodeType { Program, Function, Module };
    3736
    3837enum class ConstructorKind { None, Base, Extends };
  • trunk/Source/JavaScriptCore/parser/ParserTokens.h

    r237478 r238365  
    194194    JSTextPosition() = default;
    195195    JSTextPosition(int _line, int _offset, int _lineStartOffset) : line(_line), offset(_offset), lineStartOffset(_lineStartOffset) { }
    196     JSTextPosition(const JSTextPosition& other) : line(other.line), offset(other.offset), lineStartOffset(other.lineStartOffset) { }
    197196
    198197    JSTextPosition operator+(int adjustment) const { return JSTextPosition(line, offset + adjustment, lineStartOffset); }
     
    247246struct JSTokenLocation {
    248247    JSTokenLocation() = default;
    249     JSTokenLocation(const JSTokenLocation& location)
    250     {
    251         line = location.line;
    252         lineStartOffset = location.lineStartOffset;
    253         startOffset = location.startOffset;
    254         endOffset = location.endOffset;
    255     }
    256248
    257249    int line { 0 };
  • trunk/Source/JavaScriptCore/runtime/CodeCache.cpp

    r238185 r238365  
    120120
    121121    JSTextPosition positionBeforeLastNewline;
    122     std::unique_ptr<ProgramNode> program = parse<ProgramNode>(
    123         &vm, source, Identifier(), JSParserBuiltinMode::NotBuiltin,
    124         JSParserStrictMode::NotStrict, JSParserScriptMode::Classic, SourceParseMode::ProgramMode, SuperBinding::NotNeeded,
    125         error, &positionBeforeLastNewline);
     122    std::unique_ptr<ProgramNode> program = parseFunctionForFunctionConstructor(vm, source, error, &positionBeforeLastNewline, functionConstructorParametersEndPosition);
    126123    if (!program) {
    127124        RELEASE_ASSERT(error.isValid());
     
    130127
    131128    // This function assumes an input string that would result in a single function declaration.
    132     StatementNode* statement = program->singleStatement();
    133     if (UNLIKELY(!statement)) {
    134         JSToken token;
    135         error = ParserError(ParserError::SyntaxError, ParserError::SyntaxErrorIrrecoverable, token, "Parser error", -1);
    136         return nullptr;
    137     }
    138     ASSERT(statement->isBlock());
    139 
    140     StatementNode* funcDecl = static_cast<BlockNode*>(statement)->singleStatement();
     129    StatementNode* funcDecl = program->singleStatement();
    141130    if (UNLIKELY(!funcDecl)) {
    142131        JSToken token;
  • trunk/Source/JavaScriptCore/runtime/FunctionConstructor.cpp

    r238185 r238365  
    9595        break;
    9696    case FunctionConstructionMode::AsyncGenerator:
    97         prefix = "{async function*";
     97        prefix = "async function*";
    9898        break;
    9999    }
    100 
    101     auto checkBody = [&] (const String& body) {
    102         // The spec mandates that the body parses a valid function body independent
    103         // of the parameters.
    104         String program = makeString("(", prefix, "(){\n", body, "\n})");
    105         SourceCode source = makeSource(program, sourceOrigin, sourceURL, position);
    106         JSValue exception;
    107         checkSyntax(exec, source, &exception);
    108         if (exception) {
    109             scope.throwException(exec, exception);
    110             return;
    111         }
    112     };
    113100
    114101    // How we stringify functions is sometimes important for web compatibility.
    115102    // See https://bugs.webkit.org/show_bug.cgi?id=24350.
    116103    String program;
     104    std::optional<int> functionConstructorParametersEndPosition = std::nullopt;
    117105    if (args.isEmpty())
    118         program = makeString("{", prefix, functionName.string(), "() {\n\n}}");
     106        program = makeString(prefix, functionName.string(), "() {\n\n}");
    119107    else if (args.size() == 1) {
    120108        auto body = args.at(0).toWTFString(exec);
    121109        RETURN_IF_EXCEPTION(scope, nullptr);
    122         checkBody(body);
    123         RETURN_IF_EXCEPTION(scope, nullptr);
    124         program = makeString("{", prefix, functionName.string(), "() {\n", body, "\n}}");
     110        program = makeString(prefix, functionName.string(), "() {\n", body, "\n}");
    125111    } else {
    126112        StringBuilder builder(StringBuilder::OverflowHandler::RecordOverflow);
    127         builder.append('{');
    128113        builder.append(prefix);
    129114        builder.append(functionName.string());
     115
    130116        builder.append('(');
    131         StringBuilder parameterBuilder(StringBuilder::OverflowHandler::RecordOverflow);
    132117        auto viewWithString = args.at(0).toString(exec)->viewWithUnderlyingString(exec);
    133118        RETURN_IF_EXCEPTION(scope, nullptr);
    134         parameterBuilder.append(viewWithString.view);
    135         for (size_t i = 1; !parameterBuilder.hasOverflowed() && i < args.size() - 1; i++) {
    136             parameterBuilder.appendLiteral(", ");
     119        builder.append(viewWithString.view);
     120        for (size_t i = 1; !builder.hasOverflowed() && i < args.size() - 1; i++) {
     121            builder.appendLiteral(", ");
    137122            auto viewWithString = args.at(i).toString(exec)->viewWithUnderlyingString(exec);
    138123            RETURN_IF_EXCEPTION(scope, nullptr);
    139             parameterBuilder.append(viewWithString.view);
     124            builder.append(viewWithString.view);
    140125        }
    141         if (parameterBuilder.hasOverflowed()) {
     126        if (builder.hasOverflowed()) {
    142127            throwOutOfMemoryError(exec, scope);
    143128            return nullptr;
    144129        }
    145         auto body = args.at(args.size() - 1).toWTFString(exec);
     130
     131        functionConstructorParametersEndPosition = builder.length() + 1;
     132        builder.appendLiteral(") {\n");
     133
     134        auto body = args.at(args.size() - 1).toString(exec)->viewWithUnderlyingString(exec);
    146135        RETURN_IF_EXCEPTION(scope, nullptr);
    147 
    148         {
    149             // The spec mandates that the parameters parse as a valid parameter list
    150             // independent of the function body.
    151             String program = tryMakeString("(", prefix, "(", parameterBuilder.toString(), "){\n\n})");
    152             if (UNLIKELY(!program)) {
    153                 throwOutOfMemoryError(exec, scope);
    154                 return nullptr;
    155             }
    156             SourceCode source = makeSource(program, sourceOrigin, sourceURL, position);
    157             JSValue exception;
    158             checkSyntax(exec, source, &exception);
    159             if (exception) {
    160                 scope.throwException(exec, exception);
    161                 return nullptr;
    162             }
    163         }
    164 
    165         builder.append(parameterBuilder);
    166         builder.appendLiteral(") {\n");
    167         checkBody(body);
    168         RETURN_IF_EXCEPTION(scope, nullptr);
    169         builder.append(body);
    170         builder.appendLiteral("\n}}");
     136        builder.append(body.view);
     137        builder.appendLiteral("\n}");
    171138        if (builder.hasOverflowed()) {
    172139            throwOutOfMemoryError(exec, scope);
     
    178145    SourceCode source = makeSource(program, sourceOrigin, sourceURL, position);
    179146    JSObject* exception = nullptr;
    180     FunctionExecutable* function = FunctionExecutable::fromGlobalCode(functionName, *exec, source, exception, overrideLineNumber, std::nullopt);
     147    FunctionExecutable* function = FunctionExecutable::fromGlobalCode(functionName, *exec, source, exception, overrideLineNumber, functionConstructorParametersEndPosition);
    181148    if (!function) {
    182149        ASSERT(exception);
Note: See TracChangeset for help on using the changeset viewer.