Changeset 296

Show
Ignore:
Timestamp:
04/21/08 16:01:35 (7 months ago)
Author:
h3r3tic
Message:

removed the HACK in WKEXT parsing

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/ddl/omf/OMFBinary.d

    r292 r296  
    9595    VByte resolutionIndex; 
    9696             
    97     void parse(OMFReader reader){ 
     97    bool parse(OMFReader reader){ 
    9898        reader.get(weakIndex); 
    99         reader.get(resolutionIndex); 
     99         
     100        if (!reader.hasMore) { 
     101            return false; 
     102        } else { 
     103            reader.get(resolutionIndex); 
     104            return true; 
     105        } 
    100106    } 
    101107} 
     
    103109void parse(inout WKEXT[] externs,OMFReader reader){ 
    104110    while(reader.hasMore()){ 
    105         // HACK: otherwise the parser borks on tango-base-dmd.lib, as of rev 3447 of Tango       
    106         try { 
    107             WKEXT ext;       
    108             ext.parse(reader); 
     111        ubyte b; 
     112        reader.peek(b); 
     113        debug debugLog("parse() -> {} / {} ; peek = {:X}"\n, reader.getPosition, reader.getData.length, cast(int)b); 
     114        WKEXT ext;       
     115        if (ext.parse(reader)) { 
    109116            externs ~= ext; 
    110         } catch (Exception) {} 
     117        } else { 
     118            // it seems that OPTLINK can put two weakIndex values into one WKEXT 
     119            // they both map to the field that resolutionIndex that follows 
     120            // thus, if there's only one byte left in the reader, the one byte is a resolutionIndex, 
     121            // while the previous two are both weakIndex 
     122            // 
     123            // A query to Walter about this stuff is pending an answer 
     124            // 
     125            // - h3r3tic 
     126             
     127            if (externs.length < 1) { 
     128                throw new Exception("WKEXT record is corrupt"); 
     129            } 
     130             
     131            WKEXT* prev = &externs[$-1]; 
     132            ext.resolutionIndex = ext.weakIndex; 
     133            ext.weakIndex = prev.resolutionIndex; 
     134            prev.resolutionIndex = ext.resolutionIndex; 
     135             
     136            externs ~= ext; 
     137        } 
    111138    } 
    112139} 
     
    946973            OMFReader reader = thisRecord.getOMFReader(); 
    947974             
    948             debug debugLog("record: {0:X} ({1:X}) {2}",thisRecord.recordType,thisRecord.type,recordNameLookup[thisRecord.recordType]); 
     975            debug debugLog("record: {0:X} ({1:X}) data: {2} {3} length: {4}",thisRecord.recordType,thisRecord.type,thisRecord.data,recordNameLookup[thisRecord.recordType], thisRecord.length); 
    949976            debug thisRecord.doRecordChecksum(); 
    950977                     
     
    10351062        reader.get(commentClass); 
    10361063                         
     1064        debug debugLog("COMENT class: {0:X}", commentClass); 
     1065         
    10371066        switch(commentClass){ 
    10381067        case 0x9F: // external library name (dependency) 
     
    10551084                } 
    10561085            default: 
    1057                 debug debugLog("unhandled extensionType: %0.2X",extensionType);                
     1086                debug debugLog("unhandled extensionType: {0:X}",extensionType);                
    10581087            } 
    10591088            break; 
     
    10651094             
    10661095        default: 
    1067             debug debugLog("unhandled commentClass: %0.2X",commentClass);              
     1096            debug debugLog("unhandled commentClass: {0:X}",commentClass);              
    10681097        } 
    10691098    }