123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407 |
- {
- $Id$
- This file is part of the Free Pascal run time library.
- Copyright (c) 1998 by Florian Klaempfl
- member of the Free Pascal development team
- See the file COPYING.FPC, included in this distribution,
- for details about the copyright.
- 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.
- **********************************************************************}
- { This unit provides the same functionality as the TypInfo Unit }
- { of Delphi }
- unit typinfo;
- interface
- {$MODE objfpc}
- {$ifndef AUTOOBJPAS}
- uses
- objpas;
- {$endif}
- // temporary types:
- type
- ShortString=String;
- PByte =^Byte;
- PBoolean =^Boolean;
- {$MINENUMSIZE 1 this saves a lot of memory }
- // if you change one of the following enumeration types
- // you have also to change the compiler in an appropriate way !
- TTypeKind = (tkUnknown,tkInteger,tkChar,tkEnumeration,
- tkFloat,tkSet,tkMethod,tkSString,tkLString,tkAString,
- tkWString,tkVariant,tkArray,tkRecord,tkInterface,
- tkClass,tkObject,tkWChar,tkBool);
- TTOrdType = (otSByte,otUByte,otSWord,otUWord,otSLong,otULong);
- TFloatType = (ftSingle,ftDouble,ftExtended,ftComp,ftCurr,
- ftFixed16,ftFixed32);
- TMethodKind = (mkProcedure,mkFunction,mkSafeProcedure,mkSafeFunction);
- TParamFlags = set of (pfVar,pfConst,pfArray,pfAddress,pfReference,pfOut);
- TIntfFlags = set of (ifHasGuid,ifDispInterface,ifDispatch);
- {$MINENUMSIZE DEFAULT}
- const
- ptField = 0;
- ptStatic = 1;
- ptVirtual = 2;
- ptConst = 3;
- tkString = tkSString;
- type
- TTypeKinds = set of TTypeKind;
- TTypeInfo = record
- Kind : TTypeKind;
- Name : ShortString;
- // here the type data follows as TTypeData record
- end;
- PTypeInfo = ^TTypeInfo;
- PPTypeInfo = ^PTypeInfo;
- PTypeData = ^TTypeData;
- TTypeData = packed record
- case TTypeKind of
- tkUnKnown,tkLString,tkWString,tkAString,tkVariant:
- ();
- tkInteger,tkChar,tkEnumeration,tkWChar:
- (OrdType : TTOrdType;
- case TTypeKind of
- tkInteger,tkChar,tkEnumeration,tkBool,tkWChar : (
- MinValue,MaxValue : Longint;
- case TTypeKind of
- tkEnumeration:
- (
- BaseType : PTypeInfo;
- NameList : ShortString)
- );
- tkSet:
- (CompType : PTypeInfo)
- );
- tkFloat:
- (FloatType : TFloatType);
- tkSString:
- (MaxLength : Byte);
- tkClass:
- (ClassType : TClass;
- ParentInfo : PTypeInfo;
- PropCount : SmallInt;
- UnitName : ShortString
- // here the properties follow as array of TPropInfo
- );
- tkMethod:
- ({!!!!!!!}
- );
- tkInterface:
- ({!!!!!!!}
- );
- end;
- // unsed, just for completeness
- TPropData = packed record
- PropCount : Word;
- PropList : record end;
- end;
- PPropInfo = ^TPropInfo;
- TPropInfo = packed record
- PropType : PTypeInfo;
- GetProc : Pointer;
- SetProc : Pointer;
- StoredProc : Pointer;
- Index : Integer;
- Default : Longint;
- NameIndex : SmallInt;
- // contains the type of the Get/Set/Storedproc, see also ptxxx
- // bit 0..1 GetProc
- // 2..3 SetProc
- // 4..5 StoredProc
- // 6 : true, constant index property
- PropProcs : Byte;
- Name : ShortString;
- end;
- TProcInfoProc = procedure(PropInfo : PPropInfo) of object;
- PPropList = ^TPropList;
- TPropList = array[0..65535] of PPropInfo;
- const
- tkAny = [Low(TTypeKind)..High(TTypeKind)];
- tkMethods = [tkMethod];
- tkProperties = tkAny-tkMethods-[tkUnknown];
- { general property handling }
- // just skips the id and the name
- function GetTypeData(TypeInfo : PTypeInfo) : PTypeData;
- // searches in the property PropName
- function GetPropInfo(TypeInfo : PTypeInfo;const PropName : string) : PPropInfo;
- procedure GetPropInfos(TypeInfo : PTypeInfo;PropList : PPropList);
- function GetPropList(TypeInfo : PTypeInfo;TypeKinds : TTypeKinds;
- PropList : PPropList) : Integer;
- // returns true, if PropInfo is a stored property
- function IsStoredProp(Instance : TObject;PropInfo : PPropInfo) : Boolean;
- { subroutines to read/write properties }
- function GetOrdProp(Instance : TObject;PropInfo : PPropInfo) : Longint;
- procedure SetOrdProp(Instance : TObject;PropInfo : PPropInfo;
- Value : Longint);
- function GetStrProp(Instance : TObject;PropInfo : PPropInfo) : string;
- procedure SetStrProp(Instance : TObject;PropInfo : PPropInfo;
- const Value : string);
- function GetFloatProp(Instance : TObject;PropInfo : PPropInfo) : Extended;
- procedure SetFloatProp(Instance : TObject;PropInfo : PPropInfo;
- Value : Extended);
- function GetVariantProp(Instance : TObject;PropInfo : PPropInfo): Variant;
- procedure SetVariantProp(Instance : TObject;PropInfo : PPropInfo;
- const Value: Variant);
- function GetMethodProp(Instance : TObject;PropInfo : PPropInfo) : TMethod;
- procedure SetMethodProp(Instance : TObject;PropInfo : PPropInfo;
- const Value : TMethod);
- { misc. stuff }
- function GetEnumName(TypeInfo : PTypeInfo;Value : Integer) : string;
- function GetEnumValue(TypeInfo : PTypeInfo;const Name : string) : Integer;
- 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
- GetTypeData:=PTypeData(TypeInfo)+2+PByte(TypeInfo+1)^;
- end;
- function GetPropInfo(TypeInfo : PTypeInfo;const PropName : string) : PPropInfo;
- var
- hp : PTypeData;
- i : longint;
- begin
- Result:=Nil;
- while Assigned(TypeInfo) do
- begin
- // skip the name
- hp:=GetTypeData(Typeinfo);
- // the class info rtti the property rtti follows
- // immediatly
- Result:=PPropInfo(@hp^.UnitName)+byte(hp^.UnitName[0])+1;
- for i:=1 to hp^.PropCount do
- begin
- // found a property of that name ?
- if Result^.Name=PropName then
- exit;
- // skip to next property
- Result:=PPropInfo(@Result^.Name)+byte(Result^.Name[0])+1;
- end;
- // parent class
- Typeinfo:=hp^.ParentInfo;
- end;
- end;
- function IsStoredProp(Instance : TObject;PropInfo : PPropInfo) : Boolean;
- begin
- case (PropInfo^.PropProcs shr 4) and 3 of
- 0:
- IsStoredProp:=PBoolean(Pointer(Instance)+Longint(PropInfo^.StoredProc))^;
- 1:
- IsStoredProp:=CallMethod(Instance,PropInfo^.StoredProc);
- 2:
- IsStoredProp:=CallMethod(Instance,(PPointer(Instance.ClassType)+Longint(PropInfo^.StoredProc)^);
- 3:
- IsStoredProp:=LongBool(PropInfo^.StoredProc);
- end;
- end;
- procedure GetPropInfos(TypeInfo : PTypeInfo;PropList : PPropList);
- begin
- {!!!!!!!!!!!}
- end;
- function GetPropList(TypeInfo : PTypeInfo;TypeKinds : TTypeKinds;
- PropList : PPropList) : Integer;
- begin
- {!!!!!!!!!!!}
- end;
- 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;
- Value : Longint);
- begin
- {!!!!!!!!!!!}
- end;
- function GetStrProp(Instance : TObject;PropInfo : PPropInfo) : string;
- begin
- {!!!!!!!!!!!}
- end;
- procedure SetStrProp(Instance : TObject;PropInfo : PPropInfo;
- const Value : string);
- begin
- {!!!!!!!!!!!}
- end;
- function GetFloatProp(Instance : TObject;PropInfo : PPropInfo) : Extended;
- begin
- {!!!!!!!!!!!}
- end;
- procedure SetFloatProp(Instance : TObject;PropInfo : PPropInfo;
- Value : Extended);
- begin
- {!!!!!!!!!!!}
- end;
- function GetVariantProp(Instance : TObject;PropInfo : PPropInfo): Variant;
- begin
- {!!!!!!!!!!!}
- end;
- procedure SetVariantProp(Instance : TObject;PropInfo : PPropInfo;
- const Value: Variant);
- begin
- {!!!!!!!!!!!}
- end;
- function GetMethodProp(Instance : TObject;PropInfo : PPropInfo) : TMethod;
- begin
- {!!!!!!!!!!!}
- end;
- procedure SetMethodProp(Instance : TObject;PropInfo : PPropInfo;
- const Value : TMethod);
- begin
- {!!!!!!!!!!!}
- end;
- function GetEnumName(TypeInfo : PTypeInfo;Value : Integer) : string;
- begin
- {!!!!!!!!!!!}
- end;
- function GetEnumValue(TypeInfo : PTypeInfo;const Name : string) : Integer;
- begin
- {!!!!!!!!!!!}
- end;
- end.
- {
- $Log$
- Revision 1.11 1998-09-24 23:45:28 peter
- * updated for auto objpas loading
- Revision 1.10 1998/09/20 08:25:34 florian
- + description of tpropinfo.propprocs bit 6 added
- 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
- * small problems fixed
- Revision 1.6 1998/09/08 00:08:36 michael
- Made it compilable
- Revision 1.5 1998/09/07 23:11:43 florian
- + more fields to TTypeInfo added
- Revision 1.4 1998/09/07 19:34:47 florian
- * constant value is now supported as stored condition
- Revision 1.3 1998/09/07 08:32:59 florian
- + procedure IsStoredProc added
- Revision 1.2 1998/09/06 21:27:05 florian
- + some methods and declarations added
- Revision 1.1 1998/08/25 22:30:00 florian
- + initial revision:
- o constants
- o basic type data record
- }
|