diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java index 398a9319b..ec6bcf749 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java @@ -1976,7 +1976,7 @@ public class AVM2Code implements Cloneable { Slot sl = new Slot(new NewActivationAVM2Item(null, null), abc.constants.getMultiname(traits.get(traitName).name_index)); TraitSlotConst tsc = (TraitSlotConst) traits.get(traitName); GraphTargetItem type = PropertyAVM2Item.multinameToType(tsc.type_index, abc.constants); - DeclarationAVM2Item d = new DeclarationAVM2Item(new GetLexAVM2Item(null, null, sl.multiname, abc.constants), type); + DeclarationAVM2Item d = new DeclarationAVM2Item(new GetLexAVM2Item(null, null, sl.multiname, abc.constants, type), type); declaredSlotsDec.add(d); declaredSlots.add(sl); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/executing/CallPropLexIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/executing/CallPropLexIns.java index 2106b1070..7974dac8d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/executing/CallPropLexIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/executing/CallPropLexIns.java @@ -22,10 +22,12 @@ import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; import com.jpexs.decompiler.flash.abc.avm2.LocalDataArea; import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; import com.jpexs.decompiler.flash.abc.avm2.model.CallPropertyAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.FindPropertyAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.FullMultinameAVM2Item; import com.jpexs.decompiler.flash.ecma.NotCompileTime; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TranslateStack; +import com.jpexs.decompiler.graph.TypeItem; import java.util.ArrayList; import java.util.List; @@ -79,7 +81,24 @@ public class CallPropLexIns extends CallPropertyIns { FullMultinameAVM2Item multiname = resolveMultiname(localData, true, stack, localData.getConstants(), multinameIndex, ins); GraphTargetItem receiver = stack.pop(); - stack.push(new CallPropertyAVM2Item(ins, localData.lineStartInstruction, false, receiver, multiname, args)); + GraphTargetItem type = TypeItem.UNBOUNDED; + + if (receiver instanceof FindPropertyAVM2Item) { + FindPropertyAVM2Item fprop = (FindPropertyAVM2Item) receiver; + if (fprop.propertyName.equals(multiname)) { + switch (multiname.resolvedMultinameName) { + case "Boolean": + case "int": + case "uint": + case "Number": + case "String": + type = new TypeItem(multiname.resolvedMultinameName); + break; + } + } + } + + stack.push(new CallPropertyAVM2Item(ins, localData.lineStartInstruction, false, receiver, multiname, args, type)); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/executing/CallPropVoidIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/executing/CallPropVoidIns.java index 0ca538a70..6f882341e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/executing/CallPropVoidIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/executing/CallPropVoidIns.java @@ -24,9 +24,11 @@ import com.jpexs.decompiler.flash.abc.avm2.LocalDataArea; import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; import com.jpexs.decompiler.flash.abc.avm2.model.CallPropertyAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.FindPropertyAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.FullMultinameAVM2Item; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TranslateStack; +import com.jpexs.decompiler.graph.TypeItem; import java.util.ArrayList; import java.util.List; @@ -79,8 +81,23 @@ public class CallPropVoidIns extends InstructionDefinition { FullMultinameAVM2Item multiname = resolveMultiname(localData, true, stack, localData.getConstants(), multinameIndex, ins); GraphTargetItem receiver = stack.pop(); + GraphTargetItem type = TypeItem.UNBOUNDED; - output.add(new CallPropertyAVM2Item(ins, localData.lineStartInstruction, true, receiver, multiname, args)); + if (receiver instanceof FindPropertyAVM2Item) { + FindPropertyAVM2Item fprop = (FindPropertyAVM2Item) receiver; + if (fprop.propertyName.equals(multiname)) { + switch (multiname.resolvedMultinameName) { + case "Boolean": + case "int": + case "uint": + case "Number": + case "String": + type = new TypeItem(multiname.resolvedMultinameName); + break; + } + } + } + output.add(new CallPropertyAVM2Item(ins, localData.lineStartInstruction, true, receiver, multiname, args, type)); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/executing/CallPropertyIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/executing/CallPropertyIns.java index 76e388539..83ff2e13a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/executing/CallPropertyIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/executing/CallPropertyIns.java @@ -24,10 +24,12 @@ import com.jpexs.decompiler.flash.abc.avm2.LocalDataArea; import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; import com.jpexs.decompiler.flash.abc.avm2.model.CallPropertyAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.FindPropertyAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.FullMultinameAVM2Item; import com.jpexs.decompiler.flash.ecma.NotCompileTime; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TranslateStack; +import com.jpexs.decompiler.graph.TypeItem; import java.util.ArrayList; import java.util.List; @@ -79,8 +81,23 @@ public class CallPropertyIns extends InstructionDefinition { FullMultinameAVM2Item multiname = resolveMultiname(localData, true, stack, localData.getConstants(), multinameIndex, ins); GraphTargetItem receiver = stack.pop(); + GraphTargetItem type = TypeItem.UNBOUNDED; - stack.push(new CallPropertyAVM2Item(ins, localData.lineStartInstruction, false, receiver, multiname, args)); + if (receiver instanceof FindPropertyAVM2Item) { + FindPropertyAVM2Item fprop = (FindPropertyAVM2Item) receiver; + if (fprop.propertyName.equals(multiname)) { + switch (multiname.resolvedMultinameName) { + case "Boolean": + case "int": + case "uint": + case "Number": + case "String": + type = new TypeItem(multiname.resolvedMultinameName); + break; + } + } + } + stack.push(new CallPropertyAVM2Item(ins, localData.lineStartInstruction, false, receiver, multiname, args, type)); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetGlobalSlotIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetGlobalSlotIns.java index 4ebf46ee4..c4b76bb1c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetGlobalSlotIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetGlobalSlotIns.java @@ -23,9 +23,14 @@ import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; import com.jpexs.decompiler.flash.abc.avm2.model.GetSlotAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.GlobalAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.NewActivationAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.parser.script.PropertyAVM2Item; import com.jpexs.decompiler.flash.abc.types.Multiname; +import com.jpexs.decompiler.flash.abc.types.traits.Trait; +import com.jpexs.decompiler.flash.abc.types.traits.TraitSlotConst; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TranslateStack; +import com.jpexs.decompiler.graph.TypeItem; import com.jpexs.helpers.Reference; import java.util.List; @@ -45,7 +50,19 @@ public class GetGlobalSlotIns extends InstructionDefinition { GraphTargetItem obj = new GlobalAVM2Item(ins, localData.lineStartInstruction); Reference realObj = new Reference<>(null); Multiname slotname = InstructionDefinition.searchSlotName(slotIndex, localData, obj, realObj); - stack.push(new GetSlotAVM2Item(ins, localData.lineStartInstruction, obj, obj, slotIndex, slotname)); + GraphTargetItem slotType = TypeItem.UNBOUNDED; + if (obj instanceof NewActivationAVM2Item) { + for (Trait t : localData.methodBody.traits.traits) { + if (t instanceof TraitSlotConst) { + TraitSlotConst tsc = (TraitSlotConst)t; + if (tsc.slot_id == slotIndex) { + slotType = PropertyAVM2Item.multinameToType(tsc.type_index, localData.abc.constants); + break; + } + } + } + } + stack.push(new GetSlotAVM2Item(ins, localData.lineStartInstruction, obj, obj, slotIndex, slotname, slotType)); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetLexIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetLexIns.java index d27965ddb..921cd96f9 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetLexIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetLexIns.java @@ -22,10 +22,18 @@ 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 com.jpexs.decompiler.flash.abc.avm2.model.GetLexAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.NewActivationAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.parser.script.PropertyAVM2Item; import com.jpexs.decompiler.flash.abc.types.Multiname; +import com.jpexs.decompiler.flash.abc.types.traits.Trait; +import com.jpexs.decompiler.flash.abc.types.traits.TraitSlotConst; +import com.jpexs.decompiler.graph.DottedChain; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TranslateStack; +import com.jpexs.decompiler.graph.TypeItem; +import java.util.ArrayList; import java.util.List; +import java.util.Objects; /** * @@ -41,7 +49,21 @@ public class GetLexIns extends InstructionDefinition { public void translate(AVM2LocalData localData, TranslateStack stack, AVM2Instruction ins, List output, String path) { int multinameIndex = ins.operands[0]; Multiname multiname = localData.getConstants().getMultiname(multinameIndex); - stack.push(new GetLexAVM2Item(ins, localData.lineStartInstruction, multiname, localData.getConstants())); + String multinameStr = multiname.getName(localData.abc.constants, new ArrayList<>(), true, true); + GraphTargetItem slotType = TypeItem.UNBOUNDED; + for (Trait t : localData.methodBody.traits.traits) { + if (t instanceof TraitSlotConst) { + TraitSlotConst tsc = (TraitSlotConst) t; + if (Objects.equals( + tsc.getName(localData.abc).getName(localData.abc.constants, new ArrayList<>(), true, true), + multinameStr + )) { + slotType = PropertyAVM2Item.multinameToType(tsc.type_index, localData.abc.constants); + break; + } + } + } + stack.push(new GetLexAVM2Item(ins, localData.lineStartInstruction, multiname, localData.getConstants(), slotType)); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetPropertyIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetPropertyIns.java index cc7499581..9cceb4423 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetPropertyIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetPropertyIns.java @@ -29,15 +29,21 @@ import com.jpexs.decompiler.flash.abc.avm2.model.FullMultinameAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.GetPropertyAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.LocalRegAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.SetLocalAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.parser.script.PropertyAVM2Item; import com.jpexs.decompiler.flash.abc.types.Multiname; +import com.jpexs.decompiler.flash.abc.types.traits.Trait; +import com.jpexs.decompiler.flash.abc.types.traits.TraitSlotConst; import com.jpexs.decompiler.flash.ecma.ArrayType; import com.jpexs.decompiler.flash.ecma.EcmaScript; import com.jpexs.decompiler.flash.ecma.ObjectType; import com.jpexs.decompiler.flash.ecma.Undefined; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TranslateStack; +import com.jpexs.decompiler.graph.TypeItem; import com.jpexs.decompiler.graph.model.DuplicateItem; +import java.util.ArrayList; import java.util.List; +import java.util.Objects; import java.util.Set; /** @@ -121,7 +127,23 @@ public class GetPropertyIns extends InstructionDefinition { } } } - stack.push(new GetPropertyAVM2Item(ins, localData.lineStartInstruction, obj, multiname)); + + GraphTargetItem propertyType = TypeItem.UNBOUNDED; + String multinameStr = localData.abc.constants.getMultiname(multiname.multinameIndex).getName(localData.abc.constants, new ArrayList<>(), true, true); + + for (Trait t : localData.methodBody.traits.traits) { + if (t instanceof TraitSlotConst) { + TraitSlotConst tsc = (TraitSlotConst) t; + if (Objects.equals( + tsc.getName(localData.abc).getName(localData.abc.constants, new ArrayList<>(), true, true), + multinameStr + )) { + propertyType = PropertyAVM2Item.multinameToType(tsc.type_index, localData.abc.constants); + break; + } + } + } + stack.push(new GetPropertyAVM2Item(ins, localData.lineStartInstruction, obj, multiname, propertyType)); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetSlotIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetSlotIns.java index ff86a57a4..dcf8a7ddb 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetSlotIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/GetSlotIns.java @@ -22,9 +22,14 @@ 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 com.jpexs.decompiler.flash.abc.avm2.model.GetSlotAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.NewActivationAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.parser.script.PropertyAVM2Item; import com.jpexs.decompiler.flash.abc.types.Multiname; +import com.jpexs.decompiler.flash.abc.types.traits.Trait; +import com.jpexs.decompiler.flash.abc.types.traits.TraitSlotConst; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TranslateStack; +import com.jpexs.decompiler.graph.TypeItem; import com.jpexs.helpers.Reference; import java.util.List; @@ -48,7 +53,19 @@ public class GetSlotIns extends InstructionDefinition { if (realObj.getVal() != null) { obj = realObj.getVal(); } - stack.push(new GetSlotAVM2Item(ins, localData.lineStartInstruction, obj, objinreg, slotIndex, slotname)); + GraphTargetItem slotType = TypeItem.UNBOUNDED; + if (obj instanceof NewActivationAVM2Item) { + for (Trait t : localData.methodBody.traits.traits) { + if (t instanceof TraitSlotConst) { + TraitSlotConst tsc = (TraitSlotConst)t; + if (tsc.slot_id == slotIndex) { + slotType = PropertyAVM2Item.multinameToType(tsc.type_index, localData.abc.constants); + break; + } + } + } + } + stack.push(new GetSlotAVM2Item(ins, localData.lineStartInstruction, obj, objinreg, slotIndex, slotname, slotType)); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/InitPropertyIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/InitPropertyIns.java index 657798974..0d8a6ea1d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/InitPropertyIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/InitPropertyIns.java @@ -23,9 +23,15 @@ import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition; import com.jpexs.decompiler.flash.abc.avm2.model.FullMultinameAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.InitPropertyAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.parser.script.PropertyAVM2Item; +import com.jpexs.decompiler.flash.abc.types.traits.Trait; +import com.jpexs.decompiler.flash.abc.types.traits.TraitSlotConst; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TranslateStack; +import com.jpexs.decompiler.graph.TypeItem; +import java.util.ArrayList; import java.util.List; +import java.util.Objects; /** * @@ -44,7 +50,23 @@ public class InitPropertyIns extends InstructionDefinition { GraphTargetItem val = stack.pop(); FullMultinameAVM2Item multiname = resolveMultiname(localData, true, stack, localData.getConstants(), multinameIndex, ins); GraphTargetItem obj = stack.pop(); - InitPropertyAVM2Item result = new InitPropertyAVM2Item(ins, localData.lineStartInstruction, obj, multiname, val); + + GraphTargetItem propertyType = TypeItem.UNBOUNDED; + String multinameStr = localData.abc.constants.getMultiname(multiname.multinameIndex).getName(localData.abc.constants, new ArrayList<>(), true, true); + + for (Trait t : localData.methodBody.traits.traits) { + if (t instanceof TraitSlotConst) { + TraitSlotConst tsc = (TraitSlotConst) t; + if (Objects.equals( + tsc.getName(localData.abc).getName(localData.abc.constants, new ArrayList<>(), true, true), + multinameStr + )) { + propertyType = PropertyAVM2Item.multinameToType(tsc.type_index, localData.abc.constants); + break; + } + } + } + InitPropertyAVM2Item result = new InitPropertyAVM2Item(ins, localData.lineStartInstruction, obj, multiname, val, propertyType); SetPropertyIns.handleCompound(localData, obj, multiname, val, output, result); output.add(result); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/SetPropertyIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/SetPropertyIns.java index 39f2a40ee..09ab614bb 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/SetPropertyIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/SetPropertyIns.java @@ -40,8 +40,12 @@ import com.jpexs.decompiler.flash.abc.avm2.model.SetPropertyAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.SetTypeAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.operations.PreDecrementAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.operations.PreIncrementAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.parser.script.PropertyAVM2Item; +import com.jpexs.decompiler.flash.abc.types.traits.Trait; +import com.jpexs.decompiler.flash.abc.types.traits.TraitSlotConst; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TranslateStack; +import com.jpexs.decompiler.graph.TypeItem; import com.jpexs.decompiler.graph.model.CompoundableBinaryOp; import com.jpexs.decompiler.graph.model.DuplicateItem; import java.util.ArrayList; @@ -338,7 +342,23 @@ public class SetPropertyIns extends InstructionDefinition implements SetTypeIns } } - SetPropertyAVM2Item result = new SetPropertyAVM2Item(ins, localData.lineStartInstruction, obj, multiname, value); + GraphTargetItem propertyType = TypeItem.UNBOUNDED; + String multinameStr = localData.abc.constants.getMultiname(multiname.multinameIndex).getName(localData.abc.constants, new ArrayList<>(), true, true); + + for (Trait t : localData.methodBody.traits.traits) { + if (t instanceof TraitSlotConst) { + TraitSlotConst tsc = (TraitSlotConst) t; + if (Objects.equals( + tsc.getName(localData.abc).getName(localData.abc.constants, new ArrayList<>(), true, true), + multinameStr + )) { + propertyType = PropertyAVM2Item.multinameToType(tsc.type_index, localData.abc.constants); + break; + } + } + } + + SetPropertyAVM2Item result = new SetPropertyAVM2Item(ins, localData.lineStartInstruction, obj, multiname, value, propertyType); handleCompound(localData, obj, multiname, value, output, result); SetTypeIns.handleResult(value, stack, output, localData, result, -1); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/SetSlotIns.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/SetSlotIns.java index ab3af662e..646884851 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/SetSlotIns.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/other/SetSlotIns.java @@ -32,9 +32,13 @@ import com.jpexs.decompiler.flash.abc.avm2.model.PostIncrementAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.SetSlotAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.operations.PreDecrementAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.operations.PreIncrementAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.parser.script.PropertyAVM2Item; import com.jpexs.decompiler.flash.abc.types.Multiname; +import com.jpexs.decompiler.flash.abc.types.traits.Trait; +import com.jpexs.decompiler.flash.abc.types.traits.TraitSlotConst; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TranslateStack; +import com.jpexs.decompiler.graph.TypeItem; import com.jpexs.decompiler.graph.model.CompoundableBinaryOp; import com.jpexs.helpers.Reference; import java.util.List; @@ -136,7 +140,20 @@ public class SetSlotIns extends InstructionDefinition implements SetTypeIns { } } - SetSlotAVM2Item result = new SetSlotAVM2Item(ins, localData.lineStartInstruction, obj, objnoreg, slotIndex, slotname, value); + GraphTargetItem slotType = TypeItem.UNBOUNDED; + if (obj instanceof NewActivationAVM2Item) { + for (Trait t : localData.methodBody.traits.traits) { + if (t instanceof TraitSlotConst) { + TraitSlotConst tsc = (TraitSlotConst)t; + if (tsc.slot_id == slotIndex) { + slotType = PropertyAVM2Item.multinameToType(tsc.type_index, localData.abc.constants); + break; + } + } + } + } + + SetSlotAVM2Item result = new SetSlotAVM2Item(ins, localData.lineStartInstruction, obj, objnoreg, slotIndex, slotname, value, slotType); if (value.getNotCoerced() instanceof CompoundableBinaryOp) { if (!obj.hasSideEffect()) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/CallPropertyAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/CallPropertyAVM2Item.java index cd45768e6..eca6ce6bb 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/CallPropertyAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/CallPropertyAVM2Item.java @@ -44,13 +44,16 @@ public class CallPropertyAVM2Item extends AVM2Item { public List arguments; public boolean isVoid; + + public GraphTargetItem type; - public CallPropertyAVM2Item(GraphSourceItem instruction, GraphSourceItem lineStartIns, boolean isVoid, GraphTargetItem receiver, GraphTargetItem propertyName, List arguments) { + public CallPropertyAVM2Item(GraphSourceItem instruction, GraphSourceItem lineStartIns, boolean isVoid, GraphTargetItem receiver, GraphTargetItem propertyName, List arguments, GraphTargetItem type) { super(instruction, lineStartIns, PRECEDENCE_PRIMARY); this.receiver = receiver; this.propertyName = propertyName; this.arguments = arguments; this.isVoid = isVoid; + this.type = type; } @Override @@ -83,7 +86,7 @@ public class CallPropertyAVM2Item extends AVM2Item { @Override public GraphTargetItem returnType() { - return TypeItem.UNBOUNDED; + return type; } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/ConvertAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/ConvertAVM2Item.java index a58d7340d..5db3889c4 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/ConvertAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/ConvertAVM2Item.java @@ -21,7 +21,10 @@ 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.FalseItem; import com.jpexs.decompiler.graph.model.LocalData; +import com.jpexs.decompiler.graph.model.TrueItem; import java.util.Objects; import java.util.Set; @@ -48,9 +51,32 @@ public class ConvertAVM2Item extends AVM2Item { @Override public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { - type.toString(writer, localData).append("("); + boolean displayConvert = true; + GraphTargetItem valueReturnType = value.returnType(); + /*if (valueReturnType instanceof TypeItem) { + TypeItem ti = (TypeItem)valueReturnType; + ti.fullTypeName.toRawString() + }*/ + switch (type.toString()) { + case "Boolean": + displayConvert = !valueReturnType.equals(TypeItem.BOOLEAN); + break; + case "Number": + case "int": + case "uint": + displayConvert = !valueReturnType.equals(TypeItem.INT) && !valueReturnType.equals(TypeItem.NUMBER) && !valueReturnType.equals(TypeItem.UINT); + break; + case "String": + displayConvert = !valueReturnType.equals(TypeItem.STRING); + break; + } + if (displayConvert) { + type.toString(writer, localData).append("("); + } value.toString(writer, localData); - writer.append(")"); + if (displayConvert) { + writer.append(")"); + } return writer; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/DecrementAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/DecrementAVM2Item.java index 04f2f60b6..9918c9404 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/DecrementAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/DecrementAVM2Item.java @@ -62,7 +62,18 @@ public class DecrementAVM2Item extends AVM2Item { @Override public GraphTargetItem returnType() { - return TypeItem.UNBOUNDED; + if (value.returnType().equals(TypeItem.INT)) { + return TypeItem.INT; + } + if (value.returnType().equals(TypeItem.UINT)) { + return TypeItem.UINT; + } + + if (value.returnType().equals(TypeItem.NUMBER)) { + return TypeItem.NUMBER; + } + + return TypeItem.NUMBER; } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/FloatValueAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/FloatValueAVM2Item.java index 403417648..b93a3f51a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/FloatValueAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/FloatValueAVM2Item.java @@ -69,7 +69,7 @@ public class FloatValueAVM2Item extends NumberValueAVM2Item { @Override public GraphTargetItem returnType() { - return TypeItem.UNBOUNDED; + return TypeItem.NUMBER; } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/GetLexAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/GetLexAVM2Item.java index e102fac76..eb8cce02d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/GetLexAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/GetLexAVM2Item.java @@ -34,12 +34,15 @@ import java.util.Objects; public class GetLexAVM2Item extends AVM2Item implements SimpleValue { public Multiname propertyName; + + public GraphTargetItem type; private final DottedChain fullPropertyName; - public GetLexAVM2Item(GraphSourceItem instruction, GraphSourceItem lineStartIns, Multiname propertyName, AVM2ConstantPool constants) { + public GetLexAVM2Item(GraphSourceItem instruction, GraphSourceItem lineStartIns, Multiname propertyName, AVM2ConstantPool constants, GraphTargetItem type) { super(instruction, lineStartIns, PRECEDENCE_PRIMARY); this.propertyName = propertyName; + this.type = type; this.fullPropertyName = propertyName.getNameWithNamespace(constants, true); } @@ -56,7 +59,7 @@ public class GetLexAVM2Item extends AVM2Item implements SimpleValue { @Override public GraphTargetItem returnType() { - return TypeItem.UNBOUNDED; + return type; } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/GetPropertyAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/GetPropertyAVM2Item.java index 0c2c81dc2..75d9075f4 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/GetPropertyAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/GetPropertyAVM2Item.java @@ -46,6 +46,8 @@ public class GetPropertyAVM2Item extends AVM2Item { public GraphTargetItem object; public GraphTargetItem propertyName; + + public GraphTargetItem type; @Override public void visit(GraphTargetVisitorInterface visitor) { @@ -127,10 +129,11 @@ public class GetPropertyAVM2Item extends AVM2Item { return null; } - public GetPropertyAVM2Item(GraphSourceItem instruction, GraphSourceItem lineStartIns, GraphTargetItem object, GraphTargetItem propertyName) { + public GetPropertyAVM2Item(GraphSourceItem instruction, GraphSourceItem lineStartIns, GraphTargetItem object, GraphTargetItem propertyName, GraphTargetItem type) { super(instruction, lineStartIns, PRECEDENCE_PRIMARY); this.object = object; this.propertyName = propertyName; + this.type = type; } @Override @@ -147,7 +150,22 @@ public class GetPropertyAVM2Item extends AVM2Item { @Override public GraphTargetItem returnType() { - return TypeItem.UNBOUNDED; + if (object instanceof FindPropertyAVM2Item) { + FindPropertyAVM2Item fprop = (FindPropertyAVM2Item)object; + if (fprop.propertyName instanceof FullMultinameAVM2Item) { + FullMultinameAVM2Item fmul = (FullMultinameAVM2Item)fprop.propertyName; + if (this.propertyName.equals(fmul)) { + switch(fmul.resolvedMultinameName) { + case "NaN": + return TypeItem.NUMBER; + case "undefined": + return TypeItem.UNDEFINED; + } + } + } + } + return type; + //return TypeItem.UNBOUNDED; } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/GetSlotAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/GetSlotAVM2Item.java index f21551242..7022fa54b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/GetSlotAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/GetSlotAVM2Item.java @@ -38,13 +38,16 @@ public class GetSlotAVM2Item extends AVM2Item { public GraphTargetItem slotObject; public int slotIndex; + + public GraphTargetItem slotType; - public GetSlotAVM2Item(GraphSourceItem instruction, GraphSourceItem lineStartIns, GraphTargetItem scope, GraphTargetItem slotObject, int slotIndex, Multiname slotName) { + public GetSlotAVM2Item(GraphSourceItem instruction, GraphSourceItem lineStartIns, GraphTargetItem scope, GraphTargetItem slotObject, int slotIndex, Multiname slotName, GraphTargetItem slotType) { super(instruction, lineStartIns, PRECEDENCE_PRIMARY); this.slotName = slotName; this.scope = scope; this.slotObject = slotObject; this.slotIndex = slotIndex; + this.slotType = slotType; } @Override @@ -73,7 +76,7 @@ public class GetSlotAVM2Item extends AVM2Item { @Override public GraphTargetItem returnType() { - return TypeItem.UNBOUNDED; + return slotType; } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/IncrementAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/IncrementAVM2Item.java index 96bf0e8f3..6f1ad23b5 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/IncrementAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/IncrementAVM2Item.java @@ -62,7 +62,18 @@ public class IncrementAVM2Item extends AVM2Item { @Override public GraphTargetItem returnType() { - return TypeItem.UNBOUNDED; + if (value.returnType().equals(TypeItem.INT)) { + return TypeItem.INT; + } + if (value.returnType().equals(TypeItem.UINT)) { + return TypeItem.UINT; + } + + if (value.returnType().equals(TypeItem.NUMBER)) { + return TypeItem.NUMBER; + } + + return TypeItem.NUMBER; } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/InitPropertyAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/InitPropertyAVM2Item.java index 4d2210b74..83ed58987 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/InitPropertyAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/InitPropertyAVM2Item.java @@ -41,6 +41,8 @@ public class InitPropertyAVM2Item extends AVM2Item implements SetTypeAVM2Item, A public GraphTargetItem compoundValue; public String compoundOperator; + + public GraphTargetItem type; @Override public void visit(GraphTargetVisitorInterface visitor) { @@ -59,10 +61,11 @@ public class InitPropertyAVM2Item extends AVM2Item implements SetTypeAVM2Item, A this.declaration = declaration; } - public InitPropertyAVM2Item(GraphSourceItem instruction, GraphSourceItem lineStartIns, GraphTargetItem object, FullMultinameAVM2Item propertyName, GraphTargetItem value) { + public InitPropertyAVM2Item(GraphSourceItem instruction, GraphSourceItem lineStartIns, GraphTargetItem object, FullMultinameAVM2Item propertyName, GraphTargetItem value, GraphTargetItem type) { super(instruction, lineStartIns, PRECEDENCE_ASSIGMENT, value); this.object = object; this.propertyName = propertyName; + this.type = type; } @Override @@ -81,7 +84,7 @@ public class InitPropertyAVM2Item extends AVM2Item implements SetTypeAVM2Item, A @Override public GraphTargetItem getObject() { - return new GetPropertyAVM2Item(getInstruction(), getLineStartIns(), object, propertyName); + return new GetPropertyAVM2Item(getInstruction(), getLineStartIns(), object, propertyName, type); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/IntegerValueAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/IntegerValueAVM2Item.java index de2f284cb..1dc41d108 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/IntegerValueAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/IntegerValueAVM2Item.java @@ -148,7 +148,7 @@ public class IntegerValueAVM2Item extends NumberValueAVM2Item implements Integer @Override public GraphTargetItem returnType() { - return new TypeItem(DottedChain.INT); + return TypeItem.INT; } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/LocalRegAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/LocalRegAVM2Item.java index 5fddc89fc..e13074690 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/LocalRegAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/LocalRegAVM2Item.java @@ -131,6 +131,9 @@ public class LocalRegAVM2Item extends AVM2Item { @Override public GraphTargetItem returnType() { + if (computedValue != null) { + return computedValue.returnType(); + } return TypeItem.UNBOUNDED; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/SetLocalAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/SetLocalAVM2Item.java index 1bbbbc3d3..868ba1b28 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/SetLocalAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/SetLocalAVM2Item.java @@ -72,9 +72,9 @@ public class SetLocalAVM2Item extends AVM2Item implements SetTypeAVM2Item, Assig return compoundValue.toString(writer, localData); } writer.append(" = "); - if (declaration != null && !declaration.type.equals(TypeItem.UNBOUNDED) && (value instanceof ConvertAVM2Item)) { + /*if (declaration != null && !declaration.type.equals(TypeItem.UNBOUNDED) && (value instanceof ConvertAVM2Item)) { return value.value.toString(writer, localData); - } + }*/ return value.toString(writer, localData); } @@ -141,8 +141,8 @@ public class SetLocalAVM2Item extends AVM2Item implements SetTypeAVM2Item, Assig } @Override - public GraphTargetItem returnType() { - return TypeItem.UNBOUNDED; + public GraphTargetItem returnType() { + return value.returnType(); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/SetPropertyAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/SetPropertyAVM2Item.java index 7aef53534..e8a32f971 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/SetPropertyAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/SetPropertyAVM2Item.java @@ -48,6 +48,8 @@ public class SetPropertyAVM2Item extends AVM2Item implements SetTypeAVM2Item, As public GraphTargetItem compoundValue; public String compoundOperator; + + public GraphTargetItem type; @Override public DeclarationAVM2Item getDeclaration() { @@ -73,11 +75,12 @@ public class SetPropertyAVM2Item extends AVM2Item implements SetTypeAVM2Item, As } } - public SetPropertyAVM2Item(GraphSourceItem instruction, GraphSourceItem lineStartIns, GraphTargetItem object, GraphTargetItem propertyName, GraphTargetItem value) { + public SetPropertyAVM2Item(GraphSourceItem instruction, GraphSourceItem lineStartIns, GraphTargetItem object, GraphTargetItem propertyName, GraphTargetItem value, GraphTargetItem type) { super(instruction, lineStartIns, PRECEDENCE_ASSIGMENT); this.object = object; - this.propertyName = propertyName; + this.propertyName = propertyName; this.value = value; + this.type = type; } @Override @@ -92,15 +95,15 @@ public class SetPropertyAVM2Item extends AVM2Item implements SetTypeAVM2Item, As } writer.append(" = "); - if (declaration != null && !declaration.type.equals(TypeItem.UNBOUNDED) && (value instanceof ConvertAVM2Item)) { + /*if (declaration != null && !declaration.type.equals(TypeItem.UNBOUNDED) && (value instanceof ConvertAVM2Item)) { return value.value.toString(writer, localData); - } + }*/ return value.toString(writer, localData); } @Override public GraphTargetItem getObject() { - return new GetPropertyAVM2Item(getInstruction(), getLineStartIns(), object, propertyName); + return new GetPropertyAVM2Item(getInstruction(), getLineStartIns(), object, propertyName, type); } @Override @@ -122,7 +125,8 @@ public class SetPropertyAVM2Item extends AVM2Item implements SetTypeAVM2Item, As @Override public GraphTargetItem returnType() { - return TypeItem.UNBOUNDED; + return value.returnType(); + //return TypeItem.UNBOUNDED; } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/SetSlotAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/SetSlotAVM2Item.java index d17040182..88f1a90a2 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/SetSlotAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/SetSlotAVM2Item.java @@ -47,6 +47,8 @@ public class SetSlotAVM2Item extends AVM2Item implements SetTypeAVM2Item, Assign public GraphTargetItem compoundValue; public String compoundOperator; + + public GraphTargetItem type; @Override public void visit(GraphTargetVisitorInterface visitor) { @@ -67,12 +69,13 @@ public class SetSlotAVM2Item extends AVM2Item implements SetTypeAVM2Item, Assign this.declaration = declaration; } - public SetSlotAVM2Item(GraphSourceItem instruction, GraphSourceItem lineStartIns, GraphTargetItem scope, GraphTargetItem slotObject, int slotIndex, Multiname slotName, GraphTargetItem value) { + public SetSlotAVM2Item(GraphSourceItem instruction, GraphSourceItem lineStartIns, GraphTargetItem scope, GraphTargetItem slotObject, int slotIndex, Multiname slotName, GraphTargetItem value, GraphTargetItem type) { super(instruction, lineStartIns, PRECEDENCE_ASSIGMENT, value); this.slotName = slotName; this.scope = scope; this.slotObject = slotObject; this.slotIndex = slotIndex; + this.type = type; } @Override @@ -96,9 +99,9 @@ public class SetSlotAVM2Item extends AVM2Item implements SetTypeAVM2Item, Assign return compoundValue.toString(writer, localData); } writer.append(" = "); - if (declaration != null && !declaration.type.equals(TypeItem.UNBOUNDED) && (value instanceof ConvertAVM2Item)) { + /*if (declaration != null && !declaration.type.equals(TypeItem.UNBOUNDED) && (value instanceof ConvertAVM2Item)) { return value.value.toString(writer, localData); - } + }*/ return value.toString(writer, localData); } @@ -115,7 +118,7 @@ public class SetSlotAVM2Item extends AVM2Item implements SetTypeAVM2Item, Assign @Override public GraphTargetItem getObject() { - return new GetSlotAVM2Item(getInstruction(), getLineStartIns(), scope, slotObject, slotIndex, slotName); + return new GetSlotAVM2Item(getInstruction(), getLineStartIns(), scope, slotObject, slotIndex, slotName, type); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/SetSuperAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/SetSuperAVM2Item.java index 639f1e3b8..c1adfd180 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/SetSuperAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/SetSuperAVM2Item.java @@ -99,7 +99,8 @@ public class SetSuperAVM2Item extends AVM2Item implements SetTypeAVM2Item { @Override public GraphTargetItem returnType() { - return TypeItem.UNBOUNDED; + return value.returnType(); + //return TypeItem.UNBOUNDED; } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/DeclarationAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/DeclarationAVM2Item.java index b575b3821..539a5afa6 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/DeclarationAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/DeclarationAVM2Item.java @@ -106,7 +106,7 @@ public class DeclarationAVM2Item extends AVM2Item { coerType = ((ConvertAVM2Item) lti.value).type; } //strip coerce if its declared as this type - if (coerType.equals(type) && !coerType.equals(TypeItem.UNBOUNDED)) { + if ((lti.value instanceof CoerceAVM2Item) && coerType.equals(type) && !coerType.equals(TypeItem.UNBOUNDED)) { val = val.value; } srcData.declaredType = (coerType instanceof TypeItem) ? ((TypeItem) coerType).fullTypeName : DottedChain.ALL; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/AddAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/AddAVM2Item.java index f966e2ee2..dc506d6c7 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/AddAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/AddAVM2Item.java @@ -27,6 +27,7 @@ import com.jpexs.decompiler.graph.CompilationException; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.SourceGenerator; +import com.jpexs.decompiler.graph.TypeItem; import com.jpexs.decompiler.graph.model.BinaryOpItem; import com.jpexs.decompiler.graph.model.CompoundableBinaryOp; import com.jpexs.decompiler.graph.model.LocalData; @@ -95,6 +96,28 @@ public class AddAVM2Item extends BinaryOpItem implements CompoundableBinaryOp { @Override public GraphTargetItem returnType() { + if (leftSide.returnType().equals(TypeItem.STRING) || rightSide.returnType().equals(TypeItem.STRING)) { + return TypeItem.STRING; + } + if (leftSide.returnType().equals(TypeItem.INT) && rightSide.returnType().equals(TypeItem.INT)) { + return TypeItem.INT; + } + + if ((leftSide.returnType().equals(TypeItem.INT) && rightSide.returnType().equals(TypeItem.UINT))|| + (leftSide.returnType().equals(TypeItem.UINT) && rightSide.returnType().equals(TypeItem.INT)) + ) { + return TypeItem.INT; + } + + if (leftSide.returnType().equals(TypeItem.UINT) && rightSide.returnType().equals(TypeItem.UINT)) { + return TypeItem.UINT; + } + + if (leftSide.returnType().equals(TypeItem.NUMBER) || rightSide.returnType().equals(TypeItem.NUMBER)) { + return TypeItem.NUMBER; + } + + return new UnboundedTypeItem(); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/BitAndAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/BitAndAVM2Item.java index 95b235750..7a8523730 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/BitAndAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/BitAndAVM2Item.java @@ -23,6 +23,7 @@ import com.jpexs.decompiler.graph.CompilationException; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.SourceGenerator; +import com.jpexs.decompiler.graph.TypeItem; import com.jpexs.decompiler.graph.model.BinaryOpItem; import com.jpexs.decompiler.graph.model.CompoundableBinaryOp; import com.jpexs.decompiler.graph.model.UnboundedTypeItem; @@ -53,7 +54,8 @@ public class BitAndAVM2Item extends BinaryOpItem implements CompoundableBinaryOp @Override public GraphTargetItem returnType() { - return new UnboundedTypeItem(); + return TypeItem.INT; //? + //return new UnboundedTypeItem(); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/BitNotAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/BitNotAVM2Item.java index 0e8066438..687c5a9c9 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/BitNotAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/BitNotAVM2Item.java @@ -23,6 +23,7 @@ import com.jpexs.decompiler.graph.CompilationException; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.SourceGenerator; +import com.jpexs.decompiler.graph.TypeItem; import com.jpexs.decompiler.graph.model.UnaryOpItem; import com.jpexs.decompiler.graph.model.UnboundedTypeItem; import java.util.List; @@ -51,6 +52,7 @@ public class BitNotAVM2Item extends UnaryOpItem { @Override public GraphTargetItem returnType() { - return new UnboundedTypeItem(); + return TypeItem.INT; //? + //return new UnboundedTypeItem(); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/BitOrAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/BitOrAVM2Item.java index 4e85982d3..b021a0f3a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/BitOrAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/BitOrAVM2Item.java @@ -23,6 +23,7 @@ import com.jpexs.decompiler.graph.CompilationException; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.SourceGenerator; +import com.jpexs.decompiler.graph.TypeItem; import com.jpexs.decompiler.graph.model.BinaryOpItem; import com.jpexs.decompiler.graph.model.CompoundableBinaryOp; import com.jpexs.decompiler.graph.model.UnboundedTypeItem; @@ -53,7 +54,8 @@ public class BitOrAVM2Item extends BinaryOpItem implements CompoundableBinaryOp @Override public GraphTargetItem returnType() { - return new UnboundedTypeItem(); + return TypeItem.INT; //? + //return new UnboundedTypeItem(); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/BitXorAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/BitXorAVM2Item.java index 3077043a7..f82eef542 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/BitXorAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/BitXorAVM2Item.java @@ -23,6 +23,7 @@ import com.jpexs.decompiler.graph.CompilationException; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.SourceGenerator; +import com.jpexs.decompiler.graph.TypeItem; import com.jpexs.decompiler.graph.model.BinaryOpItem; import com.jpexs.decompiler.graph.model.CompoundableBinaryOp; import com.jpexs.decompiler.graph.model.UnboundedTypeItem; @@ -53,7 +54,8 @@ public class BitXorAVM2Item extends BinaryOpItem implements CompoundableBinaryOp @Override public GraphTargetItem returnType() { - return new UnboundedTypeItem(); + return TypeItem.INT; //? + //return new UnboundedTypeItem(); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/DivideAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/DivideAVM2Item.java index 5d04008f1..c42a5ef1e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/DivideAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/DivideAVM2Item.java @@ -24,6 +24,7 @@ import com.jpexs.decompiler.graph.CompilationException; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.SourceGenerator; +import com.jpexs.decompiler.graph.TypeItem; import com.jpexs.decompiler.graph.model.BinaryOpItem; import com.jpexs.decompiler.graph.model.CompoundableBinaryOp; import com.jpexs.decompiler.graph.model.LocalData; @@ -83,7 +84,8 @@ public class DivideAVM2Item extends BinaryOpItem implements CompoundableBinaryOp @Override public GraphTargetItem returnType() { - return new UnboundedTypeItem(); + return TypeItem.NUMBER; + //return new UnboundedTypeItem(); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/EqAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/EqAVM2Item.java index 7a2855c6d..6212c96f8 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/EqAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/EqAVM2Item.java @@ -71,7 +71,7 @@ public class EqAVM2Item extends BinaryOpItem implements LogicalOpItem, IfConditi @Override public GraphTargetItem returnType() { - return new TypeItem(DottedChain.BOOLEAN); + return TypeItem.BOOLEAN; } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/GeAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/GeAVM2Item.java index 4d5d63835..4d8859b4f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/GeAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/GeAVM2Item.java @@ -77,7 +77,7 @@ public class GeAVM2Item extends BinaryOpItem implements LogicalOpItem, IfConditi @Override public GraphTargetItem returnType() { - return new TypeItem(DottedChain.BOOLEAN); + return TypeItem.BOOLEAN; } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/GtAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/GtAVM2Item.java index 7e9ed28a0..9aa3d78a2 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/GtAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/GtAVM2Item.java @@ -77,7 +77,7 @@ public class GtAVM2Item extends BinaryOpItem implements LogicalOpItem, IfConditi @Override public GraphTargetItem returnType() { - return new TypeItem(DottedChain.BOOLEAN); + return TypeItem.BOOLEAN; } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/InAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/InAVM2Item.java index 47cf38606..5f2d04315 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/InAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/InAVM2Item.java @@ -48,7 +48,7 @@ public class InAVM2Item extends BinaryOpItem { @Override public GraphTargetItem returnType() { - return new TypeItem(DottedChain.BOOLEAN); + return TypeItem.BOOLEAN; } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/InstanceOfAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/InstanceOfAVM2Item.java index 4de9196e7..43efc8720 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/InstanceOfAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/InstanceOfAVM2Item.java @@ -48,7 +48,7 @@ public class InstanceOfAVM2Item extends BinaryOpItem { @Override public GraphTargetItem returnType() { - return new TypeItem(DottedChain.BOOLEAN); + return TypeItem.BOOLEAN; } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/IsTypeAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/IsTypeAVM2Item.java index c57f99eee..96c368fa4 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/IsTypeAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/IsTypeAVM2Item.java @@ -48,7 +48,7 @@ public class IsTypeAVM2Item extends BinaryOpItem { @Override public GraphTargetItem returnType() { - return new TypeItem(DottedChain.BOOLEAN); + return TypeItem.BOOLEAN; } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/LShiftAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/LShiftAVM2Item.java index 6c30b31e5..ac86ba878 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/LShiftAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/LShiftAVM2Item.java @@ -23,6 +23,7 @@ import com.jpexs.decompiler.graph.CompilationException; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.SourceGenerator; +import com.jpexs.decompiler.graph.TypeItem; import com.jpexs.decompiler.graph.model.BinaryOpItem; import com.jpexs.decompiler.graph.model.CompoundableBinaryOp; import com.jpexs.decompiler.graph.model.UnboundedTypeItem; @@ -53,7 +54,8 @@ public class LShiftAVM2Item extends BinaryOpItem implements CompoundableBinaryOp @Override public GraphTargetItem returnType() { - return new UnboundedTypeItem(); + return TypeItem.INT; //? + //return new UnboundedTypeItem(); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/LtAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/LtAVM2Item.java index 7bac0e72f..c9b3ad8cc 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/LtAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/LtAVM2Item.java @@ -77,7 +77,7 @@ public class LtAVM2Item extends BinaryOpItem implements LogicalOpItem, IfConditi @Override public GraphTargetItem returnType() { - return new TypeItem(DottedChain.BOOLEAN); + return TypeItem.BOOLEAN; } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/ModuloAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/ModuloAVM2Item.java index b029ad44c..4f7291db5 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/ModuloAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/ModuloAVM2Item.java @@ -24,6 +24,7 @@ import com.jpexs.decompiler.graph.CompilationException; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.SourceGenerator; +import com.jpexs.decompiler.graph.TypeItem; import com.jpexs.decompiler.graph.model.BinaryOpItem; import com.jpexs.decompiler.graph.model.CompoundableBinaryOp; import com.jpexs.decompiler.graph.model.LocalData; @@ -81,7 +82,8 @@ public class ModuloAVM2Item extends BinaryOpItem implements CompoundableBinaryOp @Override public GraphTargetItem returnType() { - return new UnboundedTypeItem(); + return TypeItem.INT; //? + //return new UnboundedTypeItem(); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/MultiplyAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/MultiplyAVM2Item.java index d0182865b..63864d7b1 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/MultiplyAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/MultiplyAVM2Item.java @@ -24,6 +24,7 @@ import com.jpexs.decompiler.graph.CompilationException; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.SourceGenerator; +import com.jpexs.decompiler.graph.TypeItem; import com.jpexs.decompiler.graph.model.BinaryOpItem; import com.jpexs.decompiler.graph.model.CompoundableBinaryOp; import com.jpexs.decompiler.graph.model.LocalData; @@ -77,6 +78,16 @@ public class MultiplyAVM2Item extends BinaryOpItem implements CompoundableBinary @Override public GraphTargetItem returnType() { + if (leftSide.returnType().equals(TypeItem.INT) && rightSide.returnType().equals(TypeItem.INT)) { + return TypeItem.INT; + } + if (leftSide.returnType().equals(TypeItem.UINT) && rightSide.returnType().equals(TypeItem.UINT)) { + return TypeItem.UINT; + } + if (leftSide.returnType().equals(TypeItem.NUMBER) || rightSide.returnType().equals(TypeItem.NUMBER)) { + return TypeItem.NUMBER; + } + return new UnboundedTypeItem(); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/NeqAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/NeqAVM2Item.java index 0397ce6b6..0bcb11524 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/NeqAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/NeqAVM2Item.java @@ -71,7 +71,7 @@ public class NeqAVM2Item extends BinaryOpItem implements LogicalOpItem, IfCondit @Override public GraphTargetItem returnType() { - return new TypeItem(DottedChain.BOOLEAN); + return TypeItem.BOOLEAN; } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/RShiftAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/RShiftAVM2Item.java index 623f2a87b..dbc6e0cd9 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/RShiftAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/RShiftAVM2Item.java @@ -23,6 +23,7 @@ import com.jpexs.decompiler.graph.CompilationException; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.SourceGenerator; +import com.jpexs.decompiler.graph.TypeItem; import com.jpexs.decompiler.graph.model.BinaryOpItem; import com.jpexs.decompiler.graph.model.CompoundableBinaryOp; import com.jpexs.decompiler.graph.model.UnboundedTypeItem; @@ -53,7 +54,8 @@ public class RShiftAVM2Item extends BinaryOpItem implements CompoundableBinaryOp @Override public GraphTargetItem returnType() { - return new UnboundedTypeItem(); + return TypeItem.INT; //? + //return new UnboundedTypeItem(); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/StrictEqAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/StrictEqAVM2Item.java index 79815f532..43045b790 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/StrictEqAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/StrictEqAVM2Item.java @@ -74,7 +74,7 @@ public class StrictEqAVM2Item extends BinaryOpItem implements LogicalOpItem, IfC @Override public GraphTargetItem returnType() { - return new TypeItem(DottedChain.BOOLEAN); + return TypeItem.BOOLEAN; } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/StrictNeqAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/StrictNeqAVM2Item.java index a8b25e332..7f8540f9d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/StrictNeqAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/StrictNeqAVM2Item.java @@ -74,7 +74,7 @@ public class StrictNeqAVM2Item extends BinaryOpItem implements LogicalOpItem, If @Override public GraphTargetItem returnType() { - return new TypeItem(DottedChain.BOOLEAN); + return TypeItem.BOOLEAN; } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/SubtractAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/SubtractAVM2Item.java index 3c309ae7d..b394f489a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/SubtractAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/SubtractAVM2Item.java @@ -25,6 +25,7 @@ import com.jpexs.decompiler.graph.CompilationException; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.SourceGenerator; +import com.jpexs.decompiler.graph.TypeItem; import com.jpexs.decompiler.graph.model.BinaryOpItem; import com.jpexs.decompiler.graph.model.CompoundableBinaryOp; import com.jpexs.decompiler.graph.model.LocalData; @@ -86,6 +87,24 @@ public class SubtractAVM2Item extends BinaryOpItem implements CompoundableBinary @Override public GraphTargetItem returnType() { + if (leftSide.returnType().equals(TypeItem.INT) && rightSide.returnType().equals(TypeItem.INT)) { + return TypeItem.INT; + } + + if ((leftSide.returnType().equals(TypeItem.INT) && rightSide.returnType().equals(TypeItem.UINT))|| + (leftSide.returnType().equals(TypeItem.UINT) && rightSide.returnType().equals(TypeItem.INT)) + ) { + return TypeItem.INT; + } + + if (leftSide.returnType().equals(TypeItem.UINT) && rightSide.returnType().equals(TypeItem.UINT)) { + return TypeItem.INT; + } + + if (leftSide.returnType().equals(TypeItem.NUMBER) || rightSide.returnType().equals(TypeItem.NUMBER)) { + return TypeItem.NUMBER; + } + return new UnboundedTypeItem(); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/TypeOfAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/TypeOfAVM2Item.java index f0b8ce024..335bc6c3b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/TypeOfAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/TypeOfAVM2Item.java @@ -25,6 +25,7 @@ import com.jpexs.decompiler.graph.CompilationException; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.SourceGenerator; +import com.jpexs.decompiler.graph.TypeItem; import com.jpexs.decompiler.graph.model.UnaryOpItem; import com.jpexs.decompiler.graph.model.UnboundedTypeItem; import java.util.List; @@ -81,6 +82,7 @@ public class TypeOfAVM2Item extends UnaryOpItem { @Override public GraphTargetItem returnType() { - return new UnboundedTypeItem(); + return TypeItem.STRING; + //return new UnboundedTypeItem(); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/URShiftAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/URShiftAVM2Item.java index 29bae97d5..56f4190e8 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/URShiftAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/model/operations/URShiftAVM2Item.java @@ -23,6 +23,7 @@ import com.jpexs.decompiler.graph.CompilationException; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.SourceGenerator; +import com.jpexs.decompiler.graph.TypeItem; import com.jpexs.decompiler.graph.model.BinaryOpItem; import com.jpexs.decompiler.graph.model.CompoundableBinaryOp; import com.jpexs.decompiler.graph.model.UnboundedTypeItem; @@ -53,7 +54,8 @@ public class URShiftAVM2Item extends BinaryOpItem implements CompoundableBinaryO @Override public GraphTargetItem returnType() { - return new UnboundedTypeItem(); + return TypeItem.INT; //? + //return new UnboundedTypeItem(); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/TypeItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/TypeItem.java index 8b6d44833..8663c2787 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/TypeItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/TypeItem.java @@ -35,6 +35,14 @@ public class TypeItem extends GraphTargetItem { public static TypeItem BOOLEAN = new TypeItem(DottedChain.BOOLEAN); public static TypeItem STRING = new TypeItem(DottedChain.STRING); + + public static TypeItem NUMBER = new TypeItem(DottedChain.NUMBER); + + public static TypeItem INT = new TypeItem(DottedChain.INT); + + public static TypeItem UINT = new TypeItem(DottedChain.UINT); + + public static TypeItem UNDEFINED = new TypeItem(DottedChain.UNDEFINED); public static TypeItem ARRAY = new TypeItem(DottedChain.ARRAY); diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicAirDecompileTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicAirDecompileTest.java index eb5128c90..e6a8fdc2a 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicAirDecompileTest.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicAirDecompileTest.java @@ -45,7 +45,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile @Test public void testCallLocal() { decompileMethod("classic_air", "testCallLocal", "var f:Function = getF();\r\n" - + "var b:int = f(1,3);\r\n", + + "var b:int = int(f(1,3));\r\n", false); } @@ -76,7 +76,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "var extraLine:Boolean = false;\r\n" + "var r:int = 7;\r\n" + "var t:int = 0;\r\n" - + "t = this.getInt();\r\n" + + "t = int(this.getInt());\r\n" + "if(t + 1 < g.length)\r\n" + "{\r\n" + "t++;\r\n" @@ -214,6 +214,16 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile false); } + @Test + public void testConvert() { + decompileMethod("classic_air", "testConvert", "var s:String = \"a\";\r\n" + + "var i:int = int(s);\r\n" + + "var j:int = int(n);\r\n" + + "s = String(j);\r\n" + + "s = ns;\r\n", + false); + } + @Test public void testDecl2() { decompileMethod("classic_air", "testDecl2", "var k:int = 0;\r\n" @@ -237,7 +247,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "var vint:int = 0;\r\n" + "var vuint:uint = 0;\r\n" + "var vclass:TestClass1 = null;\r\n" - + "var vnumber:* = NaN;\r\n" + + "var vnumber:Number = NaN;\r\n" + "var vobject:Object = null;\r\n" + "vall = 6;\r\n" + "vstr = \"hello\";\r\n" @@ -270,7 +280,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile @Test public void testDeobfuscation() { - decompileMethod("classic_air", "testDeobfuscation", "var r:int = Math.random();\r\n" + decompileMethod("classic_air", "testDeobfuscation", "var r:int = int(Math.random());\r\n" + "if(r > 5)\r\n" + "{\r\n" + "trace(\"A\");\r\n" @@ -428,7 +438,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile + "var a:int = 4;\r\n" + "var b:int = 7;\r\n" + "var c:int = 9;\r\n" - + "for(i = uint(0); i < len; x = a > 4 && b < 2 || c > 10)\r\n" + + "for(i = 0; i < len; x = a > 4 && b < 2 || c > 10)\r\n" + "{\r\n" + "c = 1;\r\n" + "if(c == 2)\r\n" @@ -559,7 +569,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile decompileMethod("classic_air", "testForGoto", "var i:* = 0;\r\n" + "var c:int = 0;\r\n" + "var len:int = 5;\r\n" - + "for(i = uint(0); i < len; i++)\r\n" + + "for(i = 0; i < len; i++)\r\n" + "{\r\n" + "c = 1;\r\n" + "if(c == 2)\r\n" @@ -842,7 +852,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile decompileMethod("classic_air", "testGotos7", "var i:int = 0;\r\n" + "for(i = 0; i < 10; i++)\r\n" + "{\r\n" - + "switch(int(i))\r\n" + + "switch(i)\r\n" + "{\r\n" + "case 0:\r\n" + "trace(\"zero\");\r\n" @@ -899,7 +909,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile @Test public void testIfFinally() { - decompileMethod("classic_air", "testIfFinally", "var a:int = Math.random();\r\n" + decompileMethod("classic_air", "testIfFinally", "var a:int = int(Math.random());\r\n" + "if(a == 5)\r\n" + "{\r\n" + "try\r\n" @@ -969,7 +979,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile @Test public void testIgnoreAndOr() { - decompileMethod("classic_air", "testIgnoreAndOr", "var k:int = Math.random();\r\n" + decompileMethod("classic_air", "testIgnoreAndOr", "var k:int = int(Math.random());\r\n" + "if(k > 5)\r\n" + "{\r\n" + "trace(\"A\");\r\n" @@ -1184,7 +1194,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile @Test public void testMissingDefault() { decompileMethod("classic_air", "testMissingDefault", "var jj:int = 1;\r\n" - + "switch(int(jj) - 1)\r\n" + + "switch(jj - 1)\r\n" + "{\r\n" + "case 0:\r\n" + "jj = 1;\r\n" @@ -1462,7 +1472,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile @Test public void testTryIf() { - decompileMethod("classic_air", "testTryIf", "var a:int = Math.random();\r\n" + decompileMethod("classic_air", "testTryIf", "var a:int = int(Math.random());\r\n" + "try\r\n" + "{\r\n" + "if(a > 5 && a < 50)\r\n" @@ -1572,7 +1582,7 @@ public class ActionScript3ClassicAirDecompileTest extends ActionScript3Decompile @Test public void testUsagesTry() { decompileMethod("classic_air", "testUsagesTry", "var k:int = 5;\r\n" - + "switch(int(k))\r\n" + + "switch(k)\r\n" + "{\r\n" + "case 0:\r\n" + "trace(\"1\");\r\n" diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicDecompileTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicDecompileTest.java index e5df84a7f..d3602caac 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicDecompileTest.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3ClassicDecompileTest.java @@ -45,7 +45,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes @Test public void testCallLocal() { decompileMethod("classic", "testCallLocal", "var f:Function = this.getF();\r\n" - + "var b:int = f(1,3);\r\n", + + "var b:int = int(f(1,3));\r\n", false); } @@ -76,7 +76,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes + "var extraLine:Boolean = false;\r\n" + "var r:int = 7;\r\n" + "var t:int = 0;\r\n" - + "t = this.getInt();\r\n" + + "t = int(this.getInt());\r\n" + "if(t + 1 < g.length)\r\n" + "{\r\n" + "t++;\r\n" @@ -213,6 +213,16 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes false); } + @Test + public void testConvert() { + decompileMethod("classic", "testConvert", "var s:String = \"a\";\r\n" + + "var i:int = int(s);\r\n" + + "var j:int = int(this.n);\r\n" + + "s = String(j);\r\n" + + "s = this.ns;\r\n", + false); + } + @Test public void testDecl2() { decompileMethod("classic", "testDecl2", "var k:int = 0;\r\n" @@ -269,7 +279,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes @Test public void testDeobfuscation() { - decompileMethod("classic", "testDeobfuscation", "var r:int = Math.random();\r\n" + decompileMethod("classic", "testDeobfuscation", "var r:int = int(Math.random());\r\n" + "if(r > 5)\r\n" + "{\r\n" + "trace(\"A\");\r\n" @@ -964,7 +974,7 @@ public class ActionScript3ClassicDecompileTest extends ActionScript3DecompileTes @Test public void testIgnoreAndOr() { - decompileMethod("classic", "testIgnoreAndOr", "var k:int = Math.random();\r\n" + decompileMethod("classic", "testIgnoreAndOr", "var k:int = int(Math.random());\r\n" + "if(k > 5)\r\n" + "{\r\n" + "trace(\"A\");\r\n" diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3CrossCompileDecompileTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3CrossCompileDecompileTest.java index 9c30f4d83..3839c4c2d 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3CrossCompileDecompileTest.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3CrossCompileDecompileTest.java @@ -79,7 +79,7 @@ public class ActionScript3CrossCompileDecompileTest extends ActionScript3Decompi @Test(dataProvider = "swfNamesProvider") public void testTryCatchInIf(String swfUsed) { - decompileMethod(swfUsed, "testTryCatchInIf", "var a:int = Math.random();\r\n" + decompileMethod(swfUsed, "testTryCatchInIf", "var a:int = int(Math.random());\r\n" + "if(a > 10)\r\n" + "{\r\n" + "try\r\n" @@ -96,7 +96,7 @@ public class ActionScript3CrossCompileDecompileTest extends ActionScript3Decompi @Test(dataProvider = "swfNamesProvider") public void testTryCatchInIf2(String swfUsed) { - decompileMethod(swfUsed, "testTryCatchInIf2", "var a:int = Math.random();\r\n" + decompileMethod(swfUsed, "testTryCatchInIf2", "var a:int = int(Math.random());\r\n" + "if(a > 10)\r\n" + "{\r\n" + "try\r\n" @@ -744,7 +744,7 @@ public class ActionScript3CrossCompileDecompileTest extends ActionScript3Decompi @Test(dataProvider = "swfNamesProvider") public void testTryFinallyReturnNested(String swfUsed) { - decompileMethod(swfUsed, "testTryFinallyReturnNested", "var a:int = Math.random() * 5;\r\n" + decompileMethod(swfUsed, "testTryFinallyReturnNested", "var a:int = int(Math.random() * 5);\r\n" + "try\r\n" + "{\r\n" + "trace(\"before try2\");\r\n" @@ -776,7 +776,7 @@ public class ActionScript3CrossCompileDecompileTest extends ActionScript3Decompi @Test(dataProvider = "swfNamesProvider") public void testTryFinallyReturnNested2(String swfUsed) { - decompileMethod(swfUsed, "testTryFinallyReturnNested2", "var a:int = Math.random() * 5;\r\n" + decompileMethod(swfUsed, "testTryFinallyReturnNested2", "var a:int = int(Math.random() * 5);\r\n" + "try\r\n" + "{\r\n" + "try\r\n" @@ -828,7 +828,7 @@ public class ActionScript3CrossCompileDecompileTest extends ActionScript3Decompi @Test(dataProvider = "swfNamesProvider") public void testTryFinallyReturnVoid(String swfUsed) { - decompileMethod(swfUsed, "testTryFinallyReturnVoid", "var a:int = Math.random() * 5;\r\n" + decompileMethod(swfUsed, "testTryFinallyReturnVoid", "var a:int = int(Math.random() * 5);\r\n" + "trace(\"before try\");\r\n" + "try\r\n" + "{\r\n" diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3CrossCompileSwfToolsDecompileTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3CrossCompileSwfToolsDecompileTest.java index 8da71e1d2..04b345181 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3CrossCompileSwfToolsDecompileTest.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/as3decompile/ActionScript3CrossCompileSwfToolsDecompileTest.java @@ -70,7 +70,7 @@ public class ActionScript3CrossCompileSwfToolsDecompileTest extends ActionScript @Test public void testTryCatchInIf() { - decompileMethod("swftools", "testTryCatchInIf", "var _loc1_:int = Math.random();\r\n" + decompileMethod("swftools", "testTryCatchInIf", "var _loc1_:int = int(Math.random());\r\n" + "if(_loc1_ > 10)\r\n" + "{\r\n" + "try\r\n" @@ -87,7 +87,7 @@ public class ActionScript3CrossCompileSwfToolsDecompileTest extends ActionScript @Test public void testTryCatchInIf2() { - decompileMethod("swftools", "testTryCatchInIf2", "var _loc1_:int = Math.random();\r\n" + decompileMethod("swftools", "testTryCatchInIf2", "var _loc1_:* = int(Math.random());\r\n" + "if(_loc1_ > 10)\r\n" + "{\r\n" + "try\r\n" @@ -762,7 +762,7 @@ public class ActionScript3CrossCompileSwfToolsDecompileTest extends ActionScript @Test public void testTryFinallyReturnNested() { - decompileMethod("swftools", "testTryFinallyReturnNested", "var _loc1_:int = Math.random() * 5;\r\n" + decompileMethod("swftools", "testTryFinallyReturnNested", "var _loc1_:* = int(Math.random() * 5);\r\n" + "try\r\n" + "{\r\n" + "trace(\"before try2\");\r\n" @@ -803,7 +803,7 @@ public class ActionScript3CrossCompileSwfToolsDecompileTest extends ActionScript @Test public void testTryFinallyReturnNested2() { - decompileMethod("swftools", "testTryFinallyReturnNested2", "var _loc1_:int = Math.random() * 5;\r\n" + decompileMethod("swftools", "testTryFinallyReturnNested2", "var _loc1_:* = int(Math.random() * 5);\r\n" + "try\r\n" + "{\r\n" + "try\r\n" @@ -870,7 +870,7 @@ public class ActionScript3CrossCompileSwfToolsDecompileTest extends ActionScript @Test public void testTryFinallyReturnVoid() { - decompileMethod("swftools", "testTryFinallyReturnVoid", "var _loc1_:int = Math.random() * 5;\r\n" + decompileMethod("swftools", "testTryFinallyReturnVoid", "var _loc1_:* = int(Math.random() * 5);\r\n" + "trace(\"before try\");\r\n" + "try\r\n" + "{\r\n" diff --git a/libsrc/ffdec_lib/testdata/as3_cross_compile/bin/as3_cross_compile.air.swf b/libsrc/ffdec_lib/testdata/as3_cross_compile/bin/as3_cross_compile.air.swf index 24bf677b9..cdf76a132 100644 Binary files a/libsrc/ffdec_lib/testdata/as3_cross_compile/bin/as3_cross_compile.air.swf and b/libsrc/ffdec_lib/testdata/as3_cross_compile/bin/as3_cross_compile.air.swf differ diff --git a/libsrc/ffdec_lib/testdata/as3_cross_compile/bin/as3_cross_compile.flex.swf b/libsrc/ffdec_lib/testdata/as3_cross_compile/bin/as3_cross_compile.flex.swf index 14e59fb6c..faca62b3b 100644 Binary files a/libsrc/ffdec_lib/testdata/as3_cross_compile/bin/as3_cross_compile.flex.swf and b/libsrc/ffdec_lib/testdata/as3_cross_compile/bin/as3_cross_compile.flex.swf differ diff --git a/libsrc/ffdec_lib/testdata/as3_cross_compile/bin/as3_cross_compile.flex_apache.swf b/libsrc/ffdec_lib/testdata/as3_cross_compile/bin/as3_cross_compile.flex_apache.swf index d5b97bbb3..c0cc273f0 100644 Binary files a/libsrc/ffdec_lib/testdata/as3_cross_compile/bin/as3_cross_compile.flex_apache.swf and b/libsrc/ffdec_lib/testdata/as3_cross_compile/bin/as3_cross_compile.flex_apache.swf differ diff --git a/libsrc/ffdec_lib/testdata/as3_cross_compile/bin/as3_cross_compile.swftools.swf b/libsrc/ffdec_lib/testdata/as3_cross_compile/bin/as3_cross_compile.swftools.swf index 48a7fc4ea..716519d73 100644 Binary files a/libsrc/ffdec_lib/testdata/as3_cross_compile/bin/as3_cross_compile.swftools.swf and b/libsrc/ffdec_lib/testdata/as3_cross_compile/bin/as3_cross_compile.swftools.swf differ diff --git a/libsrc/ffdec_lib/testdata/as3_cross_compile/src/tests/TestTryCatchInIf2.as b/libsrc/ffdec_lib/testdata/as3_cross_compile/src/tests/TestTryCatchInIf2.as index e15618c4d..29adb20ae 100644 --- a/libsrc/ffdec_lib/testdata/as3_cross_compile/src/tests/TestTryCatchInIf2.as +++ b/libsrc/ffdec_lib/testdata/as3_cross_compile/src/tests/TestTryCatchInIf2.as @@ -10,7 +10,7 @@ package tests public function run():void { - var a:int = Math.random(); + var a:int = int(Math.random()); if (a > 10) { diff --git a/libsrc/ffdec_lib/testdata/as3_cross_compile/src/tests/TestTryFinallyReturnNested.as b/libsrc/ffdec_lib/testdata/as3_cross_compile/src/tests/TestTryFinallyReturnNested.as index baf378ca0..eb35a6f4d 100644 --- a/libsrc/ffdec_lib/testdata/as3_cross_compile/src/tests/TestTryFinallyReturnNested.as +++ b/libsrc/ffdec_lib/testdata/as3_cross_compile/src/tests/TestTryFinallyReturnNested.as @@ -9,7 +9,7 @@ package tests public function run() : String { - var a:int = Math.random() * 5; + var a:int = int(Math.random() * 5); try { trace("before try2"); diff --git a/libsrc/ffdec_lib/testdata/as3_cross_compile/src/tests/TestTryFinallyReturnNested2.as b/libsrc/ffdec_lib/testdata/as3_cross_compile/src/tests/TestTryFinallyReturnNested2.as index 27c44ea9c..24805ba00 100644 --- a/libsrc/ffdec_lib/testdata/as3_cross_compile/src/tests/TestTryFinallyReturnNested2.as +++ b/libsrc/ffdec_lib/testdata/as3_cross_compile/src/tests/TestTryFinallyReturnNested2.as @@ -10,7 +10,7 @@ package tests public function run() : String { - var a:int = Math.random() * 5; + var a:int = int(Math.random() * 5); try { try diff --git a/libsrc/ffdec_lib/testdata/as3_cross_compile/src/tests/TestTryFinallyReturnVoid.as b/libsrc/ffdec_lib/testdata/as3_cross_compile/src/tests/TestTryFinallyReturnVoid.as index b5f57ccb9..1fc103c61 100644 --- a/libsrc/ffdec_lib/testdata/as3_cross_compile/src/tests/TestTryFinallyReturnVoid.as +++ b/libsrc/ffdec_lib/testdata/as3_cross_compile/src/tests/TestTryFinallyReturnVoid.as @@ -9,7 +9,7 @@ package tests public function run() : void { - var a:int = Math.random() * 5; + var a:int = int(Math.random() * 5); trace("before try"); try { diff --git a/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.air.swf b/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.air.swf index f60c1c9df..f7d28ee03 100644 Binary files a/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.air.swf and b/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.air.swf differ diff --git a/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.flex.swf b/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.flex.swf index 9b25bd755..98a94258c 100644 Binary files a/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.flex.swf and b/libsrc/ffdec_lib/testdata/as3_new/bin/as3_new.flex.swf differ diff --git a/libsrc/ffdec_lib/testdata/as3_new/src/Main.as b/libsrc/ffdec_lib/testdata/as3_new/src/Main.as index d4840aeda..e301b87ab 100644 --- a/libsrc/ffdec_lib/testdata/as3_new/src/Main.as +++ b/libsrc/ffdec_lib/testdata/as3_new/src/Main.as @@ -22,6 +22,7 @@ package TestCatchFinally; TestChain2; TestChainedAssignments; + TestConvert; TestComplexExpressions; TestContinueLevels; TestComma; diff --git a/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestConvert.as b/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestConvert.as new file mode 100644 index 000000000..5db7b50b6 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/as3_new/src/tests/TestConvert.as @@ -0,0 +1,18 @@ +package tests +{ + + public class TestConvert + { + private var n:int = 1; + private var ns:String = "b"; + + public function run():void + { + var s:String = "a"; + var i:int = int(s); + var j:int = n; + s = String(j); + s = ns; + } + } +}