You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by er...@apache.org on 2014/11/21 13:10:36 UTC
[16/17] git commit: [flex-falcon] [refs/heads/develop] - Use
'superClass_.[method].call()' instead of '[Class].base()' when calling super
method outside its subclass counterpart
Use 'superClass_.[method].call()' instead of '[Class].base()' when calling super method outside its subclass counterpart
Signed-off-by: Erik de Bruin <er...@ixsoftware.nl>
Project: http://git-wip-us.apache.org/repos/asf/flex-falcon/repo
Commit: http://git-wip-us.apache.org/repos/asf/flex-falcon/commit/d27432ae
Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/d27432ae
Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/d27432ae
Branch: refs/heads/develop
Commit: d27432aeac4b3f25e30385b416d54a6aa1e3fdef
Parents: 34725a7
Author: Erik de Bruin <er...@ixsoftware.nl>
Authored: Fri Nov 21 13:08:22 2014 +0100
Committer: Erik de Bruin <er...@ixsoftware.nl>
Committed: Fri Nov 21 13:08:22 2014 +0100
----------------------------------------------------------------------
.../codegen/js/vf2js/JSVF2JSEmitter.java | 58 +++++++++++++++++---
1 file changed, 50 insertions(+), 8 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/d27432ae/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/vf2js/JSVF2JSEmitter.java
----------------------------------------------------------------------
diff --git a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/vf2js/JSVF2JSEmitter.java b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/vf2js/JSVF2JSEmitter.java
index f6276d3..9a9a2c5 100644
--- a/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/vf2js/JSVF2JSEmitter.java
+++ b/compiler.jx/src/org/apache/flex/compiler/internal/codegen/js/vf2js/JSVF2JSEmitter.java
@@ -1025,11 +1025,39 @@ public class JSVF2JSEmitter extends JSGoogEmitter implements IJSVF2JSEmitter
if (cnode == null)
return;
- write(cnode.getQualifiedName());
- write(ASEmitterTokens.MEMBER_ACCESS);
- write(JSGoogEmitterTokens.GOOG_BASE);
- write(ASEmitterTokens.PAREN_OPEN);
- write(ASEmitterTokens.THIS);
+ // (erikdebruin): Catch when a 'super' call does NOT match the enclosing
+ // function call. The GCC only allows '.base()' calls
+ // to matching super methods, so we need to use
+ // 'goog.base' for these ...
+ boolean isCallToOtherSuperMethod = false;
+ try
+ {
+ IExpressionNode d = fcnode.getNameNode();
+ if (d != null && d instanceof IMemberAccessExpressionNode)
+ {
+ IIdentifierNode b = (IIdentifierNode) ((IMemberAccessExpressionNode) d).getRightOperandNode();
+
+ isCallToOtherSuperMethod =
+ b != null && !b.getName().equals(fnode.getName());
+ }
+ }
+ catch (Exception e) { /* Eat it! */ }
+
+ if (isCallToOtherSuperMethod)
+ {
+ write(ASEmitterTokens.THIS);
+ write(ASEmitterTokens.MEMBER_ACCESS);
+ write(JSGoogEmitterTokens.SUPERCLASS);
+ write(ASEmitterTokens.MEMBER_ACCESS);
+ }
+ else
+ {
+ write(parseQualifiedName(cnode));
+ write(ASEmitterTokens.MEMBER_ACCESS);
+ write(JSGoogEmitterTokens.GOOG_BASE);
+ write(ASEmitterTokens.PAREN_OPEN);
+ write(ASEmitterTokens.THIS);
+ }
if (fnode != null && fnode.isConstructor())
{
@@ -1041,8 +1069,12 @@ public class JSVF2JSEmitter extends JSGoogEmitter implements IJSVF2JSEmitter
if (fnode != null && !fnode.isConstructor())
{
- writeToken(ASEmitterTokens.COMMA);
- write(ASEmitterTokens.SINGLE_QUOTE);
+ if (!isCallToOtherSuperMethod)
+ {
+ writeToken(ASEmitterTokens.COMMA);
+ write(ASEmitterTokens.SINGLE_QUOTE);
+ }
+
if (fnode.getNodeID() == ASTNodeID.GetterID
|| fnode.getNodeID() == ASTNodeID.SetterID)
writeGetSetPrefix(fnode.getNodeID() == ASTNodeID.GetterID);
@@ -1052,7 +1084,17 @@ public class JSVF2JSEmitter extends JSGoogEmitter implements IJSVF2JSEmitter
(IMemberAccessExpressionNode) fcnode.getNameNode();
write(((IIdentifierNode) aenode.getRightOperandNode()).getName());
- write(ASEmitterTokens.SINGLE_QUOTE);
+ if (!isCallToOtherSuperMethod)
+ {
+ write(ASEmitterTokens.SINGLE_QUOTE);
+ }
+ else
+ {
+ write(ASEmitterTokens.MEMBER_ACCESS);
+ write(JSGoogEmitterTokens.GOOG_CALL);
+ write(ASEmitterTokens.PAREN_OPEN);
+ write(ASEmitterTokens.THIS);
+ }
}
IASNode[] anodes = null;