Răsfoiți Sursa

compiler:
- move objname, objrealname fields from tobjectdef to tabstractrecorddef,
- load and save them from/to ppu file,
- use tabstarctrecorddef in some more places where previously code worked for tobjectdef
- change push_nested_hierarchy, pop_nested_hierarchy to handle records too

git-svn-id: branches/paul/extended_records@16519 -

paul 14 ani în urmă
părinte
comite
26cef34005

+ 26 - 14
compiler/pdecsub.pas

@@ -65,10 +65,10 @@ interface
     { helper functions - they insert nested objects hierarcy to the symtablestack
     { helper functions - they insert nested objects hierarcy to the symtablestack
       with object hierarchy
       with object hierarchy
     }
     }
-    function push_child_hierarcy(obj:tobjectdef):integer;
-    function pop_child_hierarchy(obj:tobjectdef):integer;
-    function push_nested_hierarchy(obj:tobjectdef):integer;
-    function pop_nested_hierarchy(obj:tobjectdef):integer;
+    function push_child_hierarcy(obj:tabstractrecorddef):integer;
+    function pop_child_hierarchy(obj:tabstractrecorddef):integer;
+    function push_nested_hierarchy(obj:tabstractrecorddef):integer;
+    function pop_nested_hierarchy(obj:tabstractrecorddef):integer;
 
 
 implementation
 implementation
 
 
@@ -97,15 +97,21 @@ implementation
         Declaring it as string here results in an error when compiling (PFV) }
         Declaring it as string here results in an error when compiling (PFV) }
       current_procinfo = 'error';
       current_procinfo = 'error';
 
 
-    function push_child_hierarcy(obj:tobjectdef):integer;
+    function push_child_hierarcy(obj:tabstractrecorddef):integer;
       var
       var
         _class,hp : tobjectdef;
         _class,hp : tobjectdef;
       begin
       begin
+        if obj.typ=recorddef then
+          begin
+            symtablestack.push(obj.symtable);
+            result:=1;
+            exit;
+          end;
         result:=0;
         result:=0;
         { insert class hierarchy in the reverse order }
         { insert class hierarchy in the reverse order }
         hp:=nil;
         hp:=nil;
         repeat
         repeat
-          _class:=obj;
+          _class:=tobjectdef(obj);
           while _class.childof<>hp do
           while _class.childof<>hp do
             _class:=_class.childof;
             _class:=_class.childof;
           hp:=_class;
           hp:=_class;
@@ -114,20 +120,26 @@ implementation
         until hp=obj;
         until hp=obj;
       end;
       end;
 
 
-    function push_nested_hierarchy(obj:tobjectdef):integer;
+    function push_nested_hierarchy(obj:tabstractrecorddef):integer;
       begin
       begin
         result:=0;
         result:=0;
-        if obj.owner.symtabletype=ObjectSymtable then
-          inc(result,push_nested_hierarchy(tobjectdef(obj.owner.defowner)));
+        if obj.owner.symtabletype in [ObjectSymtable,recordsymtable] then
+          inc(result,push_nested_hierarchy(tabstractrecorddef(obj.owner.defowner)));
         inc(result,push_child_hierarcy(obj));
         inc(result,push_child_hierarcy(obj));
       end;
       end;
 
 
-    function pop_child_hierarchy(obj:tobjectdef):integer;
+    function pop_child_hierarchy(obj:tabstractrecorddef):integer;
       var
       var
         _class : tobjectdef;
         _class : tobjectdef;
       begin
       begin
+        if obj.typ=recorddef then
+          begin
+            symtablestack.pop(obj.symtable);
+            result:=1;
+            exit;
+          end;
         result:=0;
         result:=0;
-        _class:=obj;
+        _class:=tobjectdef(obj);
         while assigned(_class) do
         while assigned(_class) do
           begin
           begin
             symtablestack.pop(_class.symtable);
             symtablestack.pop(_class.symtable);
@@ -136,11 +148,11 @@ implementation
           end;
           end;
       end;
       end;
 
 
-    function pop_nested_hierarchy(obj:tobjectdef):integer;
+    function pop_nested_hierarchy(obj:tabstractrecorddef):integer;
       begin
       begin
         result:=pop_child_hierarchy(obj);
         result:=pop_child_hierarchy(obj);
