Title: [208885] trunk
Revision
208885
Author
[email protected]
Date
2016-11-18 10:57:17 -0800 (Fri, 18 Nov 2016)

Log Message

Web Inspector: Generator functions should have a displayable name when shown in stack traces
https://bugs.webkit.org/show_bug.cgi?id=164844
<rdar://problem/29300697>

Reviewed by Yusuke Suzuki.

JSTests:

* stress/generator-function-name.js:
Add another test now that we name the inner generator function
that we do not break the lexical resolution of names.

Source/_javascript_Core:

* parser/SyntaxChecker.h:
(JSC::SyntaxChecker::createGeneratorFunctionBody):
* parser/ASTBuilder.h:
(JSC::ASTBuilder::createGeneratorFunctionBody):
New way to create a generator function with an inferred name.

* parser/Parser.cpp:
(JSC::Parser<LexerType>::parseInner):
(JSC::Parser<LexerType>::parseGeneratorFunctionSourceElements):
* parser/Parser.h:
Pass on the name of the generator wrapper function so we can
use it on the inner generator function.

LayoutTests:

* inspector/debugger/js-stacktrace-expected.txt:
* inspector/debugger/js-stacktrace.html:
Add a test case for console.trace() / Error stack inside of generators.
Modernize the test to reduce redundency and get nicer output.

Modified Paths

Diff

Modified: trunk/JSTests/ChangeLog (208884 => 208885)


--- trunk/JSTests/ChangeLog	2016-11-18 15:17:36 UTC (rev 208884)
+++ trunk/JSTests/ChangeLog	2016-11-18 18:57:17 UTC (rev 208885)
@@ -1,3 +1,15 @@
+2016-11-18  Joseph Pecoraro  <[email protected]>
+
+        Web Inspector: Generator functions should have a displayable name when shown in stack traces
+        https://bugs.webkit.org/show_bug.cgi?id=164844
+        <rdar://problem/29300697>
+
+        Reviewed by Yusuke Suzuki.
+
+        * stress/generator-function-name.js:
+        Add another test now that we name the inner generator function
+        that we do not break the lexical resolution of names.
+
 2016-11-17  Yusuke Suzuki  <[email protected]>
 
         [JSC] Drop arguments.caller

Modified: trunk/JSTests/stress/generator-function-name.js (208884 => 208885)


--- trunk/JSTests/stress/generator-function-name.js	2016-11-18 15:17:36 UTC (rev 208884)
+++ trunk/JSTests/stress/generator-function-name.js	2016-11-18 18:57:17 UTC (rev 208885)
@@ -10,3 +10,10 @@
 
 var g = ok();
 shouldBe(g.next().value, ok);
+
+function* generator2(factory)
+{
+    shouldBe(generator2, factory);
+};
+
+generator2(generator2).next();

Modified: trunk/LayoutTests/ChangeLog (208884 => 208885)


--- trunk/LayoutTests/ChangeLog	2016-11-18 15:17:36 UTC (rev 208884)
+++ trunk/LayoutTests/ChangeLog	2016-11-18 18:57:17 UTC (rev 208885)
@@ -1,3 +1,16 @@
+2016-11-18  Joseph Pecoraro  <[email protected]>
+
+        Web Inspector: Generator functions should have a displayable name when shown in stack traces
+        https://bugs.webkit.org/show_bug.cgi?id=164844
+        <rdar://problem/29300697>
+
+        Reviewed by Yusuke Suzuki.
+
+        * inspector/debugger/js-stacktrace-expected.txt:
+        * inspector/debugger/js-stacktrace.html:
+        Add a test case for console.trace() / Error stack inside of generators.
+        Modernize the test to reduce redundency and get nicer output.
+
 2016-11-17  Sam Weinig  <[email protected]>
 
         [WebIDL] Add support for ByteString

Modified: trunk/LayoutTests/inspector/debugger/js-stacktrace-expected.txt (208884 => 208885)


--- trunk/LayoutTests/inspector/debugger/js-stacktrace-expected.txt	2016-11-18 15:17:36 UTC (rev 208884)
+++ trunk/LayoutTests/inspector/debugger/js-stacktrace-expected.txt	2016-11-18 18:57:17 UTC (rev 208885)
@@ -1,9 +1,13 @@
-Test that the inspector can parse the stack trace format used by JSC for Error instances and console.trace.
+Tests that we can parse the stack trace format used by _javascript_Core and the contents of Error / console.trace stack traces.
 
