Procházet zdrojové kódy

+ basic variant type support in the compiler

florian před 24 roky
rodič
revize
82a6a7ed95
5 změnil soubory, kde provedl 84 přidání a 8 odebrání
  1. 6 2
      compiler/ppu.pas
  2. 8 1
      compiler/psystem.pas
  3. 6 3
      compiler/symconst.pas
  4. 59 1
      compiler/symdef.pas
  5. 5 1
      compiler/symtable.pas

+ 6 - 2
compiler/ppu.pas

@@ -113,6 +113,7 @@ const
   iblongstringdef  = 54;
   ibansistringdef  = 55;
   ibwidestringdef  = 56;
+  ibvariantdef     = 57;
 
 { unit flags }
   uf_init          = $1;
@@ -889,7 +890,10 @@ end;
 end.
 {
   $Log$
-  Revision 1.6  2000-12-07 17:19:43  jonas
+  Revision 1.7  2001-03-22 00:10:58  florian
+    + basic variant type support in the compiler
+
+  Revision 1.6  2000/12/07 17:19:43  jonas
     * new constant handling: from now on, hex constants >$7fffffff are
       parsed as unsigned constants (otherwise, $80000000 got sign extended
       and became $ffffffff80000000), all constants in the longint range
@@ -913,4 +917,4 @@ end.
   Revision 1.2  2000/07/13 11:32:45  michael
   + removed logs
 
-}
+}

+ 8 - 1
compiler/psystem.pas

@@ -110,6 +110,7 @@ begin
   p^.insert(new(ptypesym,initdef('$void_farpointer',voidfarpointerdef)));
   p^.insert(new(ptypesym,initdef('$openchararray',openchararraydef)));
   p^.insert(new(ptypesym,initdef('$file',cfiledef)));
+  p^.insert(new(ptypesym,initdef('$variant',cvariantdef)));
   p^.insert(new(ptypesym,initdef('$s32real',s32floatdef)));
   p^.insert(new(ptypesym,initdef('$s64real',s64floatdef)));
   p^.insert(new(ptypesym,initdef('$s80real',s80floatdef)));
@@ -162,6 +163,7 @@ begin
   p^.insert(new(ptypesym,initdef('QWord',cu64bitdef)));
   p^.insert(new(ptypesym,initdef('Int64',cs64bitdef)));
   p^.insert(new(ptypesym,initdef('TypedFile',new(pfiledef,inittypeddef(voiddef)))));
+  p^.insert(new(ptypesym,initdef('Variant',cvariantdef)));
 end;
 
 
@@ -198,6 +200,7 @@ begin
   voidfarpointerdef:=ppointerdef(globaldef('void_farpointer'));
   cfiledef:=pfiledef(globaldef('file'));
   pvmtdef:=ppointerdef(globaldef('pvmt'));
+  cvariantdef:=pvariantdef(globaldef('variant'));
 end;
 
 
@@ -252,6 +255,7 @@ begin
   charpointerdef:=new(ppointerdef,initdef(cchardef));
   voidfarpointerdef:=new(ppointerdef,initfardef(voiddef));
   cfiledef:=new(pfiledef,inituntyped);
+  cvariantdef:=new(pvariantdef,init);
   registerdef:=oldregisterdef;
 end;
 
@@ -259,7 +263,10 @@ end;
 end.
 {
   $Log$
-  Revision 1.11  2000-12-07 17:19:43  jonas
+  Revision 1.12  2001-03-22 00:10:58  florian
+    + basic variant type support in the compiler
+
+  Revision 1.11  2000/12/07 17:19:43  jonas
     * new constant handling: from now on, hex constants >$7fffffff are
       parsed as unsigned constants (otherwise, $80000000 got sign extended
       and became $ffffffff80000000), all constants in the longint range

+ 6 - 3
compiler/symconst.pas

@@ -390,7 +390,7 @@ type
   tdeftype = (abstractdef,arraydef,recorddef,pointerdef,orddef,
               stringdef,enumdef,procdef,objectdef,errordef,
               filedef,formaldef,setdef,procvardef,floatdef,
-              classrefdef,forwarddef);
+              classrefdef,forwarddef,variantdef);
 
   { possible types for symtable entries }
   tsymtyp = (abstractsym,varsym,typesym,procsym,unitsym,
@@ -455,7 +455,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.13  2001-02-26 19:44:55  peter
+  Revision 1.14  2001-03-22 00:10:58  florian
+    + basic variant type support in the compiler
+
+  Revision 1.13  2001/02/26 19:44:55  peter
     * merged generic m68k updates from fixes branch
 
   Revision 1.12  2000/11/04 14:25:21  florian
@@ -488,4 +491,4 @@ end.
   Revision 1.2  2000/07/13 11:32:49  michael
   + removed logs
 
-}
+}

