diff --git a/wst/trunk/base_service_intf.pas b/wst/trunk/base_service_intf.pas index 4662d394b..1b5022c5d 100644 --- a/wst/trunk/base_service_intf.pas +++ b/wst/trunk/base_service_intf.pas @@ -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} diff --git a/wst/trunk/config_objects.pas b/wst/trunk/config_objects.pas index 6e410936a..8ac1737e9 100644 --- a/wst/trunk/config_objects.pas +++ b/wst/trunk/config_objects.pas @@ -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; diff --git a/wst/trunk/object_serializer.pas b/wst/trunk/object_serializer.pas index e134a25d9..660fe9133 100644 --- a/wst/trunk/object_serializer.pas +++ b/wst/trunk/object_serializer.pas @@ -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. diff --git a/wst/trunk/ws_helper/generator.pas b/wst/trunk/ws_helper/generator.pas index 4d838ec29..63e894654 100644 --- a/wst/trunk/ws_helper/generator.pas +++ b/wst/trunk/ws_helper/generator.pas @@ -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;