これらは, ADL ファイルの内容を読むためのクラス (See: here for details).
ADL ファイルの内容を読むためのクラス.
現在は, FileBuff オブジェクトの生成時に, (コンストラクタ内で) ファイルの内容を全てメモリ上に読み込む実装になっている.
((cite: hotspot/src/share/vm/adlc/filebuff.hpp))
//------------------------------FileBuff--------------------------------------
// This class defines a nicely behaved buffer of text. Entire file of text
// is read into buffer at creation, with sentinels at start and end.
class FileBuff {
adlc の main() 関数の中で作成され, ADLParse のコンストラクタへと引き渡される. その後, ADLParse::parse() 内で使用される.
((cite: hotspot/src/share/vm/adlc/main.cpp))
int main(int argc, char *argv[])
{
...
// Build the File Buffer, Parse the input, & Generate Code
FileBuff ADL_Buf(&AD._ADL_file, AD); // Create a file buffer for input file
...
ADL_Parse = new ADLParser(ADL_Buf, AD); // Create a parser to parse the buffer
実際のコンストラクタの実装は以下の通り. (ファイルサイズ分の領域を確保し, fread() で一度に読んでいる)
((cite: hotspot/src/share/vm/adlc/filebuff.cpp))
// Create a new parsing buffer
FileBuff::FileBuff( BufferedFile *fptr, ArchDesc& archDesc) : _fp(fptr), _AD(archDesc) {
...
_filepos = ftell(_fp->_fp); // Find offset of end of file
_bufferSize = _filepos + 5; // Filepos points to last char, so add padding
...
_bigbuf = new char[_bufferSize]; // Create buffer to hold text for parser
...
_bufmax += fread(_buf, 1, _bufferSize-2, _fp->_fp); // Fill buffer & set end value
...
}
See: here for details
?? (このクラスは使用箇所が見当たらないような...)
ファイル中の一部分だけを扱うためのクラス.
((cite: hotspot/src/share/vm/adlc/filebuff.hpp))
//------------------------------FileBuffRegion---------------------------------
// A buffer region is really a region of some file, specified as a linked list
// of offsets and lengths. These regions can be merged; overlapping regions
// will coalesce.
class FileBuffRegion {
(どこで使われている? 使用箇所が見つからないが... #TODO)
内部では linked list 形式で表現しており, 各要素がそれぞれの領域を表すための「ファイル先頭からの offset とその領域の length」を持っている.
(正確には FileBuffRegion は linked list の1要素を表すクラスで, _next フィールドで次の FileBuffRegion オブジェクトにつながることでリストを形成する)
また, 2つの FileBuffRegion の領域をマージした結果を返すメソッドを提供している.
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.