Недокументирани вътрешни рутинни процедури

Delphi има този списък: Delphi Intrinsic Routines
Но този списък е непълен .

Кои са 7-те недокументирани вътрешни функции, откога и каква е тяхната цел?


person Johan    schedule 23.05.2015    source източник
comment
Не е твърде широко, има само 7 недокументирани присъщи характеристики.   -  person Johan    schedule 28.03.2019
comment
тъй като вече отговорихте на това... ще натисна skip и ще оставя това на някой с повече представа за Delphi да реши.   -  person Martin Zeitler    schedule 28.03.2019


Отговори (1)


Знам за следните недокументирани вътрешни функции.

Delphi 2007: тук и Блогът на Hallvard:

По подразбиране

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

Връща нулевото представяне на идентификатора на типа T.

Следните вътрешни характеристики, въведени в XE7, са обяснени в блога за бета версия на XE7 и от Стефан Глиенке

IsManagedType

function IsManagedType(T: TypeIdentifier): Boolean;   

Вярно, ако T е interface, string или dynamic array, или запис, съдържащ такъв. Клас, съдържащ управляван тип, ще върне false.

В XE6 и по-стари трябва да използвате System.Rtti.IsManaged(TypeInfo(T)).

HasWeakRef

function HasWeakRef(T: TypeIdentifier): Boolean;    

Вярно, ако T е анотирано като [weak]. Компилаторът поддържа списък от [weak] препратки. Не можете да използвате move и други трикове с тези типове, защото това ще попречи на слабия списък да се актуализира.

В XE6 и по-стари трябва да използвате System.TypInfo.HasWeakRef(TypeInfo(T)).

GetTypeKind

function GetTypeKind(T: TypeIdentifier): TTypeKind;   

Прави същото нещо като PTypeInfo(System.TypeInfo(T))^.Kind;, но тъй като е вътрешен компилатор, функцията се разрешава по време на компилиране и условният код, който оценява като false, ще бъде премахнат от компилатора.

IsConstValue

function IsConstValue(const Value): Boolean;          

True, ако стойността е константа, false, ако не е.
Това помага на компилатора да елиминира мъртъв код, тъй като функцията се оценява по време на компилиране.
Това е полезно само във вградени функции, където позволява по-кратък генериран код.

Информация за тип

function TypeInfo(T: typeindentifier): PTypeInfo;

Тази функция не е недокументирана като такава, но това, което е недокументирано е, че тя е присъща функция след XE7.
Това означава, че фрагментът if TypeInfo(T) = TypeInfo(byte) then ... не генерира никакъв код, ако T не е байт и тестът ще бъде разрешен по време на компилация.
Резолюцията по време на компилация обаче работи само в рамките на общи рутинни процедури и само когато се прави if (TypeInfo(T) = TypeInfo(sometype) тест.
Тестът if TypeInfo(byte) = TypeInfo(smallint) then не се елиминира, въпреки че винаги се оценява като false.
Нито друга употреба на TypeInfo(T).

Адрес за връщане

Следните се използват с конструкцията raise exception at returnaddress.

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

И доколкото знам, не можете да ги извикате директно от потребителския код.

Пример за 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); 
This call will get translated to GetTastyPoint and the if/then sequence will be eliminated by the linker.

person Johan    schedule 23.05.2015