Changeset 208885 in webkit
- Timestamp:
- Nov 18, 2016, 10:57:17 AM (9 years ago)
- Location:
- trunk
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JSTests/ChangeLog
r208867 r208885 1 2016-11-18 Joseph Pecoraro <pecoraro@apple.com> 2 3 Web Inspector: Generator functions should have a displayable name when shown in stack traces 4 https://bugs.webkit.org/show_bug.cgi?id=164844 5 <rdar://problem/29300697> 6 7 Reviewed by Yusuke Suzuki. 8 9 * stress/generator-function-name.js: 10 Add another test now that we name the inner generator function 11 that we do not break the lexical resolution of names. 12 1 13 2016-11-17 Yusuke Suzuki <utatane.tea@gmail.com> 2 14 -
trunk/JSTests/stress/generator-function-name.js
r192937 r208885 11 11 var g = ok(); 12 12 shouldBe(g.next().value, ok); 13 14 function* generator2(factory) 15 { 16 shouldBe(generator2, factory); 17 }; 18 19 generator2(generator2).next(); -
trunk/LayoutTests/ChangeLog
r208876 r208885 1 2016-11-18 Joseph Pecoraro <pecoraro@apple.com> 2 3 Web Inspector: Generator functions should have a displayable name when shown in stack traces 4 https://bugs.webkit.org/show_bug.cgi?id=164844 5 <rdar://problem/29300697> 6 7 Reviewed by Yusuke Suzuki. 8 9 * inspector/debugger/js-stacktrace-expected.txt: 10 * inspector/debugger/js-stacktrace.html: 11 Add a test case for console.trace() / Error stack inside of generators. 12 Modernize the test to reduce redundency and get nicer output. 13 1 14 2016-11-17 Sam Weinig <sam@webkit.org> 2 15 -
trunk/LayoutTests/inspector/debugger/js-stacktrace-expected.txt
r200533 r208885 1 Test that the inspector can parse the stack trace format used by JSC for Error instances and console.trace. 1 Tests that we can parse the stack trace format used by JavaScriptCore and the contents of Error / console.trace stack traces. 2 3 4 == Running test suite: ConsoleTraceAndJavaScriptStackTrace 5 -- Running test case: ConsoleTraceAndJavaScriptStackTrace.BasicError 2 6 3 7 console.trace(): 4 8 [ 5 9 { 6 "lineNumber": 1 5,7 "columnNumber": 22, 8 "functionName": "typeError", 9 "nativeCode": false, 10 "programCode": false 11 }, 12 { 13 "lineNumber": 6,10 "lineNumber": 10, 11 "columnNumber": 22, 12 "functionName": "typeError", 13 "nativeCode": false, 14 "programCode": false 15 }, 16 { 17 "lineNumber": 16, 14 18 "columnNumber": 21, 15 "functionName": "t ypeErrorWrap",16 "nativeCode": false, 17 "programCode": false 18 }, 19 { 20 "lineNumber": 0, 21 "columnNumber": 1 4,19 "functionName": "triggerTypeError", 20 "nativeCode": false, 21 "programCode": false 22 }, 23 { 24 "lineNumber": 0, 25 "columnNumber": 17, 22 26 "functionName": "Global Code", 23 27 "nativeCode": false, … … 31 35 "functionName": "typeError", 32 36 "url": "/inspector/debugger/js-stacktrace.html", 33 "lineNumber": 14,37 "lineNumber": 9, 34 38 "columnNumber": 30 35 39 }, 36 40 { 37 "functionName": "t ypeErrorWrap",38 "url": "/inspector/debugger/js-stacktrace.html", 39 "lineNumber": 7,41 "functionName": "triggerTypeError", 42 "url": "/inspector/debugger/js-stacktrace.html", 43 "lineNumber": 17, 40 44 "columnNumber": 21 41 45 }, … … 48 52 ] 49 53 54 -- Running test case: ConsoleTraceAndJavaScriptStackTrace.ErrorInNativeCall 55 50 56 console.trace(): 51 57 [ 52 58 { 53 "lineNumber": 1 5,59 "lineNumber": 10, 54 60 "columnNumber": 22, 55 61 "functionName": "typeError", … … 65 71 }, 66 72 { 67 "lineNumber": 2 2,73 "lineNumber": 20, 68 74 "columnNumber": 20, 69 "functionName": "t estWithNativeCallInBetween",70 "nativeCode": false, 71 "programCode": false 72 }, 73 { 74 "lineNumber": 0, 75 "columnNumber": 28,75 "functionName": "triggerTypeErrorWithNativeCallInBetween", 76 "nativeCode": false, 77 "programCode": false 78 }, 79 { 80 "lineNumber": 0, 81 "columnNumber": 40, 76 82 "functionName": "Global Code", 77 83 "nativeCode": false, … … 85 91 "functionName": "typeError", 86 92 "url": "/inspector/debugger/js-stacktrace.html", 87 "lineNumber": 14,93 "lineNumber": 9, 88 94 "columnNumber": 30 89 95 }, … … 95 101 }, 96 102 { 97 "functionName": "t estWithNativeCallInBetween",98 "url": "/inspector/debugger/js-stacktrace.html", 99 "lineNumber": 2 3,103 "functionName": "triggerTypeErrorWithNativeCallInBetween", 104 "url": "/inspector/debugger/js-stacktrace.html", 105 "lineNumber": 21, 100 106 "columnNumber": 20 101 107 }, … … 108 114 ] 109 115 116 -- Running test case: ConsoleTraceAndJavaScriptStackTrace.ErrorInAnonymousFunction 117 110 118 Error object: 111 119 [ … … 113 121 "functionName": "", 114 122 "url": "/inspector/debugger/js-stacktrace.html", 115 "lineNumber": 31,123 "lineNumber": 29, 116 124 "columnNumber": 33 117 125 }, … … 119 127 "functionName": "global code", 120 128 "url": "/inspector/debugger/js-stacktrace.html", 121 "lineNumber": 3 5,129 "lineNumber": 33, 122 130 "columnNumber": 3 123 131 } 124 132 ] 125 133 134 -- Running test case: ConsoleTraceAndJavaScriptStackTrace.ErrorInGenerator 135 136 console.trace(): 137 [ 138 { 139 "lineNumber": 10, 140 "columnNumber": 22, 141 "functionName": "typeError", 142 "nativeCode": false, 143 "programCode": false 144 }, 145 { 146 "lineNumber": 43, 147 "columnNumber": 20, 148 "functionName": "generator2", 149 "nativeCode": false, 150 "programCode": false 151 }, 152 { 153 "lineNumber": null, 154 "columnNumber": null, 155 "functionName": "generatorResume", 156 "nativeCode": true, 157 "programCode": false 158 }, 159 { 160 "lineNumber": 39, 161 "columnNumber": 12, 162 "functionName": "generator1", 163 "nativeCode": false, 164 "programCode": false 165 }, 166 { 167 "lineNumber": null, 168 "columnNumber": null, 169 "functionName": "generatorResume", 170 "nativeCode": true, 171 "programCode": false 172 }, 173 { 174 "lineNumber": 47, 175 "columnNumber": 29, 176 "functionName": "triggerGeneratorError", 177 "nativeCode": false, 178 "programCode": false 179 }, 180 { 181 "lineNumber": 0, 182 "columnNumber": 22, 183 "functionName": "Global Code", 184 "nativeCode": false, 185 "programCode": true 186 } 187 ] 188 189 Error object: 190 [ 191 { 192 "functionName": "typeError", 193 "url": "/inspector/debugger/js-stacktrace.html", 194 "lineNumber": 9, 195 "columnNumber": 30 196 }, 197 { 198 "functionName": "generator2", 199 "url": "/inspector/debugger/js-stacktrace.html", 200 "lineNumber": 44, 201 "columnNumber": 20 202 }, 203 { 204 "functionName": "generatorResume", 205 "url": "[native code]", 206 "lineNumber": 0, 207 "columnNumber": 0 208 }, 209 { 210 "functionName": "generator1", 211 "url": "/inspector/debugger/js-stacktrace.html", 212 "lineNumber": 40, 213 "columnNumber": 12 214 }, 215 { 216 "functionName": "generatorResume", 217 "url": "[native code]", 218 "lineNumber": 0, 219 "columnNumber": 0 220 }, 221 { 222 "functionName": "triggerGeneratorError", 223 "url": "/inspector/debugger/js-stacktrace.html", 224 "lineNumber": 48, 225 "columnNumber": 29 226 }, 227 { 228 "functionName": "global code", 229 "url": "", 230 "lineNumber": 0, 231 "columnNumber": 0 232 } 233 ] 234 -
trunk/LayoutTests/inspector/debugger/js-stacktrace.html
r200533 r208885 1 <!DOCTYPE html> 1 2 <html> 2 3 <head> 3 4 <script src="../../http/tests/inspector/resources/inspector-test.js"></script> 4 5 <script> 5 function typeErrorWrap() 6 { 7 return typeError(); 8 } 9 10 function typeError() 11 { 12 var object = {}; 6 function typeError() { 7 let object = {}; 13 8 try { 14 9 object.propertyDoesnt.exist; … … 19 14 } 20 15 21 function testWithNativeCallInBetween() 22 { 16 function triggerTypeError() { 17 return typeError(); 18 } 19 20 function triggerTypeErrorWithNativeCallInBetween() { 23 21 return [42].map(typeError)[0]; 24 22 } 25 23 26 var_anonymousFunctionError = null;24 let _anonymousFunctionError = null; 27 25 28 26 (function() { 29 varobject = {};27 let object = {}; 30 28 try { 31 29 object.methodDoesntExist(); … … 39 37 } 40 38 39 function* generator1() { 40 yield* generator2(); 41 } 42 43 function* generator2() { 44 yield typeError(); 45 } 46 47 function triggerGeneratorError() { 48 return generator1().next().value; 49 } 41 50 42 51 function test() 43 52 { 44 WebInspector.logManager.addEventListener(WebInspector.LogManager.Event.MessageAdded, function(event) { 53 function stripFilePaths(stackTrace) { 54 for (let frame of stackTrace) { 55 if (typeof frame.url === "string") 56 frame.url = frame.url.replace(/^.+?LayoutTests/, ""); 57 } 58 return stackTrace; 59 } 60 61 function stripCallFramesAfterEval(stackTrace) { 62 for (let i = 0; i < stackTrace.length; ++i) { 63 let frame = stackTrace[i]; 64 if (frame.programCode) 65 return stackTrace.slice(0, i + 1); 66 } 67 return stackTrace; 68 } 69 70 function stripPayloadAfterGlobalCode(stackTrace) { 71 for (let i = 0; i < stackTrace.length; ++i) { 72 let frame = stackTrace[i]; 73 if (frame.functionName === "global code") 74 return stackTrace.slice(0, i + 1); 75 } 76 return stackTrace; 77 } 78 79 WebInspector.logManager.addEventListener(WebInspector.LogManager.Event.MessageAdded, (event) => { 45 80 InspectorTest.log("\nconsole.trace():"); 46 81 47 varstackTrace = [];48 varcallFramesBeforeEval = stripCallFramesAfterEval(event.data.message.stackTrace.callFrames);49 for ( varcallFrame of callFramesBeforeEval) {50 varlineNumber = callFrame.sourceCodeLocation ? callFrame.sourceCodeLocation.lineNumber : null;51 varcolumnNumber = callFrame.sourceCodeLocation ? callFrame.sourceCodeLocation.columnNumber : null;82 let stackTrace = []; 83 let callFramesBeforeEval = stripCallFramesAfterEval(event.data.message.stackTrace.callFrames); 84 for (let callFrame of callFramesBeforeEval) { 85 let lineNumber = callFrame.sourceCodeLocation ? callFrame.sourceCodeLocation.lineNumber : null; 86 let columnNumber = callFrame.sourceCodeLocation ? callFrame.sourceCodeLocation.columnNumber : null; 52 87 stackTrace.push({ 53 88 lineNumber: lineNumber, … … 61 96 InspectorTest.log(JSON.stringify(stackTrace, null, 4)); 62 97 }); 98 63 99 64 InspectorTest.evaluateInPage("typeErrorWrap()", function(error, result) { 65 InspectorTest.log("\nError object:"); 100 let suite = InspectorTest.createAsyncSuite("ConsoleTraceAndJavaScriptStackTrace"); 66 101 67 if (error) 68 InspectorTest.log(error); 102 function addTestCase({name, expression}) { 103 suite.addTestCase({ 104 name, 105 test(resolve, reject) { 106 InspectorTest.evaluateInPage(expression, (error, result) => { 107 InspectorTest.assert(!error, error); 108 InspectorTest.log("\nError object:"); 109 let stackTrace = stripFilePaths(stripPayloadAfterGlobalCode(WebInspector.StackTrace._parseStackTrace(result.value))); 110 InspectorTest.log(JSON.stringify(stackTrace, null, 4)); 111 resolve(); 112 }); 113 } 114 }); 115 } 69 116 70 var stackTrace = stripPayloadAfterGlobalCode(WebInspector.StackTrace._parseStackTrace(result.value)); 71 stackTrace = stripFilePaths(stackTrace); 72 73 InspectorTest.log(JSON.stringify(stackTrace, null, 4)); 74 InspectorTest.completeTest(); 117 addTestCase({ 118 name: "ConsoleTraceAndJavaScriptStackTrace.BasicError", 119 expression: "triggerTypeError()", 75 120 }); 76 121 77 InspectorTest.evaluateInPage("testWithNativeCallInBetween()", function(error, result) { 78 InspectorTest.log("\nError object:"); 79 80 if (error) 81 InspectorTest.log(error); 82 83 var stackTrace = stripPayloadAfterGlobalCode(WebInspector.StackTrace._parseStackTrace(result.value)); 84 stackTrace = stripFilePaths(stackTrace); 85 86 InspectorTest.log(JSON.stringify(stackTrace, null, 4)); 87 InspectorTest.completeTest(); 122 addTestCase({ 123 name: "ConsoleTraceAndJavaScriptStackTrace.ErrorInNativeCall", 124 expression: "triggerTypeErrorWithNativeCallInBetween()", 88 125 }); 89 126 90 InspectorTest.evaluateInPage("getAnonymousFunctionError()", function(error, result) { 91 InspectorTest.log("\nError object:"); 92 93 if (error) 94 InspectorTest.log(error); 95 96 var stackTrace = stripPayloadAfterGlobalCode(WebInspector.StackTrace._parseStackTrace(result.value)); 97 stackTrace = stripFilePaths(stackTrace); 98 99 InspectorTest.log(JSON.stringify(stackTrace, null, 4)); 100 InspectorTest.completeTest(); 127 addTestCase({ 128 name: "ConsoleTraceAndJavaScriptStackTrace.ErrorInAnonymousFunction", 129 expression: "getAnonymousFunctionError()", 101 130 }); 102 131 103 function stripFilePaths(stackTrace) 104 { 105 for (var frame of stackTrace) { 106 if (typeof frame.url === "string") 107 frame.url = frame.url.replace(/^.+?LayoutTests/, ""); 108 } 109 return stackTrace; 110 } 132 addTestCase({ 133 name: "ConsoleTraceAndJavaScriptStackTrace.ErrorInGenerator", 134 expression: "triggerGeneratorError()", 135 }); 111 136 112 function stripCallFramesAfterEval(stackTrace) 113 { 114 var index = 0; 115 for (var frame of stackTrace) { 116 index++; 117 if (frame.programCode) 118 break; 119 } 120 return stackTrace.slice(0, index); 121 } 122 123 function stripPayloadAfterGlobalCode(payload) 124 { 125 var index = 0; 126 for (var frame of payload) { 127 index++; 128 if (frame.functionName === "global code") 129 break; 130 } 131 return payload.slice(0, index); 132 } 137 suite.runTestCasesAndFinish(); 133 138 } 134 139 </script> 135 140 </head> 136 141 <body onload="runTest()"> 137 <p> 138 Test that the inspector can parse the stack trace format used by JSC for Error instances and console.trace.<br> 139 </p> 142 <p>Tests that we can parse the stack trace format used by JavaScriptCore and the contents of Error / console.trace stack traces.</p> 140 143 </body> 141 144 </html> -
trunk/Source/JavaScriptCore/ChangeLog
r208878 r208885 1 2016-11-18 Joseph Pecoraro <pecoraro@apple.com> 2 3 Web Inspector: Generator functions should have a displayable name when shown in stack traces 4 https://bugs.webkit.org/show_bug.cgi?id=164844 5 <rdar://problem/29300697> 6 7 Reviewed by Yusuke Suzuki. 8 9 * parser/SyntaxChecker.h: 10 (JSC::SyntaxChecker::createGeneratorFunctionBody): 11 * parser/ASTBuilder.h: 12 (JSC::ASTBuilder::createGeneratorFunctionBody): 13 New way to create a generator function with an inferred name. 14 15 * parser/Parser.cpp: 16 (JSC::Parser<LexerType>::parseInner): 17 (JSC::Parser<LexerType>::parseGeneratorFunctionSourceElements): 18 * parser/Parser.h: 19 Pass on the name of the generator wrapper function so we can 20 use it on the inner generator function. 21 1 22 2016-11-17 Ryosuke Niwa <rniwa@webkit.org> 2 23 -
trunk/Source/JavaScriptCore/parser/ASTBuilder.h
r207228 r208885 390 390 } 391 391 392 ExpressionNode* createGeneratorFunctionBody(const JSTokenLocation& location, const ParserFunctionInfo<ASTBuilder>& functionInfo, const Identifier& name) 393 { 394 FuncExprNode* result = static_cast<FuncExprNode*>(createFunctionExpr(location, functionInfo)); 395 if (!name.isNull()) 396 result->metadata()->setInferredName(name); 397 return result; 398 } 399 392 400 ExpressionNode* createAsyncFunctionBody(const JSTokenLocation& location, const ParserFunctionInfo<ASTBuilder>& functionInfo, SourceParseMode parseMode) 393 401 { -
trunk/Source/JavaScriptCore/parser/Parser.cpp
r208843 r208885 291 291 sourceElements = parseModuleSourceElements(context, parseMode); 292 292 else if (parseMode == SourceParseMode::GeneratorWrapperFunctionMode) 293 sourceElements = parseGeneratorFunctionSourceElements(context, CheckForStrictMode);293 sourceElements = parseGeneratorFunctionSourceElements(context, calleeName, CheckForStrictMode); 294 294 else 295 295 sourceElements = parseSourceElements(context, CheckForStrictMode); … … 505 505 506 506 template <typename LexerType> 507 template <class TreeBuilder> TreeSourceElements Parser<LexerType>::parseGeneratorFunctionSourceElements(TreeBuilder& context, SourceElementsMode mode)507 template <class TreeBuilder> TreeSourceElements Parser<LexerType>::parseGeneratorFunctionSourceElements(TreeBuilder& context, const Identifier& name, SourceElementsMode mode) 508 508 { 509 509 auto sourceElements = context.createSourceElements(); … … 538 538 info.parametersStartColumn = startColumn; 539 539 540 auto functionExpr = context.create FunctionExpr(startLocation, info);540 auto functionExpr = context.createGeneratorFunctionBody(startLocation, info, name); 541 541 auto statement = context.createExprStatement(startLocation, functionExpr, start, m_lastTokenEndPosition.line); 542 542 context.appendStatement(sourceElements, statement); -
trunk/Source/JavaScriptCore/parser/Parser.h
r208097 r208885 1469 1469 1470 1470 template <class TreeBuilder> TreeSourceElements parseSourceElements(TreeBuilder&, SourceElementsMode); 1471 template <class TreeBuilder> TreeSourceElements parseGeneratorFunctionSourceElements(TreeBuilder&, SourceElementsMode);1471 template <class TreeBuilder> TreeSourceElements parseGeneratorFunctionSourceElements(TreeBuilder&, const Identifier& name, SourceElementsMode); 1472 1472 template <class TreeBuilder> TreeSourceElements parseAsyncFunctionSourceElements(TreeBuilder&, SourceParseMode, bool isArrowFunctionBodyExpression, SourceElementsMode); 1473 1473 template <class TreeBuilder> TreeStatement parseStatementListItem(TreeBuilder&, const Identifier*& directive, unsigned* directiveLiteralLength); -
trunk/Source/JavaScriptCore/parser/SyntaxChecker.h
r207228 r208885 185 185 ClassExpression createClassExpr(const JSTokenLocation&, const ParserClassInfo<SyntaxChecker>&, VariableEnvironment&, ExpressionType, ExpressionType, PropertyList, PropertyList) { return ClassExpr; } 186 186 ExpressionType createFunctionExpr(const JSTokenLocation&, const ParserFunctionInfo<SyntaxChecker>&) { return FunctionExpr; } 187 ExpressionType createGeneratorFunctionBody(const JSTokenLocation&, const ParserFunctionInfo<SyntaxChecker>&, const Identifier&) { return FunctionExpr; } 187 188 ExpressionType createAsyncFunctionBody(const JSTokenLocation&, const ParserFunctionInfo<SyntaxChecker>&) { return FunctionExpr; } 188 189 int createFunctionMetadata(const JSTokenLocation&, const JSTokenLocation&, int, int, bool, int, int, int, ConstructorKind, SuperBinding, unsigned, int, SourceParseMode, bool, InnerArrowFunctionCodeFeatures = NoInnerArrowFunctionFeatures) { return FunctionBodyResult; }
Note:
See TracChangeset
for help on using the changeset viewer.