diff options
author | nickysn <nickysn@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2021-03-08 00:52:43 +0000 |
---|---|---|
committer | nickysn <nickysn@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2021-03-08 00:52:43 +0000 |
commit | 62c237e276fb82d4b6f2ea98b9c0014279cda9b7 (patch) | |
tree | 1ac876dc6e8dc31d920557e2ed2451fac8f0079d /packages/pastojs | |
parent | efc9f396e6322803ca30817ffbb7efa47f056254 (diff) | |
parent | 4651201c4ac47d0c9f757aa9c5032c38e74ac89d (diff) | |
download | fpc-62c237e276fb82d4b6f2ea98b9c0014279cda9b7.tar.gz |
* synchronized with trunk
git-svn-id: https://svn.freepascal.org/svn/fpc/branches/wasm@48906 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'packages/pastojs')
-rw-r--r-- | packages/pastojs/src/fppas2js.pp | 55 | ||||
-rw-r--r-- | packages/pastojs/tests/tcmodules.pas | 7 |
2 files changed, 44 insertions, 18 deletions
diff --git a/packages/pastojs/src/fppas2js.pp b/packages/pastojs/src/fppas2js.pp index 2865296ddc..bb479e22f8 100644 --- a/packages/pastojs/src/fppas2js.pp +++ b/packages/pastojs/src/fppas2js.pp @@ -6877,20 +6877,22 @@ function TPas2JSResolver.IsTGUID(TypeEl: TPasRecordType): boolean; var Members: TFPList; El: TPasElement; + MemberIndex, i: Integer; begin Result:=false; if not SameText(TypeEl.Name,'TGUID') then exit; Members:=TypeEl.Members; - if Members.Count<4 then exit; - El:=TPasElement(Members[0]); - if not SameText(El.Name,'D1') then exit; - El:=TPasElement(Members[1]); - if not SameText(El.Name,'D2') then exit; - El:=TPasElement(Members[2]); - if not SameText(El.Name,'D3') then exit; - El:=TPasElement(Members[3]); - if not SameText(El.Name,'D4') then exit; - Result:=true; + i:=1; + for MemberIndex:=0 to Members.Count-1 do + begin + El:=TPasElement(Members[MemberIndex]); + if (El.ClassType<>TPasVariable) then continue; + if SameText(El.Name,'D'+IntToStr(i)) then + begin + if i=4 then exit(true); + inc(i); + end; + end; end; function TPas2JSResolver.GetAssignGUIDString(TypeEl: TPasRecordType; @@ -15577,11 +15579,11 @@ begin RaiseNotSupported(El,AContext,20170927183645); if El.Parent is TProcedureBody then RaiseNotSupported(El,AContext,20181231004355); + if not aResolver.IsFullySpecialized(El) then exit; if El.IsForward then exit(ConvertClassForwardType(El,AContext)) else if El.IsExternal then exit(ConvertExtClassType(El,AContext)); - if not aResolver.IsFullySpecialized(El) then exit; if El.CustomData is TPas2JSClassScope then begin @@ -20518,34 +20520,51 @@ function TPasToJSConverter.CreateGUIDObjLit(aTGUIDRecord: TPasRecordType; const GUID: TGUID; PosEl: TPasElement; AContext: TConvertContext ): TJSObjectLiteral; var + i: integer; Members: TFPList; + + function GetMember(const aName: string): TPasElement; + begin + while i<Members.Count do + begin + Result:=TPasElement(Members[i]); + inc(i); + if (Result is TPasVariable) then + if SameText(Result.Name,aName) then + exit + else + RaiseInconsistency(20180415094721,PosEl); + end; + RaiseInconsistency(20210306223031,PosEl); + end; + +var PropEl: TJSObjectLiteralElement; MemberEl: TPasElement; ArrLit: TJSArrayLiteral; - i: Integer; begin Members:=aTGUIDRecord.Members; Result:=TJSObjectLiteral(CreateElement(TJSObjectLiteral,PosEl)); + i:=0; + // D1: 0x12345678 + MemberEl:=GetMember('D1'); PropEl:=Result.Elements.AddElement; - MemberEl:=TPasElement(Members[0]); - if not SameText(MemberEl.Name,'D1') then - RaiseInconsistency(20180415094721,PosEl); PropEl.Name:=TJSString(TransformElToJSName(MemberEl,AContext)); PropEl.Expr:=CreateLiteralHexNumber(PosEl,GUID.D1,8); // D2: 0x1234 + MemberEl:=GetMember('D2'); PropEl:=Result.Elements.AddElement; - MemberEl:=TPasElement(Members[1]); PropEl.Name:=TJSString(TransformElToJSName(MemberEl,AContext)); PropEl.Expr:=CreateLiteralHexNumber(PosEl,GUID.D2,4); // D3: 0x1234 + MemberEl:=GetMember('D3'); PropEl:=Result.Elements.AddElement; - MemberEl:=TPasElement(Members[2]); PropEl.Name:=TJSString(TransformElToJSName(MemberEl,AContext)); PropEl.Expr:=CreateLiteralHexNumber(PosEl,GUID.D3,4); // D4: [0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12] + MemberEl:=GetMember('D4'); PropEl:=Result.Elements.AddElement; - MemberEl:=TPasElement(Members[3]); PropEl.Name:=TJSString(TransformElToJSName(MemberEl,AContext)); ArrLit:=TJSArrayLiteral(CreateElement(TJSArrayLiteral,PosEl)); PropEl.Expr:=ArrLit; diff --git a/packages/pastojs/tests/tcmodules.pas b/packages/pastojs/tests/tcmodules.pas index 1092da987a..8731d86b8f 100644 --- a/packages/pastojs/tests/tcmodules.pas +++ b/packages/pastojs/tests/tcmodules.pas @@ -31794,6 +31794,9 @@ begin ' [TCustom(1)]', ' TMyClass = class', ' end;', + ' [TCustom(11)]', + ' TMyDescendant = class(TMyClass)', + ' end;', ' [TCustom(2)]', ' TRec = record', ' end;', @@ -31826,6 +31829,10 @@ begin ' var $r = this.$rtti;', ' $r.attr = [$mod.TCustomAttribute, "Create", [1]];', '});', + 'rtl.createClass(this, "TMyDescendant", this.TMyClass, function () {', + ' var $r = this.$rtti;', + ' $r.attr = [$mod.TCustomAttribute, "Create", [11]];', + '});', 'rtl.recNewT(this, "TRec", function () {', ' this.$eq = function (b) {', ' return true;', |