summaryrefslogtreecommitdiff
path: root/closures/compiler/export.pas
diff options
context:
space:
mode:
Diffstat (limited to 'closures/compiler/export.pas')
-rw-r--r--closures/compiler/export.pas269
1 files changed, 269 insertions, 0 deletions
diff --git a/closures/compiler/export.pas b/closures/compiler/export.pas
new file mode 100644
index 0000000000..d363d7434a
--- /dev/null
+++ b/closures/compiler/export.pas
@@ -0,0 +1,269 @@
+{
+ Copyright (c) 1998-2002 by Florian Klaempfl
+
+ This unit implements an uniform export object
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+ ****************************************************************************
+}
+unit export;
+
+{$i fpcdefs.inc}
+
+interface
+
+uses
+ cutils,cclasses,
+ systems,
+ symtype,symdef,symsym,
+ aasmbase,aasmdata;
+
+const
+ { export options }
+ eo_resident = $1;
+ eo_index = $2;
+ eo_name = $4;
+
+type
+ texported_item = class(TLinkedListItem)
+ sym : tsym;
+ index : longint;
+ name : pshortstring;
+ options : word;
+ is_var : boolean;
+ constructor create;
+ destructor destroy;override;
+ end;
+
+ texportlib=class
+ private
+ notsupmsg : boolean;
+ finitname,
+ ffininame : string;
+ procedure NotSupported;
+ public
+ constructor Create;virtual;
+ destructor Destroy;override;
+ procedure preparelib(const s : string);virtual;
+ procedure exportprocedure(hp : texported_item);virtual;
+ procedure exportvar(hp : texported_item);virtual;
+ procedure generatelib;virtual;
+ procedure setinitname(list: TAsmList; const s: string); virtual;
+ procedure setfininame(list: TAsmList; const s: string); virtual;
+
+ property initname: string read finitname;
+ property fininame: string read ffininame;
+ end;
+
+ TExportLibClass=class of TExportLib;
+
+
+ procedure exportprocsym(sym: tsym; const s : string; index: longint; options: word);
+ procedure exportvarsym(sym: tsym; const s : string; index: longint; options: word);
+ { to export symbols not directly related to a tsym (e.g., the Objective-C
+ rtti) }
+ procedure exportname(const s : string; options: word);
+
+ procedure exportallprocdefnames(sym: tprocsym; pd: tprocdef; options: word);
+ procedure exportallprocsymnames(ps: tprocsym; options: word);
+
+
+var
+ CExportLib : array[tsystem] of TExportLibClass;
+ ExportLib : TExportLib;
+
+procedure RegisterExport(t:tsystem;c:TExportLibClass);
+procedure InitExport;
+procedure DoneExport;
+
+implementation
+
+uses
+ verbose,globals;
+
+{****************************************************************************
+ TExported_procedure
+****************************************************************************}
+
+procedure exportprocsym(sym: tsym; const s : string; index: longint; options: word);
+ var
+ hp : texported_item;
+ begin
+ hp:=texported_item.create;
+ hp.name:=stringdup(s);
+ hp.sym:=sym;
+ hp.options:=options or eo_name;
+ hp.index:=index;
+ exportlib.exportprocedure(hp);
+ end;
+
+
+procedure exportvarsym(sym: tsym; const s : string; index: longint; options: word);
+ var
+ hp : texported_item;
+ begin
+ hp:=texported_item.create;
+ hp.name:=stringdup(s);
+ hp.sym:=sym;
+ hp.is_var:=true;
+ hp.options:=options or eo_name;
+ hp.index:=index;
+ exportlib.exportvar(hp);
+ end;
+
+
+procedure exportname(const s : string; options: word);
+ begin
+ exportvarsym(nil,s,0,options);
+ end;
+
+
+ procedure exportallprocdefnames(sym: tprocsym; pd: tprocdef; options: word);
+ var
+ item: TCmdStrListItem;
+ begin
+ exportprocsym(sym,pd.mangledname,0,options);
+ { walk through all aliases }
+ item:=TCmdStrListItem(pd.aliasnames.first);
+ while assigned(item) do
+ begin
+ { avoid duplicate entries, sometimes aliasnames contains the mangledname }
+ if item.str<>pd.mangledname then
+ exportprocsym(sym,item.str,0,options);
+ item:=TCmdStrListItem(item.next);
+ end;
+ end;
+
+
+ procedure exportallprocsymnames(ps: tprocsym; options: word);
+ var
+ i: longint;
+ begin
+ for i:= 0 to ps.ProcdefList.Count-1 do
+ exportallprocdefnames(ps,tprocdef(ps.ProcdefList[i]),options);
+ end;
+
+
+{****************************************************************************
+ TExported_procedure
+****************************************************************************}
+
+constructor texported_item.Create;
+begin
+ inherited Create;
+ sym:=nil;
+ index:=-1;
+ name:=nil;
+ options:=0;
+ is_var:=false;
+end;
+
+
+destructor texported_item.destroy;
+begin
+ stringdispose(name);
+ inherited destroy;
+end;
+
+
+{****************************************************************************
+ TExportLib
+****************************************************************************}
+
+constructor texportlib.Create;
+begin
+ notsupmsg:=false;
+end;
+
+
+destructor texportlib.Destroy;
+begin
+end;
+
+
+procedure texportlib.NotSupported;
+begin
+ { show the message only once }
+ if not notsupmsg then
+ begin
+ Message(exec_e_dll_not_supported);
+ notsupmsg:=true;
+ end;
+end;
+
+
+procedure texportlib.preparelib(const s:string);
+begin
+ NotSupported;
+end;
+
+
+procedure texportlib.exportprocedure(hp : texported_item);
+begin
+ NotSupported;
+end;
+
+
+procedure texportlib.exportvar(hp : texported_item);
+begin
+ NotSupported;
+end;
+
+
+procedure texportlib.generatelib;
+begin
+ NotSupported;
+end;
+
+
+procedure texportlib.setinitname(list: TAsmList; const s: string);
+begin
+ finitname:=s;
+end;
+
+
+procedure texportlib.setfininame(list: TAsmList; const s: string);
+begin
+ ffininame:=s;
+end;
+
+{*****************************************************************************
+ Init/Done
+*****************************************************************************}
+
+procedure RegisterExport(t:tsystem;c:TExportLibClass);
+begin
+ CExportLib[t]:=c;
+end;
+
+
+procedure InitExport;
+begin
+ if assigned(CExportLib[target_info.system]) then
+ exportlib:=CExportLib[target_info.system].Create
+ else
+ exportlib:=TExportLib.Create;
+end;
+
+
+procedure DoneExport;
+begin
+ if assigned(Exportlib) then
+ Exportlib.free;
+end;
+
+
+end.