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();
+
}