Browse Source

More changes for type-information

michael 27 years ago
parent
commit
e3e8ca6b98
1 changed files with 151 additions and 12 deletions
  1. 151 12
      rtl/objpas/typinfo.pp

+ 151 - 12
rtl/objpas/typinfo.pp

@@ -35,6 +35,14 @@ unit typinfo;
        PByte        =^Byte;
        PByte        =^Byte;
        PLongint     =^Longint;
        PLongint     =^Longint;
        PBoolean     =^Boolean;
        PBoolean     =^Boolean;
+       PSingle      =^Single;
+       PDouble      =^Double;
+       PExtended    =^Extended;
+       PComp        =^Comp;
+       PFixed16     =^Fixed16; 
+       { Doesn't exist ?
+       PFIxed32  = ^Fixed32;
+       }
        Variant      = Pointer;
        Variant      = Pointer;
        TMethod      = Pointer;
        TMethod      = Pointer;
 
 
@@ -232,6 +240,45 @@ unit typinfo;
          // now the result should be in EAX, untested yet (FK)
          // now the result should be in EAX, untested yet (FK)
       end;
       end;
 
 
+    function CallExtendedFunc(s : Pointer;Address : Pointer; INdex,IValue : Longint) : Extended;assembler;
+    
+      Label LINoPush;
+
+      asm
+         movl S,%esi
+         movl Address,%edi
+         // ? Indexed function
+         movl Index,%eax
+         xorl %eax,%eax
+         jnz LINoPush
+         movl IValue,%eax
+         pushl %eax
+      LINoPush:
+         call (%edi)
+         //!! now What ??
+      end;
+
+    function CallExtendedProc(s : Pointer;Address : Pointer;Value : Extended; INdex,IVAlue : Longint) : Integer;assembler;
+
+      label LIPNoPush;
+
+      asm
+         movl S,%esi
+         movl Address,%edi
+         // Push value to set
+         //!! MUST BE CHANGED !!
+         movl Value,%eax
+         pushl %eax 
+         // ? Indexed procedure
+         movl Index,%eax
+         xorl %eax,%eax
+         jnz LIPNoPush
+         movl IValue,%eax
+         pushl %eax
+      LIPNoPush:
+         call (%edi)
+      end;
+
     function CallBooleanFunc(s : Pointer;Address : Pointer; Index,IValue : Longint) : Boolean;assembler;
     function CallBooleanFunc(s : Pointer;Address : Pointer; Index,IValue : Longint) : Boolean;assembler;
 
 
       Label LBNoPush;
       Label LBNoPush;
@@ -478,12 +525,12 @@ unit typinfo;
          SetIndexValues(PropInfo,Index,Ivalue);
          SetIndexValues(PropInfo,Index,Ivalue);
          case (PropInfo^.PropProcs) and 3 of
          case (PropInfo^.PropProcs) and 3 of
             ptfield:
             ptfield:
-              PLongint(Pointer(Instance)+Longint(PropInfo^.GetProc))^:=Value;
+              PLongint(Pointer(Instance)+Longint(PropInfo^.SetProc))^:=Value;
             ptstatic:
             ptstatic:
-              CallIntegerProc(Instance,PropInfo^.GetProc,Value,Index,IValue);
+              CallIntegerProc(Instance,PropInfo^.SetProc,Value,Index,IValue);
             ptvirtual:
             ptvirtual:
               CallIntegerProc(Instance,
               CallIntegerProc(Instance,
-                              (PPointer(Instance.ClassType)+Longint(PropInfo^.GetProc)),
+                              (PPointer(Instance.ClassType)+Longint(PropInfo^.SetProc)),
                               Value,Index,IValue);
                               Value,Index,IValue);
          end;
          end;
       end;
       end;
@@ -550,13 +597,45 @@ unit typinfo;
     procedure SetAStrProp(Instance : TObject;PropInfo : PPropInfo;
     procedure SetAStrProp(Instance : TObject;PropInfo : PPropInfo;
       const Value : AnsiString);
       const Value : AnsiString);
 
 
-    begin
-    end;
+      {
+      Dirty trick based on fact that AnsiString is just a pointer,
+      hence can be treated like an integer type.
+      }
+    
+      var
+         Index,Ivalue : Longint;
+           
+      begin
+         SetIndexValues(PropInfo,Index,IValue);
+         case (PropInfo^.PropProcs) and 3 of
+            ptfield:
+              PLongint(Pointer(Instance)+Longint(PropInfo^.SetProc))^:=Longint(Pointer(Value)) ;
+            ptstatic: 
+              CallIntegerProc(Instance,PropInfo^.SetProc,Longint(Pointer(Value)),Index,IValue);
+            ptvirtual:
+              CallIntegerProc(Instance,
+                              (PPointer(Instance.ClassType)+Longint(PropInfo^.SetProc)),
+                              Longint(Pointer(Value)),Index,IValue);
+         end;
+      end;
     
     
     procedure SetSStrProp(Instance : TObject;PropInfo : PPropInfo;
     procedure SetSStrProp(Instance : TObject;PropInfo : PPropInfo;
-      const Value : AnsiString);
+      const Value : ShortString);
+
+   Var Index,IValue: longint;
 
 
     begin
     begin
