hasSideEffect method

This commit is contained in:
Jindra Petřík
2021-03-07 21:28:38 +01:00
parent 3ac5af8f5f
commit 16a03fe0f7
71 changed files with 472 additions and 12 deletions

View File

@@ -22,7 +22,6 @@ import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool;
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.instructions.SetTypeIns;
import com.jpexs.decompiler.flash.abc.avm2.model.AVM2Item;
import com.jpexs.decompiler.flash.abc.avm2.model.DecrementAVM2Item;
import com.jpexs.decompiler.flash.abc.avm2.model.FindPropertyAVM2Item;
import com.jpexs.decompiler.flash.abc.avm2.model.IncrementAVM2Item;
@@ -33,14 +32,11 @@ import com.jpexs.decompiler.flash.abc.avm2.model.PostIncrementAVM2Item;
import com.jpexs.decompiler.flash.abc.avm2.model.SetLocalAVM2Item;
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.types.MethodBody;
import com.jpexs.decompiler.graph.DottedChain;
import com.jpexs.decompiler.graph.GraphTargetItem;
import com.jpexs.decompiler.graph.TranslateStack;
import com.jpexs.decompiler.graph.model.CompoundableBinaryOp;
import com.jpexs.decompiler.graph.model.PopItem;
import java.util.HashMap;
import java.util.List;
import java.util.Stack;
/**
*
@@ -128,10 +124,17 @@ public abstract class SetLocalTypeIns extends InstructionDefinition implements S
}
}
/*if (localData.getSetLocalUsages(localData.code.adr2pos(ins.getAddress())).isEmpty() && (value instanceof DuplicateItem)) {
return;
SetLocalAVM2Item result = new SetLocalAVM2Item(ins, localData.lineStartInstruction, regId, value);
/*if (value.getNotCoercedNoDup() instanceof CompoundableBinaryOp) {
CompoundableBinaryOp binaryOp = (CompoundableBinaryOp) value.getNotCoercedNoDup();
if (binaryOp.getLeftSide() instanceof LocalRegAVM2Item) {
LocalRegAVM2Item loc = (LocalRegAVM2Item) binaryOp.getLeftSide();
if (loc.regIndex == regId) {
result.setCompoundValue(binaryOp.getRightSide());
result.setCompoundOperator(binaryOp.getOperator());
}
}
}*/
GraphTargetItem result = new SetLocalAVM2Item(ins, localData.lineStartInstruction, regId, value);
SetTypeIns.handleResult(value, stack, output, localData, result, regId);
}

View File

