# HG changeset patch # User johnsen@johnsen-laptop # Date 1210000036 -7200 # Node ID 1a24e61eb104fb131e326972f95081ceb990c940 # Parent 4b6d8563e943e6ea74a14e38cef9014375ac7770 Fixed the SourceLocation/SourceManager for files stretching by more then one CheckPoints diff -r 4b6d8563e943 -r 1a24e61eb104 basic/SourceManager.d --- a/basic/SourceManager.d Sun May 04 23:23:51 2008 +0200 +++ b/basic/SourceManager.d Mon May 05 17:07:16 2008 +0200 @@ -43,7 +43,9 @@ **/ string getRawData(SourceLocation loc) { - return checkpoints[loc.fileID].data[loc.fileOffset .. $]; + CP cp = checkpoints[loc.fileID]; + auto length = cp.data_end - cp.data.ptr; + return cp.data.ptr[loc.fileOffset .. length]; } /** @@ -59,7 +61,7 @@ CP* cp = &checkpoints[loc.fileID]; auto cache = &linecache[cp.meta_index]; if (!cache.isCached) - cache.build(cp.data); + cache.build(cp.data_start[0 .. cp.data_end - cp.data_start]); return cache.lineOf(getFileOffset(loc)); } @@ -84,9 +86,9 @@ CP* cp = &checkpoints[loc.fileID]; char* ptr = cp.data.ptr + loc.fileOffset; char* ptr_lo = ptr; - while (ptr_lo != cp.data.ptr && *ptr_lo != '\n' && *ptr_lo != '\r') + while (cp.inRange(ptr_lo) && *ptr_lo != '\n' && *ptr_lo != '\r') --ptr_lo; - while (ptr != cp.data.ptr + cp.data.length && *ptr != '\n' && *ptr != '\r') + while (cp.inRange(ptr) && *ptr != '\n' && *ptr != '\r') ++ptr; return ptr_lo[1 .. ptr - ptr_lo]; } @@ -102,7 +104,7 @@ CP* cp = &checkpoints[loc.fileID]; char* ptr = cp.data.ptr + loc.fileOffset; char* ptr_lo = ptr; - while (ptr_lo != cp.data.ptr && *ptr_lo != '\n' && *ptr_lo != '\r') + while (cp.inRange(ptr_lo) && *ptr_lo != '\n' && *ptr_lo != '\r') --ptr_lo; return cast(int)ptr - cast(int)ptr_lo - 1; } @@ -116,7 +118,7 @@ assert(loc.isReal, "Virtual locations not supported yet"); auto begin = getFileOffset(loc.begin); auto end = getFileOffset(loc.end); - return checkpoints[loc.begin.fileID].data.ptr[begin .. end]; + return checkpoints[loc.begin.fileID].data_start[begin .. end]; } /** @@ -156,17 +158,20 @@ // SourceLocation's can only index relatively short buffers, therefore // the file is split into several checkpoints. - uint checkpoint_counter = checkpoints.length; + uint checkpoint_counter = 0; + char* data_start = data.ptr; + char* data_end = data.ptr + data.length; while (data.length > 0) { uint to_take = min(data.length, SourceLocation.Bits.MaxFileOffset); checkpoints ~= CP(source_file, + data_start, + data_end, data[0 .. to_take], checkpoint_counter++, meta_index); data = data[to_take .. $]; - // Stdout("Taking ")(to_take)(" from ")(source_file).newline; } checkpoint_counter = checkpoints.length - checkpoint_counter; return SourceLocation.fromFileID(checkpoint_counter); @@ -191,11 +196,19 @@ // read-only char[] filename; // ditto + char* data_start; + char* data_end; + // ditto char[] data; // ditto uint part = 0; // ditto uint meta_index = 0; + + bool inRange(char* p) + { + return p >= data_start && p < data_end; + } } struct FileLineCache diff -r 4b6d8563e943 -r 1a24e61eb104 dang/compiler.d --- a/dang/compiler.d Sun May 04 23:23:51 2008 +0200 +++ b/dang/compiler.d Mon May 05 17:07:16 2008 +0200 @@ -2,6 +2,7 @@ import tango.io.Stdout, tango.core.Signal, + tango.core.Memory, tango.sys.Process, tango.time.StopWatch, tango.io.FileConduit, @@ -31,6 +32,7 @@ void checkFiles(char[][] *files) { + GC.disable(); bool non_existant_files = false; bool duplicate_files = false; diff -r 4b6d8563e943 -r 1a24e61eb104 lexer/Lexer.d --- a/lexer/Lexer.d Sun May 04 23:23:51 2008 +0200 +++ b/lexer/Lexer.d Mon May 05 17:07:16 2008 +0200 @@ -356,7 +356,7 @@ CharType c = charTable[current]; if(c == CharType.INVALID) - messages.report(InvalidSymbol, SLoc()).arg(current); + messages.report(InvalidSymbol, Loc(), 1).arg(Integer.toString(cast(int)current)); return c;