Changeset 124

Show
Ignore:
Timestamp:
11/01/07 03:19:08 (10 months ago)
Author:
Don Clugston
Message:

Added a D code generator. So trivial...
Vector length mismatches are now detected at compile-time, if possible.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/blade/Blade.d

    r123 r124  
    197197} 
    198198 
    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 */ 
    200202char [] assertAllVectorLengthsEqual(AbstractSyntaxTree tree) 
    201203{ 
    202204    char [] result =""; 
    203     int firstVector = -1; 
     205    int firstVector = findVectorForLength(tree); 
     206    bool known = arrayLengthIsStatic(tree.symbolTable[firstVector].type); 
    204207    for (int i=0; i<tree.symbolTable.length;++i) { 
    205208        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                } 
    209215                result ~= "assert(" ~ tree.symbolTable[i].value  
    210216                    ~ ".length==" ~ tree.symbolTable[firstVector].value 
     
    216222} 
    217223 
    218 /* 
     224// Return true if the type has a length which is known at compile time 
     225bool arrayLengthIsStatic(char [] type) 
     226
     227    if (type.length<3) return false; 
     228    return type[$-1]==']' && type[$-2]!='['; 
     229
     230 
    219231// Return a vector which contains the length of the expression. 
     232// If possible, a vector with known length will be chosen. 
    220233int findVectorForLength(AbstractSyntaxTree tree) 
    221234{ 
    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 
     246char [] 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 
    224263 
    225264// Categorise the expression, and dispatch to the appropriate code generator. 
     
    232271        return invokeX87(tree); 
    233272    } 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); 
    235275    }     
    236276}