+      SetIndexValues(PRopInfo,Index,IValue);
+         case (PropInfo^.PropProcs) and 3 of
+            ptfield:
+              PShortString(Pointer(Instance)+Longint(PropInfo^.SetProc))^:=Value;
+            ptstatic:
+              CallSStringProc(Instance,PropInfo^.GetProc,Value,Index,IValue);
+            ptvirtual:
+              CallSStringProc(Instance,
+                              (PPointer(Instance.ClassType)+Longint(PropInfo^.GetProc)),
+                              Value,Index,IValue);
+         end;
     end;
     end;
     
     
     procedure SetStrProp(Instance : TObject;PropInfo : PPropInfo;
     procedure SetStrProp(Instance : TObject;PropInfo : PPropInfo;
@@ -571,15 +650,72 @@ unit typinfo;
 
 
     function GetFloatProp(Instance : TObject;PropInfo : PPropInfo) : Extended;
     function GetFloatProp(Instance : TObject;PropInfo : PPropInfo) : Extended;
 
 
+      var
+         Index,Ivalue : longint;
+         Value : Extended;
+
+
       begin
       begin
-         {!!!!!!!!!!!}
+         SetIndexValues(PropInfo,Index,Ivalue);
+         case (PropInfo^.PropProcs) and 3 of
+            ptfield:
+              Case GetTypeData(PropInfo^.PropType)^.FloatType of
+               ftSingle: 
+                 Value:=PSingle(Pointer(Instance)+Longint(PropInfo^.GetProc))^;
+               ftDouble:
+                 Value:=PDouble(Pointer(Instance)+Longint(PropInfo^.GetProc))^;
+               ftExtended:
+                 Value:=PExtended(Pointer(Instance)+Longint(PropInfo^.GetProc))^;
+               ftcomp:
+                 Value:=PComp(Pointer(Instance)+Longint(PropInfo^.GetProc))^;
+               { Uncommenting this code results in a internal error!!
+               ftFixed16:
+                 Value:=PFixed16(Pointer(Instance)+Longint(PropInfo^.GetProc))^;
+               ftfixed32:
+                 Value:=PFixed32(Pointer(Instance)+Longint(PropInfo^.GetProc))^;
+               }  
+               end;
+            ptstatic:
+              Value:=CallExtendedFunc(Instance,PropInfo^.GetProc,Index,IValue);
+            ptvirtual:
+              Value:=CallExtendedFunc(Instance,
+                                     (PPointer(Instance.ClassType)+Longint(PropInfo^.GetProc)),
+                                     Index,IValue);
+         end;
       end;
       end;
 
 
     procedure SetFloatProp(Instance : TObject;PropInfo : PPropInfo;
     procedure SetFloatProp(Instance : TObject;PropInfo : PPropInfo;
       Value : Extended);
       Value : Extended);
-
-      begin
-         {!!!!!!!!!!!}
+      
+       Var IValue,Index : longint;
+      
+       begin
+         SetIndexValues(PropInfo,Index,Ivalue);
+         case (PropInfo^.PropProcs) and 3 of
+            ptfield:
+              Case GetTypeData(PropInfo^.PropType)^.FloatType of
+               ftSingle: 
+                 PSingle(Pointer(Instance)+Longint(PropInfo^.SetProc))^:=Value;
+               ftDouble:
+                 PDouble(Pointer(Instance)+Longint(PropInfo^.SetProc))^:=Value;
+               ftExtended:
+                 PExtended(Pointer(Instance)+Longint(PropInfo^.SetProc))^:=Value;
+               ftcomp:
+                 PComp(Pointer(Instance)+Longint(PropInfo^.SetProc))^:=Value;
+               { Uncommenting this code results in a internal error!!
+               ftFixed16:
+                 PFixed16(Pointer(Instance)+Longint(PropInfo^.SetProc))^:=Value;
+               ftfixed32:
+                 PFixed32(Pointer(Instance)+Longint(PropInfo^.SetProc))^:=Value;
+               }  
+               end;
+            ptstatic:
+              CallExtendedProc(Instance,PropInfo^.SetProc,Value,Index,IValue);
+            ptvirtual:
+              CallExtendedProc(Instance,
+                               (PPointer(Instance.ClassType)+Longint(PropInfo^.GetProc)),
+                               Value,Index,IValue);
+         end;
       end;
       end;
 
 
     function GetVariantProp(Instance : TObject;PropInfo : PPropInfo): Variant;
     function GetVariantProp(Instance : TObject;PropInfo : PPropInfo): Variant;
@@ -598,7 +734,7 @@ unit typinfo;
     function GetMethodProp(Instance : TObject;PropInfo : PPropInfo) : TMethod;
     function GetMethodProp(Instance : TObject;PropInfo : PPropInfo) : TMethod;
 
 
       begin
       begin
-         {!!!!!!!!!!!}
+        {!!!!!!!!!!!!}
       end;
       end;
 
 
     procedure SetMethodProp(Instance : TObject;PropInfo : PPropInfo;
     procedure SetMethodProp(Instance : TObject;PropInfo : PPropInfo;
@@ -650,7 +786,10 @@ end.
 
 
 {
 {
   $Log$
   $Log$
-  Revision 1.15  1998-11-26 14:57:47  michael
+  Revision 1.16  1998-12-02 12:35:07  michael
+  More changes for type-information
+
+  Revision 1.15  1998/11/26 14:57:47  michael
   + Added packrecords 1
   + Added packrecords 1
 
 
   Revision 1.11  1998/09/24 23:45:28  peter
   Revision 1.11  1998/09/24 23:45:28  peter