-        if obj.owner.symtabletype=ObjectSymtable then
-          inc(result,pop_nested_hierarchy(tobjectdef(obj.owner.defowner)));
+        if obj.owner.symtabletype in [ObjectSymtable,recordsymtable] then
+          inc(result,pop_nested_hierarchy(tabstractrecorddef(obj.owner.defowner)));
       end;
       end;
 
 
     procedure insert_funcret_para(pd:tabstractprocdef);
     procedure insert_funcret_para(pd:tabstractprocdef);

+ 2 - 2
compiler/pdecvar.pas

@@ -1608,8 +1608,8 @@ implementation
                 Message(type_e_ordinal_expr_expected);
                 Message(type_e_ordinal_expr_expected);
               consume(_OF);
               consume(_OF);
 
 
-              UnionSymtable:=trecordsymtable.create(current_settings.packrecords);
-              UnionDef:=trecorddef.create(unionsymtable);
+              UnionSymtable:=trecordsymtable.create('',current_settings.packrecords);
+              UnionDef:=trecorddef.create('',unionsymtable);
               uniondef.isunion:=true;
               uniondef.isunion:=true;
               startvarrecsize:=UnionSymtable.datasize;
               startvarrecsize:=UnionSymtable.datasize;
               { align the bitpacking to the next byte }
               { align the bitpacking to the next byte }

+ 1 - 1
compiler/ppu.pas

@@ -43,7 +43,7 @@ type
 {$endif Test_Double_checksum}
 {$endif Test_Double_checksum}
 
 
 const
 const
-  CurrentPPUVersion = 121;
+  CurrentPPUVersion = 122;
 
 
 { buffer sizes }
 { buffer sizes }
   maxentrysize = 1024;
   maxentrysize = 1024;

+ 4 - 4
compiler/psystem.pas

@@ -347,8 +347,8 @@ implementation
           end;
           end;
         addtype('$s64currency',s64currencytype);
         addtype('$s64currency',s64currencytype);
         { Add a type for virtual method tables }
         { Add a type for virtual method tables }
