aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/sksl/SkSLParser.cpp
diff options
context:
space:
mode:
authorGravatar Ethan Nicholas <ethannicholas@google.com>2017-05-17 10:52:55 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-05-17 15:22:05 +0000
commit4b330dfd3334bf24bf93043acfcd31590a3cdbbf (patch)
tree59eb057e274889ee86e34be55129f2405c5bf055 /src/sksl/SkSLParser.cpp
parentf76984445bbd40a0336e288bfea9c224767ef745 (diff)
skslc comma operator and optimizer fixes
Bug: skia: Change-Id: I732d4fba843c06af570d4a56cadfaa1cc565808c Reviewed-on: https://skia-review.googlesource.com/17125 Commit-Queue: Ethan Nicholas <ethannicholas@google.com> Reviewed-by: Ben Wagner <benjaminwagner@google.com>
Diffstat (limited to 'src/sksl/SkSLParser.cpp')
-rw-r--r--src/sksl/SkSLParser.cpp32
1 files changed, 24 insertions, 8 deletions
diff --git a/src/sksl/SkSLParser.cpp b/src/sksl/SkSLParser.cpp
index 04e25175cb..5e8ec6398b 100644
--- a/src/sksl/SkSLParser.cpp
+++ b/src/sksl/SkSLParser.cpp
@@ -439,8 +439,8 @@ std::unique_ptr<ASTVarDeclarations> Parser::structVarDeclaration(Modifiers modif
return nullptr;
}
-/* (LBRACKET expression? RBRACKET)* (EQ expression)? (COMMA IDENTIFER
- (LBRACKET expression? RBRACKET)* (EQ expression)?)* SEMICOLON */
+/* (LBRACKET expression? RBRACKET)* (EQ assignmentExpression)? (COMMA IDENTIFER
+ (LBRACKET expression? RBRACKET)* (EQ assignmentExpression)?)* SEMICOLON */
std::unique_ptr<ASTVarDeclarations> Parser::varDeclarationEnd(Modifiers mods,
std::unique_ptr<ASTType> type,
String name) {
@@ -462,7 +462,7 @@ std::unique_ptr<ASTVarDeclarations> Parser::varDeclarationEnd(Modifiers mods,
}
std::unique_ptr<ASTExpression> value;
if (this->checkNext(Token::EQ)) {
- value = this->expression();
+ value = this->assignmentExpression();
if (!value) {
return nullptr;
}
@@ -490,7 +490,7 @@ std::unique_ptr<ASTVarDeclarations> Parser::varDeclarationEnd(Modifiers mods,
}
}
if (this->checkNext(Token::EQ)) {
- value = this->expression();
+ value = this->assignmentExpression();
if (!value) {
return nullptr;
}
@@ -1222,7 +1222,24 @@ std::unique_ptr<ASTExpression> Parser::expression() {
if (!depth.checkValid()) {
return nullptr;
}
- return this->assignmentExpression();
+ return this->commaExpression();
+}
+
+/* assignmentExpression (COMMA assignmentExpression)* */
+std::unique_ptr<ASTExpression> Parser::commaExpression() {
+ std::unique_ptr<ASTExpression> result = this->assignmentExpression();
+ if (!result) {
+ return nullptr;
+ }
+ Token t;
+ while (this->checkNext(Token::COMMA, &t)) {
+ std::unique_ptr<ASTExpression> right = this->commaExpression();
+ if (!right) {
+ return nullptr;
+ }
+ result.reset(new ASTBinaryExpression(std::move(result), t, std::move(right)));
+ }
+ return result;
}
/* ternaryExpression ((EQEQ | STAREQ | SLASHEQ | PERCENTEQ | PLUSEQ | MINUSEQ | SHLEQ | SHREQ |
@@ -1587,15 +1604,14 @@ std::unique_ptr<ASTSuffix> Parser::suffix() {
std::vector<std::unique_ptr<ASTExpression>> parameters;
if (this->peek().fKind != Token::RPAREN) {
for (;;) {
- std::unique_ptr<ASTExpression> expr = this->expression();
+ std::unique_ptr<ASTExpression> expr = this->assignmentExpression();
if (!expr) {
return nullptr;
}
parameters.push_back(std::move(expr));
- if (this->peek().fKind != Token::COMMA) {
+ if (!this->checkNext(Token::COMMA)) {
break;
}
- this->nextToken();
}
}
this->expect(Token::RPAREN, "')' to complete function parameters");