Răsfoiți Sursa

fcl-js: fixed mem leak

mattias 3 ani în urmă
părinte
comite
32d06f2e87

+ 17 - 13
packages/fcl-js/src/jsparser.pp

@@ -288,9 +288,9 @@ begin
   else
     begin
     FCurrent:=FScanner.FetchToken;
-    FCurrentString:=FScanner.CurTokenString;
+    FCurrentString:=JSBase.TJSString(FScanner.CurTokenString);
     if (FCurrentString='') then
-       FCurrentString:=TokenInfos[FCurrent];
+       FCurrentString:=JSBase.TJSString(TokenInfos[FCurrent]);
     end;
   Result:=FCurrent;
   {$ifdef debugparser}Writeln('GetNextToken (',FScanner.CurLine,',',FScanner.CurColumn,'): ',GetEnumName(TypeInfo(TJSToken),Ord(FCurrent)), ' As string: ',FCurrentString);{$endif debugparser}
@@ -301,7 +301,7 @@ begin
   If (FPeekToken=tjsUnknown) then
     begin
     FPeekToken:=FScanner.FetchToken;
-    FPeekTokenString:=FScanner.CurTokenString;
+    FPeekTokenString:=JSBase.TJSString(FScanner.CurTokenString);
     end;
   {$ifdef debugparser}Writeln('PeekNextToken : ',GetEnumName(TypeInfo(TJSToken),Ord(FPeekToken)), ' As string: ',FPeekTokenString);{$endif debugparser}
   Result:=FPeekToken;
