Type registration : complex objects serialization's helpers are now fully created at registration time.
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@808 8e941d3f-bd1b-0410-a28a-d453659cc2b4
This commit is contained in:
parent
1ce28d56b6
commit
4d76fe4edd
@ -1489,6 +1489,8 @@ type
|
||||
FInternalNames : TStrings;
|
||||
private
|
||||
procedure CreateInternalObjects();{$IFDEF USE_INLINE}inline;{$ENDIF}
|
||||
protected
|
||||
procedure Init(); virtual;
|
||||
public
|
||||
constructor Create(
|
||||
AOwner : TTypeRegistry;
|
||||
@ -2959,6 +2961,11 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TTypeRegistryItem.Init();
|
||||
begin
|
||||
|
||||
end;
|
||||
|
||||
constructor TTypeRegistryItem.Create(
|
||||
AOwner : TTypeRegistry;
|
||||
ANameSpace : String;
|
||||
@ -3203,6 +3210,7 @@ begin
|
||||
if ( i = -1 ) then begin
|
||||
Result := GetItemClassFor(ADataType).Create(Self,ANameSpace,ADataType,ADeclaredName);
|
||||
Add(Result);
|
||||
Result.Init();
|
||||
{$IFDEF TRemotableTypeInitializer_Initialize}
|
||||
InitializeItem(Result);
|
||||
{$ENDIF TRemotableTypeInitializer_Initialize}
|
||||
|
@ -283,10 +283,10 @@ end;
|
||||
|
||||
procedure initialize_config_objects();
|
||||
begin
|
||||
TwstConfigService.RegisterAttributeProperty('Name');
|
||||
GetTypeRegistry().Register(sWST_BASE_NS,TypeInfo(TwstConfigService),'Service');
|
||||
GetTypeRegistry().Register(sWST_BASE_NS,TypeInfo(TwstConfigServiceArray),'Services');
|
||||
GetTypeRegistry().Register(sWST_BASE_NS,TypeInfo(TWstConfigurationObject),'WST_Configuration');
|
||||
TwstConfigService.RegisterAttributeProperty('Name');
|
||||
GetTypeRegistry().ItemByTypeInfo[TypeInfo(TwstConfigServiceArray)].RegisterExternalPropertyName('Item','service');
|
||||
end;
|
||||
|
||||
|
@ -100,20 +100,10 @@ type
|
||||
|
||||
TBaseComplexTypeRegistryItem = class(TTypeRegistryItem)
|
||||
private
|
||||
FGetterLock : TCriticalSection;
|
||||
FSerializer : TObjectSerializer;
|
||||
FGetFunction : TGetSerializerFunction;
|
||||
FFuncIsNotReady : Boolean;
|
||||
private
|
||||
function FirstGetter() : TObjectSerializer;
|
||||
function StaticGetter() : TObjectSerializer;
|
||||
protected
|
||||
procedure Init(); override;
|
||||
public
|
||||
constructor Create(
|
||||
AOwner : TTypeRegistry;
|
||||
ANameSpace : string;
|
||||
ADataType : PTypeInfo;
|
||||
Const ADeclaredName : string = ''
|
||||
);override;
|
||||
destructor Destroy();override;
|
||||
function GetSerializer() : TObjectSerializer;{$IFDEF USE_INLINE}inline;{$ENDIF}
|
||||
end;
|
||||
@ -1354,52 +1344,21 @@ end;
|
||||
|
||||
{ TBaseComplexTypeRegistryItem }
|
||||
|
||||
function TBaseComplexTypeRegistryItem.FirstGetter() : TObjectSerializer;
|
||||
procedure TBaseComplexTypeRegistryItem.Init();
|
||||
begin
|
||||
FGetterLock.Acquire();
|
||||
try
|
||||
if ( FSerializer = nil ) then begin
|
||||
FSerializer := TObjectSerializer.Create(TBaseComplexRemotableClass(GetTypeData(DataType)^.ClassType),Owner);
|
||||
FFuncIsNotReady := True;
|
||||
FGetFunction := {$IFDEF FPC}@{$ENDIF}StaticGetter;
|
||||
FFuncIsNotReady := False;
|
||||
end;
|
||||
finally
|
||||
FGetterLock.Release();
|
||||
end;
|
||||
Result := FSerializer;
|
||||
end;
|
||||
|
||||
function TBaseComplexTypeRegistryItem.StaticGetter() : TObjectSerializer;
|
||||
begin
|
||||
Result := FSerializer;
|
||||
end;
|
||||
|
||||
constructor TBaseComplexTypeRegistryItem.Create(
|
||||
AOwner : TTypeRegistry;
|
||||
ANameSpace : string;
|
||||
ADataType : PTypeInfo;
|
||||
const ADeclaredName : string
|
||||
);
|
||||
begin
|
||||
inherited Create(AOwner, ANameSpace, ADataType, ADeclaredName);
|
||||
FGetFunction := {$IFDEF FPC}@{$ENDIF}FirstGetter;
|
||||
FGetterLock := TCriticalSection.Create();
|
||||
inherited Init();
|
||||
FSerializer := TObjectSerializer.Create(TBaseComplexRemotableClass(GetTypeData(DataType)^.ClassType),Owner);
|
||||
end;
|
||||
|
||||
destructor TBaseComplexTypeRegistryItem.Destroy();
|
||||
begin
|
||||
FGetterLock.Free();
|
||||
FSerializer.Free();
|
||||
inherited Destroy();
|
||||
end;
|
||||
|
||||
function TBaseComplexTypeRegistryItem.GetSerializer() : TObjectSerializer;
|
||||
begin
|
||||
while FFuncIsNotReady do begin
|
||||
//busy wait
|
||||
end;
|
||||
Result := FGetFunction();
|
||||
Result := FSerializer;
|
||||
end;
|
||||
|
||||
end.
|
||||
|
@ -153,6 +153,7 @@ type
|
||||
private
|
||||
FDecStream : ISourceStream;
|
||||
FImpStream : ISourceStream;
|
||||
FImpFirstStream : ISourceStream;
|
||||
FImpTempStream : ISourceStream;
|
||||
FImpLastStream : ISourceStream;
|
||||
FRttiFunc : ISourceStream;
|
||||
@ -191,7 +192,8 @@ type
|
||||
implementation
|
||||
uses parserutils, Contnrs, logger_intf;
|
||||
|
||||
Const sPROXY_BASE_CLASS = 'TBaseProxy';
|
||||
const sLOCAL_TYPE_REGISTER_REFERENCE = 'typeRegistryIntance';
|
||||
sPROXY_BASE_CLASS = 'TBaseProxy';
|
||||
sBINDER_BASE_CLASS = 'TBaseServiceBinder';
|
||||
sIMP_BASE_CLASS = 'TBaseServiceImplementation';
|
||||
sSERIALIZER_CLASS = 'IFormatterClient';
|
||||
@ -2076,7 +2078,12 @@ begin
|
||||
WriteLn('');
|
||||
WriteLn('Implementation');
|
||||
WriteLn('uses metadata_repository, record_rtti, wst_types;');
|
||||
FImpTempStream.WriteLn('initialization');
|
||||
FImpFirstStream.WriteLn('var');
|
||||
FImpFirstStream.Indent();
|
||||
FImpFirstStream.WriteLn('%s : TTypeRegistry = nil;',[sLOCAL_TYPE_REGISTER_REFERENCE]);
|
||||
FImpFirstStream.WriteLn('initialization');
|
||||
FImpFirstStream.Indent();
|
||||
FImpFirstStream.WriteLn('%s := GetTypeRegistry();',[sLOCAL_TYPE_REGISTER_REFERENCE]);
|
||||
end;
|
||||
|
||||
procedure TInftGenerator.GenerateUnitImplementationFooter();
|
||||
@ -2276,11 +2283,14 @@ var
|
||||
WriteLn('property %s : %s read F%s write F%s%s;',[propName,AProp.VarType.Name,propName,propName,locStore]);
|
||||
if not AnsiSameText(AProp.Name,SymbolTable.GetExternalName(AProp)) then begin
|
||||
FImpLastStream.Indent();
|
||||
FImpLastStream.WriteLn('GetTypeRegistry().ItemByTypeInfo[TypeInfo(%s)].RegisterExternalPropertyName(%s,%s);',[ASymbol.Name,QuotedStr(AProp.Name),QuotedStr(SymbolTable.GetExternalName(AProp))]);
|
||||
FImpLastStream.WriteLn(
|
||||
'%s.ItemByTypeInfo[TypeInfo(%s)].RegisterExternalPropertyName(%s,%s);',
|
||||
[sLOCAL_TYPE_REGISTER_REFERENCE,ASymbol.Name,QuotedStr(AProp.Name),QuotedStr(SymbolTable.GetExternalName(AProp))]
|
||||
);
|
||||
end;
|
||||
if SymbolTable.IsAttributeProperty(AProp) then begin
|
||||
FImpLastStream.Indent();
|
||||
FImpLastStream.WriteLn('%s.RegisterAttributeProperty(%s);',[ASymbol.Name,QuotedStr(AProp.Name)]);
|
||||
FImpFirstStream.Indent();
|
||||
FImpFirstStream.WriteLn('%s.RegisterAttributeProperty(%s);',[ASymbol.Name,QuotedStr(AProp.Name)]);
|
||||
end;
|
||||
end;
|
||||
|
||||
@ -2466,7 +2476,10 @@ begin
|
||||
DecIndent();
|
||||
|
||||
FImpTempStream.Indent();
|
||||
FImpTempStream.WriteLn('GetTypeRegistry().Register(%s,TypeInfo(%s),%s);',[sNAME_SPACE,ASymbol.Name,QuotedStr(SymbolTable.GetExternalName(ASymbol))]);
|
||||
FImpTempStream.WriteLn(
|
||||
'%s.Register(%s,TypeInfo(%s),%s);',
|
||||
[sLOCAL_TYPE_REGISTER_REFERENCE,sNAME_SPACE,ASymbol.Name,QuotedStr(SymbolTable.GetExternalName(ASymbol))]
|
||||
);
|
||||
|
||||
SetCurrentStream(FImpStream);
|
||||
WriteImp();
|
||||
@ -2494,7 +2507,10 @@ begin
|
||||
Indent();WriteLn('%s = ( ',[ASymbol.Name]);
|
||||
|
||||
FImpTempStream.Indent();
|
||||
FImpTempStream.WriteLn('GetTypeRegistry().Register(%s,TypeInfo(%s),%s);',[sNAME_SPACE,ASymbol.Name,QuotedStr(SymbolTable.GetExternalName(ASymbol))]);
|
||||
FImpTempStream.WriteLn(
|
||||
'%s.Register(%s,TypeInfo(%s),%s);',
|
||||
[sLOCAL_TYPE_REGISTER_REFERENCE,sNAME_SPACE,ASymbol.Name,QuotedStr(SymbolTable.GetExternalName(ASymbol))]
|
||||
);
|
||||
|
||||
IncIndent();
|
||||
for i := 0 to Pred(ASymbol.Values.Count) do begin
|
||||
@ -2508,7 +2524,10 @@ begin
|
||||
( not AnsiSameText(itm.Name,SymbolTable.GetExternalName(itm,False)) )
|
||||
then begin
|
||||
FImpTempStream.Indent();
|
||||
FImpTempStream.WriteLn('GetTypeRegistry().ItemByTypeInfo[TypeInfo(%s)].RegisterExternalPropertyName(%s,%s);',[ASymbol.Name,QuotedStr(itm.Name),QuotedStr(SymbolTable.GetExternalName(itm,False))]);
|
||||
FImpTempStream.WriteLn(
|
||||
'%s.ItemByTypeInfo[TypeInfo(%s)].RegisterExternalPropertyName(%s,%s);',
|
||||
[sLOCAL_TYPE_REGISTER_REFERENCE,ASymbol.Name,QuotedStr(itm.Name),QuotedStr(SymbolTable.GetExternalName(itm,False))]
|
||||
);
|
||||
end;
|
||||
end;
|
||||
DecIndent();
|
||||
@ -2541,19 +2560,22 @@ begin
|
||||
end;
|
||||
|
||||
FImpTempStream.Indent();
|
||||
FImpTempStream.WriteLn('GetTypeRegistry().Register(%s,TypeInfo(%s),%s);',[sNAME_SPACE,ASymbol.Name,QuotedStr(SymbolTable.GetExternalName(ASymbol))]);
|
||||
FImpTempStream.WriteLn(
|
||||
'%s.Register(%s,TypeInfo(%s),%s);',
|
||||
[sLOCAL_TYPE_REGISTER_REFERENCE,sNAME_SPACE,ASymbol.Name,QuotedStr(SymbolTable.GetExternalName(ASymbol))]
|
||||
);
|
||||
if ( SymbolTable.GetArrayItemName(ASymbol) <> SymbolTable.GetArrayItemExternalName(ASymbol) ) then begin
|
||||
FImpTempStream.Indent();
|
||||
FImpTempStream.WriteLn(
|
||||
'GetTypeRegistry().ItemByTypeInfo[TypeInfo(%s)].RegisterExternalPropertyName(sARRAY_ITEM,%s);',
|
||||
[ASymbol.Name,QuotedStr(SymbolTable.GetArrayItemExternalName(ASymbol))]
|
||||
'%s.ItemByTypeInfo[TypeInfo(%s)].RegisterExternalPropertyName(sARRAY_ITEM,%s);',
|
||||
[sLOCAL_TYPE_REGISTER_REFERENCE,ASymbol.Name,QuotedStr(SymbolTable.GetArrayItemExternalName(ASymbol))]
|
||||
);
|
||||
end;
|
||||
if ( SymbolTable.GetArrayStyle(ASymbol) = asEmbeded ) then begin
|
||||
FImpTempStream.Indent();
|
||||
FImpTempStream.WriteLn(
|
||||
'GetTypeRegistry().ItemByTypeInfo[TypeInfo(%s)].RegisterExternalPropertyName(sARRAY_STYLE,sEmbedded);',
|
||||
[ASymbol.Name,QuotedStr(SymbolTable.GetArrayItemExternalName(ASymbol))]
|
||||
'%s.ItemByTypeInfo[TypeInfo(%s)].RegisterExternalPropertyName(sARRAY_STYLE,sEmbedded);',
|
||||
[sLOCAL_TYPE_REGISTER_REFERENCE,ASymbol.Name,QuotedStr(SymbolTable.GetArrayItemExternalName(ASymbol))]
|
||||
);
|
||||
end;
|
||||
end;
|
||||
@ -2645,8 +2667,8 @@ var
|
||||
for k := 0 to Pred(c) do begin
|
||||
itm := TPasVariable(ASymbol.Members[k]);
|
||||
if SymbolTable.IsAttributeProperty(itm) then begin
|
||||
Indent();
|
||||
WriteLn('RegisterAttributeProperty(TypeInfo(%s),%s);',[ASymbol.Name,QuotedStr(itm.Name)]);
|
||||
FImpFirstStream.Indent();
|
||||
FImpFirstStream.WriteLn('RegisterAttributeProperty(TypeInfo(%s),%s);',[ASymbol.Name,QuotedStr(itm.Name)]);
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
@ -2663,12 +2685,12 @@ begin
|
||||
|
||||
Indent();
|
||||
WriteLn(
|
||||
'GetTypeRegistry().Register(%s,TypeInfo(%s),%s).RegisterExternalPropertyName(%s,%s);',
|
||||
[ sNAME_SPACE,ASymbol.Name,QuotedStr(SymbolTable.GetExternalName(ASymbol)),
|
||||
'%s.Register(%s,TypeInfo(%s),%s).RegisterExternalPropertyName(%s,%s);',
|
||||
[ sLOCAL_TYPE_REGISTER_REFERENCE,sNAME_SPACE,ASymbol.Name,QuotedStr(SymbolTable.GetExternalName(ASymbol)),
|
||||
QuotedStr(Format('__FIELDS__',[ASymbol.Name])),QuotedStr(strFieldList)
|
||||
]
|
||||
);
|
||||
s := 'GetTypeRegistry().ItemByTypeInfo[TypeInfo(%s)]' +
|
||||
s := '%s.ItemByTypeInfo[TypeInfo(%s)]' +
|
||||
'.RegisterObject(' +
|
||||
'FIELDS_STRING,' +
|
||||
'TRecordRttiDataObject.Create(' +
|
||||
@ -2677,11 +2699,11 @@ begin
|
||||
')' +
|
||||
');';
|
||||
WriteLn('{$IFNDEF %s}',[sRECORD_RTTI_DEFINE]);
|
||||
Indent(); WriteLn(s,[ASymbol.Name,Format('TypeInfo(%s)',[ASymbol.Name]),ASymbol.Name]);
|
||||
Indent(); WriteLn(s,[sLOCAL_TYPE_REGISTER_REFERENCE,ASymbol.Name,Format('TypeInfo(%s)',[ASymbol.Name]),ASymbol.Name]);
|
||||
WriteLn('{$ENDIF %s}',[sRECORD_RTTI_DEFINE]);
|
||||
|
||||
WriteLn('{$IFDEF %s}',[sRECORD_RTTI_DEFINE]);
|
||||
Indent(); WriteLn(s,[ASymbol.Name,Format('__%s_TYPEINFO_FUNC__()',[ASymbol.Name]),ASymbol.Name]);
|
||||
Indent(); WriteLn(s,[sLOCAL_TYPE_REGISTER_REFERENCE,ASymbol.Name,Format('__%s_TYPEINFO_FUNC__()',[ASymbol.Name]),ASymbol.Name]);
|
||||
WriteLn('{$ENDIF %s}',[sRECORD_RTTI_DEFINE]);
|
||||
WriteAttributeProperties();
|
||||
SetCurrentStream(FDecStream);
|
||||
@ -3004,9 +3026,13 @@ begin
|
||||
GenerateCustomMetadatas();
|
||||
end;
|
||||
|
||||
FImpFirstStream.NewLine();
|
||||
FImpLastStream.NewLine();
|
||||
GenerateUnitImplementationFooter();
|
||||
FSrcMngr.Merge(GetDestUnitName() + '.pas',[FDecStream,FImpStream,FRttiFunc,FImpTempStream,FImpLastStream]);
|
||||
FSrcMngr.Merge(
|
||||
GetDestUnitName() + '.pas',
|
||||
[FDecStream,FImpStream,FRttiFunc,FImpFirstStream,FImpTempStream,FImpLastStream]
|
||||
);
|
||||
FDecStream := nil;
|
||||
FImpStream := nil;
|
||||
FImpTempStream := nil;
|
||||
@ -3024,8 +3050,10 @@ begin
|
||||
FDecStream := SrcMngr.CreateItem(GetDestUnitName() + '.dec');
|
||||
FImpStream := SrcMngr.CreateItem(GetDestUnitName() + '.imp');
|
||||
FImpTempStream := SrcMngr.CreateItem(GetDestUnitName() + '.tmp_imp');
|
||||
FImpFirstStream := SrcMngr.CreateItem(GetDestUnitName() + '.tmp_imp_first');
|
||||
FImpLastStream := SrcMngr.CreateItem(GetDestUnitName() + '.tmp_imp_last');
|
||||
FRttiFunc := SrcMngr.CreateItem(GetDestUnitName() + '.tmp_rtti_func');
|
||||
FImpFirstStream.IncIndent();
|
||||
FImpTempStream.IncIndent();
|
||||
FImpLastStream.IncIndent();
|
||||
end;
|
||||
|
Loading…
Reference in New Issue
Block a user