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 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
122 if (!statement) { | 122 if (!statement) { |
123 return nullptr; | 123 return nullptr; |
124 } | 124 } |
125 statements.push_back(std::move(statement)); | 125 statements.push_back(std::move(statement)); |
126 } | 126 } |
127 return std::unique_ptr<Block>(new Block(block.fPosition, std::move(statement
s), fSymbolTable)); | 127 return std::unique_ptr<Block>(new Block(block.fPosition, std::move(statement
s), fSymbolTable)); |
128 } | 128 } |
129 | 129 |
130 std::unique_ptr<Statement> IRGenerator::convertVarDeclarationStatement( | 130 std::unique_ptr<Statement> IRGenerator::convertVarDeclarationStatement( |
131 const ASTVarDeclar
ationStatement& s) { | 131 const ASTVarDeclar
ationStatement& s) { |
132 auto decl = this->convertVarDeclaration(*s.fDeclaration, Variable::kLocal_St
orage); | 132 auto decl = this->convertVarDeclarations(*s.fDeclarations, Variable::kLocal_
Storage); |
133 if (!decl) { | 133 if (!decl) { |
134 return nullptr; | 134 return nullptr; |
135 } | 135 } |
136 return std::unique_ptr<Statement>(new VarDeclarationStatement(std::move(decl
))); | 136 return std::unique_ptr<Statement>(new VarDeclarationsStatement(std::move(dec
l))); |
137 } | 137 } |
138 | 138 |
139 Modifiers IRGenerator::convertModifiers(const ASTModifiers& modifiers) { | 139 Modifiers IRGenerator::convertModifiers(const ASTModifiers& modifiers) { |
140 return Modifiers(modifiers); | 140 return Modifiers(modifiers); |
141 } | 141 } |
142 | 142 |
143 std::unique_ptr<VarDeclaration> IRGenerator::convertVarDeclaration(const ASTVarD
eclaration& decl, | 143 std::unique_ptr<VarDeclarations> IRGenerator::convertVarDeclarations(const ASTVa
rDeclarations& decl, |
144 Variable::Sto
rage storage) { | 144 Variable::S
torage storage) { |
145 std::vector<const Variable*> variables; | 145 std::vector<VarDeclaration> variables; |
146 std::vector<std::vector<std::unique_ptr<Expression>>> sizes; | |
147 std::vector<std::unique_ptr<Expression>> values; | |
148 const Type* baseType = this->convertType(*decl.fType); | 146 const Type* baseType = this->convertType(*decl.fType); |
149 if (!baseType) { | 147 if (!baseType) { |
150 return nullptr; | 148 return nullptr; |
151 } | 149 } |
152 for (size_t i = 0; i < decl.fNames.size(); i++) { | 150 for (const auto& varDecl : decl.fVars) { |
153 Modifiers modifiers = this->convertModifiers(decl.fModifiers); | 151 Modifiers modifiers = this->convertModifiers(decl.fModifiers); |
154 const Type* type = baseType; | 152 const Type* type = baseType; |
155 ASSERT(type->kind() != Type::kArray_Kind); | 153 ASSERT(type->kind() != Type::kArray_Kind); |
156 std::vector<std::unique_ptr<Expression>> currentVarSizes; | 154 std::vector<std::unique_ptr<Expression>> sizes; |
157 for (size_t j = 0; j < decl.fSizes[i].size(); j++) { | 155 for (const auto& rawSize : varDecl.fSizes) { |
158 if (decl.fSizes[i][j]) { | 156 if (rawSize) { |
159 ASTExpression& rawSize = *decl.fSizes[i][j]; | 157 auto size = this->coerce(this->convertExpression(*rawSize), *fCo
ntext.fInt_Type); |
160 auto size = this->coerce(this->convertExpression(rawSize), *fCon
text.fInt_Type); | |
161 if (!size) { | 158 if (!size) { |
162 return nullptr; | 159 return nullptr; |
163 } | 160 } |
164 std::string name = type->fName; | 161 std::string name = type->fName; |
165 uint64_t count; | 162 uint64_t count; |
166 if (size->fKind == Expression::kIntLiteral_Kind) { | 163 if (size->fKind == Expression::kIntLiteral_Kind) { |
167 count = ((IntLiteral&) *size).fValue; | 164 count = ((IntLiteral&) *size).fValue; |
168 if (count <= 0) { | 165 if (count <= 0) { |
169 fErrors.error(size->fPosition, "array size must be posit
ive"); | 166 fErrors.error(size->fPosition, "array size must be posit
ive"); |
170 } | 167 } |
171 name += "[" + to_string(count) + "]"; | 168 name += "[" + to_string(count) + "]"; |
172 } else { | 169 } else { |
173 count = -1; | 170 count = -1; |
174 name += "[]"; | 171 name += "[]"; |
175 } | 172 } |
176 type = new Type(name, Type::kArray_Kind, *type, (int) count); | 173 type = new Type(name, Type::kArray_Kind, *type, (int) count); |
177 fSymbolTable->takeOwnership((Type*) type); | 174 fSymbolTable->takeOwnership((Type*) type); |
178 currentVarSizes.push_back(std::move(size)); | 175 sizes.push_back(std::move(size)); |
179 } else { | 176 } else { |
180 type = new Type(type->fName + "[]", Type::kArray_Kind, *type, -1
); | 177 type = new Type(type->fName + "[]", Type::kArray_Kind, *type, -1
); |
181 fSymbolTable->takeOwnership((Type*) type); | 178 fSymbolTable->takeOwnership((Type*) type); |
182 currentVarSizes.push_back(nullptr); | 179 sizes.push_back(nullptr); |
183 } | 180 } |
184 } | 181 } |
185 auto var = std::unique_ptr<Variable>(new Variable(decl.fPosition, modifi
ers, decl.fNames[i], | 182 auto var = std::unique_ptr<Variable>(new Variable(decl.fPosition, modifi
ers, varDecl.fName, |
186 *type, storage)); | 183 *type, storage)); |
187 std::unique_ptr<Expression> value; | 184 std::unique_ptr<Expression> value; |
188 if (decl.fValues[i]) { | 185 if (varDecl.fValue) { |
189 value = this->convertExpression(*decl.fValues[i]); | 186 value = this->convertExpression(*varDecl.fValue); |
190 if (!value) { | 187 if (!value) { |
191 return nullptr; | 188 return nullptr; |
192 } | 189 } |
193 value = this->coerce(std::move(value), *type); | 190 value = this->coerce(std::move(value), *type); |
194 } | 191 } |
195 if ("gl_FragCoord" == decl.fNames[i] && (*fSymbolTable)[decl.fNames[i]])
{ | 192 if ("gl_FragCoord" == varDecl.fName && (*fSymbolTable)[varDecl.fName]) { |
196 // already defined, just update the modifiers | 193 // already defined, just update the modifiers |
197 Variable* old = (Variable*) (*fSymbolTable)[decl.fNames[i]]; | 194 Variable* old = (Variable*) (*fSymbolTable)[varDecl.fName]; |
198 old->fModifiers = var->fModifiers; | 195 old->fModifiers = var->fModifiers; |
199 } else { | 196 } else { |
200 variables.push_back(var.get()); | 197 variables.emplace_back(var.get(), std::move(sizes), std::move(value)
); |
201 fSymbolTable->add(decl.fNames[i], std::move(var)); | 198 fSymbolTable->add(varDecl.fName, std::move(var)); |
202 values.push_back(std::move(value)); | |
203 sizes.push_back(std::move(currentVarSizes)); | |
204 } | 199 } |
205 } | 200 } |
206 return std::unique_ptr<VarDeclaration>(new VarDeclaration(decl.fPosition, | 201 return std::unique_ptr<VarDeclarations>(new VarDeclarations(decl.fPosition, |
207 baseType, | 202 baseType, |
208 std::move(variable
s), | 203 std::move(variab
les))); |
209 std::move(sizes), | |
210 std::move(values))
); | |
211 } | 204 } |
212 | 205 |
213 std::unique_ptr<Statement> IRGenerator::convertIf(const ASTIfStatement& s) { | 206 std::unique_ptr<Statement> IRGenerator::convertIf(const ASTIfStatement& s) { |
214 std::unique_ptr<Expression> test = this->coerce(this->convertExpression(*s.f
Test), | 207 std::unique_ptr<Expression> test = this->coerce(this->convertExpression(*s.f
Test), |
215 *fContext.fBool_Type); | 208 *fContext.fBool_Type); |
216 if (!test) { | 209 if (!test) { |
217 return nullptr; | 210 return nullptr; |
218 } | 211 } |
219 std::unique_ptr<Statement> ifTrue = this->convertStatement(*s.fIfTrue); | 212 std::unique_ptr<Statement> ifTrue = this->convertStatement(*s.fIfTrue); |
220 if (!ifTrue) { | 213 if (!ifTrue) { |
(...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
475 } | 468 } |
476 return nullptr; | 469 return nullptr; |
477 } | 470 } |
478 | 471 |
479 std::unique_ptr<InterfaceBlock> IRGenerator::convertInterfaceBlock(const ASTInte
rfaceBlock& intf) { | 472 std::unique_ptr<InterfaceBlock> IRGenerator::convertInterfaceBlock(const ASTInte
rfaceBlock& intf) { |
480 std::shared_ptr<SymbolTable> old = fSymbolTable; | 473 std::shared_ptr<SymbolTable> old = fSymbolTable; |
481 AutoSymbolTable table(this); | 474 AutoSymbolTable table(this); |
482 Modifiers mods = this->convertModifiers(intf.fModifiers); | 475 Modifiers mods = this->convertModifiers(intf.fModifiers); |
483 std::vector<Type::Field> fields; | 476 std::vector<Type::Field> fields; |
484 for (size_t i = 0; i < intf.fDeclarations.size(); i++) { | 477 for (size_t i = 0; i < intf.fDeclarations.size(); i++) { |
485 std::unique_ptr<VarDeclaration> decl = this->convertVarDeclaration( | 478 std::unique_ptr<VarDeclarations> decl = this->convertVarDeclarations( |
486 *intf.f
Declarations[i], | 479 *intf.f
Declarations[i], |
487 Variabl
e::kGlobal_Storage); | 480 Variabl
e::kGlobal_Storage); |
488 for (size_t j = 0; j < decl->fVars.size(); j++) { | 481 for (const auto& var : decl->fVars) { |
489 fields.push_back(Type::Field(decl->fVars[j]->fModifiers, decl->fVars
[j]->fName, | 482 fields.push_back(Type::Field(var.fVar->fModifiers, var.fVar->fName, |
490 &decl->fVars[j]->fType)); | 483 &var.fVar->fType)); |
491 if (decl->fValues[j]) { | 484 if (var.fValue) { |
492 fErrors.error(decl->fPosition, | 485 fErrors.error(decl->fPosition, |
493 "initializers are not permitted on interface block
fields"); | 486 "initializers are not permitted on interface block
fields"); |
494 } | 487 } |
495 if (decl->fVars[j]->fModifiers.fFlags & (Modifiers::kIn_Flag | | 488 if (var.fVar->fModifiers.fFlags & (Modifiers::kIn_Flag | |
496 Modifiers::kOut_Flag | | 489 Modifiers::kOut_Flag | |
497 Modifiers::kUniform_Flag | | 490 Modifiers::kUniform_Flag | |
498 Modifiers::kConst_Flag)) { | 491 Modifiers::kConst_Flag)) { |
499 fErrors.error(decl->fPosition, | 492 fErrors.error(decl->fPosition, |
500 "interface block fields may not have storage quali
fiers"); | 493 "interface block fields may not have storage quali
fiers"); |
501 } | 494 } |
502 } | 495 } |
503 } | 496 } |
504 Type* type = new Type(intf.fInterfaceName, fields); | 497 Type* type = new Type(intf.fInterfaceName, fields); |
505 fSymbolTable->takeOwnership(type); | 498 fSymbolTable->takeOwnership(type); |
506 std::string name = intf.fValueName.length() > 0 ? intf.fValueName : intf.fIn
terfaceName; | 499 std::string name = intf.fValueName.length() > 0 ? intf.fValueName : intf.fIn
terfaceName; |
507 Variable* var = new Variable(intf.fPosition, mods, name, *type, Variable::kG
lobal_Storage); | 500 Variable* var = new Variable(intf.fPosition, mods, name, *type, Variable::kG
lobal_Storage); |
508 fSymbolTable->takeOwnership(var); | 501 fSymbolTable->takeOwnership(var); |
509 if (intf.fValueName.length()) { | 502 if (intf.fValueName.length()) { |
(...skipping 748 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1258 case Expression::kIndex_Kind: | 1251 case Expression::kIndex_Kind: |
1259 this->markWrittenTo(*((IndexExpression&) expr).fBase); | 1252 this->markWrittenTo(*((IndexExpression&) expr).fBase); |
1260 break; | 1253 break; |
1261 default: | 1254 default: |
1262 fErrors.error(expr.fPosition, "cannot assign to '" + expr.descriptio
n() + "'"); | 1255 fErrors.error(expr.fPosition, "cannot assign to '" + expr.descriptio
n() + "'"); |
1263 break; | 1256 break; |
1264 } | 1257 } |
1265 } | 1258 } |
1266 | 1259 |
1267 } | 1260 } |
OLD | NEW |