Browse Source

pastojs: started TPasElement free instead of refence count

mattias 3 years ago
parent
commit
a01c20ad20

+ 2 - 0
packages/fcl-js/src/jstree.pp

@@ -86,6 +86,8 @@ Type
 
   { TJSElement }
 
+  { TJSObject }
+
   TJSObject = Class(TObject);
 
 

+ 19 - 2
packages/pastojs/src/fppas2js.pp

@@ -2583,11 +2583,15 @@ end;
 procedure TPas2JSModuleScope.SetJSPromiseClass(const AValue: TPasClassType);
 begin
   if FJSPromiseClass=AValue then Exit;
+  {$IFNDEF EnablePasTreeFree}
   if FJSPromiseClass<>nil then
     FJSPromiseClass.Release{$IFDEF CheckPasTreeRefCount}('TPas2JSModuleScope.SetJSPromiseClass'){$ENDIF};
+  {$ENDIF}
   FJSPromiseClass:=AValue;
+  {$IFNDEF EnablePasTreeFree}
   if FJSPromiseClass<>nil then
     FJSPromiseClass.AddRef{$IFDEF CheckPasTreeRefCount}('TPas2JSModuleScope.SetJSPromiseClass'){$ENDIF};
+  {$ENDIF}
 end;
 
 procedure TPas2JSModuleScope.ClearStoreJSLocalVars;
