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:39 UTC

[royale-compiler] branch develop updated (b6fd010 -> b79cc12)

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

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


    from b6fd010  TestRoyaleAccessors: more tests for custom namespaces, including member access and static (for commit ac42eadd5a8b8d89bc66c997d811aeb9b75b5bb1)
     new 4aa7217  Fix for duplicate for-each loop processing observed in MXML code block. Also tidy-up: swapped the variation in AST mutation between dynamic and static targets to be driven by the IRoyaleProject instance.
     new b79cc12  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.

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../internal/codegen/js/jx/MethodEmitter.java      |  2 +-
 .../mxml/royale/MXMLRoyaleASDocEmitter.java        |  4 ++-
 .../codegen/mxml/royale/MXMLRoyaleEmitter.java     |  7 +++--
 .../internal/projects/RoyaleJSProject.java         | 10 ++++++-
 .../compiler/internal/as/codegen/ABCGenerator.java |  2 +-
 .../as/codegen/ClassDirectiveProcessor.java        |  2 +-
 .../as/codegen/GlobalDirectiveProcessor.java       |  2 +-
 .../codegen/databinding/BindingDatabase.java       |  4 +--
 .../databinding/MXMLBindingDirectiveHelper.java    |  2 +-
 .../compiler/internal/projects/RoyaleProject.java  | 28 ++++++++++++------
 .../royale/compiler/internal/scopes/ASScope.java   | 24 +++++++++++++++
 .../royale/compiler/projects/IRoyaleProject.java   | 21 ++++++++++---
 .../main/java/org/apache/royale/utils/ASTUtil.java | 24 ++++++++-------
 .../org/apache/royale/utils/ArrayLikeUtil.java     | 34 +++++++++++++++-------
 14 files changed, 119 insertions(+), 47 deletions(-)


[royale-compiler] 01/02: Fix for duplicate for-each loop processing observed in MXML code block. Also tidy-up: swapped the variation in AST mutation between dynamic and static targets to be driven by the IRoyaleProject instance.

Posted by gr...@apache.org.
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 4aa72174fdb0f3963ba6af95ed6cb4ca87dabfdb
Author: greg-dove <gr...@gmail.com>
AuthorDate: Mon Feb 10 14:24:15 2020 +1300

    Fix for duplicate for-each loop processing observed in MXML code block.
    Also tidy-up: swapped the variation in AST mutation between dynamic and static targets to be driven by the IRoyaleProject instance.
---
 .../internal/codegen/js/jx/MethodEmitter.java      |  2 +-
 .../internal/projects/RoyaleJSProject.java         | 10 ++++++-
 .../compiler/internal/as/codegen/ABCGenerator.java |  2 +-
 .../as/codegen/ClassDirectiveProcessor.java        |  2 +-
 .../as/codegen/GlobalDirectiveProcessor.java       |  2 +-
 .../compiler/internal/projects/RoyaleProject.java  |  6 ++++
 .../royale/compiler/internal/scopes/ASScope.java   | 24 +++++++++++++++
 .../royale/compiler/projects/IRoyaleProject.java   |  7 +++++
 .../main/java/org/apache/royale/utils/ASTUtil.java | 24 ++++++++-------
 .../org/apache/royale/utils/ArrayLikeUtil.java     | 34 +++++++++++++++-------
 10 files changed, 86 insertions(+), 27 deletions(-)

diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/MethodEmitter.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/MethodEmitter.java
index e765816..64ca55f 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/MethodEmitter.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/codegen/js/jx/MethodEmitter.java
@@ -64,7 +64,7 @@ public class MethodEmitter extends JSSubEmitter implements
         ICompilerProject project = getWalker().getProject();
 
         fjs.getDocEmitter().emitMethodDoc(node, project);
-        ASTUtil.processFunctionNode(fn, project, true);
+        ASTUtil.processFunctionNode(fn, project);
         
         boolean isConstructor = node.isConstructor();
 
