Explorar o código

+ infrastructure for target specific resourcefile classes

git-svn-id: trunk@6564 -
florian %!s(int64=18) %!d(string=hai) anos
pai
achega
4ceadcbc6e

+ 16 - 13
compiler/comprsrc.pas

@@ -25,15 +25,17 @@ unit comprsrc;
 
 interface
 
+  uses
+    Systems;
+
 type
-   presourcefile=^tresourcefile;
-   tresourcefile=object
+   tresourcefile = class(TAbstractResourceFile)
    private
-      fname : string;
+      fname : ansistring;
    public
-      constructor Init(const fn:string);
-      destructor Done;
-      procedure  Compile;virtual;
+      constructor Create(const fn : ansistring);override;
+      procedure Compile;virtual;
+      procedure PostProcessResourcefile(const s : ansistring);virtual;
    end;
 
 procedure CompileResourceFiles;
@@ -43,7 +45,7 @@ implementation
 
 uses
   SysUtils,
-  Systems,cutils,cfileutils,
+  cutils,cfileutils,
   Globtype,Globals,Verbose,Fmodule,
   Script;
 
@@ -51,13 +53,13 @@ uses
                               TRESOURCEFILE
 ****************************************************************************}
 
-constructor tresourcefile.init(const fn:string);
+constructor tresourcefile.create(const fn : ansistring);
 begin
   fname:=fn;
 end;
 
 
-destructor tresourcefile.done;
+procedure tresourcefile.PostProcessResourcefile(const s : ansistring);
 begin
 end;
 
@@ -121,6 +123,7 @@ begin
        end
      end;
     end;
+  PostProcessResourcefile(maybequoted(resobj));
   { Update asmres when externmode is set }
   if cs_link_nolink in current_settings.globalswitches then
     AsmRes.AddLinkCommand(resbin,s,'');
@@ -131,7 +134,7 @@ end;
 
 procedure CompileResourceFiles;
 var
-  hr : presourcefile;
+  resourcefile : tresourcefile;
 begin
   { OS/2 (EMX) must be processed elsewhere (in the linking/binding stage).
     same with MacOS}
@@ -141,9 +144,9 @@ begin
      begin
        if target_info.res<>res_none then
          begin
-           hr:=new(presourcefile,init(current_module.ResourceFiles.getfirst));
-           hr^.compile;
-           dispose(hr,done);
+           resourcefile:=TResourceFile(resinfos[target_info.res]^.resourcefileclass).create(current_module.ResourceFiles.getfirst);
+           resourcefile.compile;
+           resourcefile.free;
          end
        else
          Message(scan_e_resourcefiles_not_supported);

+ 1 - 1
compiler/psub.pas

@@ -816,7 +816,7 @@ implementation
                      tg.direction:=1;
                    end;
                end;
-            
+
 {$endif}
             { Create register allocator }
             cg.init_register_allocators;

+ 10 - 2
compiler/systems.pas

@@ -215,6 +215,12 @@ interface
        TAbstractAssemblerClass = class of TAbstractAssembler;
 
 
+       TAbstractResourceFile = class
+         constructor create(const fn : ansistring);virtual;abstract;
+       end;
+       TAbstractResourceFileClass = class of TAbstractResourceFile;
+
+
        palignmentinfo = ^talignmentinfo;
        talignmentinfo = record
          procalign,
@@ -263,6 +269,7 @@ interface
           id      : tres;
           resbin  : string[8];
           rescmd  : string[50];
+          resourcefileclass : TAbstractResourceFileClass;
        end;
 
        pdbginfo = ^tdbginfo;
@@ -414,7 +421,7 @@ interface
     procedure UpdateAlignment(var d:talignmentinfo;const s:talignmentinfo);
 
     procedure RegisterTarget(const r:tsysteminfo);
