diff --git a/utils/pas2js/pas2jscompiler.pp b/utils/pas2js/pas2jscompiler.pp index 70710b7f2c..d1d5d27b5a 100644 --- a/utils/pas2js/pas2jscompiler.pp +++ b/utils/pas2js/pas2jscompiler.pp @@ -1878,6 +1878,7 @@ var aFile: TPas2jsFileLineReader; IfLvl, SkipLvl, OldCfgLineNumber: Integer; Skip: TSkip; + CacheFile: TPas2jsCachedFile; begin if ShowTriedUsedFiles then Log.LogMsgIgnoreFilter(nReadingOptionsFromFile,[CfgFilename]); @@ -1889,7 +1890,8 @@ begin OldCfgFilename:=FCurrentCfgFilename; FCurrentCfgFilename:=CfgFilename; OldCfgLineNumber:=FCurrentCfgLineNumber; - aFile:=TPas2jsFileLineReader.Create(CfgFilename); + CacheFile:=FileCache.LoadTextFile(CfgFilename); + aFile:=CacheFile.CreateLineReader(true); while not aFile.IsEOF do begin Line:=aFile.ReadLine; FCurrentCfgLineNumber:=aFile.LineNumber; diff --git a/utils/pas2js/pas2jsfilecache.pp b/utils/pas2js/pas2jsfilecache.pp index 947f56d0e5..b29579a3d0 100644 --- a/utils/pas2js/pas2jsfilecache.pp +++ b/utils/pas2js/pas2jsfilecache.pp @@ -110,6 +110,8 @@ type property LoadedFileAge: longint read FLoadedFileAge;// only valid if Loaded=true end; + TPas2jsReadFileEvent = function(aFilename: string; var aSource: string): boolean of object; + TPas2jsCachedFilesState = ( cfsMainJSFileResolved ); @@ -137,6 +139,7 @@ type FMainSrcFile: string; FNamespaces: TStringList; FNamespacesFromCmdLine: integer; + FOnReadFile: TPas2jsReadFileEvent; FOptions: TP2jsFileCacheOptions; FReadLineCounter: SizeInt; FResetStamp: TChangeStamp; @@ -160,6 +163,8 @@ type procedure SetSrcMapBaseDir(const AValue: string); procedure SetUnitOutputPath(AValue: string); procedure SetOption(Flag: TP2jsFileCacheOption; Enable: boolean); + protected + function ReadFile(Filename: string; var Source: string): boolean; virtual; public constructor Create(aLog: TPas2jsLogger); destructor Destroy; override; @@ -199,6 +204,7 @@ type property UnitOutputPath: string read FUnitOutputPath write SetUnitOutputPath; // includes trailing pathdelim property UnitPaths: TStringList read FUnitPaths; property UnitPathsFromCmdLine: integer read FUnitPathsFromCmdLine; + property OnReadFile: TPas2jsReadFileEvent read FOnReadFile write FOnReadFile; end; function CompareFilenameWithCachedFile(Filename, CachedFile: Pointer): integer; @@ -300,33 +306,8 @@ end; { TPas2jsFileLineReader } constructor TPas2jsFileLineReader.Create(const AFilename: string); -var - ms: TMemoryStream; - NewSource, FileEncoding: string; begin - //writeln('TPas2jsFileLineReader.Create ',AFilename); - inherited Create(AFilename); - ms:=TMemoryStream.Create; - try - try - ms.LoadFromFile(Filename); - SetLength(NewSource,ms.Size); - ms.Position:=0; - if NewSource<>'' then - ms.Read(NewSource[1],length(NewSource)); - except - on E: Exception do begin - EPas2jsFileCache.Create('Error reading file "'+Filename+'": '+E.Message); - exit; - end; - end; - finally - ms.Free; - end; - FileEncoding:=''; - FSource:=ConvertTextToUTF8(NewSource,FileEncoding); - FSrcPos:=PChar(FSource); - FIsEOF:=FSource=''; + raise Exception.Create('TPas2jsFileLineReader.Create no cache "'+AFilename+'"'); end; constructor TPas2jsFileLineReader.Create(aFile: TPas2jsCachedFile); @@ -413,7 +394,6 @@ function TPas2jsCachedFile.Load(RaiseOnError: boolean): boolean; end; var - ms: TMemoryStream; NewSource: string; begin {$IFDEF VerboseFileCache} @@ -447,23 +427,8 @@ begin Err('File is a directory "'+Filename+'"'); exit; end; - ms:=TMemoryStream.Create; - try - try - ms.LoadFromFile(Filename); - SetLength(NewSource,ms.Size); - ms.Position:=0; - if NewSource<>'' then - ms.Read(NewSource[1],length(NewSource)); - except - on E: Exception do begin - Err('Error reading file "'+Filename+'": '+E.Message); - exit; - end; - end; - finally - ms.Free; - end; + NewSource:=''; + if not Cache.ReadFile(Filename,NewSource) then exit; {$IFDEF VerboseFileCache} writeln('TPas2jsCachedFile.Load ENCODE ',Filename,' FFileEncoding=',FFileEncoding); {$ENDIF} @@ -895,6 +860,33 @@ begin Exclude(FStates,cfsMainJSFileResolved); end; +function TPas2jsFilesCache.ReadFile(Filename: string; var Source: string + ): boolean; +var + ms: TMemoryStream; +begin + Result:=false; + try + if Assigned(OnReadFile) then + if OnReadFile(Filename,Source) then exit; + ms:=TMemoryStream.Create; + try + ms.LoadFromFile(Filename); + SetLength(Source,ms.Size); + ms.Position:=0; + if Source<>'' then + ms.Read(Source[1],length(Source)); + Result:=true; + finally + ms.Free; + end; + except + on E: Exception do begin + EPas2jsFileCache.Create('Error reading file "'+Filename+'": '+E.Message); + end; + end; +end; + constructor TPas2jsFilesCache.Create(aLog: TPas2jsLogger); begin inherited Create; diff --git a/utils/pas2js/pas2jslib.lpi b/utils/pas2js/pas2jslib.lpi index 91f6b8e77f..c39df494b6 100644 --- a/utils/pas2js/pas2jslib.lpi +++ b/utils/pas2js/pas2jslib.lpi @@ -1,7 +1,7 @@ - + @@ -20,20 +20,50 @@ - - - + + + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/utils/pas2js/pas2jslib.pp b/utils/pas2js/pas2jslib.pp index f0c86b5733..d8aa3f9191 100644 --- a/utils/pas2js/pas2jslib.pp +++ b/utils/pas2js/pas2jslib.pp @@ -11,7 +11,7 @@ uses ---------------------------------------------------------------------} Type - TLibLogCallBack = Procedure (Data : Pointer; Msg : PansiChar; MsgLen : Integer); stdcall; + TLibLogCallBack = Procedure (Data : Pointer; Msg : PAnsiChar; MsgLen : Integer); stdcall; TWriteJSCallBack = Procedure (Data : Pointer; AFileName: PAnsiChar; AFileNameLen : Integer; AFileData : PAnsiChar; AFileDataLen: Int32); stdcall; @@ -30,6 +30,7 @@ Type Function DoWriteJSFile(const DestFilename: String; aWriter: TPas2JSMapper): Boolean; override; Procedure GetLastError(AError : PAnsiChar; Var AErrorLength : Longint; AErrorClass : PAnsiChar; Var AErrorClassLength : Longint); + Function ReadFile(aFilename: string; var aSource: string): boolean; virtual; Public Constructor Create; override; Procedure DoLibraryLog(Sender : TObject; Const Msg : String); @@ -60,8 +61,9 @@ begin end; end; -procedure TLibraryPas2JSCompiler.GetLastError(AError: PAnsiChar; var AErrorLength : Longint; - AErrorClass: PAnsiChar; var AErrorClassLength : Longint); +procedure TLibraryPas2JSCompiler.GetLastError(AError: PAnsiChar; + Var AErrorLength: Longint; AErrorClass: PAnsiChar; + Var AErrorClassLength: Longint); Var L : Integer; @@ -79,10 +81,17 @@ begin Move(FLastErrorClass[1],AErrorClass^,L); end; +function TLibraryPas2JSCompiler.ReadFile(aFilename: string; var aSource: string + ): boolean; +begin + Result:=false; // use default reader +end; + constructor TLibraryPas2JSCompiler.Create; begin inherited Create; Log.OnLog:=@DoLibraryLog; + FileCache.OnReadFile:=@ReadFile; end; procedure TLibraryPas2JSCompiler.DoLibraryLog(Sender: TObject; const Msg: String);