@@ -336,10 +336,10 @@ public class SetPropertyIns extends InstructionDefinition implements SetTypeIns
}
}
SetPropertyAVM2Item result = new SetPropertyAVM2Item(ins, localData.lineStartInstruction, obj, multiname, value);
/*if (value instanceof LocalRegAVM2Item) {
/*
if (value instanceof LocalRegAVM2Item) {
LocalRegAVM2Item locVal = (LocalRegAVM2Item) value;
if (multiname.name instanceof LocalRegAVM2Item) {
LocalRegAVM2Item locName = (LocalRegAVM2Item) multiname.name;

View File

@@ -267,4 +267,9 @@ public class CallAVM2Item extends AVM2Item {
return true;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -109,4 +109,8 @@ public class CallMethodAVM2Item extends AVM2Item {
return true;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -128,4 +128,8 @@ public class CallPropertyAVM2Item extends AVM2Item {
return true;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -109,4 +109,8 @@ public class CallStaticAVM2Item extends AVM2Item {
return true;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -120,4 +120,8 @@ public class CallSuperAVM2Item extends AVM2Item {
return true;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -116,4 +116,8 @@ public class ConstructAVM2Item extends AVM2Item {
return true;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -113,4 +113,8 @@ public class ConstructPropAVM2Item extends AVM2Item {
return true;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -115,4 +115,8 @@ public class ConstructSuperAVM2Item extends AVM2Item {
return true;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -76,4 +76,8 @@ public class DecLocalAVM2Item extends AVM2Item {
return true;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -76,4 +76,8 @@ public class IncLocalAVM2Item extends AVM2Item {
return true;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -38,6 +38,10 @@ public class InitPropertyAVM2Item extends AVM2Item implements SetTypeAVM2Item, A
public DeclarationAVM2Item declaration;
public GraphTargetItem compoundValue;
public String compoundOperator;
@Override
public void visit(GraphTargetVisitorInterface visitor) {
visitor.visit(object);
@@ -64,6 +68,13 @@ public class InitPropertyAVM2Item extends AVM2Item implements SetTypeAVM2Item, A
@Override
public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException {
formatProperty(writer, object, propertyName, localData);
if (compoundOperator != null) {
writer.append(" ");
writer.append(compoundOperator);
writer.append("= ");
return compoundValue.toString(writer, localData);
}
writer.append(" = ");
return value.toString(writer, localData);
}
@@ -117,4 +128,23 @@ public class InitPropertyAVM2Item extends AVM2Item implements SetTypeAVM2Item, A
return true;
}
@Override
public GraphTargetItem getCompoundValue() {
return compoundValue;
}
@Override
public void setCompoundValue(GraphTargetItem value) {
this.compoundValue = value;
}
@Override
public void setCompoundOperator(String operator) {
compoundOperator = operator;
}
@Override
public String getCompoundOperator() {
return compoundOperator;
}
}

View File

@@ -97,4 +97,8 @@ public class NameValuePair extends AVM2Item {
return true;
}
@Override
public boolean hasSideEffect() {
return name.hasSideEffect() || value.hasSideEffect();
}
}

View File

@@ -136,4 +136,14 @@ public class NewArrayAVM2Item extends AVM2Item {
return true;
}
@Override
public boolean hasSideEffect() {
for (GraphTargetItem v : values) {
if (v.hasSideEffect()) {
return true;
}
}
return false;
}
}

View File

@@ -155,4 +155,14 @@ public class NewObjectAVM2Item extends AVM2Item {
return true;
}
@Override
public boolean hasSideEffect() {
for (NameValuePair p : pairs) {
if (p.hasSideEffect()) {
return true;
}
}
return false;
}
}

View File

@@ -83,4 +83,9 @@ public class ReturnValueAVM2Item extends AVM2Item implements ExitItem {
int hash = 3;
return hash;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -78,4 +78,9 @@ public class ReturnVoidAVM2Item extends AVM2Item implements ExitItem {
int hash = 3;
return hash;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -41,6 +41,10 @@ public class SetLocalAVM2Item extends AVM2Item implements SetTypeAVM2Item, Assig
public DeclarationAVM2Item declaration;
public GraphTargetItem compoundValue;
public String compoundOperator;
@Override
public DeclarationAVM2Item getDeclaration() {
return declaration;
@@ -60,7 +64,14 @@ public class SetLocalAVM2Item extends AVM2Item implements SetTypeAVM2Item, Assig
public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException {
String localName = localRegName(localData.localRegNames, regIndex);
getSrcData().localName = localName;
writer.append(localName).append(" = ");
writer.append(localName);
if (compoundOperator != null) {
writer.append(" ");
writer.append(compoundOperator);
writer.append("= ");
return compoundValue.toString(writer, localData);
}
writer.append(" = ");
if (declaration != null && !declaration.type.equals(TypeItem.UNBOUNDED) && (value instanceof ConvertAVM2Item)) {
return value.value.toString(writer, localData);
}
@@ -167,4 +178,23 @@ public class SetLocalAVM2Item extends AVM2Item implements SetTypeAVM2Item, Assig
return true;
}
@Override
public GraphTargetItem getCompoundValue() {
return compoundValue;
}
@Override
public void setCompoundValue(GraphTargetItem value) {
this.compoundValue = value;
}
@Override
public void setCompoundOperator(String operator) {
compoundOperator = operator;
}
@Override
public String getCompoundOperator() {
return compoundOperator;
}
}

View File

@@ -127,4 +127,24 @@ public class SetPropertyAVM2Item extends AVM2Item implements SetTypeAVM2Item, As
public boolean hasReturnValue() {
return false;
}
@Override
public GraphTargetItem getCompoundValue() {
return compoundValue;
}
@Override
public void setCompoundValue(GraphTargetItem value) {
this.compoundValue = value;
}
@Override
public void setCompoundOperator(String operator) {
compoundOperator = operator;
}
@Override
public String getCompoundOperator() {
return compoundOperator;
}
}

View File

@@ -44,6 +44,10 @@ public class SetSlotAVM2Item extends AVM2Item implements SetTypeAVM2Item, Assign
public int slotIndex;
public GraphTargetItem compoundValue;
public String compoundOperator;
@Override
public void visit(GraphTargetVisitorInterface visitor) {
visitor.visit(scope);
@@ -81,6 +85,13 @@ public class SetSlotAVM2Item extends AVM2Item implements SetTypeAVM2Item, Assign
return writer;
}
getName(writer, localData);
if (compoundOperator != null) {
writer.append(" ");
writer.append(compoundOperator);
writer.append("= ");
return compoundValue.toString(writer, localData);
}
writer.append(" = ");
if (declaration != null && !declaration.type.equals(TypeItem.UNBOUNDED) && (value instanceof ConvertAVM2Item)) {
return value.value.toString(writer, localData);
@@ -157,4 +168,23 @@ public class SetSlotAVM2Item extends AVM2Item implements SetTypeAVM2Item, Assign
return true;
}
@Override
public GraphTargetItem getCompoundValue() {
return compoundValue;
}
@Override
public void setCompoundValue(GraphTargetItem value) {
this.compoundValue = value;
}
@Override
public void setCompoundOperator(String operator) {
compoundOperator = operator;
}
@Override
public String getCompoundOperator() {
return compoundOperator;
}
}

View File

@@ -38,6 +38,10 @@ public class SetSuperAVM2Item extends AVM2Item implements SetTypeAVM2Item {
public DeclarationAVM2Item declaration;
public GraphTargetItem compoundValue;
public String compoundOperator;
@Override
public DeclarationAVM2Item getDeclaration() {
return declaration;
@@ -78,6 +82,12 @@ public class SetSuperAVM2Item extends AVM2Item implements SetTypeAVM2Item {
}
writer.append("super.");
propertyName.toString(writer, localData);
if (compoundOperator != null) {
writer.append(" ");
writer.append(compoundOperator);
writer.append("= ");
return compoundValue.toString(writer, localData);
}
writer.append(" = ");
return value.toString(writer, localData);
}
@@ -139,4 +149,23 @@ public class SetSuperAVM2Item extends AVM2Item implements SetTypeAVM2Item {
return true;
}
@Override
public GraphTargetItem getCompoundValue() {
return compoundValue;
}
@Override
public void setCompoundValue(GraphTargetItem value) {
this.compoundValue = value;
}
@Override
public void setCompoundOperator(String operator) {
compoundOperator = operator;
}
@Override
public String getCompoundOperator() {
return compoundOperator;
}
}

View File

@@ -12,7 +12,8 @@
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library.
* License along with this library.
*/
package com.jpexs.decompiler.flash.abc.avm2.model;
import com.jpexs.decompiler.flash.abc.avm2.model.clauses.DeclarationAVM2Item;
@@ -31,4 +32,12 @@ public interface SetTypeAVM2Item {
public DeclarationAVM2Item getDeclaration();
public void setDeclaration(DeclarationAVM2Item dec);
public GraphTargetItem getCompoundValue();
public void setCompoundValue(GraphTargetItem value);
public void setCompoundOperator(String operator);
public String getCompoundOperator();
}

