Fixed AS1/2 - callmethod on register instead of callfunction on var

This commit is contained in:
Jindra Petřík
2021-11-22 10:34:09 +01:00
parent 12945c5696
commit 69d24bc9cb
3 changed files with 21 additions and 1 deletions

View File

@@ -18,7 +18,12 @@ package com.jpexs.decompiler.flash.action.model;
import com.jpexs.decompiler.flash.IdentifiersDeobfuscation;
import com.jpexs.decompiler.flash.SourceGeneratorLocalData;
import com.jpexs.decompiler.flash.action.parser.script.ActionSourceGenerator;
import com.jpexs.decompiler.flash.action.parser.script.VariableActionItem;
import com.jpexs.decompiler.flash.action.swf4.RegisterNumber;
import com.jpexs.decompiler.flash.action.swf5.ActionCallFunction;
import com.jpexs.decompiler.flash.action.swf5.ActionCallMethod;
import com.jpexs.decompiler.flash.ecma.Undefined;
import com.jpexs.decompiler.flash.helpers.GraphTextWriter;
import com.jpexs.decompiler.flash.helpers.hilight.HighlightData;
import com.jpexs.decompiler.graph.CompilationException;
@@ -28,6 +33,7 @@ import com.jpexs.decompiler.graph.GraphTargetItem;
import com.jpexs.decompiler.graph.GraphTargetVisitorInterface;
import com.jpexs.decompiler.graph.SourceGenerator;
import com.jpexs.decompiler.graph.model.LocalData;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.Set;
@@ -160,6 +166,19 @@ public class CallFunctionActionItem extends ActionItem {
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) throws CompilationException {
if (functionName instanceof VariableActionItem) {
VariableActionItem varItem = (VariableActionItem) functionName;
if (varItem.getBoxedValue() instanceof DirectValueActionItem) {
if (((DirectValueActionItem) varItem.getBoxedValue()).value instanceof RegisterNumber) {
return toSourceMerge(localData, generator, toSourceCall(localData, generator, arguments), varItem.getBoxedValue(), new DirectValueActionItem(Undefined.INSTANCE), new ActionCallMethod());
}
}
String varName = varItem.getVariableName();
ActionSourceGenerator asg = (ActionSourceGenerator) generator;
return toSourceMerge(localData, generator, toSourceCall(localData, generator, arguments), asg.pushConst(varName), new ActionCallFunction());
}
return toSourceMerge(localData, generator, toSourceCall(localData, generator, arguments), functionName, new ActionCallFunction());
}

View File

@@ -2008,7 +2008,7 @@ public class ActionScript2Parser {
&& (Action.propertyNamesList.contains(((VariableActionItem) args.get(1)).getVariableName()))) {
ret = new SetPropertyActionItem(null, null, args.get(0), Action.propertyNamesList.indexOf(((VariableActionItem) args.get(1)).getVariableName()), args.get(2));
} else {
ret = new CallFunctionActionItem(null, null, pushConst(var.getVariableName()), args);
ret = new CallFunctionActionItem(null, null, var, args);
}
} else if (ret instanceof EvalActionItem) {
EvalActionItem ev = (EvalActionItem) ret;