Browse Source

* procedure GetOrdProp added

florian 27 years ago
parent
commit
e6f7c229d0
1 changed files with 50 additions and 29 deletions
  1. 50 29
      rtl/objpas/typinfo.pp

+ 50 - 29
rtl/objpas/typinfo.pp

@@ -82,7 +82,7 @@ unit typinfo;
                     MinValue,MaxValue : Longint;
                     case TTypeKind of
                       tkEnumeration:
-                        ( 
+                        (
                         BaseType : PTypeInfo;
                         NameList : ShortString)
                     );
@@ -183,6 +183,26 @@ unit typinfo;
 
   implementation
 
+{$ASMMODE INTEL}
+
+    function CallMethod_Integer(s : Pointer;Address : Pointer) : Integer;assembler;
+
+      asm
+         mov ESI,s
+         mov EDI,Address
+         call [EDI]
+         // now the result should be in EAX, untested yet (FK)
+      end;
+
+    function CallMethod_Boolean(s : Pointer;Address : Pointer) : Boolean;assembler;
+
+      asm
+         mov ESI,s
+         mov EDI,Address
+         call [EDI]
+         // now the result should be in EAX, untested yet (FK)
+      end;
+
     function GetTypeData(TypeInfo : PTypeInfo) : PTypeData;
 
       begin
@@ -194,7 +214,7 @@ unit typinfo;
       var
          hp : PTypeData;
          i : longint;
-                  
+
       begin
          Result:=Nil;
          while Assigned(TypeInfo) do
@@ -221,36 +241,16 @@ unit typinfo;
 
     function IsStoredProp(Instance : TObject;PropInfo : PPropInfo) : Boolean;
 
-      type
-         tbfunction = function : boolean of object;
-
-      var
-         caller : packed record
-            Instance : Pointer;
-            Address : Pointer;
-         end;
-
       begin
-         caller.Instance:=Instance;
          case (PropInfo^.PropProcs shr 4) and 3 of
             0:
-              IsStoredProp:=
-                PBoolean(Pointer(Instance)+Longint(PropInfo^.StoredProc))^;
+              IsStoredProp:=PBoolean(Pointer(Instance)+Longint(PropInfo^.StoredProc))^;
             1:
-              begin
-                 caller.Address:=PropInfo^.StoredProc;
-              //   IsStoredProp:=tbfunction(caller);
-              end;
+              IsStoredProp:=CallMethod(Instance,PropInfo^.StoredProc);
             2:
-              begin
-                 caller.Address:=PPointer(PPointer(Instance.ClassType)+Longint(PropInfo^.StoredProc))^;
-               //  IsStoredProp:=tbfunction(caller);
-              end;
-            4:
-              begin
-              IsStoredProp:=
-                LongBool(PropInfo^.StoredProc);
-              end;
+              IsStoredProp:=CallMethod(Instance,(PPointer(Instance.ClassType)+Longint(PropInfo^.StoredProc)^);
+            3:
+              IsStoredProp:=LongBool(PropInfo^.StoredProc);
          end;
       end;
 
@@ -269,8 +269,26 @@ unit typinfo;
 
     function GetOrdProp(Instance : TObject;PropInfo : PPropInfo) : Longint;
 
+      var
+         value : longint;
+
       begin
-         {!!!!!!!!!!!}
+         case (PropInfo^.PropProcs) and 3 of
+            0:
+              Value:=PLongint(Pointer(Instance)+Longint(PropInfo^.GetProc))^;
+            1:
+              Value:=CallMethod(Instance,PropInfo^.GetProc);
+            2:
+              Value:=CallMethod(Instance,(PPointer(Instance.ClassType)+Longint(PropInfo^.GetProc)^);
+         end;
+         { cut off unnecessary stuff }
+         case GetTypeData(PropInfo^.PropType)^.OrdType of
+            otSWord,otUWord:
+              Value:=Value and $ffff;
+            otSByte,otUByte:
+              Value:=Value and $ff;
+         end;
+         GetOrdProp:=Value;
       end;
 
     procedure SetOrdProp(Instance : TObject;PropInfo : PPropInfo;
@@ -348,7 +366,10 @@ end.
 
 {
   $Log$
-  Revision 1.8  1998-09-19 08:33:53  florian
+  Revision 1.9  1998-09-19 15:25:45  florian
+    * procedure GetOrdProp added
+
+  Revision 1.8  1998/09/19 08:33:53  florian
     + some procedures added
 
   Revision 1.7  1998/09/08 09:52:31  florian