| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2016 Google Inc. | 2 * Copyright 2016 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "SkSLIRGenerator.h" | 8 #include "SkSLIRGenerator.h" |
| 9 | 9 |
| 10 #include "limits.h" | 10 #include "limits.h" |
| (...skipping 401 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 412 FunctionDeclaration newDecl(f.fPosition, f.fName, parame
ters, *returnType); | 412 FunctionDeclaration newDecl(f.fPosition, f.fName, parame
ters, *returnType); |
| 413 fErrors.error(f.fPosition, "functions '" + newDecl.descr
iption() + | 413 fErrors.error(f.fPosition, "functions '" + newDecl.descr
iption() + |
| 414 "' and '" + other->descriptio
n() + | 414 "' and '" + other->descriptio
n() + |
| 415 "' differ only in return type
"); | 415 "' differ only in return type
"); |
| 416 return nullptr; | 416 return nullptr; |
| 417 } | 417 } |
| 418 decl = other; | 418 decl = other; |
| 419 for (size_t i = 0; i < parameters.size(); i++) { | 419 for (size_t i = 0; i < parameters.size(); i++) { |
| 420 if (parameters[i]->fModifiers != other->fParameters[i]->
fModifiers) { | 420 if (parameters[i]->fModifiers != other->fParameters[i]->
fModifiers) { |
| 421 fErrors.error(f.fPosition, "modifiers on parameter "
+ | 421 fErrors.error(f.fPosition, "modifiers on parameter "
+ |
| 422 to_string(i + 1) + " diff
er between " + | 422 to_string((uint64_t) i +
1) + |
| 423 "declaration and definiti
on"); | 423 " differ between declarat
ion and " |
| 424 "definition"); |
| 424 return nullptr; | 425 return nullptr; |
| 425 } | 426 } |
| 426 } | 427 } |
| 427 if (other->fDefined) { | 428 if (other->fDefined) { |
| 428 fErrors.error(f.fPosition, "duplicate definition of " + | 429 fErrors.error(f.fPosition, "duplicate definition of " + |
| 429 other->description()); | 430 other->description()); |
| 430 } | 431 } |
| 431 break; | 432 break; |
| 432 } | 433 } |
| 433 } | 434 } |
| (...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 609 return nullptr; | 610 return nullptr; |
| 610 } | 611 } |
| 611 if (type.kind() == Type::kScalar_Kind) { | 612 if (type.kind() == Type::kScalar_Kind) { |
| 612 std::vector<std::unique_ptr<Expression>> args; | 613 std::vector<std::unique_ptr<Expression>> args; |
| 613 args.push_back(std::move(expr)); | 614 args.push_back(std::move(expr)); |
| 614 ASTIdentifier id(Position(), type.description()); | 615 ASTIdentifier id(Position(), type.description()); |
| 615 std::unique_ptr<Expression> ctor = this->convertIdentifier(id); | 616 std::unique_ptr<Expression> ctor = this->convertIdentifier(id); |
| 616 ASSERT(ctor); | 617 ASSERT(ctor); |
| 617 return this->call(Position(), std::move(ctor), std::move(args)); | 618 return this->call(Position(), std::move(ctor), std::move(args)); |
| 618 } | 619 } |
| 619 ABORT("cannot coerce %s to %s", expr->fType.description().c_str(), | 620 std::vector<std::unique_ptr<Expression>> args; |
| 620 type.description().c_str()); | 621 args.push_back(std::move(expr)); |
| 622 return std::unique_ptr<Expression>(new Constructor(Position(), type, std::mo
ve(args))); |
| 621 } | 623 } |
| 622 | 624 |
| 623 static bool is_matrix_multiply(const Type& left, const Type& right) { | 625 static bool is_matrix_multiply(const Type& left, const Type& right) { |
| 624 if (left.kind() == Type::kMatrix_Kind) { | 626 if (left.kind() == Type::kMatrix_Kind) { |
| 625 return right.kind() == Type::kMatrix_Kind || right.kind() == Type::kVect
or_Kind; | 627 return right.kind() == Type::kMatrix_Kind || right.kind() == Type::kVect
or_Kind; |
| 626 } | 628 } |
| 627 return left.kind() == Type::kVector_Kind && right.kind() == Type::kMatrix_Ki
nd; | 629 return left.kind() == Type::kVector_Kind && right.kind() == Type::kMatrix_Ki
nd; |
| 628 } | 630 } |
| 629 /** | 631 /** |
| 630 * Determines the operand and result types of a binary expression. Returns true
if the expression is | 632 * Determines the operand and result types of a binary expression. Returns true
if the expression is |
| (...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 825 std::move(test), | 827 std::move(test), |
| 826 std::move(ifTrue), | 828 std::move(ifTrue), |
| 827 std::move(ifFalse))
); | 829 std::move(ifFalse))
); |
| 828 } | 830 } |
| 829 | 831 |
| 830 std::unique_ptr<Expression> IRGenerator::call(Position position, | 832 std::unique_ptr<Expression> IRGenerator::call(Position position, |
| 831 const FunctionDeclaration& functio
n, | 833 const FunctionDeclaration& functio
n, |
| 832 std::vector<std::unique_ptr<Expres
sion>> arguments) { | 834 std::vector<std::unique_ptr<Expres
sion>> arguments) { |
| 833 if (function.fParameters.size() != arguments.size()) { | 835 if (function.fParameters.size() != arguments.size()) { |
| 834 std::string msg = "call to '" + function.fName + "' expected " + | 836 std::string msg = "call to '" + function.fName + "' expected " + |
| 835 to_string(function.fParameters.size()) + | 837 to_string((uint64_t) function.fParameters.size(
)) + |
| 836 " argument"; | 838 " argument"; |
| 837 if (function.fParameters.size() != 1) { | 839 if (function.fParameters.size() != 1) { |
| 838 msg += "s"; | 840 msg += "s"; |
| 839 } | 841 } |
| 840 msg += ", but found " + to_string(arguments.size()); | 842 msg += ", but found " + to_string((uint64_t) arguments.size()); |
| 841 fErrors.error(position, msg); | 843 fErrors.error(position, msg); |
| 842 return nullptr; | 844 return nullptr; |
| 843 } | 845 } |
| 844 for (size_t i = 0; i < arguments.size(); i++) { | 846 for (size_t i = 0; i < arguments.size(); i++) { |
| 845 arguments[i] = this->coerce(std::move(arguments[i]), function.fParameter
s[i]->fType); | 847 arguments[i] = this->coerce(std::move(arguments[i]), function.fParameter
s[i]->fType); |
| 846 if (arguments[i] && (function.fParameters[i]->fModifiers.fFlags & Modifi
ers::kOut_Flag)) { | 848 if (arguments[i] && (function.fParameters[i]->fModifiers.fFlags & Modifi
ers::kOut_Flag)) { |
| 847 this->markWrittenTo(*arguments[i]); | 849 this->markWrittenTo(*arguments[i]); |
| 848 } | 850 } |
| 849 } | 851 } |
| 850 return std::unique_ptr<FunctionCall>(new FunctionCall(position, function, | 852 return std::unique_ptr<FunctionCall>(new FunctionCall(position, function, |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 931 return std::unique_ptr<Expression>(new FloatLiteral(fContext, position,
(double) value)); | 933 return std::unique_ptr<Expression>(new FloatLiteral(fContext, position,
(double) value)); |
| 932 } | 934 } |
| 933 if (args.size() == 1 && args[0]->fType == type) { | 935 if (args.size() == 1 && args[0]->fType == type) { |
| 934 // argument is already the right type, just return it | 936 // argument is already the right type, just return it |
| 935 return std::move(args[0]); | 937 return std::move(args[0]); |
| 936 } | 938 } |
| 937 if (type.isNumber()) { | 939 if (type.isNumber()) { |
| 938 if (args.size() != 1) { | 940 if (args.size() != 1) { |
| 939 fErrors.error(position, "invalid arguments to '" + type.description(
) + | 941 fErrors.error(position, "invalid arguments to '" + type.description(
) + |
| 940 "' constructor, (expected exactly 1 argument
, but found " + | 942 "' constructor, (expected exactly 1 argument
, but found " + |
| 941 to_string(args.size()) + ")"); | 943 to_string((uint64_t) args.size()) + ")"); |
| 942 } | 944 } |
| 943 if (args[0]->fType == *fContext.fBool_Type) { | 945 if (args[0]->fType == *fContext.fBool_Type) { |
| 944 std::unique_ptr<IntLiteral> zero(new IntLiteral(fContext, position,
0)); | 946 std::unique_ptr<IntLiteral> zero(new IntLiteral(fContext, position,
0)); |
| 945 std::unique_ptr<IntLiteral> one(new IntLiteral(fContext, position, 1
)); | 947 std::unique_ptr<IntLiteral> one(new IntLiteral(fContext, position, 1
)); |
| 946 return std::unique_ptr<Expression>( | 948 return std::unique_ptr<Expression>( |
| 947 new TernaryExpression(position, std::mo
ve(args[0]), | 949 new TernaryExpression(position, std::mo
ve(args[0]), |
| 948 this->coerce(std:
:move(one), type), | 950 this->coerce(std:
:move(one), type), |
| 949 this->coerce(std:
:move(zero), | 951 this->coerce(std:
:move(zero), |
| 950 type
))); | 952 type
))); |
| 951 } else if (!args[0]->fType.isNumber()) { | 953 } else if (!args[0]->fType.isNumber()) { |
| (...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1251 case Expression::kIndex_Kind: | 1253 case Expression::kIndex_Kind: |
| 1252 this->markWrittenTo(*((IndexExpression&) expr).fBase); | 1254 this->markWrittenTo(*((IndexExpression&) expr).fBase); |
| 1253 break; | 1255 break; |
| 1254 default: | 1256 default: |
| 1255 fErrors.error(expr.fPosition, "cannot assign to '" + expr.descriptio
n() + "'"); | 1257 fErrors.error(expr.fPosition, "cannot assign to '" + expr.descriptio
n() + "'"); |
| 1256 break; | 1258 break; |
| 1257 } | 1259 } |
| 1258 } | 1260 } |
| 1259 | 1261 |
| 1260 } | 1262 } |
| OLD | NEW |