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; }