Browse Source

* Make current_scanner a function/procedure to better control lifetime

Michaël Van Canneyt 1 year ago
parent
commit
93ae6261cc
1 changed files with 37 additions and 4 deletions
  1. 37 4
      compiler/scanner.pas

+ 37 - 4
compiler/scanner.pas

@@ -256,6 +256,7 @@ interface
           function  readpreprocint(var value:int64;const place:string):boolean;
           function  readpreprocset(conform_to:tsetdef;var value:tnormalset;const place:string):boolean;
           function  asmgetchar:char;
+          function DumpPointer : string;
        end;
 
 {$ifdef PREPROCWRITE}
@@ -283,8 +284,6 @@ interface
         token,                        { current token being parsed }
         idtoken    : ttoken;          { holds the token if the pattern is a known word }
 
-        current_scanner : tscannerfile;  { current scanner in use }
-
         current_commentstyle : tcommentstyle; { needed to use read_comment from directives }
 {$ifdef PREPROCWRITE}
         preprocfile     : tpreprocfile;  { used with only preprocessing }
@@ -299,6 +298,9 @@ interface
     procedure InitScanner;
     procedure DoneScanner;
 
+    function current_scanner : tscannerfile;  { current scanner in use }
+    procedure set_current_scanner(avalue : tscannerfile; FreeOld : Boolean);  { current scanner in use }
+
     { To be called when the language mode is finally determined }
     Function SetCompileMode(const s:string; changeInit: boolean):boolean;
     Function SetCompileModeSwitch(s:string; changeInit: boolean):boolean;
@@ -322,7 +324,16 @@ implementation
       { dictionaries with the supported directives }
       turbo_scannerdirectives : TFPHashObjectList;     { for other modes }
       mac_scannerdirectives   : TFPHashObjectList;     { for mode mac }
+      _current_scanner : tscannerfile; { current scanner in use }
 
+      function current_scanner : tscannerfile;  { current scanner in use }
+
+      begin
+        if assigned(current_module) then
+          Result:=Tscannerfile(current_module.scanner)
+        else
+          Result:=Nil;
+      end;
 
 {*****************************************************************************
                               Helper routines
@@ -496,6 +507,14 @@ implementation
       end;
 
 
+    procedure set_current_scanner(avalue: tscannerfile; FreeOld: Boolean);
+    begin
+      if (avalue=nil) and FreeOld and (_current_scanner<>nil) then
+        _current_scanner.Free;
+
+      _current_scanner:=avalue;
+    end;
+
     Function SetCompileMode(const s:string; changeInit: boolean):boolean;
       var
         b : boolean;
@@ -2953,7 +2972,7 @@ type
                                 TSCANNERFILE
  ****************************************************************************}
 
-    constructor tscannerfile.create(const fn:string; is_macro: boolean = false);
+        constructor tscannerfile.Create(const fn: string; is_macro: boolean);
       begin
         inputfile:=do_openinputfile(fn);
         if is_macro then
@@ -2996,7 +3015,7 @@ type
       end;
 
 
-    destructor tscannerfile.destroy;
+        destructor tscannerfile.Destroy;
       begin
         if assigned(current_module) and
            (current_module.state=ms_compiled) and
@@ -6197,6 +6216,20 @@ exit_label:
          until false;
       end;
 
+    function tscannerfile.DumpPointer: string;
+      var
+        i: Integer;
+
+      begin
+        Result:='';
+        if inputpointer=nil then exit;
+        i:=0;
+        While (inputpointer[I]<>#0) and (i<100) do
+          inc(i);
+        Setlength(result,I);
+        move(inputpointer^,Result[1],I);
+      end;
+
 
 {*****************************************************************************
                                    Helpers