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:
inoussa 2009-05-25 16:08:42 +00:00
parent 1ce28d56b6
commit 4d76fe4edd
4 changed files with 64 additions and 69 deletions

View File

@ -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}

View File

@ -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;

View File

@ -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.

View File

@ -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;