diff --git a/packages/pastojs/src/fppas2js.pp b/packages/pastojs/src/fppas2js.pp index 109c8b5621..22cdb254be 100644 --- a/packages/pastojs/src/fppas2js.pp +++ b/packages/pastojs/src/fppas2js.pp @@ -18545,7 +18545,6 @@ const AssignSt.Expr:=FDS; FD:=FDS.AFunction; FD.Params.Add(EqualParamName); - FD.Body:=TJSFunctionBody(CreateElement(TJSFunctionBody,El)); // add "return " RetSt:=TJSReturnStatement(CreateElement(TJSReturnStatement,El)); FD.Body.A:=RetSt; diff --git a/packages/pastojs/src/pas2jsfilecache.pp b/packages/pastojs/src/pas2jsfilecache.pp index af54be12c0..f1235c65af 100644 --- a/packages/pastojs/src/pas2jsfilecache.pp +++ b/packages/pastojs/src/pas2jsfilecache.pp @@ -2097,6 +2097,7 @@ begin l:=ms.Size-ms.Position; if l>0 then begin + s:=''; SetLength(s,l); ms.Read(s[1],l); end diff --git a/packages/pastojs/src/pas2jsfiler.pp b/packages/pastojs/src/pas2jsfiler.pp index aab2e607f5..e4c8933d53 100644 --- a/packages/pastojs/src/pas2jsfiler.pp +++ b/packages/pastojs/src/pas2jsfiler.pp @@ -563,6 +563,10 @@ type end; TPCUFilerElementRefArray = array of TPCUFilerElementRef; + TPCUFilerElementRef2 = class(TPCUFilerElementRef) + s: string; + end; + { TPCUFiler - base class TPCUWriter/TPCUReader} TPCUFiler = class @@ -1822,10 +1826,18 @@ begin end; function TPCUFiler.CreateElementRef(El: TPasElement): TPCUFilerElementRef; +var + Node: TAVLTreeNode; begin Result:=TPCUFilerElementRef.Create; Result.Element:=El; + {$IFDEF MemCheck} + Node:=FElementRefs.Add(Result); + if Node<>FElementRefs.FindKey(El,@CompareElWithPCUFilerElementRef) then + RaiseMsg(20180711222046,El); + {$ELSE} FElementRefs.Add(Result); + {$ENDIF} end; procedure TPCUFiler.AddedBuiltInRef(Ref: TPCUFilerElementRef); @@ -4063,7 +4075,8 @@ begin if RefEl is TPasType then begin El.VarType:=TPasType(RefEl); - RefEl.AddRef; + if RefEl.Parent<>El then + RefEl.AddRef; end else RaiseMsg(20180211121809,El,GetObjName(RefEl)); @@ -4076,7 +4089,8 @@ begin if RefEl is TPasType then begin El.DestType:=TPasType(RefEl); - RefEl.AddRef; + if RefEl.Parent<>El then + RefEl.AddRef; end else RaiseMsg(20180211121801,El,GetObjName(RefEl)); @@ -4090,7 +4104,8 @@ begin if RefEl is TPasType then begin El.DestType:=TPasType(RefEl); - RefEl.AddRef; + if RefEl.Parent<>El then + RefEl.AddRef; end else RaiseMsg(20180211121757,El,GetObjName(RefEl)); @@ -4104,7 +4119,8 @@ begin if RefEl is TPasType then begin El.DestType:=TPasType(RefEl); - RefEl.AddRef; + if RefEl.Parent<>El then + RefEl.AddRef; end else RaiseMsg(20180211121750,El,GetObjName(RefEl)); @@ -4117,7 +4133,8 @@ begin if RefEl is TPasType then begin El.ElType:=TPasType(RefEl); - RefEl.AddRef; + if RefEl.Parent<>El then + RefEl.AddRef; end else RaiseMsg(20180211121732,El,GetObjName(RefEl)); @@ -4130,7 +4147,8 @@ begin if RefEl is TPasType then begin El.ElType:=TPasType(RefEl); - RefEl.AddRef; + if RefEl.Parent<>El then + RefEl.AddRef; end else RaiseMsg(20180211121726,El,GetObjName(RefEl)); @@ -4143,7 +4161,8 @@ begin if RefEl is TPasType then begin El.EnumType:=TPasType(RefEl); - RefEl.AddRef; + if RefEl.Parent<>El then + RefEl.AddRef; end else RaiseMsg(20180211121714,El,GetObjName(RefEl)); @@ -4156,7 +4175,8 @@ begin if RefEl is TPasRecordType then begin El.Members:=TPasRecordType(RefEl); - RefEl.AddRef; + if RefEl.Parent<>El then + RefEl.AddRef; end else RaiseMsg(20180211121657,El,GetObjName(RefEl)); @@ -4170,7 +4190,8 @@ begin if (RefEl is TPasType) or (RefEl.ClassType=TPasVariable) then begin El.VariantEl:=RefEl; - RefEl.AddRef; + if RefEl.Parent<>El then + RefEl.AddRef; end else RaiseMsg(20180210205031,El,GetObjName(RefEl)); @@ -4183,7 +4204,8 @@ begin if RefEl is TPasType then begin El.ArgType:=TPasType(RefEl); - RefEl.AddRef; + if RefEl.Parent<>El then + RefEl.AddRef; end else RaiseMsg(20180211121643,El,GetObjName(RefEl)); @@ -4251,7 +4273,8 @@ begin if RefEl is TPasType then begin El.AncestorType:=TPasType(RefEl); - RefEl.AddRef; + if RefEl.Parent<>El then + RefEl.AddRef; end else RaiseMsg(20180211121632,El,GetObjName(RefEl)); @@ -4265,7 +4288,8 @@ begin if RefEl is TPasType then begin El.HelperForType:=TPasType(RefEl); - RefEl.AddRef; + if RefEl.Parent<>El then + RefEl.AddRef; end else RaiseMsg(20180211121612,El,GetObjName(RefEl)); @@ -4279,7 +4303,8 @@ begin if RefEl is TPasType then begin El.ResultType:=TPasType(RefEl); - RefEl.AddRef; + if RefEl.Parent<>El then + RefEl.AddRef; end else RaiseMsg(20180211121537,El,GetObjName(RefEl)); @@ -4358,7 +4383,8 @@ begin begin Scope:=El.CustomData as TPasEnumTypeScope; Scope.CanonicalSet:=TPasSetType(RefEl); - RefEl.AddRef; + if RefEl.Parent<>El then + RefEl.AddRef; end else RaiseMsg(20180316215238,Scope.Element,GetObjName(RefEl)); @@ -4555,6 +4581,9 @@ var RefItem: TPCUFilerPendingElRef; PendingElRef: TPCUReaderPendingElRef; PendingElListRef: TPCUReaderPendingElListRef; + {$IF defined(VerbosePCUFiler) or defined(memcheck)} + Node: TAVLTreeNode; + {$ENDIF} begin if Id<=0 then RaiseMsg(20180207151233,ErrorEl); @@ -4580,18 +4609,30 @@ begin end else begin - Ref:=TPCUFilerElementRef.Create; + Ref:=TPCUFilerElementRef2.Create; + TPCUFilerElementRef2(Ref).s:=IntToStr(Id); Ref.Id:=Id; end; + {$IF defined(VerbosePCUFiler) or defined(memcheck)} + if FElementRefsArray[Id]<>nil then + RaiseMsg(20180711212859,ErrorEl,IntToStr(Id)+' is not FElementRefsArray[Id]'); + {$ENDIF} FElementRefsArray[Id]:=Ref; end; Result:=Ref; - if El=nil then exit; - - if Ref.Element=nil then + if El=nil then + exit + else if Ref.Element=nil then begin Ref.Element:=El; + {$IF defined(VerbosePCUFiler) or defined(memcheck)} + Node:=FElementRefs.FindKey(El,@CompareElWithPCUFilerElementRef); + if Node<>nil then + RaiseMsg(20180711231646,El,GetObjName(TPCUFilerElementRef2(Node.Data).Element)); + {$ENDIF} + FElementRefs.Add(Ref); + if Ref.Pending<>nil then begin // resolve pending references @@ -7520,13 +7561,19 @@ end; destructor TPCUReader.Destroy; begin + FreeAndNil(FJSON); inherited Destroy; FreeAndNil(FPendingIdentifierScopes); FreeAndNil(FInitialFlags); end; procedure TPCUReader.Clear; +var + i: Integer; begin + for i:=0 to length(FElementRefsArray)-1 do + if (FElementRefsArray[i]<>nil) and (FElementRefsArray[i].Element=nil) then + FElementRefsArray[i].Free; FElementRefsArray:=nil; FPendingIdentifierScopes.Clear; inherited Clear; @@ -7543,6 +7590,7 @@ var Count: Cardinal; Src: TStream; begin + FirstBytes:=''; SetLength(FirstBytes,4); if aStream.Read(FirstBytes[1],4)<4 then RaiseMsg(20180313232754,nil);