+ 59 - 1
compiler/symdef.pas

@@ -138,6 +138,16 @@ interface
 {$endif GDB}
        end;
 
+       pvariantdef = ^tvariantdef;
+       tvariantdef = object(tstoreddef)
+          constructor init;
+          constructor load;
+          procedure write;virtual;
+          procedure setsize;
+          function needs_inittable : boolean;virtual;
+          procedure write_rtti_data;virtual;
+       end;
+
        pformaldef = ^tformaldef;
        tformaldef = object(tstoreddef)
           constructor init;
@@ -649,6 +659,8 @@ interface
        cfiledef : pfiledef;       { get the same definition for all file }
                                   { used for stabs }
 
+       cvariantdef : pvariantdef; { we use only one variant def }
+
        class_tobject : pobjectdef;   { pointer to the anchestor of all classes }
        interface_iunknown : pobjectdef; { KAZ: pointer to the ancestor }
        rec_tguid : precorddef;          { KAZ: pointer to the TGUID type }
@@ -2111,6 +2123,49 @@ implementation
       end;
 
 
+{****************************************************************************
+                               TVARIANTDEF
+****************************************************************************}
+
+    constructor tvariantdef.init;
+      begin
+         inherited init;
+         deftype:=variantdef;
+         setsize;
+      end;
+
+
+    constructor tvariantdef.load;
+      begin
+         inherited load;
+         deftype:=variantdef;
+         setsize;
+      end;
+
+
+    procedure tvariantdef.write;
+      begin
+         inherited write;
+         current_ppu^.writeentry(ibvariantdef);
+      end;
+
+
+    procedure tvariantdef.setsize;
+      begin
+         savesize:=16;
+      end;
+
+
+    procedure tvariantdef.write_rtti_data;
+      begin
+         rttiList.concat(Tai_const.Create_8bit(tkVariant));
+      end;
+
+
+    function tvariantdef.needs_inittable : boolean;
+      begin
+         needs_inittable:=true;
+      end;
 
 {****************************************************************************
                                TPOINTERDEF
@@ -5565,7 +5620,10 @@ Const local_symtable_index : longint = $8001;
 end.
 {
   $Log$
-  Revision 1.21  2001-03-11 22:58:50  peter
+  Revision 1.22  2001-03-22 00:10:58  florian
+    + basic variant type support in the compiler
+
+  Revision 1.21  2001/03/11 22:58:50  peter
     * getsym redesign, removed the globals srsym,srsymtable
 
   Revision 1.20  2001/01/06 20:11:29  peter

+ 5 - 1
compiler/symtable.pas

@@ -540,6 +540,7 @@ implementation
                  ibfiledef : hp:=new(pfiledef,load);
              ibclassrefdef : hp:=new(pclassrefdef,load);
                ibformaldef : hp:=new(pformaldef,load);
+              ibvariantdef : hp:=new(pvariantdef,load);
                  ibenddefs : break;
                      ibend : Message(unit_f_ppu_read_error);
            else
@@ -2375,7 +2376,10 @@ implementation
 end.
 {
   $Log$
-  Revision 1.28  2001-03-13 18:45:07  peter
+  Revision 1.29  2001-03-22 00:10:58  florian
+    + basic variant type support in the compiler
+
+  Revision 1.28  2001/03/13 18:45:07  peter
     * fixed some memory leaks
 
   Revision 1.27  2001/03/11 22:58:51  peter