-        hrecst:=trecordsymtable.create(current_settings.packrecords);
-        vmttype:=trecorddef.create(hrecst);
+        hrecst:=trecordsymtable.create('',current_settings.packrecords);
+        vmttype:=trecorddef.create('',hrecst);
         pvmttype:=tpointerdef.create(vmttype);
         pvmttype:=tpointerdef.create(vmttype);
         { can't use addtype for pvmt because the rtti of the pointed
         { can't use addtype for pvmt because the rtti of the pointed
           type is not available. The rtti for pvmt will be written implicitly
           type is not available. The rtti for pvmt will be written implicitly
@@ -371,10 +371,10 @@ implementation
         tarraydef(vmtarraytype).elementdef:=pvmttype;
         tarraydef(vmtarraytype).elementdef:=pvmttype;
         addtype('$vtblarray',vmtarraytype);
         addtype('$vtblarray',vmtarraytype);
         { Add a type for methodpointers }
         { Add a type for methodpointers }
-        hrecst:=trecordsymtable.create(1);
+        hrecst:=trecordsymtable.create('',1);
         addfield(hrecst,tfieldvarsym.create('$proc',vs_value,voidpointertype,[]));
         addfield(hrecst,tfieldvarsym.create('$proc',vs_value,voidpointertype,[]));
         addfield(hrecst,tfieldvarsym.create('$self',vs_value,voidpointertype,[]));
         addfield(hrecst,tfieldvarsym.create('$self',vs_value,voidpointertype,[]));
-        methodpointertype:=trecorddef.create(hrecst);
+        methodpointertype:=trecorddef.create('',hrecst);
         addtype('$methodpointer',methodpointertype);
         addtype('$methodpointer',methodpointertype);
         symtablestack.pop(systemunit);
         symtablestack.pop(systemunit);
       end;
       end;

+ 6 - 7
compiler/ptype.pas

@@ -871,15 +871,15 @@ implementation
       end;
       end;
 
 
     { reads a record declaration }
     { reads a record declaration }
-    function record_dec : tdef;
+    function record_dec(const n:tidstring):tdef;
       var
       var
          old_current_structdef : tabstractrecorddef;
          old_current_structdef : tabstractrecorddef;
          recst : trecordsymtable;
          recst : trecordsymtable;
       begin
       begin
          old_current_structdef:=current_structdef;
          old_current_structdef:=current_structdef;
          { create recdef }
          { create recdef }
-         recst:=trecordsymtable.create(current_settings.packrecords);
-         current_structdef:=trecorddef.create(recst);
+         recst:=trecordsymtable.create(n,current_settings.packrecords);
+         current_structdef:=trecorddef.create(n,recst);
          result:=current_structdef;
          result:=current_structdef;
          { insert in symtablestack }
          { insert in symtablestack }
          symtablestack.push(recst);
          symtablestack.push(recst);
@@ -890,8 +890,7 @@ implementation
          recst.addalignmentpadding;
          recst.addalignmentpadding;
          { restore symtable stack }
          { restore symtable stack }
          symtablestack.pop(recst);
          symtablestack.pop(recst);
-         if trecorddef(record_dec).is_packed and
-            is_managed_type(record_dec) then
+         if trecorddef(current_structdef).is_packed and is_managed_type(current_structdef) then
            Message(type_e_no_packed_inittable);
            Message(type_e_no_packed_inittable);
          current_structdef:=old_current_structdef;
          current_structdef:=old_current_structdef;
       end;
       end;
@@ -1314,7 +1313,7 @@ implementation
               end;
               end;
             _RECORD:
             _RECORD:
               begin
               begin
-                def:=record_dec;
+                def:=record_dec(name);
               end;
               end;
             _PACKED,
             _PACKED,
             _BITPACKED:
             _BITPACKED:
@@ -1349,7 +1348,7 @@ implementation
                           def:=object_dec(odt_object,name,genericdef,genericlist,nil);
                           def:=object_dec(odt_object,name,genericdef,genericlist,nil);
                         end;
                         end;
                       else
                       else
-                        def:=record_dec;
+                        def:=record_dec(name);
                     end;
                     end;
                     current_settings.packrecords:=oldpackrecords;
                     current_settings.packrecords:=oldpackrecords;
                   end;
                   end;

+ 47 - 27
compiler/symdef.pas

@@ -171,9 +171,15 @@ interface
        { tabstractrecorddef }
        { tabstractrecorddef }
 
 
        tabstractrecorddef= class(tstoreddef)
        tabstractrecorddef= class(tstoreddef)
+          objname,
+          objrealname: PShortString;
           symtable : TSymtable;
           symtable : TSymtable;
           cloneddef      : tabstractrecorddef;
           cloneddef      : tabstractrecorddef;
           cloneddefderef : tderef;
           cloneddefderef : tderef;
+          constructor create(const n:string; dt:tdeftyp);
+          constructor ppuload(dt:tdeftyp;ppufile:tcompilerppufile);
+          procedure ppuwrite(ppufile:tcompilerppufile);override;
+          destructor destroy; override;
           function  GetSymtable(t:tGetSymtable):TSymtable;override;
           function  GetSymtable(t:tGetSymtable):TSymtable;override;
           function is_packed:boolean;
           function is_packed:boolean;
           function RttiName: string;
           function RttiName: string;
@@ -182,7 +188,7 @@ interface
        trecorddef = class(tabstractrecorddef)
        trecorddef = class(tabstractrecorddef)
        public
        public
           isunion       : boolean;
           isunion       : boolean;
-          constructor create(p : TSymtable);
+          constructor create(const n:string; p:TSymtable);
           constructor ppuload(ppufile:tcompilerppufile);
           constructor ppuload(ppufile:tcompilerppufile);
           destructor destroy;override;
           destructor destroy;override;
           function getcopy : tstoreddef;override;
           function getcopy : tstoreddef;override;
@@ -246,8 +252,6 @@ interface
 
 
           { for C++ classes: name of the library this class is imported from }
           { for C++ classes: name of the library this class is imported from }
           import_lib,
           import_lib,
-          objname,
-          objrealname,
           { for Objective-C: protocols and classes can have the same name there }
           { for Objective-C: protocols and classes can have the same name there }
           objextname     : pshortstring;
           objextname     : pshortstring;
           objectoptions  : tobjectoptions;
           objectoptions  : tobjectoptions;
@@ -274,7 +278,7 @@ interface
           classref_created_in_current_module : boolean;
           classref_created_in_current_module : boolean;
           { store implemented interfaces defs and name mappings }
           { store implemented interfaces defs and name mappings }
           ImplementedInterfaces : TFPObjectList;
           ImplementedInterfaces : TFPObjectList;
-          constructor create(ot : tobjecttyp;const n : string;c : tobjectdef);
+          constructor create(ot:tobjecttyp;const n:string;c:tobjectdef);
           constructor ppuload(ppufile:tcompilerppufile);
           constructor ppuload(ppufile:tcompilerppufile);
           destructor  destroy;override;
           destructor  destroy;override;
           function getcopy : tstoreddef;override;
           function getcopy : tstoreddef;override;
@@ -869,11 +873,11 @@ implementation
            st:=st.defowner.owner;
            st:=st.defowner.owner;
          end;
          end;
         { object/classes symtable, nested type definitions in classes require the while loop }
         { object/classes symtable, nested type definitions in classes require the while loop }
-        while st.symtabletype=ObjectSymtable do
+        while st.symtabletype in [ObjectSymtable,recordsymtable] do
          begin
          begin
-           if st.defowner.typ<>objectdef then
+           if not (st.defowner.typ in [objectdef,recorddef]) then
             internalerror(200204174);
             internalerror(200204174);
-           prefix:=tobjectdef(st.defowner).objname^+'_$_'+prefix;
+           prefix:=tabstractrecorddef(st.defowner).objname^+'_$_'+prefix;
            st:=st.defowner.owner;
            st:=st.defowner.owner;
          end;
          end;
         { symtable must now be static or global }
         { symtable must now be static or global }
@@ -2554,6 +2558,33 @@ implementation
                               tabstractrecorddef
                               tabstractrecorddef
 ***************************************************************************}
 ***************************************************************************}
 
 