@@ -4487,6 +4491,9 @@ begin
             RaiseMsg(20170322134321,nInvalidVariableModifier,
               sInvalidVariableModifier,['export name'],El.ExportName);
           El.ExportName:=TPrimitiveExpr.Create(El,pekString,''''+El.Name+'''');
+          {$IFDEF EnablePasTreeFree}
+          FOwnedElements.Add(El.ExportName);
+          {$ENDIF}
           end;
         Include(El.VarModifiers,vmExternal);
         end;
@@ -4705,6 +4712,9 @@ begin
                 sInvalidXModifierY,[Proc.ElementTypeName,'symbol name'],Proc.LibrarySymbolName);
             Proc.Modifiers:=Proc.Modifiers+[pmExternal];
             Proc.LibrarySymbolName:=TPrimitiveExpr.Create(Proc,pekString,''''+Proc.Name+'''');
+            {$IFDEF EnablePasTreeFree}
+            FOwnedElements.Add(Proc.LibrarySymbolName);
+            {$ENDIF}
             end;
 
           if Proc.Visibility=visPublished then
@@ -6436,7 +6446,11 @@ var
 begin
   inherited ClearBuiltInIdentifiers;
   for bt in TPas2jsBaseType do
+    {$IFDEF EnablePasTreeFree}
+    FJSBaseTypes[bt]:=nil;
+    {$ELSE}
     ReleaseAndNil(TPasElement(FJSBaseTypes[bt]){$IFDEF CheckPasTreeRefCount},'TPasResolver.AddCustomBaseType'{$ENDIF});
+    {$ENDIF}
   for pbp in TPas2jsBuiltInProc do
     FJSBuiltInProcs[pbp]:=nil;
 end;
@@ -7616,12 +7630,16 @@ begin
         raise EPas2JS.Create('');
         end;
     Data.CustomData:=CustomData;
+    {$IFNDEF EnablePasTreeFree}
     TPasElement(FElement).Release{$IFDEF CheckPasTreeRefCount}('TPas2JsElementData.SetElement'){$ENDIF};
+    {$ENDIF}
     end;
   FElement:=AValue;
   if FElement<>nil then
     begin
+    {$IFNDEF EnablePasTreeFree}
     TPasElement(FElement).AddRef{$IFDEF CheckPasTreeRefCount}('TPas2JsElementData.SetElement'){$ENDIF};
+    {$ENDIF}
     Data:=FElement;
     while Data.CustomData is TPasElementBase do
       Data:=TPasElementBase(Data.CustomData);
@@ -17583,7 +17601,6 @@ var
       begin
       Result:=TJSFunctionBody(CreateElement(TJSFunctionBody,PosEl));
       FuncDef.Body:=Result;
-      Result.A:=TJSSourceElements(CreateElement(TJSSourceElements, PosEl));
       end;
     if FuncContext=nil then
       FuncContext:=TFunctionContext.Create(PosEl,Result,AContext);
@@ -20038,13 +20055,13 @@ begin
     VarSt:=TJSVariableStatement(CreateElement(TJSVariableStatement,PosEl));
     Statements.A:=VarSt;
     // List
-    List:=ConvertExpression(El.StartExpr,AContext); // beware: might fail
     PosEl:=El.StartExpr;
     // List.GetEnumerator()
     if aResolver.IsHelperMethod(GetEnumeratorFunc) then
       Call:=CreateCallHelperMethod(GetEnumeratorFunc,El.StartExpr,AContext,true)
     else
       begin
+      List:=ConvertExpression(El.StartExpr,AContext); // beware: might fail
       Call:=TJSCallExpression(CreateElement(TJSCallExpression,PosEl));
       Call.Expr:=CreateDotExpression(PosEl,List,
                          CreateIdentifierExpr(GetEnumeratorFunc,AContext),true);

+ 4 - 0
packages/pastojs/src/pas2jscompiler.pp

@@ -1013,9 +1013,13 @@ begin
   FreeAndNil(FScanner);
   FreeAndNil(FFileResolver);
   FreeAndNil(FPasResolver);
+  {$IFDEF EnablePasTreeFree}
+  FPasModule:=nil;
+  {$ELSE}
   if FPasModule<>nil then
     FPasModule.ReleaseUsedUnits;
   ReleaseAndNil(TPasElement(FPasModule){$IFDEF CheckPasTreeRefCount},'CreateElement'{$ENDIF});
+  {$ENDIF}
   inherited Destroy;
 end;
 

+ 60 - 0
packages/pastojs/src/pas2jsfiler.pp

@@ -5107,8 +5107,10 @@ begin
   if RefEl is TPasType then
     begin
     El.VarType:=TPasType(RefEl);
+    {$IFNDEF EnablePasTreeFree}
     if RefEl.Parent<>El then
       RefEl.AddRef{$IFDEF CheckPasTreeRefCount}('TPasVariable.VarType'){$ENDIF};
+    {$ENDIF}
     end
   else
     RaiseMsg(20180211121809,El,GetObjName(RefEl));
@@ -5121,8 +5123,10 @@ begin
   if RefEl is TPasType then
     begin
     El.DestType:=TPasType(RefEl);
+    {$IFNDEF EnablePasTreeFree}
     if RefEl.Parent<>El then
       RefEl.AddRef{$IFDEF CheckPasTreeRefCount}('TPasAliasType.DestType'){$ENDIF};
+    {$ENDIF}
     end
   else
     RaiseMsg(20180211121801,El,GetObjName(RefEl));
@@ -5136,8 +5140,10 @@ begin
   if RefEl is TPasType then
     begin
     El.DestType:=TPasType(RefEl);
+    {$IFNDEF EnablePasTreeFree}
     if RefEl.Parent<>El then
       RefEl.AddRef{$IFDEF CheckPasTreeRefCount}('TPasPointerType.DestType'){$ENDIF};
+    {$ENDIF}
     end
   else
     RaiseMsg(20180211121757,El,GetObjName(RefEl));
@@ -5150,8 +5156,10 @@ begin
   if RefEl is TPasType then
     begin
     El.ElType:=TPasType(RefEl);
+    {$IFNDEF EnablePasTreeFree}
     if RefEl.Name<>'' then
       RefEl.AddRef{$IFDEF CheckPasTreeRefCount}('TPasArrayType.ElType'){$ENDIF};
+    {$ENDIF}
     end
   else
     RaiseMsg(20180211121732,El,GetObjName(RefEl));
@@ -5164,8 +5172,10 @@ begin
   if RefEl is TPasType then
     begin
     El.ElType:=TPasType(RefEl);
+    {$IFNDEF EnablePasTreeFree}
     if RefEl.Parent<>El then
       RefEl.AddRef{$IFDEF CheckPasTreeRefCount}('TPasFileType.ElType'){$ENDIF};
+    {$ENDIF}
     end
   else
     RaiseMsg(20180211121726,El,GetObjName(RefEl));
@@ -5178,8 +5188,10 @@ begin
   if RefEl is TPasType then
     begin
     El.EnumType:=TPasType(RefEl);
+    {$IFNDEF EnablePasTreeFree}
     if RefEl.Parent<>El then
       RefEl.AddRef{$IFDEF CheckPasTreeRefCount}('TPasSetType.EnumType'){$ENDIF};
+    {$ENDIF}
     end
   else
     RaiseMsg(20180211121714,El,GetObjName(RefEl));
@@ -5192,8 +5204,10 @@ begin
   if RefEl is TPasRecordType then
     begin
     El.Members:=TPasRecordType(RefEl);
+    {$IFNDEF EnablePasTreeFree}
     if RefEl.Parent<>El then
       RefEl.AddRef{$IFDEF CheckPasTreeRefCount}('TPasVariant.Members'){$ENDIF};
+    {$ENDIF}
     end
   else
     RaiseMsg(20180211121657,El,GetObjName(RefEl));
@@ -5207,8 +5221,10 @@ begin
   if (RefEl is TPasType) or (RefEl.ClassType=TPasVariable) then
     begin
     El.VariantEl:=RefEl;
+    {$IFNDEF EnablePasTreeFree}
     if RefEl.Parent<>El then
       RefEl.AddRef{$IFDEF CheckPasTreeRefCount}('TPasRecordType.VariantEl'){$ENDIF};
+    {$ENDIF}
     end
   else
     RaiseMsg(20180210205031,El,GetObjName(RefEl));
@@ -5232,8 +5248,10 @@ begin
   if RefEl is TPasType then
     begin
     El.ArgType:=TPasType(RefEl);
+    {$IFNDEF EnablePasTreeFree}
     if RefEl.Parent<>El then
       RefEl.AddRef{$IFDEF CheckPasTreeRefCount}('TPasArgument.ArgType'){$ENDIF};
+    {$ENDIF}
     end
   else
     RaiseMsg(20180211121643,El,GetObjName(RefEl));
@@ -5306,8 +5324,10 @@ begin
   if RefEl is TPasType then
     begin
     El.AncestorType:=TPasType(RefEl);
+    {$IFNDEF EnablePasTreeFree}
     if RefEl.Parent<>El then
       RefEl.AddRef{$IFDEF CheckPasTreeRefCount}('TPasClassType.AncestorType'){$ENDIF};
+    {$ENDIF}
     end
   else
     RaiseMsg(20180211121632,El,GetObjName(RefEl));
@@ -5321,8 +5341,10 @@ begin
   if RefEl is TPasType then
     begin
     El.HelperForType:=TPasType(RefEl);
+    {$IFNDEF EnablePasTreeFree}
     if RefEl.Parent<>El then
       RefEl.AddRef{$IFDEF CheckPasTreeRefCount}('TPasClassType.HelperForType'){$ENDIF};
+    {$ENDIF}
     end
   else
     RaiseMsg(20180211121612,El,GetObjName(RefEl));
@@ -5336,8 +5358,10 @@ begin
   if RefEl is TPasType then
     begin
     El.ResultType:=TPasType(RefEl);
+    {$IFNDEF EnablePasTreeFree}
     if RefEl.Parent<>El then
       RefEl.AddRef{$IFDEF CheckPasTreeRefCount}('TPasResultElement.ResultType'){$ENDIF};
+    {$ENDIF}
     end
   else
     RaiseMsg(20180211121537,El,GetObjName(RefEl));
@@ -5445,8 +5469,10 @@ begin
     begin
     Scope:=El.CustomData as TPasEnumTypeScope;
     Scope.CanonicalSet:=TPasSetType(RefEl);
+    {$IFNDEF EnablePasTreeFree}
     if RefEl.Parent<>El then
       RefEl.AddRef{$IFDEF CheckPasTreeRefCount}('TPasEnumTypeScope.CanonicalSet'){$ENDIF};
+    {$ENDIF}
     end
   else
     RaiseMsg(20180316215238,Scope.Element,GetObjName(RefEl));
@@ -5492,8 +5518,10 @@ begin
   if RefEl is TPasType then
     begin
     El.TypeEl:=TPasType(RefEl);
+    {$IFNDEF EnablePasTreeFree}
     if RefEl.Parent<>El then
       RefEl.AddRef{$IFDEF CheckPasTreeRefCount}('TPasVariable.VarType'){$ENDIF};
+    {$ENDIF}
     end
   else
     RaiseMsg(20200115214455,El,GetObjName(RefEl));
@@ -6067,15 +6095,19 @@ begin
           begin
           PendingElListRef:=TPCUReaderPendingElListRef(RefItem);
           PendingElListRef.List[PendingElListRef.Index]:=Ref.Element;
+          {$IFNDEF EnablePasTreeFree}
           if PendingElListRef.AddRef{$IFDEF CheckPasTreeRefCount}<>''{$ENDIF} then
             Ref.Element.AddRef{$IFDEF CheckPasTreeRefCount}(PendingElListRef.AddRef){$ENDIF};
+          {$ENDIF}
           end
         else if RefItem is TPCUReaderPendingElArrRef then
           begin
           PendingElArrRef:=TPCUReaderPendingElArrRef(RefItem);
           PendingElArrRef.Arr[PendingElArrRef.Index]:=Ref.Element;
+          {$IFNDEF EnablePasTreeFree}
           if PendingElArrRef.AddRef{$IFDEF CheckPasTreeRefCount}<>''{$ENDIF} then
             Ref.Element.AddRef{$IFDEF CheckPasTreeRefCount}(PendingElArrRef.AddRef){$ENDIF};
+          {$ENDIF}
           end
         else if RefItem is TPCUReaderPendingElScopeRef then
           begin
@@ -6128,8 +6160,10 @@ begin
     begin
     // element was already created -> set list item immediately
     List[Index]:=Ref.Element;
+    {$IFNDEF EnablePasTreeFree}
     if AddRef{$IFDEF CheckPasTreeRefCount}<>''{$ENDIF} then
       Ref.Element.AddRef{$IFDEF CheckPasTreeRefCount}(AddRef){$ENDIF};
+    {$ENDIF}
     end
   else
     begin
@@ -6155,8 +6189,10 @@ begin
     begin
     // element was already created -> set list item immediately
     Arr[Index]:=Ref.Element;
+    {$IFNDEF EnablePasTreeFree}
     if AddRef{$IFDEF CheckPasTreeRefCount}<>''{$ENDIF} then
       Ref.Element.AddRef{$IFDEF CheckPasTreeRefCount}(AddRef){$ENDIF};
+    {$ENDIF}
     end
   else
     begin
@@ -6977,7 +7013,9 @@ begin
       if Module=nil then
         RaiseMsg(20180307231247,Use);
       Use.Module:=Module;
+      {$IFNDEF EnablePasTreeFree}
       Module.AddRef{$IFDEF CheckPasTreeRefCount}('TPasUsesUnit.Module'){$ENDIF};
+      {$ENDIF}
       if ReadInteger(UsesObj,'Id',Id,Use) then
         AddElReference(Id,Use,Use);
       end;
@@ -7229,7 +7267,9 @@ begin
   if not (Result is BaseClass) then
     begin
     s:=GetObjName(Result);
+    {$IFNDEF EnablePasTreeFree}
     Result.Release{$IFDEF CheckPasTreeRefCount}('CreateElement'){$ENDIF};;
+    {$ENDIF}
     Result:=nil;
     RaiseMsg(20180211105744,Parent,PropName+' is '+s);
     end;
@@ -7358,8 +7398,10 @@ begin
     if not (SubEl is TPasType) then
       begin
       s:=GetObjName(SubEl);
+      {$IFNDEF EnablePasTreeFree}
       if SubEl<>nil then
         SubEl.Release{$IFDEF CheckPasTreeRefCount}('CreateElement'){$ENDIF};
+      {$ENDIF}
       RaiseMsg(20180210150730,El,PropName+', expected type, but got '+s);
       end;
     ReadElement(SubObj,SubEl,aContext);
@@ -7567,8 +7609,10 @@ begin
     if not (El is TPasExpr) then
       begin
       s:=GetObjName(El);
+      {$IFNDEF EnablePasTreeFree}
       if El<>nil then
         El.Release{$IFDEF CheckPasTreeRefCount}('CreateElement'){$ENDIF};
+      {$ENDIF}
       RaiseMsg(20180210152134,Parent,PropName+' got '+s);
       end;
     ReadElement(SubObj,El,aContext);
@@ -8096,7 +8140,9 @@ begin
     if not ok then
       if Result<>nil then
         begin
+        {$IFNDEF EnablePasTreeFree}
         Result.Release{$IFDEF CheckPasTreeRefCount}('CreateElement'){$ENDIF};
+        {$ENDIF}
         Result:=nil;
         end;
   end;
@@ -8569,8 +8615,10 @@ begin
   if not (Expr is TBinaryExpr) then
     begin
     s:=GetObjName(Expr);
+    {$IFNDEF EnablePasTreeFree}
     if Expr<>nil then
       Expr.Release{$IFDEF CheckPasTreeRefCount}('CreateElement'){$ENDIF};
+    {$ENDIF}
     RaiseMsg(20180216204042,El,s);
     end;
   El.RangeExpr:=TBinaryExpr(Expr);
@@ -8987,7 +9035,9 @@ begin
     CanonicalClassOf.SourceFilename:=aClass.SourceFilename;
     CanonicalClassOf.SourceLinenumber:=aClass.SourceLinenumber;
     CanonicalClassOf.DestType:=aClass;
+    {$IFNDEF EnablePasTreeFree}
     aClass.AddRef{$IFDEF CheckPasTreeRefCount}('TPasClassScope.CanonicalClassOf'){$ENDIF};
+    {$ENDIF}
     if ReadInteger(Obj,'ClassOf',CanonicalClassOfId,CanonicalClassOf) then
       AddElReference(CanonicalClassOfId,CanonicalClassOf,CanonicalClassOf);
     end;
@@ -9411,7 +9461,11 @@ var
   GenType: TPasGenericTemplateType;
   NamePart: TProcedureNamePart;
 begin
+  {$IFDEF EnablePasTreeFree}
+  FreeProcNameParts(El.NameParts);
+  {$ELSE}
   ReleaseProcNameParts(El.NameParts);
+  {$ENDIF}
   if ReadArray(Obj,'NameParts',Arr,El) then
     begin
     if El.NameParts=nil then
@@ -9617,7 +9671,9 @@ begin
           if not (ImplEl is TPasImplBlock) then
             begin
             s:=GetObjName(ImplEl);
+            {$IFNDEF EnablePasTreeFree}
             ImplEl.Release;
+            {$ENDIF}
             RaiseMsg(20191231171840,ProcBody,s);
             end;
           ProcBody.Body:=TPasImplBlock(ImplEl);
@@ -9876,7 +9932,9 @@ begin
     if Sub is TPasImplCaseElse then
       begin
       El.ElseBranch:=TPasImplCaseElse(Sub);
+      {$IFNDEF EnablePasTreeFree}
       Sub.AddRef;
+      {$ENDIF}
       end;
     end;
 end;
@@ -9984,7 +10042,9 @@ begin
   if El.VarEl<>nil then
     begin
     El.TypeEl:=El.VarEl.VarType;
+    {$IFNDEF EnablePasTreeFree}
     El.TypeEl.AddRef{$IFDEF CheckPasTreeRefCount}('TPasVariable.VarType'){$ENDIF};
+    {$ENDIF}
     end
   else
     ReadElType(Obj,'VarType',El,@Set_ExceptOn_TypeEl,aContext);

+ 2 - 0
packages/pastojs/tests/tcfiler.pas

@@ -532,11 +532,13 @@ begin
     FreeAndNil(FRestAnalyzer);
     RestParser.Free;
     RestScanner.Free;
+    {$IFNDEF EnablePasTreeFree}
     if (RestResolver<>nil) and (RestResolver.RootElement<>nil) then
       begin
       RestResolver.RootElement.ReleaseUsedUnits;
       RestResolver.RootElement.Release{$IFDEF CheckPasTreeRefCount}('CreateElement'){$ENDIF};
       end;
+    {$ENDIF}
     RestResolver.Free; // free parser before resolver
     RestFileResolver.Free;
 

+ 8 - 0
packages/pastojs/tests/tcmodules.pas

@@ -1645,10 +1645,14 @@ begin
       CurModule:=TTestEnginePasResolver(FResolvers[i]).Module;
       if CurModule=nil then continue;
       //writeln('TCustomTestModule.TearDown ReleaseUsedUnits ',CurModule.Name,' ',CurModule.RefCount,' ',CurModule.RefIds.Text);
+      {$IFNDEF EnablePasTreeFree}
       CurModule.ReleaseUsedUnits;
+      {$ENDIF}
       end;
+    {$IFNDEF EnablePasTreeFree}
     if FModule<>nil then
       FModule.ReleaseUsedUnits;
+    {$ENDIF}
     for i:=0 to FResolvers.Count-1 do
       begin
       CurModule:=TTestEnginePasResolver(FResolvers[i]).Module;
@@ -1656,7 +1660,11 @@ begin
       //writeln('TCustomTestModule.TearDown UsesReleased ',CurModule.Name,' ',CurModule.RefCount,' ',CurModule.RefIds.Text);
       end;
     FreeAndNil(FResolvers);
+    {$IFDEF EnablePasTreeFree}
+    FModule:=nil;
+    {$ELSE}
     ReleaseAndNil(TPasElement(FModule){$IFDEF CheckPasTreeRefCount},'CreateElement'{$ENDIF});
+    {$ENDIF}
     FEngine:=nil;
     end;
   FreeAndNil(FHub);