Changeset 248650 in webkit
- Timestamp:
- Aug 13, 2019 6:05:27 PM (5 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r248648 r248650 1 2019-08-13 Robin Morisset <rmorisset@apple.com> 2 3 [WHLSL] Don't generate empty comma expressions for bare ';' 4 https://bugs.webkit.org/show_bug.cgi?id=200681 5 6 Reviewed by Myles C. Maxfield. 7 8 Currently we emit a comma expression with no sub-expression for bare ';', as well as for the initialization of for loops with no initializers. 9 This crashes the Checker, as it tries to access the last sub-expression of comma expressions. 10 Instead we should generate an empty statement block for that case. 11 12 This problem was found (and originally fixed before the commit was reverted) in https://bugs.webkit.org/show_bug.cgi?id=199726. 13 I am just isolating the fix here for easier review and debugging. 14 15 New test: LayoutTests/webgpu/whlsl/for-loop.html 16 17 * Modules/webgpu/WHLSL/AST/WHLSLForLoop.h: 18 * Modules/webgpu/WHLSL/Metal/WHLSLFunctionWriter.cpp: 19 (WebCore::WHLSL::Metal::FunctionDefinitionWriter::visit): 20 * Modules/webgpu/WHLSL/WHLSLASTDumper.cpp: 21 (WebCore::WHLSL::ASTDumper::visit): 22 * Modules/webgpu/WHLSL/WHLSLChecker.cpp: 23 (WebCore::WHLSL::Checker::visit): 24 * Modules/webgpu/WHLSL/WHLSLParser.cpp: 25 (WebCore::WHLSL::Parser::parseForLoop): 26 (WebCore::WHLSL::Parser::parseStatement): 27 (WebCore::WHLSL::Parser::parseEffectfulExpression): 28 * Modules/webgpu/WHLSL/WHLSLParser.h: 29 * Modules/webgpu/WHLSL/WHLSLVisitor.cpp: 30 (WebCore::WHLSL::Visitor::visit): 31 1 32 2019-08-13 Daniel Bates <dabates@apple.com> 2 33 -
trunk/Source/WebCore/Modules/webgpu/WHLSL/AST/WHLSLForLoop.h
r248488 r248650 46 46 WTF_MAKE_FAST_ALLOCATED; 47 47 public: 48 ForLoop(CodeLocation location, Variant<UniqueRef<Statement>, UniqueRef<Expression>>&& initialization, std::unique_ptr<Expression>&& condition, std::unique_ptr<Expression>&& increment, UniqueRef<Statement>&& body)48 ForLoop(CodeLocation location, UniqueRef<Statement>&& initialization, std::unique_ptr<Expression>&& condition, std::unique_ptr<Expression>&& increment, UniqueRef<Statement>&& body) 49 49 : Statement(location, Kind::ForLoop) 50 50 , m_initialization(WTFMove(initialization)) … … 60 60 ForLoop(ForLoop&&) = default; 61 61 62 Variant<UniqueRef<Statement>, UniqueRef<Expression>>& initialization() { return m_initialization; }62 UniqueRef<Statement>& initialization() { return m_initialization; } 63 63 Expression* condition() { return m_condition.get(); } 64 64 Expression* increment() { return m_increment.get(); } … … 66 66 67 67 private: 68 Variant<UniqueRef<Statement>, UniqueRef<Expression>> m_initialization;68 UniqueRef<Statement> m_initialization; 69 69 std::unique_ptr<Expression> m_condition; 70 70 std::unique_ptr<Expression> m_increment; -
trunk/Source/WebCore/Modules/webgpu/WHLSL/Metal/WHLSLFunctionWriter.cpp
r248384 r248650 357 357 { 358 358 m_stringBuilder.append("{\n"); 359 360 WTF::visit(WTF::makeVisitor([&](AST::Statement& statement) { 361 checkErrorAndVisit(statement); 362 }, [&](UniqueRef<AST::Expression>& expression) { 363 checkErrorAndVisit(expression); 364 takeLastValue(); // We don't need to do anything with the result. 365 }), forLoop.initialization()); 366 359 checkErrorAndVisit(forLoop.initialization()); 367 360 emitLoop(LoopConditionLocation::BeforeBody, forLoop.condition(), forLoop.increment(), forLoop.body()); 368 361 m_stringBuilder.append("}\n"); -
trunk/Source/WebCore/Modules/webgpu/WHLSL/WHLSLASTDumper.cpp
r248021 r248650 410 410 { 411 411 m_out.print("for ("); 412 WTF::visit(WTF::makeVisitor([&](UniqueRef<AST::Statement>& statement) { 413 visit(statement); 414 }, [&](UniqueRef<AST::Expression>& expression) { 415 visit(expression); 416 }), forLoop.initialization()); 412 visit(forLoop.initialization()); 417 413 m_out.print("; "); 418 414 if (forLoop.condition()) -
trunk/Source/WebCore/Modules/webgpu/WHLSL/WHLSLChecker.cpp
r248378 r248650 1444 1444 void Checker::visit(AST::ForLoop& forLoop) 1445 1445 { 1446 WTF::visit(WTF::makeVisitor([&](UniqueRef<AST::Statement>& statement) { 1447 checkErrorAndVisit(statement); 1448 }, [&](UniqueRef<AST::Expression>& expression) { 1449 checkErrorAndVisit(expression); 1450 }), forLoop.initialization()); 1446 checkErrorAndVisit(forLoop.initialization()); 1451 1447 if (hasError()) 1452 1448 return; -
trunk/Source/WebCore/Modules/webgpu/WHLSL/WHLSLParser.cpp
r248488 r248650 1164 1164 CONSUME_TYPE(leftParenthesis, LeftParenthesis); 1165 1165 1166 auto parseRemainder = [&]( Variant<UniqueRef<AST::Statement>, UniqueRef<AST::Expression>>&& initialization) -> Expected<AST::ForLoop, Error> {1166 auto parseRemainder = [&](UniqueRef<AST::Statement>&& initialization) -> Expected<AST::ForLoop, Error> { 1167 1167 CONSUME_TYPE(semicolon, Semicolon); 1168 1168 … … 1357 1357 1358 1358 { 1359 auto effectfulExpression = backtrackingScope<Expected<UniqueRef<AST:: Expression>, Error>>([&]() -> Expected<UniqueRef<AST::Expression>, Error> {1359 auto effectfulExpression = backtrackingScope<Expected<UniqueRef<AST::Statement>, Error>>([&]() -> Expected<UniqueRef<AST::Statement>, Error> { 1360 1360 PARSE(result, EffectfulExpression); 1361 1361 CONSUME_TYPE(semicolon, Semicolon); … … 1363 1363 }); 1364 1364 if (effectfulExpression) 1365 return { makeUniqueRef<AST::EffectfulExpressionStatement>(WTFMove(*effectfulExpression)) };1365 return WTFMove(*effectfulExpression); 1366 1366 } 1367 1367 … … 1371 1371 } 1372 1372 1373 auto Parser::parseEffectfulExpression() -> Expected<UniqueRef<AST:: Expression>, Error>1373 auto Parser::parseEffectfulExpression() -> Expected<UniqueRef<AST::Statement>, Error> 1374 1374 { 1375 1375 PEEK(origin); 1376 if (origin->type == Token::Type::Semicolon) 1377 return { makeUniqueRef<AST::Block>(*origin, Vector<UniqueRef<AST::Statement>>()) }; 1378 1376 1379 Vector<UniqueRef<AST::Expression>> expressions; 1377 if (origin->type == Token::Type::Semicolon)1378 return { makeUniqueRef<AST::CommaExpression>(*origin, WTFMove(expressions)) };1379 1380 1380 PARSE(effectfulExpression, EffectfulAssignment); 1381 1381 expressions.append(WTFMove(*effectfulExpression)); … … 1387 1387 1388 1388 if (expressions.size() == 1) 1389 return WTFMove(expressions[0]);1389 return { makeUniqueRef<AST::EffectfulExpressionStatement>(WTFMove(expressions[0])) }; 1390 1390 unsigned endOffset = m_lexer.peek().startOffset(); 1391 1391 CodeLocation location(origin->startOffset(), endOffset); 1392 return { makeUniqueRef<AST::CommaExpression>(location, WTFMove(expressions)) }; 1392 auto commaExpression = makeUniqueRef<AST::CommaExpression>(location, WTFMove(expressions)); 1393 return { makeUniqueRef<AST::EffectfulExpressionStatement>(WTFMove(commaExpression)) }; 1393 1394 } 1394 1395 -
trunk/Source/WebCore/Modules/webgpu/WHLSL/WHLSLParser.h
r248303 r248650 132 132 Expected<UniqueRef<AST::Statement>, Error> parseStatement(); 133 133 134 Expected<UniqueRef<AST:: Expression>, Error> parseEffectfulExpression();134 Expected<UniqueRef<AST::Statement>, Error> parseEffectfulExpression(); 135 135 Expected<UniqueRef<AST::Expression>, Error> parseEffectfulAssignment(); 136 136 struct SuffixExpression { -
trunk/Source/WebCore/Modules/webgpu/WHLSL/WHLSLVisitor.cpp
r248488 r248650 462 462 void Visitor::visit(AST::ForLoop& forLoop) 463 463 { 464 WTF::visit(WTF::makeVisitor([&](UniqueRef<AST::Statement>& statement) { 465 checkErrorAndVisit(statement); 466 }, [&](UniqueRef<AST::Expression>& expression) { 467 checkErrorAndVisit(expression); 468 }), forLoop.initialization()); 464 checkErrorAndVisit(forLoop.initialization()); 469 465 if (forLoop.condition()) 470 466 checkErrorAndVisit(*forLoop.condition());
Note: See TracChangeset
for help on using the changeset viewer.