changeset 91:1a24e61eb104 new_gen

Fixed the SourceLocation/SourceManager for files stretching by more then one CheckPoints
author johnsen@johnsen-laptop
date Mon, 05 May 2008 17:07:16 +0200
parents 4b6d8563e943
children 771ac63898e2
files basic/SourceManager.d dang/compiler.d lexer/Lexer.d
diffstat 3 files changed, 24 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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;
 
--- 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;