Try to fix vector handling of nested vectors.  Forward reference chasing has to 
be recursive, not just a one-level search


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

Branch: refs/heads/develop
Commit: d4ef754a98d066085db0d37bf70a66af02c28b01
Parents: 6481dc9
Author: Alex Harui <[email protected]>
Authored: Wed Oct 2 20:35:28 2013 -0700
Committer: Alex Harui <[email protected]>
Committed: Tue Oct 8 13:50:56 2013 -0700

----------------------------------------------------------------------
 compiler/src/org/apache/flex/abc/ABCParser.java | 21 +++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/d4ef754a/compiler/src/org/apache/flex/abc/ABCParser.java
----------------------------------------------------------------------
diff --git a/compiler/src/org/apache/flex/abc/ABCParser.java 
b/compiler/src/org/apache/flex/abc/ABCParser.java
index 8aa64bb..fbacda6 100644
--- a/compiler/src/org/apache/flex/abc/ABCParser.java
+++ b/compiler/src/org/apache/flex/abc/ABCParser.java
@@ -235,7 +235,8 @@ public class ABCParser
             Name name;
             int name_pos = p.pos;
             names[i] = name = readName(p);
-            if (name.isTypeName() && (name.getTypeNameBase() == null || 
name.getTypeNameParameter() == null))
+            if (name.isTypeName() && 
+                    usesForwardReference(name))
             {
                 // If this typename refers to names later in the table, we 
need to reprocess them later
                 // after the entire table has been read in
@@ -353,6 +354,24 @@ public class ABCParser
         vabc.visitEnd();
     }
 
+    private boolean usesForwardReference(Name name)
+    {
+        Name nameBase = name.getTypeNameBase();
+        Name nameParam = name.getTypeNameParameter();
+        if (nameBase == null || nameParam == null)
+            return true;
+        
+        if (nameBase != null && nameBase.isTypeName() && 
+                usesForwardReference(nameBase))
+            return true;
+        
+        if (nameParam != null && nameParam.isTypeName() &&
+                usesForwardReference(nameParam))
+            return true;
+        
+        return false;
+    }
+    
     /**
      * Simple struct to keep track of Names, and where in the abc they come 
from
      */

Reply via email to