mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-14 13:39:24 +02:00
JitClass: Add configurabel JitProperty class. Add FindPropertyRecursive.
This commit is contained in:
parent
c177cb8a54
commit
79d6afe4b6
@ -151,6 +151,8 @@ type
|
|||||||
property InstanceDataPointer[AnInstance: TObject]: Pointer read GetInstanceDataPointer;
|
property InstanceDataPointer[AnInstance: TObject]: Pointer read GetInstanceDataPointer;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
TJitPropertyClass = class of TJitProperty;
|
||||||
|
|
||||||
{ TJitPropertyList }
|
{ TJitPropertyList }
|
||||||
|
|
||||||
TJitPropertyList = class(TCollection)
|
TJitPropertyList = class(TCollection)
|
||||||
@ -175,7 +177,8 @@ type
|
|||||||
procedure Update(Item: TCollectionItem); override;
|
procedure Update(Item: TCollectionItem); override;
|
||||||
property TypeLibrary: TJitTypeLibrary read FTypeLibrary;
|
property TypeLibrary: TJitTypeLibrary read FTypeLibrary;
|
||||||
public
|
public
|
||||||
constructor Create(AOwner: TJitClassCreator); reintroduce;
|
constructor Create(AOwner: TJitClassCreator); reintroduce; overload;
|
||||||
|
constructor Create(AItemClass: TJitPropertyClass; AOwner: TJitClassCreator); reintroduce; overload;
|
||||||
function Add(AName, ADeclaration: String;
|
function Add(AName, ADeclaration: String;
|
||||||
AWriteAble: Boolean = True; ADefault: LongInt = 0; ANoDefault: Boolean = False; AStored: Boolean = True): TJitProperty; reintroduce;
|
AWriteAble: Boolean = True; ADefault: LongInt = 0; ANoDefault: Boolean = False; AStored: Boolean = True): TJitProperty; reintroduce;
|
||||||
procedure Remove(AName: String);
|
procedure Remove(AName: String);
|
||||||
@ -254,6 +257,7 @@ type
|
|||||||
FUserInfoMemSize: Integer;
|
FUserInfoMemSize: Integer;
|
||||||
FRttiWriterClass: TJitRttiWriterTkClass;
|
FRttiWriterClass: TJitRttiWriterTkClass;
|
||||||
|
|
||||||
|
function GetAncestorJitClass: TJitClassCreator;
|
||||||
function RefCountedJitPvmt: TRefCountedJitClassReference;
|
function RefCountedJitPvmt: TRefCountedJitClassReference;
|
||||||
procedure AllocateJitPVmt(ASize: Integer);
|
procedure AllocateJitPVmt(ASize: Integer);
|
||||||
procedure DeAllocateJitPVmt;
|
procedure DeAllocateJitPVmt;
|
||||||
@ -263,6 +267,7 @@ type
|
|||||||
procedure SetClassName(AValue: String);
|
procedure SetClassName(AValue: String);
|
||||||
procedure SetClassUnit(AValue: String);
|
procedure SetClassUnit(AValue: String);
|
||||||
procedure SetTypeLibrary(AValue: TJitTypeLibrary);
|
procedure SetTypeLibrary(AValue: TJitTypeLibrary);
|
||||||
|
procedure ResolveAnchestor;
|
||||||
procedure RaiseUnless(ACond: Boolean; const AMsg: string);
|
procedure RaiseUnless(ACond: Boolean; const AMsg: string);
|
||||||
function dbgsFlag(AFlags: TJitClassCreatorFlags): String;
|
function dbgsFlag(AFlags: TJitClassCreatorFlags): String;
|
||||||
protected
|
protected
|
||||||
@ -282,7 +287,9 @@ type
|
|||||||
procedure CreateJitProps;
|
procedure CreateJitProps;
|
||||||
procedure CreateJitPropsPrepare;
|
procedure CreateJitPropsPrepare;
|
||||||
procedure CreateJitPropsFinish;
|
procedure CreateJitPropsFinish;
|
||||||
|
|
||||||
procedure Init; virtual;
|
procedure Init; virtual;
|
||||||
|
function CreateJitPropertyList: TJitPropertyList; virtual;
|
||||||
public
|
public
|
||||||
constructor Create(AnAncestorClass: TClass; AClassName: String; AClassUnit: String; ATypeLibrary: TJitTypeLibrary = nil);
|
constructor Create(AnAncestorClass: TClass; AClassName: String; AClassUnit: String; ATypeLibrary: TJitTypeLibrary = nil);
|
||||||
constructor Create(AnAncestorClassName, AClassName: String; AClassUnit: String; ATypeLibrary: TJitTypeLibrary = nil);
|
constructor Create(AnAncestorClassName, AClassName: String; AClassUnit: String; ATypeLibrary: TJitTypeLibrary = nil);
|
||||||
@ -319,8 +326,10 @@ type
|
|||||||
property JitMethods: TJitMethodList read FJitMethods;
|
property JitMethods: TJitMethodList read FJitMethods;
|
||||||
property JitProperties: TJitPropertyList read FJitProperties;
|
property JitProperties: TJitPropertyList read FJitProperties;
|
||||||
|
|
||||||
|
function FindPropertyRecursive(AName: String): TJitProperty;
|
||||||
|
|
||||||
property JitClass: TClass read GetJitClass;
|
property JitClass: TClass read GetJitClass;
|
||||||
property AncestorJitClass: TJitClassCreator read FAncestorJitClass; experimental;
|
property AncestorJitClass: TJitClassCreator read GetAncestorJitClass; experimental;
|
||||||
|
|
||||||
property UserInfoMemSize: Integer read FUserInfoMemSize write FUserInfoMemSize; // User must call procedure UpdateJitClass for it to take effect
|
property UserInfoMemSize: Integer read FUserInfoMemSize write FUserInfoMemSize; // User must call procedure UpdateJitClass for it to take effect
|
||||||
end;
|
end;
|
||||||
@ -815,15 +824,21 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
constructor TJitPropertyList.Create(AOwner: TJitClassCreator);
|
constructor TJitPropertyList.Create(AOwner: TJitClassCreator);
|
||||||
|
begin
|
||||||
|
Create(TJitProperty, AOwner);
|
||||||
|
end;
|
||||||
|
|
||||||
|
constructor TJitPropertyList.Create(AItemClass: TJitPropertyClass;
|
||||||
|
AOwner: TJitClassCreator);
|
||||||
begin
|
begin
|
||||||
FOwner := AOwner;
|
FOwner := AOwner;
|
||||||
inherited Create(TJitProperty);
|
inherited Create(AItemClass);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TJitPropertyList.Add(AName, ADeclaration: String; AWriteAble: Boolean;
|
function TJitPropertyList.Add(AName, ADeclaration: String; AWriteAble: Boolean;
|
||||||
ADefault: LongInt; ANoDefault: Boolean; AStored: Boolean): TJitProperty;
|
ADefault: LongInt; ANoDefault: Boolean; AStored: Boolean): TJitProperty;
|
||||||
begin
|
begin
|
||||||
Result := TJitProperty.Create(Self, AName, ADeclaration, AWriteAble,
|
Result := TJitPropertyClass(ItemClass).Create(Self, AName, ADeclaration, AWriteAble,
|
||||||
ADefault, ANoDefault, AStored);
|
ADefault, ANoDefault, AStored);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -960,7 +975,7 @@ begin
|
|||||||
// todo: skip deprecated and the lot
|
// todo: skip deprecated and the lot
|
||||||
|
|
||||||
if InPublished then begin
|
if InPublished then begin
|
||||||
TheProp := TJitProperty.Create(Self, NewName, NewPropJitType, NewWritable, 0, NewNoDefault);
|
TheProp := TJitPropertyClass(ItemClass).Create(Self, NewName, NewPropJitType, NewWritable, 0, NewNoDefault);
|
||||||
TheProp.SetDefaultFromIdent(NewDefault);
|
TheProp.SetDefaultFromIdent(NewDefault);
|
||||||
TheProp.SetIsStored(NewIsStored);
|
TheProp.SetIsStored(NewIsStored);
|
||||||
end
|
end
|
||||||
@ -1004,6 +1019,13 @@ begin
|
|||||||
Result := FRefCountedJitPVmt;
|
Result := FRefCountedJitPVmt;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TJitClassCreator.GetAncestorJitClass: TJitClassCreator;
|
||||||
|
begin
|
||||||
|
if FAncestorJitClass = nil then
|
||||||
|
ResolveAnchestor;
|
||||||
|
Result := FAncestorJitClass;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TJitClassCreator.AllocateJitPVmt(ASize: Integer);
|
procedure TJitClassCreator.AllocateJitPVmt(ASize: Integer);
|
||||||
begin
|
begin
|
||||||
DeAllocateJitPVmt;
|
DeAllocateJitPVmt;
|
||||||
@ -1074,6 +1096,27 @@ begin
|
|||||||
FTypeLibrary.AddFreeNotification(@DoTypeLibFreed);
|
FTypeLibrary.AddFreeNotification(@DoTypeLibFreed);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TJitClassCreator.ResolveAnchestor;
|
||||||
|
var
|
||||||
|
at: TJitType;
|
||||||
|
begin
|
||||||
|
if (FAncestorClass = nil) and (FAncestorJitClass = nil) then begin
|
||||||
|
if (FAncestorJitType = nil) and (FAncestorClassName <> '') and (FTypeLibrary <> nil) then begin
|
||||||
|
at := FTypeLibrary.FindType(FAncestorClassName, FClassUnit);
|
||||||
|
if not (at is TJitTypeClassBase) then
|
||||||
|
raise Exception.Create('Incorrect type for anchestor');
|
||||||
|
FAncestorJitType := TJitTypeJitClass(at);
|
||||||
|
end;
|
||||||
|
|
||||||
|
if FAncestorJitType <> nil then begin
|
||||||
|
if (FAncestorJitType is TJitTypeJitClass) then
|
||||||
|
FAncestorJitClass := TJitClassCreator(TJitTypeJitClass(FAncestorJitType).JitClassCreator)
|
||||||
|
else
|
||||||
|
FAncestorClass := FAncestorJitType.JitClass;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TJitClassCreator.RaiseUnless(ACond: Boolean; const AMsg: string);
|
procedure TJitClassCreator.RaiseUnless(ACond: Boolean; const AMsg: string);
|
||||||
begin
|
begin
|
||||||
if not ACond then
|
if not ACond then
|
||||||
@ -1203,23 +1246,8 @@ end;
|
|||||||
procedure TJitClassCreator.CreateJitClass;
|
procedure TJitClassCreator.CreateJitClass;
|
||||||
var
|
var
|
||||||
HasJitAnchestor: Boolean;
|
HasJitAnchestor: Boolean;
|
||||||
at: TJitType;
|
|
||||||
begin
|
begin
|
||||||
if (FAncestorClass = nil) and (FAncestorJitClass = nil) then begin
|
ResolveAnchestor;
|
||||||
if (FAncestorJitType = nil) and (FAncestorClassName <> '') and (FTypeLibrary <> nil) then begin
|
|
||||||
at := FTypeLibrary.FindType(FAncestorClassName, FClassUnit);
|
|
||||||
if not (at is TJitTypeClassBase) then
|
|
||||||
raise Exception.Create('Incorrect type for anchestor');
|
|
||||||
FAncestorJitType := TJitTypeJitClass(at);
|
|
||||||
end;
|
|
||||||
|
|
||||||
if FAncestorJitType <> nil then begin
|
|
||||||
if (FAncestorJitType is TJitTypeJitClass) then
|
|
||||||
FAncestorJitClass := TJitClassCreator(TJitTypeJitClass(FAncestorJitType).JitClassCreator)
|
|
||||||
else
|
|
||||||
FAncestorClass := FAncestorJitType.JitClass;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
CreateJitClassPreCheck;
|
CreateJitClassPreCheck;
|
||||||
FFlags := FFlags - [ccfModifiedMethods, ccfModifiedProps, ccfModifiedClassName];
|
FFlags := FFlags - [ccfModifiedMethods, ccfModifiedProps, ccfModifiedClassName];
|
||||||
|
|
||||||
@ -1552,6 +1580,11 @@ begin
|
|||||||
//
|
//
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TJitClassCreator.CreateJitPropertyList: TJitPropertyList;
|
||||||
|
begin
|
||||||
|
Result := TJitPropertyList.Create(Self);
|
||||||
|
end;
|
||||||
|
|
||||||
function TJitClassCreator.GetTypeInfo: PTypeInfo;
|
function TJitClassCreator.GetTypeInfo: PTypeInfo;
|
||||||
begin
|
begin
|
||||||
GetJitClass;
|
GetJitClass;
|
||||||
@ -1563,7 +1596,7 @@ constructor TJitClassCreator.Create(AnAncestorClass: TClass;
|
|||||||
begin
|
begin
|
||||||
FJitPVmtMem.ClearMemPointer;
|
FJitPVmtMem.ClearMemPointer;
|
||||||
FJitMethods := TJitMethodList.Create(Self);
|
FJitMethods := TJitMethodList.Create(Self);
|
||||||
FJitProperties := TJitPropertyList.Create(Self);
|
FJitProperties := CreateJitPropertyList;
|
||||||
|
|
||||||
inherited Create;
|
inherited Create;
|
||||||
|
|
||||||
@ -1638,5 +1671,18 @@ begin
|
|||||||
DeAllocateJitPVmt;
|
DeAllocateJitPVmt;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
function TJitClassCreator.FindPropertyRecursive(AName: String): TJitProperty;
|
||||||
|
var
|
||||||
|
Creator: TJitClassCreator;
|
||||||
|
begin
|
||||||
|
Creator := Self;
|
||||||
|
while Creator <> nil do begin
|
||||||
|
Result := Creator.JitProperties.Prop[AName];
|
||||||
|
if Result <> nil then
|
||||||
|
exit;
|
||||||
|
Creator := Creator.AncestorJitClass;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user