Есть определённые мысли.
Пока изучаю:
Жаль не работает вот это:
Интересно - почему написано так:
А не так:
vmtNewInstance
Пока изучаю:
TPrivateHeap
CodeHeap
function CodeHeap: TPrivateHeap;
var
Temp: TPrivateHeap;
begin
if FCodeHeap = nil then
begin
Temp := TPrivateHeap.Create;
if AtomicCmpExchange(Pointer(FCodeHeap), Pointer(Temp), nil) = nil then
// - интересный метод создания потокозащищённого синглетона. Если я правильно понял
Pointer(Temp) := nil // For ARC-based platforms this will ensure the local var doesn't affect the refcount
// - интересный "хак"
else
Temp.Free;
end;
Result := FCodeHeap;
end;
TMethodImplementation
TRttiMethod
Жаль не работает вот это:
type Tl3ObjectSpy<T: TObject> = class(T) end;//Tl3ObjectSpy
Интересно - почему написано так:
ObjectAppearance := TCommonObjectAppearance(AppearanceClass.NewInstance); ObjectAppearance.Create;
А не так:
type RCommonObjectAppearance = clas of TCommonObjectAppearance; ObjectAppearance := RCommonObjectAppearance(AppearanceClass).Create;
{$IFDEF FireDAC_DEBUG}
class function TFDDatSRow.NewInstance: TObject {$IFDEF AUTOREFCOUNT} unsafe {$ENDIF};
begin
Result := inherited NewInstance;
Inc(GRowsAlive);
end;
{-------------------------------------------------------------------------------}
procedure TFDDatSRow.FreeInstance;
begin
inherited FreeInstance;
Dec(GRowsAlive);
end;
{$ENDIF}
vmtNewInstance
unit l3ObjectsSpy; interface procedure Test; implementation uses System.Classes ; type PMem = PAnsiChar; function NewInstancePtr(aClass: TClass): PPointer; begin Result := PPointer(PMem(aClass) + vmtNewInstance); end; function FreeInstancePtr(aClass: TClass): PPointer; begin Result := PPointer(PMem(aClass) + vmtFreeInstance); end; procedure TestClass(aClass: TClass); begin WriteLn(NativeInt(NewInstancePtr(aClass)^)); WriteLn(NativeInt(FreeInstancePtr(aClass)^)); end; procedure Test; begin TestClass(TObject); TestClass(TStream); WriteLn(vmtNewInstance); end; end.
Комментариев нет:
Отправить комментарий