You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by ah...@apache.org on 2013/10/25 00:51:05 UTC

[5/5] git commit: [flex-falcon] [refs/heads/develop] - Fixes to binding code generation for [Bindable] getters that override getters with [Bindable]

Fixes to binding code generation for [Bindable] getters that override getters with [Bindable]


Project: http://git-wip-us.apache.org/repos/asf/flex-falcon/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-falcon/commit/b08d11d2
Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/b08d11d2
Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/b08d11d2

Branch: refs/heads/develop
Commit: b08d11d2faf03bf72da414d34781e9751837eda2
Parents: ba7fef9
Author: Alex Harui <ah...@apache.org>
Authored: Thu Oct 24 15:50:46 2013 -0700
Committer: Alex Harui <ah...@apache.org>
Committed: Thu Oct 24 15:50:46 2013 -0700

----------------------------------------------------------------------
 .../internal/as/codegen/ABCGenerator.java       | 17 +++++++------
 .../internal/as/codegen/BindableHelper.java     | 12 +++++++++
 .../as/codegen/ClassDirectiveProcessor.java     | 26 +++++++++-----------
 .../as/codegen/GlobalDirectiveProcessor.java    |  2 +-
 .../internal/as/codegen/ICodeGenerator.java     |  5 ++--
 5 files changed, 37 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/b08d11d2/compiler/src/org/apache/flex/compiler/internal/as/codegen/ABCGenerator.java
----------------------------------------------------------------------
diff --git a/compiler/src/org/apache/flex/compiler/internal/as/codegen/ABCGenerator.java b/compiler/src/org/apache/flex/compiler/internal/as/codegen/ABCGenerator.java
index a321dae..2b2db36 100644
--- a/compiler/src/org/apache/flex/compiler/internal/as/codegen/ABCGenerator.java
+++ b/compiler/src/org/apache/flex/compiler/internal/as/codegen/ABCGenerator.java
@@ -250,9 +250,9 @@ public class ABCGenerator implements ICodeGenerator
      * constructor.
      * @return {@link MethodInfo} created for the function.
      */