+    constructor tabstractrecorddef.create(const n:string; dt:tdeftyp);
+      begin
+        inherited create(dt);
+        objname:=stringdup(upper(n));
+        objrealname:=stringdup(n);
+      end;
+
+    constructor tabstractrecorddef.ppuload(dt:tdeftyp;ppufile:tcompilerppufile);
+      begin
+        inherited ppuload(dt,ppufile);
+        objrealname:=stringdup(ppufile.getstring);
+        objname:=stringdup(upper(objrealname^));
+      end;
+
+    procedure tabstractrecorddef.ppuwrite(ppufile: tcompilerppufile);
+      begin
+        inherited ppuwrite(ppufile);
+        ppufile.putstring(objrealname^);
+      end;
+
+    destructor tabstractrecorddef.destroy;
+      begin
+        stringdispose(objname);
+        stringdispose(objrealname);
+        inherited destroy;
+      end;
+
     function tabstractrecorddef.GetSymtable(t:tGetSymtable):TSymtable;
     function tabstractrecorddef.GetSymtable(t:tGetSymtable):TSymtable;
       begin
       begin
          if t=gs_record then
          if t=gs_record then
@@ -2572,14 +2603,14 @@ implementation
       var
       var
         tmp: tabstractrecorddef;
         tmp: tabstractrecorddef;
       begin
       begin
-        Result:=typename;
+        Result:=objrealname^;
         tmp:=self;
         tmp:=self;
         repeat
         repeat
           if tmp.owner.symtabletype in [ObjectSymtable,recordsymtable] then
           if tmp.owner.symtabletype in [ObjectSymtable,recordsymtable] then
             tmp:=tabstractrecorddef(tmp.owner.defowner)
             tmp:=tabstractrecorddef(tmp.owner.defowner)
           else
           else
             break;
             break;
-          Result:=tmp.typename+'.'+Result;
+          Result:=tmp.objrealname^+'.'+Result;
         until tmp=nil;
         until tmp=nil;
       end;
       end;
 
 
@@ -2588,9 +2619,9 @@ implementation
                                   trecorddef
                                   trecorddef
 ***************************************************************************}
 ***************************************************************************}
 
 
-    constructor trecorddef.create(p : TSymtable);
+    constructor trecorddef.create(const n:string; p:TSymtable);
       begin
       begin
-         inherited create(recorddef);
+         inherited create(n,recorddef);
          symtable:=p;
          symtable:=p;
          { we can own the symtable only if nobody else owns a copy so far }
          { we can own the symtable only if nobody else owns a copy so far }
          if symtable.refcount=1 then
          if symtable.refcount=1 then
@@ -2606,7 +2637,7 @@ implementation
            ppufile.getderef(cloneddefderef)
            ppufile.getderef(cloneddefderef)
          else
          else
            begin
            begin
