mirror of
https://gitlab.com/freepascal.org/fpc/pas2js.git
synced 2025-04-14 10:19:34 +02:00
pastojs: filer: fixed testsuite using shortrefglobals for all tests, added FormData js keyword, fixed shortrefglobals new/free instance fields
This commit is contained in:
parent
81538babe2
commit
40cd9a84c7
@ -981,7 +981,7 @@ const
|
||||
'yield'
|
||||
);
|
||||
// reserved words, not usable as global identifiers, can be used as sub identifiers
|
||||
JSReservedGlobalWords: array[0..51] of string = (
|
||||
JSReservedGlobalWords: array[0..52] of string = (
|
||||
// keep sorted, first uppercase, then lowercase !
|
||||
'Array',
|
||||
'ArrayBuffer',
|
||||
@ -992,6 +992,7 @@ const
|
||||
'EvalError',
|
||||
'Float32Array',
|
||||
'Float64Array',
|
||||
'FormData',
|
||||
'Generator',
|
||||
'GeneratorFunction',
|
||||
'Infinity',
|
||||
@ -9731,11 +9732,30 @@ end;
|
||||
function TPasToJSConverter.CreateSubDeclJSNameExpr(El: TPasElement;
|
||||
JSName: string; AContext: TConvertContext; PosEl: TPasElement): TJSElement;
|
||||
var
|
||||
C: TClass;
|
||||
VarKinds: TCtxVarKinds;
|
||||
ParentName: String;
|
||||
begin
|
||||
if AContext.IsGlobal then
|
||||
C:=El.ClassType;
|
||||
if C.InheritsFrom(TPasType) or (C=TPasConst) then
|
||||
VarKinds:=[cvkGlobal]
|
||||
else if C.InheritsFrom(TPasVariable) then
|
||||
begin
|
||||
ParentName:=GetLocalName(El.Parent,[cvkGlobal,cvkCurType],AContext);
|
||||
VarKinds:=[cvkCurType];
|
||||
if ([vmClass, vmStatic]*TPasVariable(El).VarModifiers<>[]) then
|
||||
VarKinds:=[cvkGlobal]
|
||||
else if El.Parent is TPasMembersType then
|
||||
VarKinds:=[cvkCurType]
|
||||
else
|
||||
VarKinds:=[cvkGlobal];
|
||||
end
|
||||
else if (El.Parent is TProcedureBody) then
|
||||
VarKinds:=[]
|
||||
else
|
||||
VarKinds:=[cvkGlobal];
|
||||
if VarKinds<>[] then
|
||||
begin
|
||||
ParentName:=GetLocalName(El.Parent,VarKinds,AContext);
|
||||
if ParentName='' then
|
||||
ParentName:='this';
|
||||
if JSName[1]='[' then
|
||||
@ -14824,7 +14844,7 @@ begin
|
||||
ObjLit.Name:=TJSString(TransformElToJSName(El,AContext));
|
||||
ObjLit.Expr:=CreateVarInit(El,AContext);
|
||||
end
|
||||
else if AContext.IsGlobal then
|
||||
else if AContext.IsGlobal or (El.Parent is TPasMembersType) then
|
||||
begin
|
||||
// create 'this.A=initvalue'
|
||||
AssignSt:=TJSSimpleAssignStatement(CreateElement(TJSSimpleAssignStatement,El));
|
||||
@ -18586,7 +18606,7 @@ begin
|
||||
try
|
||||
New_FuncContext.ThisVar.Element:=El;
|
||||
New_FuncContext.ThisVar.Kind:=cvkCurType;
|
||||
New_FuncContext.IsGlobal:=true;
|
||||
New_FuncContext.IsGlobal:=false;
|
||||
|
||||
// add class members
|
||||
For I:=0 to El.Members.Count-1 do
|
||||
@ -18598,8 +18618,10 @@ begin
|
||||
and (ClassVarModifiersType*TPasVariable(P).VarModifiers=[]) then
|
||||
begin
|
||||
if Kind=mfInit then
|
||||
begin
|
||||
// mfInit: init var
|
||||
NewEl:=CreateVarDecl(TPasVariable(P),New_FuncContext) // can be nil
|
||||
NewEl:=CreateVarDecl(TPasVariable(P),New_FuncContext); // can be nil
|
||||
end
|
||||
else
|
||||
begin
|
||||
// mfFinalize: clear reference
|
||||
|
@ -393,7 +393,7 @@ type
|
||||
destructor Destroy; override;
|
||||
Function CreatePCUSupport: TPCUSupport; virtual;
|
||||
function GetInitialModeSwitches: TModeSwitches;
|
||||
function IsUnitReadFromPCU: Boolean;
|
||||
function IsUnitReadFromPCU: Boolean; // unit was read from pcu
|
||||
function GetInitialBoolSwitches: TBoolSwitches;
|
||||
function GetInitialConverterOptions: TPasToJsConverterOptions;
|
||||
procedure CreateScannerAndParser(aFileResolver: TPas2jsFSResolver);
|
||||
@ -1053,7 +1053,7 @@ begin
|
||||
|
||||
if coEnumValuesAsNumbers in Compiler.Options then
|
||||
Include(Result,fppas2js.coEnumNumbers);
|
||||
if coShortRefGlobals in Compiler.Options then
|
||||
if (coShortRefGlobals in Compiler.Options) or IsUnitReadFromPCU then
|
||||
Include(Result,fppas2js.coShortRefGlobals);
|
||||
|
||||
if coLowerCase in Compiler.Options then
|
||||
@ -2219,7 +2219,6 @@ begin
|
||||
end;
|
||||
|
||||
function TPas2jsCompiler.CreateOptimizer: TPas2JSAnalyzer;
|
||||
|
||||
begin
|
||||
Result:=TPas2JSAnalyzer.Create;
|
||||
end;
|
||||
@ -2351,7 +2350,6 @@ begin
|
||||
end;
|
||||
|
||||
function TPas2jsCompiler.CreateSrcMap(const aFileName: String): TPas2JSSrcMap;
|
||||
|
||||
begin
|
||||
Result:=TPas2JSSrcMap.Create(aFileName);
|
||||
end;
|
||||
@ -2788,8 +2786,6 @@ begin
|
||||
FResources.DoneUnit(aFile.isMainFile);
|
||||
EmitJavaScript(aFile,aFileWriter);
|
||||
|
||||
|
||||
|
||||
if aFile.IsMainFile and (TargetPlatform=PlatformNodeJS) then
|
||||
aFileWriter.WriteFile('rtl.run();'+LineEnding,aFile.UnitFilename);
|
||||
|
||||
@ -4193,19 +4189,16 @@ begin
|
||||
end;
|
||||
|
||||
function TPas2jsCompiler.CreateMacroEngine: TPas2jsMacroEngine;
|
||||
|
||||
begin
|
||||
Result:=TPas2jsMacroEngine.Create;
|
||||
end;
|
||||
|
||||
function TPas2jsCompiler.CreateLog: TPas2jsLogger;
|
||||
|
||||
begin
|
||||
Result:=TPas2jsLogger.Create;
|
||||
end;
|
||||
|
||||
constructor TPas2jsCompiler.Create;
|
||||
|
||||
begin
|
||||
FOptions:=DefaultP2jsCompilerOptions;
|
||||
FConverterGlobals:=TPasToJSConverterGlobals.Create(Self);
|
||||
|
@ -243,8 +243,9 @@ const
|
||||
'Goto'
|
||||
);
|
||||
|
||||
PCUMinConverterOptions = [coStoreImplJS,coShortRefGlobals];
|
||||
PCUDefaultConverterOptions: TPasToJsConverterOptions =
|
||||
[coUseStrict,coStoreImplJS,coShortRefGlobals];
|
||||
PCUMinConverterOptions+[coUseStrict];
|
||||
PCUConverterOptions: array[TPasToJsConverterOption] of string = (
|
||||
'LowerCase',
|
||||
'SwitchStatement',
|
||||
@ -1038,6 +1039,7 @@ type
|
||||
procedure DeletePendingSpecialize(PendSpec: TPCUReaderPendingSpecialized);
|
||||
function PromiseSpecialize(SpecId: integer; const SpecName: string; RefEl, ErrorEl: TPasElement): TPCUReaderPendingSpecialized; virtual;
|
||||
procedure ResolveSpecializedElements(Complete: boolean);
|
||||
function IsSpecialize(ChildEl: TPasElement): boolean;
|
||||
protected
|
||||
// json
|
||||
procedure RaiseMsg(Id: int64; const Msg: string = ''); overload; override;
|
||||
@ -1295,7 +1297,7 @@ implementation
|
||||
procedure RegisterPCUFormat;
|
||||
begin
|
||||
if PCUFormat=nil then
|
||||
PCUFormat:=PrecompileFormats.Add('pcu','all used pcu must match exactly',TPCUReader,TPCUWriter);
|
||||
PCUFormat:=PrecompileFormats.Add('pcu','all used pcu must match exactly together',TPCUReader,TPCUWriter);
|
||||
end;
|
||||
|
||||
function ComparePointer(Data1, Data2: Pointer): integer;
|
||||
@ -2159,7 +2161,7 @@ begin
|
||||
ParserOptions:=PCUDefaultParserOptions;
|
||||
ModeSwitches:=PCUDefaultModeSwitches;
|
||||
BoolSwitches:=PCUDefaultBoolSwitches;
|
||||
ConverterOptions:=PCUDefaultConverterOptions-[coStoreImplJS];
|
||||
ConverterOptions:=PCUDefaultConverterOptions;
|
||||
TargetPlatform:=PCUDefaultTargetPlatform;
|
||||
TargetProcessor:=PCUDefaultTargetProcessor;
|
||||
end;
|
||||
@ -3462,7 +3464,7 @@ begin
|
||||
end
|
||||
else if (El.ClassType=TPasModule) or (El is TPasUnitModule) then
|
||||
begin
|
||||
// indirect used unit
|
||||
// indirectly used unit (refs to directly used units are created in WriteSection)
|
||||
if aContext.IndirectUsesArr=nil then
|
||||
begin
|
||||
if aContext.SectionObj=nil then
|
||||
@ -5636,6 +5638,17 @@ begin
|
||||
end;
|
||||
end;
|
||||
|
||||
function TPCUReader.IsSpecialize(ChildEl: TPasElement): boolean;
|
||||
begin
|
||||
if (ChildEl is TPasGenericType)
|
||||
and Resolver.IsSpecialized(TPasGenericType(ChildEl)) then
|
||||
exit(true);
|
||||
if (ChildEl is TPasProcedure)
|
||||
and (TPas2JSProcedureScope(ChildEl.CustomData).SpecializedFromItem<>nil) then
|
||||
exit(true);
|
||||
Result:=false;
|
||||
end;
|
||||
|
||||
procedure TPCUReader.RaiseMsg(Id: int64; const Msg: string);
|
||||
var
|
||||
E: EPas2JsReadError;
|
||||
@ -6591,8 +6604,7 @@ begin
|
||||
for k:=0 to Members.Count-1 do
|
||||
begin
|
||||
ChildEl:=TPasElement(Members[k]);
|
||||
if (ChildEl is TPasGenericType)
|
||||
and Resolver.IsSpecialized(TPasGenericType(ChildEl)) then
|
||||
if IsSpecialize(ChildEl) then
|
||||
// skip specialized type
|
||||
else if Index=j then
|
||||
break
|
||||
@ -6849,7 +6861,7 @@ begin
|
||||
RaiseMsg(20180314155953,Section,'indirect unit "'+Name+'"');
|
||||
UsedScope:=Module.InterfaceSection.CustomData as TPas2JSSectionScope;
|
||||
if not UsedScope.Finished then
|
||||
RaiseMsg(20180314155953,Section,'indirect unit "'+Name+'"');
|
||||
RaiseMsg(20180314155954,Section,'indirect unit "'+Name+'"');
|
||||
ReadExternalReferences(UsesObj,Module);
|
||||
end;
|
||||
end;
|
||||
@ -9822,7 +9834,7 @@ begin
|
||||
'InitParserOpts': InitialFlags.ParserOptions:=ReadParserOptions(Obj,nil,aName,PCUDefaultParserOptions);
|
||||
'InitModeSwitches': InitialFlags.ModeSwitches:=ReadModeSwitches(Obj,nil,aName,PCUDefaultModeSwitches);
|
||||
'InitBoolSwitches': InitialFlags.BoolSwitches:=ReadBoolSwitches(Obj,nil,aName,PCUDefaultBoolSwitches);
|
||||
'InitConverterOpts': InitialFlags.ConverterOptions:=ReadConverterOptions(Obj,nil,aName,PCUDefaultConverterOptions-[coStoreImplJS]);
|
||||
'InitConverterOpts': InitialFlags.ConverterOptions:=ReadConverterOptions(Obj,nil,aName,PCUDefaultConverterOptions);
|
||||
'FinalParserOpts': Parser.Options:=ReadParserOptions(Obj,nil,aName,InitialFlags.ParserOptions);
|
||||
'FinalModeSwitches': Scanner.CurrentModeSwitches:=ReadModeSwitches(Obj,nil,aName,InitialFlags.ModeSwitches);
|
||||
'FinalBoolSwitches': Scanner.CurrentBoolSwitches:=ReadBoolSwitches(Obj,nil,aName,InitialFlags.BoolSwitches);
|
||||
|
@ -169,7 +169,7 @@ begin
|
||||
PrecompileInitialFlags.ParserOptions:=MyFile.Parser.Options;
|
||||
PrecompileInitialFlags.ModeSwitches:=MyFile.Scanner.CurrentModeSwitches;
|
||||
PrecompileInitialFlags.BoolSwitches:=MyFile.Scanner.CurrentBoolSwitches;
|
||||
PrecompileInitialFlags.ConverterOptions:=MyFile.GetInitialConverterOptions;
|
||||
PrecompileInitialFlags.ConverterOptions:=MyFile.GetInitialConverterOptions+PCUMinConverterOptions;
|
||||
PrecompileInitialFlags.TargetPlatform:=Compiler.TargetPlatform;
|
||||
PrecompileInitialFlags.TargetProcessor:=Compiler.TargetProcessor;
|
||||
end;
|
||||
@ -315,17 +315,16 @@ begin
|
||||
|
||||
// create JavaScript for procs, initialization, finalization
|
||||
MyFile.CreateConverter;
|
||||
MyFile.Converter.Options:=MyFile.Converter.Options+[coStoreImplJS];
|
||||
MyFile.Converter.Options:=MyFile.Converter.Options+PCUMinConverterOptions;
|
||||
MyFile.Converter.OnIsElementUsed:=@OnPCUConverterIsElementUsed;
|
||||
MyFile.Converter.OnIsTypeInfoUsed:=@OnPCUConverterIsTypeInfoUsed;
|
||||
JS:=MyFile.Converter.ConvertPasElement(MyFile.PasModule,MyFile.PascalResolver);
|
||||
MyFile.Converter.Options:=MyFile.Converter.Options-[coStoreImplJS];
|
||||
MyFile.PCUSupport.SetInitialCompileFlags;
|
||||
{$IFDEF REALLYVERBOSE}
|
||||
writeln('TPas2jsCompilerFile.WritePCU create pcu ... ',MyFile.PCUFilename);
|
||||
{$ENDIF}
|
||||
Writer.WritePCU(MyFile.PascalResolver,MyFile.Converter,
|
||||
PrecompileInitialFlags,ms,AllowCompressed);
|
||||
PrecompileInitialFlags,ms,AllowCompressed);
|
||||
{$IFDEF REALLYVERBOSE}
|
||||
writeln('TPas2jsCompilerFile.WritePCU precompiled ',MyFile.PCUFilename);
|
||||
{$ENDIF}
|
||||
|
@ -61,6 +61,7 @@ type
|
||||
procedure TestOptShortRefGlobals_Unit_FromIntfImpl_ToIntfImpl;
|
||||
procedure TestOptShortRefGlobals_Property;
|
||||
procedure TestOptShortRefGlobals_ExternalAbstract;
|
||||
procedure TestOptShortRefGlobals_Class;
|
||||
procedure TestOptShortRefGlobals_GenericFunction;
|
||||
procedure TestOptShortRefGlobals_GenericMethod_Call;
|
||||
procedure TestOptShortRefGlobals_GenericStaticMethod_Call;
|
||||
@ -551,6 +552,77 @@ begin
|
||||
'']));
|
||||
end;
|
||||
|
||||
procedure TTestOptimizations.TestOptShortRefGlobals_Class;
|
||||
begin
|
||||
AddModuleWithIntfImplSrc('UnitA.pas',
|
||||
LinesToStr([
|
||||
'type',
|
||||
' TBird = class',
|
||||
' end;',
|
||||
'']),
|
||||
LinesToStr([
|
||||
'']));
|
||||
StartUnit(true,[supTObject]);
|
||||
Add([
|
||||
'{$optimization JSShortRefGlobals}',
|
||||
'interface',
|
||||
'uses unita;',
|
||||
'type',
|
||||
' TEagle = class(TBird)',
|
||||
' Size: TBird;',
|
||||
' class var Color: TBird;',
|
||||
' procedure Fly;',
|
||||
' class procedure Run;',
|
||||
' end;',
|
||||
'implementation',
|
||||
'procedure TEagle.Fly;',
|
||||
'begin',
|
||||
' Size:=Size;',
|
||||
' Self.Size:=Self.Size;',
|
||||
' Color:=Color;',
|
||||
' Self.Color:=Self.Color;',
|
||||
'end;',
|
||||
'class procedure TEagle.Run;',
|
||||
'begin',
|
||||
' Color:=Color;',
|
||||
' Self.Color:=Self.Color;',
|
||||
'end;',
|
||||
'']);
|
||||
ConvertUnit;
|
||||
CheckSource('TestOptShortRefGlobals_Class',
|
||||
LinesToStr([
|
||||
'var $lt = null;',
|
||||
'var $lm = pas.UnitA;',
|
||||
'var $lt1 = $lm.TBird;',
|
||||
'rtl.createClass(this, "TEagle", $lt1, function () {',
|
||||
' $lt = this;',
|
||||
' this.Color = null;',
|
||||
' this.$init = function () {',
|
||||
' $lt1.$init.call(this);',
|
||||
' this.Size = null;',
|
||||
' };',
|
||||
' this.$final = function () {',
|
||||
' this.Size = undefined;',
|
||||
' $lt1.$final.call(this);',
|
||||
' };',
|
||||
' this.Fly = function () {',
|
||||
' this.Size = this.Size;',
|
||||
' this.Size = this.Size;',
|
||||
' $lt.Color = this.Color;',
|
||||
' $lt.Color = this.Color;',
|
||||
' };',
|
||||
' this.Run = function () {',
|
||||
' $lt.Color = this.Color;',
|
||||
' $lt.Color = this.Color;',
|
||||
' };',
|
||||
'});',
|
||||
'']),
|
||||
LinesToStr([
|
||||
'']),
|
||||
LinesToStr([
|
||||
'']));
|
||||
end;
|
||||
|
||||
procedure TTestOptimizations.TestOptShortRefGlobals_GenericFunction;
|
||||
begin
|
||||
AddModuleWithIntfImplSrc('UnitA.pas',
|
||||
|
@ -394,6 +394,7 @@ begin
|
||||
aFile.Attr:=faNormal;
|
||||
aFile.Age:=DateTimeToFileDate(CurDate);
|
||||
writeln('TCustomTestCLI.OnWriteFile ',aFile.Filename,' Found=',FindFile(aFilename)<>nil,' "',LeftStr(aFile.Source,50),'" ');
|
||||
//writeln('TCustomTestCLI.OnWriteFile ',aFile.Source);
|
||||
end;
|
||||
|
||||
procedure TCustomTestCLI.WriteSources;
|
||||
|
Loading…
Reference in New Issue
Block a user