소스 검색

scanner unit:
treplaystack class: added change_endian boolean field
treplaystack.create added achange_endian parameter
tscannerfile class: added tokenbuf_change_endian boolean field
readsizeint method: use tokenbuf_change_endian to maybe swap sizeint
startreplaytokens method: added achange_endian field
psub and ptype units:
adapt to tscannerfile.startreplaytokens change above.

git-svn-id: trunk@19012 -

pierre 14 년 전
부모
커밋
57f3f0a82b
3개의 변경된 파일22개의 추가작업 그리고 10개의 파일을 삭제
  1. 2 1
      compiler/psub.pas
  2. 2 1
      compiler/ptype.pas
  3. 18 8
      compiler/scanner.pas

+ 2 - 1
compiler/psub.pas

@@ -2051,7 +2051,8 @@ implementation
                    { use the index the module got from the current compilation process }
                    current_filepos.moduleindex:=hmodule.unit_index;
                    current_tokenpos:=current_filepos;
-                   current_scanner.startreplaytokens(tprocdef(tprocdef(hp).genericdef).generictokenbuf);
+                   current_scanner.startreplaytokens(tprocdef(tprocdef(hp).genericdef).generictokenbuf,
+                     tprocdef(tprocdef(hp).genericdef).change_endian);
                    read_proc_body(nil,tprocdef(hp));
                    current_filepos:=oldcurrent_filepos;
                  end

+ 2 - 1
compiler/ptype.pas

@@ -340,7 +340,8 @@ implementation
 
                 if not assigned(genericdef.generictokenbuf) then
                   internalerror(200511171);
-                current_scanner.startreplaytokens(genericdef.generictokenbuf);
+                current_scanner.startreplaytokens(genericdef.generictokenbuf,
+                  genericdef.change_endian);
                 read_named_type(tt,specializename,genericdef,generictypelist,false);
                 ttypesym(srsym).typedef:=tt;
                 tt.typesym:=srsym;

+ 18 - 8
compiler/scanner.pas

@@ -71,7 +71,9 @@ interface
          settings : tsettings;
          tokenbuf : tdynamicarray;
          next     : treplaystack;
-         constructor Create(atoken: ttoken;asettings:tsettings;atokenbuf:tdynamicarray;anext:treplaystack);
+         change_endian : boolean;
+         constructor Create(atoken: ttoken;asettings:tsettings;
+           atokenbuf:tdynamicarray;anext:treplaystack; achange_endian : boolean);
        end;
 
        tcompile_time_predicate = function(var valuedescr: String) : Boolean;
@@ -117,6 +119,7 @@ interface
 
           replaytokenbuf,
           recordtokenbuf : tdynamicarray;
+          tokenbuf_change_endian : boolean;
 
           { last settings we stored }
           last_settings : tsettings;
@@ -170,7 +173,7 @@ interface
           procedure startrecordtokens(buf:tdynamicarray);
           procedure stoprecordtokens;
           procedure replaytoken;
-          procedure startreplaytokens(buf:tdynamicarray);
+          procedure startreplaytokens(buf:tdynamicarray; achange_endian : boolean);
           procedure writesizeint(val : sizeint);
           function  readsizeint : sizeint;
           procedure readchar;
@@ -1863,11 +1866,13 @@ In case not, the value returned can be arbitrary.
 {*****************************************************************************
                               TReplayStack
 *****************************************************************************}
-    constructor treplaystack.Create(atoken:ttoken;asettings:tsettings;atokenbuf:tdynamicarray;anext:treplaystack);
+    constructor treplaystack.Create(atoken:ttoken;asettings:tsettings;
+      atokenbuf:tdynamicarray;anext:treplaystack;achange_endian : boolean);
       begin
         token:=atoken;
         settings:=asettings;
         tokenbuf:=atokenbuf;
+        change_endian:=achange_endian;
         next:=anext;
       end;
 
@@ -1907,6 +1912,7 @@ In case not, the value returned can be arbitrary.
       { reset scanner }
         preprocstack:=nil;
         replaystack:=nil;
+        tokenbuf_change_endian:=false;
         comment_level:=0;
         yylexcount:=0;
         block_type:=bt_general;
@@ -2083,8 +2089,6 @@ In case not, the value returned can be arbitrary.
 
     procedure tscannerfile.writesizeint(val : sizeint);
       begin
-        if target_info.endian <> source_info.endian then
-          val:=swapendian(val);
         recordtokenbuf.write(val,sizeof(sizeint));
       end;
 
@@ -2093,7 +2097,7 @@ In case not, the value returned can be arbitrary.
         val : sizeint;
       begin
         replaytokenbuf.read(val,sizeof(sizeint));
-        if target_info.endian <> source_info.endian then
+        if tokenbuf_change_endian then
           val:=swapendian(val);
         result:=val;
       end;
@@ -2225,18 +2229,20 @@ In case not, the value returned can be arbitrary.
       end;
 
 
-    procedure tscannerfile.startreplaytokens(buf:tdynamicarray);
+    procedure tscannerfile.startreplaytokens(buf:tdynamicarray; achange_endian : boolean);
       begin
         if not assigned(buf) then
           internalerror(200511175);
         { save current token }
         if token in [_CWCHAR,_CWSTRING,_CCHAR,_CSTRING,_INTCONST,_REALNUMBER,_ID] then
           internalerror(200511178);
-        replaystack:=treplaystack.create(token,current_settings,replaytokenbuf,replaystack);
+        replaystack:=treplaystack.create(token,current_settings,
+          replaytokenbuf,replaystack,tokenbuf_change_endian);
         if assigned(inputpointer) then
           dec(inputpointer);
         { install buffer }
         replaytokenbuf:=buf;
+        tokenbuf_change_endian:=achange_endian;
 
         { reload next token }
         replaytokenbuf.seek(0);
@@ -2779,6 +2785,10 @@ In case not, the value returned can be arbitrary.
            hp:=replaystack.next;
            replaystack.free;
            replaystack:=hp;
+           if assigned (replaystack) then
+             tokenbuf_change_endian:=replaystack.change_endian
+           else
+             tokenbuf_change_endian:=false;
          end;
       end;