Nieudokumentowane procedury wewnętrzne [zamknięte]

Delphi ma taką listę: procedury wewnętrzne Delphi
Ale ta lista jest niekompletna.

Które nieudokumentowane funkcje wewnętrzne istnieją, od kiedy i jaki jest ich cel?

Author: Johan, 2015-05-23

1 answers

Znam następujące nieudokumentowane funkcje wewnętrzne.

Delphi 2007: tutaj i Hallvard ' s blog :

Default

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

Zwraca zerową reprezentację identyfikatora typu T.

W XE7 XE7 XE7 XE7 XE7 XE7 XE7 XE7 XE7 XE7 XE7 XE7 XE7 XE7 XE7 XE7 XE7 XE7 XE7 XE7 XE7 XE7 XE7 XE7 XE7 XE7 XE7 XE7 XE7 XE7 XE7 XE7 XE7 XE7 XE7 XE7 XE7 XE7 XE7]}

IsManagedType

function IsManagedType(T: TypeIdentifier): Boolean;   

True if T is a interface, string lub dynamic array, lub zapis zawierający takie Klasa zawierająca Typ zarządzany zwróci false.

W XE6 i starszych musisz użyć System.Rtti.IsManaged(TypeInfo(T)).

HasWeakRef

function HasWeakRef(T: TypeIdentifier): Boolean;    

True, Jeśli T zostało oznaczone jako [weak]. Kompilator przechowuje listę referencji [weak]. Nie możesz używać move i innych sztuczek z tymi typami, ponieważ uniemożliwi to aktualizację słabej listy.

W XE6 i starszych musisz użyć System.TypInfo.HasWeakRef(TypeInfo(T)).

GetTypeKind

function GetTypeKind(T: TypeIdentifier): TTypeKind;   

Robi to samo co PTypeInfo(System.TypeInfo(T))^.Kind;, jednak ponieważ jest to kompilator wewnętrzny, funkcja jest rozwiązywana w compiletime, a kod warunkowy, który zostanie oceniony na false, zostanie usunięty przez kompilator.

IsConstValue

function IsConstValue(const Value): Boolean;          

True jeśli wartość jest stała, false jeśli nie.
Pomaga to kompilatorowi wyeliminować martwy Kod, ponieważ funkcja jest oceniana w czasie kompilacji.
To jest przydatne tylko w funkcjach inline, gdzie pozwala na krótszy generowany kod.

TypeInfo

function TypeInfo(T: typeindentifier): PTypeInfo;

Ta funkcja nie jest nieudokumentowana jako taka, ale to, co jest nieudokumentowane, to to, że jest wewnętrzną funkcją od XE7.
Oznacza to, że urywek if TypeInfo(T) = TypeInfo(byte) then ... Nie generuje żadnego kodu, jeśli T nie jest bajtem, a test zostanie rozwiązany w czasie kompilacji.
Jednak rozdzielczość w czasie kompilacji działa tylko wewnątrz ogólnych procedur i tylko podczas wykonywania if (TypeInfo(T) = TypeInfo(sometype) test.
Test if TypeInfo(byte) = TypeInfo(smallint) then nie zostaje wyeliminowany, mimo że zawsze ocenia się go na false.
Podobnie jak inne użycie TypeInfo(T).

ReturnAddress

Poniższe są używane z raise exception at returnaddress konstrukcją.

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

I z tego co wiem, nie można do nich dzwonić bezpośrednio z kodu użytkownika.

Przykład 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); 
Wywołanie to zostanie przetłumaczone na GetTastyPoint, a Sekwencja if/then zostanie wyeliminowana przez linker.
 20
Author: Johan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-04 11:31:16