2015-05-23 9 views

risposta

17

Conosco le seguenti funzioni intrinseche non documentate.

Delphi 2007: here e Hallvard's blog:

predefinito

function Default(T: Typeidentifier): value of T;  

Restituisce la rappresentazione di zero di tipo identificativo T.

I seguenti intrinseci introdotte in XE7 sono spiegate in the XE7 beta blog e Stefan Glienke

IsManagedType

function IsManagedType(T: TypeIdentifier): Boolean; 

Vero se T è un interface, string o dynamic array, o un record contenente tale. Una classe contenente un tipo gestito restituirà false.

In XE6 e versioni precedenti è necessario utilizzare System.Rtti.IsManaged(TypeInfo(T)).

HasWeakRef

function HasWeakRef(T: TypeIdentifier): Boolean;  

True se T è stata annotata come [weak]. Il compilatore mantiene un elenco di riferimenti [weak]. Non è possibile utilizzare move e altri trucchi con questi tipi, poiché ciò impedirà l'aggiornamento dell'elenco debole.

In XE6 e versioni precedenti è necessario utilizzare System.TypInfo.HasWeakRef(TypeInfo(T)).

GetTypeKind

function GetTypeKind(T: TypeIdentifier): TTypeKind; 

fa la stessa cosa come PTypeInfo(System.TypeInfo(T))^.Kind;, ma perché è un compilatore intrinseco della funzione viene risolto a compiletime e il codice condizionale che restituisce false sarà spogliato dal compilatore.

IsConstValue

function IsConstValue(const Value): Boolean;   

vero se il valore è una costante, false in caso contrario.
Questo aiuta il compilatore ad eliminare il codice morto perché la funzione viene valutata in fase di compilazione.
Questo è utile solo nelle funzioni inline, dove consente di codice generato più breve.

TypeInfo

function TypeInfo(T: typeindentifier): PTypeInfo; 

Questa funzione non è documentato in quanto tale, ma ciò è irregolare è che si tratta di una funzione intrinseca dal XE7.
Ciò significa che lo snippet if TypeInfo(T) = TypeInfo(byte) then ... non genera alcun codice se T non è un byte e il test verrà risolto in compiletime.
Tuttavia la risoluzione in fase di compilazione funziona solo all'interno di routine generiche e solo quando si esegue un test if (TypeInfo(T) = TypeInfo(sometype).
Il test if TypeInfo(byte) = TypeInfo(smallint) then non viene eliminato anche se viene sempre valutato come falso.
Né fa altro uso di TypeInfo(T).

ReturnAddress

I seguenti sono usati con il costrutto raise exception at returnaddress.

function ReturnAddress(Expression): pointer;   //Delphi ? 
function AddressOfReturnAddress(Expression): pointer; //Delphi ? 

E per quanto ne so non è possibile chiamarli direttamente dal codice utente.

Esempio di IsConstValue

type 
    TFlavor = (Tasty, Nasty); 
    TIntegerHelper = record helper for integer 
    function GetSomething(Flavor: TFlavor): TPoint; inline; 
    private 
    function GetTastyPoint: TPoint; 
    function GetNastyPoint: TPoint; 
    end; 
    
function TIntegerHelper.GetSomething(Flavor: TFlavor): TPoint; 
begin 
    if IsConstValue(Flavor) then begin 
    if Flavor = Tasty then Result:= Self.GetTastyPoint 
    else Result:= Self.GetNastyPoint; 
    end else begin 
    Assert(1=0, 'This function can only be called with constant parameters'); 
    end; 
end; 

procedure Test; 
var 
    pt: TPoint; 
begin 
    pt:= 100000.GetSomething(Tasty);
Questa chiamata sarà ottenere tradotto in GetTastyPoint e la sequenza if/then sarà eliminato dal linker.

Problemi correlati