diff --git a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/projects/RoyaleJSProject.java b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/projects/RoyaleJSProject.java
index 14a5b99..acb4a2e 100644
--- a/compiler-jx/src/main/java/org/apache/royale/compiler/internal/projects/RoyaleJSProject.java
+++ b/compiler-jx/src/main/java/org/apache/royale/compiler/internal/projects/RoyaleJSProject.java
@@ -662,7 +662,7 @@ public class RoyaleJSProject extends RoyaleProject
     }
 
 
-	@Override
+
 	public File getLinkReport(Configuration config) {
 		File f = config.getLinkReport();
 		if (f != null)
@@ -680,4 +680,12 @@ public class RoyaleJSProject extends RoyaleProject
 		}
 		return f;
 	}
+
+    /**
+     * JS Projects do not have static typing at runtime
+     */
+    @Override
+    public boolean isStaticTypedTarget() {
+        return false;
+    }
 }
diff --git a/compiler/src/main/java/org/apache/royale/compiler/internal/as/codegen/ABCGenerator.java b/compiler/src/main/java/org/apache/royale/compiler/internal/as/codegen/ABCGenerator.java
index 10e47d8..7e93f95 100644
--- a/compiler/src/main/java/org/apache/royale/compiler/internal/as/codegen/ABCGenerator.java
+++ b/compiler/src/main/java/org/apache/royale/compiler/internal/as/codegen/ABCGenerator.java
@@ -714,7 +714,7 @@ public class ABCGenerator implements ICodeGenerator
         {
             assert !methodInfo.isNative() : "Native methods should be handled in the main thread and not be dispatched to a background thread!";
             functionNode.parseFunctionBody(enclosingScope.getProblems());
-            ASTUtil.processFunctionNode(functionNode, enclosingScope.getProject(), false);
+            ASTUtil.processFunctionNode(functionNode, enclosingScope.getProject());
             generateMethodBodyForFunction(deferredVisitEnds, methodInfo, functionNode, enclosingScope, null);
         }
         
diff --git a/compiler/src/main/java/org/apache/royale/compiler/internal/as/codegen/ClassDirectiveProcessor.java b/compiler/src/main/java/org/apache/royale/compiler/internal/as/codegen/ClassDirectiveProcessor.java
index 744c058..e41fd66 100644
--- a/compiler/src/main/java/org/apache/royale/compiler/internal/as/codegen/ClassDirectiveProcessor.java
+++ b/compiler/src/main/java/org/apache/royale/compiler/internal/as/codegen/ClassDirectiveProcessor.java
@@ -785,7 +785,7 @@ class ClassDirectiveProcessor extends DirectiveProcessor
         final boolean is_constructor = func.isConstructor();
         
         ICompilerProject project = classScope.getProject();
-        ASTUtil.processFunctionNode(func, project, false);
+        ASTUtil.processFunctionNode(func, project);
         boolean isBindable = false;
         if (funcDef instanceof AccessorDefinition)
         {
diff --git a/compiler/src/main/java/org/apache/royale/compiler/internal/as/codegen/GlobalDirectiveProcessor.java b/compiler/src/main/java/org/apache/royale/compiler/internal/as/codegen/GlobalDirectiveProcessor.java
index b9d2013..8416abd 100644
--- a/compiler/src/main/java/org/apache/royale/compiler/internal/as/codegen/GlobalDirectiveProcessor.java
+++ b/compiler/src/main/java/org/apache/royale/compiler/internal/as/codegen/GlobalDirectiveProcessor.java
@@ -157,7 +157,7 @@ class GlobalDirectiveProcessor extends DirectiveProcessor
         else
         {
             f.parseFunctionBody(currentScope.getProblems());
-            ASTUtil.processFunctionNode(f, currentScope.getProject(), false);
+            ASTUtil.processFunctionNode(f, currentScope.getProject());
             return currentScope.getGenerator().generateFunction(f, this.currentScope, null, null);
         }
     }
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 1c8dd1c..2f2d26a 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
@@ -2619,4 +2619,10 @@ public class RoyaleProject extends ASProject implements IRoyaleProject, ICompile
         this.swfDebugfileAlias = swfDebugfileAlias;
     }
 
