summaryrefslogtreecommitdiff
path: root/packages/pastojs
diff options
context:
space:
mode:
authornickysn <nickysn@3ad0048d-3df7-0310-abae-a5850022a9f2>2021-03-08 00:52:43 +0000
committernickysn <nickysn@3ad0048d-3df7-0310-abae-a5850022a9f2>2021-03-08 00:52:43 +0000
commit62c237e276fb82d4b6f2ea98b9c0014279cda9b7 (patch)
tree1ac876dc6e8dc31d920557e2ed2451fac8f0079d /packages/pastojs
parentefc9f396e6322803ca30817ffbb7efa47f056254 (diff)
parent4651201c4ac47d0c9f757aa9c5032c38e74ac89d (diff)
downloadfpc-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.pp55
-rw-r--r--packages/pastojs/tests/tcmodules.pas7
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;',