-             symtable:=trecordsymtable.create(0);
+             symtable:=trecordsymtable.create(objrealname^,0);
              trecordsymtable(symtable).fieldalignment:=shortint(ppufile.getbyte);
              trecordsymtable(symtable).fieldalignment:=shortint(ppufile.getbyte);
              trecordsymtable(symtable).recordalignment:=shortint(ppufile.getbyte);
              trecordsymtable(symtable).recordalignment:=shortint(ppufile.getbyte);
              trecordsymtable(symtable).padalignment:=shortint(ppufile.getbyte);
              trecordsymtable(symtable).padalignment:=shortint(ppufile.getbyte);
@@ -2633,7 +2664,7 @@ implementation
 
 
     function trecorddef.getcopy : tstoreddef;
     function trecorddef.getcopy : tstoreddef;
       begin
       begin
-        result:=trecorddef.create(symtable.getcopy);
+        result:=trecorddef.create(objrealname^,symtable.getcopy);
         trecorddef(result).isunion:=isunion;
         trecorddef(result).isunion:=isunion;
         include(trecorddef(result).defoptions,df_copied_def);
         include(trecorddef(result).defoptions,df_copied_def);
       end;
       end;
@@ -3933,9 +3964,9 @@ implementation
                               TOBJECTDEF
                               TOBJECTDEF
 ***************************************************************************}
 ***************************************************************************}
 
 
-   constructor tobjectdef.create(ot : tobjecttyp;const n : string;c : tobjectdef);
+   constructor tobjectdef.create(ot:tobjecttyp;const n:string;c:tobjectdef);
      begin
      begin
-        inherited create(objectdef);
+        inherited create(n,objectdef);
         fcurrent_dispid:=0;
         fcurrent_dispid:=0;
         objecttype:=ot;
         objecttype:=ot;
         objectoptions:=[];
         objectoptions:=[];
@@ -3945,8 +3976,6 @@ implementation
         vmtentries:=TFPList.Create;
         vmtentries:=TFPList.Create;
         vmt_offset:=0;
         vmt_offset:=0;
         set_parent(c);
         set_parent(c);
-        objname:=stringdup(upper(n));
-        objrealname:=stringdup(n);
         if objecttype in [odt_interfacecorba,odt_interfacecom,odt_dispinterface] then
         if objecttype in [odt_interfacecorba,odt_interfacecom,odt_dispinterface] then
           prepareguid;
           prepareguid;
         { setup implemented interfaces }
         { setup implemented interfaces }
@@ -3968,8 +3997,6 @@ implementation
       begin
       begin
          inherited ppuload(objectdef,ppufile);
          inherited ppuload(objectdef,ppufile);
          objecttype:=tobjecttyp(ppufile.getbyte);
          objecttype:=tobjecttyp(ppufile.getbyte);
-         objrealname:=stringdup(ppufile.getstring);
-         objname:=stringdup(upper(objrealname^));
          objextname:=stringdup(ppufile.getstring);
          objextname:=stringdup(ppufile.getstring);
          { only used for external Objective-C classes/protocols }
          { only used for external Objective-C classes/protocols }
          if (objextname^='') then
          if (objextname^='') then
@@ -4054,8 +4081,6 @@ implementation
              symtable.free;
              symtable.free;
              symtable:=nil;
              symtable:=nil;
            end;
            end;
-         stringdispose(objname);
-         stringdispose(objrealname);
          stringdispose(objextname);
          stringdispose(objextname);
          stringdispose(import_lib);
          stringdispose(import_lib);
          stringdispose(iidstr);
          stringdispose(iidstr);
@@ -4088,14 +4113,10 @@ implementation
       var
       var
         i : longint;
         i : longint;
       begin
       begin
-        result:=tobjectdef.create(objecttype,objname^,childof);
+        result:=tobjectdef.create(objecttype,objrealname^,childof);
         { the constructor allocates a symtable which we release to avoid memory leaks }
         { the constructor allocates a symtable which we release to avoid memory leaks }
         tobjectdef(result).symtable.free;
         tobjectdef(result).symtable.free;
         tobjectdef(result).symtable:=symtable.getcopy;
         tobjectdef(result).symtable:=symtable.getcopy;