-    public MethodInfo generateFunction (FunctionNode func, LexicalScope enclosing_scope, InstructionList instance_init_insns)
+    public MethodInfo generateFunction (FunctionNode func, LexicalScope enclosing_scope, InstructionList instance_init_insns, Name alternate_name)
     {
-        MethodInfo mi = createMethodInfo(enclosing_scope, func);
+        MethodInfo mi = createMethodInfo(enclosing_scope, func, alternate_name);
         if (mi.isNative())
         {
             generateNativeMethod(func, mi, enclosing_scope);
@@ -284,7 +284,7 @@ public class ABCGenerator implements ICodeGenerator
      */
     public GenerateFunctionInParallelResult generateFunctionInParallel (ExecutorService executorService, FunctionNode func, LexicalScope enclosing_scope)
     {
-        MethodInfo mi = createMethodInfo(enclosing_scope, func);
+        MethodInfo mi = createMethodInfo(enclosing_scope, func, null);
         if (mi.isNative())
         {
             generateNativeMethod(func, mi, enclosing_scope);
@@ -523,9 +523,9 @@ public class ABCGenerator implements ICodeGenerator
      * @return The MethodInfo specifying the signature of the method.
      */
     @Override
-    public MethodInfo createMethodInfo (LexicalScope scope, FunctionNode func)
+    public MethodInfo createMethodInfo (LexicalScope scope, FunctionNode func, Name alternate_name)
     {	
-        return createMethodInfoWithOptionalDefaultArgumentValues(scope, func, false);
+        return createMethodInfoWithOptionalDefaultArgumentValues(scope, func, false, alternate_name);
     }
     
     /**
@@ -542,13 +542,14 @@ public class ABCGenerator implements ICodeGenerator
     @Override
     public MethodInfo createMethodInfoWithDefaultArgumentValues (LexicalScope scope, FunctionNode func)
     {   
-        return createMethodInfoWithOptionalDefaultArgumentValues(scope, func, true);
+        return createMethodInfoWithOptionalDefaultArgumentValues(scope, func, true, null);
     }
     
-    private static MethodInfo createMethodInfoWithOptionalDefaultArgumentValues(LexicalScope scope, FunctionNode func, boolean addDefalutValues)
+    private static MethodInfo createMethodInfoWithOptionalDefaultArgumentValues(LexicalScope scope, FunctionNode func, 
+                                        boolean addDefalutValues, Name alternate_name)
     {
         MethodInfo mi = new MethodInfo();
-        mi.setMethodName(func.getName());
+        mi.setMethodName(alternate_name != null ? alternate_name.getBaseName() : func.getName());
 
         FunctionDefinition funcDef = func.getDefinition();
         //  Marshal the function's arguments.

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/b08d11d2/compiler/src/org/apache/flex/compiler/internal/as/codegen/BindableHelper.java
----------------------------------------------------------------------
diff --git a/compiler/src/org/apache/flex/compiler/internal/as/codegen/BindableHelper.java b/compiler/src/org/apache/flex/compiler/internal/as/codegen/BindableHelper.java
index ea1e0a3..203a804 100644
--- a/compiler/src/org/apache/flex/compiler/internal/as/codegen/BindableHelper.java
+++ b/compiler/src/org/apache/flex/compiler/internal/as/codegen/BindableHelper.java
@@ -520,6 +520,18 @@ public class BindableHelper
     }
 
     /**
+     * Return the AET Name to use for the backing property of a bindable var.  This name will have the same simple
+     * name as the one passed in, but will be in a special, hidden private namespace to avoid conflicts with other
+     * properties.
+     * @param propName  the Name of the property to generate a hidden name for
+     * @return          the Name of the hidden property that will actually store the value
+     */
+    static Name getBackingPropertyName(Name propName, String suffix)
+    {
+        return new Name(CONSTANT_Qname, new Nsset(bindablePrivateNamespace), propName.getBaseName() + suffix);
+    }
+
+    /**
      * The namespace to put compiler generated members into so that they do not conflict with any user defined
      * members.
      */

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/b08d11d2/compiler/src/org/apache/flex/compiler/internal/as/codegen/ClassDirectiveProcessor.java
----------------------------------------------------------------------
diff --git a/compiler/src/org/apache/flex/compiler/internal/as/codegen/ClassDirectiveProcessor.java b/compiler/src/org/apache/flex/compiler/internal/as/codegen/ClassDirectiveProcessor.java
index 2f62f96..9af1d45 100644
--- a/compiler/src/org/apache/flex/compiler/internal/as/codegen/ClassDirectiveProcessor.java
+++ b/compiler/src/org/apache/flex/compiler/internal/as/codegen/ClassDirectiveProcessor.java
@@ -56,7 +56,6 @@ import org.apache.flex.compiler.definitions.IDefinition;
 import org.apache.flex.compiler.definitions.IInterfaceDefinition;
 import org.apache.flex.compiler.definitions.metadata.IMetaTag;
 import org.apache.flex.compiler.definitions.metadata.IMetaTagAttribute;
-import org.apache.flex.compiler.definitions.references.INamespaceReference;
 import org.apache.flex.compiler.exceptions.CodegenInterruptedException;
 import org.apache.flex.compiler.problems.CircularTypeReferenceProblem;
 import org.apache.flex.compiler.problems.ConstructorCannotHaveReturnTypeProblem;
@@ -555,7 +554,7 @@ class ClassDirectiveProcessor extends DirectiveProcessor
         //  Create the class' constructor function.
         if ( this.ctorFunction != null )
         {
-            MethodInfo mi = classScope.getGenerator().generateFunction(this.ctorFunction, classScope, this.iinitInsns);
+            MethodInfo mi = classScope.getGenerator().generateFunction(this.ctorFunction, classScope, this.iinitInsns, null);
 
             if ( mi != null )
                 this.iinfo.iInit = mi;
@@ -748,21 +747,20 @@ class ClassDirectiveProcessor extends DirectiveProcessor
                 }
             }
         }
+        
+        functionSemanticChecks(func);
+
         Name funcName = funcDef.getMName(classScope.getProject());
         Name bindableName = null;
         boolean wasOverride = false;
         if (isBindable)
         {
             // move function into bindable namespace
-            bindableName = BindableHelper.getBackingPropertyName(funcName);
-            INamespaceReference ns = BindableHelper.bindableNamespaceDefinition;
+            bindableName = BindableHelper.getBackingPropertyName(funcName, "_" + this.classDefinition.getQualifiedName());
             wasOverride = funcDef.isOverride();
-            funcDef.setNamespaceReference(ns);
             funcDef.unsetOverride();
         }
        
-        functionSemanticChecks(func);
-
         //  Save the constructor function until
         //  we've seen all the instance variables
         //  that might need initialization.
@@ -781,17 +779,17 @@ class ClassDirectiveProcessor extends DirectiveProcessor
         {
             LexicalScope ls = funcDef.isStatic()? classStaticScope: classScope;
 
-            MethodInfo mi = classScope.getGenerator().generateFunction(func, ls, null);
+            MethodInfo mi = classScope.getGenerator().generateFunction(func, ls, null, bindableName);
             
             if ( mi != null )
             {
                 ITraitVisitor tv = ls.traitsVisitor.visitMethodTrait(functionTraitKind(func, TRAIT_Method), 
                         bindableName != null ? bindableName : funcName, 0, mi);
                 
-                if (funcName != null)
+                if (funcName != null && bindableName == null)
                     classScope.getMethodBodySemanticChecker().checkFunctionForConflictingDefinitions(func, funcDef);
 
-                if ( ! funcDef.isStatic() )
+                if ( ! funcDef.isStatic() && bindableName == null)
                     if (funcDef.getNamespaceReference() instanceof NamespaceDefinition.IProtectedNamespaceDefinition)
                         this.iinfo.flags |= ABCConstants.CLASS_FLAG_protected;
 
@@ -811,9 +809,9 @@ class ClassDirectiveProcessor extends DirectiveProcessor
                 funcDef.setOverride();
             if (funcDef instanceof GetterDefinition)
             {
-                DefinitionBase bindableGetter = func.buildBindableGetter(func.getName());
+                DefinitionBase bindableGetter = func.buildBindableGetter(funcName.getBaseName());
                 ASScope funcScope = (ASScope)funcDef.getContainingScope();
-                funcScope.addDefinition(bindableGetter);
+                bindableGetter.setContainingScope(funcScope);
                 LexicalScope ls = funcDef.isStatic()? classStaticScope: classScope;
                 ls.generateBindableGetter(bindableGetter, funcName, bindableName, 
                                         funcDef.resolveType(project).getMName(project), getAllMetaTags(funcDef));
@@ -822,10 +820,10 @@ class ClassDirectiveProcessor extends DirectiveProcessor
             {
                 TypeDefinitionBase typeDef = funcDef.resolveType(project);
                 ASScope funcScope = (ASScope)funcDef.getContainingScope();
-                DefinitionBase bindableSetter = func.buildBindableSetter(func.getName(), 
+                DefinitionBase bindableSetter = func.buildBindableSetter(funcName.getBaseName(), 
                         funcScope,
                         funcDef.getTypeReference());
-                funcScope.addDefinition(bindableSetter);
+                bindableSetter.setContainingScope(funcScope);
                 LexicalScope ls = funcDef.isStatic()? classStaticScope: classScope;
                 ls.generateBindableSetter(bindableSetter, funcName, bindableName, 
                         typeDef.getMName(project), getAllMetaTags(funcDef));  

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/b08d11d2/compiler/src/org/apache/flex/compiler/internal/as/codegen/GlobalDirectiveProcessor.java
----------------------------------------------------------------------
diff --git a/compiler/src/org/apache/flex/compiler/internal/as/codegen/GlobalDirectiveProcessor.java b/compiler/src/org/apache/flex/compiler/internal/as/codegen/GlobalDirectiveProcessor.java
index 0de6497..5a7c499 100644
--- a/compiler/src/org/apache/flex/compiler/internal/as/codegen/GlobalDirectiveProcessor.java
+++ b/compiler/src/org/apache/flex/compiler/internal/as/codegen/GlobalDirectiveProcessor.java
@@ -153,7 +153,7 @@ class GlobalDirectiveProcessor extends DirectiveProcessor
         else
         {
             f.parseFunctionBody(currentScope.getProblems());
-            return currentScope.getGenerator().generateFunction(f, this.currentScope, null);
+            return currentScope.getGenerator().generateFunction(f, this.currentScope, null, null);
         }
     }
     

http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/b08d11d2/compiler/src/org/apache/flex/compiler/internal/as/codegen/ICodeGenerator.java
----------------------------------------------------------------------
diff --git a/compiler/src/org/apache/flex/compiler/internal/as/codegen/ICodeGenerator.java b/compiler/src/org/apache/flex/compiler/internal/as/codegen/ICodeGenerator.java
index dff5b61..b06911e 100644
--- a/compiler/src/org/apache/flex/compiler/internal/as/codegen/ICodeGenerator.java
+++ b/compiler/src/org/apache/flex/compiler/internal/as/codegen/ICodeGenerator.java
@@ -21,6 +21,7 @@ package org.apache.flex.compiler.internal.as.codegen;
 
 import org.apache.flex.abc.instructionlist.InstructionList;
 import org.apache.flex.abc.semantics.MethodInfo;
+import org.apache.flex.abc.semantics.Name;
 import org.apache.flex.compiler.internal.tree.as.FunctionNode;
 import org.apache.flex.compiler.internal.units.requests.ABCBytesRequestResult;
 import org.apache.flex.compiler.problems.ICompilerProblem;
@@ -108,7 +109,7 @@ public interface ICodeGenerator
      * @return {@link MethodInfo} created for the function.
      */
     MethodInfo generateFunction(FunctionNode func, LexicalScope enclosing_scope,
-                                InstructionList instance_init_insns);
+                                InstructionList instance_init_insns, Name alternateName);
 
     /**
      * Generate code for a function declaration, using a background thread
@@ -171,7 +172,7 @@ public interface ICodeGenerator
      * @param func - A FunctionNode representing a method declaration.
      * @return The MethodInfo specifying the signature of the method.
      */
-    MethodInfo createMethodInfo (LexicalScope scope, FunctionNode func);
+    MethodInfo createMethodInfo (LexicalScope scope, FunctionNode func, Name alternate_name);
 
     /**
      * Creates a MethodInfo specifying the signature of a method