Changeset 124
- Timestamp:
- 11/01/07 03:19:08 (10 months ago)
- Files:
-
- trunk/blade/Blade.d (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/blade/Blade.d
r123 r124 197 197 } 198 198 199 199 /** Generates an assert which ensures that all vectors are of equal length. 200 * If possible, the error will be detected at compile time. 201 */ 200 202 char [] assertAllVectorLengthsEqual(AbstractSyntaxTree tree) 201 203 { 202 204 char [] result =""; 203 int firstVector = -1; 205 int firstVector = findVectorForLength(tree); 206 bool known = arrayLengthIsStatic(tree.symbolTable[firstVector].type); 204 207 for (int i=0; i<tree.symbolTable.length;++i) { 205 208 if (tree.symbolTable[i].rank==1){ 206 if (firstVector==-1) { 207 firstVector = i; 208 } else { 209 if (firstVector != i) { 210 if (known && arrayLengthIsStatic(tree.symbolTable[i].type)) { 211 // both lengths are known at compile time - make it a 212 // compile-time static assert 213 result ~= "static "; 214 } 209 215 result ~= "assert(" ~ tree.symbolTable[i].value 210 216 ~ ".length==" ~ tree.symbolTable[firstVector].value … … 216 222 } 217 223 218 /* 224 // Return true if the type has a length which is known at compile time 225 bool arrayLengthIsStatic(char [] type) 226 { 227 if (type.length<3) return false; 228 return type[$-1]==']' && type[$-2]!='['; 229 } 230 219 231 // Return a vector which contains the length of the expression. 232 // If possible, a vector with known length will be chosen. 220 233 int findVectorForLength(AbstractSyntaxTree tree) 221 234 { 222 } 223 */ 235 int dynamic = 0; // last dynamic vector 236 for (int i=0; i<tree.symbolTable.length; ++i) { 237 if (tree.symbolTable[i].rank==1) { 238 dynamic = i; 239 if (arrayLengthIsStatic(tree.symbolTable[i].type)) return i; 240 } 241 } 242 return dynamic; 243 } 244 245 // Generate inline D code for the expression 246 char [] DCodeGenerator(AbstractSyntaxTree tree) 247 { 248 int lenvec = findVectorForLength(tree); 249 char [] result = "for (int blade_index=0; blade_index<" 250 ~ tree.symbolTable[lenvec].value ~ ".length; ++blade_index) {"; 251 foreach (c; tree.expression) { 252 if (c>='A' && c<'Z') { 253 // restore all symbols into the expression 254 result ~= tree.symbolTable[c-'A'].value; 255 // If it's a vector, index it 256 if (tree.symbolTable[c-'A'].rank==1) 257 result ~= "[blade_index]"; 258 } else result ~= c; 259 } 260 return result ~ "; }"; 261 } 262 224 263 225 264 // Categorise the expression, and dispatch to the appropriate code generator. … … 232 271 return invokeX87(tree); 233 272 } else { 234 return `static assert(0,` ~ wrapInQuotes("Cannot generate ASM for expression " ~ tree.expression) ~ `);`; 273 // return "pragma(msg, " ~ wrapInQuotes(DCodeGenerator(tree)) ~ ");" ~ DCodeGenerator(tree); 274 return DCodeGenerator(tree); 235 275 } 236 276 }