View File

@@ -83,4 +83,9 @@ public class ThrowAVM2Item extends AVM2Item implements ExitItem {
int hash = 3;
return hash;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -87,4 +87,10 @@ public class CallActionItem extends ActionItem {
int hash = 3;
return hash;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -149,4 +149,10 @@ public class CallFunctionActionItem extends ActionItem {
public boolean hasReturnValue() {
return true;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -170,4 +170,8 @@ public class CallMethodActionItem extends ActionItem {
return true;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -85,4 +85,9 @@ public class CloneSpriteActionItem extends ActionItem {
public boolean hasReturnValue() {
return false;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -151,4 +151,9 @@ public class DefineLocalActionItem extends ActionItem implements SetTypeActionIt
return true;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -127,4 +127,10 @@ public class DeleteActionItem extends ActionItem {
return true;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -100,4 +100,8 @@ public class EnumerateActionItem extends ActionItem {
return true;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -122,4 +122,8 @@ public class FSCommand2ActionItem extends ActionItem {
return true;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -91,4 +91,8 @@ public class FSCommandActionItem extends ActionItem {
return true;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -411,5 +411,9 @@ public class FunctionActionItem extends ActionItem {
return false; //function actually returns itself, but here is false for generator to not add Pop
}
@Override
public boolean hasSideEffect() {
return true; //??
}
//What about hashcode and equals? Probably not.
}

View File

@@ -124,4 +124,8 @@ public class GetURL2ActionItem extends ActionItem {
return true;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -93,4 +93,8 @@ public class GetURLActionItem extends ActionItem {
return true;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -130,4 +130,8 @@ public class GotoFrame2ActionItem extends ActionItem {
return true;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -82,4 +82,8 @@ public class GotoFrameActionItem extends ActionItem {
return true;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -84,4 +84,8 @@ public class GotoLabelActionItem extends ActionItem {
return true;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -103,4 +103,15 @@ public class InitArrayActionItem extends ActionItem {
return true;
}
@Override
public boolean hasSideEffect() {
for (GraphTargetItem v : values) {
if (v.hasSideEffect()) {
return true;
}
}
return false;
}
}

View File

@@ -132,4 +132,19 @@ public class InitObjectActionItem extends ActionItem {
return true;
}
@Override
public boolean hasSideEffect() {
for (GraphTargetItem n : names) {
if (n.hasSideEffect()) {
return true;
}
}
for (GraphTargetItem v : values) {
if (v.hasSideEffect()) {
return true;
}
}
return false;
}
}

View File

@@ -114,4 +114,8 @@ public class LoadMovieActionItem extends ActionItem {
return true;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -123,4 +123,8 @@ public class LoadMovieNumActionItem extends ActionItem {
return true;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -114,4 +114,8 @@ public class LoadVariablesActionItem extends ActionItem {
return true;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -123,4 +123,8 @@ public class LoadVariablesNumActionItem extends ActionItem {
return true;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -149,4 +149,9 @@ public class NewMethodActionItem extends ActionItem {
return true;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -115,4 +115,9 @@ public class NewObjectActionItem extends ActionItem {
return true;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -71,4 +71,9 @@ public class NextFrameActionItem extends ActionItem {
int hash = 3;
return hash;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -71,4 +71,9 @@ public class PlayActionItem extends ActionItem {
int hash = 3;
return hash;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -71,4 +71,9 @@ public class PrevFrameActionItem extends ActionItem {
int hash = 3;
return hash;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -103,4 +103,8 @@ public class PrintActionItem extends ActionItem {
return true;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -103,4 +103,8 @@ public class PrintAsBitmapActionItem extends ActionItem {
return true;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -109,4 +109,8 @@ public class PrintAsBitmapNumActionItem extends ActionItem {
return true;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -109,4 +109,8 @@ public class PrintNumActionItem extends ActionItem {
return true;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -87,4 +87,9 @@ public class RemoveSpriteActionItem extends ActionItem {
int hash = 3;
return hash;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -120,4 +120,9 @@ public class ReturnActionItem extends ActionItem implements ExitItem {
int hash = 3;
return hash;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -91,4 +91,8 @@ public class SetTarget2ActionItem extends ActionItem {
return true;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -81,4 +81,8 @@ public class SetTargetActionItem extends ActionItem {
return true;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -167,4 +167,8 @@ public class StartDragActionItem extends ActionItem {
return true;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -71,4 +71,9 @@ public class StopActionItem extends ActionItem {
int hash = 3;
return hash;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -71,4 +71,9 @@ public class StopAllSoundsActionItem extends ActionItem {
int hash = 3;
return hash;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -71,4 +71,9 @@ public class StopDragActionItem extends ActionItem {
int hash = 3;
return hash;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -162,4 +162,8 @@ public class StoreRegisterActionItem extends ActionItem implements SetTypeAction
return true;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -65,4 +65,9 @@ public class StrictModeActionItem extends ActionItem {
int hash = 3;
return hash;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -87,4 +87,9 @@ public class TargetPathActionItem extends ActionItem {
int hash = 3;
return hash;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -84,4 +84,9 @@ public class ThrowActionItem extends ActionItem {
int hash = 3;
return hash;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -71,4 +71,9 @@ public class ToggleHighQualityActionItem extends ActionItem {
int hash = 3;
return hash;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -87,4 +87,9 @@ public class TraceActionItem extends ActionItem {
int hash = 3;
return hash;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -91,4 +91,8 @@ public class UnLoadMovieActionItem extends ActionItem {
return true;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -100,4 +100,8 @@ public class UnLoadMovieNumActionItem extends ActionItem {
return true;
}
@Override
public boolean hasSideEffect() {
return true;
}
}

View File

@@ -70,4 +70,8 @@ public class UnsupportedActionItem extends ActionItem {
return true;
}
@Override
public boolean hasSideEffect() {
return true; //??
}
}