| Index: src/sksl/SkSLParser.cpp
|
| diff --git a/src/sksl/SkSLParser.cpp b/src/sksl/SkSLParser.cpp
|
| index fa302af0d3debf78f31d2ee0db0fd4912fb616f4..edff0c67d15516a9f4b4f8def23c9bdced04ea36 100644
|
| --- a/src/sksl/SkSLParser.cpp
|
| +++ b/src/sksl/SkSLParser.cpp
|
| @@ -52,6 +52,7 @@
|
| #include "ast/SkSLASTVarDeclarationStatement.h"
|
| #include "ast/SkSLASTWhileStatement.h"
|
| #include "ir/SkSLSymbolTable.h"
|
| +#include "ir/SkSLType.h"
|
|
|
| namespace SkSL {
|
|
|
| @@ -290,17 +291,17 @@ std::unique_ptr<ASTType> Parser::structDeclaration() {
|
| return nullptr;
|
| }
|
| for (size_t i = 0; i < decl->fNames.size(); i++) {
|
| - auto type = std::static_pointer_cast<Type>(fTypes[decl->fType->fName]);
|
| + auto type = (const Type*) fTypes[decl->fType->fName];
|
| for (int j = (int) decl->fSizes[i].size() - 1; j >= 0; j--) {
|
| - if (decl->fSizes[i][j]->fKind == ASTExpression::kInt_Kind) {
|
| + if (decl->fSizes[i][j]->fKind != ASTExpression::kInt_Kind) {
|
| this->error(decl->fPosition, "array size in struct field must be a constant");
|
| }
|
| uint64_t columns = ((ASTIntLiteral&) *decl->fSizes[i][j]).fValue;
|
| std::string name = type->name() + "[" + to_string(columns) + "]";
|
| - type = std::shared_ptr<Type>(new Type(name, Type::kArray_Kind, std::move(type),
|
| - (int) columns));
|
| + type = new Type(name, Type::kArray_Kind, *type, (int) columns);
|
| + fTypes.takeOwnership((Type*) type);
|
| }
|
| - fields.push_back(Type::Field(decl->fModifiers, decl->fNames[i], std::move(type)));
|
| + fields.push_back(Type::Field(decl->fModifiers, decl->fNames[i], *type));
|
| if (decl->fValues[i]) {
|
| this->error(decl->fPosition, "initializers are not permitted on struct fields");
|
| }
|
| @@ -309,9 +310,8 @@ std::unique_ptr<ASTType> Parser::structDeclaration() {
|
| if (!this->expect(Token::RBRACE, "'}'")) {
|
| return nullptr;
|
| }
|
| - std::shared_ptr<Type> type(new Type(name.fText, fields));
|
| - fTypes.add(type->fName, type);
|
| - return std::unique_ptr<ASTType>(new ASTType(name.fPosition, type->fName,
|
| + fTypes.add(name.fText, std::unique_ptr<Type>(new Type(name.fText, fields)));
|
| + return std::unique_ptr<ASTType>(new ASTType(name.fPosition, name.fText,
|
| ASTType::kStruct_Kind));
|
| }
|
|
|
|
|