Show convert instruction when needed - int(xx), String(xx), etc....

This commit is contained in:
Jindra Petřík
2022-11-24 22:38:31 +01:00
parent 86fa76678b
commit e22669d377
67 changed files with 492 additions and 93 deletions

View File

@@ -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);

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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<GraphTargetItem> 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

View File

@@ -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<GraphTargetItem> 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

View File

@@ -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

View File

@@ -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

View File

@@ -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);
}

View File

@@ -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);

View File

@@ -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()) {

View File

@@ -44,13 +44,16 @@ public class CallPropertyAVM2Item extends AVM2Item {
public List<GraphTargetItem> arguments;
public boolean isVoid;
public GraphTargetItem type;
public CallPropertyAVM2Item(GraphSourceItem instruction, GraphSourceItem lineStartIns, boolean isVoid, GraphTargetItem receiver, GraphTargetItem propertyName, List<GraphTargetItem> arguments) {
public CallPropertyAVM2Item(GraphSourceItem instruction, GraphSourceItem lineStartIns, boolean isVoid, GraphTargetItem receiver, GraphTargetItem propertyName, List<GraphTargetItem> 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

View File

@@ -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;
}

View File

@@ -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

View File

@@ -69,7 +69,7 @@ public class FloatValueAVM2Item extends NumberValueAVM2Item {
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
return TypeItem.NUMBER;
}
@Override

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -148,7 +148,7 @@ public class IntegerValueAVM2Item extends NumberValueAVM2Item implements Integer
@Override
public GraphTargetItem returnType() {
return new TypeItem(DottedChain.INT);
return TypeItem.INT;
}
@Override

View File

@@ -131,6 +131,9 @@ public class LocalRegAVM2Item extends AVM2Item {
@Override
public GraphTargetItem returnType() {
if (computedValue != null) {
return computedValue.returnType();
}
return TypeItem.UNBOUNDED;
}

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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;

View File

@@ -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();
}

View File

@@ -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

View File

@@ -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();
}
}

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -48,7 +48,7 @@ public class InAVM2Item extends BinaryOpItem {
@Override
public GraphTargetItem returnType() {
return new TypeItem(DottedChain.BOOLEAN);
return TypeItem.BOOLEAN;
}
@Override

View File

@@ -48,7 +48,7 @@ public class InstanceOfAVM2Item extends BinaryOpItem {
@Override
public GraphTargetItem returnType() {
return new TypeItem(DottedChain.BOOLEAN);
return TypeItem.BOOLEAN;
}
@Override

View File

@@ -48,7 +48,7 @@ public class IsTypeAVM2Item extends BinaryOpItem {
@Override
public GraphTargetItem returnType() {
return new TypeItem(DottedChain.BOOLEAN);
return TypeItem.BOOLEAN;
}
@Override

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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();
}

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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();
}

View File

@@ -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();
}
}

View File

@@ -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

View File

@@ -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);