+    /**
+     * SWF/default Projects have static typing at runtime
+     */
+    public boolean isStaticTypedTarget() {
+	    return true;
+    }
 }
diff --git a/compiler/src/main/java/org/apache/royale/compiler/internal/scopes/ASScope.java b/compiler/src/main/java/org/apache/royale/compiler/internal/scopes/ASScope.java
index da46edc..faa68c3 100644
--- a/compiler/src/main/java/org/apache/royale/compiler/internal/scopes/ASScope.java
+++ b/compiler/src/main/java/org/apache/royale/compiler/internal/scopes/ASScope.java
@@ -132,6 +132,27 @@ public abstract class ASScope extends ASScopeBase
     }
     public void addLoopCheck(IForLoopNode value){
         if (loopChecks == null) loopChecks = CheapArray.create(1);
+        else {
+            int len = CheapArray.size(loopChecks);
+            boolean exitEarly = false;
+            //sometimes the same for loop exists as more than one instance for the same source locations.
+            //this seems to happen somtimes in mxml code blocks.
+            //The following makes sure that only one instance representing the same source code location is tracked
+            //for ArrayLike inspection
+            for (int i=0; i<len; i++) {
+                IForLoopNode existing = (IForLoopNode) CheapArray.get(i, loopChecks);
+                if (existing.getAbsoluteStart() == value.getAbsoluteStart()
+                    && existing.getAbsoluteEnd() == value.getAbsoluteEnd()
+                    && existing.getSourcePath().equals(value.getSourcePath())) {
+                    CheapArray.replace(i, value, loopChecks);
+                    exitEarly = true;
+                    break;
+                }
+            }
+            if (exitEarly) {
+               return;
+            }
+        }
         CheapArray.add(value, loopChecks);
     }
     public IForLoopNode[] getLoopChecks(boolean remove){
@@ -166,6 +187,9 @@ public abstract class ASScope extends ASScopeBase
         
         if (usedNamespaces != null)
             CheapArray.optimize(usedNamespaces, EMPTY_USE_ARRAY);
+
+        if (loopChecks != null)
+            CheapArray.optimize(loopChecks, EMPTY_LOOPCHECK_ARRAY);
     }
 
     public void addNamespaceDirective(NamespaceDefinition.INamespaceDirective directive)
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 f1a63db..cfb8080 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
@@ -239,4 +239,11 @@ public interface IRoyaleProject extends IASProject, IXMLNameResolver, IWriteOnly
      */
     File getLinkReport(Configuration config);
 
+
+    /**
+     * classifier for the Target type
+     * true for targets with static typing at runtime, false for dynamic typing at runtime
+     */
+    boolean isStaticTypedTarget();
+
 }
diff --git a/compiler/src/main/java/org/apache/royale/utils/ASTUtil.java b/compiler/src/main/java/org/apache/royale/utils/ASTUtil.java
index af23f1d..8f6b037 100644
--- a/compiler/src/main/java/org/apache/royale/utils/ASTUtil.java
+++ b/compiler/src/main/java/org/apache/royale/utils/ASTUtil.java
@@ -22,21 +22,23 @@ package org.apache.royale.utils;
 
 import org.apache.royale.compiler.internal.tree.as.FunctionNode;
 import org.apache.royale.compiler.projects.ICompilerProject;
