Repository: flex-falcon Updated Branches: refs/heads/develop b04074bf0 -> c500b3fe5
compiler-jx: Added -js-default-initializers option to force uninitialized variables to default to the same values in JS as they do in SWF. -js-default-initializers defaults to false and is completely optional, but may be useful for porting SWF projects to JS if an existing codebase uses strict equality and relies on the SWF default initializers. Project: http://git-wip-us.apache.org/repos/asf/flex-falcon/repo Commit: http://git-wip-us.apache.org/repos/asf/flex-falcon/commit/c500b3fe Tree: http://git-wip-us.apache.org/repos/asf/flex-falcon/tree/c500b3fe Diff: http://git-wip-us.apache.org/repos/asf/flex-falcon/diff/c500b3fe Branch: refs/heads/develop Commit: c500b3fe52299272dbf201033723296057c79413 Parents: b04074b Author: Josh Tynjala <joshtynj...@apache.org> Authored: Mon Jul 31 14:47:24 2017 -0700 Committer: Josh Tynjala <joshtynj...@apache.org> Committed: Mon Jul 31 14:54:24 2017 -0700 ---------------------------------------------------------------------- .../flex/compiler/clients/JSConfiguration.java | 19 ++++++ .../codegen/js/jx/VarDeclarationEmitter.java | 61 ++++++++++++++++---- 2 files changed, 68 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c500b3fe/compiler-jx/src/main/java/org/apache/flex/compiler/clients/JSConfiguration.java ---------------------------------------------------------------------- diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/clients/JSConfiguration.java b/compiler-jx/src/main/java/org/apache/flex/compiler/clients/JSConfiguration.java index ab1c73c..9f6bbe9 100644 --- a/compiler-jx/src/main/java/org/apache/flex/compiler/clients/JSConfiguration.java +++ b/compiler-jx/src/main/java/org/apache/flex/compiler/clients/JSConfiguration.java @@ -118,6 +118,25 @@ public class JSConfiguration extends Configuration } // + // 'js-default-initializers' + // + + private boolean jsDefaultInitializers = false; + + public boolean getJsDefaultInitializers() + { + return jsDefaultInitializers; + } + + @Config + @Mapping("js-default-initializers") + public void setJsDefaultInitializers(ConfigurationValue cv, boolean value) + throws ConfigurationException + { + jsDefaultInitializers = value; + } + + // // 'compiler.js-external-library-path' option // http://git-wip-us.apache.org/repos/asf/flex-falcon/blob/c500b3fe/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/VarDeclarationEmitter.java ---------------------------------------------------------------------- diff --git a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/VarDeclarationEmitter.java b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/VarDeclarationEmitter.java index 4e35e39..e71c54e 100644 --- a/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/VarDeclarationEmitter.java +++ b/compiler-jx/src/main/java/org/apache/flex/compiler/internal/codegen/js/jx/VarDeclarationEmitter.java @@ -21,6 +21,7 @@ package org.apache.flex.compiler.internal.codegen.js.jx; import org.apache.flex.compiler.codegen.ISubEmitter; import org.apache.flex.compiler.codegen.js.IJSEmitter; +import org.apache.flex.compiler.constants.IASKeywordConstants; import org.apache.flex.compiler.constants.IASLanguageConstants; import org.apache.flex.compiler.definitions.IDefinition; import org.apache.flex.compiler.definitions.metadata.IMetaTag; @@ -28,11 +29,13 @@ import org.apache.flex.compiler.definitions.metadata.IMetaTagAttribute; import org.apache.flex.compiler.internal.codegen.as.ASEmitterTokens; import org.apache.flex.compiler.internal.codegen.js.JSSubEmitter; import org.apache.flex.compiler.internal.codegen.js.flexjs.JSFlexJSEmitter; +import org.apache.flex.compiler.internal.projects.FlexJSProject; import org.apache.flex.compiler.internal.tree.as.ChainedVariableNode; import org.apache.flex.compiler.internal.tree.as.DynamicAccessNode; import org.apache.flex.compiler.internal.tree.as.FunctionCallNode; import org.apache.flex.compiler.internal.tree.as.IdentifierNode; import org.apache.flex.compiler.internal.tree.as.MemberAccessExpressionNode; +import org.apache.flex.compiler.projects.ICompilerProject; import org.apache.flex.compiler.tree.ASTNodeID; import org.apache.flex.compiler.tree.as.IASNode; import org.apache.flex.compiler.tree.as.IEmbedNode; @@ -182,18 +185,52 @@ public class VarDeclarationEmitter extends JSSubEmitter implements typedef = enode.resolveType(getWalker().getProject()); if (typedef != null) { - String defName = typedef.getQualifiedName(); - if (defName.equals("int") || defName.equals("uint")) - { - if (node.getParent() != null && - node.getParent().getParent() != null && - node.getParent().getParent().getNodeID() != ASTNodeID.Op_InID) - { - write(ASEmitterTokens.SPACE); - writeToken(ASEmitterTokens.EQUAL); - write("0"); - } - } + boolean defaultInitializers = false; + ICompilerProject project = getProject(); + if(project instanceof FlexJSProject) + { + FlexJSProject fjsProject = (FlexJSProject) project; + if(fjsProject.config != null) + { + defaultInitializers = fjsProject.config.getJsDefaultInitializers(); + } + } + if (node.getParent() != null && + node.getParent().getParent() != null && + node.getParent().getParent().getNodeID() != ASTNodeID.Op_InID) + { + String defName = typedef.getQualifiedName(); + if (defName.equals("int") || defName.equals("uint")) + { + write(ASEmitterTokens.SPACE); + writeToken(ASEmitterTokens.EQUAL); + write("0"); + } + if (defaultInitializers) + { + if (defName.equals("Number")) + { + write(ASEmitterTokens.SPACE); + writeToken(ASEmitterTokens.EQUAL); + write(IASKeywordConstants.NA_N); + } + else if (defName.equals("Boolean")) + { + write(ASEmitterTokens.SPACE); + writeToken(ASEmitterTokens.EQUAL); + write(IASKeywordConstants.FALSE); + } + else if (!defName.equals("*")) + { + //type * is meant to default to undefined, so it + //doesn't need to be initialized, but everything + //else should default to null + write(ASEmitterTokens.SPACE); + writeToken(ASEmitterTokens.EQUAL); + write(IASKeywordConstants.NULL); + } + } + } } }