You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@royale.apache.org by gr...@apache.org on 2020/02/10 04:32:41 UTC

[royale-compiler] 02/02: Fix for compiler memory leak. Fixes issue #117. This was a long-standing bug related to accumulation of BindingDataBase instances over multiple compilations in a static collection.

This is an automated email from the ASF dual-hosted git repository.

gregdove pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/royale-compiler.git

commit b79cc128997f6ac67caadeb825c8a46aa4866eb5
Author: greg-dove <gr...@gmail.com>
AuthorDate: Mon Feb 10 17:26:23 2020 +1300

    Fix for compiler memory leak. Fixes issue #117.
    This was a long-standing bug related to accumulation of BindingDataBase instances over multiple compilations in a static collection.
---
 .../mxml/royale/MXMLRoyaleASDocEmitter.java        |  4 +++-
 .../codegen/mxml/royale/MXMLRoyaleEmitter.java     |  7 +++++--
 .../codegen/databinding/BindingDatabase.java       |  4 +---
 .../databinding/MXMLBindingDirectiveHelper.java    |  2 +-
 .../compiler/internal/projects/RoyaleProject.java  | 22 +++++++++++++---------
 .../royale/compiler/projects/IRoyaleProject.java   | 14 ++++++++++----
 6 files changed, 33 insertions(+), 20 deletions(-)

diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleASDocEmitter.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleASDocEmitter.java
index 69885c4..3aae3b8 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleASDocEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleASDocEmitter.java
@@ -43,6 +43,7 @@ import org.apache.royale.compiler.internal.codegen.js.utils.EmitterUtils;
 import org.apache.royale.compiler.internal.codegen.mxml.MXMLEmitter;
 import org.apache.royale.compiler.internal.projects.RoyaleProject;
 import org.apache.royale.compiler.projects.ICompilerProject;
+import org.apache.royale.compiler.projects.IRoyaleProject;
 import org.apache.royale.compiler.tree.ASTNodeID;
 import org.apache.royale.compiler.tree.as.*;
 import org.apache.royale.compiler.tree.mxml.*;
@@ -595,7 +596,8 @@ public class MXMLRoyaleASDocEmitter extends MXMLEmitter implements
             String overrideID = MXMLRoyaleEmitterTokens.BINDING_PREFIX.getToken() + bindingCounter++;
 	        setProp.id = overrideID;
 	        instances.add(setProp);
-	        BindingDatabase bd = BindingDatabase.bindingMap.get(classDefinition);
+            IRoyaleProject project = (IRoyaleProject)(walker.getProject());
+            BindingDatabase bd = project.getBindingMap().get(classDefinition);
 	        Set<BindingInfo> bindingInfo = bd.getBindingInfo();
 	        IMXMLDataBindingNode bindingNode = (IMXMLDataBindingNode)propertyOrStyleNode.getChild(0);
 	        for (BindingInfo bi : bindingInfo)
diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleEmitter.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleEmitter.java
index b89850d..34b1480 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/mxml/royale/MXMLRoyaleEmitter.java
@@ -92,6 +92,7 @@ import org.apache.royale.compiler.internal.tree.mxml.MXMLBindingNode;
 import org.apache.royale.compiler.mxml.IMXMLLanguageConstants;
 import org.apache.royale.compiler.problems.FileNotFoundProblem;
 import org.apache.royale.compiler.projects.ICompilerProject;
+import org.apache.royale.compiler.projects.IRoyaleProject;
 import org.apache.royale.compiler.scopes.IDefinitionSet;
 import org.apache.royale.compiler.tree.ASTNodeID;
 import org.apache.royale.compiler.tree.as.*;
