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

Delphi имеет этот список: Внутренние процедуры Delphi
Но этот список неполный.

Какие недокументированные внутренние функции существуют, поскольку, когда и какова их цель?

Ответ 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;, однако, поскольку он является встроенным компилятором, функция разрешается в compiletime, а условный код, который оценивает значение false, будет лишен компилятором.

IsConstValue

function IsConstValue(const Value): Boolean;          

Истинно, если значение является константой, false, если нет.
Это помогает компилятору устранить мертвый код, потому что функция оценивается во время компиляции.
Это полезно только в встроенных функциях, где это позволяет использовать более короткий сгенерированный код.

ТипInfo

function TypeInfo(T: typeindentifier): PTypeInfo;

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

ReturnAddress

В конструкции 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); 
Этот вызов будет переведен в GetTastyPoint, а последовательность if/then будет устранена компоновщиком.