sa-jdi

irHeaderLength = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readShort();
      dirEntryLength = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readShort();
      numEntries = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readInt();
    }
    
    public short getHeaderLength()
    {
      return dirHeaderLength;
    }
    
    public short getEntryLength()
    {
      return dirEntryLength;
    }
    
    public int getNumEntries()
    {
      return numEntries;
    }
    
    public DebugVC50Subsection getSubsection(int i)
    {
      COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).seek(offset + dirHeaderLength + i * dirEntryLength);
      short ssType = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readShort();
      short iMod = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readShort();
      int lfo = COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.this.globalOffset(COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readInt());
      int cb = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readInt();
      switch (ssType)
      {
      case 288: 
        return new COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SSModuleImpl(COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.this, ssType, iMod, cb, lfo);
      case 289: 
        return new COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SSTypesImpl(COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.this, ssType, iMod, cb, lfo);
      case 290: 
        return new COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SSPublicImpl(COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.this, ssType, iMod, cb, lfo);
      case 291: 
        return new COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SSPublicSymImpl(COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.this, ssType, iMod, cb, lfo);
      case 292: 
        return new COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SSSymbolsImpl(COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.this, ssType, iMod, cb, lfo);
      case 293: 
        return new COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SSAlignSymImpl(COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.this, ssType, iMod, cb, lfo);
      case 294: 
        return new COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SSSrcLnSegImpl(COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.this, ssType, iMod, cb, lfo);
      case 295: 
        return new COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SSSrcModuleImpl(COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.this, ssType, iMod, cb, lfo);
      case 296: 
        return new COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SSLibrariesImpl(COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.this, ssType, iMod, cb, lfo);
      case 297: 
        return new COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SSGlobalSymImpl(COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.this, ssType, iMod, cb, lfo);
      case 298: 
        return new COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SSGlobalPubImpl(COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.this, ssType, iMod, cb, lfo);
      case 299: 
        return new COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SSGlobalTypesImpl(COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.this, ssType, iMod, cb, lfo);
      case 300: 
        return new COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SSMPCImpl(COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.this, ssType, iMod, cb, lfo);
      case 301: 
        return new COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SSSegMapImpl(COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.this, ssType, iMod, cb, lfo);
      case 302: 
        return new COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SSSegNameImpl(COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.this, ssType, iMod, cb, lfo);
      case 303: 
        return new COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SSPreCompImpl(COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.this, ssType, iMod, cb, lfo);
      case 304: 
        return null;
      case 305: 
        return new COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SSOffsetMap16Impl(COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.this, ssType, iMod, cb, lfo);
      case 306: 
        return new COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SSOffsetMap32Impl(COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.this, ssType, iMod, cb, lfo);
      case 307: 
        return new COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SSFileIndexImpl(COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.this, ssType, iMod, cb, lfo);
      case 308: 
        return new COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SSStaticSymImpl(COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.this, ssType, iMod, cb, lfo);
      }
      throw new COFFException("Unknown section type " + ssType);
    }
  }
  
  class DebugVC50SubsectionImpl
    implements DebugVC50Subsection
  {
    private short ssType;
    private short iMod;
    private int ssSize;
    
    DebugVC50SubsectionImpl(short ssType, short iMod, int ssSize, int offset)
    {
      this.ssType = ssType;
      this.iMod = iMod;
      this.ssSize = ssSize;
    }
    
    public short getSubsectionType()
    {
      return ssType;
    }
    
    public short getSubsectionModuleIndex()
    {
      return iMod;
    }
    
    public int getSubsectionSize()
    {
      return ssSize;
    }
  }
  
  class DebugVC50SSModuleImpl
    extends COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SubsectionImpl
    implements DebugVC50SSModule
  {
    private int offset;
    private short ovlNumber;
    private short iLib;
    private short cSeg;
    private short style;
    private MemoizedObject segInfo;
    private MemoizedObject name;
    private static final int HEADER_SIZE = 8;
    private static final int SEG_INFO_SIZE = 12;
    
    DebugVC50SSModuleImpl(short ssType, short iMod, int ssSize, final int offset)
    {
      super(ssType, iMod, ssSize, offset);
      this.offset = offset;
      COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).seek(offset);
      ovlNumber = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readShort();
      iLib = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readShort();
      cSeg = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readShort();
      style = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readShort();
      segInfo = new MemoizedObject()
      {
        public Object computeValue()
        {
          int base = offset + 8;
          DebugVC50SegInfo[] res = new DebugVC50SegInfo[cSeg];
          for (int i = 0; i < cSeg; i++)
          {
            res[i] = new COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SegInfoImpl(COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.this, base);
            base += 12;
          }
          return res;
        }
      };
      name = new MemoizedObject()
      {
        public Object computeValue()
        {
          return COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.this.readLengthPrefixedStringAt(offset + (8 + cSeg * 12));
        }
      };
    }
    
    public short getOverlayNumber()
    {
      return ovlNumber;
    }
    
    public short getLibrariesIndex()
    {
      return iLib;
    }
    
    public short getNumCodeSegments()
    {
      return cSeg;
    }
    
    public short getDebuggingStyle()
    {
      return style;
    }
    
    public DebugVC50SegInfo getSegInfo(int i)
    {
      return ((DebugVC50SegInfo[])(DebugVC50SegInfo[])segInfo.getValue())[i];
    }
    
    public String getName()
    {
      return (String)name.getValue();
    }
  }
  
  class DebugVC50SegInfoImpl
    implements DebugVC50SegInfo
  {
    private short seg;
    private int offset;
    private int cbSeg;
    
    DebugVC50SegInfoImpl(int offset)
    {
      COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).seek(offset);
      seg = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readShort();
      COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readShort();
      offset = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readInt();
      cbSeg = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readInt();
    }
    
    public short getSegment()
    {
      return seg;
    }
    
    public int getOffset()
    {
      return offset;
    }
    
    public int getSegmentCodeSize()
    {
      return cbSeg;
    }
  }
  
  class DebugVC50SSTypesImpl
    extends COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SubsectionImpl
    implements DebugVC50SSTypes
  {
    DebugVC50SSTypesImpl(short ssType, short iMod, int ssSize, int offset)
    {
      super(ssType, iMod, ssSize, offset);
    }
  }
  
  class DebugVC50SSPublicImpl
    extends COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SubsectionImpl
    implements DebugVC50SSPublic
  {
    DebugVC50SSPublicImpl(short ssType, short iMod, int ssSize, int offset)
    {
      super(ssType, iMod, ssSize, offset);
    }
  }
  
  class DebugVC50SSPublicSymImpl
    extends COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SubsectionImpl
    implements DebugVC50SSPublicSym
  {
    DebugVC50SSPublicSymImpl(short ssType, short iMod, int ssSize, int offset)
    {
      super(ssType, iMod, ssSize, offset);
    }
  }
  
  class DebugVC50SSSymbolsImpl
    extends COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SubsectionImpl
    implements DebugVC50SSSymbols
  {
    DebugVC50SSSymbolsImpl(short ssType, short iMod, int ssSize, int offset)
    {
      super(ssType, iMod, ssSize, offset);
    }
  }
  
  class DebugVC50SSAlignSymImpl
    extends COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SubsectionImpl
    implements DebugVC50SSAlignSym
  {
    private int offset;
    
    DebugVC50SSAlignSymImpl(short ssType, short iMod, int ssSize, int offset)
    {
      super(ssType, iMod, ssSize, offset);
      this.offset = offset;
    }
    
    public DebugVC50SymbolIterator getSymbolIterator()
    {
      return new COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SymbolIteratorImpl(COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.this, offset, getSubsectionSize());
    }
  }
  
  class DebugVC50SSSrcLnSegImpl
    extends COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SubsectionImpl
    implements DebugVC50SSSrcLnSeg
  {
    DebugVC50SSSrcLnSegImpl(short ssType, short iMod, int ssSize, int offset)
    {
      super(ssType, iMod, ssSize, offset);
    }
  }
  
  class DebugVC50SSSrcModuleImpl
    extends COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SubsectionImpl
    implements DebugVC50SSSrcModule
  {
    private int offset;
    private short cFile;
    private short cSeg;
    private MemoizedObject baseSrcFiles;
    private MemoizedObject segOffsets;
    private MemoizedObject segs;
    
    DebugVC50SSSrcModuleImpl(short ssType, short iMod, int ssSize, final int offset)
    {
      super(ssType, iMod, ssSize, offset);
      
      this.offset = offset;
      COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).seek(offset);
      cFile = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readShort();
      cSeg = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readShort();
      
      baseSrcFiles = new MemoizedObject()
      {
        public Object computeValue()
        {
          int[] offsets = new int[getNumSourceFiles()];
          COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).seek(offset + 4);
          for (int i = 0; i < getNumSourceFiles(); i++) {
            offsets[i] = (offset + COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readInt());
          }
          COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SrcModFileDescImpl[] res = new COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SrcModFileDescImpl[offsets.length];
          for (int i = 0; i < res.length; i++) {
            res[i] = new COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SrcModFileDescImpl(COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.this, offsets[i], offset);
          }
          return res;
        }
      };
      segOffsets = new MemoizedObject()
      {
        public Object computeValue()
        {
          COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).seek(offset + 4 * (getNumSourceFiles() + 1));
          int[] res = new int[2 * getNumCodeSegments()];
          for (int i = 0; i < 2 * getNumCodeSegments(); i++) {
            res[i] = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readInt();
          }
          return res;
        }
      };
      segs = new MemoizedObject()
      {
        public Object computeValue()
        {
          COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).seek(offset + 4 * (getNumSourceFiles() + 1) + 8 * getNumCodeSegments());
          short[] res = new short[getNumCodeSegments()];
          for (int i = 0; i < getNumCodeSegments(); i++) {
            res[i] = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readShort();
          }
          return res;
        }
      };
    }
    
    public int getNumSourceFiles()
    {
      return cFile & 0xFFFF;
    }
    
    public int getNumCodeSegments()
    {
      return cSeg & 0xFFFF;
    }
    
    public DebugVC50SrcModFileDesc getSourceFileDesc(int i)
    {
      return ((COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SrcModFileDescImpl[])(COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SrcModFileDescImpl[])baseSrcFiles.getValue())[i];
    }
    
    public int getSegmentStartOffset(int i)
    {
      return ((int[])(int[])segOffsets.getValue())[(2 * i)];
    }
    
    public int getSegmentEndOffset(int i)
    {
      return ((int[])(int[])segOffsets.getValue())[(2 * i + 1)];
    }
    
    public int getSegment(int i)
    {
      return ((short[])(short[])segs.getValue())[i] & 0xFFFF;
    }
  }
  
  class DebugVC50SrcModFileDescImpl
    implements DebugVC50SrcModFileDesc
  {
    private short cSeg;
    private MemoizedObject baseSrcLn;
    private MemoizedObject segOffsets;
    private MemoizedObject name;
    
    DebugVC50SrcModFileDescImpl(final int offset, final int baseOffset)
    {
      COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).seek(offset);
      cSeg = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readShort();
      
      baseSrcLn = new MemoizedObject()
      {
        public Object computeValue()
        {
          COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).seek(offset + 4);
          int[] offsets = new int[getNumCodeSegments()];
          for (int i = 0; i < getNumCodeSegments(); i++) {
            offsets[i] = (baseOffset + COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readInt());
          }
          COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SrcModLineNumberMapImpl[] res = new COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SrcModLineNumberMapImpl[getNumCodeSegments()];
          for (int i = 0; i < getNumCodeSegments(); i++) {
            res[i] = new COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SrcModLineNumberMapImpl(COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.this, offsets[i]);
          }
          return res;
        }
      };
      segOffsets = new MemoizedObject()
      {
        public Object computeValue()
        {
          COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).seek(offset + 4 * (getNumCodeSegments() + 1));
          int[] res = new int[2 * getNumCodeSegments()];
          for (int i = 0; i < 2 * getNumCodeSegments(); i++) {
            res[i] = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readInt();
          }
          return res;
        }
      };
      name = new MemoizedObject()
      {
        public Object computeValue()
        {
          COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).seek(offset + 4 + 12 * getNumCodeSegments());
          
          int cbName = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readByte() & 0xFF;
          byte[] res = new byte[cbName];
          COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readBytes(res);
          try
          {
            return new String(res, "US-ASCII");
          }
          catch (UnsupportedEncodingException e)
          {
            throw new COFFException(e);
          }
        }
      };
    }
    
    public int getNumCodeSegments()
    {
      return cSeg & 0xFFFF;
    }
    
    public DebugVC50SrcModLineNumberMap getLineNumberMap(int i)
    {
      return ((COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SrcModLineNumberMapImpl[])(COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SrcModLineNumberMapImpl[])baseSrcLn.getValue())[i];
    }
    
    public int getSegmentStartOffset(int i)
    {
      return ((int[])(int[])segOffsets.getValue())[(2 * i)];
    }
    
    public int getSegmentEndOffset(int i)
    {
      return ((int[])(int[])segOffsets.getValue())[(2 * i + 1)];
    }
    
    public String getSourceFileName()
    {
      return (String)name.getValue();
    }
  }
  
  class DebugVC50SrcModLineNumberMapImpl
    implements DebugVC50SrcModLineNumberMap
  {
    private short seg;
    private short cPair;
    private MemoizedObject offsets;
    private MemoizedObject lineNumbers;
    
    DebugVC50SrcModLineNumberMapImpl(final int offset)
    {
      COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).seek(offset);
      seg = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readShort();
      cPair = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readShort();
      offsets = new MemoizedObject()
      {
        public Object computeValue()
        {
          COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).seek(offset + 4);
          int[] res = new int[getNumSourceLinePairs()];
          for (int i = 0; i < getNumSourceLinePairs(); i++) {
            res[i] = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readInt();
          }
          return res;
        }
      };
      lineNumbers = new MemoizedObject()
      {
        public Object computeValue()
        {
          COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).seek(offset + 4 * (getNumSourceLinePairs() + 1));
          short[] res = new short[getNumSourceLinePairs()];
          for (int i = 0; i < getNumSourceLinePairs(); i++) {
            res[i] = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readShort();
          }
          return res;
        }
      };
    }
    
    public int getSegment()
    {
      return seg;
    }
    
    public int getNumSourceLinePairs()
    {
      return cPair;
    }
    
    public int getCodeOffset(int i)
    {
      return ((int[])(int[])offsets.getValue())[i];
    }
    
    public int getLineNumber(int i)
    {
      return ((short[])(short[])lineNumbers.getValue())[i] & 0xFFFF;
    }
  }
  
  class DebugVC50SSLibrariesImpl
    extends COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SubsectionImpl
    implements DebugVC50SSLibraries
  {
    DebugVC50SSLibrariesImpl(short ssType, short iMod, int ssSize, int offset)
    {
      super(ssType, iMod, ssSize, offset);
    }
  }
  
  class DebugVC50SSSymbolBaseImpl
    extends COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SubsectionImpl
    implements DebugVC50SSSymbolBase
  {
    private int offset;
    private short symHash;
    private short addrHash;
    private int cbSymbol;
    private int cbSymHash;
    private int cbAddrHash;
    private static final int HEADER_SIZE = 16;
    
    DebugVC50SSSymbolBaseImpl(short ssType, short iMod, int ssSize, int offset)
    {
      super(ssType, iMod, ssSize, offset);
      this.offset = offset;
      COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).seek(offset);
      symHash = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readShort();
      addrHash = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readShort();
      cbSymbol = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readInt();
      cbSymHash = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readInt();
      cbAddrHash = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readInt();
    }
    
    public short getSymHashIndex()
    {
      return symHash;
    }
    
    public short getAddrHashIndex()
    {
      return addrHash;
    }
    
    public int getSymTabSize()
    {
      return cbSymbol;
    }
    
    public int getSymHashSize()
    {
      return cbSymHash;
    }
    
    public int getAddrHashSize()
    {
      return cbAddrHash;
    }
    
    public DebugVC50SymbolIterator getSymbolIterator()
    {
      return new COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SymbolIteratorImpl(COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.this, offset + 16, cbSymbol);
    }
  }
  
  class DebugVC50SSGlobalSymImpl
    extends COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SSSymbolBaseImpl
    implements DebugVC50SSGlobalSym
  {
    DebugVC50SSGlobalSymImpl(short ssType, short iMod, int ssSize, int offset)
    {
      super(ssType, iMod, ssSize, offset);
    }
  }
  
  class DebugVC50SSGlobalPubImpl
    extends COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SSSymbolBaseImpl
    implements DebugVC50SSGlobalPub
  {
    DebugVC50SSGlobalPubImpl(short ssType, short iMod, int ssSize, int offset)
    {
      super(ssType, iMod, ssSize, offset);
    }
  }
  
  class DebugVC50SSGlobalTypesImpl
    extends COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SubsectionImpl
    implements DebugVC50SSGlobalTypes
  {
    private int offset;
    private int cType;
    
    DebugVC50SSGlobalTypesImpl(short ssType, short iMod, int ssSize, int offset)
    {
      super(ssType, iMod, ssSize, offset);
      this.offset = offset;
      COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).seek(offset);
      COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readInt();
      cType = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readInt();
    }
    
    public int getNumTypes()
    {
      return cType;
    }
    
    public int getTypeOffset(int i)
    {
      COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).seek(offset + 4 * (i + 2));
      return COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readInt() + offsetOfFirstType();
    }
    
    public DebugVC50TypeIterator getTypeIterator()
    {
      return new COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50TypeIteratorImpl(COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.this, this, offsetOfFirstType(), cType);
    }
    
    private int offsetOfFirstType()
    {
      return offset + 4 * (getNumTypes() + 2);
    }
  }
  
  class DebugVC50SSMPCImpl
    extends COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SubsectionImpl
    implements DebugVC50SSMPC
  {
    DebugVC50SSMPCImpl(short ssType, short iMod, int ssSize, int offset)
    {
      super(ssType, iMod, ssSize, offset);
    }
  }
  
  class DebugVC50SSSegMapImpl
    extends COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SubsectionImpl
    implements DebugVC50SSSegMap
  {
    private short cSeg;
    private short cSegLog;
    private MemoizedObject segDescs;
    
    DebugVC50SSSegMapImpl(short ssType, short iMod, int ssSize, final int offset)
    {
      super(ssType, iMod, ssSize, offset);
      COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).seek(offset);
      cSeg = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readShort();
      cSegLog = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readShort();
      segDescs = new MemoizedObject()
      {
        public Object computeValue()
        {
          DebugVC50SegDesc[] descs = new DebugVC50SegDesc[cSeg];
          for (int i = 0; i < cSeg; i++) {
            descs[i] = new COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SegDescImpl(COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.this, offset + 4 + 20 * i);
          }
          return descs;
        }
      };
    }
    
    public short getNumSegDesc()
    {
      return cSeg;
    }
    
    public short getNumLogicalSegDesc()
    {
      return cSegLog;
    }
    
    public DebugVC50SegDesc getSegDesc(int i)
    {
      return ((DebugVC50SegDesc[])(DebugVC50SegDesc[])segDescs.getValue())[i];
    }
  }
  
  class DebugVC50SegDescImpl
    implements DebugVC50SegDesc
  {
    private short flags;
    private short ovl;
    private short group;
    private short frame;
    private short iSegName;
    private short iClassName;
    private int offset;
    private int cbSeg;
    
    DebugVC50SegDescImpl(int offset)
    {
      COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).seek(offset);
      flags = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readShort();
      ovl = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readShort();
      group = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readShort();
      frame = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readShort();
      iSegName = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readShort();
      iClassName = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readShort();
      offset = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readInt();
      cbSeg = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readInt();
    }
    
    public short getFlags()
    {
      return flags;
    }
    
    public short getOverlayNum()
    {
      return ovl;
    }
    
    public short getGroup()
    {
      return group;
    }
    
    public short getFrame()
    {
      return frame;
    }
    
    public short getName()
    {
      return iSegName;
    }
    
    public short getClassName()
    {
      return iClassName;
    }
    
    public int getOffset()
    {
      return offset;
    }
    
    public int getSize()
    {
      return cbSeg;
    }
  }
  
  class DebugVC50SSSegNameImpl
    extends COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SubsectionImpl
    implements DebugVC50SSSegName
  {
    private int offset;
    private int size;
    private MemoizedObject names;
    
    DebugVC50SSSegNameImpl(short ssType, short iMod, int ssSize, int offset)
    {
      super(ssType, iMod, ssSize, offset);
      this.offset = offset;
      size = ssSize;
      COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).seek(offset);
      names = new MemoizedObject()
      {
        public Object computeValue()
        {
          int i = 0;
          List data = new ArrayList();
          while (i < size)
          {
            String s = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readCString();
            data.add(s);
            i += s.length();
          }
          String[] res = new String[data.size()];
          res = (String[])data.toArray(res);
          return res;
        }
      };
    }
    
    public String getSegName(int i)
    {
      return ((String[])(String[])names.getValue())[i];
    }
  }
  
  class DebugVC50SSPreCompImpl
    extends COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SubsectionImpl
    implements DebugVC50SSPreComp
  {
    DebugVC50SSPreCompImpl(short ssType, short iMod, int ssSize, int offset)
    {
      super(ssType, iMod, ssSize, offset);
    }
  }
  
  class DebugVC50SSOffsetMap16Impl
    extends COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SubsectionImpl
    implements DebugVC50SSOffsetMap16
  {
    DebugVC50SSOffsetMap16Impl(short ssType, short iMod, int ssSize, int offset)
    {
      super(ssType, iMod, ssSize, offset);
    }
  }
  
  class DebugVC50SSOffsetMap32Impl
    extends COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SubsectionImpl
    implements DebugVC50SSOffsetMap32
  {
    DebugVC50SSOffsetMap32Impl(short ssType, short iMod, int ssSize, int offset)
    {
      super(ssType, iMod, ssSize, offset);
    }
  }
  
  class DebugVC50SSFileIndexImpl
    extends COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SubsectionImpl
    implements DebugVC50SSFileIndex
  {
    private int offset;
    private short cMod;
    private short cRef;
    private MemoizedObject modStart;
    private MemoizedObject cRefCnt;
    private MemoizedObject nameRef;
    private MemoizedObject names;
    
    DebugVC50SSFileIndexImpl(short ssType, short iMod, int ssSize, final int offset)
    {
      super(ssType, iMod, ssSize, offset);
      this.offset = offset;
      COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).seek(offset);
      cMod = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readShort();
      cRef = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readShort();
      modStart = new MemoizedObject()
      {
        public Object computeValue()
        {
          short[] vals = new short[cMod];
          COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).seek(4 + offset);
          for (int i = 0; i < cMod; i++) {
            vals[i] = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readShort();
          }
          return vals;
        }
      };
      cRefCnt = new MemoizedObject()
      {
        public Object computeValue()
        {
          short[] vals = new short[cMod];
          COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).seek(4 + offset + 2 * cMod);
          for (int i = 0; i < cMod; i++) {
            vals[i] = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readShort();
          }
          return vals;
        }
      };
      nameRef = new MemoizedObject()
      {
        public Object computeValue()
        {
          int[] vals = new int[cRef];
          COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).seek(4 + offset + 4 * cMod);
          for (int i = 0; i < cMod; i++) {
            vals[i] = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readInt();
          }
          return vals;
        }
      };
      names = new MemoizedObject()
      {
        public Object computeValue()
        {
          String[] vals = new String[cRef];
          for (int i = 0; i < cRef; i++) {
            vals[i] = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readCString();
          }
          return vals;
        }
      };
    }
    
    public short getNumModules()
    {
      return cMod;
    }
    
    public short getNumReferences()
    {
      return cRef;
    }
    
    public short[] getModStart()
    {
      return (short[])modStart.getValue();
    }
    
    public short[] getRefCount()
    {
      return (short[])cRefCnt.getValue();
    }
    
    public int[] getNameRef()
    {
      return (int[])nameRef.getValue();
    }
    
    public String[] getNames()
    {
      return (String[])names.getValue();
    }
  }
  
  class DebugVC50SSStaticSymImpl
    extends COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.DebugVC50SSSymbolBaseImpl
    implements DebugVC50SSStaticSym
  {
    DebugVC50SSStaticSymImpl(short ssType, short iMod, int ssSize, int offset)
    {
      super(ssType, iMod, ssSize, offset);
    }
  }
  
  class DebugVC50SymbolIteratorImpl
    implements DebugVC50SymbolIterator
  {
    private int base;
    private int size;
    private int pos;
    private int curSymSize;
    private int curSymType;
    private static final int HEADER_SIZE = 4;
    
    DebugVC50SymbolIteratorImpl(int base, int size)
    {
      this(base, size, base);
    }
    
    private DebugVC50SymbolIteratorImpl(int base, int size, int pos)
    {
      this.base = base;
      this.size = size;
      this.pos = pos;
      COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).seek(pos);
      curSymSize = (COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readShort() & 0xFFFF);
      curSymType = (COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readShort() & 0xFFFF);
    }
    
    public boolean done()
    {
      return pos == base + size;
    }
    
    public void next()
      throws NoSuchElementException
    {
      if (done()) {
        throw new NoSuchElementException("No more symbols");
      }
      pos += curSymSize + 2;
      COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).seek(pos);
      curSymSize = (COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readShort() & 0xFFFF);
      curSymType = (COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readShort() & 0xFFFF);
    }
    
    public short getLength()
    {
      return (short)curSymSize;
    }
    
    public int getType()
    {
      return curSymType;
    }
    
    public int getOffset()
    {
      return pos + 4;
    }
    
    public byte getCompilerTargetProcessor()
    {
      symSeek(0);
      return COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readByte();
    }
    
    public int getCompilerFlags()
    {
      symSeek(1);
      int res = 0;
      for (int i = 0; i < 3; i++)
      {
        int b = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readByte() & 0xFF;
        res = res << 8 | b;
      }
      return res;
    }
    
    public String getComplierVersion()
    {
      return readLengthPrefixedStringAt(4);
    }
    
    public int getRegisterSymbolType()
    {
      symSeek(0);
      return COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readInt();
    }
    
    public short getRegisterEnum()
    {
      symSeek(4);
      return COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readShort();
    }
    
    public String getRegisterSymbolName()
    {
      return readLengthPrefixedStringAt(6);
    }
    
    public int getConstantType()
    {
      symSeek(0);
      return COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readInt();
    }
    
    public int getConstantValueAsInt()
      throws DebugVC50WrongNumericTypeException
    {
      return readIntNumericLeafAt(4);
    }
    
    public long getConstantValueAsLong()
      throws DebugVC50WrongNumericTypeException
    {
      return readLongNumericLeafAt(4);
    }
    
    public float getConstantValueAsFloat()
      throws DebugVC50WrongNumericTypeException
    {
      return readFloatNumericLeafAt(4);
    }
    
    public double getConstantValueAsDouble()
      throws DebugVC50WrongNumericTypeException
    {
      return readDoubleNumericLeafAt(4);
    }
    
    public String getConstantName()
    {
      return readLengthPrefixedStringAt(4 + numericLeafLengthAt(4));
    }
    
    public int getUDTType()
    {
      symSeek(0);
      return COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readInt();
    }
    
    public String getUDTName()
    {
      return readLengthPrefixedStringAt(4);
    }
    
    public int getSearchSymbolOffset()
    {
      symSeek(0);
      return COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readInt();
    }
    
    public short getSearchSegment()
    {
      symSeek(4);
      return COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readShort();
    }
    
    public int getObjectCodeViewSignature()
    {
      symSeek(0);
      return COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readInt();
    }
    
    public String getObjectName()
    {
      return readLengthPrefixedStringAt(4);
    }
    
    public int getManyRegType()
    {
      symSeek(0);
      return COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readInt();
    }
    
    public byte getManyRegCount()
    {
      symSeek(4);
      return COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readByte();
    }
    
    public byte getManyRegRegister(int i)
    {
      symSeek(5 + i);
      return COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readByte();
    }
    
    public String getManyRegName()
    {
      return readLengthPrefixedStringAt(5 + getManyRegCount());
    }
    
    public short getReturnFlags()
    {
      symSeek(0);
      return COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readShort();
    }
    
    public byte getReturnStyle()
    {
      symSeek(2);
      return COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readByte();
    }
    
    public byte getReturnRegisterCount()
    {
      symSeek(3);
      return COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readByte();
    }
    
    public byte getReturnRegister(int i)
    {
      symSeek(4 + i);
      return COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readByte();
    }
    
    public void advanceToEntryThisSymbol()
    {
      COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).seek(pos + 4);
      int tmpSymSize = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readShort();
      int tmpSymType = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readShort();
      if (Assert.ASSERTS_ENABLED) {
        Assert.that(pos + curSymSize + 2 == pos + 4 + tmpSymSize, "advanceToEntryThisSymbol needs more work");
      }
      pos += 4;
      curSymSize = tmpSymSize;
      curSymType = tmpSymType;
    }
    
    public int getBPRelOffset()
    {
      symSeek(0);
      return COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readInt();
    }
    
    public int getBPRelType()
    {
      symSeek(4);
      return COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readInt();
    }
    
    public String getBPRelName()
    {
      return readLengthPrefixedStringAt(8);
    }
    
    public int getLGDataType()
    {
      symSeek(0);
      return COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readInt();
    }
    
    public int getLGDataOffset()
    {
      symSeek(4);
      return COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readInt();
    }
    
    public short getLGDataSegment()
    {
      symSeek(8);
      return COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readShort();
    }
    
    public String getLGDataName()
    {
      return readLengthPrefixedStringAt(10);
    }
    
    public DebugVC50SymbolIterator getLGProcParent()
    {
      int offs = getLGProcParentOffset();
      if (offs == 0) {
        return null;
      }
      return new DebugVC50SymbolIteratorImpl(COFFFileParser.COFFFileImpl.COFFHeaderImpl.DebugVC50Impl.this, base, size, offs);
    }
    
    public int getLGProcParentOffset()
    {
      symSeek(0);
      int offs = COFFFileParser.COFFFileImpl.COFFHeaderImpl.access$100(this$2).readInt();
      if (offs == 0) {
        return 0;
      }
      return base + offs;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114

Further reading...

For more information on Java 1.5 Tiger, you may find Java 1.5 Tiger, A developer's Notebook by D. Flanagan and B. McLaughlin from O'Reilly of interest.

New!JAR listings


Copyright 2006-2019. Infinite Loop Ltd