| Index: src/sksl/SkSLIRGenerator.cpp
|
| diff --git a/src/sksl/SkSLIRGenerator.cpp b/src/sksl/SkSLIRGenerator.cpp
|
| index 9b0271b0bbe7e468074853194fb6e47c0ce9d69b..c30cac17d76db3626ab059d6ecb6c1ff249ad56a 100644
|
| --- a/src/sksl/SkSLIRGenerator.cpp
|
| +++ b/src/sksl/SkSLIRGenerator.cpp
|
| @@ -129,35 +129,32 @@ std::unique_ptr<Block> IRGenerator::convertBlock(const ASTBlock& block) {
|
|
|
| std::unique_ptr<Statement> IRGenerator::convertVarDeclarationStatement(
|
| const ASTVarDeclarationStatement& s) {
|
| - auto decl = this->convertVarDeclaration(*s.fDeclaration, Variable::kLocal_Storage);
|
| + auto decl = this->convertVarDeclarations(*s.fDeclarations, Variable::kLocal_Storage);
|
| if (!decl) {
|
| return nullptr;
|
| }
|
| - return std::unique_ptr<Statement>(new VarDeclarationStatement(std::move(decl)));
|
| + return std::unique_ptr<Statement>(new VarDeclarationsStatement(std::move(decl)));
|
| }
|
|
|
| Modifiers IRGenerator::convertModifiers(const ASTModifiers& modifiers) {
|
| return Modifiers(modifiers);
|
| }
|
|
|
| -std::unique_ptr<VarDeclaration> IRGenerator::convertVarDeclaration(const ASTVarDeclaration& decl,
|
| - Variable::Storage storage) {
|
| - std::vector<const Variable*> variables;
|
| - std::vector<std::vector<std::unique_ptr<Expression>>> sizes;
|
| - std::vector<std::unique_ptr<Expression>> values;
|
| +std::unique_ptr<VarDeclarations> IRGenerator::convertVarDeclarations(const ASTVarDeclarations& decl,
|
| + Variable::Storage storage) {
|
| + std::vector<VarDeclaration> variables;
|
| const Type* baseType = this->convertType(*decl.fType);
|
| if (!baseType) {
|
| return nullptr;
|
| }
|
| - for (size_t i = 0; i < decl.fNames.size(); i++) {
|
| + for (const auto& varDecl : decl.fVars) {
|
| Modifiers modifiers = this->convertModifiers(decl.fModifiers);
|
| const Type* type = baseType;
|
| ASSERT(type->kind() != Type::kArray_Kind);
|
| - std::vector<std::unique_ptr<Expression>> currentVarSizes;
|
| - for (size_t j = 0; j < decl.fSizes[i].size(); j++) {
|
| - if (decl.fSizes[i][j]) {
|
| - ASTExpression& rawSize = *decl.fSizes[i][j];
|
| - auto size = this->coerce(this->convertExpression(rawSize), *fContext.fInt_Type);
|
| + std::vector<std::unique_ptr<Expression>> sizes;
|
| + for (const auto& rawSize : varDecl.fSizes) {
|
| + if (rawSize) {
|
| + auto size = this->coerce(this->convertExpression(*rawSize), *fContext.fInt_Type);
|
| if (!size) {
|
| return nullptr;
|
| }
|
| @@ -175,39 +172,35 @@ std::unique_ptr<VarDeclaration> IRGenerator::convertVarDeclaration(const ASTVarD
|
| }
|
| type = new Type(name, Type::kArray_Kind, *type, (int) count);
|
| fSymbolTable->takeOwnership((Type*) type);
|
| - currentVarSizes.push_back(std::move(size));
|
| + sizes.push_back(std::move(size));
|
| } else {
|
| type = new Type(type->fName + "[]", Type::kArray_Kind, *type, -1);
|
| fSymbolTable->takeOwnership((Type*) type);
|
| - currentVarSizes.push_back(nullptr);
|
| + sizes.push_back(nullptr);
|
| }
|
| }
|
| - auto var = std::unique_ptr<Variable>(new Variable(decl.fPosition, modifiers, decl.fNames[i],
|
| + auto var = std::unique_ptr<Variable>(new Variable(decl.fPosition, modifiers, varDecl.fName,
|
| *type, storage));
|
| std::unique_ptr<Expression> value;
|
| - if (decl.fValues[i]) {
|
| - value = this->convertExpression(*decl.fValues[i]);
|
| + if (varDecl.fValue) {
|
| + value = this->convertExpression(*varDecl.fValue);
|
| if (!value) {
|
| return nullptr;
|
| }
|
| value = this->coerce(std::move(value), *type);
|
| }
|
| - if ("gl_FragCoord" == decl.fNames[i] && (*fSymbolTable)[decl.fNames[i]]) {
|
| + if ("gl_FragCoord" == varDecl.fName && (*fSymbolTable)[varDecl.fName]) {
|
| // already defined, just update the modifiers
|
| - Variable* old = (Variable*) (*fSymbolTable)[decl.fNames[i]];
|
| + Variable* old = (Variable*) (*fSymbolTable)[varDecl.fName];
|
| old->fModifiers = var->fModifiers;
|
| } else {
|
| - variables.push_back(var.get());
|
| - fSymbolTable->add(decl.fNames[i], std::move(var));
|
| - values.push_back(std::move(value));
|
| - sizes.push_back(std::move(currentVarSizes));
|
| + variables.emplace_back(var.get(), std::move(sizes), std::move(value));
|
| + fSymbolTable->add(varDecl.fName, std::move(var));
|
| }
|
| }
|
| - return std::unique_ptr<VarDeclaration>(new VarDeclaration(decl.fPosition,
|
| - baseType,
|
| - std::move(variables),
|
| - std::move(sizes),
|
| - std::move(values)));
|
| + return std::unique_ptr<VarDeclarations>(new VarDeclarations(decl.fPosition,
|
| + baseType,
|
| + std::move(variables)));
|
| }
|
|
|
| std::unique_ptr<Statement> IRGenerator::convertIf(const ASTIfStatement& s) {
|
| @@ -482,21 +475,21 @@ std::unique_ptr<InterfaceBlock> IRGenerator::convertInterfaceBlock(const ASTInte
|
| Modifiers mods = this->convertModifiers(intf.fModifiers);
|
| std::vector<Type::Field> fields;
|
| for (size_t i = 0; i < intf.fDeclarations.size(); i++) {
|
| - std::unique_ptr<VarDeclaration> decl = this->convertVarDeclaration(
|
| + std::unique_ptr<VarDeclarations> decl = this->convertVarDeclarations(
|
| *intf.fDeclarations[i],
|
| Variable::kGlobal_Storage);
|
| - for (size_t j = 0; j < decl->fVars.size(); j++) {
|
| - fields.push_back(Type::Field(decl->fVars[j]->fModifiers, decl->fVars[j]->fName,
|
| - &decl->fVars[j]->fType));
|
| - if (decl->fValues[j]) {
|
| + for (const auto& var : decl->fVars) {
|
| + fields.push_back(Type::Field(var.fVar->fModifiers, var.fVar->fName,
|
| + &var.fVar->fType));
|
| + if (var.fValue) {
|
| fErrors.error(decl->fPosition,
|
| "initializers are not permitted on interface block fields");
|
| }
|
| - if (decl->fVars[j]->fModifiers.fFlags & (Modifiers::kIn_Flag |
|
| - Modifiers::kOut_Flag |
|
| - Modifiers::kUniform_Flag |
|
| - Modifiers::kConst_Flag)) {
|
| - fErrors.error(decl->fPosition,
|
| + if (var.fVar->fModifiers.fFlags & (Modifiers::kIn_Flag |
|
| + Modifiers::kOut_Flag |
|
| + Modifiers::kUniform_Flag |
|
| + Modifiers::kConst_Flag)) {
|
| + fErrors.error(decl->fPosition,
|
| "interface block fields may not have storage qualifiers");
|
| }
|
| }
|
|
|