+
+== Running test suite: ConsoleTraceAndJavaScriptStackTrace
+-- Running test case: ConsoleTraceAndJavaScriptStackTrace.BasicError
+
 console.trace():
 [
     {
-        "lineNumber": 15,
+        "lineNumber": 10,
         "columnNumber": 22,
         "functionName": "typeError",
         "nativeCode": false,
@@ -10,15 +14,15 @@
         "programCode": false
     },
     {
-        "lineNumber": 6,
+        "lineNumber": 16,
         "columnNumber": 21,
-        "functionName": "typeErrorWrap",
+        "functionName": "triggerTypeError",
         "nativeCode": false,
         "programCode": false
     },
     {
         "lineNumber": 0,
-        "columnNumber": 14,
+        "columnNumber": 17,
         "functionName": "Global Code",
         "nativeCode": false,
         "programCode": true
@@ -30,13 +34,13 @@
     {
         "functionName": "typeError",
         "url": "/inspector/debugger/js-stacktrace.html",
-        "lineNumber": 14,
+        "lineNumber": 9,
         "columnNumber": 30
     },
     {
-        "functionName": "typeErrorWrap",
+        "functionName": "triggerTypeError",
         "url": "/inspector/debugger/js-stacktrace.html",
-        "lineNumber": 7,
+        "lineNumber": 17,
         "columnNumber": 21
     },
     {
@@ -47,10 +51,12 @@
     }
 ]
 
+-- Running test case: ConsoleTraceAndJavaScriptStackTrace.ErrorInNativeCall
+
 console.trace():
 [
     {
-        "lineNumber": 15,
+        "lineNumber": 10,
         "columnNumber": 22,
         "functionName": "typeError",
         "nativeCode": false,
@@ -64,15 +70,15 @@
         "programCode": false
     },
     {
-        "lineNumber": 22,
+        "lineNumber": 20,
         "columnNumber": 20,
-        "functionName": "testWithNativeCallInBetween",
+        "functionName": "triggerTypeErrorWithNativeCallInBetween",
         "nativeCode": false,
         "programCode": false
     },
     {
         "lineNumber": 0,
-        "columnNumber": 28,
+        "columnNumber": 40,
         "functionName": "Global Code",
         "nativeCode": false,
         "programCode": true
@@ -84,7 +90,7 @@
     {
         "functionName": "typeError",
         "url": "/inspector/debugger/js-stacktrace.html",
-        "lineNumber": 14,
+        "lineNumber": 9,
         "columnNumber": 30
     },
     {
@@ -94,9 +100,9 @@
         "columnNumber": 0
     },
     {
-        "functionName": "testWithNativeCallInBetween",
+        "functionName": "triggerTypeErrorWithNativeCallInBetween",
         "url": "/inspector/debugger/js-stacktrace.html",
-        "lineNumber": 23,
+        "lineNumber": 21,
         "columnNumber": 20
     },
     {
@@ -107,19 +113,122 @@
     }
 ]
 
+-- Running test case: ConsoleTraceAndJavaScriptStackTrace.ErrorInAnonymousFunction
+
 Error object:
 [
     {
         "functionName": "",
         "url": "/inspector/debugger/js-stacktrace.html",
-        "lineNumber": 31,
+        "lineNumber": 29,
         "columnNumber": 33
     },
     {
         "functionName": "global code",
         "url": "/inspector/debugger/js-stacktrace.html",
-        "lineNumber": 35,
+        "lineNumber": 33,
         "columnNumber": 3
     }
 ]
 
+-- Running test case: ConsoleTraceAndJavaScriptStackTrace.ErrorInGenerator
+
+console.trace():
+[
+    {
+        "lineNumber": 10,
+        "columnNumber": 22,
+        "functionName": "typeError",
+        "nativeCode": false,
+        "programCode": false
+    },
+    {
+        "lineNumber": 43,
+        "columnNumber": 20,
+        "functionName": "generator2",
+        "nativeCode": false,
+        "programCode": false
+    },
+    {
+        "lineNumber": null,
+        "columnNumber": null,
+        "functionName": "generatorResume",
+        "nativeCode": true,
+        "programCode": false
+    },
+    {
+        "lineNumber": 39,
+        "columnNumber": 12,
+        "functionName": "generator1",
+        "nativeCode": false,
+        "programCode": false
+    },
+    {
+        "lineNumber": null,
+        "columnNumber": null,
+        "functionName": "generatorResume",
+        "nativeCode": true,
+        "programCode": false
+    },
+    {
+        "lineNumber": 47,
+        "columnNumber": 29,
+        "functionName": "triggerGeneratorError",
+        "nativeCode": false,
+        "programCode": false
+    },
+    {
+        "lineNumber": 0,
+        "columnNumber": 22,
+        "functionName": "Global Code",
+        "nativeCode": false,
+        "programCode": true
+    }
+]
+
+Error object:
+[
+    {
+        "functionName": "typeError",
+        "url": "/inspector/debugger/js-stacktrace.html",
+        "lineNumber": 9,
+        "columnNumber": 30
+    },
+    {
+        "functionName": "generator2",
+        "url": "/inspector/debugger/js-stacktrace.html",
+        "lineNumber": 44,
+        "columnNumber": 20
+    },
+    {
+        "functionName": "generatorResume",
+        "url": "[native code]",
+        "lineNumber": 0,
+        "columnNumber": 0
+    },
+    {
+        "functionName": "generator1",
+        "url": "/inspector/debugger/js-stacktrace.html",
+        "lineNumber": 40,
+        "columnNumber": 12
+    },
+    {
+        "functionName": "generatorResume",
+        "url": "[native code]",
+        "lineNumber": 0,
+        "columnNumber": 0
+    },
+    {
+        "functionName": "triggerGeneratorError",
+        "url": "/inspector/debugger/js-stacktrace.html",
+        "lineNumber": 48,
+        "columnNumber": 29
+    },
+    {
+        "functionName": "global code",
+        "url": "",
+        "lineNumber": 0,
+        "columnNumber": 0
+    }
+]
+

Modified: trunk/LayoutTests/inspector/debugger/js-stacktrace.html (208884 => 208885)


--- trunk/LayoutTests/inspector/debugger/js-stacktrace.html	2016-11-18 15:17:36 UTC (rev 208884)
+++ trunk/LayoutTests/inspector/debugger/js-stacktrace.html	2016-11-18 18:57:17 UTC (rev 208885)
@@ -1,15 +1,10 @@
+<!DOCTYPE html>
 <html>
 <head>
 <script src=""
 <script>
-function typeErrorWrap()
-{
-    return typeError();
-}
-
-function typeError()
-{
-    var object = {};
+function typeError() {
+    let object = {};
     try {
         object.propertyDoesnt.exist;
     } catch (e) {
@@ -18,15 +13,18 @@
     }
 }
 
-function testWithNativeCallInBetween()
-{
+function triggerTypeError() {
+    return typeError();
+}
+
+function triggerTypeErrorWithNativeCallInBetween() {
     return [42].map(typeError)[0];
 }
 
-var _anonymousFunctionError = null;
+let _anonymousFunctionError = null;
 
 (function() {
-    var object = {};
+    let object = {};
     try {
         object.methodDoesntExist();
     } catch (e) {
@@ -38,17 +36,54 @@
     return _anonymousFunctionError;
 }
 
+function* generator1() {
+    yield* generator2();
+}
 
+function* generator2() {
+    yield typeError();
+}
+
+function triggerGeneratorError() {
+    return generator1().next().value;
+}
+
 function test()
 {
-    WebInspector.logManager.addEventListener(WebInspector.LogManager.Event.MessageAdded, function(event) {
+    function stripFilePaths(stackTrace) {
+        for (let frame of stackTrace) {
+            if (typeof frame.url ="" "string")
+                frame.url = "" "");
+        }
+        return stackTrace;
+    }
+
+    function stripCallFramesAfterEval(stackTrace) {
+        for (let i = 0; i < stackTrace.length; ++i) {
+            let frame = stackTrace[i];
+            if (frame.programCode)
+                return stackTrace.slice(0, i + 1);
+        }
+        return stackTrace;
+    }
+
+    function stripPayloadAfterGlobalCode(stackTrace) {
+        for (let i = 0; i < stackTrace.length; ++i) {
+            let frame = stackTrace[i];
+            if (frame.functionName === "global code")
+                return stackTrace.slice(0, i + 1);
+        }
+        return stackTrace;
+    }
+
+    WebInspector.logManager.addEventListener(WebInspector.LogManager.Event.MessageAdded, (event) => {
         InspectorTest.log("\nconsole.trace():");
 
-        var stackTrace = [];
-        var callFramesBeforeEval = stripCallFramesAfterEval(event.data.message.stackTrace.callFrames);
-        for (var callFrame of callFramesBeforeEval) {
-            var lineNumber = callFrame.sourceCodeLocation ? callFrame.sourceCodeLocation.lineNumber : null;
-            var columnNumber = callFrame.sourceCodeLocation ? callFrame.sourceCodeLocation.columnNumber : null;
+        let stackTrace = [];
+        let callFramesBeforeEval = stripCallFramesAfterEval(event.data.message.stackTrace.callFrames);
+        for (let callFrame of callFramesBeforeEval) {
+            let lineNumber = callFrame.sourceCodeLocation ? callFrame.sourceCodeLocation.lineNumber : null;
+            let columnNumber = callFrame.sourceCodeLocation ? callFrame.sourceCodeLocation.columnNumber : null;
             stackTrace.push({
                 lineNumber: lineNumber,
                 columnNumber: columnNumber,
@@ -60,82 +95,50 @@
 
         InspectorTest.log(JSON.stringify(stackTrace, null, 4));
     });
+    
 
-    InspectorTest.evaluateInPage("typeErrorWrap()", function(error, result) {
-        InspectorTest.log("\nError object:");
+    let suite = InspectorTest.createAsyncSuite("ConsoleTraceAndJavaScriptStackTrace");
 
-        if (error)
-            InspectorTest.log(error);
+    function addTestCase({name, _expression_}) {
+        suite.addTestCase({
+            name,
+            test(resolve, reject) {
+                InspectorTest.evaluateInPage(_expression_, (error, result) => {
+                    InspectorTest.assert(!error, error);
+                    InspectorTest.log("\nError object:");
+                    let stackTrace = stripFilePaths(stripPayloadAfterGlobalCode(WebInspector.StackTrace._parseStackTrace(result.value)));
+                    InspectorTest.log(JSON.stringify(stackTrace, null, 4));
+                    resolve();
+                });
+            }
+        });
+    }
 
-        var stackTrace = stripPayloadAfterGlobalCode(WebInspector.StackTrace._parseStackTrace(result.value));
-        stackTrace = stripFilePaths(stackTrace);
+    addTestCase({
+        name: "ConsoleTraceAndJavaScriptStackTrace.BasicError",
+        _expression_: "triggerTypeError()",
+    });
 
-        InspectorTest.log(JSON.stringify(stackTrace, null, 4));
-        InspectorTest.completeTest();
+    addTestCase({
+        name: "ConsoleTraceAndJavaScriptStackTrace.ErrorInNativeCall",
+        _expression_: "triggerTypeErrorWithNativeCallInBetween()",
     });
 
-    InspectorTest.evaluateInPage("testWithNativeCallInBetween()", function(error, result) {
-        InspectorTest.log("\nError object:");
-
-        if (error)
-            InspectorTest.log(error);
-
-        var stackTrace = stripPayloadAfterGlobalCode(WebInspector.StackTrace._parseStackTrace(result.value));
-        stackTrace = stripFilePaths(stackTrace);
-
-        InspectorTest.log(JSON.stringify(stackTrace, null, 4));
-        InspectorTest.completeTest();
+    addTestCase({
+        name: "ConsoleTraceAndJavaScriptStackTrace.ErrorInAnonymousFunction",
+        _expression_: "getAnonymousFunctionError()",
     });
 
-    InspectorTest.evaluateInPage("getAnonymousFunctionError()", function(error, result) {
-        InspectorTest.log("\nError object:");
-
-        if (error)
-            InspectorTest.log(error);
-
-        var stackTrace = stripPayloadAfterGlobalCode(WebInspector.StackTrace._parseStackTrace(result.value));
-        stackTrace = stripFilePaths(stackTrace);
-
-        InspectorTest.log(JSON.stringify(stackTrace, null, 4));
-        InspectorTest.completeTest();
+    addTestCase({
+        name: "ConsoleTraceAndJavaScriptStackTrace.ErrorInGenerator",
+        _expression_: "triggerGeneratorError()",
     });
 
-    function stripFilePaths(stackTrace)
-    {
-        for (var frame of stackTrace) {
-            if (typeof frame.url ="" "string")
-                frame.url = "" "");
-        }
-        return stackTrace;
-    }
-
-    function stripCallFramesAfterEval(stackTrace)
-    {
-        var index = 0;
-        for (var frame of stackTrace) {
-            index++;
-            if (frame.programCode)
-                break;
-        }
-        return stackTrace.slice(0, index);
-    }
-
-    function stripPayloadAfterGlobalCode(payload)
-    {
-        var index = 0;
-        for (var frame of payload) {
-            index++;
-            if (frame.functionName === "global code")
-                break;
-        }
-        return payload.slice(0, index);
-    }
+    suite.runTestCasesAndFinish();
 }
 </script>
 </head>
 <body _onload_="runTest()">
-<p>
-Test that the inspector can parse the stack trace format used by JSC for Error instances and console.trace.<br>
-</p>
+<p>Tests that we can parse the stack trace format used by _javascript_Core and the contents of Error / console.trace stack traces.</p>
 </body>
 </html>

Modified: trunk/Source/_javascript_Core/ChangeLog (208884 => 208885)


--- trunk/Source/_javascript_Core/ChangeLog	2016-11-18 15:17:36 UTC (rev 208884)
+++ trunk/Source/_javascript_Core/ChangeLog	2016-11-18 18:57:17 UTC (rev 208885)
@@ -1,3 +1,24 @@
+2016-11-18  Joseph Pecoraro  <[email protected]>
+
+        Web Inspector: Generator functions should have a displayable name when shown in stack traces
+        https://bugs.webkit.org/show_bug.cgi?id=164844
+        <rdar://problem/29300697>
+
+        Reviewed by Yusuke Suzuki.
+
+        * parser/SyntaxChecker.h:
+        (JSC::SyntaxChecker::createGeneratorFunctionBody):
+        * parser/ASTBuilder.h:
+        (JSC::ASTBuilder::createGeneratorFunctionBody):
+        New way to create a generator function with an inferred name.
+
+        * parser/Parser.cpp:
+        (JSC::Parser<LexerType>::parseInner):
+        (JSC::Parser<LexerType>::parseGeneratorFunctionSourceElements):
+        * parser/Parser.h:
+        Pass on the name of the generator wrapper function so we can
+        use it on the inner generator function.
+
 2016-11-17  Ryosuke Niwa  <[email protected]>
 
         Add an experimental API to find elements across shadow boundaries

Modified: trunk/Source/_javascript_Core/parser/ASTBuilder.h (208884 => 208885)


--- trunk/Source/_javascript_Core/parser/ASTBuilder.h	2016-11-18 15:17:36 UTC (rev 208884)
+++ trunk/Source/_javascript_Core/parser/ASTBuilder.h	2016-11-18 18:57:17 UTC (rev 208885)
@@ -389,6 +389,14 @@
         return result;
     }
 
+    ExpressionNode* createGeneratorFunctionBody(const JSTokenLocation& location, const ParserFunctionInfo<ASTBuilder>& functionInfo, const Identifier& name)
+    {
+        FuncExprNode* result = static_cast<FuncExprNode*>(createFunctionExpr(location, functionInfo));
+        if (!name.isNull())
+            result->metadata()->setInferredName(name);
+        return result;
+    }
+
     ExpressionNode* createAsyncFunctionBody(const JSTokenLocation& location, const ParserFunctionInfo<ASTBuilder>& functionInfo, SourceParseMode parseMode)
     {
         if (parseMode == SourceParseMode::AsyncArrowFunctionBodyMode) {

Modified: trunk/Source/_javascript_Core/parser/Parser.cpp (208884 => 208885)


--- trunk/Source/_javascript_Core/parser/Parser.cpp	2016-11-18 15:17:36 UTC (rev 208884)
+++ trunk/Source/_javascript_Core/parser/Parser.cpp	2016-11-18 18:57:17 UTC (rev 208885)
@@ -290,7 +290,7 @@
         else if (isModuleParseMode(parseMode))
             sourceElements = parseModuleSourceElements(context, parseMode);
         else if (parseMode == SourceParseMode::GeneratorWrapperFunctionMode)
-            sourceElements = parseGeneratorFunctionSourceElements(context, CheckForStrictMode);
+            sourceElements = parseGeneratorFunctionSourceElements(context, calleeName, CheckForStrictMode);
         else
             sourceElements = parseSourceElements(context, CheckForStrictMode);
     }
@@ -504,7 +504,7 @@
 }
 
 template <typename LexerType>
-template <class TreeBuilder> TreeSourceElements Parser<LexerType>::parseGeneratorFunctionSourceElements(TreeBuilder& context, SourceElementsMode mode)
+template <class TreeBuilder> TreeSourceElements Parser<LexerType>::parseGeneratorFunctionSourceElements(TreeBuilder& context, const Identifier& name, SourceElementsMode mode)
 {
     auto sourceElements = context.createSourceElements();
 
@@ -537,7 +537,7 @@
     info.endOffset = m_token.m_data.offset;
     info.parametersStartColumn = startColumn;
 
-    auto functionExpr = context.createFunctionExpr(startLocation, info);
+    auto functionExpr = context.createGeneratorFunctionBody(startLocation, info, name);
     auto statement = context.createExprStatement(startLocation, functionExpr, start, m_lastTokenEndPosition.line);
     context.appendStatement(sourceElements, statement);
 

Modified: trunk/Source/_javascript_Core/parser/Parser.h (208884 => 208885)


--- trunk/Source/_javascript_Core/parser/Parser.h	2016-11-18 15:17:36 UTC (rev 208884)
+++ trunk/Source/_javascript_Core/parser/Parser.h	2016-11-18 18:57:17 UTC (rev 208885)
@@ -1468,7 +1468,7 @@
     }
 
     template <class TreeBuilder> TreeSourceElements parseSourceElements(TreeBuilder&, SourceElementsMode);
-    template <class TreeBuilder> TreeSourceElements parseGeneratorFunctionSourceElements(TreeBuilder&, SourceElementsMode);
+    template <class TreeBuilder> TreeSourceElements parseGeneratorFunctionSourceElements(TreeBuilder&, const Identifier& name, SourceElementsMode);
     template <class TreeBuilder> TreeSourceElements parseAsyncFunctionSourceElements(TreeBuilder&, SourceParseMode, bool isArrowFunctionBodyExpression, SourceElementsMode);
     template <class TreeBuilder> TreeStatement parseStatementListItem(TreeBuilder&, const Identifier*& directive, unsigned* directiveLiteralLength);
     template <class TreeBuilder> TreeStatement parseStatement(TreeBuilder&, const Identifier*& directive, unsigned* directiveLiteralLength = 0);

Modified: trunk/Source/_javascript_Core/parser/SyntaxChecker.h (208884 => 208885)


--- trunk/Source/_javascript_Core/parser/SyntaxChecker.h	2016-11-18 15:17:36 UTC (rev 208884)
+++ trunk/Source/_javascript_Core/parser/SyntaxChecker.h	2016-11-18 18:57:17 UTC (rev 208885)
@@ -184,6 +184,7 @@
     ExpressionType createAwait(const JSTokenLocation&, ExpressionType, int, int, int) { return AwaitExpr; }
     ClassExpression createClassExpr(const JSTokenLocation&, const ParserClassInfo<SyntaxChecker>&, VariableEnvironment&, ExpressionType, ExpressionType, PropertyList, PropertyList) { return ClassExpr; }
     ExpressionType createFunctionExpr(const JSTokenLocation&, const ParserFunctionInfo<SyntaxChecker>&) { return FunctionExpr; }
+    ExpressionType createGeneratorFunctionBody(const JSTokenLocation&, const ParserFunctionInfo<SyntaxChecker>&, const Identifier&) { return FunctionExpr; }
     ExpressionType createAsyncFunctionBody(const JSTokenLocation&, const ParserFunctionInfo<SyntaxChecker>&) { return FunctionExpr; }
     int createFunctionMetadata(const JSTokenLocation&, const JSTokenLocation&, int, int, bool, int, int, int, ConstructorKind, SuperBinding, unsigned, int, SourceParseMode, bool, InnerArrowFunctionCodeFeatures = NoInnerArrowFunctionFeatures) { return FunctionBodyResult; }
     ExpressionType createArrowFunctionExpr(const JSTokenLocation&, const ParserFunctionInfo<SyntaxChecker>&) { return FunctionExpr; }
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to