Fixed #2202 AS2 return in constructor does not take a value

This commit is contained in:
Jindra Petřík
2024-03-23 20:40:38 +01:00
parent 163a0e00d2
commit ffda86028d
6 changed files with 66 additions and 0 deletions

View File

@@ -36,6 +36,7 @@ All notable changes to this project will be documented in this file.
- [#2211] PDF export, Font export - glyphs with no contours (advance only)
- [#2212] GFX - Allow loading (DDS) images despite of set bitmapFormat
- [#2202] AS2 detection of uninitialized class fields colliding with setters/getters
- [#2202] AS2 return in constructor does not take a value
### Changed
- [#2185] MochiCrypt no longer offered for auto decrypt, user needs to choose variant from "Use unpacker" menu

View File

@@ -734,6 +734,24 @@ public class ActionScript2ClassDetector {
DirectValueActionItem classBaseName = new DirectValueActionItem(classNamePath.get(classNamePath.size() - 1));
((FunctionActionItem) constructor).calculatedFunctionName = classBaseName;
traits.add(0, new MyEntry<>(classBaseName, constructor));
AbstractGraphTargetVisitor visitor = new AbstractGraphTargetVisitor() {
@Override
public void visit(GraphTargetItem item) {
if (item instanceof ReturnActionItem) {
ReturnActionItem ret = (ReturnActionItem) item;
if (ret.value instanceof DirectValueActionItem) {
DirectValueActionItem dv = (DirectValueActionItem) ret.value;
if (dv.value instanceof Undefined) {
ret.value = null;
}
}
}
}
};
for (GraphTargetItem ti : ((FunctionActionItem) constructor).actions) {
ti.visitRecursively(visitor);
}
} else {
//throw new AssertException("No constructor found");
}

View File

@@ -208,4 +208,29 @@ public class ActionScript2ClassesTest extends ActionScript2TestBase {
+ " com.jpexs.flash.test.testcases.TestSetterGetter.mystvar = 6;\n"
+ " }");
}
@Test
public void testReturnInConstructor() {
compareSrc("TestReturnInConstructor", " function TestReturnInConstructor()\n"
+ " {\n"
+ " var _loc1_ = 3;\n"
+ " if(_loc1_ == 3)\n"
+ " {\n"
+ " trace(\"A\");\n"
+ " return;\n"
+ " }\n"
+ " trace(\"B\");\n"
+ " }\n"
+ " function func()\n"
+ " {\n"
+ " var _loc1_ = 3;\n"
+ " if(_loc1_ == 3)\n"
+ " {\n"
+ " trace(\"A\");\n"
+ " return undefined;\n"
+ " }\n"
+ " trace(\"B\");\n"
+ " return 5;\n"
+ " }");
}
}

Binary file not shown.

View File

@@ -8,5 +8,6 @@ class com.jpexs.flash.test.TestLoader {
new com.jpexs.flash.test.testcases.TestCallSetterGetter();
new com.jpexs.flash.test.testcases.TestVarsMethods();
new com.jpexs.flash.test.testcases.TestMaintainOrder();
new com.jpexs.flash.test.testcases.TestReturnInConstructor();
}
}

View File

@@ -0,0 +1,21 @@
class com.jpexs.flash.test.testcases.TestReturnInConstructor {
public function TestReturnInConstructor(){
var k = 3;
if (k == 3) {
trace("A");
return;
}
trace("B");
}
public function func() {
var k = 3;
if (k == 3) {
trace("A");
return undefined;
}
trace("B");
return 5;
}
}