@@ -1183,6 +1183,7 @@ Function TJSParser.ParseTypeArrayDef(aOptions : TParseTypeOptions; aSub : TJSTyp
 // On exit, after ]
 
 begin
+  if aOptions=[] then ;
   Result:=TJSArrayTypeDef(CreateElement(TJSArrayTypeDef));
   Result.BaseType:=aSub;
   Consume(tjsSQuaredBraceOpen);
@@ -1222,6 +1223,7 @@ Function TJSParser.ParseTypeTuple(aOptions : TParseTypeOptions) : TJSTupleTypeDe
 
 
 begin
+  if aOptions=[] then ;;
   Result:=TJSTupleTypeDef(CreateElement(TJSTupleTypeDef));
   ParseTypeList(Result.Values,tjsSQuaredBraceClose,ltTuple);
   Consume(tjsSQuaredBraceClose);
@@ -3669,6 +3671,8 @@ function TJSParser.ParseTypeStatement(Elements : TJSSourceElements; ScopeType :
 
 begin
   Result:=Nil;
+  if ScopeType=stClass then ;
+
   if IsIdentifier('module') then
     Result:=Self.ParseModuleDeclarationStatement
   else if IsIdentifier('namespace') or IsIdentifier('global') then
@@ -3718,14 +3722,14 @@ Var
 
   begin
     if CurrentToken in StatementTokens then
-       begin
-       E:=Self.ParseStatement(IsAmbient);
-       Result.Statements.AddNode(IsAmbient).Node:=E;
-       if E is TJSExportStatement then
-         AddToElements(Result,TJSExportStatement(E).Declaration,IsAmbient,True);
-       end
-     else
-       Done:=True;
+      begin
+      E:=Self.ParseStatement(IsAmbient);
+      Result.Statements.AddNode(IsAmbient).Node:=E;
+      if E is TJSExportStatement then
+        AddToElements(Result,TJSExportStatement(E).Declaration,IsAmbient,True);
+      end
+    else
+      Done:=True;
   end;
 
 begin
@@ -3877,9 +3881,9 @@ begin
   For I:=0 to aClassDef.ElementCount-1 do
     begin
     El:=aClassDef.Elements[i];
-    if el is TJSPropertyDeclaration then
+    if El is TJSPropertyDeclaration then
       aClass.Members.Vars.AddNode(True,False).Node:=El
-    else if el is TJSMethodDeclaration then
+    else if El is TJSMethodDeclaration then
       aClass.Members.Functions.AddNode(True,False).Node:=El;
     end;
 end;

+ 21 - 16
packages/fcl-js/src/jstree.pp

@@ -1231,15 +1231,15 @@ Type
 
   TJSSourceElements = Class(TJSElement)
   private
+    FClasses: TJSElementNodes;
+    FEnums: TJSElementNodes;
     FFunctions: TJSElementNodes;
+    FInterfaces : TJSElementNodes;
     FModules: TJSElementNodes;
     FNamespaces: TJSElementNodes;
     FStatements: TJSElementNodes;
-    FInterfaces : TJSElementNodes;
     FTypes: TJSElementNodes;
-    FEnums: TJSElementNodes;
     FVars: TJSElementNodes;
-    FClasses: TJSElementNodes;
   Public
     Constructor Create(ALine,AColumn : Integer; const ASource : String = ''); override;
     Destructor Destroy; override;
@@ -1732,6 +1732,8 @@ Type
     Property Decl : TJSModuleDeclaration Read FDecl Write FDecl;
   end;
 
+  { TJSNamespaceDeclaration }
+
   TJSNamespaceDeclaration = Class(TJSNamedMembersDeclaration)
   Private
     FIsGlobal : Boolean;
@@ -1965,6 +1967,11 @@ end;
 
 destructor TJSAmbientClassDeclaration.Destroy;
 begin
+  if Members<>nil then
+    begin
+    Members.Vars.ClearNodes;
+    Members.Functions.ClearNodes;
+    end;
   FreeAndNil(FClassDef);
   inherited Destroy;
 end;
@@ -2328,6 +2335,7 @@ end;
 
 destructor TJSMembersDeclaration.Destroy;
 begin
+  FreeAndNil(FMembers);
   inherited Destroy;
 end;
 
@@ -3430,8 +3438,7 @@ end;
 
 { TJSSourceElements }
 
-constructor TJSSourceElements.Create(ALine, AColumn: Integer; const ASource: String
-  );
+constructor TJSSourceElements.Create(ALine, AColumn: Integer; const ASource: String);
 
   Function CN(aName : String; DoClear : Boolean = True) : TJSElementNodes;
   begin
@@ -3442,30 +3449,28 @@ constructor TJSSourceElements.Create(ALine, AColumn: Integer; const ASource: Str
 
 begin
   inherited Create(ALine, AColumn, ASource);
-  FStatements:=CN('Statements',False);
-  FFunctions:=CN('Functions',False);
-  FVars:=CN('Vars');
   FClasses:=CN('Classes');
+  FEnums:=CN('Enums');
+  FFunctions:=CN('Functions',False);
+  FInterfaces:=CN('Interfaces');
   FModules:=CN('Modules');
   FNamespaces:=CN('Namespaces');
+  FStatements:=CN('Statements',False);
   FTypes:=CN('Types');
-  FInterfaces:=CN('Interfaces');
-  FEnums:=CN('Enums');
+  FVars:=CN('Vars');
 end;
 
 destructor TJSSourceElements.Destroy;
-
-
 begin
   // Vars, types, enums, classes, interfaces are owned by their statements, and those are freed later
   FreeAndNil(FVars);
-  FreeAndNil(FClasses);
-  FreeAndNil(FEnums);
   FreeAndNil(FTypes);
-  FreeAndNil(FInterfaces);
-  FreeAndNil(FModules);
   FreeAndNil(FNamespaces);
+  FreeAndNil(FModules);
+  FreeAndNil(FInterfaces);
   FreeAndNil(FFunctions);
+  FreeAndNil(FEnums);
+  FreeAndNil(FClasses);
   // Must come last
   FreeAndNil(FStatements);
   inherited Destroy;

+ 1 - 1
packages/fcl-js/tests/tctstopas.pp

@@ -163,7 +163,7 @@ procedure TTestTSToPas.Convert(aSource: TStrings);
 Var
   S : TStream;
 begin
-  S:=TStringStream.Create(aSource.text);
+  S:=TStringStream.Create(aSource.Text);
   try
     FConverter.InputStream:=S;
     FConverter.Execute;