-    procedure RegisterRes(const r:tresinfo);
+    procedure RegisterRes(const r:tresinfo; rcf : TAbstractResourceFileClass);
     procedure RegisterAr(const r:tarinfo);
     { Register the external linker. This routine is called to setup the
       class to use for the linker. It returns the tsysteminfo structure
@@ -658,7 +665,7 @@ begin
 end;
 
 
-procedure RegisterRes(const r:tresinfo);
+procedure RegisterRes(const r:tresinfo; rcf : TAbstractResourceFileClass);
 var
   t : tres;
 begin
@@ -668,6 +675,7 @@ begin
   else
     Getmem(resinfos[t],sizeof(tresinfo));
   resinfos[t]^:=r;
+  resinfos[t]^.resourcefileclass:=rcf;
 end;
 
 

+ 2 - 2
compiler/systems/t_emx.pas

@@ -41,7 +41,7 @@ implementation
      cutils,cfileutils,cclasses,
      globtype,comphook,systems,symconst,symsym,symdef,
      globals,verbose,fmodule,script,ogbase,
-     import,link,i_emx,ppu;
+     comprsrc,import,link,i_emx,ppu;
 
   type
     TImportLibEMX=class(timportlib)
@@ -526,6 +526,6 @@ end;
 initialization
   RegisterExternalLinker(system_i386_emx_info,TLinkerEMX);
   RegisterImport(system_i386_emx,TImportLibEMX);
-  RegisterRes(res_emxbind_info);
+  RegisterRes(res_emxbind_info,TResourceFile);
   RegisterTarget(system_i386_emx_info);
 end.

+ 3 - 2
compiler/systems/t_linux.pas

@@ -72,6 +72,7 @@ implementation
     fmodule,
     aasmbase,aasmtai,aasmdata,aasmcpu,cpubase,
     cgbase,cgobj,cgutils,ogbase,ncgutil,
+    comprsrc,
     i_linux
     ;
 
@@ -891,7 +892,7 @@ initialization
   RegisterImport(system_i386_linux,timportliblinux);
   RegisterExport(system_i386_linux,texportliblinux);
   RegisterTarget(system_i386_linux_info);
-  RegisterRes(res_elf32_info);
+  RegisterRes(res_elf32_info,TResourceFile);
 
   RegisterExternalLinker(system_x86_6432_linux_info,TLinkerLinux);
   RegisterImport(system_x86_6432_linux,timportliblinux);
@@ -927,7 +928,7 @@ initialization
   RegisterImport(system_x86_64_linux,timportliblinux);
   RegisterExport(system_x86_64_linux,texportliblinux);
   RegisterTarget(system_x86_64_linux_info);
-  RegisterRes(res_elf64_info);
+  RegisterRes(res_elf64_info,TResourceFile);
 {$endif x86_64}
 {$ifdef SPARC}
   RegisterExternalLinker(system_sparc_linux_info,TLinkerLinux);

+ 4 - 3
compiler/systems/t_palmos.pas

@@ -45,7 +45,8 @@ implementation
     uses
        SysUtils,
        cutils,cfileutils,cclasses,
-       globtype,globals,systems,verbose,script,fmodule,i_palmos;
+       globtype,globals,systems,verbose,script,fmodule,i_palmos,
+       comprsrc;
 
 {****************************************************************************
                                TLinkerPalmOS
@@ -208,10 +209,10 @@ end;
 initialization
 {$ifdef m68k}
   RegisterTarget(system_m68k_palmos_info);
-  RegisterRes(res_m68k_palmos_info);
+  RegisterRes(res_m68k_palmos_info,TResourceFile);
 {$endif m68k}
 {$ifdef arm}
   RegisterTarget(system_arm_palmos_info);
-  RegisterRes(res_arm_palmos_info);
+  RegisterRes(res_arm_palmos_info,TResourceFile);
 {$endif arm}
 end.

+ 8 - 4
compiler/systems/t_win.pas

@@ -31,7 +31,7 @@ interface
        symconst,symdef,symsym,
        script,gendef,
        cpubase,
-       import,export,link,cgobj,i_win;
+       import,export,link,comprsrc,cgobj,i_win;
 
 
     const
@@ -91,6 +91,10 @@ interface
       end;
 
 
+      TWinResourceFile = class(TResourceFile)
+      end;
+
+
 implementation
 
   uses
@@ -1718,7 +1722,7 @@ initialization
   RegisterImport(system_i386_win32,TImportLibWin);
   RegisterExport(system_i386_win32,TExportLibWin);
   RegisterDLLScanner(system_i386_win32,TDLLScannerWin);
-  RegisterRes(res_gnu_windres_info);
+  RegisterRes(res_gnu_windres_info,TWinResourceFile);
   RegisterTarget(system_i386_win32_info);
   { WinCE }
   RegisterExternalLinker(system_i386_wince_info,TExternalLinkerWin);
@@ -1733,7 +1737,7 @@ initialization
   RegisterImport(system_x86_64_win64,TImportLibWin);
   RegisterExport(system_x86_64_win64,TExportLibWin);
   RegisterDLLScanner(system_x86_64_win64,TDLLScannerWin);
-  RegisterRes(res_gnu_windres_info);
+  RegisterRes(res_gnu_windres_info,TWinResourceFile);
   RegisterTarget(system_x64_win64_info);
 {$endif x86_64}
 {$ifdef arm}
@@ -1741,7 +1745,7 @@ initialization
   RegisterInternalLinker(system_arm_wince_info,TInternalLinkerWin);
   RegisterImport(system_arm_wince,TImportLibWin);
   RegisterExport(system_arm_wince,TExportLibWin);
-  RegisterRes(res_gnu_wince_windres_info);
+  RegisterRes(res_gnu_wince_windres_info,TWinResourceFile);
   RegisterTarget(system_arm_wince_info);
 {$endif arm}
 end.