From b51a63766cdda1faeb6d7257f519bfaa2e4d621a Mon Sep 17 00:00:00 2001 From: Mattias Gaertner Date: Thu, 15 Mar 2018 23:09:50 +0000 Subject: [PATCH] pastojs: filer: fixed AddRef git-svn-id: trunk@38536 - --- packages/pastojs/src/pas2jsfilecache.pp | 5 +- packages/pastojs/src/pas2jsfiler.pp | 76 +++++++++++++++++++------ packages/pastojs/tests/tcmodules.pas | 18 +++--- packages/pastojs/tests/tcprecompile.pas | 30 ++++++++-- packages/pastojs/tests/tcunitsearch.pas | 3 +- 5 files changed, 98 insertions(+), 34 deletions(-) diff --git a/packages/pastojs/src/pas2jsfilecache.pp b/packages/pastojs/src/pas2jsfilecache.pp index 430369a7d9..236edf6eaf 100644 --- a/packages/pastojs/src/pas2jsfilecache.pp +++ b/packages/pastojs/src/pas2jsfilecache.pp @@ -1190,12 +1190,11 @@ begin writeln('TPas2jsCachedFile.Load ENCODE ',Filename,' FFileEncoding=',FFileEncoding); {$ENDIF} if Binary then - FSource:=ConvertTextToUTF8(NewSource,FFileEncoding) - else begin FSource:=NewSource; FFileEncoding:=EncodingBinary; - end; + end else + FSource:=ConvertTextToUTF8(NewSource,FFileEncoding); FLoaded:=true; FCacheStamp:=Cache.ResetStamp; FLoadedFileAge:=Cache.DirectoryCache.FileAge(Filename); diff --git a/packages/pastojs/src/pas2jsfiler.pp b/packages/pastojs/src/pas2jsfiler.pp index e3d5354cd7..522993012e 100644 --- a/packages/pastojs/src/pas2jsfiler.pp +++ b/packages/pastojs/src/pas2jsfiler.pp @@ -3683,7 +3683,10 @@ var El: TPasVariable absolute Data; begin if RefEl is TPasType then - El.VarType:=TPasType(RefEl) + begin + El.VarType:=TPasType(RefEl); + RefEl.AddRef; + end else RaiseMsg(20180211121809,El,GetObjName(RefEl)); end; @@ -3693,7 +3696,10 @@ var El: TPasAliasType absolute Data; begin if RefEl is TPasType then - El.DestType:=TPasType(RefEl) + begin + El.DestType:=TPasType(RefEl); + RefEl.AddRef; + end else RaiseMsg(20180211121801,El,GetObjName(RefEl)); end; @@ -3704,7 +3710,10 @@ var El: TPasPointerType absolute Data; begin if RefEl is TPasType then - El.DestType:=TPasType(RefEl) + begin + El.DestType:=TPasType(RefEl); + RefEl.AddRef; + end else RaiseMsg(20180211121757,El,GetObjName(RefEl)); end; @@ -3715,7 +3724,10 @@ var El: TInlineTypeExpr absolute Data; begin if RefEl is TPasType then - El.DestType:=TPasType(RefEl) + begin + El.DestType:=TPasType(RefEl); + RefEl.AddRef; + end else RaiseMsg(20180211121750,El,GetObjName(RefEl)); end; @@ -3725,7 +3737,10 @@ var El: TPasArrayType absolute Data; begin if RefEl is TPasType then - El.ElType:=TPasType(RefEl) + begin + El.ElType:=TPasType(RefEl); + RefEl.AddRef; + end else RaiseMsg(20180211121732,El,GetObjName(RefEl)); end; @@ -3735,7 +3750,10 @@ var El: TPasFileType absolute Data; begin if RefEl is TPasType then - El.ElType:=TPasType(RefEl) + begin + El.ElType:=TPasType(RefEl); + RefEl.AddRef; + end else RaiseMsg(20180211121726,El,GetObjName(RefEl)); end; @@ -3745,7 +3763,10 @@ var El: TPasSetType absolute Data; begin if RefEl is TPasType then - El.EnumType:=TPasType(RefEl) + begin + El.EnumType:=TPasType(RefEl); + RefEl.AddRef; + end else RaiseMsg(20180211121714,El,GetObjName(RefEl)); end; @@ -3755,7 +3776,10 @@ var El: TPasVariant absolute Data; begin if RefEl is TPasRecordType then - El.Members:=TPasRecordType(RefEl) + begin + El.Members:=TPasRecordType(RefEl); + RefEl.AddRef; + end else RaiseMsg(20180211121657,El,GetObjName(RefEl)); end; @@ -3766,7 +3790,10 @@ var El: TPasRecordType absolute Data; begin if (RefEl is TPasType) or (RefEl.ClassType=TPasVariable) then - El.VariantEl:=RefEl + begin + El.VariantEl:=RefEl; + RefEl.AddRef; + end else RaiseMsg(20180210205031,El,GetObjName(RefEl)); end; @@ -3776,7 +3803,10 @@ var El: TPasArgument absolute Data; begin if RefEl is TPasType then - El.ArgType:=TPasType(RefEl) + begin + El.ArgType:=TPasType(RefEl); + RefEl.AddRef; + end else RaiseMsg(20180211121643,El,GetObjName(RefEl)); end; @@ -3829,7 +3859,10 @@ var El: TPasClassType absolute Data; begin if RefEl is TPasType then - El.AncestorType:=TPasType(RefEl) + begin + El.AncestorType:=TPasType(RefEl); + RefEl.AddRef; + end else RaiseMsg(20180211121632,El,GetObjName(RefEl)); end; @@ -3840,7 +3873,10 @@ var El: TPasClassType absolute Data; begin if RefEl is TPasType then - El.HelperForType:=TPasType(RefEl) + begin + El.HelperForType:=TPasType(RefEl); + RefEl.AddRef; + end else RaiseMsg(20180211121612,El,GetObjName(RefEl)); end; @@ -3851,7 +3887,10 @@ var El: TPasResultElement absolute Data; begin if RefEl is TPasType then - El.ResultType:=TPasType(RefEl) + begin + El.ResultType:=TPasType(RefEl); + RefEl.AddRef; + end else RaiseMsg(20180211121537,El,GetObjName(RefEl)); end; @@ -3925,7 +3964,10 @@ var Scope: TPasPropertyScope absolute Data; begin if RefEl is TPasProperty then - Scope.AncestorProp:=TPasProperty(RefEl) + begin + Scope.AncestorProp:=TPasProperty(RefEl); + RefEl.AddRef; + end else RaiseMsg(20180213214723,Scope.Element,GetObjName(RefEl)); end; @@ -5985,7 +6027,8 @@ end; procedure TPCUReader.ReadEnumTypeScope(Obj: TJSONObject; Scope: TPasEnumTypeScope; aContext: TPCUReaderContext); begin - Scope.CanonicalSet:=TPasSetType(ReadElementProperty(Obj,Scope.Element,'CanonicalSet',TPasSetType,aContext)); + Scope.CanonicalSet:=TPasSetType(ReadElementProperty( + Obj,Scope.Element,'CanonicalSet',TPasSetType,aContext)); ReadIdentifierScope(Obj,Scope,aContext); end; @@ -6626,7 +6669,8 @@ begin DefProcMods:=GetDefaultProcModifiers(El); El.Modifiers:=ReadProcedureModifiers(Obj,El,'PMods',DefProcMods); // read ProcType after El.Modifiers - El.ProcType:=TPasProcedureType(ReadElementProperty(Obj,El,'ProcType',TPasProcedureType,aContext)); + El.ProcType:=TPasProcedureType(ReadElementProperty( + Obj,El,'ProcType',TPasProcedureType,aContext)); ReadProcedureScope(Obj,Scope,aContext); end; diff --git a/packages/pastojs/tests/tcmodules.pas b/packages/pastojs/tests/tcmodules.pas index b3e53baa19..168bf6bf32 100644 --- a/packages/pastojs/tests/tcmodules.pas +++ b/packages/pastojs/tests/tcmodules.pas @@ -50,7 +50,7 @@ type FModule: TPasModule; FOnFindUnit: TOnFindUnit; FParser: TTestPasParser; - FResolver: TStreamResolver; + FStreamResolver: TStreamResolver; FScanner: TPascalScanner; FSource: string; procedure SetModule(AValue: TPasModule); @@ -61,7 +61,7 @@ type procedure UsedInterfacesFinished(Section: TPasSection); override; property OnFindUnit: TOnFindUnit read FOnFindUnit write FOnFindUnit; property Filename: string read FFilename write FFilename; - property Resolver: TStreamResolver read FResolver write FResolver; + property StreamResolver: TStreamResolver read FStreamResolver write FStreamResolver; property Scanner: TPascalScanner read FScanner write FScanner; property Parser: TTestPasParser read FParser write FParser; property Source: string read FSource write FSource; @@ -828,11 +828,11 @@ end; destructor TTestEnginePasResolver.Destroy; begin - FreeAndNil(FResolver); + FreeAndNil(FStreamResolver); Module:=nil; FreeAndNil(FParser); FreeAndNil(FScanner); - FreeAndNil(FResolver); + FreeAndNil(FStreamResolver); inherited Destroy; end; @@ -912,13 +912,13 @@ begin //writeln('TTestModule.FindUnit PARSING unit "',CurEngine.Filename,'"'); FileResolver.FindSourceFile(aUnitName); - CurEngine.Resolver:=TStreamResolver.Create; - CurEngine.Resolver.OwnsStreams:=True; + CurEngine.StreamResolver:=TStreamResolver.Create; + CurEngine.StreamResolver.OwnsStreams:=True; //writeln('TTestModule.FindUnit SOURCE=',CurEngine.Source); - CurEngine.Resolver.AddStream(CurEngine.FileName,TStringStream.Create(CurEngine.Source)); - CurEngine.Scanner:=TPascalScanner.Create(CurEngine.Resolver); + CurEngine.StreamResolver.AddStream(CurEngine.FileName,TStringStream.Create(CurEngine.Source)); + CurEngine.Scanner:=TPascalScanner.Create(CurEngine.StreamResolver); InitScanner(CurEngine.Scanner); - CurEngine.Parser:=TTestPasParser.Create(CurEngine.Scanner,CurEngine.Resolver,CurEngine); + CurEngine.Parser:=TTestPasParser.Create(CurEngine.Scanner,CurEngine.StreamResolver,CurEngine); CurEngine.Parser.Options:=po_tcmodules; if CompareText(CurUnitName,'System')=0 then CurEngine.Parser.ImplicitUses.Clear; diff --git a/packages/pastojs/tests/tcprecompile.pas b/packages/pastojs/tests/tcprecompile.pas index a2fe90b53a..6bdbb9efec 100644 --- a/packages/pastojs/tests/tcprecompile.pas +++ b/packages/pastojs/tests/tcprecompile.pas @@ -50,6 +50,7 @@ type TTestCLI_Precompile = class(TCustomTestCLI_Precompile) published procedure TestPCU_EmptyUnit; + procedure TestPCU_UTF8BOM; procedure TestPCU_ParamNS; procedure TestPCU_Overloads; procedure TestPCU_UnitCycle; @@ -136,6 +137,25 @@ begin CheckPrecompile('test1.pas','src'); end; +procedure TTestCLI_Precompile.TestPCU_UTF8BOM; +var + aFile: TCLIFile; +begin + aFile:=AddUnit('src/system.pp', + ['var', + ' s: string = ''aaaäö'';', + ' s2: string = ''😊'';', // 1F60A + ''], + ['']); + aFile.Source:=UTF8BOM+aFile.Source; + aFile:=AddFile('test1.pas',[ + 'begin', + ' s:=''ö😊'';', + 'end.']); + aFile.Source:=UTF8BOM+aFile.Source; + CheckPrecompile('test1.pas','src'); +end; + procedure TTestCLI_Precompile.TestPCU_ParamNS; begin AddUnit('src/system.pp',[''],['']); @@ -168,19 +188,19 @@ begin 'procedure DoIt(s: string); overload;'], ['procedure DoIt(s: string);', 'begin', - ' unit1.i:=j;', + ' unit1.i:=length(s);', 'end;']); AddFile('test1.pas',[ - 'uses unit1;', + 'uses unit1, unit2;', 'procedure DoIt(d: double); overload;', 'begin', - ' unit1.i:=j;', + ' unit1.i:=4;', 'end;', 'begin', ' DoIt(3);', ' DoIt(''abc'');', - ' Do1(true);', - ' Do1(3.3);', + ' DoIt(true);', + ' DoIt(3.3);', 'end.']); CheckPrecompile('test1.pas','src'); end; diff --git a/packages/pastojs/tests/tcunitsearch.pas b/packages/pastojs/tests/tcunitsearch.pas index 8aecba36a6..881a389091 100644 --- a/packages/pastojs/tests/tcunitsearch.pas +++ b/packages/pastojs/tests/tcunitsearch.pas @@ -471,7 +471,8 @@ begin Result:=FindFile(Filename); if Result<>nil then raise Exception.Create('[20180224001050] TCustomTestCLI.AddFile already exists: '+Filename); - FFiles.Add(TCLIFile.Create(Filename,Source,DefaultFileAge,faNormal)); + Result:=TCLIFile.Create(Filename,Source,DefaultFileAge,faNormal); + FFiles.Add(Result); AddDir(ExtractFilePath(Filename)); end;