@@ -1483,7 +1484,8 @@ public class MXMLRoyaleEmitter extends MXMLEmitter implements
 
     protected void emitBindingData(String cname, IClassDefinition cdef)
     {
-        BindingDatabase bd = BindingDatabase.bindingMap.get(cdef);
+		IRoyaleProject project = (IRoyaleProject)(walker.getProject());
+		BindingDatabase bd = project.getBindingMap().get(cdef);
         if (bd == null)
             return;
         if (bd.getBindingInfo().isEmpty())
@@ -2541,7 +2543,8 @@ public class MXMLRoyaleEmitter extends MXMLEmitter implements
             String overrideID = MXMLRoyaleEmitterTokens.BINDING_PREFIX.getToken() + bindingCounter++;
 	        setProp.id = overrideID;
 	        instances.add(setProp);
-	        BindingDatabase bd = BindingDatabase.bindingMap.get(classDefinition);
+			IRoyaleProject project = (IRoyaleProject)(walker.getProject());
+			BindingDatabase bd = project.getBindingMap().get(classDefinition);
 	        Set<BindingInfo> bindingInfo = bd.getBindingInfo();
 	        IMXMLDataBindingNode bindingNode = (IMXMLDataBindingNode)propertyOrStyleNode.getChild(0);
 	        for (BindingInfo bi : bindingInfo)
diff --git a/compiler/src/main/java/org/apache/royale/compiler/internal/codegen/databinding/BindingDatabase.java b/compiler/src/main/java/org/apache/royale/compiler/internal/codegen/databinding/BindingDatabase.java
index 43d392c..d1df60c 100644
--- a/compiler/src/main/java/org/apache/royale/compiler/internal/codegen/databinding/BindingDatabase.java
+++ b/compiler/src/main/java/org/apache/royale/compiler/internal/codegen/databinding/BindingDatabase.java
@@ -90,9 +90,7 @@ public class BindingDatabase
    private boolean analysisFinished = false;
    
    private static List<BindingDatabase> _diagnosticLogger;
-   
-   public static WeakHashMap<IClassDefinition, BindingDatabase> bindingMap = new WeakHashMap<IClassDefinition, BindingDatabase>();
-   
+
    /**
     * test only field. Total number of watcher info's of all types
     */
diff --git a/compiler/src/main/java/org/apache/royale/compiler/internal/codegen/databinding/MXMLBindingDirectiveHelper.java b/compiler/src/main/java/org/apache/royale/compiler/internal/codegen/databinding/MXMLBindingDirectiveHelper.java
index 78712cf..7ea4cc4 100644
--- a/compiler/src/main/java/org/apache/royale/compiler/internal/codegen/databinding/MXMLBindingDirectiveHelper.java
+++ b/compiler/src/main/java/org/apache/royale/compiler/internal/codegen/databinding/MXMLBindingDirectiveHelper.java
@@ -86,7 +86,7 @@ public class MXMLBindingDirectiveHelper
     public MXMLBindingDirectiveHelper(MXMLClassDirectiveProcessor ddp, IABCVisitor emitter)
     {
         host = ddp;
-        BindingDatabase.bindingMap.put(ddp.getClassDefinition(), bindingDataBase);
+        ddp.getProject().getBindingMap().put(ddp.getClassDefinition(), bindingDataBase);
         this.emitter = emitter;
     }
     
diff --git a/compiler/src/main/java/org/apache/royale/compiler/internal/projects/RoyaleProject.java b/compiler/src/main/java/org/apache/royale/compiler/internal/projects/RoyaleProject.java
index 2f2d26a..b85c412 100644
--- a/compiler/src/main/java/org/apache/royale/compiler/internal/projects/RoyaleProject.java
+++ b/compiler/src/main/java/org/apache/royale/compiler/internal/projects/RoyaleProject.java
@@ -24,15 +24,7 @@ import static com.google.common.collect.Lists.transform;
 import java.io.File;
 import java.io.FileWriter;
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 
 import org.apache.commons.io.FileUtils;
 
@@ -66,6 +58,7 @@ import org.apache.royale.compiler.definitions.references.ReferenceFactory;
 import org.apache.royale.compiler.exceptions.LibraryCircularDependencyException;
 import org.apache.royale.compiler.filespecs.IFileSpecification;
 import org.apache.royale.compiler.internal.as.codegen.BindableHelper;
+import org.apache.royale.compiler.internal.codegen.databinding.BindingDatabase;
 import org.apache.royale.compiler.internal.css.CSSManager;
 import org.apache.royale.compiler.internal.css.codegen.CSSCompilationSession;
 import org.apache.royale.compiler.internal.definitions.ClassDefinition;
@@ -2625,4 +2618,15 @@ public class RoyaleProject extends ASProject implements IRoyaleProject, ICompile
     public boolean isStaticTypedTarget() {
 	    return true;
     }
+
+
+    private WeakHashMap<IClassDefinition, BindingDatabase> bindingMap = new WeakHashMap<IClassDefinition, BindingDatabase>();
+    /**
+     * Support for access to BindingData from the class definition as key.
+     * @return
+     */
+    public WeakHashMap<IClassDefinition, BindingDatabase> getBindingMap(){
+        return bindingMap;
+    }
+
 }
diff --git a/compiler/src/main/java/org/apache/royale/compiler/projects/IRoyaleProject.java b/compiler/src/main/java/org/apache/royale/compiler/projects/IRoyaleProject.java
index cfb8080..b003466 100644
--- a/compiler/src/main/java/org/apache/royale/compiler/projects/IRoyaleProject.java
+++ b/compiler/src/main/java/org/apache/royale/compiler/projects/IRoyaleProject.java
@@ -20,10 +20,7 @@
 package org.apache.royale.compiler.projects;
 
 import java.io.File;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import java.util.*;
 
 import org.apache.royale.compiler.common.DependencyTypeSet;
 import org.apache.royale.compiler.common.XMLName;
@@ -31,7 +28,9 @@ import org.apache.royale.compiler.config.Configuration;
 import org.apache.royale.compiler.config.RSLSettings;
 import org.apache.royale.compiler.css.ICSSManager;
 import org.apache.royale.compiler.css.ICSSRule;
+import org.apache.royale.compiler.definitions.IClassDefinition;
 import org.apache.royale.compiler.exceptions.LibraryCircularDependencyException;
+import org.apache.royale.compiler.internal.codegen.databinding.BindingDatabase;
 import org.apache.royale.compiler.internal.config.IWriteOnlyProjectSettings;
 import org.apache.royale.compiler.internal.css.CSSManager;
 import org.apache.royale.compiler.internal.mxml.MXMLNamespaceMapping;
@@ -246,4 +245,11 @@ public interface IRoyaleProject extends IASProject, IXMLNameResolver, IWriteOnly
      */
     boolean isStaticTypedTarget();
 
+
+    /**
+     * Support for access to BindingData from the class definition as key.
+     * @return
+     */
+    WeakHashMap<IClassDefinition, BindingDatabase> getBindingMap();
+
 }