-        if assigned(objname) then
-          tobjectdef(result).objname:=stringdup(objname^);
-        if assigned(objrealname) then
-          tobjectdef(result).objrealname:=stringdup(objrealname^);
         if assigned(objextname) then
         if assigned(objextname) then
           tobjectdef(result).objextname:=stringdup(objextname^);
           tobjectdef(result).objextname:=stringdup(objextname^);
         if assigned(import_lib) then
         if assigned(import_lib) then
@@ -4141,7 +4162,6 @@ implementation
          ppufile.do_indirect_crc:=true;
          ppufile.do_indirect_crc:=true;
          inherited ppuwrite(ppufile);
          inherited ppuwrite(ppufile);
          ppufile.putbyte(byte(objecttype));
          ppufile.putbyte(byte(objecttype));
-         ppufile.putstring(objrealname^);
          if assigned(objextname) then
          if assigned(objextname) then
            ppufile.putstring(objextname^)
            ppufile.putstring(objextname^)
          else
          else

+ 4 - 4
compiler/symtable.pas

@@ -104,7 +104,7 @@ interface
 
 
        trecordsymtable = class(tabstractrecordsymtable)
        trecordsymtable = class(tabstractrecordsymtable)
        public
        public
-          constructor create(usealign:shortint);
+          constructor create(const n:string;usealign:shortint);
           procedure insertunionst(unionst : trecordsymtable;offset : longint);
           procedure insertunionst(unionst : trecordsymtable;offset : longint);
        end;
        end;
 
 
@@ -1047,9 +1047,9 @@ implementation
                               TRecordSymtable
                               TRecordSymtable
 ****************************************************************************}
 ****************************************************************************}
 
 
-    constructor trecordsymtable.create(usealign:shortint);
+    constructor trecordsymtable.create(const n:string;usealign:shortint);
       begin
       begin
-        inherited create('',usealign);
+        inherited create(n,usealign);
         symtabletype:=recordsymtable;
         symtabletype:=recordsymtable;
       end;
       end;
 
 
@@ -1622,7 +1622,7 @@ implementation
     function generate_nested_name(symtable:tsymtable;delimiter:string):string;
     function generate_nested_name(symtable:tsymtable;delimiter:string):string;
       begin
       begin
         result:='';
         result:='';
-        while assigned(symtable) and (symtable.symtabletype=ObjectSymtable) do
+        while assigned(symtable) and (symtable.symtabletype in [ObjectSymtable,recordsymtable]) do
           begin
           begin
             if (result='') then
             if (result='') then
               result:=symtable.name^
               result:=symtable.name^

+ 2 - 1
compiler/utils/ppudump.pp

@@ -2091,6 +2091,7 @@ begin
          ibrecorddef :
          ibrecorddef :
            begin
            begin
              readcommondef('Record definition',defoptions);
              readcommondef('Record definition',defoptions);
+             writeln(space,'   Name of Record : ',getstring);
              writeln(space,'       FieldAlign : ',getbyte);
              writeln(space,'       FieldAlign : ',getbyte);
              writeln(space,'      RecordAlign : ',getbyte);
              writeln(space,'      RecordAlign : ',getbyte);
              writeln(space,'         PadAlign : ',getbyte);
              writeln(space,'         PadAlign : ',getbyte);
@@ -2108,6 +2109,7 @@ begin
          ibobjectdef :
          ibobjectdef :
            begin
            begin
              readcommondef('Object/Class definition',defoptions);
              readcommondef('Object/Class definition',defoptions);
+             writeln(space,'    Name of Class : ',getstring);
              b:=getbyte;
              b:=getbyte;
              write  (space,'             Type : ');
              write  (space,'             Type : ');
              case tobjecttyp(b) of
              case tobjecttyp(b) of
@@ -2121,7 +2123,6 @@ begin
                odt_objcprotocol   : writeln('objcprotocol');
                odt_objcprotocol   : writeln('objcprotocol');
                else                 writeln('!! Warning: Invalid object type ',b);
                else                 writeln('!! Warning: Invalid object type ',b);
              end;
              end;
-             writeln(space,'    Name of Class : ',getstring);
              writeln(space,'    External name : ',getstring);
              writeln(space,'    External name : ',getstring);
              writeln(space,'       Import lib : ',getstring);
              writeln(space,'       Import lib : ',getstring);
              writeln(space,'         DataSize : ',getaint);
              writeln(space,'         DataSize : ',getaint);