+import org.apache.royale.compiler.projects.IRoyaleProject;
 
 public class ASTUtil {
     
-    public static void processFunctionNode(FunctionNode funcNode, ICompilerProject project, boolean dynamicTarget) {
-        if (funcNode.isImplicit()) {
-            //we don't care about implicit nodes (e.g. generated constructors)
-            //and they may not have all the 'real' definition data populated anyway, such as contained ASScope
-            return;
+    public static void processFunctionNode(FunctionNode funcNode, ICompilerProject project) {
+        if (project instanceof IRoyaleProject) {
+            if (funcNode.isImplicit()) {
+                //we don't care about implicit nodes (e.g. generated constructors)
+                //and they may not have all the 'real' definition data populated anyway, such as contained ASScope
+                return;
+            }
+            ArrayLikeUtil.preProcessGetterSetters(project, funcNode.getScopedNode(), null);
+            if (funcNode.getDefinition().getContainedScope().getHasLoopCheck()) {
+                //pre-process for 'ArrayLike' for-each mutations
+                ArrayLikeUtil.preProcessLoopChecks(funcNode.getDefinition().getContainedScope(), (IRoyaleProject) project);
+            }
         }
-        ArrayLikeUtil.preProcessGetterSetters(project, funcNode.getScopedNode(), null);
-        if (funcNode.getDefinition().getContainedScope().getHasLoopCheck()) {
-            //pre-process for 'ArrayLike' for-each mutations
-            ArrayLikeUtil.preProcessLoopChecks(funcNode.getDefinition().getContainedScope(), project, dynamicTarget);
-        }
-       
     }
     
     
diff --git a/compiler/src/main/java/org/apache/royale/utils/ArrayLikeUtil.java b/compiler/src/main/java/org/apache/royale/utils/ArrayLikeUtil.java
index c34d70c..5f01496 100644
--- a/compiler/src/main/java/org/apache/royale/utils/ArrayLikeUtil.java
+++ b/compiler/src/main/java/org/apache/royale/utils/ArrayLikeUtil.java
@@ -35,6 +35,7 @@ import org.apache.royale.compiler.problems.ArrayLikeConfigurationErrorProblem;
 import org.apache.royale.compiler.problems.ArrayLikeUsageErrorProblem;
 import org.apache.royale.compiler.problems.ICompilerProblem;
 import org.apache.royale.compiler.projects.ICompilerProject;
+import org.apache.royale.compiler.projects.IRoyaleProject;
 import org.apache.royale.compiler.tree.as.*;
 
 import java.util.*;
@@ -112,6 +113,9 @@ public class ArrayLikeUtil
      * on the arrayLike instance
      */
     public static void preProcessGetterSetters(ICompilerProject project, ContainerNode node, NodeBase lower ) {
+        if (!(project instanceof IRoyaleProject)) {
+            return;
+        }
         NodeBase parent = lower != null ? lower : node;
         int childCount = parent.getChildCount();
         for (int i=0; i < childCount; i++) {
@@ -273,6 +277,9 @@ public class ArrayLikeUtil
     }
     
     private static boolean isArrayLikeCandidate(DynamicAccessNode dynNode, ICompilerProject project) {
+        if (!(project instanceof IRoyaleProject)) {
+            return false;
+        }
         boolean isCandidate = false;
         //first check to see if the access is numeric... if it is not then we consider that it is not a candidate
         IDefinition dynType = dynNode.getRightOperandNode().resolveType(project);
@@ -303,16 +310,14 @@ public class ArrayLikeUtil
      * main support for loop mutations to support RoyaleArrayLikes as targets of 'for each' loops
      * @param searchScope
      * @param project
-     * @param useDynamicAccess
      */
-    public static void preProcessLoopChecks(ASScope searchScope,ICompilerProject project, boolean useDynamicAccess) {
-
+    public static void preProcessLoopChecks(ASScope searchScope, IRoyaleProject project) {
         ScopedBlockNode funcScopeNode = (ScopedBlockNode) searchScope.getScopeNode();
         
         IForLoopNode[] forLoops = searchScope.getLoopChecks(true);
         List<IForLoopNode> forLoopList = Arrays.asList(forLoops);
         boolean importAdded = false;
-        ArrayList<String> usedIterators = new ArrayList<String>();
+        ArrayList<String> usedIterators = new ArrayList<>();
         for (IForLoopNode loopNode : forLoopList) {
             int depth = 0;
             IASNode nodeCheck = loopNode;
@@ -413,7 +418,8 @@ public class ArrayLikeUtil
                 // {!alreadyUsed: var} originalName{!alreadyUsed: :OriginalType} =  arrIter.getNext();
                 // {originalBody Loop body}
                 // }
-        
+
+                boolean useDynamicAccess = !project.isStaticTypedTarget();
                 ForLoopNode.ILoopMutation mutation = ArrayLikeUtil.createArrayLikeLoopMutation((ForLoopNode) loopNode, arrIter, useDynamicAccess);
         
                 String generatorFuncName = ArrayLikeUtil.ARRAYLIKE_GENERIC_SUPPORT_ITERATOR_FACTORY_FUNC;
@@ -505,7 +511,13 @@ public class ArrayLikeUtil
      */
     public static boolean validateArrayLikeDefinition(IDefinition definition, ICompilerProject project, List<ICompilerProblem> problems) {
         IMetaTag arrayLikeTag  = definition.getMetaTagByName(IMetaAttributeConstants.ATTRIBUTE_ARRAYLIKE);
-        
+        if (!(project instanceof IRoyaleProject)) {
+            if (problems != null) {
+                problems.add(new ArrayLikeConfigurationErrorProblem(arrayLikeTag, "This is not a Royale Project. Only Royale projects support "+IMetaAttributeConstants.ATTRIBUTE_ARRAYLIKE));
+            }
+            return false;
+        }
+
         //mandatory
         String lengthCheck = arrayLikeTag.getAttributeValue(LENGTH_ARG);
         boolean pass = true;
@@ -597,22 +609,22 @@ public class ArrayLikeUtil
      * @return true if this definition either has its own ArrayLike annotation, or inherits via its ancestors or interfaces
      */
     synchronized public static boolean isArrayLike(IDefinition definition, ICompilerProject project) {
-        if (definition != null) {
+        if (definition != null && project instanceof IRoyaleProject) {
             resetLookupsIfNeeded(project);
             if (definition instanceof IClassDefinition) {
                 String qName = definition.getQualifiedName();
                 if (arrayLikeLookups.containsKey(qName)) return arrayLikeLookups.get(qName) != null;
-                return checkClass((IClassDefinition) definition, project);
+                return checkClass((IClassDefinition) definition, (IRoyaleProject) project);
             } else if (definition instanceof IInterfaceDefinition) {
                 String qName = definition.getQualifiedName();
                 if (arrayLikeLookups.containsKey(qName)) return arrayLikeLookups.get(qName) != null;
-                return checkInterface((IInterfaceDefinition) definition, project);
+                return checkInterface((IInterfaceDefinition) definition, (IRoyaleProject) project);
             }
         }
         return false;
     }
     
-    private static boolean checkClass(IClassDefinition definition, ICompilerProject project){
+    private static boolean checkClass(IClassDefinition definition, IRoyaleProject project){
         String qName = definition.getQualifiedName();
         resetLookupsIfNeeded(project);
         if (arrayLikeLookups.containsKey(qName)) return arrayLikeLookups.get(qName) != null;
@@ -647,7 +659,7 @@ public class ArrayLikeUtil
         return isArrayLike;
     }
     
-    private static boolean checkInterface(IInterfaceDefinition interfaceDefinition, ICompilerProject project){
+    private static boolean checkInterface(IInterfaceDefinition interfaceDefinition, IRoyaleProject project){
         String qName = interfaceDefinition.getQualifiedName();
         resetLookupsIfNeeded(project);
         if (arrayLikeLookups.containsKey(qName)) return arrayLikeLookups.get(qName) != null;


[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.

Posted by gr...@apache.org.
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();
+
 }