From f3579bf5267eb818260876497c3cd452388e35ec Mon Sep 17 00:00:00 2001 From: Mattias Gaertner Date: Sun, 6 Sep 2020 09:06:03 +0000 Subject: [PATCH 01/12] fcl-passrc: resolver specialize name with params git-svn-id: trunk@46786 - --- packages/fcl-passrc/src/pasresolver.pp | 204 ++++++++++++++---- .../fcl-passrc/tests/tcresolvegenerics.pas | 26 ++- 2 files changed, 182 insertions(+), 48 deletions(-) diff --git a/packages/fcl-passrc/src/pasresolver.pp b/packages/fcl-passrc/src/pasresolver.pp index fbce70bd06..4032cc406f 100644 --- a/packages/fcl-passrc/src/pasresolver.pp +++ b/packages/fcl-passrc/src/pasresolver.pp @@ -1791,7 +1791,7 @@ type function GetTVarRec(El: TPasArrayType): TPasRecordType; virtual; function FindDefaultConstructor(aClass: TPasClassType): TPasConstructor; virtual; function GetTypeInfoParamType(Param: TPasExpr; - out ParamResolved: TPasResolverResult; LoType: boolean): TPasType; virtual; + out ParamResolved: TPasResolverResult; LoType: boolean): TPasType; virtual; // returns type of param in typeinfo(param) protected // constant evaluation fExprEvaluator: TResExprEvaluator; @@ -1840,8 +1840,7 @@ type GenTempl: TPasGenericTemplateType; ErrorPos: TPasElement); function CreateSpecializedItem(El: TPasElement; GenericEl: TPasElement; const ParamsResolved: TPasTypeArray): TPRSpecializedItem; virtual; - function CreateSpecializedTypeName(SpecializedItems: TObjectList; - Item: TPRSpecializedItem): string; virtual; + function CreateSpecializedTypeName(Item: TPRSpecializedItem): string; virtual; procedure InitSpecializeScopes(El: TPasElement; out State: TScopeStashState); virtual; procedure RestoreSpecializeScopes(const State: TScopeStashState); virtual; procedure SpecializeGenericIntf(SpecializedItem: TPRSpecializedItem); virtual; @@ -2473,8 +2472,11 @@ function ProcNeedsBody(Proc: TPasProcedure): boolean; function ProcHasGroupOverload(Proc: TPasProcedure): boolean; procedure ClearHelperList(var List: TPRHelperEntryArray); function ChompDottedIdentifier(const Identifier: string): string; -function FirstDottedIdentifier(const Identifier: string): string; +function FirstDottedIdentifier(const Identifier: string): string; // without <> +function LastDottedIdentifier(const Identifier: string): string; // without <> function IsDottedIdentifierPrefix(const Prefix, Identifier: string): boolean; +function GetFirstDotPos(const Identifier: string): integer; +function GetLastDotPos(const Identifier: string): integer; {$IF FPC_FULLVERSION<30101} function IsValidIdent(const Ident: string; AllowDots: Boolean = False; StrictDots: Boolean = False): Boolean; {$ENDIF} @@ -2943,14 +2945,18 @@ end; function ChompDottedIdentifier(const Identifier: string): string; var - p: Integer; + p, Lvl: Integer; begin Result:=Identifier; p:=length(Identifier); + Lvl:=0; while (p>0) do begin - if Identifier[p]='.' then - break; + case Identifier[p] of + '.': if Lvl=0 then break; + '>': inc(Lvl); + '<': dec(Lvl); + end; dec(p); end; Result:=LeftStr(Identifier,p-1); @@ -2958,13 +2964,41 @@ end; function FirstDottedIdentifier(const Identifier: string): string; var - p: SizeInt; + p, l: SizeInt; begin - p:=Pos('.',Identifier); - if p<1 then - Result:=Identifier - else - Result:=LeftStr(Identifier,p-1); + p:=1; + l:=length(Identifier); + repeat + if p>l then + exit(Identifier) + else if Identifier[p] in ['<','.'] then + exit(LeftStr(Identifier,p-1)) + else + inc(p); + until false; +end; + +function LastDottedIdentifier(const Identifier: string): string; +var + p, Lvl, EndP: Integer; +begin + p:=length(Identifier); + EndP:=p; + Lvl:=0; + while (p>0) do + begin + case Identifier[p] of + '.': if Lvl=0 then break; + '>': inc(Lvl); + '<': + begin + dec(Lvl); + EndP:=p-1; + end; + end; + dec(p); + end; + Result:=copy(Identifier,p+1,EndP-p); end; function IsDottedIdentifierPrefix(const Prefix, Identifier: string): boolean; @@ -2978,6 +3012,43 @@ begin Result:=(length(Identifier)=l) or (Identifier[l+1]='.'); end; +function GetFirstDotPos(const Identifier: string): integer; +var + l: SizeInt; + Lvl: Integer; +begin + Result:=1; + l:=length(Identifier); + Lvl:=0; + repeat + if Result>l then + exit(-1); + case Identifier[Result] of + '.': if Lvl=0 then exit; + '<': inc(Lvl); + '>': dec(Lvl); + end; + inc(Result); + until false; +end; + +function GetLastDotPos(const Identifier: string): integer; +var + Lvl: Integer; +begin + Result:=length(Identifier); + Lvl:=0; + while (Result>0) do + begin + case Identifier[Result] of + '.': if Lvl=0 then exit; + '>': inc(Lvl); + '<': dec(Lvl); + end; + dec(Result); + end; +end; + function DotExprToName(Expr: TPasExpr): string; var C: TClass; @@ -6931,7 +7002,7 @@ begin RaiseMsg(20181231150404,nXCannotHaveParameters,sXCannotHaveParameters,[GetElementTypeName(Proc)],Proc); end; - HasDots:=Pos('.',ProcName)>1; + HasDots:=GetFirstDotPos(ProcName)>0; if Proc.Parent is TPasClassType then begin @@ -7309,7 +7380,6 @@ var DeclProc: TPasProcedure; ClassOrRecScope: TPasClassOrRecordScope; SelfArg: TPasArgument; - p: Integer; SelfType, LoSelfType: TPasType; LastNamePart: TProcedureNamePart; begin @@ -7336,11 +7406,7 @@ begin else begin // remove path from ProcName - repeat - p:=Pos('.',ProcName); - if p<1 then break; - Delete(ProcName,1,p); - until false; + ProcName:=LastDottedIdentifier(ProcName); end; if ImplProcScope.DeclarationProc=nil then @@ -12412,7 +12478,7 @@ begin // Note: El.ProcType is nil ! It is parsed later. - HasDot:=Pos('.',ProcName)>1; + HasDot:=GetFirstDotPos(ProcName)>1; if (TypeParams<>nil) then if HasDot<>(TypeParams.Count>1) then RaiseNotYetImplemented(20190818093923,El); @@ -12485,14 +12551,14 @@ begin Level:=0; repeat inc(Level); - p:=Pos('.',ProcName); + p:=GetFirstDotPos(ProcName); if p<1 then begin if ClassOrRecType=nil then RaiseInternalError(20161013170829); break; end; - aClassName:=LeftStr(ProcName,p-1); + aClassName:=FirstDottedIdentifier(ProcName); Delete(ProcName,1,p); TypeParamCount:=0; if TypeParams<>nil then @@ -16503,7 +16569,7 @@ var begin // insert in front of currently parsed elements // beware: specializing an element can create other specialized elements - // add behind last specialized element of this GenericEl + // add behind last finished specialized element of this GenericEl // for example: A = class(B>) // => // D @@ -16548,15 +16614,6 @@ var else break; end; - - //if i<0 then - // begin - // {$IF defined(VerbosePasResolver) or defined(VerbosePas2JS)} - // writeln('InsertBehind Generic=',GetObjName(GenericEl),' Last=',GetObjName(Last)); - // //for i:=0 to List.Count-1 do writeln(' ',GetObjName(TObject(List[i]))); - // {$ENDIF} - // i:=List.Count-1; - // end; List.Insert(i+1,NewEl); end; @@ -16571,8 +16628,6 @@ var ProcItem: TPRSpecializedProcItem; begin Result:=nil; - if Pos('$G',GenericEl.Name)>0 then - RaiseNotYetImplemented(20190813003729,El); SrcModule:=GenericEl.GetModule; SrcModuleScope:=SrcModule.CustomData as TPasModuleScope; @@ -16602,7 +16657,7 @@ begin Result.Params:=ParamsResolved; Result.Index:=SpecializedItems.Count; SpecializedItems.Add(Result); - NewName:=CreateSpecializedTypeName(SpecializedItems,Result); + NewName:=CreateSpecializedTypeName(Result); NewClass:=TPTreeElement(GenericEl.ClassType); NewParent:=GenericEl.Parent; NewEl:=TPasElement(NewClass.Create(NewName,NewParent)); @@ -16631,10 +16686,66 @@ begin SpecializeGenericImpl(Result); end; -function TPasResolver.CreateSpecializedTypeName(SpecializedItems: TObjectList; - Item: TPRSpecializedItem): string; +function TPasResolver.CreateSpecializedTypeName(Item: TPRSpecializedItem): string; + + function GetTypeName(aType: TPasType): string; forward; + + function GetSpecParams(Item: TPRSpecializedItem): string; + var + i: Integer; + begin + Result:='<'; + for i:=0 to length(Item.Params)-1 do + begin + if i>0 then Result:=Result+','; + Result:=Result+GetTypeName(Item.Params[i]); + end; + Result:=Result+'>'; + end; + + function GetTypeName(aType: TPasType): string; + var + Arr: TPasArrayType; + ElType: TPasType; + ChildItem: TPRSpecializedItem; + begin + if aType.Name='' then + begin + if aType is TPasArrayType then + begin + // e.g. TBird + Result:='array of '; + Arr:=TPasArrayType(aType); + if length(Arr.Ranges)>0 then + RaiseNotYetImplemented(20200905173026,Item.FirstSpecialize); + ElType:=ResolveAliasType(Arr.ElType,false); + if ElType is TPasArrayType then + RaiseNotYetImplemented(20200905173159,Arr,'multidimensional anonymous array as generic param'); + Result:=Result+GetTypeName(ElType); + end + else + RaiseNotYetImplemented(20200905173241,aType); + end + else + begin + if aType.Parent is TPasType then + Result:=GetTypeName(TPasType(aType.Parent)) + else if aType is TPasUnresolvedSymbolRef then + Result:='System' + else + Result:=aType.GetModule.Name; + Result:=Result+'.'+aType.Name; + if aType.CustomData is TPasGenericScope then + begin + ChildItem:=TPasGenericScope(aType.CustomData).SpecializedFromItem; + if ChildItem<>nil then + Result:=Result+GetSpecParams(ChildItem); + end; + end; + end; + begin - Result:=Item.GenericEl.Name+'$G'+IntToStr(SpecializedItems.Count); + Result:=Item.GenericEl.Name+GetSpecParams(Item); end; procedure TPasResolver.InitSpecializeScopes(El: TPasElement; out @@ -17063,12 +17174,11 @@ begin if SpecClassOrRecScope=nil then RaiseNotYetImplemented(20190921221839,SpecDeclProc); NewImplProcName:=GenImplProc.Name; - p:=length(NewImplProcName); - while (p>0) and (NewImplProcName[p]<>'.') do dec(p); - if p=0 then + LastDotP:=GetLastDotPos(NewImplProcName); + if LastDotP<1 then RaiseNotYetImplemented(20190921221730,GenImplProc); // has classname -> replace generic classname with specialized classname - LastDotP:=p; + p:=LastDotP; while (p>1) and (NewImplProcName[p-1]<>'.') do dec(p); OldClassname:=copy(NewImplProcName,p,LastDotP-p); GenClassOrRec:=GenDeclProc.Parent as TPasMembersType; @@ -17080,8 +17190,7 @@ begin begin // use classname of GenImplProc and name of SpecDeclProc OldClassname:=GenImplProc.Name; - p:=length(OldClassname); - while (p>0) and (OldClassname[p]<>'.') do dec(p); + p:=GetLastDotPos(OldClassname); if p>0 then NewImplProcName:=LeftStr(OldClassname,p)+SpecDeclProc.Name else @@ -25384,12 +25493,14 @@ function TPasResolver.GetTypeDescription(aType: TPasType; AddPath: boolean): str begin i:=GetTypeParameterCount(TPasGenericType(aType)); if i>0 then + // generic, not specialized Result:=Result+GetGenericParamCommas(GetTypeParameterCount(TPasGenericType(aType))) else if aType.CustomData is TPasGenericScope then begin GenScope:=TPasGenericScope(aType.CustomData); - if GenScope.SpecializedFromItem<>nil then + if (GenScope.SpecializedFromItem<>nil) and IsValidIdent(aType.Name) then begin + // specialized without params in name -> append params Params:=GenScope.SpecializedFromItem.Params; Result:=Result+'<'; for i:=0 to length(Params)-1 do @@ -29527,6 +29638,7 @@ function TPasResolver.CheckClassIsClass(SrcType, DestType: TPasType): integer; // check if Src is equal or descends from Dest // Generics: TBird is both directions a TBird // and TBird> is both directions a TBird> +// but a TBird is not a TBird function CheckSpecialized(SrcScope, DestScope: TPasGenericScope): boolean; var diff --git a/packages/fcl-passrc/tests/tcresolvegenerics.pas b/packages/fcl-passrc/tests/tcresolvegenerics.pas index d87a81066e..9e5f7a8b19 100644 --- a/packages/fcl-passrc/tests/tcresolvegenerics.pas +++ b/packages/fcl-passrc/tests/tcresolvegenerics.pas @@ -5,7 +5,8 @@ unit tcresolvegenerics; interface uses - Classes, SysUtils, testregistry, tcresolver, PasResolveEval, PParser; + Classes, SysUtils, testregistry, tcresolver, PasResolveEval, PParser, + PScanner; type @@ -91,7 +92,8 @@ type procedure TestGen_Class_MemberTypeConstructor; procedure TestGen_Class_AliasMemberType; procedure TestGen_Class_AccessGenericMemberTypeFail; - procedure TestGen_Class_ReferenceTo; // ToDo + procedure TestGen_Class_ReferenceTo; + procedure TestGen_Class_TwoSpecsAreNotRelatedWarn; procedure TestGen_Class_List; // ToDo: different modeswitches at parse time and specialize time @@ -1568,6 +1570,26 @@ begin ParseProgram; end; +procedure TTestResolveGenerics.TestGen_Class_TwoSpecsAreNotRelatedWarn; +begin + StartProgram(false); + Add([ + '{$mode delphi}', + 'type', + ' TObject = class end;', + ' TBird = class F: T; end;', + ' TBirdWord = TBird;', + ' TBirdChar = TBird;', + 'var', + ' w: TBirdWord;', + ' c: TBirdChar;', + 'begin', + ' w:=TBirdWord(c);', + '']); + ParseProgram; + CheckResolverHint(mtWarning,nClassTypesAreNotRelatedXY,'Class types "TBird" and "TBird" are not related'); +end; + procedure TTestResolveGenerics.TestGen_Class_List; begin StartProgram(false); From 43aa4c6b40035ec56b8085a377f4793261ff8200 Mon Sep 17 00:00:00 2001 From: Mattias Gaertner Date: Sun, 6 Sep 2020 09:06:30 +0000 Subject: [PATCH 02/12] pastojs: override specialize name git-svn-id: trunk@46787 - --- packages/pastojs/src/fppas2js.pp | 6 ++++++ packages/pastojs/tests/tcgenerics.pas | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/packages/pastojs/src/fppas2js.pp b/packages/pastojs/src/fppas2js.pp index a45ce21492..b2a99c48f1 100644 --- a/packages/pastojs/src/fppas2js.pp +++ b/packages/pastojs/src/fppas2js.pp @@ -1512,6 +1512,7 @@ type function GenerateGUID(El: TPasClassType): string; virtual; protected // generic/specialize + function CreateSpecializedTypeName(Item: TPRSpecializedItem): string; override; procedure SpecializeGenericIntf(SpecializedItem: TPRSpecializedItem); override; procedure SpecializeGenericImpl(SpecializedItem: TPRSpecializedItem); @@ -4976,6 +4977,11 @@ begin Result:=Result+'}'; end; +function TPas2JSResolver.CreateSpecializedTypeName(Item: TPRSpecializedItem): string; +begin + Result:=Item.GenericEl.Name+'$G'+IntToStr(Item.Index+1); +end; + procedure TPas2JSResolver.SpecializeGenericIntf( SpecializedItem: TPRSpecializedItem); {$IFDEF EnableLongNames} diff --git a/packages/pastojs/tests/tcgenerics.pas b/packages/pastojs/tests/tcgenerics.pas index 6186b5ecba..e28ae24e61 100644 --- a/packages/pastojs/tests/tcgenerics.pas +++ b/packages/pastojs/tests/tcgenerics.pas @@ -870,7 +870,7 @@ begin LinesToStr([ // $mod.$main '$mod.w = $mod.c;', ''])); - CheckHint(mtWarning,nClassTypesAreNotRelatedXY,'Class types "TBird$G2" and "TBird$G1" are not related'); + CheckHint(mtWarning,nClassTypesAreNotRelatedXY,'Class types "TBird$G2" and "TBird$G1" are not related'); CheckResolverUnexpectedHints(); end; From 323b3b5d2bced1ca83ef5be27868e53b5ba28cae Mon Sep 17 00:00:00 2001 From: florian Date: Sun, 6 Sep 2020 20:23:22 +0000 Subject: [PATCH 03/12] + create directory for C objects if needed git-svn-id: trunk@46788 - --- tests/Makefile.fpc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/Makefile.fpc b/tests/Makefile.fpc index d38a4ec7f5..0aa46b42c2 100644 --- a/tests/Makefile.fpc +++ b/tests/Makefile.fpc @@ -255,6 +255,7 @@ TASM_OBJECTS=$(addprefix $(C_OBJECTS_DIR)/, $(subst .asm,.obj, $(TASM_SOURCES))) create_c_objects: ifneq ($(TEST_CCOMPILER),) + $(MKDIRTREE) $(C_OBJECTS_DIR) -$(COPY) $(addprefix $(C_SOURCE_DIR)/, $(C_SOURCES)) $(C_OBJECTS_DIR) $(MAKE) $(C_OBJECTS) -$(COPY) $(addprefix $(C_SOURCE_DIR)/, $(CPP_SOURCES)) $(C_OBJECTS_DIR) @@ -278,7 +279,7 @@ $(C_OBJECTS) : %.o: %.c $(CPP_OBJECTS) : %.o: %.cpp $(TEST_CCOMPILER) -c $(TEST_CFLAGS) $< -o $@ - + copyfiles: -$(MKDIRTREE) $(TEST_OUTPUTDIR)/test/cg -$(COPY) $(C_OBJECTS) $(TEST_OUTPUTDIR)/test/cg @@ -460,7 +461,7 @@ test_c_objects: testprep $(MAKE) $(patsubst %.pp,%.elg, $(wildcard test/cg/cdecl/tcalext*.pp)) $(MAKE) $(patsubst %.pp,%.log, $(wildcard test/cg/cdecl/tcppcl*.pp)) $(MAKE) $(patsubst %.pp,%.elg, $(wildcard test/cg/cdecl/tcppcl*.pp)) - + ################################ # Compile and Run tests # From 02df6283998d2b90f4f4ab94c8068f24f3159031 Mon Sep 17 00:00:00 2001 From: florian Date: Sun, 6 Sep 2020 20:23:23 +0000 Subject: [PATCH 04/12] * regenerated git-svn-id: trunk@46789 - --- tests/Makefile | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tests/Makefile b/tests/Makefile index e06159878b..22ebab8cd5 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -2,7 +2,7 @@ # Don't edit, this file is generated by FPCMake Version 2.0.0 # default: allexectests -MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian i386-nativent i386-iphonesim i386-android i386-aros m68k-linux m68k-netbsd m68k-amiga m68k-atari m68k-palmos m68k-macosclassic m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macosclassic powerpc-darwin powerpc-morphos powerpc-embedded powerpc-wii powerpc-aix sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-haiku x86_64-netbsd x86_64-solaris x86_64-openbsd x86_64-darwin x86_64-win64 x86_64-embedded x86_64-iphonesim x86_64-android x86_64-aros x86_64-dragonfly arm-linux arm-netbsd arm-palmos arm-wince arm-gba arm-nds arm-embedded arm-symbian arm-android arm-aros arm-freertos arm-ios powerpc64-linux powerpc64-darwin powerpc64-embedded powerpc64-aix avr-embedded armeb-linux armeb-embedded mips-linux mipsel-linux mipsel-embedded mipsel-android mips64el-linux jvm-java jvm-android i8086-embedded i8086-msdos i8086-win16 aarch64-linux aarch64-darwin aarch64-win64 aarch64-android aarch64-ios wasm-wasm sparc64-linux riscv32-linux riscv32-embedded riscv64-linux riscv64-embedded xtensa-linux xtensa-embedded xtensa-freertos z80-embedded z80-zxspectrum z80-msxdos +MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-haiku i386-netbsd i386-solaris i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian i386-nativent i386-iphonesim i386-android i386-aros m68k-linux m68k-netbsd m68k-amiga m68k-atari m68k-palmos m68k-macosclassic m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macosclassic powerpc-darwin powerpc-morphos powerpc-embedded powerpc-wii powerpc-aix sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-haiku x86_64-netbsd x86_64-solaris x86_64-openbsd x86_64-darwin x86_64-win64 x86_64-embedded x86_64-iphonesim x86_64-android x86_64-aros x86_64-dragonfly arm-linux arm-netbsd arm-palmos arm-wince arm-gba arm-nds arm-embedded arm-symbian arm-android arm-aros arm-freertos arm-ios powerpc64-linux powerpc64-darwin powerpc64-embedded powerpc64-aix avr-embedded armeb-linux armeb-embedded mips-linux mipsel-linux mipsel-embedded mipsel-android mips64el-linux jvm-java jvm-android i8086-embedded i8086-msdos i8086-win16 aarch64-linux aarch64-darwin aarch64-win64 aarch64-android aarch64-ios wasm-wasm sparc64-linux riscv32-linux riscv32-embedded riscv64-linux riscv64-embedded xtensa-linux xtensa-embedded xtensa-freertos z80-embedded z80-zxspectrum z80-msxdos z80-amstradcpc BSDs = freebsd netbsd openbsd darwin dragonfly UNIXs = linux $(BSDs) solaris qnx haiku aix LIMIT83fs = go32v2 os2 emx watcom msdos win16 atari @@ -653,6 +653,9 @@ endif ifeq ($(FULL_TARGET),z80-msxdos) override TARGET_PROGRAMS+=gparmake createlst endif +ifeq ($(FULL_TARGET),z80-amstradcpc) +override TARGET_PROGRAMS+=gparmake createlst +endif override INSTALL_FPCPACKAGE=y ifdef REQUIRE_UNITSDIR override UNITSDIR+=$(REQUIRE_UNITSDIR) @@ -1695,6 +1698,9 @@ endif ifeq ($(FULL_TARGET),z80-msxdos) REQUIRE_PACKAGES_RTL=1 endif +ifeq ($(FULL_TARGET),z80-amstradcpc) +REQUIRE_PACKAGES_RTL=1 +endif ifdef REQUIRE_PACKAGES_RTL PACKAGEDIR_RTL:=$(firstword $(subst /Makefile.fpc,,$(strip $(wildcard $(addsuffix /rtl/Makefile.fpc,$(PACKAGESDIR)))))) ifneq ($(PACKAGEDIR_RTL),) @@ -2452,6 +2458,7 @@ CPP_OBJECTS=$(addprefix $(C_OBJECTS_DIR)/, $(subst .cpp,.o, $(CPP_SOURCES))) TASM_OBJECTS=$(addprefix $(C_OBJECTS_DIR)/, $(subst .asm,.obj, $(TASM_SOURCES))) create_c_objects: ifneq ($(TEST_CCOMPILER),) + $(MKDIRTREE) $(C_OBJECTS_DIR) -$(COPY) $(addprefix $(C_SOURCE_DIR)/, $(C_SOURCES)) $(C_OBJECTS_DIR) $(MAKE) $(C_OBJECTS) -$(COPY) $(addprefix $(C_SOURCE_DIR)/, $(CPP_SOURCES)) $(C_OBJECTS_DIR) From cdf1f710e58de512d1e3504b5cd61b66cfebc49b Mon Sep 17 00:00:00 2001 From: florian Date: Sun, 6 Sep 2020 20:23:25 +0000 Subject: [PATCH 05/12] + C objects for for xtensa-freertos with call0 abi, build with: make create_c_objects TEST_CCOMPILER=xtensa-lx106-elf-gcc TEST_ABI=call0 TEST_FPC=fpc TEST_CPU_TARGET=xtensa TEST_OS_TARGET=freertos "TEST_CFLAGS=-O3 -mlongcalls" using xtensa-lx106-elf-gcc (crosstool-NG crosstool-ng-1.22.0-100-ge567ec7) 5.2.0 git-svn-id: trunk@46790 - --- .gitattributes | 7 +++++++ .../test/cg/obj/freertos/xtensa-call0/cpptcl1.o | Bin 0 -> 3228 bytes .../test/cg/obj/freertos/xtensa-call0/cpptcl2.o | Bin 0 -> 1040 bytes tests/test/cg/obj/freertos/xtensa-call0/ctest.o | Bin 0 -> 8824 bytes .../test/cg/obj/freertos/xtensa-call0/tcext3.o | Bin 0 -> 5976 bytes .../test/cg/obj/freertos/xtensa-call0/tcext4.o | Bin 0 -> 7276 bytes .../test/cg/obj/freertos/xtensa-call0/tcext5.o | Bin 0 -> 12056 bytes .../test/cg/obj/freertos/xtensa-call0/tcext6.o | Bin 0 -> 15084 bytes 8 files changed, 7 insertions(+) create mode 100644 tests/test/cg/obj/freertos/xtensa-call0/cpptcl1.o create mode 100644 tests/test/cg/obj/freertos/xtensa-call0/cpptcl2.o create mode 100644 tests/test/cg/obj/freertos/xtensa-call0/ctest.o create mode 100644 tests/test/cg/obj/freertos/xtensa-call0/tcext3.o create mode 100644 tests/test/cg/obj/freertos/xtensa-call0/tcext4.o create mode 100644 tests/test/cg/obj/freertos/xtensa-call0/tcext5.o create mode 100644 tests/test/cg/obj/freertos/xtensa-call0/tcext6.o diff --git a/.gitattributes b/.gitattributes index 6bd306a525..9c0b4d0e51 100644 --- a/.gitattributes +++ b/.gitattributes @@ -13522,6 +13522,13 @@ tests/test/cg/obj/freebsd/x86_64/tcext3.o -text tests/test/cg/obj/freebsd/x86_64/tcext4.o -text tests/test/cg/obj/freebsd/x86_64/tcext5.o -text tests/test/cg/obj/freebsd/x86_64/tcext6.o -text +tests/test/cg/obj/freertos/xtensa-call0/cpptcl1.o -text +tests/test/cg/obj/freertos/xtensa-call0/cpptcl2.o -text +tests/test/cg/obj/freertos/xtensa-call0/ctest.o -text +tests/test/cg/obj/freertos/xtensa-call0/tcext3.o -text +tests/test/cg/obj/freertos/xtensa-call0/tcext4.o -text +tests/test/cg/obj/freertos/xtensa-call0/tcext5.o -text +tests/test/cg/obj/freertos/xtensa-call0/tcext6.o -text tests/test/cg/obj/freertos/xtensa-windowed/cpptcl1.o -text tests/test/cg/obj/freertos/xtensa-windowed/cpptcl2.o -text tests/test/cg/obj/freertos/xtensa-windowed/ctest.o -text diff --git a/tests/test/cg/obj/freertos/xtensa-call0/cpptcl1.o b/tests/test/cg/obj/freertos/xtensa-call0/cpptcl1.o new file mode 100644 index 0000000000000000000000000000000000000000..7cf72cb340cd89b158f5d79f38cb1e2f7b339058 GIT binary patch literal 3228 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 literal 0 HcmV?d00001 diff --git a/tests/test/cg/obj/freertos/xtensa-call0/tcext3.o b/tests/test/cg/obj/freertos/xtensa-call0/tcext3.o new file mode 100644 index 0000000000000000000000000000000000000000..819db0a95bed326a02764c88ab095bf9f21eb01a GIT binary patch literal 5976 zcmcJSTWlOx8OP7WZsLS(lnHTSNN6@|yIw~2va{=3R;}3B>#VbK+O03xHKD#=vWjD~ zyQr?I)FG*$6%kl8LVd`Ck*HJuAvn_P`F-E{pYL4eTxMVC8#rlMmNLmwFQ|&8)M`CSYLsgC1yL1JyOo!);!!vL zN%!$Br4n{LTwyO_hfx%Fo#g%-TWvM_Z|n<_<)*fqJ6ISkK_?KH7f)Tz%Vb_{N)RA;Kg zG>ekwU8l^_hHRG=svERIj|x~_$KIKmSABLm{BJuE)M;WnhqCD3u0hl}sYdMlq+6Iy zXTAIcN?JO16gO1D+B=@%OTd_(%w_R%LiG!%^BCsKbUfFCh@pcm?U=^#WLvG7$T4g2 zSifDEiz3=+C)yc1;bg`?mCJTN7do`i0Y`Ky)$Yuty26;MKoYU{=6V%YMc$<{{0S8J z(uDPdV>;3tbfog)9^aB{49o~vSJf+rWj!_uu=3JaAid#kmoG=IJ+H@7gSMBTAV0<^ z;~7ND^**qiv~Jpl2-5M))bankj*BfGOzug%-59;xT>`CO2e81~7RR_Vg@CGe4ZF@y~ za*^{=7+G0$gIyHn5GxiGd2quG3nz7rQ#&lJu{`+{th=(njN67zCTz}F$ z#7$x*)Uch3cn^(V^ylG%jqzhD3JczAu2LSNqnD$Dxhdcri=E0k_oEE1M za@B4-^Yk>?g(T{vB3L_KhlNS+cU1@1rqkq&*iIuy_`uRs-v702XEq*1U)YC2Pp*;c z37h=By>Y=(McezDjWJ_nYpd&Ty52>OeeI>SqI!d4UMqSR?RDf4h&a-+1ndpK4|PthK0>`E+|C%-n`{BPX-flm-jC zO{M(kBg(^%C_na)@@#K!Djc0DE|*H><>hm2&t$_DBqGHxbQy(=1orhbHYC? z{AY##9Qb2+sDEAfFKHkBUlIOwu!;W`csHI1p6}ve;#jUCH=3JZqxm@nNYrd1=hztk z9-fcjVH|#;82ujoed5m#cpu8CKO!{ELK6ksT5}w1V&e4Mj`?Y!KO^)@LjOgf|Ekch z3;j31d@tJ$6|c&FCPf|=MZ*{rK&;a>rpb@gT8zXWbXUAn#}{8zyU=lkynKRK@bb@+T_V!PyS zFr{hXC#SXF6Mk}^_TLo#Tj0~$UtbGAV*Cd12$=DggntG68SVd>@Na_Gv_Hp6Vs2>K`fvGzG$d8cWx?Ho?9)e*z8n!O2wv2B^8@lURs(v58tYPgvHMC z2#fjJ)pBg5xV*x!_a(hXeP6Bm^FL)_&3*qO_!mOIJuRwH`YmkRdX~3sJ(_KMmojH2 z7w&$<=f*b&B<+K+&A~|f2yAm8(&h^>2O({|H)Re$+A-MX;G@mD=D?$!g1wIC2|TpZ z$gc`J3*N*-9m}6V9>OGXW76ir#@9m{4Q)RCfc7x&clFx zq`ivVY-HLOV4Dq0n|(JMm-g3Tn+;2Q1Gd?yw7(78Y*5(9DZ-Q!_8lKWOF!S&Meq7B9kj&AbR(H1i@%Yvx7xyk=g6XR$U|mk0Fg znt2d^OEVALpJ?X6%49*$6vAVeXN=({!EwPnXN;y_FwYy~pA^hJZT#HVhF=xTv&ZU4yif2E!BN5Og1HV&-2uU4f_Z)$4bN`F zFAIK6@MXapg1;m9hk}1BcvJAZg6|3bt6*N)ravLU4T75l#|1wnxL@$F;7P&f1g{Ey zRq(ptD}vt^d`<9m!M6q95&WLuEy3>#uEVE_nTG>{!-87{cMHx4&I`u&`j1i=DlA9; zBc2ubO=3RuXd|Sb_|Z;I`xef*eYnd}k>5?v xGX|jg4L%oJm+pREWTiQZfDXo3q ztfe90N;-##S|@~pm^8YC#-N!QM*hHrsf#3HGBb=MlE@z{nTknCwglshe!urVr}rt@ zTep**_k7NCpL5Q0&bjA&Z;!XMebKgU%Ou-1;vB*(I9e1~$&u?nrKh~-t= z@p3o5-CezCvECH1Ve*>oc(S-B<_5rU+c=1lPor8y|8< z4#j(Xzjc#!wv$s9iR^3k_SmT@cVtU)XQ~GsO!^(vvV%QA`!2SJi{BnT7|JPO`{+a@ z(pc+F+T$nPk)e2}H;xF_y;2vcnzza#IV*K-9SHh9$i90|y74J@da8HK?|c0#^|q6H z0)5wcCv9)eojw{L^qS^vug5)yN6{0JoRKbhG`z3VS?9I8=Ysh}R~qz0FeduM(sjG> zIrqX@@4LZ#o__`%@4=W2UYDI(a4%el&v>bJw`$(Lghx3)isYPX_I_f|Uv)2hE17oI z&u@2s*?>4-jYOxbz4P|$f_rK@h;z2by%fZmn=Q_~mEv5sHduGWdCsiOB!bE1y4P{t z{W$%#8ONBM0^-D&BX%zz?VEAd^|t#DFo9?|fkfKdGjE4e$PK5^IOvpw6UYlEkm~eg zrGx#=Uug=~M6lMATx+}@oWoqa-5o#9H-rm{{Y~!TCNj_<9&fuJYA)u0c&3BtF`jU8 z(QtC984sHiPA@l{-tzs)3n%yJ{^W<#TmBvutTef0bHjUd(mnMuCWh(Z{NbI*!+Vsh z_gd`4oO|k<@t3^Bb{DVjIXsHK>d)<{JWn+)DcXPvakn{M``vqZl)uG{2~RGaP^JF!elZ8$gS4C|iKZ3?ke9~s-K?6DPP zi_Jl7axM_ttUr#Ni`9rNINHOFojARSEjYhxR$BLE_tB8Q?%znseRPP6d%(Ys4hCz8 z`v|kfDtgiEIeZuS_~Vz&k8#lN(Mu*?}EdYLgdEI-ZexLdMC*w57Xb zKXzoPO+mOJkH%J*Ew)wJV=KxQo0C1Z)rd{DB-xK0aY|%E)`S~^*knh7bG{a_WtE8K z_c-np#M|oF$0|m@yLRqu zEG_S!7)z%!V`GOazr3q7tQBg$6V)05h987>As%bM-GlzT^%hwJDNJ$+qybidfIk(w(Qx_*0C+VYDd%VZSE>KONy2Uum(j0 znI%&J?8PWIA=B<6=OLFN*CR90rvat$*$aLGnLZQ9#(xUTM1QjJKM#Hqnf_OhP1`?! zP1|?COl*4#rD^*C*t9LS!?s%$H-Sw*tzahhL*4}DyoSN1pBb=;;fKn8RoVZj`0rrT z|00-){gXF=+5cnsG5uG7P5&**-mC0KmHmve{}gP-dIQYFv95s4SbqYWu@=E*tU`Qe z8~bLkv2RoMZe{hmvcIkDe^VUE4dX8WoA}8l{;gmWPczuW|Dv)_Df{=7{j##ZrR;Z={a?yng2gob zSAxyBt;*h~?8lV-EEs?OdHDeWiSNKgu$jxRz^2dJU^CVOWq0yJ`_o|KpHTL_%AQg7 zZ!7zPvcIY9ca;4DWiKuW$K9&935@Xkd9{L>I4?4*eBDz3GnZj-5o~4189E@*pUf)# zj{%JTS+Mb+rvnoG$*j_U0bu;!1RMXGbU>m%nN|AV0vP{)f{p(}Iw1K)EPZq|(|5p% zr85&jIb>*J@Ni!&GdPv8Vgr4dJ}Y)0owj2AW22*kM_`-sukzS1ukx7hJC%uzPmGNR zy)XZ@RW)io_^+zsUu^x9|8nC{s+7ZnsZx%GmsO=4e`i8Nj+Jj2`Jh&O3jI?jn72s% zag@}Bgw!{pf~l&>f|g0eh_3*eb^>9v@diaJg_3)-J_3&L` z>Y;;iI2Ltpi!gOBAxzzSLAV!XMwq(y9pN)57lf&MZwpi3{vk|#i{c&NSk$+tgsE>0 z!qm48Vd~pqVd~qhEN@q%LBHKy%##Wxk-R(ww}?zQX@m0mYRm{8E#B)dSdy3yz%+C?y?k8*RWIzd{}KmHZib1 z55EDdn@Q%`E*SKD%hv~foG-^Q^TjeO%>igd*IHH=L6Yf@C9Z&_v>$%sF!FyWt^@lk TM&@#vH33>TVf-pVlIib%8)eu5 literal 0 HcmV?d00001 diff --git a/tests/test/cg/obj/freertos/xtensa-call0/tcext5.o b/tests/test/cg/obj/freertos/xtensa-call0/tcext5.o new file mode 100644 index 0000000000000000000000000000000000000000..777428ce272bf2202978747fb9c41f8a3ee1ce60 GIT binary patch literal 12056 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 N@loqh4T58e{|};8M;8D9 literal 0 HcmV?d00001 diff --git a/tests/test/cg/obj/freertos/xtensa-call0/tcext6.o b/tests/test/cg/obj/freertos/xtensa-call0/tcext6.o new file mode 100644 index 0000000000000000000000000000000000000000..e2e32ea13197d267f6e45549cc676fcf4e6d2fe6 GIT binary patch literal 15084 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 literal 0 HcmV?d00001 From 7159e636143e3778b35a057985e9627dd5a2c4af Mon Sep 17 00:00:00 2001 From: Mattias Gaertner Date: Mon, 7 Sep 2020 10:53:13 +0000 Subject: [PATCH 06/12] pastojs: using pascal names for RTTI git-svn-id: trunk@46791 - --- packages/pastojs/src/fppas2js.pp | 206 ++++++++++++++----------------- 1 file changed, 93 insertions(+), 113 deletions(-) diff --git a/packages/pastojs/src/fppas2js.pp b/packages/pastojs/src/fppas2js.pp index b2a99c48f1..d4e159fb00 100644 --- a/packages/pastojs/src/fppas2js.pp +++ b/packages/pastojs/src/fppas2js.pp @@ -1166,7 +1166,7 @@ type TPas2JSClassScope = class(TPasClassScope) public - LongName: string; + JSName: string; NewInstanceFunction: TPasClassFunction; GUID: string; ElevatedLocals: TPas2jsElevatedLocals; @@ -1184,7 +1184,7 @@ type TPas2JSRecordScope = class(TPasRecordScope) public - LongName: string; + JSName: string; MemberOverloadsRenamed: boolean; end; @@ -1193,7 +1193,7 @@ type TPas2JSProcedureScope = class(TPasProcedureScope) public OverloadName: string; - LongName: string; + JSName: string; ResultVarName: string; // valid in implementation ProcScope, empty means use ResolverResultVar BodyOverloadsRenamed: boolean; BodyJS: string; // Option coStoreProcJS: stored in ImplScope @@ -1207,14 +1207,14 @@ type TPas2JSArrayScope = Class(TPasArrayScope) public - LongName: string; + JSName: string; end; { TPas2JSProcTypeScope } TPas2JSProcTypeScope = Class(TPasProcTypeScope) public - LongName: string; + JSName: string; end; { TPas2JSWithExprScope } @@ -1462,6 +1462,7 @@ type procedure RenameOverloads(DeclEl: TPasElement; Declarations: TFPList); procedure RenameSubOverloads(Declarations: TFPList); procedure RenameMembers(El: TPasMembersType); + procedure RenameSpecialized(SpecializedItem: TPRSpecializedItem); procedure PushOverloadScopeSkip; procedure PushOverloadScope(Scope: TPasIdentifierScope); function PushOverloadClassOrRecScopes(Scope: TPasClassOrRecordScope; WithParents: boolean): integer; @@ -1513,12 +1514,9 @@ type protected // generic/specialize function CreateSpecializedTypeName(Item: TPRSpecializedItem): string; override; - procedure SpecializeGenericIntf(SpecializedItem: TPRSpecializedItem); - override; procedure SpecializeGenericImpl(SpecializedItem: TPRSpecializedItem); override; function SpecializeParamsNeedDelay(SpecializedItem: TPRSpecializedItem): TPasElement; virtual; - function CreateLongName(SpecializedItem: TPRSpecializedItem): string; virtual; protected const cJSValueConversion = 2*cTypeConversion; @@ -3363,44 +3361,54 @@ var NewName: String; Duplicate: TPasElement; ProcScope: TPas2JSProcedureScope; + SpecItem: TPRSpecializedItem; begin // => count overloads in this section OverloadIndex:=GetOverloadIndex(El); //if SameText(El.Name,'ci') then writeln('TPas2JSResolver.RenameOverload ',GetObjPath(El),' ',OverloadIndex); if OverloadIndex=0 then - exit(false); // there is no overload - - if (El.ClassType=TPasClassFunction) - and (El.Parent.ClassType=TPasClassType) - and (TPas2JSClassScope(TPasClassType(El.Parent).CustomData).NewInstanceFunction=El) then - begin - Duplicate:=GetDuplicate; - RaiseMsg(20170324234324,nNewInstanceFunctionMustNotHaveOverloadAtX, - sNewInstanceFunctionMustNotHaveOverloadAtX,[GetElementSourcePosStr(Duplicate)],El); - end; - if El.Visibility=visPublished then - begin - Duplicate:=GetDuplicate; - RaiseMsg(20170413220924,nDuplicateIdentifier,sDuplicateIdentifier, - [Duplicate.Name,GetElementSourcePosStr(Duplicate)],El); - end; - - NewName:=El.Name+'$'+IntToStr(OverloadIndex); - {$IFDEF VerbosePas2JS} - writeln('TPas2JSResolver.RenameOverload "',El.Name,'" has overload. NewName="',NewName,'"'); - {$ENDIF} - if (El.CustomData is TPas2JSProcedureScope) then - begin - ProcScope:=TPas2JSProcedureScope(El.CustomData); - ProcScope.OverloadName:=NewName; - if ProcScope.DeclarationProc<>nil then - RaiseInternalError(20180322233222,GetElementDbgPath(El)); - if ProcScope.ImplProc<>nil then - TPas2JSProcedureScope(ProcScope.ImplProc.CustomData).OverloadName:=NewName; - end + Result:=false // there is no overload else - El.Name:=NewName; - Result:=true; + begin + if (El.ClassType=TPasClassFunction) + and (El.Parent.ClassType=TPasClassType) + and (TPas2JSClassScope(TPasClassType(El.Parent).CustomData).NewInstanceFunction=El) then + begin + Duplicate:=GetDuplicate; + RaiseMsg(20170324234324,nNewInstanceFunctionMustNotHaveOverloadAtX, + sNewInstanceFunctionMustNotHaveOverloadAtX,[GetElementSourcePosStr(Duplicate)],El); + end; + if El.Visibility=visPublished then + begin + Duplicate:=GetDuplicate; + RaiseMsg(20170413220924,nDuplicateIdentifier,sDuplicateIdentifier, + [Duplicate.Name,GetElementSourcePosStr(Duplicate)],El); + end; + + NewName:=El.Name+'$'+IntToStr(OverloadIndex); + {$IFDEF VerbosePas2JS} + writeln('TPas2JSResolver.RenameOverload "',El.Name,'" has overload. NewName="',NewName,'"'); + {$ENDIF} + if (El.CustomData is TPas2JSProcedureScope) then + begin + ProcScope:=TPas2JSProcedureScope(El.CustomData); + ProcScope.OverloadName:=NewName; + if ProcScope.DeclarationProc<>nil then + RaiseInternalError(20180322233222,GetElementDbgPath(El)); + if ProcScope.ImplProc<>nil then + TPas2JSProcedureScope(ProcScope.ImplProc.CustomData).OverloadName:=NewName; + end + else + El.Name:=NewName; + Result:=true; + end; + + if El.CustomData is TPasGenericScope then + begin + SpecItem:=TPasGenericScope(El.CustomData).SpecializedFromItem; + if SpecItem<>nil then + RenameSpecialized(SpecItem); + end; end; procedure TPas2JSResolver.RenameOverloadsInSection(aSection: TPasSection); @@ -3593,6 +3601,37 @@ begin RestoreOverloadScopeLvl(OldScopeCount); end; +procedure TPas2JSResolver.RenameSpecialized(SpecializedItem: TPRSpecializedItem + ); +var + GenScope: TPasGenericScope; + NewName: String; + ProcScope: TPas2JSProcedureScope; +begin + NewName:=SpecializedItem.GenericEl.Name+'$G'+IntToStr(SpecializedItem.Index+1); + GenScope:=TPasGenericScope(SpecializedItem.SpecializedEl.CustomData); + if GenScope is TPas2JSClassScope then + TPas2JSClassScope(GenScope).JSName:=NewName + else if GenScope is TPas2JSRecordScope then + TPas2JSRecordScope(GenScope).JSName:=NewName + else if GenScope is TPas2JSArrayScope then + TPas2JSArrayScope(GenScope).JSName:=NewName + else if GenScope is TPas2JSProcTypeScope then + TPas2JSProcTypeScope(GenScope).JSName:=NewName + else if GenScope is TPas2JSProcedureScope then + begin + ProcScope:=TPas2JSProcedureScope(GenScope); + if ProcScope.OverloadName<>'' then + NewName:=ProcScope.OverloadName + else + NewName:=SpecializedItem.GenericEl.Name; + NewName:=LastDottedIdentifier(NewName); + ProcScope.JSName:=NewName+'$G'+IntToStr(SpecializedItem.Index+1); + end + else + RaiseNotYetImplemented(20200906203342,SpecializedItem.SpecializedEl,GetObjName(GenScope)); +end; + procedure TPas2JSResolver.PushOverloadScopeSkip; begin FOverloadScopes.Add(TPas2JSOverloadChgThisScope.Create); @@ -4982,49 +5021,6 @@ begin Result:=Item.GenericEl.Name+'$G'+IntToStr(Item.Index+1); end; -procedure TPas2JSResolver.SpecializeGenericIntf( - SpecializedItem: TPRSpecializedItem); -{$IFDEF EnableLongNames} -var - El: TPasElement; - C: TClass; - RecScope: TPas2JSRecordScope; - ClassScope: TPas2JSClassScope; - ArrayScope: TPas2JSArrayScope; - ProcTypeScope: TPas2JSProcTypeScope; - LongName: String; -{$ENDIF} -begin - {$IFDEF EnableLongNames} - El:=SpecializedItem.SpecializedEl; - C:=El.ClassType; - LongName:=CreateLongName(SpecializedItem); - if C=TPasRecordType then - begin - RecScope:=TPas2JSRecordScope(El.CustomData); - RecScope.LongName:=LongName; - end - else if C=TPasClassType then - begin - ClassScope:=TPas2JSClassScope(El.CustomData); - ClassScope.LongName:=LongName; - end - else if C=TPasArrayType then - begin - ArrayScope:=TPas2JSArrayScope(El.CustomData); - ArrayScope.LongName:=LongName; - end - else if (C=TPasProcedureType) or (C=TPasFunctionType) then - begin - ProcTypeScope:=TPas2JSProcTypeScope(El.CustomData); - ProcTypeScope.LongName:=LongName; - end - else - RaiseNotYetImplemented(20200904132908,El); - {$ENDIF} - inherited SpecializeGenericIntf(SpecializedItem); -end; - procedure TPas2JSResolver.SpecializeGenericImpl( SpecializedItem: TPRSpecializedItem); var @@ -5107,24 +5103,6 @@ begin end; end; -function TPas2JSResolver.CreateLongName(SpecializedItem: TPRSpecializedItem - ): string; -var - GenEl: TPasElement; - i: Integer; - Param: TPasType; -begin - GenEl:=SpecializedItem.GenericEl; - Result:=GenEl.Name+'<'; - for i:=0 to length(SpecializedItem.Params)-1 do - begin - Param:=ResolveAliasType(SpecializedItem.Params[i],false); - // ToDo move to resolver - if Param=nil then ; - end; - Result:=Result+'>'; -end; - function TPas2JSResolver.AddJSBaseType(const aName: string; Typ: TPas2jsBaseType ): TResElDataPas2JSBaseType; var @@ -8130,6 +8108,8 @@ begin end; function TPasToJSConverter.CanClashWithGlobal(El: TPasElement): boolean; +// returns true for JS variables accessed directly, i.e. without dot prefix +// which therefore must be checked if they clash with global JS identifiers. var C: TClass; begin @@ -15461,16 +15441,21 @@ end; function TPasToJSConverter.ConvertProcedureType(El: TPasProcedureType; AContext: TConvertContext): TJSElement; // create -// module.$rtti.$ProcVar("name",{ +// "reference to": +// module.$rtti.$RefToProcVar("longname",{ // procsig: rtl.newTIProcSignature([[arg1name,arg1type,arg1flags],[arg2name...],...],resulttype,flags) // }) // "of object": -// module.$rtti.$MethodVar("name",{ +// module.$rtti.$MethodVar("longname",{ // procsig: rtl.newTIProcSignature([[arg1name,arg1type,arg1flags],[arg2name...],...],resulttype,flags), // methodkind: 1 // }) +// "normal": +// module.$rtti.$ProcVar("longname",{ +// procsig: rtl.newTIProcSignature([[arg1name,arg1type,arg1flags],[arg2name...],...],resulttype,flags) +// }) // delayed specialization: -// module.$rtti.$MethodVar("name",{ +// module.$rtti.$MethodVar("longname",{ // init: function()}{ this.procsig = rtl.newTIProcSignature([[arg1name,arg1type,arg1flags],[arg2name...],...],resulttype,flags)}, // methodkind: 1 // }) @@ -25639,22 +25624,17 @@ begin or (C=TPasRangeType) then begin - // user type -> module.$rtti[typename] + // user type -> module.$rtti["pascalname"] // Notes: // a nested type gets the parent types prepended: classnameA.ElName // an anonymous type gets for each level '$a' prepended // an anonymous type of a variable/argument gets the variable name prepended - CurEl:=El; + CurEl:=ResolveSimpleAliasType(TPasType(El)); repeat if CurEl.Name<>'' then begin - if CurEl.ClassType=TPasTypeAliasType then - aName:=TransformVariableName(CurEl,CurEl.Name,true,AContext) - else - aName:=TransformVariableName(CurEl,AContext); - if aName='' then - RaiseNotSupported(CurEl,AContext,20170905144902,'name conversion failed'); - Result:=aName+Result; + // RTTI uses Pascal name + Result:=CurEl.Name+Result; end else begin From a577fa3e584cf03fd9b9de3088135fb4e2c8415f Mon Sep 17 00:00:00 2001 From: Mattias Gaertner Date: Mon, 7 Sep 2020 11:10:40 +0000 Subject: [PATCH 07/12] pastojs: specialized procedure type RTTI now uses pascal name git-svn-id: trunk@46792 - --- packages/pastojs/src/fppas2js.pp | 157 ++++++++++++++------------ packages/pastojs/tests/tcgenerics.pas | 12 +- 2 files changed, 94 insertions(+), 75 deletions(-) diff --git a/packages/pastojs/src/fppas2js.pp b/packages/pastojs/src/fppas2js.pp index d4e159fb00..e41ab5ebf5 100644 --- a/packages/pastojs/src/fppas2js.pp +++ b/packages/pastojs/src/fppas2js.pp @@ -1890,8 +1890,8 @@ type // Name mangling Function GetOverloadName(El: TPasElement; AContext: TConvertContext): string; Function CanClashWithGlobal(El: TPasElement): boolean; - Function TransformVariableName(ErrorEl: TPasElement; Const AName: String; CheckGlobal: boolean; AContext : TConvertContext): String; virtual; - Function TransformVariableName(El: TPasElement; AContext : TConvertContext) : String; virtual; + Function TransformToJSName(ErrorEl: TPasElement; Const AName: String; CheckGlobal: boolean; AContext : TConvertContext): String; virtual; + Function TransformElToJSName(El: TPasElement; AContext : TConvertContext) : String; virtual; Function TransformModuleName(El: TPasModule; AddModulesPrefix: boolean; AContext : TConvertContext) : String; virtual; Function IsReservedWord(const aName: string; CheckGlobal: boolean): boolean; virtual; Function GetTypeInfoName(El: TPasType; AContext: TConvertContext; @@ -5017,8 +5017,14 @@ begin end; function TPas2JSResolver.CreateSpecializedTypeName(Item: TPRSpecializedItem): string; +var + C: TClass; begin - Result:=Item.GenericEl.Name+'$G'+IntToStr(Item.Index+1); + C:=Item.GenericEl.ClassType; + if (C=TPasProcedureType) or (C=TPasFunctionType) then + Result:=inherited CreateSpecializedTypeName(Item) + else + Result:=Item.GenericEl.Name+'$G'+IntToStr(Item.Index+1); end; procedure TPas2JSResolver.SpecializeGenericImpl( @@ -6739,26 +6745,34 @@ var GenEl: TPasElement; begin Data:=El.CustomData; - if Data is TPas2JSProcedureScope then + if Data is TPasGenericScope then begin - ProcScope:=TPas2JSProcedureScope(Data); - if ProcScope.SpecializedFromItem<>nil then + if Data is TPas2JSProcedureScope then begin - // specialized proc -> generic name + 's' + index - GenEl:=ProcScope.SpecializedFromItem.GenericEl; - GenScope:=TPas2JSProcedureScope(GenEl.CustomData); - Result:=GenScope.OverloadName; - if Result='' then - Result:=GenEl.Name+'$'; - Result:=Result+'s'+IntToStr(ProcScope.SpecializedFromItem.Index); + ProcScope:=TPas2JSProcedureScope(Data); + if ProcScope.SpecializedFromItem<>nil then + begin + // specialized proc -> generic name + 's' + index + GenEl:=ProcScope.SpecializedFromItem.GenericEl; + GenScope:=TPas2JSProcedureScope(GenEl.CustomData); + Result:=GenScope.OverloadName; + if Result='' then + Result:=GenEl.Name+'$'; + Result:=Result+'s'+IntToStr(ProcScope.SpecializedFromItem.Index); + end + else + begin + Result:=ProcScope.OverloadName; + if Result='' then + Result:=El.Name; + end; + exit; end - else + else if Data is TPas2JSProcTypeScope then begin - Result:=ProcScope.OverloadName; - if Result='' then - Result:=El.Name; + Result:=TPas2JSProcTypeScope(Data).JSName; + if Result<>'' then exit; end; - exit; end; Result:=El.Name; end; @@ -7792,7 +7806,7 @@ begin RaiseInconsistency(20170125191923,ClassOrRec); C:=CreateCallExpression(Ref.Element); try - ProcName:=TransformVariableName(Proc,AContext); + ProcName:=TransformElToJSName(Proc,AContext); if ClassOrRec.ClassType=TPasRecordType then begin // create "path.$new()" @@ -9193,7 +9207,7 @@ begin begin // e.g. "Something.aClassVar:=" -> "aClass.aClassVar:=" LeftJS:=CreateReferencePathExpr(RightRefDecl.Parent,AContext); - Result:=CreateDotNameExpr(El,LeftJS,TJSString(TransformVariableName(RightRefDecl,AContext))); + Result:=CreateDotNameExpr(El,LeftJS,TJSString(TransformElToJSName(RightRefDecl,AContext))); exit; end; @@ -9292,7 +9306,7 @@ end; function TPasToJSConverter.CreateIdentifierExpr(El: TPasElement; AContext: TConvertContext): TJSElement; begin - Result:=CreatePrimitiveDotExpr(TransformVariableName(El,AContext),El); + Result:=CreatePrimitiveDotExpr(TransformElToJSName(El,AContext),El); end; function TPasToJSConverter.CreateIdentifierExpr(AName: string; @@ -9300,7 +9314,7 @@ function TPasToJSConverter.CreateIdentifierExpr(AName: string; ): TJSElement; // CheckGlobal: check name clashes with global identifiers too begin - Result:=CreatePrimitiveDotExpr(TransformVariableName(PosEl,AName,CheckGlobal,AContext),PosEl); + Result:=CreatePrimitiveDotExpr(TransformToJSName(PosEl,AName,CheckGlobal,AContext),PosEl); end; function TPasToJSConverter.CreateSubDeclJSNameExpr(El: TPasElement; @@ -9327,7 +9341,7 @@ function TPasToJSConverter.CreateSubDeclNameExpr(El: TPasElement; var JSName: String; begin - JSName:=TransformVariableName(El,PasName,false,AContext); + JSName:=TransformToJSName(El,PasName,false,AContext); Result:=CreateSubDeclJSNameExpr(El,JSName,AContext,PosEl); end; @@ -9336,7 +9350,7 @@ function TPasToJSConverter.CreateSubDeclNameExpr(El: TPasElement; var JSName: String; begin - JSName:=TransformVariableName(El,AContext); + JSName:=TransformElToJSName(El,AContext); Result:=CreateSubDeclJSNameExpr(El,JSName,AContext,PosEl); end; @@ -9637,7 +9651,7 @@ begin begin // writing a class var -> aClass.VarName PathExpr:=CreateReferencePathExpr(Decl.Parent,AContext); - Result:=CreateDotNameExpr(El,PathExpr,TJSString(TransformVariableName(Decl,AContext))); + Result:=CreateDotNameExpr(El,PathExpr,TJSString(TransformElToJSName(Decl,AContext))); CallTypeSetter; exit; end @@ -9673,7 +9687,7 @@ begin Result:=Call; Call.Expr:=CreateMemberExpression([GetBIName(pbivnRTL),GetBIName(pbifnGetResourcestring)]); Call.AddArg(CreatePrimitiveDotExpr(TransformModuleName(Decl.GetModule,true,AContext),El)); - Call.AddArg(CreateLiteralString(El,TransformVariableName(Decl,AContext))); + Call.AddArg(CreateLiteralString(El,TransformElToJSName(Decl,AContext))); exit; end else if aResolver.IsHelperMethod(Decl) @@ -9976,7 +9990,7 @@ function TPasToJSConverter.ConvertInheritedExpr(El: TInheritedExpr; end else FunName:=CreateReferencePath(AncestorClass,AContext,rpkPathAndName,true) - +'.'+TransformVariableName(AncestorProc,AContext); + +'.'+TransformElToJSName(AncestorProc,AContext); end else FunName:=CreateReferencePath(AncestorProc,AContext,rpkPathAndName,true); @@ -13709,7 +13723,7 @@ begin Call:=CreateCallExpression(PosEl); Call.Expr:=CreatePrimitiveDotExpr(FunName,PosEl); // parameter: "Create" - Call.AddArg(CreateLiteralString(PosEl,TransformVariableName(aConstructor,AContext))); + Call.AddArg(CreateLiteralString(PosEl,TransformElToJSName(aConstructor,AContext))); ThrowSt.A:=Call; if length(El.Params)>1 then begin @@ -14064,7 +14078,7 @@ begin PasVar:=Ref.Declaration as TPasVariable; Vars.Add(PasVar); ObjLitEl:=ObjLit.Elements.AddElement; - CurName:=TransformVariableName(PasVar,AContext); + CurName:=TransformElToJSName(PasVar,AContext); if CurName[1]='[' then begin if CurName[length(CurName)]=']' then @@ -14087,7 +14101,7 @@ begin if not IsElementUsed(PasVar) then continue; // missing instance field in constant -> add default value ObjLitEl:=ObjLit.Elements.AddElement; - ObjLitEl.Name:=TJSString(TransformVariableName(PasVar,AContext)); + ObjLitEl.Name:=TJSString(TransformElToJSName(PasVar,AContext)); ObjLitEl.Expr:=CreateValInit(PasVar.VarType,PasVar.Expr,PasVar,AContext); end; ok:=true; @@ -14245,7 +14259,7 @@ begin // create 'A: initvalue' Obj:=TObjectContext(AContext).JSElement as TJSObjectLiteral; ObjLit:=Obj.Elements.AddElement; - ObjLit.Name:=TJSString(TransformVariableName(El,AContext)); + ObjLit.Name:=TJSString(TransformElToJSName(El,AContext)); ObjLit.Expr:=CreateVarInit(El,AContext); end else if AContext.IsGlobal then @@ -14474,7 +14488,7 @@ Var end; // add element: name : { ... } Lit:=TJSObjectLiteral(ResStrVarEl.Init).Elements.AddElement; - Lit.Name:=TJSString(TransformVariableName(ResStr,AContext)); + Lit.Name:=TJSString(TransformElToJSName(ResStr,AContext)); ObjLit:=TJSObjectLiteral(CreateElement(TJSObjectLiteral,ResStr)); Lit.Expr:=ObjLit; // add sub element: org: value @@ -14694,7 +14708,7 @@ var if (Member.ClassType=TPasClassConstructor) or (Member.ClassType=TPasClassDestructor) then continue; - Arr.AddElement(CreateLiteralString(Member,TransformVariableName(Member,AContext))); + Arr.AddElement(CreateLiteralString(Member,TransformElToJSName(Member,AContext))); end; end; @@ -14792,7 +14806,7 @@ begin Call.AddArg(CreatePrimitiveDotExpr(OwnerName,El)); // add parameter: string constant '"classname"' - ArgEx := CreateLiteralString(El,TransformVariableName(El,AContext)); + ArgEx := CreateLiteralString(El,TransformElToJSName(El,AContext)); Call.AddArg(ArgEx); if El.ObjKind=okInterface then @@ -14930,7 +14944,7 @@ begin Proc:=TPasProcedure(P); if IsTObject and (C=TPasDestructor) then begin - DestructorName:=TransformVariableName(P,AContext); + DestructorName:=TransformElToJSName(P,AContext); if DestructorName<>'Destroy' then begin // add 'rtl.tObjectDestroy="destroy";' @@ -15176,14 +15190,14 @@ begin // add 'TypeName: {}' ParentObj:=TObjectContext(AContext).JSElement as TJSObjectLiteral; ObjLit:=ParentObj.Elements.AddElement; - ObjLit.Name:=TJSString(TransformVariableName(El,AContext)); + ObjLit.Name:=TJSString(TransformElToJSName(El,AContext)); ObjLit.Expr:=Obj; Result:=Obj; end else if El.Parent is TProcedureBody then begin // add 'var TypeName = {}' - VarSt:=CreateVarStatement(TransformVariableName(El,AContext),Obj,El); + VarSt:=CreateVarStatement(TransformElToJSName(El,AContext),Obj,El); if AContext.JSElement is TJSSourceElements then begin Src:=TJSSourceElements(AContext.JSElement); @@ -15205,7 +15219,7 @@ begin for i:=0 to El.Values.Count-1 do begin EnumValue:=TPasEnumValue(El.Values[i]); - JSName:=TJSString(TransformVariableName(EnumValue,AContext)); + JSName:=TJSString(TransformElToJSName(EnumValue,AContext)); // add "0":"value" ObjLit:=Obj.Elements.AddElement; ObjLit.Name:=TJSString(IntToStr(i)); @@ -16030,13 +16044,13 @@ begin // local/nested or anonymous function Result:=FS; if (El.Name<>'') and not IsClassConDestructor then - FD.Name:=TJSString(TransformVariableName(El,AContext)); + FD.Name:=TJSString(TransformElToJSName(El,AContext)); end; for n := 0 to El.ProcType.Args.Count - 1 do begin Arg:=TPasArgument(El.ProcType.Args[n]); - FD.Params.Add(TransformVariableName(Arg,AContext)); + FD.Params.Add(TransformElToJSName(Arg,AContext)); end; BodyPas:=ImplProc.Body; @@ -17015,7 +17029,7 @@ begin begin PasVar:=TPasVariable(Fields[i]); CurAssignSt:=TJSSimpleAssignStatement(CreateElement(TJSSimpleAssignStatement,El)); - VarName:=TransformVariableName(PasVar,AContext); + VarName:=TransformElToJSName(PasVar,AContext); CurAssignSt.LHS:=CreateMemberExpression([LocalVarName,VarName]); CurAssignSt.Expr:=CreateVarInit(PasVar,AContext); AddToSourceElements(Src,CurAssignSt); @@ -17103,7 +17117,7 @@ begin VarType:=PasVar.VarType; if aResolver<>nil then VarType:=aResolver.ResolveAliasType(VarType); - VarName:=TransformVariableName(PasVar,aContext); + VarName:=TransformElToJSName(PasVar,aContext); if VarType.ClassType=TPasRecordType then begin // record @@ -17202,7 +17216,7 @@ begin for i:=0 to Fields.Count-1 do begin PasVar:=TPasVariable(Fields[i]); - VarName:=TransformVariableName(PasVar,AContext); + VarName:=TransformElToJSName(PasVar,AContext); SrcExpr:=CreateMemberExpression([SrcParamName,VarName]); if aResolver<>nil then begin @@ -18024,7 +18038,7 @@ begin LitEl:=ObjLit.Elements.AddElement; LitEl.Name:=TJSString(List[i]); Proc:=TPasProcedure(List.Objects[i]); - LitEl.Expr:=CreateLiteralJSString(Proc,TJSString(TransformVariableName(Proc,FuncContext))); + LitEl.Expr:=CreateLiteralJSString(Proc,TJSString(TransformElToJSName(Proc,FuncContext))); end; end; @@ -18165,7 +18179,7 @@ begin else begin // create rtl.createCallback(target, "FunName") - FunName:=TransformVariableName(Proc,AContext); + FunName:=TransformElToJSName(Proc,AContext); Call.AddArg(CreateLiteralString(Expr,FunName)); end; @@ -18741,7 +18755,7 @@ begin Param:=TJSArrayLiteral(CreateElement(TJSArrayLiteral,Arg)); TargetParams.Elements.AddElement.Expr:=Param; // add "argname" - ArgName:=TransformVariableName(Arg,Arg.Name,true,AContext); + ArgName:=TransformToJSName(Arg,Arg.Name,true,AContext); Param.Elements.AddElement.Expr:=CreateLiteralString(Arg,ArgName); Flags:=0; // add "argtype" @@ -18893,7 +18907,7 @@ begin if ConstrParent.HelperForType<>nil then aResolver.RaiseMsg(20190223220134,nXExpectedButYFound,sXExpectedButYFound, ['class method','helper method'],Expr); - aName:=TransformVariableName(aConstructor,aContext); + aName:=TransformElToJSName(aConstructor,aContext); if AttrArrayLit=nil then AttrArrayLit:=TJSArrayLiteral(CreateElement(TJSArrayLiteral,PosEl)); @@ -19002,7 +19016,7 @@ begin // $r.addField Call.Expr:=CreateMemberExpression([GetBIName(pbivnRTTILocal),GetBIName(pbifnRTTIAddField)]); // param "varname" - aName:=TransformVariableName(V,AContext); + aName:=TransformElToJSName(V,AContext); Call.AddArg(CreateLiteralString(V,aName)); // param typeinfo Call.AddArg(JSTypeInfo); @@ -19084,7 +19098,7 @@ begin Call.Expr:=CreateMemberExpression([GetBIName(pbivnRTTILocal),GetBIName(pbifnRTTIAddMethod)]); // param "funname" - FunName:=TransformVariableName(Proc,AContext); + FunName:=TransformElToJSName(Proc,AContext); Call.AddArg(CreateLiteralString(Proc,FunName)); // param methodkind as number @@ -19149,7 +19163,7 @@ var function GetAccessorName(Decl: TPasElement): String; begin - Result:=TransformVariableName(Decl,AContext); + Result:=TransformElToJSName(Decl,AContext); end; procedure AddOption(const aName: String; JS: TJSElement); @@ -19189,7 +19203,7 @@ begin Call.Expr:=CreateMemberExpression([GetBIName(pbivnRTTILocal),GetBIName(pbifnRTTIAddProperty)]); // param "propname" - PropName:=TransformVariableName(Prop,Prop.Name,false,AContext); + PropName:=TransformToJSName(Prop,Prop.Name,false,AContext); Call.AddArg(CreateLiteralString(Prop,PropName)); // add flags @@ -19562,22 +19576,22 @@ begin MemberEl:=TPasElement(Members[0]); if not SameText(MemberEl.Name,'D1') then RaiseInconsistency(20180415094721,PosEl); - PropEl.Name:=TJSString(TransformVariableName(MemberEl,AContext)); + PropEl.Name:=TJSString(TransformElToJSName(MemberEl,AContext)); PropEl.Expr:=CreateLiteralHexNumber(PosEl,GUID.D1,8); // D2: 0x1234 PropEl:=Result.Elements.AddElement; MemberEl:=TPasElement(Members[1]); - PropEl.Name:=TJSString(TransformVariableName(MemberEl,AContext)); + PropEl.Name:=TJSString(TransformElToJSName(MemberEl,AContext)); PropEl.Expr:=CreateLiteralHexNumber(PosEl,GUID.D2,4); // D3: 0x1234 PropEl:=Result.Elements.AddElement; MemberEl:=TPasElement(Members[2]); - PropEl.Name:=TJSString(TransformVariableName(MemberEl,AContext)); + PropEl.Name:=TJSString(TransformElToJSName(MemberEl,AContext)); PropEl.Expr:=CreateLiteralHexNumber(PosEl,GUID.D3,4); // D4: [0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12] PropEl:=Result.Elements.AddElement; MemberEl:=TPasElement(Members[3]); - PropEl.Name:=TJSString(TransformVariableName(MemberEl,AContext)); + PropEl.Name:=TJSString(TransformElToJSName(MemberEl,AContext)); ArrLit:=TJSArrayLiteral(CreateElement(TJSArrayLiteral,PosEl)); PropEl.Expr:=ArrLit; for i:=0 to 7 do @@ -19904,9 +19918,9 @@ procedure TPasToJSConverter.AddClassSupportedInterfaces(El: TPasClassType; MapItem:=TObject(Map.Procs[i]); if not (MapItem is TPasProcedure) then continue; Proc:=TPasProcedure(MapItem); - ProcName:=TransformVariableName(Proc,FuncContext); + ProcName:=TransformElToJSName(Proc,FuncContext); IntfProc:=TObject(Intf.Members[i]) as TPasProcedure; - IntfProcName:=TransformVariableName(IntfProc,FuncContext); + IntfProcName:=TransformElToJSName(IntfProc,FuncContext); if IntfProcName=ProcName then continue; if ObjLit=nil then begin @@ -20533,7 +20547,7 @@ begin Call:=CreateCallExpression(PosEl); ProcPath:=CreateReferencePath(Proc.Parent,AContext,rpkPathAndName)+'.'+GetBIName(pbifnHelperNew); Call.Expr:=CreatePrimitiveDotExpr(ProcPath,PosEl); - ProcPath:=TransformVariableName(Proc,AContext); + ProcPath:=TransformElToJSName(Proc,AContext); Call.AddArg(CreateLiteralString(PosEl,ProcPath)); end; ArrLit:=TJSArrayLiteral(CreateElement(TJSArrayLiteral,PosEl)); @@ -20791,7 +20805,7 @@ begin RaiseNotSupported(El,AContext,20170208141926,'absolute'); V:=TJSVarDeclaration(CreateElement(TJSVarDeclaration,El)); - V.Name:=TransformVariableName(El,AContext); + V.Name:=TransformElToJSName(El,AContext); V.Init:=CreateVarInit(El,AContext); Result:=V; end; @@ -23879,7 +23893,7 @@ begin if Result<>'' then Result:=Result+'.'; rpkPathAndName: begin - ShortName:=TransformVariableName(El,AContext); + ShortName:=TransformElToJSName(El,AContext); if Result='' then Result:=ShortName else if (ShortName<>'') and (ShortName[1] in ['[','(']) then @@ -23944,7 +23958,7 @@ begin Result:=TransformModuleName(TPasModule(Parent),true,AContext) else RaiseNotSupported(El,AContext,20200609230526,GetObjName(aType)); - Result:=Result+'.'+TransformVariableName(aType,AContext); + Result:=Result+'.'+TransformElToJSName(aType,AContext); if AliasGlobals then Result:=CreateGlobalAlias(El,Result,AContext); end; @@ -24878,7 +24892,7 @@ begin ListFirst:=TJSStatementList(CreateElement(TJSStatementList,El.Body)); ListLast:=ListFirst; IfSt.BTrue:=ListFirst; - V:=CreateVarStatement(TransformVariableName(El,El.VariableName,true,AContext), + V:=CreateVarStatement(TransformToJSName(El,El.VariableName,true,AContext), CreatePrimitiveDotExpr(GetBIName(pbivnExceptObject),El),El); ListFirst.A:=V; // add statements @@ -24977,7 +24991,7 @@ begin // create 'A: initvalue' Obj:=TObjectContext(AContext).JSElement as TJSObjectLiteral; ObjLit:=Obj.Elements.AddElement; - ObjLit.Name:=TJSString(TransformVariableName(El,AContext)); + ObjLit.Name:=TJSString(TransformElToJSName(El,AContext)); ObjLit.Expr:=CreateVarInit(El,AContext); end else @@ -25102,7 +25116,7 @@ begin RaiseNotSupported(El,AContext,20190105104054); // local record type elevated to global scope Src:=TJSSourceElements(AContext.JSElement); - VarSt:=CreateVarStatement(TransformVariableName(El,AContext),Call,El); + VarSt:=CreateVarStatement(TransformElToJSName(El,AContext),Call,El); AddToSourceElements(Src,VarSt); // keep Result=nil // add parameter: parent = null Call.AddArg(CreateLiteralNull(El)); @@ -25125,7 +25139,7 @@ begin Call.AddArg(CreatePrimitiveDotExpr(JSParentName,El)); // add parameter: typename: string - Call.AddArg(CreateLiteralString(El,TransformVariableName(El,AContext))); + Call.AddArg(CreateLiteralString(El,TransformElToJSName(El,AContext))); end; // add parameter: initialize function 'function(){...}' @@ -25356,7 +25370,7 @@ begin raise Exception.Create(s); end; -function TPasToJSConverter.TransformVariableName(ErrorEl: TPasElement; +function TPasToJSConverter.TransformToJSName(ErrorEl: TPasElement; const AName: String; CheckGlobal: boolean; AContext: TConvertContext): String; // CheckGlobal: check name clashes with global identifiers too var @@ -25387,7 +25401,7 @@ begin RaiseNotSupported(ErrorEl,AContext,20170203131832); end; -function TPasToJSConverter.TransformVariableName(El: TPasElement; +function TPasToJSConverter.TransformElToJSName(El: TPasElement; AContext: TConvertContext): String; var aType: TPasType; @@ -25402,10 +25416,11 @@ begin aType:=AContext.Resolver.ResolveAliasType(TPasType(El)) else aType:=TPasType(El); - Result:=TransformVariableName(El,aType.Name,CanClashWithGlobal(aType),AContext); + Result:=TransformToJSName(El,GetOverloadName(aType,AContext), + CanClashWithGlobal(aType),AContext); end else - Result:=TransformVariableName(El,GetOverloadName(El,AContext), + Result:=TransformToJSName(El,GetOverloadName(El,AContext), CanClashWithGlobal(El),AContext); end; @@ -25432,7 +25447,7 @@ begin StartP:=p; while (p<=length(aName)) and (aName[p]<>'.') do inc(p); Part:=copy(aName,StartP,p-StartP); - Part:=TransformVariableName(El,Part,false,AContext); + Part:=TransformToJSName(El,Part,false,AContext); if Result<>'' then Result:=Result+'.'; Result:=Result+Part; inc(p); @@ -25684,7 +25699,7 @@ begin RaiseNotSupported(Arg,AContext,20190205190114,GetObjName(Arg.Parent)); end else - Result:=TransformVariableName(Arg,Result,true,AContext); + Result:=TransformToJSName(Arg,Result,true,AContext); end; function TPasToJSConverter.CreateGlobalAlias(El: TPasElement; JSPath: string; diff --git a/packages/pastojs/tests/tcgenerics.pas b/packages/pastojs/tests/tcgenerics.pas index e28ae24e61..bef87a134e 100644 --- a/packages/pastojs/tests/tcgenerics.pas +++ b/packages/pastojs/tests/tcgenerics.pas @@ -81,7 +81,7 @@ type // generic procedure type procedure TestGen_ProcType_ProcLocal; - procedure TestGen_ProcType_ProcLocal_RTTI; + procedure TestGen_ProcType_Local_RTTI_Fail; procedure TestGen_ProcType_ParamUnitImpl; end; @@ -2142,7 +2142,7 @@ begin ''])); end; -procedure TTestGenerics.TestGen_ProcType_ProcLocal_RTTI; +procedure TTestGenerics.TestGen_ProcType_Local_RTTI_Fail; begin WithTypeInfo:=true; StartProgram(false); @@ -2183,8 +2183,10 @@ begin 'var', ' f: specialize TAnt;', ' b: TBird;', + ' p: pointer;', 'begin', ' b:=f(b);', + ' p:=typeinfo(f);', ''])); Add([ 'uses UnitA;', @@ -2196,13 +2198,14 @@ begin 'rtl.module("UnitA", ["system"], function () {', ' var $mod = this;', ' var $impl = $mod.$impl;', - ' $mod.$rtti.$ProcVar("TAnt$G1", {', + ' $mod.$rtti.$ProcVar("TAnt", {', ' init: function () {', ' this.procsig = rtl.newTIProcSig([["a", $mod.$rtti["TBird"], 2]], $mod.$rtti["TBird"]);', ' }', ' });', ' $mod.$init = function () {', ' $impl.b.$assign($impl.f($impl.b));', + ' $impl.p = $mod.$rtti["TAnt"];', ' };', '}, null, function () {', ' var $mod = this;', @@ -2221,10 +2224,11 @@ begin ' });', ' $impl.f = null;', ' $impl.b = $impl.TBird.$new();', + ' $impl.p = null;', '});'])); CheckSource('TestGen_Class_ClassVarRecord_UnitImpl', LinesToStr([ // statements - 'pas.UnitA.$rtti["TAnt$G1"].init();', + 'pas.UnitA.$rtti["TAnt"].init();', '']), LinesToStr([ // $mod.$main ''])); From e50916a93cbfdf4ea74c5752106e893ba9a4bc26 Mon Sep 17 00:00:00 2001 From: Mattias Gaertner Date: Mon, 7 Sep 2020 12:24:19 +0000 Subject: [PATCH 08/12] pastojs: specialize array type using pascal name git-svn-id: trunk@46793 - --- packages/fcl-passrc/src/pasresolver.pp | 18 +++---- packages/pastojs/src/fppas2js.pp | 68 +++++++++++++++----------- packages/pastojs/tests/tcgenerics.pas | 12 +++-- 3 files changed, 56 insertions(+), 42 deletions(-) diff --git a/packages/fcl-passrc/src/pasresolver.pp b/packages/fcl-passrc/src/pasresolver.pp index 4032cc406f..eab18fed0d 100644 --- a/packages/fcl-passrc/src/pasresolver.pp +++ b/packages/fcl-passrc/src/pasresolver.pp @@ -11986,7 +11986,7 @@ begin AddGenericTemplateIdentifiers(TypeParams,Scope); end; end else if TypeParams<>nil then - RaiseNotYetImplemented(20190812215851,El); + RaiseNotYetImplemented(20190812215851,El); // anonymous generic array type end; procedure TPasResolver.AddRecordType(El: TPasRecordType; TypeParams: TFPList); @@ -17775,17 +17775,17 @@ var GenResultEl, NewResultEl: TPasResultElement; NewClass: TPTreeElement; i: Integer; - GenScope: TPasGenericScope; + SpecScope: TPasGenericScope; begin if GenEl.GenericTemplateTypes<>nil then begin - GenScope:=TPasGenericScope(PushScope(SpecEl,ScopeClass_ProcType)); + SpecScope:=TPasGenericScope(PushScope(SpecEl,ScopeClass_ProcType)); if SpecializedItem<>nil then begin // specialized procedure type - GenScope.SpecializedFromItem:=SpecializedItem; + SpecScope.SpecializedFromItem:=SpecializedItem; AddSpecializedTemplateIdentifiers(GenEl.GenericTemplateTypes, - SpecializedItem,GenScope,true); + SpecializedItem,SpecScope,true); end else begin @@ -18257,19 +18257,19 @@ end; procedure TPasResolver.SpecializeArrayType(GenEl, SpecEl: TPasArrayType; SpecializedItem: TPRSpecializedTypeItem); var - GenScope: TPasGenericScope; + SpecScope: TPasGenericScope; begin SpecEl.IndexRange:=GenEl.IndexRange; SpecEl.PackMode:=GenEl.PackMode; if GenEl.GenericTemplateTypes<>nil then begin - GenScope:=TPasGenericScope(PushScope(SpecEl,ScopeClass_Array)); + SpecScope:=TPasGenericScope(PushScope(SpecEl,ScopeClass_Array)); if SpecializedItem<>nil then begin // specialized generic array - GenScope.SpecializedFromItem:=SpecializedItem; + SpecScope.SpecializedFromItem:=SpecializedItem; AddSpecializedTemplateIdentifiers(GenEl.GenericTemplateTypes, - SpecializedItem,GenScope,true); + SpecializedItem,SpecScope,true); end else begin diff --git a/packages/pastojs/src/fppas2js.pp b/packages/pastojs/src/fppas2js.pp index e41ab5ebf5..8b1e7b4c1e 100644 --- a/packages/pastojs/src/fppas2js.pp +++ b/packages/pastojs/src/fppas2js.pp @@ -1514,6 +1514,8 @@ type protected // generic/specialize function CreateSpecializedTypeName(Item: TPRSpecializedItem): string; override; + procedure SpecializeGenericIntf(SpecializedItem: TPRSpecializedItem); + override; procedure SpecializeGenericImpl(SpecializedItem: TPRSpecializedItem); override; function SpecializeParamsNeedDelay(SpecializedItem: TPRSpecializedItem): TPasElement; virtual; @@ -1842,7 +1844,7 @@ type Function CreatePrimitiveDotExpr(Path: string; PosEl: TPasElement): TJSElement; Function CreateSubDeclJSNameExpr(El: TPasElement; JSName: string; AContext: TConvertContext; PosEl: TPasElement): TJSElement; - Function CreateSubDeclNameExpr(El: TPasElement; const PasName: string; + Function CreateSubDeclPasNameExpr(El: TPasElement; const PasName: string; AContext: TConvertContext; PosEl: TPasElement = nil): TJSElement; Function CreateSubDeclNameExpr(El: TPasElement; AContext: TConvertContext; PosEl: TPasElement = nil): TJSElement; @@ -3361,7 +3363,6 @@ var NewName: String; Duplicate: TPasElement; ProcScope: TPas2JSProcedureScope; - SpecItem: TPRSpecializedItem; begin // => count overloads in this section OverloadIndex:=GetOverloadIndex(El); @@ -3397,18 +3398,13 @@ begin RaiseInternalError(20180322233222,GetElementDbgPath(El)); if ProcScope.ImplProc<>nil then TPas2JSProcedureScope(ProcScope.ImplProc.CustomData).OverloadName:=NewName; + if ProcScope.SpecializedFromItem<>nil then + RenameSpecialized(ProcScope.SpecializedFromItem); end else El.Name:=NewName; Result:=true; end; - - if El.CustomData is TPasGenericScope then - begin - SpecItem:=TPasGenericScope(El.CustomData).SpecializedFromItem; - if SpecItem<>nil then - RenameSpecialized(SpecItem); - end; end; procedure TPas2JSResolver.RenameOverloadsInSection(aSection: TPasSection); @@ -3460,6 +3456,7 @@ begin ProcScope:=Proc.CustomData as TPas2JSProcedureScope; //writeln('TPas2JSResolver.RenameOverloads Proc=',Proc.Name,' DeclarationProc=',GetObjName(ProcScope.DeclarationProc),' ImplProc=',GetObjName(ProcScope.ImplProc),' ClassScope=',GetObjName(ProcScope.ClassOrRecordScope)); if ProcScope.DeclarationProc<>nil then + // DeclarationProc already propagates to ImplProc continue else if Proc.IsOverride then begin @@ -3474,6 +3471,7 @@ begin begin ImplProcScope:=TPas2JSProcedureScope(ProcScope.ImplProc.CustomData); ImplProcScope.OverloadName:=ProcScope.OverloadName; + ImplProcScope.JSName:=ProcScope.JSName; end; end; continue; @@ -3483,9 +3481,12 @@ begin // Note: Pascal names of external procs are not in the generated JS, // so no need to rename them continue; + end + else + begin + // proc declaration (header, not body) + RenameOverload(Proc); end; - // proc declaration (header, not body) - RenameOverload(Proc); end else if C.InheritsFrom(TPasType) then begin @@ -3608,6 +3609,7 @@ var NewName: String; ProcScope: TPas2JSProcedureScope; begin + if SpecializedItem=nil then exit; NewName:=SpecializedItem.GenericEl.Name+'$G'+IntToStr(SpecializedItem.Index+1); GenScope:=TPasGenericScope(SpecializedItem.SpecializedEl.CustomData); if GenScope is TPas2JSClassScope then @@ -3630,6 +3632,9 @@ begin end else RaiseNotYetImplemented(20200906203342,SpecializedItem.SpecializedEl,GetObjName(GenScope)); + {$IFDEF VerbosePas2JS} + //writeln('TPas2JSResolver.RenameSpecialized GenericEl=',GetObjPath(SpecializedItem.GenericEl),' Spec=',GetObjPath(SpecializedItem.SpecializedEl),' JSName="',NewName,'"'); + {$ENDIF} end; procedure TPas2JSResolver.PushOverloadScopeSkip; @@ -5021,12 +5026,22 @@ var C: TClass; begin C:=Item.GenericEl.ClassType; - if (C=TPasProcedureType) or (C=TPasFunctionType) then + if (C=TPasProcedureType) + or (C=TPasFunctionType) + or (C=TPasArrayType) + then Result:=inherited CreateSpecializedTypeName(Item) else Result:=Item.GenericEl.Name+'$G'+IntToStr(Item.Index+1); end; +procedure TPas2JSResolver.SpecializeGenericIntf( + SpecializedItem: TPRSpecializedItem); +begin + inherited SpecializeGenericIntf(SpecializedItem); + RenameSpecialized(SpecializedItem); +end; + procedure TPas2JSResolver.SpecializeGenericImpl( SpecializedItem: TPRSpecializedItem); var @@ -6761,18 +6776,15 @@ begin Result:=Result+'s'+IntToStr(ProcScope.SpecializedFromItem.Index); end else - begin Result:=ProcScope.OverloadName; - if Result='' then - Result:=El.Name; - end; - exit; end + else if Data is TPas2JSArrayScope then + Result:=TPas2JSArrayScope(Data).JSName else if Data is TPas2JSProcTypeScope then - begin - Result:=TPas2JSProcTypeScope(Data).JSName; - if Result<>'' then exit; - end; + Result:=TPas2JSProcTypeScope(Data).JSName + else + Result:=''; + if Result<>'' then exit; end; Result:=El.Name; end; @@ -9335,7 +9347,7 @@ begin Result:=CreatePrimitiveDotExpr(JSName,PosEl); end; -function TPasToJSConverter.CreateSubDeclNameExpr(El: TPasElement; +function TPasToJSConverter.CreateSubDeclPasNameExpr(El: TPasElement; const PasName: string; AContext: TConvertContext; PosEl: TPasElement ): TJSElement; var @@ -15394,7 +15406,7 @@ begin // add enumtype: this.TypeName TIProp:=TIObj.Elements.AddElement; TIProp.Name:=TJSString(GetBIName(pbivnRTTIEnum_EnumType)); - TIProp.Expr:=CreateSubDeclNameExpr(El,TResEvalEnum(MinVal).ElType.Name,AContext); + TIProp.Expr:=CreateSubDeclPasNameExpr(El,TResEvalEnum(MinVal).ElType.Name,AContext); // use Pascal name end; Result:=Call; finally @@ -15723,7 +15735,7 @@ begin AddToSourceElements(BodySrc,ReturnSt); ReturnSt.Expr:=CreatePrimitiveDotExpr(CloneResultName,El); - ArrName:=El.Name+GetBIName(pbifnArray_Static_Clone); + ArrName:=GetOverloadName(El,AContext)+GetBIName(pbifnArray_Static_Clone); if El.Parent is TProcedureBody then begin // local array type (elevated to global) @@ -15736,7 +15748,7 @@ begin // -> add 'this.TypeName = function(){}' AssignSt:=TJSSimpleAssignStatement(CreateElement(TJSSimpleAssignStatement,El)); ArraySt:=AssignSt; - AssignSt.LHS:=CreateSubDeclNameExpr(El,ArrName,AContext); + AssignSt.LHS:=CreateSubDeclPasNameExpr(El,ArrName,AContext); AssignSt.Expr:=Func; end; Func:=nil; @@ -18755,7 +18767,7 @@ begin Param:=TJSArrayLiteral(CreateElement(TJSArrayLiteral,Arg)); TargetParams.Elements.AddElement.Expr:=Param; // add "argname" - ArgName:=TransformToJSName(Arg,Arg.Name,true,AContext); + ArgName:=TransformToJSName(Arg,Arg.Name,true,AContext); // use Pascal name Param.Elements.AddElement.Expr:=CreateLiteralString(Arg,ArgName); Flags:=0; // add "argtype" @@ -19203,7 +19215,7 @@ begin Call.Expr:=CreateMemberExpression([GetBIName(pbivnRTTILocal),GetBIName(pbifnRTTIAddProperty)]); // param "propname" - PropName:=TransformToJSName(Prop,Prop.Name,false,AContext); + PropName:=TransformToJSName(Prop,Prop.Name,false,AContext); // use Pascal name Call.AddArg(CreateLiteralString(Prop,PropName)); // add flags @@ -24892,7 +24904,7 @@ begin ListFirst:=TJSStatementList(CreateElement(TJSStatementList,El.Body)); ListLast:=ListFirst; IfSt.BTrue:=ListFirst; - V:=CreateVarStatement(TransformToJSName(El,El.VariableName,true,AContext), + V:=CreateVarStatement(TransformElToJSName(El.VarEl,AContext), CreatePrimitiveDotExpr(GetBIName(pbivnExceptObject),El),El); ListFirst.A:=V; // add statements diff --git a/packages/pastojs/tests/tcgenerics.pas b/packages/pastojs/tests/tcgenerics.pas index bef87a134e..fd278363af 100644 --- a/packages/pastojs/tests/tcgenerics.pas +++ b/packages/pastojs/tests/tcgenerics.pas @@ -2061,28 +2061,30 @@ begin ' s: specialize TStatic;', 'begin', ' d[0].b:=s[1].b;', + ' s:=s;', ''])); Add([ 'uses UnitA;', 'begin', - 'end.']); + '']); ConvertProgram; CheckUnit('UnitA.pas', LinesToStr([ // statements 'rtl.module("UnitA", ["system"], function () {', ' var $mod = this;', ' var $impl = $mod.$impl;', - ' $mod.$rtti.$DynArray("TDyn$G1", {});', + ' $mod.$rtti.$DynArray("TDyn", {});', ' this.TStatic$G1$clone = function (a) {', ' var r = [];', ' for (var i = 0; i < 2; i++) r.push($impl.TBird.$clone(a[i]));', ' return r;', ' };', - ' $mod.$rtti.$StaticArray("TStatic$G1", {', + ' $mod.$rtti.$StaticArray("TStatic", {', ' dims: [2]', ' });', ' $mod.$init = function () {', ' $impl.d[0].b = $impl.s[0].b;', + ' $impl.s = $mod.TStatic$G1$clone($impl.s);', ' };', '}, null, function () {', ' var $mod = this;', @@ -2104,8 +2106,8 @@ begin '});'])); CheckSource('TestGen_Class_ClassVarRecord_UnitImpl', LinesToStr([ // statements - 'pas.UnitA.$rtti["TDyn$G1"].eltype = pas.UnitA.$rtti["TBird"];', - 'pas.UnitA.$rtti["TStatic$G1"].eltype = pas.UnitA.$rtti["TBird"];', + 'pas.UnitA.$rtti["TDyn"].eltype = pas.UnitA.$rtti["TBird"];', + 'pas.UnitA.$rtti["TStatic"].eltype = pas.UnitA.$rtti["TBird"];', '']), LinesToStr([ // $mod.$main ''])); From 60c23daa91f9ed7154c8566e86113aee573e53f7 Mon Sep 17 00:00:00 2001 From: yury Date: Mon, 7 Sep 2020 12:54:20 +0000 Subject: [PATCH 09/12] * Fixed the stack parameters optimization (r46776) for big endian CPUs. git-svn-id: trunk@46794 - --- compiler/ncgutil.pas | 61 ++++++++++++++++++++++++++++++++++---------- compiler/rgobj.pas | 2 +- 2 files changed, 48 insertions(+), 15 deletions(-) diff --git a/compiler/ncgutil.pas b/compiler/ncgutil.pas index 3969742a45..544129216c 100644 --- a/compiler/ncgutil.pas +++ b/compiler/ncgutil.pas @@ -594,26 +594,59 @@ implementation paraloc: PCGParalocation; loc: tlocation; regtype: tregistertype; - reg: tregister; - size: tcgint; + reg,reg2: tregister; + size,regsize: tcgint; begin tparavarsym(sym).paraloc[calleeside].get_location(loc); size:=tparavarsym(sym).paraloc[calleeside].IntSize; paraloc:=tparavarsym(sym).paraloc[calleeside].Location; - reg:=sym.initialloc.register; +{$if defined(cpu64bitalu)} + if sym.initialloc.size in [OS_128,OS_S128] then +{$else} + if sym.initialloc.size in [OS_64,OS_S64] then +{$endif defined(cpu64bitalu)} + begin + if target_info.endian=endian_little then + begin + reg:=sym.initialloc.register; + reg2:=sym.initialloc.registerhi; + end + else + begin + reg:=sym.initialloc.registerhi; + reg2:=sym.initialloc.register; + end; + end + else + begin + reg:=sym.initialloc.register; + reg2:=NR_NO; + end; regtype:=getregtype(reg); - repeat - loc.reference.offset:=paraloc^.reference.offset; - cg.rg[regtype].set_reg_initial_location(reg,loc.reference); - dec(size,tcgsize2size[paraloc^.Size]); + while true do + begin + cg.rg[regtype].set_reg_initial_location(reg,loc.reference); + regsize:=tcgsize2size[reg_cgsize(reg)]; + dec(size,regsize); + if size<=0 then + break; + if paraloc<>nil then + paraloc:=paraloc^.Next; + if paraloc<>nil then + loc.reference.offset:=paraloc^.reference.offset + else + inc(loc.reference.offset,regsize); {$if defined(cpu8bitalu) or defined(cpu16bitalu)} - if cg.has_next_reg[getsupreg(reg)] then - reg:=cg.GetNextReg(reg) - else + if cg.has_next_reg[getsupreg(reg)] then + reg:=cg.GetNextReg(reg) + else {$endif} - reg:=sym.initialloc.registerhi; - paraloc:=paraloc^.Next; - until size=0; + begin + if reg=reg2 then + internalerror(2020090502); + reg:=reg2; + end; + end; end; var @@ -705,7 +738,7 @@ implementation { Notify the register allocator about memory location of the register which holds a value of a stack parameter } if (sym.typ=paravarsym) and - (tparavarsym(sym).paraloc[calleeside].Location^.Loc=LOC_REFERENCE) then + paramanager.param_use_paraloc(tparavarsym(sym).paraloc[calleeside]) then set_para_regvar_initial_location; end; diff --git a/compiler/rgobj.pas b/compiler/rgobj.pas index 123e7e073a..b6b1db27c4 100644 --- a/compiler/rgobj.pas +++ b/compiler/rgobj.pas @@ -2136,7 +2136,7 @@ unit rgobj; supreg: TSuperRegister; begin supreg:=getsupreg(reg); - if supreg>=maxreg then + if (supreg=maxreg) then internalerror(2020090501); alloc_spillinfo(supreg+1); spillinfo[supreg].spilllocation:=ref; From 2f661371fe969b19b3508db8aaf302ffea74154a Mon Sep 17 00:00:00 2001 From: Mattias Gaertner Date: Mon, 7 Sep 2020 17:21:15 +0000 Subject: [PATCH 10/12] pastojs: specialize class/record type using pascal name git-svn-id: trunk@46795 - --- packages/pastojs/src/fppas2js.pp | 99 +++++++++++++++++---------- packages/pastojs/tests/tcgenerics.pas | 36 +++++----- utils/pas2js/dist/rtl.js | 15 ++-- 3 files changed, 87 insertions(+), 63 deletions(-) diff --git a/packages/pastojs/src/fppas2js.pp b/packages/pastojs/src/fppas2js.pp index 8b1e7b4c1e..c258d7a6c9 100644 --- a/packages/pastojs/src/fppas2js.pp +++ b/packages/pastojs/src/fppas2js.pp @@ -2004,7 +2004,8 @@ type Function CreateRecordFunctionAssign(El: TPasRecordType; AContext: TConvertContext; Fields: TFPList): TJSElement; virtual; Procedure CreateRecordRTTI(El: TPasRecordType; Src: TJSSourceElements; - FuncContext: TFunctionContext); virtual; + FuncContext: TFunctionContext; MembersSrc: TJSSourceElements; + MembersFuncContext: TFunctionContext); virtual; Function CreateDelayedInitFunction(PosEl: TPasElement; Src: TJSSourceElements; FuncContext: TFunctionContext; out DelaySrc: TJSSourceElements): TFunctionContext; virtual; // array @@ -2022,12 +2023,12 @@ type // class Procedure AddClassConDestructorFunction(El: TPasClassType; Src: TJSSourceElements; ClassContext: TConvertContext; IsTObject: boolean; Ancestor: TPasType; - Kind: TMemberFunc); + Kind: TMemberFunc); virtual; Procedure AddClassRTTI(El: TPasClassType; Src: TJSSourceElements; - FuncContext: TFunctionContext); - Procedure AddClassConstructors(FuncContext: TFunctionContext; PosEl: TPasElement); + FuncContext: TFunctionContext); virtual; + Procedure AddClassConstructors(FuncContext: TFunctionContext; PosEl: TPasElement); virtual; Procedure AddClassMessageIds(El: TPasClassType; Src: TJSSourceElements; - FuncContext: TFunctionContext; pbivn: TPas2JSBuiltInName); + FuncContext: TFunctionContext; pbivn: TPas2JSBuiltInName); virtual; // misc Function CreateCallback(Expr: TPasExpr; ResolvedEl: TPasResolverResult; aSafeCall: boolean; AContext: TConvertContext): TJSElement; virtual; @@ -2066,7 +2067,9 @@ type AContext: TConvertContext): TJSElement; virtual; Procedure CreateRTTIAnonymous(El: TPasType; AContext: TConvertContext); virtual; Function CreateRTTIMembers(El: TPasMembersType; Src: TJSSourceElements; - FuncContext: TFunctionContext; RTTIExpr: TJSElement; NeedLocalVar: boolean): boolean; virtual; + FuncContext: TFunctionContext; MembersSrc: TJSSourceElements; + MembersFuncContext: TFunctionContext; RTTIExpr: TJSElement; + NeedLocalVar: boolean): boolean; virtual; // create elements for interfaces Procedure AddIntfDelegations(ClassEl: TPasElement; Prop: TPasProperty; FinishedGUIDs: TStringList; ObjLit: TJSObjectLiteral; aContext: TFunctionContext); @@ -5029,6 +5032,8 @@ begin if (C=TPasProcedureType) or (C=TPasFunctionType) or (C=TPasArrayType) + or (C=TPasRecordType) + or (C=TPasClassType) then Result:=inherited CreateSpecializedTypeName(Item) else @@ -6782,6 +6787,10 @@ begin Result:=TPas2JSArrayScope(Data).JSName else if Data is TPas2JSProcTypeScope then Result:=TPas2JSProcTypeScope(Data).JSName + else if Data is TPas2JSRecordScope then + Result:=TPas2JSRecordScope(Data).JSName + else if Data is TPas2JSClassScope then + Result:=TPas2JSClassScope(Data).JSName else Result:=''; if Result<>'' then exit; @@ -14839,9 +14848,9 @@ begin AncestorPath:=CreateReferencePath(Ancestor,AContext,rpkPathAndName); Call.AddArg(CreatePrimitiveDotExpr(AncestorPath,El)); + // for external class: add name of NewInstance function if NeedClassExt then begin - // add the name of the NewInstance function if Scope.NewInstanceFunction<>nil then Call.AddArg(CreateLiteralString( Scope.NewInstanceFunction,Scope.NewInstanceFunction.Name)) @@ -14919,7 +14928,6 @@ begin else if C=TPasMethodResolution then continue else if C=TPasAttributes then - // ToDo continue else RaiseNotSupported(P,FuncContext,20161221233338); @@ -15001,6 +15009,12 @@ begin end;// end of init function + // for specialization: add RTTI name + if (Scope.JSName<>'') and (Scope.JSName<>El.Name) and HasTypeInfo(El,AContext) then + begin + Call.AddArg(CreateLiteralString(El,GetTypeInfoName(El,AContext,El))); + end; + Result:=Call; finally FuncContext.Free; @@ -17281,7 +17295,8 @@ begin end; procedure TPasToJSConverter.CreateRecordRTTI(El: TPasRecordType; - Src: TJSSourceElements; FuncContext: TFunctionContext); + Src: TJSSourceElements; FuncContext: TFunctionContext; + MembersSrc: TJSSourceElements; MembersFuncContext: TFunctionContext); var ObjLit: TJSObjectLiteral; Call: TJSCallExpression; @@ -17294,11 +17309,14 @@ begin if ObjLit=nil then RaiseInconsistency(20190105141430,El); - HasRTTIMembers:=CreateRTTIMembers(El,Src,FuncContext,Call,false); + HasRTTIMembers:=CreateRTTIMembers(El,Src,FuncContext,MembersSrc,MembersFuncContext,Call,false); if not HasRTTIMembers then begin // no published members, add "module.$rtti.$Record..." - AddToSourceElements(Src,Call); + if Src=MembersSrc then + AddToSourceElements(Src,Call) + else + Src.Statements.InsertNode(0).Node:=Call; end; Call:=nil; @@ -17942,29 +17960,30 @@ var ObjLit: TJSObjectLiteral; Call: TJSCallExpression; begin - ClassScope:=El.CustomData as TPas2JSClassScope; - if (ClassScope.SpecializedFromItem<>nil) - and not (coNoTypeInfo in Options) - and FuncContext.Resolver.HasTypeInfo(El) then - begin - // specialized class -> init RTTI - // module.$rtti.$Class("classname"); - Creator:=GetClassBIName(El,FuncContext); - Call:=CreateRTTINewType(El,Creator,true,FuncContext,ObjLit); - if ObjLit<>nil then - RaiseInconsistency(20200606134834,El); - AddHeaderStatement(Call,El,FuncContext); - end; - AttrJS:=nil; - // this.$rtti - RTTIExpr:=CreateMemberExpression(['this',GetBIName(pbivnRTTI)]); + RTTIExpr:=nil; try + ClassScope:=El.CustomData as TPas2JSClassScope; + if (ClassScope.SpecializedFromItem<>nil) + and not (coNoTypeInfo in Options) + and FuncContext.Resolver.HasTypeInfo(El) then + begin + // specialized class -> init RTTI + // add header: module.$rtti.$Class("classname"); + Creator:=GetClassBIName(El,FuncContext); + Call:=CreateRTTINewType(El,Creator,true,FuncContext,ObjLit); + if ObjLit<>nil then + RaiseInconsistency(20200606134834,El); + AddHeaderStatement(Call,El,FuncContext); + end; + + // this.$rtti + RTTIExpr:=CreateMemberExpression(['this',GetBIName(pbivnRTTI)]); Attr:=FuncContext.Resolver.GetAttributeCallsEl(El); AttrJS:=CreateRTTIAttributes(Attr,El,FuncContext); - NeedLocalVar:=AttrJS<>nil; + NeedLocalVar:=(AttrJS<>nil); - HasRTTIMembers:=CreateRTTIMembers(El,Src,FuncContext,RTTIExpr,NeedLocalVar); + HasRTTIMembers:=CreateRTTIMembers(El,Src,FuncContext,Src,FuncContext,RTTIExpr,NeedLocalVar); if HasRTTIMembers then RTTIExpr:=nil; @@ -19368,8 +19387,9 @@ begin end; function TPasToJSConverter.CreateRTTIMembers(El: TPasMembersType; - Src: TJSSourceElements; FuncContext: TFunctionContext; RTTIExpr: TJSElement; - NeedLocalVar: boolean): boolean; + Src: TJSSourceElements; FuncContext: TFunctionContext; + MembersSrc: TJSSourceElements; MembersFuncContext: TFunctionContext; + RTTIExpr: TJSElement; NeedLocalVar: boolean): boolean; type TMemberType = ( mtClass, @@ -19385,7 +19405,10 @@ type // add "var $r = module.$rtti.$Record..." Result:=true; VarSt:=CreateVarStatement(GetBIName(pbivnRTTILocal),RTTIExpr,El); - AddToSourceElements(Src,VarSt); + if Src=MembersSrc then + AddToSourceElements(Src,VarSt) + else + Src.Statements.InsertNode(0).Node:=VarSt; end; var @@ -19432,11 +19455,11 @@ begin NewEl:=nil; if C=TPasVariable then - NewEl:=CreateRTTIMemberField(Members,i,FuncContext) + NewEl:=CreateRTTIMemberField(Members,i,MembersFuncContext) else if C.InheritsFrom(TPasProcedure) then - NewEl:=CreateRTTIMemberMethod(Members,i,FuncContext) + NewEl:=CreateRTTIMemberMethod(Members,i,MembersFuncContext) else if C=TPasProperty then - NewEl:=CreateRTTIMemberProperty(Members,i,FuncContext) + NewEl:=CreateRTTIMemberProperty(Members,i,MembersFuncContext) else if C.InheritsFrom(TPasType) or (C=TPasAttributes) then else @@ -19446,7 +19469,7 @@ begin // add RTTI element if not Result then CreateLocalvar; - AddToSourceElements(Src,NewEl); + AddToSourceElements(MembersSrc,NewEl); end; end; @@ -25272,9 +25295,9 @@ begin if (aResolver<>nil) and HasTypeInfo(El,FuncContext) then begin if SpecializeDelay then - CreateRecordRTTI(El,DelaySrc,DelayFuncContext) + CreateRecordRTTI(El,Src,FuncContext,DelaySrc,DelayFuncContext) else - CreateRecordRTTI(El,Src,FuncContext); + CreateRecordRTTI(El,Src,FuncContext,Src,FuncContext); end; ok:=true; diff --git a/packages/pastojs/tests/tcgenerics.pas b/packages/pastojs/tests/tcgenerics.pas index fd278363af..cd69f43547 100644 --- a/packages/pastojs/tests/tcgenerics.pas +++ b/packages/pastojs/tests/tcgenerics.pas @@ -309,9 +309,9 @@ begin LinesToStr([ // statements 'var $impl = $mod.$impl;', 'rtl.recNewT($mod, "TAnt$G1", function () {', + ' var $r = $mod.$rtti.$Record("TAnt", {});', ' this.$initSpec = function () {', ' this.x = $impl.TBird.$new();', - ' var $r = $mod.$rtti.$Record("TAnt$G1", {});', ' $r.addField("x", $mod.$rtti["TBird"]);', ' };', ' this.$eq = function (b) {', @@ -323,7 +323,7 @@ begin '}, true);', '']), LinesToStr([ // $mod.$init - '$impl.p = $mod.$rtti["TAnt$G1"];', + '$impl.p = $mod.$rtti["TAnt"];', '']), LinesToStr([ // statements 'rtl.recNewT($impl, "TBird", function () {', @@ -598,7 +598,7 @@ begin ConvertProgram; CheckSource('TestGen_Class_TypeInfo', LinesToStr([ // statements - '$mod.$rtti.$Class("TBird$G1");', + '$mod.$rtti.$Class("TBird");', 'rtl.createClass($mod, "TObject", null, function () {', ' this.$init = function () {', ' };', @@ -612,12 +612,12 @@ begin ' };', ' var $r = this.$rtti;', ' $r.addField("m", rtl.word);', - '});', + '}, "TBird");', 'this.b = null;', 'this.p = null;', '']), LinesToStr([ // $mod.$main - '$mod.p = $mod.$rtti["TBird$G1"];', + '$mod.p = $mod.$rtti["TBird"];', '$mod.p = $mod.b.$rtti;', ''])); end; @@ -870,7 +870,7 @@ begin LinesToStr([ // $mod.$main '$mod.w = $mod.c;', ''])); - CheckHint(mtWarning,nClassTypesAreNotRelatedXY,'Class types "TBird$G2" and "TBird$G1" are not related'); + CheckHint(mtWarning,nClassTypesAreNotRelatedXY,'Class types "TBird" and "TBird" are not related'); CheckResolverUnexpectedHints(); end; @@ -1071,8 +1071,8 @@ begin ConvertProgram; CheckSource('TestGen_ClassForward_CircleRTTI', LinesToStr([ // statements - '$mod.$rtti.$Class("TAnt$G2");', - '$mod.$rtti.$Class("TFish$G2");', + '$mod.$rtti.$Class("TAnt");', + '$mod.$rtti.$Class("TFish");', 'rtl.createClass($mod, "TObject", null, function () {', ' this.$init = function () {', ' };', @@ -1091,8 +1091,8 @@ begin ' $mod.TPersistent.$final.call(this);', ' };', ' var $r = this.$rtti;', - ' $r.addField("f", $mod.$rtti["TFish$G2"]);', - '});', + ' $r.addField("f", $mod.$rtti["TFish"]);', + '}, "TAnt");', 'rtl.createClass($mod, "TFish$G2", $mod.TPersistent, function () {', ' this.$init = function () {', ' $mod.TPersistent.$init.call(this);', @@ -1103,14 +1103,14 @@ begin ' $mod.TPersistent.$final.call(this);', ' };', ' var $r = this.$rtti;', - ' $r.addField("a", $mod.$rtti["TAnt$G2"]);', - '});', + ' $r.addField("a", $mod.$rtti["TAnt"]);', + '}, "TFish");', 'this.WordFish = null;', 'this.p = null;', '']), LinesToStr([ // $mod.$main - '$mod.p = $mod.$rtti["TAnt$G2"];', - '$mod.p = $mod.$rtti["TFish$G2"];', + '$mod.p = $mod.$rtti["TAnt"];', + '$mod.p = $mod.$rtti["TFish"];', ''])); end; @@ -1314,11 +1314,11 @@ begin ConvertProgram; CheckSource('TestGen_ExtClass_RTTI', LinesToStr([ // statements - '$mod.$rtti.$ExtClass("TGJSSET$G1", {', + '$mod.$rtti.$ExtClass("TGJSSET", {', ' jsclass: "SET"', '});', '$mod.$rtti.$RefToProcVar("TJSSetEventProc", {', - ' procsig: rtl.newTIProcSig([["value", rtl.jsvalue], ["key", rtl.nativeint], ["set_", $mod.$rtti["TGJSSET$G1"]]])', + ' procsig: rtl.newTIProcSig([["value", rtl.jsvalue], ["key", rtl.nativeint], ["set_", $mod.$rtti["TGJSSET"]]])', '});', 'this.p = null;', '']), @@ -1360,7 +1360,7 @@ begin 'rtl.module("UnitA", ["system"], function () {', ' var $mod = this;', ' var $impl = $mod.$impl;', - ' $mod.$rtti.$ExtClass("TAnt$G1", {', + ' $mod.$rtti.$ExtClass("TAnt", {', ' jsclass: "SET"', ' });', ' $mod.$init = function () {', @@ -1432,7 +1432,7 @@ begin ' this.$final = function () {', ' };', '});', - 'rtl.createInterface($mod, "IBird$G2", "{7D9907A1-5178-37B5-9D32-7BC020005905}", ["GetSize", "SetSize", "DoIt"], $mod.IUnknown);', + 'rtl.createInterface($mod, "IBird$G2", "{33AB51C6-6240-3BDF-B4B0-D48A593EAB0A}", ["GetSize", "SetSize", "DoIt"], $mod.IUnknown);', 'rtl.createClass($mod, "TBird$G1", $mod.TObject, function () {', ' rtl.addIntf(this, $mod.IBird$G2);', '});', diff --git a/utils/pas2js/dist/rtl.js b/utils/pas2js/dist/rtl.js index 8686207afc..efba60fdc1 100644 --- a/utils/pas2js/dist/rtl.js +++ b/utils/pas2js/dist/rtl.js @@ -286,15 +286,16 @@ var rtl = { return parent; }, - initClass: function(c,parent,name,initfn){ + initClass: function(c,parent,name,initfn,rttiname){ + if (!rttiname) rttiname = name; parent[name] = c; c.$class = c; // Note: o.$class === Object.getPrototypeOf(o) - c.$classname = name; + c.$classname = rttiname; parent = rtl.initStruct(c,parent,name); c.$fullname = parent.$name+'.'+name; // rtti if (rtl.debug_rtti) rtl.debug('initClass '+c.$fullname); - var t = c.$module.$rtti.$Class(c.$name,{ "class": c }); + var t = c.$module.$rtti.$Class(rttiname,{ "class": c }); c.$rtti = t; if (rtl.isObject(c.$ancestor)) t.ancestor = c.$ancestor.$rtti; if (!t.ancestor) t.ancestor = null; @@ -302,7 +303,7 @@ var rtl = { initfn.call(c); }, - createClass: function(parent,name,ancestor,initfn){ + createClass: function(parent,name,ancestor,initfn,rttiname){ // create a normal class, // ancestor must be null or a normal class, // the root ancestor can be an external class @@ -340,10 +341,10 @@ var rtl = { this.$final(); }; }; - rtl.initClass(c,parent,name,initfn); + rtl.initClass(c,parent,name,initfn,rttiname); }, - createClassExt: function(parent,name,ancestor,newinstancefnname,initfn){ + createClassExt: function(parent,name,ancestor,newinstancefnname,initfn,rttiname){ // Create a class using an external ancestor. // If newinstancefnname is given, use that function to create the new object. // If exist call BeforeDestruction and AfterConstruction. @@ -391,7 +392,7 @@ var rtl = { if (this[fnname]) this[fnname](); if (this.$final) this.$final(); }; - rtl.initClass(c,parent,name,initfn); + rtl.initClass(c,parent,name,initfn,rttiname); if (isFunc){ function f(){} f.prototype = c; From ce9d7f9995d87e199fcc2728bffb6bc8f2329d78 Mon Sep 17 00:00:00 2001 From: Mattias Gaertner Date: Mon, 7 Sep 2020 19:44:04 +0000 Subject: [PATCH 11/12] pastojs: specialize procedure using pascal name git-svn-id: trunk@46796 - --- packages/pastojs/src/fppas2js.pp | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/packages/pastojs/src/fppas2js.pp b/packages/pastojs/src/fppas2js.pp index c258d7a6c9..56e817c3df 100644 --- a/packages/pastojs/src/fppas2js.pp +++ b/packages/pastojs/src/fppas2js.pp @@ -1513,7 +1513,6 @@ type function GenerateGUID(El: TPasClassType): string; virtual; protected // generic/specialize - function CreateSpecializedTypeName(Item: TPRSpecializedItem): string; override; procedure SpecializeGenericIntf(SpecializedItem: TPRSpecializedItem); override; procedure SpecializeGenericImpl(SpecializedItem: TPRSpecializedItem); @@ -5024,22 +5023,6 @@ begin Result:=Result+'}'; end; -function TPas2JSResolver.CreateSpecializedTypeName(Item: TPRSpecializedItem): string; -var - C: TClass; -begin - C:=Item.GenericEl.ClassType; - if (C=TPasProcedureType) - or (C=TPasFunctionType) - or (C=TPasArrayType) - or (C=TPasRecordType) - or (C=TPasClassType) - then - Result:=inherited CreateSpecializedTypeName(Item) - else - Result:=Item.GenericEl.Name+'$G'+IntToStr(Item.Index+1); -end; - procedure TPas2JSResolver.SpecializeGenericIntf( SpecializedItem: TPRSpecializedItem); begin @@ -19418,8 +19401,10 @@ var C: TClass; NewEl: TJSElement; Members: TFPList; + aResolver: TPas2JSResolver; begin Result:=false; + aResolver:=FuncContext.Resolver; if El.ClassType=TPasRecordType then mt:=mtRecord else if El.ClassType=TPasClassType then @@ -19457,7 +19442,11 @@ begin if C=TPasVariable then NewEl:=CreateRTTIMemberField(Members,i,MembersFuncContext) else if C.InheritsFrom(TPasProcedure) then - NewEl:=CreateRTTIMemberMethod(Members,i,MembersFuncContext) + begin + if aResolver.GetProcTemplateTypes(TPasProcedure(P))<>nil then + continue; // parametrized functions cannot be published + NewEl:=CreateRTTIMemberMethod(Members,i,MembersFuncContext); + end else if C=TPasProperty then NewEl:=CreateRTTIMemberProperty(Members,i,MembersFuncContext) else if C.InheritsFrom(TPasType) From 93eef547ae2ef3996a290ad16ce73d783f339977 Mon Sep 17 00:00:00 2001 From: florian Date: Mon, 7 Sep 2020 20:28:38 +0000 Subject: [PATCH 12/12] * improve call0 calling conventions git-svn-id: trunk@46797 - --- compiler/psub.pas | 2 +- compiler/xtensa/cpupara.pas | 2 ++ compiler/xtensa/cpupi.pas | 3 ++- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/compiler/psub.pas b/compiler/psub.pas index 2ba1fb9807..80466ae310 100644 --- a/compiler/psub.pas +++ b/compiler/psub.pas @@ -1173,7 +1173,7 @@ implementation with an internal error, so this switch is not enabled by default yet. To overcome this, multipass compilation of subroutines must be supported } - if (target_info.abi=abi_xtensa_windowed) and (procdef.stack_tainting_parameter(calleeside)) then + if procdef.stack_tainting_parameter(calleeside) then begin include(flags,pi_estimatestacksize); set_first_temp_offset; diff --git a/compiler/xtensa/cpupara.pas b/compiler/xtensa/cpupara.pas index 89a82115d9..ed8140d239 100644 --- a/compiler/xtensa/cpupara.pas +++ b/compiler/xtensa/cpupara.pas @@ -158,6 +158,8 @@ unit cpupara; begin curintreg:=RS_A2; maxintreg:=RS_A7; + if (side=calleeside) and (current_procinfo.framepointer=NR_STACK_POINTER_REG) then + cur_stack_offset:=(p as tcpuprocdef).total_stackframe_size; end; else Internalerror(2020031404); diff --git a/compiler/xtensa/cpupi.pas b/compiler/xtensa/cpupi.pas index ab4708c3d8..29b2ae8a7e 100644 --- a/compiler/xtensa/cpupi.pas +++ b/compiler/xtensa/cpupi.pas @@ -84,7 +84,8 @@ unit cpupi; callins:=A_CALL0; callxins:=A_CALLX0; maxcall:=0; - framepointer:=NR_FRAME_POINTER_REG; + { we do not use a frame pointer } + framepointer:=NR_STACK_POINTER_REG; end; end;