You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@royale.apache.org by jo...@apache.org on 2022/11/30 00:02:02 UTC
[royale-compiler] 01/02: null conditional operator (references #219)
This is an automated email from the ASF dual-hosted git repository.
joshtynjala pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/royale-compiler.git
commit 86b4fff6dec364c7c1dd7714638d13020156c3d1
Author: Josh Tynjala <jo...@apache.org>
AuthorDate: Wed Nov 9 14:44:12 2022 -0800
null conditional operator (references #219)
---
.../royale/compiler/internal/parsing/as/ASParser.g | 5 +
.../compiler/internal/parsing/as/ASToken.java | 1 +
.../compiler/internal/parsing/as/BaseASParser.java | 75 +++++++++
.../internal/parsing/as/StreamingASTokenizer.java | 1 +
.../tree/as/MemberAccessExpressionNode.java | 9 +-
.../internal/parsing/as/RawASTokenizer.lex | 5 +
.../java/as/ASNullConditionalOperatorTests.java | 187 +++++++++++++++++++++
...tionalOperatorTests_testEmptyString_swfdump.xml | 159 ++++++++++++++++++
...lConditionalOperatorTests_testFalse_swfdump.xml | 158 +++++++++++++++++
...ullConditionalOperatorTests_testNaN_swfdump.xml | 158 +++++++++++++++++
...onditionalOperatorTests_testNotNull_swfdump.xml | 159 ++++++++++++++++++
...ditionalOperatorTests_testNullField_swfdump.xml | 159 ++++++++++++++++++
...alOperatorTests_testNullNestedField_swfdump.xml | 170 +++++++++++++++++++
...llConditionalOperatorTests_testNull_swfdump.xml | 157 +++++++++++++++++
...nalOperatorTests_testUndefinedField_swfdump.xml | 157 +++++++++++++++++
...ratorTests_testUndefinedNestedField_swfdump.xml | 168 ++++++++++++++++++
...ditionalOperatorTests_testUndefined_swfdump.xml | 156 +++++++++++++++++
...llConditionalOperatorTests_testZero_swfdump.xml | 158 +++++++++++++++++
18 files changed, 2041 insertions(+), 1 deletion(-)
diff --git a/compiler/src/main/antlr/org/apache/royale/compiler/internal/parsing/as/ASParser.g b/compiler/src/main/antlr/org/apache/royale/compiler/internal/parsing/as/ASParser.g
index 552fd3c6c..90432099a 100644
--- a/compiler/src/main/antlr/org/apache/royale/compiler/internal/parsing/as/ASParser.g
+++ b/compiler/src/main/antlr/org/apache/royale/compiler/internal/parsing/as/ASParser.g
@@ -3095,6 +3095,7 @@ xmlAttributeName returns [ExpressionNodeBase result]
* foo::bar
* foo[bar]
* foo.<bar>
+ * foo?.bar
*/
propertyAccessExpression [ExpressionNodeBase l] returns [ExpressionNodeBase n]
{
@@ -3106,6 +3107,10 @@ propertyAccessExpression [ExpressionNodeBase l] returns [ExpressionNodeBase n]
{ n = new MemberAccessExpressionNode(l, op, r); }
| TOKEN_OPERATOR_DESCENDANT_ACCESS r=accessPart
{ n = new MemberAccessExpressionNode(l, op, r); }
+ | TOKEN_OPERATOR_NULL_CONDITIONAL_ACCESS r=accessPart
+ {
+ n = transformNullConditional(l, op, r);
+ }
| TOKEN_OPERATOR_NS_QUALIFIER r=nsAccessPart
{ if (l instanceof NamespaceIdentifierNode)
{
diff --git a/compiler/src/main/java/org/apache/royale/compiler/internal/parsing/as/ASToken.java b/compiler/src/main/java/org/apache/royale/compiler/internal/parsing/as/ASToken.java
index 9d2d592b8..de34ff3f8 100644
--- a/compiler/src/main/java/org/apache/royale/compiler/internal/parsing/as/ASToken.java
+++ b/compiler/src/main/java/org/apache/royale/compiler/internal/parsing/as/ASToken.java
@@ -374,6 +374,7 @@ public class ASToken extends TokenBase implements IASToken, ASTokenTypes
case TOKEN_OPERATOR_ATSIGN:
case TOKEN_OPERATOR_DESCENDANT_ACCESS:
case TOKEN_OPERATOR_NULLISH_COALESCING:
+ case TOKEN_OPERATOR_NULL_CONDITIONAL_ACCESS:
return true;
default:
return false;
diff --git a/compiler/src/main/java/org/apache/royale/compiler/internal/parsing/as/BaseASParser.java b/compiler/src/main/java/org/apache/royale/compiler/internal/parsing/as/BaseASParser.java
index 99bcb31c8..9a647b3da 100644
--- a/compiler/src/main/java/org/apache/royale/compiler/internal/parsing/as/BaseASParser.java
+++ b/compiler/src/main/java/org/apache/royale/compiler/internal/parsing/as/BaseASParser.java
@@ -73,6 +73,7 @@ import org.apache.royale.compiler.internal.scopes.ASScope;
import org.apache.royale.compiler.internal.semantics.PostProcessStep;
import org.apache.royale.compiler.internal.tree.as.ArrayLiteralNode;
import org.apache.royale.compiler.internal.tree.as.BaseDefinitionNode;
+import org.apache.royale.compiler.internal.tree.as.BinaryOperatorEqualNode;
import org.apache.royale.compiler.internal.tree.as.BinaryOperatorNodeBase;
import org.apache.royale.compiler.internal.tree.as.BinaryOperatorNotEqualNode;
import org.apache.royale.compiler.internal.tree.as.BlockNode;
@@ -3145,6 +3146,80 @@ abstract class BaseASParser extends LLkParser implements IProblemReporter
ASToken ternaryOp = new ASToken(ASTokenTypes.TOKEN_OPERATOR_TERNARY, -1, -1, -1, -1, "?");
TernaryOperatorNode ternaryNode = new TernaryOperatorNode(ternaryOp, conditionalNode, left, right);
+
+ return ternaryNode;
+ }
+
+ private class NullConditionalTernaryOperatorNode extends TernaryOperatorNode
+ {
+ public NullConditionalTernaryOperatorNode(IASToken op, ExpressionNodeBase conditionalNode, ExpressionNodeBase leftOperandNode, ExpressionNodeBase rightOperandNode)
+ {
+ super(op, conditionalNode, leftOperandNode, rightOperandNode);
+ }
+ }
+
+ private final NullConditionalTernaryOperatorNode nestNullConditional(NullConditionalTernaryOperatorNode l, ASToken op, ExpressionNodeBase r)
+ {
+ // we'll keep using this for the outer condition
+ ExpressionNodeBase prevConditionNode = (ExpressionNodeBase) l.getConditionalNode();
+ // this is the expression where we know everything's not null
+ ExpressionNodeBase prevRightNode = (ExpressionNodeBase) l.getRightOperandNode();
+
+ ASToken innerConditionEqualToken = new ASToken(ASTokenTypes.TOKEN_OPERATOR_EQUAL, -1, -1, -1, -1, "==");
+ ASToken innerConditionNullToken = new ASToken(ASTokenTypes.TOKEN_KEYWORD_NULL, -1, -1, -1, -1, "null");
+ LiteralNode innerConditionNullNode = new LiteralNode(innerConditionNullToken, LiteralType.NULL);
+ BinaryOperatorEqualNode innerConditionNode = new BinaryOperatorEqualNode(innerConditionEqualToken, prevRightNode, innerConditionNullNode);
+
+ NullConditionalTernaryOperatorNode innerTernaryNode = null;
+ if (prevRightNode instanceof NullConditionalTernaryOperatorNode)
+ {
+ // recursively convert nested null conditionals
+ innerTernaryNode = nestNullConditional((NullConditionalTernaryOperatorNode) prevRightNode, op, r);
+ }
+ else
+ {
+ ASToken memberAccessOperator = new ASToken(ASTokenTypes.TOKEN_OPERATOR_MEMBER_ACCESS, op.getStart(), op.getEnd(), op.getLine(), op.getColumn(), ".");
+ MemberAccessExpressionNode memberAccessNode = new MemberAccessExpressionNode(prevRightNode, memberAccessOperator, r);
+ memberAccessNode.setAllowE4XFilter(false);
+
+ ASToken ternaryOperator = new ASToken(ASTokenTypes.TOKEN_OPERATOR_TERNARY, -1, -1, -1, -1, "?");
+ ASToken innerResultNullToken = new ASToken(ASTokenTypes.TOKEN_KEYWORD_NULL, -1, -1, -1, -1, "null");
+ LiteralNode innerResultNullNode = new LiteralNode(innerResultNullToken, LiteralType.NULL);
+ innerTernaryNode = new NullConditionalTernaryOperatorNode(ternaryOperator, innerConditionNode, innerResultNullNode, memberAccessNode);
+ innerTernaryNode.setHasParenthesis(true);
+ }
+
+ ExpressionNodeBase outerResultCondition = prevConditionNode;
+ ASToken outerTernaryOperator = new ASToken(ASTokenTypes.TOKEN_OPERATOR_TERNARY, -1, -1, -1, -1, "?");
+ ASToken outerResultNullToken = new ASToken(ASTokenTypes.TOKEN_KEYWORD_NULL, -1, -1, -1, -1, "null");
+ LiteralNode outerResultNullNode = new LiteralNode(outerResultNullToken, LiteralType.NULL);
+ NullConditionalTernaryOperatorNode outerTernaryNode = new NullConditionalTernaryOperatorNode(outerTernaryOperator, outerResultCondition, outerResultNullNode, innerTernaryNode);
+ outerTernaryNode.setHasParenthesis(true);
+ return outerTernaryNode;
+ }
+
+ protected final ExpressionNodeBase transformNullConditional(ExpressionNodeBase l, ASToken op, ExpressionNodeBase r)
+ {
+ if (l instanceof NullConditionalTernaryOperatorNode)
+ {
+ return nestNullConditional((NullConditionalTernaryOperatorNode) l, op, r);
+ }
+
+ ASToken conditionEqualToken = new ASToken(ASTokenTypes.TOKEN_OPERATOR_EQUAL, -1, -1, -1, -1, "==");
+ ASToken conditionNullToken = new ASToken(ASTokenTypes.TOKEN_KEYWORD_NULL, -1, -1, -1, -1, "null");
+ LiteralNode conditionNullNode = new LiteralNode(conditionNullToken, LiteralType.NULL);
+ BinaryOperatorEqualNode conditionNode = new BinaryOperatorEqualNode(conditionEqualToken, l, conditionNullNode);
+
+ ASToken memberAccessOperator = new ASToken(ASTokenTypes.TOKEN_OPERATOR_MEMBER_ACCESS, op.getStart(), op.getEnd(), op.getLine(), op.getColumn(), ".");
+ MemberAccessExpressionNode memberAccessNode = new MemberAccessExpressionNode(l, memberAccessOperator, r);
+ memberAccessNode.setAllowE4XFilter(false);
+
+ ASToken ternaryOperator = new ASToken(ASTokenTypes.TOKEN_OPERATOR_TERNARY, -1, -1, -1, -1, "?");
+ ASToken resultNullToken = new ASToken(ASTokenTypes.TOKEN_KEYWORD_NULL, -1, -1, -1, -1, "null");
+ LiteralNode resultNullNode = new LiteralNode(resultNullToken, LiteralType.NULL);
+ NullConditionalTernaryOperatorNode ternaryNode = new NullConditionalTernaryOperatorNode(ternaryOperator, conditionNode, resultNullNode, memberAccessNode);
+ ternaryNode.setHasParenthesis(true);
+
return ternaryNode;
}
}
diff --git a/compiler/src/main/java/org/apache/royale/compiler/internal/parsing/as/StreamingASTokenizer.java b/compiler/src/main/java/org/apache/royale/compiler/internal/parsing/as/StreamingASTokenizer.java
index 49f6242d2..d16f7cc6e 100644
--- a/compiler/src/main/java/org/apache/royale/compiler/internal/parsing/as/StreamingASTokenizer.java
+++ b/compiler/src/main/java/org/apache/royale/compiler/internal/parsing/as/StreamingASTokenizer.java
@@ -1198,6 +1198,7 @@ public class StreamingASTokenizer implements ASTokenTypes, IASTokenizer, Closeab
case TOKEN_E4X_BINDING_CLOSE:
case TOKEN_E4X_BINDING_OPEN:
case TOKEN_OPERATOR_DESCENDANT_ACCESS:
+ case TOKEN_OPERATOR_NULL_CONDITIONAL_ACCESS:
case TOKEN_NAMESPACE_ANNOTATION:
case TOKEN_NAMESPACE_NAME:
case TOKEN_BLOCK_OPEN:
diff --git a/compiler/src/main/java/org/apache/royale/compiler/internal/tree/as/MemberAccessExpressionNode.java b/compiler/src/main/java/org/apache/royale/compiler/internal/tree/as/MemberAccessExpressionNode.java
index 42d77b8ff..59a7484db 100644
--- a/compiler/src/main/java/org/apache/royale/compiler/internal/tree/as/MemberAccessExpressionNode.java
+++ b/compiler/src/main/java/org/apache/royale/compiler/internal/tree/as/MemberAccessExpressionNode.java
@@ -96,7 +96,7 @@ public class MemberAccessExpressionNode extends BinaryOperatorNodeBase implement
{
nodeID = ASTNodeID.Op_DescendantsID;
}
- else if (rightOperandNode != null && rightOperandNode.hasParenthesis())
+ else if (allowE4XFilter && rightOperandNode != null && rightOperandNode.hasParenthesis())
{
nodeID = ASTNodeID.E4XFilterID;
}
@@ -264,6 +264,13 @@ public class MemberAccessExpressionNode extends BinaryOperatorNodeBase implement
// Other methods
//
+ private boolean allowE4XFilter = true;
+
+ public void setAllowE4XFilter(boolean allow)
+ {
+ allowE4XFilter = allow;
+ }
+
public boolean isSuper(ExpressionNodeBase node)
{
if (!(node instanceof ILanguageIdentifierNode))
diff --git a/compiler/src/main/jflex/org/apache/royale/compiler/internal/parsing/as/RawASTokenizer.lex b/compiler/src/main/jflex/org/apache/royale/compiler/internal/parsing/as/RawASTokenizer.lex
index f21ae0d71..e4a0eee83 100644
--- a/compiler/src/main/jflex/org/apache/royale/compiler/internal/parsing/as/RawASTokenizer.lex
+++ b/compiler/src/main/jflex/org/apache/royale/compiler/internal/parsing/as/RawASTokenizer.lex
@@ -626,6 +626,11 @@ REGEX_CLASS="[" ({REGEX_ESCAPE}|[^\n\r\]\\])* "]"
return buildToken(TOKEN_OPERATOR_DESCENDANT_ACCESS, "..");
}
+<YYINITIAL> "?."
+{
+ return buildToken(TOKEN_OPERATOR_NULL_CONDITIONAL_ACCESS, "?.");
+}
+
<YYINITIAL> ","
{
return buildToken(TOKEN_COMMA, ",");
diff --git a/compiler/src/test/java/as/ASNullConditionalOperatorTests.java b/compiler/src/test/java/as/ASNullConditionalOperatorTests.java
new file mode 100644
index 000000000..ed045b524
--- /dev/null
+++ b/compiler/src/test/java/as/ASNullConditionalOperatorTests.java
@@ -0,0 +1,187 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package as;
+
+import java.io.File;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ASNullConditionalOperatorTests extends ASFeatureTestsBase
+{
+ @Test
+ public void testNull()
+ {
+ String[] testCode = new String[]
+ {
+ "var o:Object = null;",
+ "var result:* = o?.field;",
+ "assertEqual('null conditional', result, null);",
+ };
+ String source = getAS(new String[0], new String[0], testCode, new String[0]);
+
+ compileAndRun(source);
+ }
+
+ // 0 is considered falsy, but not nullish
+ @Test
+ public void testUndefined()
+ {
+ String[] testCode = new String[]
+ {
+ "var o:* = undefined;",
+ "var result:* = o?.field;",
+ "assertEqual('null conditional', result, null);",
+ };
+ String source = getAS(new String[0], new String[0], testCode, new String[0]);
+
+ compileAndRun(source);
+ }
+
+ // false is considered falsy, but not nullish
+ @Test
+ public void testFalse()
+ {
+ String[] testCode = new String[]
+ {
+ "var o:Boolean = false;",
+ "var result:* = o?.toString();",
+ "assertEqual('null conditional', result, 'false');",
+ };
+ String source = getAS(new String[0], new String[0], testCode, new String[0]);
+
+ compileAndRun(source);
+ }
+
+ // NaN is considered falsy, but not nullish
+ @Test
+ public void testNaN()
+ {
+ String[] testCode = new String[]
+ {
+ "var o:Number = NaN;",
+ "var result:* = o?.toString();",
+ "assertEqual('null conditional', result, 'NaN');",
+ };
+ String source = getAS(new String[0], new String[0], testCode, new String[0]);
+
+ compileAndRun(source);
+ }
+
+ // 0 is considered falsy, but not nullish
+ @Test
+ public void testZero()
+ {
+ String[] testCode = new String[]
+ {
+ "var o:Number = 0;",
+ "var result:* = o?.toString();",
+ "assertEqual('null conditional', result, '0');",
+ };
+ String source = getAS(new String[0], new String[0], testCode, new String[0]);
+
+ compileAndRun(source);
+ }
+
+ // empty string is considered falsy, but not nullish
+ @Test
+ public void testEmptyString()
+ {
+ String[] testCode = new String[]
+ {
+ "var o:String = '';",
+ "var result:* = o?.toString();",
+ "assertEqual('null conditional', result, '');",
+ };
+ String source = getAS(new String[0], new String[0], testCode, new String[0]);
+
+ compileAndRun(source);
+ }
+
+ @Test
+ public void testNotNull()
+ {
+ String[] testCode = new String[]
+ {
+ "var o:Object = {a: 123.4};",
+ "var result:* = o?.a;",
+ "assertEqual('null conditional', result, 123.4);",
+ };
+ String source = getAS(new String[0], new String[0], testCode, new String[0]);
+
+ compileAndRun(source);
+ }
+
+ @Test
+ public void testNullField()
+ {
+ String[] testCode = new String[]
+ {
+ "var o:Object = {a: null};",
+ "var result:* = o?.a;",
+ "assertEqual('null conditional', result, null);",
+ };
+ String source = getAS(new String[0], new String[0], testCode, new String[0]);
+
+ compileAndRun(source);
+ }
+
+ @Test
+ public void testUndefinedField()
+ {
+ String[] testCode = new String[]
+ {
+ "var o:Object = {};",
+ "var result:* = o?.a;",
+ "assertEqual('null conditional', result, undefined);",
+ };
+ String source = getAS(new String[0], new String[0], testCode, new String[0]);
+
+ compileAndRun(source);
+ }
+
+ @Test
+ public void testNullNestedField()
+ {
+ String[] testCode = new String[]
+ {
+ "var o:Object = {a: null};",
+ "var result:* = o?.a?.b;",
+ "assertEqual('null conditional', result, null);",
+ };
+ String source = getAS(new String[0], new String[0], testCode, new String[0]);
+
+ compileAndRun(source);
+ }
+
+ @Test
+ public void testUndefinedNestedField()
+ {
+ String[] testCode = new String[]
+ {
+ "var o:Object = {};",
+ "var result:* = o?.a?.b;",
+ "assertEqual('null conditional', result, null);",
+ };
+ String source = getAS(new String[0], new String[0], testCode, new String[0]);
+
+ compileAndRun(source);
+ }
+}
\ No newline at end of file
diff --git a/compiler/src/test/resources/swfdumps/as_ASNullConditionalOperatorTests_testEmptyString_swfdump.xml b/compiler/src/test/resources/swfdumps/as_ASNullConditionalOperatorTests_testEmptyString_swfdump.xml
new file mode 100644
index 000000000..af8db45d5
--- /dev/null
+++ b/compiler/src/test/resources/swfdumps/as_ASNullConditionalOperatorTests_testEmptyString_swfdump.xml
@@ -0,0 +1,159 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+-->
+<!-- Parsing swf file:/Users/joshtynjala/Development/apache/royale-compiler/compiler/target/junit-temp/%0.swf -->
+<swf xmlns="http://macromedia/2003/swfx" version="14" framerate="24.0" size="10000x7500" compressed="true" >
+ <!-- framecount=1 length=838 -->
+ <FileAttributes useDirectBlit="false" useGPU="false" hasMetadata="true" actionScript3="true" suppressCrossDomainCaching="false" swfRelativeUrls="false" useNetwork="true"/>
+ <Metadata>
+ <![CDATA[<?xml version="1.0" ?>
+<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <rdf:Description xmlns:dc="http://purl.org/dc/elements/1.1" xmlns:asc="http://ns.adobe.com/asc/2012">
+ <dc:format>application/x-shockwave-flash</dc:format>
+ <asc:compiler name="Apache Royale Compiler" version="0.9.10" build="0"/>
+ </rdf:Description>
+</rdf:RDF>
+]]>
+ </Metadata>
+ <SetBackgroundColor color="#FFFFFF"/>
+ <ScriptLimits scriptRecursionLimit="1000" scriptTimeLimit="60"/>
+ <DoABC>
+// script 0
+
+// class_id=0 slot_id=0
+public class %0 extends Object
+{
+
+ // method_id=3
+ public function %0():*
+ {
+ // derivedName %0
+ // method_info 3
+ // max_stack 1
+ // max_regs 1
+ // scope_depth 0
+ // max_scope 1
+ // code_length 6
+ bb0
+ succs=[]
+ 0 getlocal0
+ 1 pushscope
+ 2 getlocal0
+ 3 constructsuper 0
+ 4 returnvoid
+ }
+
+ private function initHandler(Object):void
+ {
+ // derivedName initHandler
+ // method_info 1
+ // max_stack 4
+ // max_regs 4
+ // scope_depth 0
+ // max_scope 1
+ // code_length 35
+ bb0
+ succs=[bb1,bb2]
+ 0 getlocal0
+ 1 pushscope
+ 2 pushstring ""
+ 3 coerce_s
+ 4 setlocal2
+ 5 getlocal2
+ 6 pushnull
+ 7 ifne bb2
+ bb1
+ succs=[bb3]
+ 8 pushnull
+ 9 jump bb3
+ bb2
+ succs=[bb3]
+ 10 getlocal2
+ 11 getproperty toString
+ bb3
+ succs=[]
+ 12 getlocal0
+ 13 call 0
+ 14 setlocal3
+ 15 findpropstrict assertEqual
+ 16 pushstring "null conditional"
+ 17 getlocal3
+ 18 pushstring ""
+ 19 callpropvoid
+ 20 returnvoid
+ }
+
+ private function assertEqual(String,*,*):void
+ {
+ // derivedName assertEqual
+ // method_info 2
+ // max_stack 1
+ // max_regs 4
+ // scope_depth 0
+ // max_scope 1
+ // code_length 1
+ bb0
+ succs=[]
+ 0 returnvoid
+ }
+
+ public static function %0$():*
+ {
+ // derivedName null
+ // method_info 4
+ // max_stack 0
+ // max_regs 1
+ // scope_depth 0
+ // max_scope 0
+ // code_length 1
+ bb0
+ succs=[]
+ 0 returnvoid
+ }
+}
+
+function script0$init():*
+{
+ // derivedName null
+ // method_info 0
+ // max_stack 3
+ // max_regs 1
+ // scope_depth 0
+ // max_scope 2
+ // code_length 14
+ bb0
+ succs=[]
+ 0 getlocal0
+ 1 pushscope
+ 2 getscopeobject 0
+ 3 getlex Object
+ 4 dup
+ 5 pushscope
+ 6 newclass
+ 7 popscope
+ 8 initproperty %0
+ 9 returnvoid
+}
+
+ </DoABC>
+ <SymbolClass>
+ <Symbol idref="0" className="%0" />
+ </SymbolClass>
+ <ShowFrame/>
+</swf>
diff --git a/compiler/src/test/resources/swfdumps/as_ASNullConditionalOperatorTests_testFalse_swfdump.xml b/compiler/src/test/resources/swfdumps/as_ASNullConditionalOperatorTests_testFalse_swfdump.xml
new file mode 100644
index 000000000..db160aaaf
--- /dev/null
+++ b/compiler/src/test/resources/swfdumps/as_ASNullConditionalOperatorTests_testFalse_swfdump.xml
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+-->
+<!-- Parsing swf file:/Users/joshtynjala/Development/apache/royale-compiler/compiler/target/junit-temp/%0.swf -->
+<swf xmlns="http://macromedia/2003/swfx" version="14" framerate="24.0" size="10000x7500" compressed="true" >
+ <!-- framecount=1 length=842 -->
+ <FileAttributes useDirectBlit="false" useGPU="false" hasMetadata="true" actionScript3="true" suppressCrossDomainCaching="false" swfRelativeUrls="false" useNetwork="true"/>
+ <Metadata>
+ <![CDATA[<?xml version="1.0" ?>
+<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <rdf:Description xmlns:dc="http://purl.org/dc/elements/1.1" xmlns:asc="http://ns.adobe.com/asc/2012">
+ <dc:format>application/x-shockwave-flash</dc:format>
+ <asc:compiler name="Apache Royale Compiler" version="0.9.10" build="0"/>
+ </rdf:Description>
+</rdf:RDF>
+]]>
+ </Metadata>
+ <SetBackgroundColor color="#FFFFFF"/>
+ <ScriptLimits scriptRecursionLimit="1000" scriptTimeLimit="60"/>
+ <DoABC>
+// script 0
+
+// class_id=0 slot_id=0
+public class %0 extends Object
+{
+
+ // method_id=3
+ public function %0():*
+ {
+ // derivedName %0
+ // method_info 3
+ // max_stack 1
+ // max_regs 1
+ // scope_depth 0
+ // max_scope 1
+ // code_length 6
+ bb0
+ succs=[]
+ 0 getlocal0
+ 1 pushscope
+ 2 getlocal0
+ 3 constructsuper 0
+ 4 returnvoid
+ }
+
+ private function initHandler(Object):void
+ {
+ // derivedName initHandler
+ // method_info 1
+ // max_stack 4
+ // max_regs 4
+ // scope_depth 0
+ // max_scope 1
+ // code_length 33
+ bb0
+ succs=[bb1,bb2]
+ 0 getlocal0
+ 1 pushscope
+ 2 pushfalse
+ 3 setlocal2
+ 4 getlocal2
+ 5 pushnull
+ 6 ifne bb2
+ bb1
+ succs=[bb3]
+ 7 pushnull
+ 8 jump bb3
+ bb2
+ succs=[bb3]
+ 9 getlocal2
+ 10 getproperty toString
+ bb3
+ succs=[]
+ 11 getlocal0
+ 12 call 0
+ 13 setlocal3
+ 14 findpropstrict assertEqual
+ 15 pushstring "null conditional"
+ 16 getlocal3
+ 17 pushstring "false"
+ 18 callpropvoid
+ 19 returnvoid
+ }
+
+ private function assertEqual(String,*,*):void
+ {
+ // derivedName assertEqual
+ // method_info 2
+ // max_stack 1
+ // max_regs 4
+ // scope_depth 0
+ // max_scope 1
+ // code_length 1
+ bb0
+ succs=[]
+ 0 returnvoid
+ }
+
+ public static function %0$():*
+ {
+ // derivedName null
+ // method_info 4
+ // max_stack 0
+ // max_regs 1
+ // scope_depth 0
+ // max_scope 0
+ // code_length 1
+ bb0
+ succs=[]
+ 0 returnvoid
+ }
+}
+
+function script0$init():*
+{
+ // derivedName null
+ // method_info 0
+ // max_stack 3
+ // max_regs 1
+ // scope_depth 0
+ // max_scope 2
+ // code_length 14
+ bb0
+ succs=[]
+ 0 getlocal0
+ 1 pushscope
+ 2 getscopeobject 0
+ 3 getlex Object
+ 4 dup
+ 5 pushscope
+ 6 newclass
+ 7 popscope
+ 8 initproperty %0
+ 9 returnvoid
+}
+
+ </DoABC>
+ <SymbolClass>
+ <Symbol idref="0" className="%0" />
+ </SymbolClass>
+ <ShowFrame/>
+</swf>
diff --git a/compiler/src/test/resources/swfdumps/as_ASNullConditionalOperatorTests_testNaN_swfdump.xml b/compiler/src/test/resources/swfdumps/as_ASNullConditionalOperatorTests_testNaN_swfdump.xml
new file mode 100644
index 000000000..dcbc1dea8
--- /dev/null
+++ b/compiler/src/test/resources/swfdumps/as_ASNullConditionalOperatorTests_testNaN_swfdump.xml
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+-->
+<!-- Parsing swf file:/Users/joshtynjala/Development/apache/royale-compiler/compiler/target/junit-temp/%0.swf -->
+<swf xmlns="http://macromedia/2003/swfx" version="14" framerate="24.0" size="10000x7500" compressed="true" >
+ <!-- framecount=1 length=840 -->
+ <FileAttributes useDirectBlit="false" useGPU="false" hasMetadata="true" actionScript3="true" suppressCrossDomainCaching="false" swfRelativeUrls="false" useNetwork="true"/>
+ <Metadata>
+ <![CDATA[<?xml version="1.0" ?>
+<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <rdf:Description xmlns:dc="http://purl.org/dc/elements/1.1" xmlns:asc="http://ns.adobe.com/asc/2012">
+ <dc:format>application/x-shockwave-flash</dc:format>
+ <asc:compiler name="Apache Royale Compiler" version="0.9.10" build="0"/>
+ </rdf:Description>
+</rdf:RDF>
+]]>
+ </Metadata>
+ <SetBackgroundColor color="#FFFFFF"/>
+ <ScriptLimits scriptRecursionLimit="1000" scriptTimeLimit="60"/>
+ <DoABC>
+// script 0
+
+// class_id=0 slot_id=0
+public class %0 extends Object
+{
+
+ // method_id=3
+ public function %0():*
+ {
+ // derivedName %0
+ // method_info 3
+ // max_stack 1
+ // max_regs 1
+ // scope_depth 0
+ // max_scope 1
+ // code_length 6
+ bb0
+ succs=[]
+ 0 getlocal0
+ 1 pushscope
+ 2 getlocal0
+ 3 constructsuper 0
+ 4 returnvoid
+ }
+
+ private function initHandler(Object):void
+ {
+ // derivedName initHandler
+ // method_info 1
+ // max_stack 4
+ // max_regs 4
+ // scope_depth 0
+ // max_scope 1
+ // code_length 33
+ bb0
+ succs=[bb1,bb2]
+ 0 getlocal0
+ 1 pushscope
+ 2 pushnan
+ 3 setlocal2
+ 4 getlocal2
+ 5 pushnull
+ 6 ifne bb2
+ bb1
+ succs=[bb3]
+ 7 pushnull
+ 8 jump bb3
+ bb2
+ succs=[bb3]
+ 9 getlocal2
+ 10 getproperty toString
+ bb3
+ succs=[]
+ 11 getlocal0
+ 12 call 0
+ 13 setlocal3
+ 14 findpropstrict assertEqual
+ 15 pushstring "null conditional"
+ 16 getlocal3
+ 17 pushstring "NaN"
+ 18 callpropvoid
+ 19 returnvoid
+ }
+
+ private function assertEqual(String,*,*):void
+ {
+ // derivedName assertEqual
+ // method_info 2
+ // max_stack 1
+ // max_regs 4
+ // scope_depth 0
+ // max_scope 1
+ // code_length 1
+ bb0
+ succs=[]
+ 0 returnvoid
+ }
+
+ public static function %0$():*
+ {
+ // derivedName null
+ // method_info 4
+ // max_stack 0
+ // max_regs 1
+ // scope_depth 0
+ // max_scope 0
+ // code_length 1
+ bb0
+ succs=[]
+ 0 returnvoid
+ }
+}
+
+function script0$init():*
+{
+ // derivedName null
+ // method_info 0
+ // max_stack 3
+ // max_regs 1
+ // scope_depth 0
+ // max_scope 2
+ // code_length 14
+ bb0
+ succs=[]
+ 0 getlocal0
+ 1 pushscope
+ 2 getscopeobject 0
+ 3 getlex Object
+ 4 dup
+ 5 pushscope
+ 6 newclass
+ 7 popscope
+ 8 initproperty %0
+ 9 returnvoid
+}
+
+ </DoABC>
+ <SymbolClass>
+ <Symbol idref="0" className="%0" />
+ </SymbolClass>
+ <ShowFrame/>
+</swf>
diff --git a/compiler/src/test/resources/swfdumps/as_ASNullConditionalOperatorTests_testNotNull_swfdump.xml b/compiler/src/test/resources/swfdumps/as_ASNullConditionalOperatorTests_testNotNull_swfdump.xml
new file mode 100644
index 000000000..70674c8f3
--- /dev/null
+++ b/compiler/src/test/resources/swfdumps/as_ASNullConditionalOperatorTests_testNotNull_swfdump.xml
@@ -0,0 +1,159 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+-->
+<!-- Parsing swf file:/Users/joshtynjala/Development/apache/royale-compiler/compiler/target/junit-temp/%0.swf -->
+<swf xmlns="http://macromedia/2003/swfx" version="14" framerate="24.0" size="10000x7500" compressed="true" >
+ <!-- framecount=1 length=961 -->
+ <FileAttributes useDirectBlit="false" useGPU="false" hasMetadata="true" actionScript3="true" suppressCrossDomainCaching="false" swfRelativeUrls="false" useNetwork="true"/>
+ <Metadata>
+ <![CDATA[<?xml version="1.0" ?>
+<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <rdf:Description xmlns:dc="http://purl.org/dc/elements/1.1" xmlns:asc="http://ns.adobe.com/asc/2012">
+ <dc:format>application/x-shockwave-flash</dc:format>
+ <asc:compiler name="Apache Royale Compiler" version="0.9.10" build="0"/>
+ </rdf:Description>
+</rdf:RDF>
+]]>
+ </Metadata>
+ <SetBackgroundColor color="#FFFFFF"/>
+ <ScriptLimits scriptRecursionLimit="1000" scriptTimeLimit="60"/>
+ <DoABC>
+// script 0
+
+// class_id=0 slot_id=0
+public class %0 extends Object
+{
+
+ // method_id=3
+ public function %0():*
+ {
+ // derivedName %0
+ // method_info 3
+ // max_stack 1
+ // max_regs 1
+ // scope_depth 0
+ // max_scope 1
+ // code_length 6
+ bb0
+ succs=[]
+ 0 getlocal0
+ 1 pushscope
+ 2 getlocal0
+ 3 constructsuper 0
+ 4 returnvoid
+ }
+
+ private function initHandler(Object):void
+ {
+ // derivedName initHandler
+ // method_info 1
+ // max_stack 4
+ // max_regs 4
+ // scope_depth 0
+ // max_scope 1
+ // code_length 37
+ bb0
+ succs=[bb1,bb2]
+ 0 getlocal0
+ 1 pushscope
+ 2 pushstring "a"
+ 3 pushdouble
+ 4 newobject 1
+ 5 coerce Object
+ 6 setlocal2
+ 7 getlocal2
+ 8 pushnull
+ 9 ifne bb2
+ bb1
+ succs=[bb3]
+ 10 pushnull
+ 11 jump bb3
+ bb2
+ succs=[bb3]
+ 12 getlocal2
+ 13 getproperty {private, %0, %0, Object, , , private, http://adobe.com/AS3/2006/builtin, }::a
+ bb3
+ succs=[]
+ 14 setlocal3
+ 15 findpropstrict assertEqual
+ 16 pushstring "null conditional"
+ 17 getlocal3
+ 18 pushdouble
+ 19 callpropvoid
+ 20 returnvoid
+ }
+
+ private function assertEqual(String,*,*):void
+ {
+ // derivedName assertEqual
+ // method_info 2
+ // max_stack 1
+ // max_regs 4
+ // scope_depth 0
+ // max_scope 1
+ // code_length 1
+ bb0
+ succs=[]
+ 0 returnvoid
+ }
+
+ public static function %0$():*
+ {
+ // derivedName null
+ // method_info 4
+ // max_stack 0
+ // max_regs 1
+ // scope_depth 0
+ // max_scope 0
+ // code_length 1
+ bb0
+ succs=[]
+ 0 returnvoid
+ }
+}
+
+function script0$init():*
+{
+ // derivedName null
+ // method_info 0
+ // max_stack 3
+ // max_regs 1
+ // scope_depth 0
+ // max_scope 2
+ // code_length 14
+ bb0
+ succs=[]
+ 0 getlocal0
+ 1 pushscope
+ 2 getscopeobject 0
+ 3 getlex Object
+ 4 dup
+ 5 pushscope
+ 6 newclass
+ 7 popscope
+ 8 initproperty %0
+ 9 returnvoid
+}
+
+ </DoABC>
+ <SymbolClass>
+ <Symbol idref="0" className="%0" />
+ </SymbolClass>
+ <ShowFrame/>
+</swf>
diff --git a/compiler/src/test/resources/swfdumps/as_ASNullConditionalOperatorTests_testNullField_swfdump.xml b/compiler/src/test/resources/swfdumps/as_ASNullConditionalOperatorTests_testNullField_swfdump.xml
new file mode 100644
index 000000000..6e761eae4
--- /dev/null
+++ b/compiler/src/test/resources/swfdumps/as_ASNullConditionalOperatorTests_testNullField_swfdump.xml
@@ -0,0 +1,159 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+-->
+<!-- Parsing swf file:/Users/joshtynjala/Development/apache/royale-compiler/compiler/target/junit-temp/%0.swf -->
+<swf xmlns="http://macromedia/2003/swfx" version="14" framerate="24.0" size="10000x7500" compressed="true" >
+ <!-- framecount=1 length=951 -->
+ <FileAttributes useDirectBlit="false" useGPU="false" hasMetadata="true" actionScript3="true" suppressCrossDomainCaching="false" swfRelativeUrls="false" useNetwork="true"/>
+ <Metadata>
+ <![CDATA[<?xml version="1.0" ?>
+<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <rdf:Description xmlns:dc="http://purl.org/dc/elements/1.1" xmlns:asc="http://ns.adobe.com/asc/2012">
+ <dc:format>application/x-shockwave-flash</dc:format>
+ <asc:compiler name="Apache Royale Compiler" version="0.9.10" build="0"/>
+ </rdf:Description>
+</rdf:RDF>
+]]>
+ </Metadata>
+ <SetBackgroundColor color="#FFFFFF"/>
+ <ScriptLimits scriptRecursionLimit="1000" scriptTimeLimit="60"/>
+ <DoABC>
+// script 0
+
+// class_id=0 slot_id=0
+public class %0 extends Object
+{
+
+ // method_id=3
+ public function %0():*
+ {
+ // derivedName %0
+ // method_info 3
+ // max_stack 1
+ // max_regs 1
+ // scope_depth 0
+ // max_scope 1
+ // code_length 6
+ bb0
+ succs=[]
+ 0 getlocal0
+ 1 pushscope
+ 2 getlocal0
+ 3 constructsuper 0
+ 4 returnvoid
+ }
+
+ private function initHandler(Object):void
+ {
+ // derivedName initHandler
+ // method_info 1
+ // max_stack 4
+ // max_regs 4
+ // scope_depth 0
+ // max_scope 1
+ // code_length 35
+ bb0
+ succs=[bb1,bb2]
+ 0 getlocal0
+ 1 pushscope
+ 2 pushstring "a"
+ 3 pushnull
+ 4 newobject 1
+ 5 coerce Object
+ 6 setlocal2
+ 7 getlocal2
+ 8 pushnull
+ 9 ifne bb2
+ bb1
+ succs=[bb3]
+ 10 pushnull
+ 11 jump bb3
+ bb2
+ succs=[bb3]
+ 12 getlocal2
+ 13 getproperty {private, %0, %0, Object, , , private, http://adobe.com/AS3/2006/builtin, }::a
+ bb3
+ succs=[]
+ 14 setlocal3
+ 15 findpropstrict assertEqual
+ 16 pushstring "null conditional"
+ 17 getlocal3
+ 18 pushnull
+ 19 callpropvoid
+ 20 returnvoid
+ }
+
+ private function assertEqual(String,*,*):void
+ {
+ // derivedName assertEqual
+ // method_info 2
+ // max_stack 1
+ // max_regs 4
+ // scope_depth 0
+ // max_scope 1
+ // code_length 1
+ bb0
+ succs=[]
+ 0 returnvoid
+ }
+
+ public static function %0$():*
+ {
+ // derivedName null
+ // method_info 4
+ // max_stack 0
+ // max_regs 1
+ // scope_depth 0
+ // max_scope 0
+ // code_length 1
+ bb0
+ succs=[]
+ 0 returnvoid
+ }
+}
+
+function script0$init():*
+{
+ // derivedName null
+ // method_info 0
+ // max_stack 3
+ // max_regs 1
+ // scope_depth 0
+ // max_scope 2
+ // code_length 14
+ bb0
+ succs=[]
+ 0 getlocal0
+ 1 pushscope
+ 2 getscopeobject 0
+ 3 getlex Object
+ 4 dup
+ 5 pushscope
+ 6 newclass
+ 7 popscope
+ 8 initproperty %0
+ 9 returnvoid
+}
+
+ </DoABC>
+ <SymbolClass>
+ <Symbol idref="0" className="%0" />
+ </SymbolClass>
+ <ShowFrame/>
+</swf>
diff --git a/compiler/src/test/resources/swfdumps/as_ASNullConditionalOperatorTests_testNullNestedField_swfdump.xml b/compiler/src/test/resources/swfdumps/as_ASNullConditionalOperatorTests_testNullNestedField_swfdump.xml
new file mode 100644
index 000000000..126257d0e
--- /dev/null
+++ b/compiler/src/test/resources/swfdumps/as_ASNullConditionalOperatorTests_testNullNestedField_swfdump.xml
@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+-->
+<!-- Parsing swf file:/Users/joshtynjala/Development/apache/royale-compiler/compiler/target/junit-temp/%0.swf -->
+<swf xmlns="http://macromedia/2003/swfx" version="14" framerate="24.0" size="10000x7500" compressed="true" >
+ <!-- framecount=1 length=968 -->
+ <FileAttributes useDirectBlit="false" useGPU="false" hasMetadata="true" actionScript3="true" suppressCrossDomainCaching="false" swfRelativeUrls="false" useNetwork="true"/>
+ <Metadata>
+ <![CDATA[<?xml version="1.0" ?>
+<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <rdf:Description xmlns:dc="http://purl.org/dc/elements/1.1" xmlns:asc="http://ns.adobe.com/asc/2012">
+ <dc:format>application/x-shockwave-flash</dc:format>
+ <asc:compiler name="Apache Royale Compiler" version="0.9.10" build="0"/>
+ </rdf:Description>
+</rdf:RDF>
+]]>
+ </Metadata>
+ <SetBackgroundColor color="#FFFFFF"/>
+ <ScriptLimits scriptRecursionLimit="1000" scriptTimeLimit="60"/>
+ <DoABC>
+// script 0
+
+// class_id=0 slot_id=0
+public class %0 extends Object
+{
+
+ // method_id=3
+ public function %0():*
+ {
+ // derivedName %0
+ // method_info 3
+ // max_stack 1
+ // max_regs 1
+ // scope_depth 0
+ // max_scope 1
+ // code_length 6
+ bb0
+ succs=[]
+ 0 getlocal0
+ 1 pushscope
+ 2 getlocal0
+ 3 constructsuper 0
+ 4 returnvoid
+ }
+
+ private function initHandler(Object):void
+ {
+ // derivedName initHandler
+ // method_info 1
+ // max_stack 4
+ // max_regs 4
+ // scope_depth 0
+ // max_scope 1
+ // code_length 50
+ bb0
+ succs=[bb1,bb2]
+ 0 getlocal0
+ 1 pushscope
+ 2 pushstring "a"
+ 3 pushnull
+ 4 newobject 1
+ 5 coerce Object
+ 6 setlocal2
+ 7 getlocal2
+ 8 pushnull
+ 9 ifne bb2
+ bb1
+ succs=[bb5]
+ 10 pushnull
+ 11 jump bb5
+ bb2
+ succs=[bb3,bb4]
+ 12 getlocal2
+ 13 getproperty {private, %0, %0, Object, , , private, http://adobe.com/AS3/2006/builtin, }::a
+ 14 pushnull
+ 15 ifne bb4
+ bb3
+ succs=[bb5]
+ 16 pushnull
+ 17 jump bb5
+ bb4
+ succs=[bb5]
+ 18 getlocal2
+ 19 getproperty {private, %0, %0, Object, , , private, http://adobe.com/AS3/2006/builtin, }::a
+ 20 getproperty {private, %0, %0, Object, , , private, http://adobe.com/AS3/2006/builtin, }::b
+ bb5
+ succs=[]
+ 21 setlocal3
+ 22 findpropstrict assertEqual
+ 23 pushstring "null conditional"
+ 24 getlocal3
+ 25 pushnull
+ 26 callpropvoid
+ 27 returnvoid
+ }
+
+ private function assertEqual(String,*,*):void
+ {
+ // derivedName assertEqual
+ // method_info 2
+ // max_stack 1
+ // max_regs 4
+ // scope_depth 0
+ // max_scope 1
+ // code_length 1
+ bb0
+ succs=[]
+ 0 returnvoid
+ }
+
+ public static function %0$():*
+ {
+ // derivedName null
+ // method_info 4
+ // max_stack 0
+ // max_regs 1
+ // scope_depth 0
+ // max_scope 0
+ // code_length 1
+ bb0
+ succs=[]
+ 0 returnvoid
+ }
+}
+
+function script0$init():*
+{
+ // derivedName null
+ // method_info 0
+ // max_stack 3
+ // max_regs 1
+ // scope_depth 0
+ // max_scope 2
+ // code_length 14
+ bb0
+ succs=[]
+ 0 getlocal0
+ 1 pushscope
+ 2 getscopeobject 0
+ 3 getlex Object
+ 4 dup
+ 5 pushscope
+ 6 newclass
+ 7 popscope
+ 8 initproperty %0
+ 9 returnvoid
+}
+
+ </DoABC>
+ <SymbolClass>
+ <Symbol idref="0" className="%0" />
+ </SymbolClass>
+ <ShowFrame/>
+</swf>
diff --git a/compiler/src/test/resources/swfdumps/as_ASNullConditionalOperatorTests_testNull_swfdump.xml b/compiler/src/test/resources/swfdumps/as_ASNullConditionalOperatorTests_testNull_swfdump.xml
new file mode 100644
index 000000000..8ac55976c
--- /dev/null
+++ b/compiler/src/test/resources/swfdumps/as_ASNullConditionalOperatorTests_testNull_swfdump.xml
@@ -0,0 +1,157 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+-->
+<!-- Parsing swf file:/Users/joshtynjala/Development/apache/royale-compiler/compiler/target/junit-temp/%0.swf -->
+<swf xmlns="http://macromedia/2003/swfx" version="14" framerate="24.0" size="10000x7500" compressed="true" >
+ <!-- framecount=1 length=948 -->
+ <FileAttributes useDirectBlit="false" useGPU="false" hasMetadata="true" actionScript3="true" suppressCrossDomainCaching="false" swfRelativeUrls="false" useNetwork="true"/>
+ <Metadata>
+ <![CDATA[<?xml version="1.0" ?>
+<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <rdf:Description xmlns:dc="http://purl.org/dc/elements/1.1" xmlns:asc="http://ns.adobe.com/asc/2012">
+ <dc:format>application/x-shockwave-flash</dc:format>
+ <asc:compiler name="Apache Royale Compiler" version="0.9.10" build="0"/>
+ </rdf:Description>
+</rdf:RDF>
+]]>
+ </Metadata>
+ <SetBackgroundColor color="#FFFFFF"/>
+ <ScriptLimits scriptRecursionLimit="1000" scriptTimeLimit="60"/>
+ <DoABC>
+// script 0
+
+// class_id=0 slot_id=0
+public class %0 extends Object
+{
+
+ // method_id=3
+ public function %0():*
+ {
+ // derivedName %0
+ // method_info 3
+ // max_stack 1
+ // max_regs 1
+ // scope_depth 0
+ // max_scope 1
+ // code_length 6
+ bb0
+ succs=[]
+ 0 getlocal0
+ 1 pushscope
+ 2 getlocal0
+ 3 constructsuper 0
+ 4 returnvoid
+ }
+
+ private function initHandler(Object):void
+ {
+ // derivedName initHandler
+ // method_info 1
+ // max_stack 4
+ // max_regs 4
+ // scope_depth 0
+ // max_scope 1
+ // code_length 31
+ bb0
+ succs=[bb1,bb2]
+ 0 getlocal0
+ 1 pushscope
+ 2 pushnull
+ 3 coerce Object
+ 4 setlocal2
+ 5 getlocal2
+ 6 pushnull
+ 7 ifne bb2
+ bb1
+ succs=[bb3]
+ 8 pushnull
+ 9 jump bb3
+ bb2
+ succs=[bb3]
+ 10 getlocal2
+ 11 getproperty {private, %0, %0, Object, , , private, http://adobe.com/AS3/2006/builtin, }::field
+ bb3
+ succs=[]
+ 12 setlocal3
+ 13 findpropstrict assertEqual
+ 14 pushstring "null conditional"
+ 15 getlocal3
+ 16 pushnull
+ 17 callpropvoid
+ 18 returnvoid
+ }
+
+ private function assertEqual(String,*,*):void
+ {
+ // derivedName assertEqual
+ // method_info 2
+ // max_stack 1
+ // max_regs 4
+ // scope_depth 0
+ // max_scope 1
+ // code_length 1
+ bb0
+ succs=[]
+ 0 returnvoid
+ }
+
+ public static function %0$():*
+ {
+ // derivedName null
+ // method_info 4
+ // max_stack 0
+ // max_regs 1
+ // scope_depth 0
+ // max_scope 0
+ // code_length 1
+ bb0
+ succs=[]
+ 0 returnvoid
+ }
+}
+
+function script0$init():*
+{
+ // derivedName null
+ // method_info 0
+ // max_stack 3
+ // max_regs 1
+ // scope_depth 0
+ // max_scope 2
+ // code_length 14
+ bb0
+ succs=[]
+ 0 getlocal0
+ 1 pushscope
+ 2 getscopeobject 0
+ 3 getlex Object
+ 4 dup
+ 5 pushscope
+ 6 newclass
+ 7 popscope
+ 8 initproperty %0
+ 9 returnvoid
+}
+
+ </DoABC>
+ <SymbolClass>
+ <Symbol idref="0" className="%0" />
+ </SymbolClass>
+ <ShowFrame/>
+</swf>
diff --git a/compiler/src/test/resources/swfdumps/as_ASNullConditionalOperatorTests_testUndefinedField_swfdump.xml b/compiler/src/test/resources/swfdumps/as_ASNullConditionalOperatorTests_testUndefinedField_swfdump.xml
new file mode 100644
index 000000000..7d252d6d6
--- /dev/null
+++ b/compiler/src/test/resources/swfdumps/as_ASNullConditionalOperatorTests_testUndefinedField_swfdump.xml
@@ -0,0 +1,157 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+-->
+<!-- Parsing swf file:/Users/joshtynjala/Development/apache/royale-compiler/compiler/target/junit-temp/%0.swf -->
+<swf xmlns="http://macromedia/2003/swfx" version="14" framerate="24.0" size="10000x7500" compressed="true" >
+ <!-- framecount=1 length=948 -->
+ <FileAttributes useDirectBlit="false" useGPU="false" hasMetadata="true" actionScript3="true" suppressCrossDomainCaching="false" swfRelativeUrls="false" useNetwork="true"/>
+ <Metadata>
+ <![CDATA[<?xml version="1.0" ?>
+<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <rdf:Description xmlns:dc="http://purl.org/dc/elements/1.1" xmlns:asc="http://ns.adobe.com/asc/2012">
+ <dc:format>application/x-shockwave-flash</dc:format>
+ <asc:compiler name="Apache Royale Compiler" version="0.9.10" build="0"/>
+ </rdf:Description>
+</rdf:RDF>
+]]>
+ </Metadata>
+ <SetBackgroundColor color="#FFFFFF"/>
+ <ScriptLimits scriptRecursionLimit="1000" scriptTimeLimit="60"/>
+ <DoABC>
+// script 0
+
+// class_id=0 slot_id=0
+public class %0 extends Object
+{
+
+ // method_id=3
+ public function %0():*
+ {
+ // derivedName %0
+ // method_info 3
+ // max_stack 1
+ // max_regs 1
+ // scope_depth 0
+ // max_scope 1
+ // code_length 6
+ bb0
+ succs=[]
+ 0 getlocal0
+ 1 pushscope
+ 2 getlocal0
+ 3 constructsuper 0
+ 4 returnvoid
+ }
+
+ private function initHandler(Object):void
+ {
+ // derivedName initHandler
+ // method_info 1
+ // max_stack 4
+ // max_regs 4
+ // scope_depth 0
+ // max_scope 1
+ // code_length 32
+ bb0
+ succs=[bb1,bb2]
+ 0 getlocal0
+ 1 pushscope
+ 2 newobject 0
+ 3 coerce Object
+ 4 setlocal2
+ 5 getlocal2
+ 6 pushnull
+ 7 ifne bb2
+ bb1
+ succs=[bb3]
+ 8 pushnull
+ 9 jump bb3
+ bb2
+ succs=[bb3]
+ 10 getlocal2
+ 11 getproperty {private, %0, %0, Object, , , private, http://adobe.com/AS3/2006/builtin, }::a
+ bb3
+ succs=[]
+ 12 setlocal3
+ 13 findpropstrict assertEqual
+ 14 pushstring "null conditional"
+ 15 getlocal3
+ 16 pushundefined
+ 17 callpropvoid
+ 18 returnvoid
+ }
+
+ private function assertEqual(String,*,*):void
+ {
+ // derivedName assertEqual
+ // method_info 2
+ // max_stack 1
+ // max_regs 4
+ // scope_depth 0
+ // max_scope 1
+ // code_length 1
+ bb0
+ succs=[]
+ 0 returnvoid
+ }
+
+ public static function %0$():*
+ {
+ // derivedName null
+ // method_info 4
+ // max_stack 0
+ // max_regs 1
+ // scope_depth 0
+ // max_scope 0
+ // code_length 1
+ bb0
+ succs=[]
+ 0 returnvoid
+ }
+}
+
+function script0$init():*
+{
+ // derivedName null
+ // method_info 0
+ // max_stack 3
+ // max_regs 1
+ // scope_depth 0
+ // max_scope 2
+ // code_length 14
+ bb0
+ succs=[]
+ 0 getlocal0
+ 1 pushscope
+ 2 getscopeobject 0
+ 3 getlex Object
+ 4 dup
+ 5 pushscope
+ 6 newclass
+ 7 popscope
+ 8 initproperty %0
+ 9 returnvoid
+}
+
+ </DoABC>
+ <SymbolClass>
+ <Symbol idref="0" className="%0" />
+ </SymbolClass>
+ <ShowFrame/>
+</swf>
diff --git a/compiler/src/test/resources/swfdumps/as_ASNullConditionalOperatorTests_testUndefinedNestedField_swfdump.xml b/compiler/src/test/resources/swfdumps/as_ASNullConditionalOperatorTests_testUndefinedNestedField_swfdump.xml
new file mode 100644
index 000000000..a271e0b5b
--- /dev/null
+++ b/compiler/src/test/resources/swfdumps/as_ASNullConditionalOperatorTests_testUndefinedNestedField_swfdump.xml
@@ -0,0 +1,168 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+-->
+<!-- Parsing swf file:/Users/joshtynjala/Development/apache/royale-compiler/compiler/target/junit-temp/%0.swf -->
+<swf xmlns="http://macromedia/2003/swfx" version="14" framerate="24.0" size="10000x7500" compressed="true" >
+ <!-- framecount=1 length=965 -->
+ <FileAttributes useDirectBlit="false" useGPU="false" hasMetadata="true" actionScript3="true" suppressCrossDomainCaching="false" swfRelativeUrls="false" useNetwork="true"/>
+ <Metadata>
+ <![CDATA[<?xml version="1.0" ?>
+<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <rdf:Description xmlns:dc="http://purl.org/dc/elements/1.1" xmlns:asc="http://ns.adobe.com/asc/2012">
+ <dc:format>application/x-shockwave-flash</dc:format>
+ <asc:compiler name="Apache Royale Compiler" version="0.9.10" build="0"/>
+ </rdf:Description>
+</rdf:RDF>
+]]>
+ </Metadata>
+ <SetBackgroundColor color="#FFFFFF"/>
+ <ScriptLimits scriptRecursionLimit="1000" scriptTimeLimit="60"/>
+ <DoABC>
+// script 0
+
+// class_id=0 slot_id=0
+public class %0 extends Object
+{
+
+ // method_id=3
+ public function %0():*
+ {
+ // derivedName %0
+ // method_info 3
+ // max_stack 1
+ // max_regs 1
+ // scope_depth 0
+ // max_scope 1
+ // code_length 6
+ bb0
+ succs=[]
+ 0 getlocal0
+ 1 pushscope
+ 2 getlocal0
+ 3 constructsuper 0
+ 4 returnvoid
+ }
+
+ private function initHandler(Object):void
+ {
+ // derivedName initHandler
+ // method_info 1
+ // max_stack 4
+ // max_regs 4
+ // scope_depth 0
+ // max_scope 1
+ // code_length 47
+ bb0
+ succs=[bb1,bb2]
+ 0 getlocal0
+ 1 pushscope
+ 2 newobject 0
+ 3 coerce Object
+ 4 setlocal2
+ 5 getlocal2
+ 6 pushnull
+ 7 ifne bb2
+ bb1
+ succs=[bb5]
+ 8 pushnull
+ 9 jump bb5
+ bb2
+ succs=[bb3,bb4]
+ 10 getlocal2
+ 11 getproperty {private, %0, %0, Object, , , private, http://adobe.com/AS3/2006/builtin, }::a
+ 12 pushnull
+ 13 ifne bb4
+ bb3
+ succs=[bb5]
+ 14 pushnull
+ 15 jump bb5
+ bb4
+ succs=[bb5]
+ 16 getlocal2
+ 17 getproperty {private, %0, %0, Object, , , private, http://adobe.com/AS3/2006/builtin, }::a
+ 18 getproperty {private, %0, %0, Object, , , private, http://adobe.com/AS3/2006/builtin, }::b
+ bb5
+ succs=[]
+ 19 setlocal3
+ 20 findpropstrict assertEqual
+ 21 pushstring "null conditional"
+ 22 getlocal3
+ 23 pushnull
+ 24 callpropvoid
+ 25 returnvoid
+ }
+
+ private function assertEqual(String,*,*):void
+ {
+ // derivedName assertEqual
+ // method_info 2
+ // max_stack 1
+ // max_regs 4
+ // scope_depth 0
+ // max_scope 1
+ // code_length 1
+ bb0
+ succs=[]
+ 0 returnvoid
+ }
+
+ public static function %0$():*
+ {
+ // derivedName null
+ // method_info 4
+ // max_stack 0
+ // max_regs 1
+ // scope_depth 0
+ // max_scope 0
+ // code_length 1
+ bb0
+ succs=[]
+ 0 returnvoid
+ }
+}
+
+function script0$init():*
+{
+ // derivedName null
+ // method_info 0
+ // max_stack 3
+ // max_regs 1
+ // scope_depth 0
+ // max_scope 2
+ // code_length 14
+ bb0
+ succs=[]
+ 0 getlocal0
+ 1 pushscope
+ 2 getscopeobject 0
+ 3 getlex Object
+ 4 dup
+ 5 pushscope
+ 6 newclass
+ 7 popscope
+ 8 initproperty %0
+ 9 returnvoid
+}
+
+ </DoABC>
+ <SymbolClass>
+ <Symbol idref="0" className="%0" />
+ </SymbolClass>
+ <ShowFrame/>
+</swf>
diff --git a/compiler/src/test/resources/swfdumps/as_ASNullConditionalOperatorTests_testUndefined_swfdump.xml b/compiler/src/test/resources/swfdumps/as_ASNullConditionalOperatorTests_testUndefined_swfdump.xml
new file mode 100644
index 000000000..8659f1a5b
--- /dev/null
+++ b/compiler/src/test/resources/swfdumps/as_ASNullConditionalOperatorTests_testUndefined_swfdump.xml
@@ -0,0 +1,156 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+-->
+<!-- Parsing swf file:/Users/joshtynjala/Development/apache/royale-compiler/compiler/target/junit-temp/%0.swf -->
+<swf xmlns="http://macromedia/2003/swfx" version="14" framerate="24.0" size="10000x7500" compressed="true" >
+ <!-- framecount=1 length=943 -->
+ <FileAttributes useDirectBlit="false" useGPU="false" hasMetadata="true" actionScript3="true" suppressCrossDomainCaching="false" swfRelativeUrls="false" useNetwork="true"/>
+ <Metadata>
+ <![CDATA[<?xml version="1.0" ?>
+<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <rdf:Description xmlns:dc="http://purl.org/dc/elements/1.1" xmlns:asc="http://ns.adobe.com/asc/2012">
+ <dc:format>application/x-shockwave-flash</dc:format>
+ <asc:compiler name="Apache Royale Compiler" version="0.9.10" build="0"/>
+ </rdf:Description>
+</rdf:RDF>
+]]>
+ </Metadata>
+ <SetBackgroundColor color="#FFFFFF"/>
+ <ScriptLimits scriptRecursionLimit="1000" scriptTimeLimit="60"/>
+ <DoABC>
+// script 0
+
+// class_id=0 slot_id=0
+public class %0 extends Object
+{
+
+ // method_id=3
+ public function %0():*
+ {
+ // derivedName %0
+ // method_info 3
+ // max_stack 1
+ // max_regs 1
+ // scope_depth 0
+ // max_scope 1
+ // code_length 6
+ bb0
+ succs=[]
+ 0 getlocal0
+ 1 pushscope
+ 2 getlocal0
+ 3 constructsuper 0
+ 4 returnvoid
+ }
+
+ private function initHandler(Object):void
+ {
+ // derivedName initHandler
+ // method_info 1
+ // max_stack 4
+ // max_regs 4
+ // scope_depth 0
+ // max_scope 1
+ // code_length 29
+ bb0
+ succs=[bb1,bb2]
+ 0 getlocal0
+ 1 pushscope
+ 2 pushundefined
+ 3 setlocal2
+ 4 getlocal2
+ 5 pushnull
+ 6 ifne bb2
+ bb1
+ succs=[bb3]
+ 7 pushnull
+ 8 jump bb3
+ bb2
+ succs=[bb3]
+ 9 getlocal2
+ 10 getproperty {private, %0, %0, Object, , , private, http://adobe.com/AS3/2006/builtin, }::field
+ bb3
+ succs=[]
+ 11 setlocal3
+ 12 findpropstrict assertEqual
+ 13 pushstring "null conditional"
+ 14 getlocal3
+ 15 pushnull
+ 16 callpropvoid
+ 17 returnvoid
+ }
+
+ private function assertEqual(String,*,*):void
+ {
+ // derivedName assertEqual
+ // method_info 2
+ // max_stack 1
+ // max_regs 4
+ // scope_depth 0
+ // max_scope 1
+ // code_length 1
+ bb0
+ succs=[]
+ 0 returnvoid
+ }
+
+ public static function %0$():*
+ {
+ // derivedName null
+ // method_info 4
+ // max_stack 0
+ // max_regs 1
+ // scope_depth 0
+ // max_scope 0
+ // code_length 1
+ bb0
+ succs=[]
+ 0 returnvoid
+ }
+}
+
+function script0$init():*
+{
+ // derivedName null
+ // method_info 0
+ // max_stack 3
+ // max_regs 1
+ // scope_depth 0
+ // max_scope 2
+ // code_length 14
+ bb0
+ succs=[]
+ 0 getlocal0
+ 1 pushscope
+ 2 getscopeobject 0
+ 3 getlex Object
+ 4 dup
+ 5 pushscope
+ 6 newclass
+ 7 popscope
+ 8 initproperty %0
+ 9 returnvoid
+}
+
+ </DoABC>
+ <SymbolClass>
+ <Symbol idref="0" className="%0" />
+ </SymbolClass>
+ <ShowFrame/>
+</swf>
diff --git a/compiler/src/test/resources/swfdumps/as_ASNullConditionalOperatorTests_testZero_swfdump.xml b/compiler/src/test/resources/swfdumps/as_ASNullConditionalOperatorTests_testZero_swfdump.xml
new file mode 100644
index 000000000..9bb903a5c
--- /dev/null
+++ b/compiler/src/test/resources/swfdumps/as_ASNullConditionalOperatorTests_testZero_swfdump.xml
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+-->
+<!-- Parsing swf file:/Users/joshtynjala/Development/apache/royale-compiler/compiler/target/junit-temp/%0.swf -->
+<swf xmlns="http://macromedia/2003/swfx" version="14" framerate="24.0" size="10000x7500" compressed="true" >
+ <!-- framecount=1 length=847 -->
+ <FileAttributes useDirectBlit="false" useGPU="false" hasMetadata="true" actionScript3="true" suppressCrossDomainCaching="false" swfRelativeUrls="false" useNetwork="true"/>
+ <Metadata>
+ <![CDATA[<?xml version="1.0" ?>
+<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
+ <rdf:Description xmlns:dc="http://purl.org/dc/elements/1.1" xmlns:asc="http://ns.adobe.com/asc/2012">
+ <dc:format>application/x-shockwave-flash</dc:format>
+ <asc:compiler name="Apache Royale Compiler" version="0.9.10" build="0"/>
+ </rdf:Description>
+</rdf:RDF>
+]]>
+ </Metadata>
+ <SetBackgroundColor color="#FFFFFF"/>
+ <ScriptLimits scriptRecursionLimit="1000" scriptTimeLimit="60"/>
+ <DoABC>
+// script 0
+
+// class_id=0 slot_id=0
+public class %0 extends Object
+{
+
+ // method_id=3
+ public function %0():*
+ {
+ // derivedName %0
+ // method_info 3
+ // max_stack 1
+ // max_regs 1
+ // scope_depth 0
+ // max_scope 1
+ // code_length 6
+ bb0
+ succs=[]
+ 0 getlocal0
+ 1 pushscope
+ 2 getlocal0
+ 3 constructsuper 0
+ 4 returnvoid
+ }
+
+ private function initHandler(Object):void
+ {
+ // derivedName initHandler
+ // method_info 1
+ // max_stack 4
+ // max_regs 4
+ // scope_depth 0
+ // max_scope 1
+ // code_length 34
+ bb0
+ succs=[bb1,bb2]
+ 0 getlocal0
+ 1 pushscope
+ 2 pushdouble
+ 3 setlocal2
+ 4 getlocal2
+ 5 pushnull
+ 6 ifne bb2
+ bb1
+ succs=[bb3]
+ 7 pushnull
+ 8 jump bb3
+ bb2
+ succs=[bb3]
+ 9 getlocal2
+ 10 getproperty toString
+ bb3
+ succs=[]
+ 11 getlocal0
+ 12 call 0
+ 13 setlocal3
+ 14 findpropstrict assertEqual
+ 15 pushstring "null conditional"
+ 16 getlocal3
+ 17 pushstring "0"
+ 18 callpropvoid
+ 19 returnvoid
+ }
+
+ private function assertEqual(String,*,*):void
+ {
+ // derivedName assertEqual
+ // method_info 2
+ // max_stack 1
+ // max_regs 4
+ // scope_depth 0
+ // max_scope 1
+ // code_length 1
+ bb0
+ succs=[]
+ 0 returnvoid
+ }
+
+ public static function %0$():*
+ {
+ // derivedName null
+ // method_info 4
+ // max_stack 0
+ // max_regs 1
+ // scope_depth 0
+ // max_scope 0
+ // code_length 1
+ bb0
+ succs=[]
+ 0 returnvoid
+ }
+}
+
+function script0$init():*
+{
+ // derivedName null
+ // method_info 0
+ // max_stack 3
+ // max_regs 1
+ // scope_depth 0
+ // max_scope 2
+ // code_length 14
+ bb0
+ succs=[]
+ 0 getlocal0
+ 1 pushscope
+ 2 getscopeobject 0
+ 3 getlex Object
+ 4 dup
+ 5 pushscope
+ 6 newclass
+ 7 popscope
+ 8 initproperty %0
+ 9 returnvoid
+}
+
+ </DoABC>
+ <SymbolClass>
+ <Symbol idref="0" className="%0" />
+ </SymbolClass>
+ <ShowFrame/>
+</swf>