mirror of
https://git.huckle.dev/Huckles-Minecraft-Archive/jpexs-decompiler.git
synced 2026-08-02 15:32:15 +00:00
Fixed #1888 AS3 - Coerce to int when Number
Fixed AS3 - super properties resolving
This commit is contained in:
@@ -13,6 +13,8 @@ All notable changes to this project will be documented in this file.
|
||||
- [#1892] AS3 - internal modifier after implicit namespace
|
||||
- [#1888] AS3 - Coerce to string
|
||||
- AS3 - local registers type declarations vs for..in clause
|
||||
- [#1888] AS3 - Coerce to int when Number
|
||||
- AS3 - super properties resolving
|
||||
|
||||
## [18.3.2] - 2023-01-10
|
||||
### Removed
|
||||
|
||||
@@ -255,6 +255,7 @@ import com.jpexs.decompiler.flash.abc.avm2.model.FindPropertyAVM2Item;
|
||||
import com.jpexs.decompiler.flash.abc.avm2.model.FullMultinameAVM2Item;
|
||||
import com.jpexs.decompiler.flash.abc.avm2.model.GetLexAVM2Item;
|
||||
import com.jpexs.decompiler.flash.abc.avm2.model.GetPropertyAVM2Item;
|
||||
import com.jpexs.decompiler.flash.abc.avm2.model.GetSlotAVM2Item;
|
||||
import com.jpexs.decompiler.flash.abc.avm2.model.InitPropertyAVM2Item;
|
||||
import com.jpexs.decompiler.flash.abc.avm2.model.LocalRegAVM2Item;
|
||||
import com.jpexs.decompiler.flash.abc.avm2.model.NewActivationAVM2Item;
|
||||
@@ -1780,6 +1781,8 @@ public class AVM2Code implements Cloneable {
|
||||
vtype = ((CoerceAVM2Item) assignment.value).typeObj;
|
||||
} else if (assignment instanceof LocalRegAVM2Item) { //for..in
|
||||
vtype = ((LocalRegAVM2Item)assignment).type;
|
||||
} else if (assignment instanceof GetSlotAVM2Item) { //for..in
|
||||
vtype = ((GetSlotAVM2Item)assignment).slotType;
|
||||
} else if ((assignment.value instanceof SimpleValue) && ((SimpleValue) assignment.value).isSimpleValue()) {
|
||||
vtype = assignment.value.returnType();
|
||||
}
|
||||
@@ -2196,19 +2199,19 @@ public class AVM2Code implements Cloneable {
|
||||
type = new TypeItem(abc.constants.getMultiname(param_types[i]).getNameWithNamespace(abc.constants, true));
|
||||
}
|
||||
if (d.length > r) {
|
||||
d[r] = new DeclarationAVM2Item(new SetLocalAVM2Item(null, null, r, new NullAVM2Item(null, null)), type);
|
||||
d[r] = new DeclarationAVM2Item(new SetLocalAVM2Item(null, null, r, new NullAVM2Item(null, null), type), type);
|
||||
}
|
||||
r++;
|
||||
}
|
||||
if (abc.method_info.get(body.method_info).flagNeed_arguments()) {
|
||||
if (d.length > r) {
|
||||
d[r] = new DeclarationAVM2Item(new SetLocalAVM2Item(null, null, r, new NullAVM2Item(null, null)), TypeItem.ARRAY /*?*/);
|
||||
d[r] = new DeclarationAVM2Item(new SetLocalAVM2Item(null, null, r, new NullAVM2Item(null, null), TypeItem.ARRAY), TypeItem.ARRAY /*?*/);
|
||||
}
|
||||
r++;
|
||||
}
|
||||
if (abc.method_info.get(body.method_info).flagNeed_rest()) {
|
||||
if (d.length > r) {
|
||||
d[r] = new DeclarationAVM2Item(new SetLocalAVM2Item(null, null, r, new NullAVM2Item(null, null)), TypeItem.ARRAY/*?*/);
|
||||
d[r] = new DeclarationAVM2Item(new SetLocalAVM2Item(null, null, r, new NullAVM2Item(null, null), TypeItem.ARRAY), TypeItem.ARRAY/*?*/);
|
||||
}
|
||||
r++;
|
||||
}
|
||||
|
||||
@@ -20,6 +20,7 @@ import com.jpexs.decompiler.flash.abc.AVM2LocalData;
|
||||
import com.jpexs.decompiler.flash.abc.avm2.model.AVM2Item;
|
||||
import com.jpexs.decompiler.flash.abc.avm2.model.CoerceAVM2Item;
|
||||
import com.jpexs.decompiler.flash.abc.avm2.model.ConvertAVM2Item;
|
||||
import com.jpexs.decompiler.flash.abc.avm2.model.IntegerValueAVM2Item;
|
||||
import com.jpexs.decompiler.flash.abc.avm2.model.LocalRegAVM2Item;
|
||||
import com.jpexs.decompiler.graph.GraphTargetItem;
|
||||
import com.jpexs.decompiler.graph.TranslateStack;
|
||||
@@ -33,7 +34,18 @@ import java.util.List;
|
||||
*/
|
||||
public interface SetTypeIns {
|
||||
|
||||
public static void handleResult(GraphTargetItem value, TranslateStack stack, List<GraphTargetItem> output, AVM2LocalData localData, GraphTargetItem result, int regId) {
|
||||
public static GraphTargetItem handleNumberToInt(GraphTargetItem value, GraphTargetItem type) {
|
||||
if ((value instanceof ConvertAVM2Item) || (value instanceof CoerceAVM2Item)) {
|
||||
if (type != null && (type.equals(TypeItem.INT) || type.equals(TypeItem.UINT))) {
|
||||
if (value.value.returnType().equals(TypeItem.NUMBER)) {
|
||||
return value.value;
|
||||
}
|
||||
}
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
public static void handleResult(GraphTargetItem value, TranslateStack stack, List<GraphTargetItem> output, AVM2LocalData localData, GraphTargetItem result, int regId, GraphTargetItem type) {
|
||||
GraphTargetItem notCoercedValue = value;
|
||||
if ((value instanceof CoerceAVM2Item) || (value instanceof ConvertAVM2Item)) {
|
||||
notCoercedValue = value.value;
|
||||
@@ -84,7 +96,7 @@ public interface SetTypeIns {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
output.add(result);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -124,7 +124,7 @@ public abstract class SetLocalTypeIns extends InstructionDefinition implements S
|
||||
}
|
||||
}
|
||||
|
||||
SetLocalAVM2Item result = new SetLocalAVM2Item(ins, localData.lineStartInstruction, regId, value);
|
||||
SetLocalAVM2Item result = new SetLocalAVM2Item(ins, localData.lineStartInstruction, regId, value, value.returnType());
|
||||
if (value.getNotCoerced() instanceof CompoundableBinaryOp) {
|
||||
CompoundableBinaryOp binaryOp = (CompoundableBinaryOp) value.getNotCoerced();
|
||||
if (binaryOp.getLeftSide() instanceof LocalRegAVM2Item) {
|
||||
@@ -136,7 +136,7 @@ public abstract class SetLocalTypeIns extends InstructionDefinition implements S
|
||||
}
|
||||
}
|
||||
|
||||
SetTypeIns.handleResult(value, stack, output, localData, result, regId);
|
||||
SetTypeIns.handleResult(value, stack, output, localData, result, regId, value.returnType());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -21,18 +21,20 @@ import com.jpexs.decompiler.flash.abc.AVM2LocalData;
|
||||
import com.jpexs.decompiler.flash.abc.avm2.AVM2Code;
|
||||
import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction;
|
||||
import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition;
|
||||
import static com.jpexs.decompiler.flash.abc.avm2.instructions.other.GetPropertyIns.resolvePropertyType;
|
||||
import com.jpexs.decompiler.flash.abc.avm2.model.FullMultinameAVM2Item;
|
||||
import com.jpexs.decompiler.flash.abc.avm2.model.GetSuperAVM2Item;
|
||||
import com.jpexs.decompiler.graph.GraphTargetItem;
|
||||
import com.jpexs.decompiler.graph.TranslateStack;
|
||||
import com.jpexs.helpers.Reference;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author JPEXS
|
||||
*/
|
||||
public class GetSuperIns extends InstructionDefinition {
|
||||
|
||||
public class GetSuperIns extends InstructionDefinition {
|
||||
|
||||
public GetSuperIns() {
|
||||
super(0x04, "getsuper", new int[]{AVM2Code.DAT_MULTINAME_INDEX}, true);
|
||||
}
|
||||
@@ -42,7 +44,13 @@ public class GetSuperIns extends InstructionDefinition {
|
||||
int multinameIndex = ins.operands[0];
|
||||
FullMultinameAVM2Item multiname = resolveMultiname(localData, true, stack, localData.getConstants(), multinameIndex, ins);
|
||||
GraphTargetItem obj = stack.pop();
|
||||
stack.push(new GetSuperAVM2Item(ins, localData.lineStartInstruction, obj, multiname));
|
||||
|
||||
Reference<Boolean> isStatic = new Reference<>(false);
|
||||
Reference<GraphTargetItem> type = new Reference<>(null);
|
||||
Reference<GraphTargetItem> callType = new Reference<>(null);
|
||||
resolvePropertyType(localData, obj, multiname, isStatic, type, callType);
|
||||
|
||||
stack.push(new GetSuperAVM2Item(ins, localData.lineStartInstruction, obj, multiname, type.getVal(), callType.getVal(),isStatic.getVal()));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -364,7 +364,7 @@ public class SetPropertyIns extends InstructionDefinition implements SetTypeIns
|
||||
SetPropertyAVM2Item result = new SetPropertyAVM2Item(ins, localData.lineStartInstruction, obj, multiname, value, type.getVal(), callType.getVal(), isStatic.getVal());
|
||||
handleCompound(localData, obj, multiname, value, output, result);
|
||||
|
||||
SetTypeIns.handleResult(value, stack, output, localData, result, -1);
|
||||
SetTypeIns.handleResult(value, stack, output, localData, result, -1, type.getVal());
|
||||
}
|
||||
|
||||
public static void handleCompound(AVM2LocalData localData, GraphTargetItem obj, FullMultinameAVM2Item multiname, GraphTargetItem value, List<GraphTargetItem> output, SetTypeAVM2Item result) {
|
||||
|
||||
@@ -168,7 +168,7 @@ public class SetSlotIns extends InstructionDefinition implements SetTypeIns {
|
||||
}
|
||||
}
|
||||
|
||||
SetTypeIns.handleResult(value, stack, output, localData, result, -1);
|
||||
SetTypeIns.handleResult(value, stack, output, localData, result, -1, slotType);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -28,6 +28,7 @@ import com.jpexs.decompiler.flash.abc.avm2.model.SetSuperAVM2Item;
|
||||
import com.jpexs.decompiler.graph.GraphTargetItem;
|
||||
import com.jpexs.decompiler.graph.TranslateStack;
|
||||
import com.jpexs.decompiler.graph.model.CompoundableBinaryOp;
|
||||
import com.jpexs.helpers.Reference;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
@@ -49,7 +50,13 @@ public class SetSuperIns extends InstructionDefinition implements SetTypeIns {
|
||||
|
||||
FullMultinameAVM2Item multiname = resolveMultiname(localData, true, stack, localData.getConstants(), multinameIndex, ins);
|
||||
GraphTargetItem obj = stack.pop();
|
||||
SetSuperAVM2Item result = new SetSuperAVM2Item(ins, localData.lineStartInstruction, value, obj, multiname);
|
||||
|
||||
Reference<Boolean> isStatic = new Reference<>(false);
|
||||
Reference<GraphTargetItem> type = new Reference<>(null);
|
||||
Reference<GraphTargetItem> callType = new Reference<>(null);
|
||||
GetPropertyIns.resolvePropertyType(localData, obj /*??*/, multiname, isStatic, type, callType);
|
||||
|
||||
SetSuperAVM2Item result = new SetSuperAVM2Item(ins, localData.lineStartInstruction, value, obj, multiname, type.getVal(), callType.getVal(), isStatic.getVal());
|
||||
|
||||
if (value.getNotCoercedNoDup() instanceof CompoundableBinaryOp) {
|
||||
if (!obj.hasSideEffect() && !multiname.hasSideEffect()) {
|
||||
@@ -64,7 +71,7 @@ public class SetSuperIns extends InstructionDefinition implements SetTypeIns {
|
||||
}
|
||||
}
|
||||
|
||||
SetTypeIns.handleResult(value, stack, output, localData, result, -1);
|
||||
SetTypeIns.handleResult(value, stack, output, localData, result, -1, type.getVal());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -66,23 +66,33 @@ public class CoerceAVM2Item extends AVM2Item {
|
||||
displayCoerce = false;
|
||||
break;
|
||||
case "Boolean":
|
||||
displayCoerce = !valueReturnType.equals(TypeItem.BOOLEAN) &&
|
||||
!valueReturnType.equals(TypeItem.UNBOUNDED);
|
||||
displayCoerce = !valueReturnType.equals(TypeItem.BOOLEAN)
|
||||
&& !valueReturnType.equals(TypeItem.UNBOUNDED);
|
||||
break;
|
||||
case "Number":
|
||||
displayCoerce = !valueReturnType.equals(TypeItem.INT)
|
||||
&& !valueReturnType.equals(TypeItem.NUMBER)
|
||||
&& !valueReturnType.equals(TypeItem.UINT)
|
||||
&& !valueReturnType.equals(TypeItem.UNBOUNDED);
|
||||
break;
|
||||
case "int":
|
||||
displayCoerce = !valueReturnType.equals(TypeItem.INT)
|
||||
&& !valueReturnType.equals(TypeItem.UNBOUNDED);
|
||||
break;
|
||||
case "uint":
|
||||
displayCoerce = !valueReturnType.equals(TypeItem.INT) &&
|
||||
!valueReturnType.equals(TypeItem.NUMBER) &&
|
||||
!valueReturnType.equals(TypeItem.UINT) &&
|
||||
!valueReturnType.equals(TypeItem.UNBOUNDED);
|
||||
if (valueReturnType.equals(TypeItem.INT) && (value instanceof IntegerValueAVM2Item)) {
|
||||
displayCoerce = (((IntegerValueAVM2Item) value).value < 0);
|
||||
} else {
|
||||
displayCoerce = !valueReturnType.equals(TypeItem.UINT)
|
||||
&& !valueReturnType.equals(TypeItem.UNBOUNDED);
|
||||
}
|
||||
break;
|
||||
case "String":
|
||||
displayCoerce = !valueReturnType.equals(TypeItem.STRING) &&
|
||||
!valueReturnType.equals(new TypeItem("XML")) &&
|
||||
!valueReturnType.equals(new TypeItem("XMLList")) &&
|
||||
!valueReturnType.equals(new TypeItem("null")) &&
|
||||
!valueReturnType.equals(TypeItem.UNBOUNDED);
|
||||
displayCoerce = !valueReturnType.equals(TypeItem.STRING)
|
||||
&& !valueReturnType.equals(new TypeItem("XML"))
|
||||
&& !valueReturnType.equals(new TypeItem("XMLList"))
|
||||
&& !valueReturnType.equals(new TypeItem("null"))
|
||||
&& !valueReturnType.equals(TypeItem.UNBOUNDED);
|
||||
break;
|
||||
default:
|
||||
displayCoerce = false;
|
||||
@@ -149,7 +159,7 @@ public class CoerceAVM2Item extends AVM2Item {
|
||||
}
|
||||
if (typeObj instanceof TypeItem) {
|
||||
return typeObj;
|
||||
}
|
||||
}
|
||||
return new TypeItem(typeObj.toString());
|
||||
}
|
||||
|
||||
|
||||
@@ -54,24 +54,34 @@ public class ConvertAVM2Item extends AVM2Item {
|
||||
GraphTargetItem valueReturnType = value.returnType();
|
||||
switch (type.toString()) {
|
||||
case "Boolean":
|
||||
displayConvert = !valueReturnType.equals(TypeItem.BOOLEAN) &&
|
||||
!valueReturnType.equals(TypeItem.UNBOUNDED);
|
||||
displayConvert = !valueReturnType.equals(TypeItem.BOOLEAN)
|
||||
&& !valueReturnType.equals(TypeItem.UNBOUNDED);
|
||||
break;
|
||||
case "Number":
|
||||
displayConvert = !valueReturnType.equals(TypeItem.INT)
|
||||
&& !valueReturnType.equals(TypeItem.NUMBER)
|
||||
&& !valueReturnType.equals(TypeItem.UINT)
|
||||
&& !valueReturnType.equals(TypeItem.UNBOUNDED);
|
||||
break;
|
||||
case "int":
|
||||
displayConvert = !valueReturnType.equals(TypeItem.INT)
|
||||
&& !valueReturnType.equals(TypeItem.UNBOUNDED);
|
||||
break;
|
||||
case "uint":
|
||||
displayConvert = !valueReturnType.equals(TypeItem.INT) &&
|
||||
!valueReturnType.equals(TypeItem.NUMBER) &&
|
||||
!valueReturnType.equals(TypeItem.UINT) &&
|
||||
!valueReturnType.equals(TypeItem.UNBOUNDED);
|
||||
if (valueReturnType.equals(TypeItem.INT) && (value instanceof IntegerValueAVM2Item)) {
|
||||
displayConvert = (((IntegerValueAVM2Item) value).value < 0);
|
||||
} else {
|
||||
displayConvert = !valueReturnType.equals(TypeItem.UINT)
|
||||
&& !valueReturnType.equals(TypeItem.UNBOUNDED);
|
||||
}
|
||||
break;
|
||||
case "String":
|
||||
displayConvert = !valueReturnType.equals(TypeItem.STRING) &&
|
||||
!valueReturnType.equals(new TypeItem("XML")) &&
|
||||
!valueReturnType.equals(new TypeItem("XMLList")) &&
|
||||
!valueReturnType.equals(new TypeItem("null")) &&
|
||||
!valueReturnType.equals(TypeItem.UNBOUNDED);
|
||||
break;
|
||||
displayConvert = !valueReturnType.equals(TypeItem.STRING)
|
||||
&& !valueReturnType.equals(new TypeItem("XML"))
|
||||
&& !valueReturnType.equals(new TypeItem("XMLList"))
|
||||
&& !valueReturnType.equals(new TypeItem("null"))
|
||||
&& !valueReturnType.equals(TypeItem.UNBOUNDED);
|
||||
break;
|
||||
}
|
||||
if (displayConvert) {
|
||||
type.toString(writer, localData).append("(");
|
||||
|
||||
@@ -20,7 +20,6 @@ import com.jpexs.decompiler.flash.helpers.GraphTextWriter;
|
||||
import com.jpexs.decompiler.graph.GraphSourceItem;
|
||||
import com.jpexs.decompiler.graph.GraphTargetItem;
|
||||
import com.jpexs.decompiler.graph.GraphTargetVisitorInterface;
|
||||
import com.jpexs.decompiler.graph.TypeItem;
|
||||
import com.jpexs.decompiler.graph.model.LocalData;
|
||||
import java.util.Objects;
|
||||
|
||||
@@ -34,10 +33,19 @@ public class GetSuperAVM2Item extends AVM2Item {
|
||||
|
||||
public FullMultinameAVM2Item propertyName;
|
||||
|
||||
public GetSuperAVM2Item(GraphSourceItem instruction, GraphSourceItem lineStartIns, GraphTargetItem object, FullMultinameAVM2Item propertyName) {
|
||||
public GraphTargetItem type;
|
||||
|
||||
public GraphTargetItem callType;
|
||||
|
||||
public boolean isStatic;
|
||||
|
||||
public GetSuperAVM2Item(GraphSourceItem instruction, GraphSourceItem lineStartIns, GraphTargetItem object, FullMultinameAVM2Item propertyName, GraphTargetItem type, GraphTargetItem callType, boolean isStatic) {
|
||||
super(instruction, lineStartIns, PRECEDENCE_PRIMARY);
|
||||
this.object = object;
|
||||
this.propertyName = propertyName;
|
||||
this.type = type;
|
||||
this.callType = callType;
|
||||
this.isStatic = isStatic;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -60,7 +68,7 @@ public class GetSuperAVM2Item extends AVM2Item {
|
||||
|
||||
@Override
|
||||
public GraphTargetItem returnType() {
|
||||
return TypeItem.UNBOUNDED;
|
||||
return type;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -146,7 +146,7 @@ public class IntegerValueAVM2Item extends NumberValueAVM2Item implements Integer
|
||||
}
|
||||
|
||||
@Override
|
||||
public GraphTargetItem returnType() {
|
||||
public GraphTargetItem returnType() {
|
||||
return TypeItem.INT;
|
||||
}
|
||||
|
||||
|
||||
@@ -19,6 +19,7 @@ package com.jpexs.decompiler.flash.abc.avm2.model;
|
||||
import com.jpexs.decompiler.flash.SourceGeneratorLocalData;
|
||||
import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction;
|
||||
import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instructions;
|
||||
import com.jpexs.decompiler.flash.abc.avm2.instructions.SetTypeIns;
|
||||
import com.jpexs.decompiler.flash.abc.avm2.model.clauses.AssignmentAVM2Item;
|
||||
import com.jpexs.decompiler.flash.abc.avm2.model.clauses.DeclarationAVM2Item;
|
||||
import com.jpexs.decompiler.flash.helpers.GraphTextWriter;
|
||||
@@ -43,6 +44,8 @@ public class SetLocalAVM2Item extends AVM2Item implements SetTypeAVM2Item, Assig
|
||||
public GraphTargetItem compoundValue;
|
||||
|
||||
public String compoundOperator;
|
||||
|
||||
public GraphTargetItem type;
|
||||
|
||||
@Override
|
||||
public DeclarationAVM2Item getDeclaration() {
|
||||
@@ -54,9 +57,10 @@ public class SetLocalAVM2Item extends AVM2Item implements SetTypeAVM2Item, Assig
|
||||
this.declaration = declaration;
|
||||
}
|
||||
|
||||
public SetLocalAVM2Item(GraphSourceItem instruction, GraphSourceItem lineStartIns, int regIndex, GraphTargetItem value) {
|
||||
public SetLocalAVM2Item(GraphSourceItem instruction, GraphSourceItem lineStartIns, int regIndex, GraphTargetItem value, GraphTargetItem type) {
|
||||
super(instruction, lineStartIns, PRECEDENCE_ASSIGMENT, value);
|
||||
this.regIndex = regIndex;
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -73,8 +77,8 @@ public class SetLocalAVM2Item extends AVM2Item implements SetTypeAVM2Item, Assig
|
||||
writer.append(" = ");
|
||||
/*if (declaration != null && !declaration.type.equals(TypeItem.UNBOUNDED) && (value instanceof ConvertAVM2Item)) {
|
||||
return value.value.toString(writer, localData);
|
||||
}*/
|
||||
return value.toString(writer, localData);
|
||||
}*/
|
||||
return SetTypeIns.handleNumberToInt(value, type).toString(writer, localData);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -141,7 +145,7 @@ public class SetLocalAVM2Item extends AVM2Item implements SetTypeAVM2Item, Assig
|
||||
|
||||
@Override
|
||||
public GraphTargetItem returnType() {
|
||||
return value.returnType();
|
||||
return type;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -19,6 +19,7 @@ package com.jpexs.decompiler.flash.abc.avm2.model;
|
||||
import com.jpexs.decompiler.flash.SourceGeneratorLocalData;
|
||||
import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction;
|
||||
import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instructions;
|
||||
import com.jpexs.decompiler.flash.abc.avm2.instructions.SetTypeIns;
|
||||
import com.jpexs.decompiler.flash.abc.avm2.model.clauses.AssignmentAVM2Item;
|
||||
import com.jpexs.decompiler.flash.abc.avm2.model.clauses.DeclarationAVM2Item;
|
||||
import com.jpexs.decompiler.flash.abc.avm2.parser.script.AVM2SourceGenerator;
|
||||
@@ -103,7 +104,7 @@ public class SetPropertyAVM2Item extends AVM2Item implements SetTypeAVM2Item, As
|
||||
/*if (declaration != null && !declaration.type.equals(TypeItem.UNBOUNDED) && (value instanceof ConvertAVM2Item)) {
|
||||
return value.value.toString(writer, localData);
|
||||
}*/
|
||||
return value.toString(writer, localData);
|
||||
return SetTypeIns.handleNumberToInt(value, type).toString(writer, localData);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
*/
|
||||
package com.jpexs.decompiler.flash.abc.avm2.model;
|
||||
|
||||
import com.jpexs.decompiler.flash.abc.avm2.instructions.SetTypeIns;
|
||||
import com.jpexs.decompiler.flash.abc.avm2.model.clauses.AssignmentAVM2Item;
|
||||
import com.jpexs.decompiler.flash.abc.avm2.model.clauses.DeclarationAVM2Item;
|
||||
import com.jpexs.decompiler.flash.abc.types.Multiname;
|
||||
@@ -102,7 +103,7 @@ public class SetSlotAVM2Item extends AVM2Item implements SetTypeAVM2Item, Assign
|
||||
/*if (declaration != null && !declaration.type.equals(TypeItem.UNBOUNDED) && (value instanceof ConvertAVM2Item)) {
|
||||
return value.value.toString(writer, localData);
|
||||
}*/
|
||||
return value.toString(writer, localData);
|
||||
return SetTypeIns.handleNumberToInt(value, type).toString(writer, localData);
|
||||
}
|
||||
|
||||
public String getNameAsStr(LocalData localData) throws InterruptedException {
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
*/
|
||||
package com.jpexs.decompiler.flash.abc.avm2.model;
|
||||
|
||||
import com.jpexs.decompiler.flash.abc.avm2.instructions.SetTypeIns;
|
||||
import com.jpexs.decompiler.flash.abc.avm2.model.clauses.DeclarationAVM2Item;
|
||||
import com.jpexs.decompiler.flash.helpers.GraphTextWriter;
|
||||
import com.jpexs.decompiler.graph.GraphPart;
|
||||
@@ -40,6 +41,12 @@ public class SetSuperAVM2Item extends AVM2Item implements SetTypeAVM2Item {
|
||||
public GraphTargetItem compoundValue;
|
||||
|
||||
public String compoundOperator;
|
||||
|
||||
public GraphTargetItem type;
|
||||
|
||||
public GraphTargetItem callType;
|
||||
|
||||
public boolean isStatic;
|
||||
|
||||
@Override
|
||||
public DeclarationAVM2Item getDeclaration() {
|
||||
@@ -65,10 +72,13 @@ public class SetSuperAVM2Item extends AVM2Item implements SetTypeAVM2Item {
|
||||
return value.getFirstPart();
|
||||
}
|
||||
|
||||
public SetSuperAVM2Item(GraphSourceItem instruction, GraphSourceItem lineStartIns, GraphTargetItem value, GraphTargetItem object, FullMultinameAVM2Item propertyName) {
|
||||
public SetSuperAVM2Item(GraphSourceItem instruction, GraphSourceItem lineStartIns, GraphTargetItem value, GraphTargetItem object, FullMultinameAVM2Item propertyName, GraphTargetItem type, GraphTargetItem callType, boolean isStatic) {
|
||||
super(instruction, lineStartIns, PRECEDENCE_ASSIGMENT, value);
|
||||
this.object = object;
|
||||
this.propertyName = propertyName;
|
||||
this.type = type;
|
||||
this.callType = callType;
|
||||
this.isStatic = isStatic;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -88,7 +98,7 @@ public class SetSuperAVM2Item extends AVM2Item implements SetTypeAVM2Item {
|
||||
return compoundValue.toString(writer, localData);
|
||||
}
|
||||
writer.append(" = ");
|
||||
return value.toString(writer, localData);
|
||||
return SetTypeIns.handleNumberToInt(value, type).toString(writer, localData);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -109,7 +119,7 @@ public class SetSuperAVM2Item extends AVM2Item implements SetTypeAVM2Item {
|
||||
|
||||
@Override
|
||||
public GraphTargetItem getObject() {
|
||||
return new GetSuperAVM2Item(getInstruction(), getLineStartIns(), object, propertyName);
|
||||
return new GetSuperAVM2Item(getInstruction(), getLineStartIns(), object, propertyName, type, callType, isStatic);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
package com.jpexs.decompiler.flash.abc.avm2.model.clauses;
|
||||
|
||||
import com.jpexs.decompiler.flash.IdentifiersDeobfuscation;
|
||||
import com.jpexs.decompiler.flash.abc.avm2.instructions.SetTypeIns;
|
||||
import com.jpexs.decompiler.flash.abc.avm2.model.AVM2Item;
|
||||
import com.jpexs.decompiler.flash.abc.avm2.model.CoerceAVM2Item;
|
||||
import com.jpexs.decompiler.flash.abc.avm2.model.ConvertAVM2Item;
|
||||
@@ -60,8 +61,8 @@ public class DeclarationAVM2Item extends AVM2Item {
|
||||
|
||||
public DeclarationAVM2Item(GraphTargetItem assignment) {
|
||||
this(assignment, null);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException {
|
||||
|
||||
@@ -105,7 +106,7 @@ public class DeclarationAVM2Item extends AVM2Item {
|
||||
type.appendTry(writer, localData);
|
||||
if (showValue) {
|
||||
writer.append(" = ");
|
||||
val.toString(writer, localData);
|
||||
SetTypeIns.handleNumberToInt(val, type).toString(writer, localData);
|
||||
}
|
||||
return writer;
|
||||
}
|
||||
@@ -124,7 +125,7 @@ public class DeclarationAVM2Item extends AVM2Item {
|
||||
type.appendTry(writer, localData);
|
||||
if (showValue) {
|
||||
writer.append(" = ");
|
||||
val.toString(writer, localData);
|
||||
SetTypeIns.handleNumberToInt(val, type).toString(writer, localData);
|
||||
}
|
||||
return writer;
|
||||
}
|
||||
@@ -144,7 +145,7 @@ public class DeclarationAVM2Item extends AVM2Item {
|
||||
type.appendTry(writer, localData);
|
||||
if (showValue) {
|
||||
writer.append(" = ");
|
||||
val.toString(writer, localData);
|
||||
SetTypeIns.handleNumberToInt(val, type).toString(writer, localData);
|
||||
}
|
||||
return writer;
|
||||
}
|
||||
|
||||
@@ -229,6 +229,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile
|
||||
+ "var xlist:XMLList;\r\n"
|
||||
+ "var lc:LocalClass;\r\n"
|
||||
+ "var f:Function;\r\n"
|
||||
+ "var d:Number;\r\n"
|
||||
+ "var s:String = \"a\";\r\n"
|
||||
+ "var i:int = int(s);\r\n"
|
||||
+ "var j:int = n;\r\n"
|
||||
@@ -293,7 +294,18 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile
|
||||
+ "{\r\n"
|
||||
+ "trace(\"obj\");\r\n"
|
||||
+ "}\r\n"
|
||||
+ "s = xlist;\r\n",
|
||||
+ "s = xlist;\r\n"
|
||||
+ "d = 0;\r\n"
|
||||
+ "d = 1;\r\n"
|
||||
+ "d = 1.5;\r\n"
|
||||
+ "i = 1;\r\n"
|
||||
+ "i = 1.5;\r\n"
|
||||
+ "o[int(d * 5)] = 1;\r\n"
|
||||
+ "this.n = 1.5;\r\n"
|
||||
+ "super.prot = 1.5;\r\n"
|
||||
+ "super.prot = int(s);\r\n"
|
||||
+ "i = super.prot;\r\n"
|
||||
+ "s = String(super.prot);\r\n",
|
||||
false);
|
||||
}
|
||||
|
||||
|
||||
@@ -225,6 +225,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes
|
||||
+ "var xlist:XMLList;\r\n"
|
||||
+ "var lc:LocalClass;\r\n"
|
||||
+ "var f:Function;\r\n"
|
||||
+ "var d:Number;\r\n"
|
||||
+ "var s:String = null;\r\n"
|
||||
+ "var i:int = 0;\r\n"
|
||||
+ "var a:* = undefined;\r\n"
|
||||
@@ -292,7 +293,18 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes
|
||||
+ "{\r\n"
|
||||
+ "trace(\"obj\");\r\n"
|
||||
+ "}\r\n"
|
||||
+ "s = xlist;\r\n",
|
||||
+ "s = xlist;\r\n"
|
||||
+ "d = 0;\r\n"
|
||||
+ "d = 1;\r\n"
|
||||
+ "d = 1.5;\r\n"
|
||||
+ "i = 1;\r\n"
|
||||
+ "i = 1.5;\r\n"
|
||||
+ "o[int(d * 5)] = 1;\r\n"
|
||||
+ "this.n = 1.5;\r\n"
|
||||
+ "super.prot = 1.5;\r\n"
|
||||
+ "super.prot = int(s);\r\n"
|
||||
+ "i = super.prot;\r\n"
|
||||
+ "s = String(super.prot);\r\n",
|
||||
false);
|
||||
}
|
||||
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -90,7 +90,19 @@ package tests
|
||||
if (o) {
|
||||
trace("obj");
|
||||
}
|
||||
s = xlist;
|
||||
s = xlist;
|
||||
var d:Number = 0;
|
||||
d = 1;
|
||||
d = 1.5;
|
||||
i = 1;
|
||||
i = 1.5;
|
||||
o[int(d * 5)] = 1;
|
||||
this.n = 1.5;
|
||||
super.prot = 1.5;
|
||||
super.prot = int(s);
|
||||
i = super.prot;
|
||||
s = String(super.prot);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user