AS3 parser - namespaces, :: operator, etc.

This commit is contained in:
Jindra Pet��k
2014-03-30 16:17:29 +02:00
parent dcab44bb34
commit e8b3217b37
119 changed files with 2946 additions and 2290 deletions
@@ -18,7 +18,9 @@ package com.jpexs.decompiler.flash.abc.avm2.model;
import com.jpexs.decompiler.flash.SourceGeneratorLocalData;
import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction;
import com.jpexs.decompiler.flash.abc.avm2.instructions.InstructionDefinition;
import com.jpexs.decompiler.flash.abc.avm2.instructions.stack.PopIns;
import com.jpexs.decompiler.flash.abc.avm2.parser.script.AVM2SourceGenerator;
import com.jpexs.decompiler.flash.configuration.Configuration;
import com.jpexs.decompiler.flash.helpers.GraphTextWriter;
import com.jpexs.decompiler.graph.GraphSourceItem;
@@ -96,19 +98,31 @@ public abstract class AVM2Item extends GraphTargetItem {
}
/*@Override
public boolean hasReturnValue() {
return false;
}*/
public boolean hasReturnValue() {
return false;
}*/
@Override
public List<GraphSourceItem> toSourceIgnoreReturnValue(SourceGeneratorLocalData localData, SourceGenerator generator) {
if(!hasReturnValue()){
if (!hasReturnValue()) {
return toSource(localData, generator);
}
List<GraphSourceItem> ret=toSource(localData, generator);
List<GraphSourceItem> ret = toSource(localData, generator);
ret.add(new AVM2Instruction(0, new PopIns(), new int[]{}, new byte[0]));
return ret;
}
protected AVM2Instruction ins(InstructionDefinition def, int... operands) {
return new AVM2Instruction(0, def, operands, new byte[0]);
}
protected int getFreeRegister(SourceGeneratorLocalData localData, SourceGenerator generator) {
AVM2SourceGenerator g = (AVM2SourceGenerator) generator;
return g.getFreeRegister(localData);
}
protected void killRegister(SourceGeneratorLocalData localData, SourceGenerator generator, int regNumber) {
AVM2SourceGenerator g = (AVM2SourceGenerator) generator;
g.killRegister(localData, regNumber);
}
}
@@ -43,12 +43,12 @@ public class AlchemyLoadAVM2Item extends AVM2Item {
ofs.toString(writer, localData);
return writer.append(") /*Alchemy*/");
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
@Override
public boolean hasReturnValue() {
return true;
@@ -42,12 +42,12 @@ public class AlchemySignExtendAVM2Item extends AVM2Item {
value.toString(writer, localData);
return writer.append(") /*Alchemy*/");
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
}
@Override
public boolean hasReturnValue() {
return true;
@@ -46,12 +46,12 @@ public class AlchemyStoreAVM2Item extends AVM2Item {
value.toString(writer, localData);
return writer.append(") /*Alchemy*/");
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
}
@Override
public boolean hasReturnValue() {
return false;
@@ -54,12 +54,12 @@ public class ApplyTypeAVM2Item extends AVM2Item {
}
return writer;
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
}
@Override
public boolean hasReturnValue() {
return true;
@@ -52,19 +52,19 @@ public class BooleanAVM2Item extends AVM2Item {
public boolean isCompileTime(Set<GraphTargetItem> dependencies) {
return true;
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
return toSourceMerge(localData, generator,
new AVM2Instruction(0, value?new PushTrueIns():new PushFalseIns(), new int[]{}, new byte[0])
return toSourceMerge(localData, generator,
new AVM2Instruction(0, value ? new PushTrueIns() : new PushFalseIns(), new int[]{}, new byte[0])
);
}
@Override
public GraphTargetItem returnType() {
return TypeItem.BOOLEAN;
}
@Override
public boolean hasReturnValue() {
return true;
@@ -62,12 +62,12 @@ public class CallAVM2Item extends AVM2Item {
}
return writer.append(")");
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
}
@Override
public boolean hasReturnValue() {
return true;
@@ -51,11 +51,12 @@ public class CallMethodAVM2Item extends AVM2Item {
}
return writer.append(")");
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED; //FIXME
}
@Override
public boolean hasReturnValue() {
return true;
@@ -56,20 +56,19 @@ public class CallPropertyAVM2Item extends AVM2Item {
}
return writer.append(")");
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
return toSourceMerge(localData, generator, receiver, arguments,
new AVM2Instruction(0, new CallPropertyIns(), new int[]{((AVM2SourceGenerator)generator).propertyName(propertyName),arguments.size()}, new byte[0])
return toSourceMerge(localData, generator, receiver, arguments,
new AVM2Instruction(0, new CallPropertyIns(), new int[]{((AVM2SourceGenerator) generator).propertyName(propertyName), arguments.size()}, new byte[0])
);
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
@Override
public boolean hasReturnValue() {
return true;
@@ -51,12 +51,12 @@ public class CallStaticAVM2Item extends AVM2Item {
}
return writer.append(")");
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
@Override
public boolean hasReturnValue() {
return true;
@@ -56,12 +56,12 @@ public class CallSuperAVM2Item extends AVM2Item {
}
return writer.append(")");
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
@Override
public boolean hasReturnValue() {
return false;
@@ -35,12 +35,12 @@ public class ClassAVM2Item extends AVM2Item {
public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) {
return writer.append(className.getName(localData.constantsAvm2, localData.fullyQualifiedNames));
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
@Override
public boolean hasReturnValue() {
return false;
@@ -104,9 +104,8 @@ public class CoerceAVM2Item extends AVM2Item {
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
/*if (value.returnType().toString().equals(type)) {
return toSourceMerge(localData, generator, value);
}*/
return toSourceMerge(localData, generator, value);
}*/
AVM2Instruction ins;
switch (type) {
case "*":
@@ -51,12 +51,12 @@ public class ConstructAVM2Item extends AVM2Item {
}
return writer.append(")");
}
@Override
public GraphTargetItem returnType() {
return object.returnType();
}
@Override
public boolean hasReturnValue() {
return true;
@@ -55,12 +55,12 @@ public class ConstructPropAVM2Item extends AVM2Item {
}
return writer.append(")");
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
@Override
public boolean hasReturnValue() {
return true;
@@ -54,12 +54,12 @@ public class ConstructSuperAVM2Item extends AVM2Item {
}
return writer.append(")");
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
@Override
public boolean hasReturnValue() {
return false;
@@ -71,6 +71,5 @@ public class ConstructSuperAVM2Item extends AVM2Item {
new AVM2Instruction(0, new ConstructSuperIns(), new int[]{args.size()}, new byte[0])
);
}
}
@@ -73,12 +73,12 @@ public class ConvertAVM2Item extends AVM2Item {
dependencies.add(value);
return value.isCompileTime(dependencies);
}
@Override
public GraphTargetItem returnType() {
return new TypeItem(type);
}
@Override
public boolean hasReturnValue() {
return true;
@@ -36,12 +36,12 @@ public class DecLocalAVM2Item extends AVM2Item {
writer.append(localRegName(localData.localRegNames, regIndex));
return writer.append("--");
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
@Override
public boolean hasReturnValue() {
return false;
@@ -50,12 +50,12 @@ public class DecrementAVM2Item extends AVM2Item {
public Object getResult() {
return EcmaScript.toNumber(value.getResult()) - 1;
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
@Override
public boolean hasReturnValue() {
return true;
@@ -40,12 +40,12 @@ public class DefaultXMLNamespace extends AVM2Item {
writer.append("default xml namespace = ");
return ns.toString(writer, localData);
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
@Override
public boolean hasReturnValue() {
return false;
@@ -39,12 +39,12 @@ public class EscapeXAttrAVM2Item extends AVM2Item {
value.toString(writer, localData);
return writer.append("}");
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
@Override
public boolean hasReturnValue() {
return true;
@@ -41,12 +41,12 @@ public class EscapeXElemAVM2Item extends AVM2Item {
expression.toString(writer, localData);
return writer.append("}");
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
@Override
public boolean hasReturnValue() {
return true;
@@ -39,12 +39,12 @@ public class FilteredCheckAVM2Item extends AVM2Item {
public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException {
return object.toString(writer, localData);
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
}
@Override
public boolean hasReturnValue() {
return true;
@@ -36,12 +36,12 @@ public class FindDefAVM2Item extends AVM2Item {
public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) {
return writer.append(propertyName.getNamespace(localData.constantsAvm2).getName(localData.constantsAvm2));
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
}
@Override
public boolean hasReturnValue() {
return true;
@@ -35,12 +35,12 @@ public class FindPropertyAVM2Item extends AVM2Item {
public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) {
return writer;
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
}
@Override
public boolean hasReturnValue() {
return true;
@@ -52,19 +52,19 @@ public class FloatValueAVM2Item extends NumberValueAVM2Item {
public boolean isCompileTime(Set<GraphTargetItem> dependencies) {
return true;
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
return toSourceMerge(localData, generator,
new AVM2Instruction(0, new PushDoubleIns(), new int[]{((AVM2SourceGenerator)generator).abc.constants.getDoubleId(value, true)}, new byte[0])
return toSourceMerge(localData, generator,
new AVM2Instruction(0, new PushDoubleIns(), new int[]{((AVM2SourceGenerator) generator).abc.constants.getDoubleId(value, true)}, new byte[0])
);
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
}
@Override
public boolean hasReturnValue() {
return true;
@@ -154,12 +154,12 @@ public class FullMultinameAVM2Item extends AVM2Item {
}
return true;
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
}
@Override
public boolean hasReturnValue() {
return true;
@@ -39,12 +39,12 @@ public class GetDescendantsAVM2Item extends AVM2Item {
writer.append("..");
return multiname.toString(writer, localData);
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
}
@Override
public boolean hasReturnValue() {
return true;
@@ -36,12 +36,12 @@ public class GetLexAVM2Item extends AVM2Item {
public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) {
return writer.append(propertyName.getName(localData.constantsAvm2, localData.fullyQualifiedNames));
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
}
@Override
public boolean hasReturnValue() {
return true;
@@ -43,19 +43,19 @@ public class GetPropertyAVM2Item extends AVM2Item {
public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException {
return formatProperty(writer, object, propertyName, localData);
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
return toSourceMerge(localData, generator, object,
new AVM2Instruction(0, new GetPropertyIns(), new int[]{((AVM2SourceGenerator)generator).propertyName(propertyName)}, new byte[0])
return toSourceMerge(localData, generator, object,
new AVM2Instruction(0, new GetPropertyIns(), new int[]{((AVM2SourceGenerator) generator).propertyName(propertyName)}, new byte[0])
);
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
}
@Override
public boolean hasReturnValue() {
return true;
@@ -41,12 +41,12 @@ public class GetSlotAVM2Item extends AVM2Item {
}
return writer.append(slotName.getName(localData.constantsAvm2, localData.fullyQualifiedNames));
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
}
@Override
public boolean hasReturnValue() {
return true;
@@ -45,12 +45,12 @@ public class GetSuperAVM2Item extends AVM2Item {
writer.append("super.");
return propertyName.toString(writer, localData);
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
}
@Override
public boolean hasReturnValue() {
return true;
@@ -43,12 +43,12 @@ public class HasNextAVM2Item extends AVM2Item {
writer.append(" hasNext ");
return object.toString(writer, localData);
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
}
@Override
public boolean hasReturnValue() {
return true;
@@ -39,12 +39,12 @@ public class InAVM2Item extends AVM2Item {
writer.append(" in ");
return collection.toString(writer, localData);
}
@Override
public GraphTargetItem returnType() {
return TypeItem.BOOLEAN;
}
}
@Override
public boolean hasReturnValue() {
return true;
@@ -36,12 +36,12 @@ public class IncLocalAVM2Item extends AVM2Item {
writer.append(localRegName(localData.localRegNames, regIndex));
return writer.append("++");
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
}
@Override
public boolean hasReturnValue() {
return false;
@@ -50,12 +50,12 @@ public class IncrementAVM2Item extends AVM2Item {
public Object getResult() {
return EcmaScript.toNumber(value.getResult()) + 1;
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
}
@Override
public boolean hasReturnValue() {
return true;
@@ -52,12 +52,12 @@ public class InitPropertyAVM2Item extends AVM2Item implements SetTypeAVM2Item, A
public GraphTargetItem getValue() {
return value;
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
}
@Override
public boolean hasReturnValue() {
return false;
@@ -63,17 +63,17 @@ public class IntegerValueAVM2Item extends NumberValueAVM2Item {
} else if (value >= 0 && value <= 65535) {
ins = new AVM2Instruction(0, new PushShortIns(), new int[]{(int) (long) value}, new byte[0]);
} else {
ins = new AVM2Instruction(0, new PushIntIns(), new int[]{((AVM2SourceGenerator)generator).abc.constants.getIntId(value, true)}, new byte[0]);
ins = new AVM2Instruction(0, new PushIntIns(), new int[]{((AVM2SourceGenerator) generator).abc.constants.getIntId(value, true)}, new byte[0]);
}
return toSourceMerge(localData, generator, ins);
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
}
@Override
public boolean hasReturnValue() {
return true;
@@ -86,35 +86,35 @@ public class LocalRegAVM2Item extends AVM2Item {
public boolean isCompileTime(Set<GraphTargetItem> dependencies) {
return isCT;
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
AVM2Instruction ins;
switch(regIndex){
case 0:
ins = new AVM2Instruction(0, new GetLocal0Ins(), new int[]{},new byte[0]);
switch (regIndex) {
case 0:
ins = new AVM2Instruction(0, new GetLocal0Ins(), new int[]{}, new byte[0]);
break;
case 1:
ins = new AVM2Instruction(0, new GetLocal1Ins(), new int[]{},new byte[0]);
case 1:
ins = new AVM2Instruction(0, new GetLocal1Ins(), new int[]{}, new byte[0]);
break;
case 2:
ins = new AVM2Instruction(0, new GetLocal2Ins(), new int[]{},new byte[0]);
case 2:
ins = new AVM2Instruction(0, new GetLocal2Ins(), new int[]{}, new byte[0]);
break;
case 3:
ins = new AVM2Instruction(0, new GetLocal3Ins(), new int[]{},new byte[0]);
case 3:
ins = new AVM2Instruction(0, new GetLocal3Ins(), new int[]{}, new byte[0]);
break;
default:
ins = new AVM2Instruction(0, new GetLocalIns(), new int[]{regIndex},new byte[0]);
ins = new AVM2Instruction(0, new GetLocalIns(), new int[]{regIndex}, new byte[0]);
break;
}
return toSourceMerge(localData, generator, ins);
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
}
@Override
public boolean hasReturnValue() {
return true;
@@ -36,16 +36,16 @@ public class NameSpaceAVM2Item extends AVM2Item {
public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) {
if (namespaceIndex == 0) {
return writer.append("*");
}
}
ConstantPool constants = localData.constantsAvm2;
return writer.append(constants.getNamespace(namespaceIndex).toString(constants));
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
}
@Override
public boolean hasReturnValue() {
return true;
@@ -46,12 +46,12 @@ public class NameValuePair extends AVM2Item {
}
return writer;
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
}
@Override
public boolean hasReturnValue() {
return true;
@@ -37,19 +37,19 @@ public class NanAVM2Item extends AVM2Item {
public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) {
return writer.append("NaN");
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
return toSourceMerge(localData, generator,
return toSourceMerge(localData, generator,
new AVM2Instruction(0, new PushNanIns(), new int[]{}, new byte[0])
);
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
}
@Override
public boolean hasReturnValue() {
return true;
@@ -35,12 +35,12 @@ public class NewActivationAVM2Item extends AVM2Item {
public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) {
return writer.append("newactivation()");
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
}
@Override
public boolean hasReturnValue() {
return true;
@@ -47,12 +47,12 @@ public class NewArrayAVM2Item extends AVM2Item {
}
return writer.append("]");
}
@Override
public GraphTargetItem returnType() {
return TypeItem.ARRAY;
}
@Override
public boolean hasReturnValue() {
return true;
@@ -62,8 +62,7 @@ public class NewArrayAVM2Item extends AVM2Item {
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
return toSourceMerge(localData, generator, values,
new AVM2Instruction(0, new NewArrayIns(), new int[]{values.size()}, new byte[0])
);
);
}
}
@@ -79,12 +79,12 @@ public class NewFunctionAVM2Item extends AVM2Item {
writer.append("}");
return writer;
}
@Override
public GraphTargetItem returnType() {
return new TypeItem("Function");
}
@Override
public boolean hasReturnValue() {
return true;
@@ -65,12 +65,12 @@ public class NewObjectAVM2Item extends AVM2Item {
}
return writer;
}
@Override
public GraphTargetItem returnType() {
return new TypeItem("Object");
}
@Override
public boolean hasReturnValue() {
return true;
@@ -78,15 +78,14 @@ public class NewObjectAVM2Item extends AVM2Item {
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
List<GraphTargetItem> args=new ArrayList<>();
for(NameValuePair p:pairs){
List<GraphTargetItem> args = new ArrayList<>();
for (NameValuePair p : pairs) {
args.add(p.name);
args.add(p.value);
}
return toSourceMerge(localData, generator, args,
new AVM2Instruction(0, new NewObjectIns(), new int[]{pairs.size()}, new byte[0])
);
);
}
}
@@ -47,12 +47,12 @@ public class NextNameAVM2Item extends AVM2Item {
obj.toString(writer, localData);
return writer.append(")");
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
@Override
public boolean hasReturnValue() {
return true;
@@ -47,12 +47,12 @@ public class NextValueAVM2Item extends AVM2Item {
obj.toString(writer, localData);
return writer.append(")");
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
}
@Override
public boolean hasReturnValue() {
return true;
@@ -49,19 +49,19 @@ public class NullAVM2Item extends AVM2Item {
public Object getResult() {
return new Null();
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
return toSourceMerge(localData, generator,
return toSourceMerge(localData, generator,
new AVM2Instruction(0, new PushNullIns(), new int[]{}, new byte[0])
);
}
@Override
public GraphTargetItem returnType() {
return new TypeItem("null");
}
@Override
public boolean hasReturnValue() {
return true;
@@ -16,11 +16,19 @@
*/
package com.jpexs.decompiler.flash.abc.avm2.model;
import com.jpexs.decompiler.flash.SourceGeneratorLocalData;
import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction;
import com.jpexs.decompiler.flash.abc.avm2.instructions.arithmetic.DecrementIns;
import com.jpexs.decompiler.flash.abc.avm2.instructions.arithmetic.IncrementIns;
import com.jpexs.decompiler.flash.abc.avm2.model.clauses.AssignmentAVM2Item;
import com.jpexs.decompiler.flash.abc.avm2.parser.script.AssignableAVM2Item;
import com.jpexs.decompiler.flash.helpers.GraphTextWriter;
import com.jpexs.decompiler.graph.GraphSourceItem;
import com.jpexs.decompiler.graph.GraphTargetItem;
import com.jpexs.decompiler.graph.SourceGenerator;
import com.jpexs.decompiler.graph.model.LocalData;
import java.util.ArrayList;
import java.util.List;
public class PostDecrementAVM2Item extends AVM2Item implements AssignmentAVM2Item {
@@ -41,14 +49,34 @@ public class PostDecrementAVM2Item extends AVM2Item implements AssignmentAVM2Ite
public boolean hasSideEffect() {
return true;
}
@Override
public GraphTargetItem returnType() {
return object.returnType();
}
@Override
public boolean hasReturnValue() {
return true;
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
if (object instanceof AssignableAVM2Item) {
return ((AssignableAVM2Item) object).toSourceChange(localData, generator, null, toSourceMerge(localData, generator,
new AVM2Instruction(0, new DecrementIns(), new int[]{}, new byte[0])
), true);
}
return new ArrayList<>(); //?
}
@Override
public List<GraphSourceItem> toSourceIgnoreReturnValue(SourceGeneratorLocalData localData, SourceGenerator generator) {
if (object instanceof AssignableAVM2Item) {
return ((AssignableAVM2Item) object).toSourceChange(localData, generator, null, toSourceMerge(localData, generator,
new AVM2Instruction(0, new DecrementIns(), new int[]{}, new byte[0])
), false);
}
return new ArrayList<>(); //?
}
}
@@ -28,6 +28,7 @@ import com.jpexs.decompiler.flash.abc.avm2.instructions.other.SetPropertyIns;
import com.jpexs.decompiler.flash.abc.avm2.instructions.stack.DupIns;
import com.jpexs.decompiler.flash.abc.avm2.model.clauses.AssignmentAVM2Item;
import com.jpexs.decompiler.flash.abc.avm2.parser.script.AVM2SourceGenerator;
import com.jpexs.decompiler.flash.abc.avm2.parser.script.AssignableAVM2Item;
import com.jpexs.decompiler.flash.abc.avm2.parser.script.NameAVM2Item;
import com.jpexs.decompiler.flash.abc.avm2.parser.script.PropertyAVM2Item;
import com.jpexs.decompiler.flash.helpers.GraphTextWriter;
@@ -70,52 +71,22 @@ public class PostIncrementAVM2Item extends AVM2Item implements AssignmentAVM2Ite
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
AVM2SourceGenerator g = (AVM2SourceGenerator) generator;
int objectTempReg = g.getFreeRegister(localData);
if (object instanceof PropertyAVM2Item) {
PropertyAVM2Item p = (PropertyAVM2Item) object;
int propertyId = p.resolveProperty();
Object obj = p.object;
GraphTargetItem index = p.index;
if (obj == null) {
obj = new AVM2Instruction(0, new FindPropertyStrictIns(), new int[]{propertyId}, new byte[0]);
}
List<GraphSourceItem> ret = toSourceMerge(localData, generator, obj,
new AVM2Instruction(0, new DupIns(), new int[]{}, new byte[0]),
new AVM2Instruction(0, new SetLocalIns(), new int[]{objectTempReg}, new byte[0])
);
int indexTempReg = 0;
if (index != null) {
indexTempReg = g.getFreeRegister(localData);
ret.addAll(toSourceMerge(localData, generator, index,
new AVM2Instruction(0, new DupIns(), new int[]{}, new byte[0]),
new AVM2Instruction(0, new SetLocalIns(), new int[]{indexTempReg}, new byte[0])
));
}
ret.addAll(toSourceMerge(localData, generator,
new AVM2Instruction(0, new GetPropertyIns(), new int[]{}, new byte[0]),
new AVM2Instruction(0, new DupIns(), new int[]{}, new byte[0]),
new AVM2Instruction(0, new IncrementIns(), new int[]{}, new byte[0]),
new AVM2Instruction(0, new GetLocalIns(), new int[]{objectTempReg}, new byte[0])
));
if (index != null) {
ret.add(new AVM2Instruction(0, new GetLocalIns(), new int[]{indexTempReg}, new byte[0]));
}
ret.add(new AVM2Instruction(0, new SetPropertyIns(), new int[]{propertyId}, new byte[0]));
ret.add(new AVM2Instruction(0, new KillIns(), new int[]{objectTempReg}, new byte[0]));
if (index != null) {
ret.add(new AVM2Instruction(0, new KillIns(), new int[]{indexTempReg}, new byte[0]));
}
return ret;
if (object instanceof AssignableAVM2Item) {
return ((AssignableAVM2Item) object).toSourceChange(localData, generator, null, toSourceMerge(localData, generator,
new AVM2Instruction(0, new IncrementIns(), new int[]{}, new byte[0])
), true);
}
if(object instanceof NameAVM2Item){
//TODO
return new ArrayList<>(); //?
}
@Override
public List<GraphSourceItem> toSourceIgnoreReturnValue(SourceGeneratorLocalData localData, SourceGenerator generator) {
if (object instanceof AssignableAVM2Item) {
return ((AssignableAVM2Item) object).toSourceChange(localData, generator, null, toSourceMerge(localData, generator,
new AVM2Instruction(0, new IncrementIns(), new int[]{}, new byte[0])
), false);
}
return toSourceMerge(localData, generator, object);
return new ArrayList<>(); //?
}
}
@@ -41,19 +41,19 @@ public class ReturnValueAVM2Item extends AVM2Item implements ExitItem {
writer.append("return ");
return value.toString(writer, localData);
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
return toSourceMerge(localData, generator, value,
return toSourceMerge(localData, generator, value,
new AVM2Instruction(0, new ReturnValueIns(), new int[]{}, new byte[0])
);
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
}
@Override
public boolean hasReturnValue() {
return false;
@@ -38,18 +38,18 @@ public class ReturnVoidAVM2Item extends AVM2Item implements ExitItem {
public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) {
return writer.append("return");
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
return toSourceMerge(localData, generator, new AVM2Instruction(0, new ReturnVoidIns(), new int[]{}, new byte[0])
);
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
}
@Override
public boolean hasReturnValue() {
return false;
@@ -38,12 +38,12 @@ public class ScriptAVM2Item extends AVM2Item {
public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) {
return writer.append("script" + scriptIndex);
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
}
@Override
public boolean hasReturnValue() {
return false;
@@ -53,12 +53,12 @@ public class SetGlobalSlotAVM2Item extends AVM2Item {
public boolean hasSideEffect() {
return true;
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
}
@Override
public boolean hasReturnValue() {
return false;
@@ -64,62 +64,59 @@ public class SetLocalAVM2Item extends AVM2Item implements SetTypeAVM2Item, Assig
public boolean hasSideEffect() {
return true;
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
AVM2Instruction ins;
switch(regIndex){
case 0:
ins = new AVM2Instruction(0, new SetLocal0Ins(), new int[]{},new byte[0]);
switch (regIndex) {
case 0:
ins = new AVM2Instruction(0, new SetLocal0Ins(), new int[]{}, new byte[0]);
break;
case 1:
ins = new AVM2Instruction(0, new SetLocal1Ins(), new int[]{},new byte[0]);
case 1:
ins = new AVM2Instruction(0, new SetLocal1Ins(), new int[]{}, new byte[0]);
break;
case 2:
ins = new AVM2Instruction(0, new SetLocal2Ins(), new int[]{},new byte[0]);
case 2:
ins = new AVM2Instruction(0, new SetLocal2Ins(), new int[]{}, new byte[0]);
break;
case 3:
ins = new AVM2Instruction(0, new SetLocal3Ins(), new int[]{},new byte[0]);
case 3:
ins = new AVM2Instruction(0, new SetLocal3Ins(), new int[]{}, new byte[0]);
break;
default:
ins = new AVM2Instruction(0, new SetLocalIns(), new int[]{regIndex},new byte[0]);
ins = new AVM2Instruction(0, new SetLocalIns(), new int[]{regIndex}, new byte[0]);
break;
}
return toSourceMerge(localData, generator, value,
new AVM2Instruction(0, new DupIns(), new int[]{},new byte[0])
,ins);
return toSourceMerge(localData, generator, value,
new AVM2Instruction(0, new DupIns(), new int[]{}, new byte[0]), ins);
}
@Override
public List<GraphSourceItem> toSourceIgnoreReturnValue(SourceGeneratorLocalData localData, SourceGenerator generator) {
AVM2Instruction ins;
switch(regIndex){
case 0:
ins = new AVM2Instruction(0, new SetLocal0Ins(), new int[]{},new byte[0]);
switch (regIndex) {
case 0:
ins = new AVM2Instruction(0, new SetLocal0Ins(), new int[]{}, new byte[0]);
break;
case 1:
ins = new AVM2Instruction(0, new SetLocal1Ins(), new int[]{},new byte[0]);
case 1:
ins = new AVM2Instruction(0, new SetLocal1Ins(), new int[]{}, new byte[0]);
break;
case 2:
ins = new AVM2Instruction(0, new SetLocal2Ins(), new int[]{},new byte[0]);
case 2:
ins = new AVM2Instruction(0, new SetLocal2Ins(), new int[]{}, new byte[0]);
break;
case 3:
ins = new AVM2Instruction(0, new SetLocal3Ins(), new int[]{},new byte[0]);
case 3:
ins = new AVM2Instruction(0, new SetLocal3Ins(), new int[]{}, new byte[0]);
break;
default:
ins = new AVM2Instruction(0, new SetLocalIns(), new int[]{regIndex},new byte[0]);
ins = new AVM2Instruction(0, new SetLocalIns(), new int[]{regIndex}, new byte[0]);
break;
}
return toSourceMerge(localData, generator, value, ins);
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
}
@Override
public boolean hasReturnValue() {
return false;
@@ -69,18 +69,19 @@ public class SetPropertyAVM2Item extends AVM2Item implements SetTypeAVM2Item, As
public boolean hasSideEffect() {
return true;
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
return toSourceMerge(localData, generator, object, value,
new AVM2Instruction(0, new SetPropertyIns(), new int[]{((AVM2SourceGenerator)generator).propertyName(propertyName)}, new byte[0])
return toSourceMerge(localData, generator, object, value,
new AVM2Instruction(0, new SetPropertyIns(), new int[]{((AVM2SourceGenerator) generator).propertyName(propertyName)}, new byte[0])
);
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
}
@Override
public boolean hasReturnValue() {
return false;
@@ -82,12 +82,12 @@ public class SetSlotAVM2Item extends AVM2Item implements SetTypeAVM2Item, Assign
public boolean hasSideEffect() {
return true;
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
}
@Override
public boolean hasReturnValue() {
return false;
@@ -57,12 +57,12 @@ public class SetSuperAVM2Item extends AVM2Item {
public boolean hasSideEffect() {
return true;
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
}
@Override
public boolean hasReturnValue() {
return false;
@@ -53,18 +53,19 @@ public class StringAVM2Item extends AVM2Item {
public Object getResult() {
return value;
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
return toSourceMerge(localData, generator,
new AVM2Instruction(0, new PushStringIns(), new int[]{((AVM2SourceGenerator)generator).str(value)}, new byte[0])
return toSourceMerge(localData, generator,
new AVM2Instruction(0, new PushStringIns(), new int[]{((AVM2SourceGenerator) generator).str(value)}, new byte[0])
);
}
@Override
public GraphTargetItem returnType() {
return TypeItem.STRING;
}
}
@Override
public boolean hasReturnValue() {
return true;
@@ -46,18 +46,18 @@ public class ThisAVM2Item extends AVM2Item {
public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) {
return writer.append("this");
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
return toSourceMerge(localData, generator, new AVM2Instruction(0, new GetLocal0Ins(), new int[]{}, new byte[0])
);
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
}
@Override
public boolean hasReturnValue() {
return true;
@@ -35,12 +35,12 @@ public class ThrowAVM2Item extends AVM2Item {
writer.append("throw ");
return value.toString(writer, localData);
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
}
@Override
public boolean hasReturnValue() {
return false;
@@ -50,20 +50,20 @@ public class UndefinedAVM2Item extends AVM2Item {
public Object getResult() {
return new Undefined();
}
@Override
public GraphTargetItem returnType() {
return new TypeItem("Undefined");
}
}
@Override
public boolean hasReturnValue() {
return true;
}
@Override
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
return toSourceMerge(localData, generator,
return toSourceMerge(localData, generator,
new AVM2Instruction(0, new PushUndefinedIns(), new int[]{}, new byte[0])
);
}
@@ -35,12 +35,12 @@ public class UnparsedAVM2Item extends AVM2Item {
public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) {
return writer.append(value);
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
}
@Override
public boolean hasReturnValue() {
return false;
@@ -63,12 +63,12 @@ public class WithAVM2Item extends AVM2Item {
public boolean needsSemicolon() {
return false;
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
}
@Override
public boolean hasReturnValue() {
return false;
@@ -40,12 +40,12 @@ public class WithEndAVM2Item extends AVM2Item {
public boolean needsSemicolon() {
return false;
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
}
@Override
public boolean hasReturnValue() {
return false;
@@ -35,12 +35,12 @@ public class WithObjectAVM2Item extends AVM2Item {
public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) {
return writer;
}
@Override
public GraphTargetItem returnType() {
return TypeItem.UNBOUNDED;
}
}
@Override
public boolean hasReturnValue() {
return false;
@@ -47,12 +47,12 @@ public class XMLAVM2Item extends AVM2Item {
}
return writer;
}
@Override
public GraphTargetItem returnType() {
return new TypeItem("XML");
}
}
@Override
public boolean hasReturnValue() {
return true;
@@ -68,7 +68,7 @@ public class AddAVM2Item extends BinaryOpItem {
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
return toSourceMerge(localData, generator, leftSide, rightSide,
return toSourceMerge(localData, generator, leftSide, rightSide,
new AVM2Instruction(0, new AddIns(), new int[]{}, new byte[0])
);
}
@@ -77,6 +77,5 @@ public class AddAVM2Item extends BinaryOpItem {
public GraphTargetItem returnType() {
return new UnboundedTypeItem();
}
}
@@ -30,10 +30,10 @@ public class AsTypeAVM2Item extends BinaryOpItem {
public AsTypeAVM2Item(AVM2Instruction instruction, GraphTargetItem value, GraphTargetItem type) {
super(instruction, PRECEDENCE_RELATIONAL, value, type, "as");
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
return toSourceMerge(localData, generator, leftSide, rightSide,
return toSourceMerge(localData, generator, leftSide, rightSide,
new AVM2Instruction(0, new AsTypeIns(), new int[]{}, new byte[0])
);
}
@@ -42,6 +42,5 @@ public class AsTypeAVM2Item extends BinaryOpItem {
public GraphTargetItem returnType() {
return rightSide;
}
}
@@ -37,13 +37,14 @@ public class BitAndAVM2Item extends BinaryOpItem {
public Object getResult() {
return ((long) (double) EcmaScript.toNumber(leftSide.getResult())) & ((long) (double) EcmaScript.toNumber(rightSide.getResult()));
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
return toSourceMerge(localData, generator, leftSide, rightSide,
return toSourceMerge(localData, generator, leftSide, rightSide,
new AVM2Instruction(0, new BitAndIns(), new int[]{}, new byte[0])
);
}
@Override
public GraphTargetItem returnType() {
return new UnboundedTypeItem();
@@ -37,13 +37,14 @@ public class BitNotAVM2Item extends UnaryOpItem {
public Object getResult() {
return ~((long) (double) EcmaScript.toNumber(value.getResult()));
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
return toSourceMerge(localData, generator, value,
return toSourceMerge(localData, generator, value,
new AVM2Instruction(0, new BitNotIns(), new int[]{}, new byte[0])
);
}
@Override
public GraphTargetItem returnType() {
return new UnboundedTypeItem();
@@ -37,14 +37,14 @@ public class BitOrAVM2Item extends BinaryOpItem {
public Object getResult() {
return ((long) (double) EcmaScript.toNumber(leftSide.getResult())) | ((long) (double) EcmaScript.toNumber(rightSide.getResult()));
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
return toSourceMerge(localData, generator, leftSide, rightSide,
return toSourceMerge(localData, generator, leftSide, rightSide,
new AVM2Instruction(0, new BitOrIns(), new int[]{}, new byte[0])
);
}
@Override
public GraphTargetItem returnType() {
return new UnboundedTypeItem();
@@ -37,15 +37,14 @@ public class BitXorAVM2Item extends BinaryOpItem {
public Object getResult() {
return ((long) (double) EcmaScript.toNumber(leftSide.getResult())) ^ ((long) (double) EcmaScript.toNumber(rightSide.getResult()));
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
return toSourceMerge(localData, generator, leftSide, rightSide,
return toSourceMerge(localData, generator, leftSide, rightSide,
new AVM2Instruction(0, new BitXorIns(), new int[]{}, new byte[0])
);
}
@Override
public GraphTargetItem returnType() {
return new UnboundedTypeItem();
@@ -48,20 +48,19 @@ public class DeletePropertyAVM2Item extends AVM2Item {
propertyName.toString(writer, localData);
return writer.append("]");
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
return toSourceMerge(localData, generator, object,
new AVM2Instruction(0, new DeletePropertyIns(), new int[]{((AVM2SourceGenerator)generator).propertyName(propertyName)}, new byte[0])
return toSourceMerge(localData, generator, object,
new AVM2Instruction(0, new DeletePropertyIns(), new int[]{((AVM2SourceGenerator) generator).propertyName(propertyName)}, new byte[0])
);
}
@Override
public GraphTargetItem returnType() {
return new TypeItem("Boolean");
}
@Override
public boolean hasReturnValue() {
return true;
@@ -64,14 +64,14 @@ public class DivideAVM2Item extends BinaryOpItem {
return super.appendTo(writer, localData);
}
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
return toSourceMerge(localData, generator, leftSide, rightSide,
return toSourceMerge(localData, generator, leftSide, rightSide,
new AVM2Instruction(0, new DivideIns(), new int[]{}, new byte[0])
);
}
@Override
public GraphTargetItem returnType() {
return new UnboundedTypeItem();
@@ -43,14 +43,14 @@ public class EqAVM2Item extends BinaryOpItem implements LogicalOpItem {
public GraphTargetItem invert() {
return new NeqAVM2Item(src, leftSide, rightSide);
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
return toSourceMerge(localData, generator, leftSide, rightSide,
return toSourceMerge(localData, generator, leftSide, rightSide,
new AVM2Instruction(0, new EqualsIns(), new int[]{}, new byte[0])
);
}
@Override
public GraphTargetItem returnType() {
return new TypeItem("Boolean");
@@ -50,14 +50,14 @@ public class GeAVM2Item extends BinaryOpItem implements LogicalOpItem {
}
return ret;//undefined
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
return toSourceMerge(localData, generator, leftSide, rightSide,
return toSourceMerge(localData, generator, leftSide, rightSide,
new AVM2Instruction(0, new GreaterEqualsIns(), new int[]{}, new byte[0])
);
}
@Override
public GraphTargetItem returnType() {
return new TypeItem("Boolean");
@@ -43,14 +43,14 @@ public class GtAVM2Item extends BinaryOpItem implements LogicalOpItem {
public Object getResult() {
return EcmaScript.compare(rightSide.getResult(), leftSide.getResult());
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
return toSourceMerge(localData, generator, leftSide, rightSide,
return toSourceMerge(localData, generator, leftSide, rightSide,
new AVM2Instruction(0, new GreaterThanIns(), new int[]{}, new byte[0])
);
}
@Override
public GraphTargetItem returnType() {
return new TypeItem("Boolean");
@@ -31,14 +31,14 @@ public class InAVM2Item extends BinaryOpItem {
public InAVM2Item(AVM2Instruction instruction, GraphTargetItem name, GraphTargetItem object) {
super(instruction, PRECEDENCE_RELATIONAL, name, object, "in");
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
return toSourceMerge(localData, generator, leftSide, rightSide,
return toSourceMerge(localData, generator, leftSide, rightSide,
new AVM2Instruction(0, new InIns(), new int[]{}, new byte[0])
);
}
@Override
public GraphTargetItem returnType() {
return new TypeItem("Boolean");
@@ -31,14 +31,14 @@ public class InstanceOfAVM2Item extends BinaryOpItem {
public InstanceOfAVM2Item(AVM2Instruction instruction, GraphTargetItem value, GraphTargetItem type) {
super(instruction, PRECEDENCE_RELATIONAL, value, type, "instanceof");
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
return toSourceMerge(localData, generator, leftSide, rightSide,
return toSourceMerge(localData, generator, leftSide, rightSide,
new AVM2Instruction(0, new InstanceOfIns(), new int[]{}, new byte[0])
);
}
@Override
public GraphTargetItem returnType() {
return new TypeItem("Boolean");
@@ -31,14 +31,14 @@ public class IsTypeAVM2Item extends BinaryOpItem {
public IsTypeAVM2Item(AVM2Instruction instruction, GraphTargetItem value, GraphTargetItem type) {
super(instruction, PRECEDENCE_RELATIONAL, value, type, "is");
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
return toSourceMerge(localData, generator, leftSide, rightSide,
return toSourceMerge(localData, generator, leftSide, rightSide,
new AVM2Instruction(0, new IsTypeIns(), new int[]{}, new byte[0])
);
}
@Override
public GraphTargetItem returnType() {
return new TypeItem("Boolean");
@@ -37,17 +37,17 @@ public class LShiftAVM2Item extends BinaryOpItem {
public Object getResult() {
return ((int) (double) EcmaScript.toNumber(leftSide.getResult())) << ((int) (double) EcmaScript.toNumber(rightSide.getResult()));
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
return toSourceMerge(localData, generator, leftSide, rightSide,
return toSourceMerge(localData, generator, leftSide, rightSide,
new AVM2Instruction(0, new LShiftIns(), new int[]{}, new byte[0])
);
}
@Override
public GraphTargetItem returnType() {
return new UnboundedTypeItem();
}
}
@@ -50,14 +50,14 @@ public class LeAVM2Item extends BinaryOpItem implements LogicalOpItem {
}
return ret;//undefined
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
return toSourceMerge(localData, generator, leftSide, rightSide,
return toSourceMerge(localData, generator, leftSide, rightSide,
new AVM2Instruction(0, new LessEqualsIns(), new int[]{}, new byte[0])
);
}
@Override
public GraphTargetItem returnType() {
return new TypeItem("Boolean");
@@ -43,14 +43,14 @@ public class LtAVM2Item extends BinaryOpItem implements LogicalOpItem {
public Object getResult() {
return EcmaScript.compare(leftSide.getResult(), rightSide.getResult());
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
return toSourceMerge(localData, generator, leftSide, rightSide,
return toSourceMerge(localData, generator, leftSide, rightSide,
new AVM2Instruction(0, new LessThanIns(), new int[]{}, new byte[0])
);
}
@Override
public GraphTargetItem returnType() {
return new TypeItem("Boolean");
@@ -64,14 +64,14 @@ public class ModuloAVM2Item extends BinaryOpItem {
return super.appendTo(writer, localData);
}
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
return toSourceMerge(localData, generator, leftSide, rightSide,
return toSourceMerge(localData, generator, leftSide, rightSide,
new AVM2Instruction(0, new ModuloIns(), new int[]{}, new byte[0])
);
}
@Override
public GraphTargetItem returnType() {
return new UnboundedTypeItem();
@@ -61,14 +61,14 @@ public class MultiplyAVM2Item extends BinaryOpItem {
return super.appendTo(writer, localData);
}
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
return toSourceMerge(localData, generator, leftSide, rightSide,
return toSourceMerge(localData, generator, leftSide, rightSide,
new AVM2Instruction(0, new MultiplyIns(), new int[]{}, new byte[0])
);
}
@Override
public GraphTargetItem returnType() {
return new UnboundedTypeItem();
@@ -37,14 +37,14 @@ public class NegAVM2Item extends UnaryOpItem {
public Object getResult() {
return -EcmaScript.toNumber(value.getResult());
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
return toSourceMerge(localData, generator, value,
return toSourceMerge(localData, generator, value,
new AVM2Instruction(0, new NegateIns(), new int[]{}, new byte[0])
);
}
@Override
public GraphTargetItem returnType() {
return new UnboundedTypeItem();
@@ -44,15 +44,15 @@ public class NeqAVM2Item extends BinaryOpItem implements LogicalOpItem {
public GraphTargetItem invert() {
return new EqAVM2Item(src, leftSide, rightSide);
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
return toSourceMerge(localData, generator, leftSide, rightSide,
return toSourceMerge(localData, generator, leftSide, rightSide,
new AVM2Instruction(0, new EqualsIns(), new int[]{}, new byte[0]),
new AVM2Instruction(0, new NotIns(), new int[]{}, new byte[0])
);
}
@Override
public GraphTargetItem returnType() {
return new TypeItem("Boolean");
@@ -18,11 +18,15 @@ package com.jpexs.decompiler.flash.abc.avm2.model.operations;
import com.jpexs.decompiler.flash.SourceGeneratorLocalData;
import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction;
import com.jpexs.decompiler.flash.abc.avm2.instructions.arithmetic.DecrementIns;
import com.jpexs.decompiler.flash.abc.avm2.instructions.arithmetic.IncrementIns;
import com.jpexs.decompiler.flash.abc.avm2.model.clauses.AssignmentAVM2Item;
import com.jpexs.decompiler.flash.abc.avm2.parser.script.AssignableAVM2Item;
import com.jpexs.decompiler.graph.GraphSourceItem;
import com.jpexs.decompiler.graph.GraphTargetItem;
import com.jpexs.decompiler.graph.SourceGenerator;
import com.jpexs.decompiler.graph.model.UnaryOpItem;
import java.util.ArrayList;
import java.util.List;
public class PreDecrementAVM2Item extends UnaryOpItem implements AssignmentAVM2Item {
@@ -38,12 +42,27 @@ public class PreDecrementAVM2Item extends UnaryOpItem implements AssignmentAVM2I
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
return super.toSource(localData, generator); //TODO
if (value instanceof AssignableAVM2Item) {
return ((AssignableAVM2Item) value).toSourceChange(localData, generator, toSourceMerge(localData, generator,
new AVM2Instruction(0, new DecrementIns(), new int[]{}, new byte[0])
), null, true);
}
return new ArrayList<>(); //?
}
@Override
public List<GraphSourceItem> toSourceIgnoreReturnValue(SourceGeneratorLocalData localData, SourceGenerator generator) {
if (value instanceof AssignableAVM2Item) {
return ((AssignableAVM2Item) value).toSourceChange(localData, generator, toSourceMerge(localData, generator,
new AVM2Instruction(0, new DecrementIns(), new int[]{}, new byte[0])
), null, false);
}
return new ArrayList<>(); //?
}
@Override
public GraphTargetItem returnType() {
return value.returnType();
}
}
@@ -18,10 +18,13 @@ package com.jpexs.decompiler.flash.abc.avm2.model.operations;
import com.jpexs.decompiler.flash.SourceGeneratorLocalData;
import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction;
import com.jpexs.decompiler.flash.abc.avm2.instructions.arithmetic.IncrementIns;
import com.jpexs.decompiler.flash.abc.avm2.parser.script.AssignableAVM2Item;
import com.jpexs.decompiler.graph.GraphSourceItem;
import com.jpexs.decompiler.graph.GraphTargetItem;
import com.jpexs.decompiler.graph.SourceGenerator;
import com.jpexs.decompiler.graph.model.UnaryOpItem;
import java.util.ArrayList;
import java.util.List;
public class PreIncrementAVM2Item extends UnaryOpItem {
@@ -34,12 +37,27 @@ public class PreIncrementAVM2Item extends UnaryOpItem {
public boolean hasSideEffect() {
return true;
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
return super.toSource(localData, generator); //TODO
if (value instanceof AssignableAVM2Item) {
return ((AssignableAVM2Item) value).toSourceChange(localData, generator, toSourceMerge(localData, generator,
new AVM2Instruction(0, new IncrementIns(), new int[]{}, new byte[0])
), null, true);
}
return new ArrayList<>(); //?
}
@Override
public List<GraphSourceItem> toSourceIgnoreReturnValue(SourceGeneratorLocalData localData, SourceGenerator generator) {
if (value instanceof AssignableAVM2Item) {
return ((AssignableAVM2Item) value).toSourceChange(localData, generator, toSourceMerge(localData, generator,
new AVM2Instruction(0, new IncrementIns(), new int[]{}, new byte[0])
), null, false);
}
return new ArrayList<>(); //?
}
@Override
public GraphTargetItem returnType() {
return value.returnType();
@@ -37,14 +37,14 @@ public class RShiftAVM2Item extends BinaryOpItem {
public Object getResult() {
return ((long) (double) EcmaScript.toNumber(leftSide.getResult())) >> ((long) (double) EcmaScript.toNumber(rightSide.getResult()));
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
return toSourceMerge(localData, generator, leftSide, rightSide,
return toSourceMerge(localData, generator, leftSide, rightSide,
new AVM2Instruction(0, new RShiftIns(), new int[]{}, new byte[0])
);
}
@Override
public GraphTargetItem returnType() {
return new UnboundedTypeItem();
@@ -46,14 +46,14 @@ public class StrictEqAVM2Item extends BinaryOpItem implements LogicalOpItem {
public GraphTargetItem invert() {
return new StrictNeqAVM2Item(src, leftSide, rightSide);
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
return toSourceMerge(localData, generator, leftSide, rightSide,
return toSourceMerge(localData, generator, leftSide, rightSide,
new AVM2Instruction(0, new StrictEqualsIns(), new int[]{}, new byte[0])
);
}
@Override
public GraphTargetItem returnType() {
return new TypeItem("Boolean");
@@ -47,15 +47,15 @@ public class StrictNeqAVM2Item extends BinaryOpItem implements LogicalOpItem {
return EcmaScript.type(x) != EcmaScript.type(y)
|| (!EcmaScript.equals(x, y));
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
return toSourceMerge(localData, generator, leftSide, rightSide,
return toSourceMerge(localData, generator, leftSide, rightSide,
new AVM2Instruction(0, new StrictEqualsIns(), new int[]{}, new byte[0]),
new AVM2Instruction(0, new NotIns(), new int[]{}, new byte[0])
);
}
@Override
public GraphTargetItem returnType() {
return new TypeItem("Boolean");
@@ -61,14 +61,14 @@ public class SubtractAVM2Item extends BinaryOpItem {
return super.appendTo(writer, localData);
}
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
return toSourceMerge(localData, generator, leftSide, rightSide,
return toSourceMerge(localData, generator, leftSide, rightSide,
new AVM2Instruction(0, new SubtractIns(), new int[]{}, new byte[0])
);
}
@Override
public GraphTargetItem returnType() {
return new UnboundedTypeItem();
@@ -66,14 +66,14 @@ public class TypeOfAVM2Item extends UnaryOpItem {
//TODO: function,xml
return "object";
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
return toSourceMerge(localData, generator, value,
return toSourceMerge(localData, generator, value,
new AVM2Instruction(0, new TypeOfIns(), new int[]{}, new byte[0])
);
}
@Override
public GraphTargetItem returnType() {
return new UnboundedTypeItem();
@@ -37,14 +37,14 @@ public class URShiftAVM2Item extends BinaryOpItem {
public Object getResult() {
return ((long) (double) EcmaScript.toNumber(leftSide.getResult())) >>> ((long) (double) EcmaScript.toNumber(rightSide.getResult()));
}
@Override
public List<GraphSourceItem> toSource(SourceGeneratorLocalData localData, SourceGenerator generator) {
return toSourceMerge(localData, generator, leftSide, rightSide,
return toSourceMerge(localData, generator, leftSide, rightSide,
new AVM2Instruction(0, new URShiftIns(), new int[]{}, new byte[0])
);
}
@Override
public GraphTargetItem returnType() {
return new UnboundedTypeItem();
@@ -565,29 +565,26 @@ public class AVM2SourceGenerator implements SourceGenerator {
}
public void generateClass(int initScope, PackageAVM2Item pkg, ClassInfo classInfo, InstanceInfo instanceInfo, SourceGeneratorLocalData localData, boolean isInterface, String name, String superName, GraphTargetItem extendsVal, List<GraphTargetItem> implementsStr, GraphTargetItem constructor, List<GraphTargetItem> traitItems) throws ParseException {
localData.currentClass = pkg.packageName.equals("") ? name : pkg.packageName + "." + name;
List<GraphSourceItem> ret = new ArrayList<>();
if (extendsVal == null && !isInterface) {
extendsVal = new TypeItem("Object");
}
ParsedSymbol s = null;
Trait[] it = generateTraitsPhase1(pkg, name, superName, false, localData, traitItems, instanceInfo.instance_traits);
Trait[] st = generateTraitsPhase1(pkg, name, superName, true, localData, traitItems, classInfo.static_traits);
generateTraitsPhase2(initScope, pkg, name, superName, false, localData, traitItems, instanceInfo.instance_traits, it);
generateTraitsPhase2(initScope, pkg, name, superName, true, localData, traitItems, classInfo.static_traits, st);
if (constructor == null) {
instanceInfo.iinit_index = method(initScope+1, false, false, 0, name, extendsVal != null ? extendsVal.toString() : null, true, localData, new ArrayList<GraphTargetItem>(), new ArrayList<String>(), new ArrayList<GraphTargetItem>(), new ArrayList<GraphTargetItem>(), TypeItem.UNBOUNDED/*?? FIXME*/);
instanceInfo.iinit_index = method(initScope + 1, false, false, 0, name, extendsVal != null ? extendsVal.toString() : null, true, localData, new ArrayList<GraphTargetItem>(), new ArrayList<String>(), new ArrayList<GraphTargetItem>(), new ArrayList<GraphTargetItem>(), TypeItem.UNBOUNDED/*?? FIXME*/);
} else {
MethodAVM2Item m = (MethodAVM2Item) constructor;
Reference<Boolean> hasArgs = new Reference<>(Boolean.FALSE);
calcRegisters(localData, m, hasArgs);
instanceInfo.iinit_index = method(initScope+1, m.hasRest, hasArgs.getVal(), m.line, name, extendsVal != null ? extendsVal.toString() : null, true, localData, m.paramTypes, m.paramNames, m.paramValues, m.body, TypeItem.UNBOUNDED/*?? FIXME*/);
instanceInfo.iinit_index = method(initScope + 1, m.hasRest, hasArgs.getVal(), m.line, name, extendsVal != null ? extendsVal.toString() : null, true, localData, m.paramTypes, m.paramNames, m.paramValues, m.body, TypeItem.UNBOUNDED/*?? FIXME*/);
}
//Class initializer
MethodInfo mi = new MethodInfo(new int[0], 0, 0, 0, new ValueKind[0], new int[0]);
MethodBody mb = new MethodBody();
@@ -649,11 +646,11 @@ public class AVM2SourceGenerator implements SourceGenerator {
if (!cai.isDynamic) {
ii.flags |= InstanceInfo.CLASS_SEALED;
}
if(cai.isFinal){
if (cai.isFinal) {
ii.flags |= InstanceInfo.CLASS_FINAL;
}
ii.flags |= InstanceInfo.CLASS_PROTECTEDNS;
ii.protectedNS = abc.constants.getNamespaceId(new Namespace(Namespace.KIND_PROTECTED, abc.constants.getStringId(pkg.packageName.equals("")?cai.className:pkg.packageName+":"+cai.className, true)), 0, true);
ii.flags |= InstanceInfo.CLASS_PROTECTEDNS;
ii.protectedNS = abc.constants.getNamespaceId(new Namespace(Namespace.KIND_PROTECTED, abc.constants.getStringId(pkg.packageName + ":" + cai.className, true)), 0, true);
}
if (cls instanceof InterfaceAVM2Item) {
InterfaceAVM2Item iai = (InterfaceAVM2Item) cls;
@@ -665,7 +662,7 @@ public class AVM2SourceGenerator implements SourceGenerator {
}
public int traitName(String pkg, String className, int nsKind, String var) {
return abc.constants.getMultinameId(new Multiname(Multiname.QNAME, str(var), namespace(nsKind, nsKind == Namespace.KIND_PRIVATE && className != null ? ("".equals(pkg) ? className : pkg + ":" + className) : ""), 0, 0, new ArrayList<Integer>()), true);
return abc.constants.getMultinameId(new Multiname(Multiname.QNAME, str(var), namespace(nsKind, nsKind != Namespace.KIND_PACKAGE && className != null ? (pkg + ":" + className) : ""), 0, 0, new ArrayList<Integer>()), true);
}
public int typeName(SourceGeneratorLocalData localData, GraphTargetItem type) {
@@ -773,14 +770,16 @@ public class AVM2SourceGenerator implements SourceGenerator {
}
for (int i = 0; i < paramValues.size(); i++) {
optional[i] = getValueKind(paramTypes.get(paramTypes.size() - paramValues.size() + i), paramTypes.get(i));
optional[i] = getValueKind(Namespace.KIND_NAMESPACE/*FIXME*/, paramTypes.get(paramTypes.size() - paramValues.size() + i), paramTypes.get(i));
}
MethodInfo mi = new MethodInfo(param_types, constructor ? 0 : typeName(localData, retType), 0/*name_index*/, 0, optional, param_names);
if (hasArguments) {
mi.setFlagNeed_Arguments();
}
mi.setFlagHas_paramnames();
if (!paramNames.isEmpty()) {
mi.setFlagHas_paramnames();
}
if (!paramValues.isEmpty()) {
mi.setFlagHas_optional();
}
@@ -833,8 +832,8 @@ public class AVM2SourceGenerator implements SourceGenerator {
mbody.code.code.add(1, new AVM2Instruction(0, new PushScopeIns(), new int[]{}, new byte[0]));
InstructionDefinition lastDef = mbody.code.code.get(mbody.code.code.size() - 1).definition;
if (!(lastDef instanceof ReturnVoidIns) || (lastDef instanceof ReturnValueIns)) {
if (retType.equals("void") || constructor) {
if (!((lastDef instanceof ReturnVoidIns) || (lastDef instanceof ReturnValueIns))) {
if (retType.toString().equals("*") || retType.toString().equals("void") || constructor) {
mbody.code.code.add(new AVM2Instruction(0, new ReturnVoidIns(), new int[]{}, new byte[0]));
} else {
mbody.code.code.add(new AVM2Instruction(0, new PushUndefinedIns(), new int[]{}, new byte[0]));
@@ -848,7 +847,7 @@ public class AVM2SourceGenerator implements SourceGenerator {
return mbody.method_info;
}
public ValueKind getValueKind(GraphTargetItem type, GraphTargetItem val) {
public ValueKind getValueKind(int nsKind, GraphTargetItem type, GraphTargetItem val) {
if (val instanceof BooleanAVM2Item) {
BooleanAVM2Item bi = (BooleanAVM2Item) val;
@@ -865,10 +864,15 @@ public class AVM2SourceGenerator implements SourceGenerator {
isNs = true;
}
}
if ((type instanceof TypeItem) && (((TypeItem) type).fullTypeName.equals("Namespace"))) {
isNs = true;
}
if (val instanceof StringAVM2Item) {
StringAVM2Item sval = (StringAVM2Item) val;
if (isNs) {
return new ValueKind(namespace(Namespace.KIND_NAMESPACE, sval.value), ValueKind.CONSTANT_Namespace);
return new ValueKind(namespace(nsKind, sval.value), Namespace.KIND_NAMESPACE);
} else {
return new ValueKind(str(sval.value), ValueKind.CONSTANT_Utf8);
}
@@ -896,11 +900,11 @@ public class AVM2SourceGenerator implements SourceGenerator {
continue;
}
if (item instanceof InterfaceAVM2Item) {
generateClass(abc.class_info.get(((TraitClass) traits[k]).class_info),abc.instance_info.get(((TraitClass) traits[k]).class_info), initScope, pkg, localData, (InterfaceAVM2Item) item);
generateClass(abc.class_info.get(((TraitClass) traits[k]).class_info), abc.instance_info.get(((TraitClass) traits[k]).class_info), initScope, pkg, localData, (InterfaceAVM2Item) item);
}
if (item instanceof ClassAVM2Item) {
generateClass(abc.class_info.get(((TraitClass) traits[k]).class_info),abc.instance_info.get(((TraitClass) traits[k]).class_info) , initScope, pkg, localData, (ClassAVM2Item) item);
generateClass(abc.class_info.get(((TraitClass) traits[k]).class_info), abc.instance_info.get(((TraitClass) traits[k]).class_info), initScope, pkg, localData, (ClassAVM2Item) item);
}
if ((item instanceof MethodAVM2Item) || (item instanceof GetterAVM2Item) || (item instanceof SetterAVM2Item)) {
MethodAVM2Item mai = (MethodAVM2Item) item;
@@ -910,7 +914,7 @@ public class AVM2SourceGenerator implements SourceGenerator {
Reference<Boolean> hasArgs = new Reference<>(Boolean.FALSE);
calcRegisters(localData, mai, hasArgs);
((TraitMethodGetterSetter) traits[k]).method_info = method(initScope+1/*class scope*/, mai.hasRest, hasArgs.getVal(), mai.line, className, superName, false, localData, mai.paramTypes, mai.paramNames, mai.paramValues, mai.body, mai.retType);
((TraitMethodGetterSetter) traits[k]).method_info = method(initScope + 1/*class scope*/, mai.hasRest, hasArgs.getVal(), mai.line, className, superName, false, localData, mai.paramTypes, mai.paramNames, mai.paramValues, mai.body, mai.retType);
} else if (item instanceof FunctionAVM2Item) {
FunctionAVM2Item fai = (FunctionAVM2Item) item;
Reference<Boolean> hasArgs = new Reference<>(Boolean.FALSE);
@@ -931,7 +935,7 @@ public class AVM2SourceGenerator implements SourceGenerator {
InstanceInfo ii = new InstanceInfo();
abc.class_info.add(ci);
abc.instance_info.add(ii);
tc.class_info = abc.instance_info.size()-1;
tc.class_info = abc.instance_info.size() - 1;
tc.kindType = Trait.TRAIT_CLASS;
tc.name_index = traitName(pkg.packageName, className, ((InterfaceAVM2Item) item).namespaceKind, ((InterfaceAVM2Item) item).name);
tc.slot_id = slot_id++;
@@ -944,20 +948,18 @@ public class AVM2SourceGenerator implements SourceGenerator {
ClassInfo ci = new ClassInfo();
InstanceInfo instanceInfo = new InstanceInfo();
abc.class_info.add(ci);
abc.instance_info.add(instanceInfo);
tc.class_info = abc.instance_info.size()-1;
instanceInfo.name_index = abc.constants.addMultiname(new Multiname(Multiname.QNAME, abc.constants.getStringId(((ClassAVM2Item) item).className, true),
abc.constants.getNamespaceId(new Namespace(Namespace.KIND_PACKAGE, abc.constants.getStringId(pkg.packageName, true)), 0, true), 0, 0, new ArrayList<Integer>()));
abc.instance_info.add(instanceInfo);
tc.class_info = abc.instance_info.size() - 1;
if (((ClassAVM2Item)item).extendsOp != null) {
instanceInfo.super_index = typeName(localData, ((ClassAVM2Item)item).extendsOp);
instanceInfo.name_index = abc.constants.addMultiname(new Multiname(Multiname.QNAME, abc.constants.getStringId(((ClassAVM2Item) item).className, true),
abc.constants.getNamespaceId(new Namespace(Namespace.KIND_PACKAGE, abc.constants.getStringId(pkg.packageName, true)), 0, true), 0, 0, new ArrayList<Integer>()));
if (((ClassAVM2Item) item).extendsOp != null) {
instanceInfo.super_index = typeName(localData, ((ClassAVM2Item) item).extendsOp);
} else if (true) { //(!isInterface) {
instanceInfo.super_index = abc.constants.getMultinameId(new Multiname(Multiname.QNAME, str("Object"), namespace(Namespace.KIND_PACKAGE, ""), 0, 0, new ArrayList<Integer>()), true);
}
tc.kindType = Trait.TRAIT_CLASS;
tc.name_index = traitName(pkg.packageName, className, ((ClassAVM2Item) item).namespaceKind, ((ClassAVM2Item) item).className);
tc.slot_id = slot_id++;
@@ -971,6 +973,7 @@ public class AVM2SourceGenerator implements SourceGenerator {
String var = null;
GraphTargetItem val = null;
GraphTargetItem type = null;
boolean isNamespace = false;
int nsKind = 0;
if (item instanceof SlotAVM2Item) {
SlotAVM2Item sai = (SlotAVM2Item) item;
@@ -991,11 +994,12 @@ public class AVM2SourceGenerator implements SourceGenerator {
val = cai.value;
type = cai.type;
nsKind = cai.getNsKind();
isNamespace = type.toString().equals("Namespace");
}
tsc.name_index = traitName(pkg.packageName, className, nsKind, var);
tsc.type_index = typeName(localData, type);
tsc.type_index = isNamespace ? 0 : typeName(localData, type);
ValueKind vk = getValueKind(type, val);
ValueKind vk = getValueKind(nsKind, type, val);
if (vk == null) {
tsc.value_kind = ValueKind.CONSTANT_Undefined;
} else {
@@ -1056,7 +1060,7 @@ public class AVM2SourceGenerator implements SourceGenerator {
List<Integer> parents = new ArrayList<>();
parentNamesAddNames(abc, allABCs, abc.instance_info.get(tc.class_info).name_index, parents, new ArrayList<String>(), new ArrayList<String>());
if (documentClass) {
mb.code.code.add(ins(new GetScopeObjectIns(), 0));
mb.code.code.add(ins(new GetScopeObjectIns(), 0));
traitScope++;
} else {
NamespaceSet nsset = new NamespaceSet(new int[]{abc.constants.constant_multiname.get(tc.name_index).namespace_index});
@@ -1123,7 +1127,8 @@ public class AVM2SourceGenerator implements SourceGenerator {
}
}
}
for (InstanceInfo ii : abc.instance_info) {
for (int i = 0; i < abc.instance_info.size(); i++) {
InstanceInfo ii = abc.instance_info.get(i);
Multiname clsName = ii.getName(abc.constants);
if (obj.equals(clsName.getName(abc.constants, new ArrayList<String>()))) {
if (pkg.equals(clsName.getNamespace(abc.constants).getName(abc.constants))) {
@@ -1139,6 +1144,16 @@ public class AVM2SourceGenerator implements SourceGenerator {
}
}
for (Trait t : abc.class_info.get(i).static_traits.traits) {
if (propertyName.equals(t.getName(abc).getName(abc.constants, new ArrayList<String>()))) {
outName.setVal(obj);
outNs.setVal(pkg);
outPropNs.setVal(t.getName(abc).getNamespace(abc.constants).getName(abc.constants));
outPropNsKind.setVal(t.getName(abc).getNamespace(abc.constants).kind);
return true;
}
}
Multiname superName = abc.constants.constant_multiname.get(ii.super_index);
if (superName != null) {
return searchProperty(abcs, superName.getNamespace(abc.constants).getName(abc.constants), superName.getName(abc.constants, new ArrayList<String>()), propertyName, outName, outNs, outPropNs, outPropNsKind);
@@ -1185,7 +1200,7 @@ public class AVM2SourceGenerator implements SourceGenerator {
}
}
public void calcRegisters(SourceGeneratorLocalData localData, FunctionAVM2Item fun, Reference<Boolean> hasArguments) {
public void calcRegisters(SourceGeneratorLocalData localData, FunctionAVM2Item fun, Reference<Boolean> hasArguments) throws ParseException {
List<String> registerNames = new ArrayList<>();
registerNames.add("this");
registerNames.addAll(fun.paramNames);
@@ -1203,7 +1218,50 @@ public class AVM2SourceGenerator implements SourceGenerator {
}
}
for (NameAVM2Item n : fun.subvariables) {
n.setRegNumber(registerNames.indexOf(n.getVariableName()));
if (n.unresolved) {
GraphTargetItem resolved = null;
List<ABC> abcs = new ArrayList<>();
abcs.add(abc);
abcs.addAll(allABCs);
String parts[] = new String[]{n.getVariableName()};
if (n.getVariableName().contains(".")) {
parts = n.getVariableName().split("\\.");
}
loopi:
for (int i = 0; i < n.openedNamespaces.size(); i++) {
String ns = n.openedNamespaces.get(i);
String nspkg = ns;
String nsclass = null;
int nsKind = n.openedNamespacesKind.get(i);
if (nspkg.contains(":") && nsKind != Namespace.KIND_NAMESPACE) {
nsclass = nspkg.substring(nspkg.indexOf(":") + 1);
nspkg = nspkg.substring(0, nspkg.indexOf(":"));
}
for (int h = 0; h < abc.instance_info.size(); h++) {
InstanceInfo ii = abc.instance_info.get(h);
Multiname mn = abc.constants.constant_multiname.get(ii.name_index);
if (mn.getNamespace(abc.constants).getName(abc.constants).equals(nspkg) && (nsclass == null || (mn.getName(abc.constants, new ArrayList<String>()).equals(nsclass)))) {
//found opened class
Reference<String> outName = new Reference<>("");
Reference<String> outNs = new Reference<>("");
Reference<String> outPropNs = new Reference<>("");
Reference<Integer> outPropNsKind = new Reference<>(1);
if (AVM2SourceGenerator.searchProperty(abcs, nspkg, mn.getName(abc.constants, new ArrayList<String>()), parts[0], outName, outNs, outPropNs, outPropNsKind)) {
resolved = new PropertyAVM2Item(null, parts[0], n.getIndex(), abcs, n.openedNamespaces, n.openedNamespacesKind);
break loopi;
}
}
}
}
n.redirect = resolved;
if (resolved == null) {
throw new ParseException("Unknown variable or property:" + n.getVariableName(), n.line);
}
}
if (n.getVariableName() != null) {
n.setRegNumber(registerNames.indexOf(n.getVariableName()));
}
}
for (int i = 0; i < registerNames.size(); i++) {
localData.registerVars.put(registerNames.get(i), i);
File diff suppressed because it is too large Load Diff
@@ -118,7 +118,7 @@ import java.util.logging.Logger;
public class ActionScriptParser {
private long uniqLast = 0;
private final boolean debugMode = false;
private final boolean debugMode = true;
private static final String AS3_NAMESPACE = "http://adobe.com/AS3/2006/builtin";
private ABC abc;
@@ -148,6 +148,8 @@ public class ActionScriptParser {
ParsedSymbol s = lex();
if (s.type == SymbolType.MULTIPLY) {
return new UnboundedTypeItem();
} else if (s.type == SymbolType.VOID) {
return new TypeItem("void");
} else {
lexer.pushback(s);
}
@@ -200,7 +202,6 @@ public class ActionScriptParser {
private GraphTargetItem name(boolean typeOnly, List<String> openedNamespaces, List<Integer> openedNamespacesKinds, HashMap<String, Integer> registerVars, boolean inFunction, boolean inMethod, List<NameAVM2Item> variables) throws IOException, ParseException {
ParsedSymbol s = lex();
expected(s, lexer.yyline(), SymbolType.IDENTIFIER, SymbolType.THIS, SymbolType.SUPER, SymbolType.STRING_OP);
//NameAVM2Item ret = new NameAVM2Item(lexer.yyline(),s.value.toString(), null, false, openedNamespaces, openedNamespacesKinds);
List<String> parts = new ArrayList<>();
parts.add(s.value.toString());
s = lex();
@@ -263,23 +264,6 @@ public class ActionScriptParser {
if (AVM2SourceGenerator.searchProperty(allAbcs, nspkg, n.getName(a.constants, new ArrayList<String>()), parts.get(0), outName, outNs, outPropNs, outPropNsKind)) {
return new PropertyAVM2Item(null, parts.get(0), index, allAbcs, openedNamespaces, openedNamespacesKinds);
}
/*for (int g = 0; g < a.instance_info.size(); g++) {
InstanceInfo iii = a.instance_info.get(g);
System.out.println("check " + iii.getName(a.constants).getNameWithNamespace(a.constants) + " - search " + parts.get(0));
for (Trait t : iii.instance_traits.traits) {
n = t.getName(a);
if (n.getNamespace(a.constants).kind == nsKind && n.getName(a.constants, new ArrayList<String>()).equals(parts.get(0))) {
return new PropertyAVM2Item(null, parts.get(0), index, allAbcs, openedNamespaces, openedNamespacesKinds);
}
}
for (Trait t : a.class_info.get(g).static_traits.traits) {
n = t.getName(a);
if (n.getNamespace(a.constants).kind == nsKind && n.getName(a.constants, new ArrayList<String>()).equals(parts.get(0))) {
return new PropertyAVM2Item(null, parts.get(0), index, allAbcs, openedNamespaces, openedNamespacesKinds);
}
}
}*/
}
}
}
@@ -340,7 +324,12 @@ public class ActionScriptParser {
}
if (k == -1) {
throw new ParseException("Cannot find variable or type:" + Helper.joinStrings(parts, "."), lexer.yyline());
NameAVM2Item ret = new NameAVM2Item(null, lexer.yyline(), Helper.joinStrings(parts, "."), null, false, openedNamespaces, openedNamespacesKinds);
ret.unresolved = true;
ret.setIndex(index);
variables.add(ret);
return ret;
//throw new ParseException("Cannot find variable or type:" + Helper.joinStrings(parts, "."), lexer.yyline());
}
GraphTargetItem ret = new TypeItem("".equals(pkg) ? name : pkg + "." + name);
for (int i = 1; i < parts.size(); i++) {
@@ -683,10 +672,31 @@ public class ActionScriptParser {
}
//}
break;
case NAMESPACE:
s = lex();
expected(s, lexer.yyline(), SymbolType.IDENTIFIER);
String nname = s.value.toString();
String nval = "";
s = lex();
if (s.type == SymbolType.ASSIGN) {
s = lex();
expected(s, lexer.yyline(), SymbolType.STRING);
nval = s.value.toString();
s = lex();
} else {
nval = (packageName.equals("") ? classNameStr : packageName + ":" + classNameStr) + "/" + nname;
}
if (s.type != SymbolType.SEMICOLON) {
lexer.pushback(s);
}
ConstAVM2Item ns = new ConstAVM2Item(true, nsKind, nname, new TypeItem("Namespace"), new StringAVM2Item(null, nval));
traits.add(ns);
break;
case CONST:
case VAR:
boolean isConst = s.type == SymbolType.CONST;
if (isOverride) {
throw new ParseException("Override flag not allowed for " + (isConst ? "consts" : "vars"), lexer.yyline());
}
@@ -706,16 +716,20 @@ public class ActionScriptParser {
type = type(openedNamespaces, openedNamespacesKinds, variables);
s = lex();
}
GraphTargetItem value = null;
if (s.type == SymbolType.ASSIGN) {
GraphTargetItem tar;
if (isConst) {
tar = new ConstAVM2Item(isStatic, nsKind, vcname, type, expression(openedNamespaces, openedNamespacesKinds, new HashMap<String, Integer>(), false, false, true, variables));
} else {
tar = new SlotAVM2Item(isStatic, nsKind, vcname, type, expression(openedNamespaces, openedNamespacesKinds, new HashMap<String, Integer>(), false, false, true, variables));
}
traits.add(tar);
value = expression(openedNamespaces, openedNamespacesKinds, new HashMap<String, Integer>(), false, false, true, variables);
s = lex();
}
GraphTargetItem tar;
if (isConst) {
tar = new ConstAVM2Item(isStatic, nsKind, vcname, type, value);
} else {
tar = new SlotAVM2Item(isStatic, nsKind, vcname, type, value);
}
traits.add(tar);
if (s.type != SymbolType.SEMICOLON) {
lexer.pushback(s);
}
@@ -742,7 +756,7 @@ public class ActionScriptParser {
openedNamespacesKinds = new ArrayList<>(openedNamespacesKinds);
openedNamespacesKinds.add(Namespace.KIND_PRIVATE);
openedNamespaces.add("".equals(packageName) ? classNameStr : packageName + ":" + classNameStr);
openedNamespaces.add(packageName + ":" + classNameStr);
openedNamespacesKinds.add(Namespace.KIND_PACKAGE);
openedNamespaces.add("");
openedNamespacesKinds.add(Namespace.KIND_PRIVATE);
@@ -756,9 +770,9 @@ public class ActionScriptParser {
openedNamespacesKinds.add(Namespace.KIND_NAMESPACE);
openedNamespaces.add(AS3_NAMESPACE);
openedNamespacesKinds.add(Namespace.KIND_PROTECTED);
openedNamespaces.add("".equals(packageName) ? classNameStr : packageName + ":" + classNameStr);
openedNamespaces.add(packageName + ":" + classNameStr);
openedNamespacesKinds.add(Namespace.KIND_STATIC_PROTECTED);
openedNamespaces.add("".equals(packageName) ? classNameStr : packageName + ":" + classNameStr);
openedNamespaces.add(packageName + ":" + classNameStr);
List<Integer> indices = new ArrayList<>();
List<String> names = new ArrayList<>();
List<String> namespaces = new ArrayList<>();
@@ -848,25 +862,31 @@ public class ActionScriptParser {
switch (s.type) {
case WITH:
expectedType(SymbolType.PARENT_OPEN);
GraphTargetItem wvar = (name(false, openedNamespaces, openedNamespacesKinds, registerVars, inFunction, inMethod, variables));
GraphTargetItem wvar = expression(openedNamespaces, openedNamespacesKinds, registerVars, inFunction, inMethod, true, variables);//(name(false, openedNamespaces, openedNamespacesKinds, registerVars, inFunction, inMethod, variables));
if (!isNameOrProp(wvar)) {
throw new ParseException("Not a property or name", lexer.yyline());
}
expectedType(SymbolType.PARENT_CLOSE);
expectedType(SymbolType.CURLY_OPEN);
List<GraphTargetItem> wcmd = commands(openedNamespaces, openedNamespacesKinds, loops, loopLabels, registerVars, inFunction, inMethod, forinlevel, variables);
expectedType(SymbolType.CURLY_CLOSE);
ret = new WithAVM2Item(null, wvar, wcmd);
break;
case DELETE:
GraphTargetItem varDel = name(false, openedNamespaces, openedNamespacesKinds, registerVars, inFunction, inMethod, variables);
if (varDel instanceof GetPropertyAVM2Item) {
GetPropertyAVM2Item gm = (GetPropertyAVM2Item) varDel;
ret = new DeletePropertyAVM2Item(null, gm.object, gm.propertyName);
} else if (varDel instanceof NameAVM2Item) {
variables.remove(varDel);
ret = new DeletePropertyAVM2Item(null, null, (NameAVM2Item) varDel);
} else {
throw new ParseException("Not a property", lexer.yyline());
}
break;
/*case DELETE:
GraphTargetItem varDel = expression(openedNamespaces, openedNamespacesKinds, registerVars, inFunction, inMethod, true, variables);//name(false, openedNamespaces, openedNamespacesKinds, registerVars, inFunction, inMethod, variables);
if(!isNameOrProp(varDel)){
throw new ParseException("Not a property or name", lexer.yyline());
}
if (varDel instanceof GetPropertyAVM2Item) {
GetPropertyAVM2Item gm = (GetPropertyAVM2Item) varDel;
ret = new DeletePropertyAVM2Item(null, gm.object, gm.propertyName);
} else if (varDel instanceof NameAVM2Item) {
variables.remove(varDel);
ret = new DeletePropertyAVM2Item(null, null, (NameAVM2Item) varDel);
} else {
throw new ParseException("Not a property", lexer.yyline());
}
break;*/
case FUNCTION:
s = lexer.lex();
expected(s, lexer.yyline(), SymbolType.IDENTIFIER);
@@ -899,15 +919,18 @@ public class ActionScriptParser {
ret = new BlockItem(null, commands(openedNamespaces, openedNamespacesKinds, loops, loopLabels, registerVars, inFunction, inMethod, forinlevel, variables));
expectedType(SymbolType.CURLY_CLOSE);
break;
case INCREMENT: //preincrement
case DECREMENT: //predecrement
GraphTargetItem varincdec = name(false, openedNamespaces, openedNamespacesKinds, registerVars, inFunction, inMethod, variables);
if (s.type == SymbolType.INCREMENT) {
ret = new PreIncrementAVM2Item(null, varincdec);
} else if (s.type == SymbolType.DECREMENT) {
ret = new PreDecrementAVM2Item(null, varincdec);
}
break;
/*case INCREMENT: //preincrement
case DECREMENT: //predecrement
GraphTargetItem varincdec = expression(openedNamespaces, openedNamespacesKinds, registerVars, inFunction, inMethod, true, variables);//name(false, openedNamespaces, openedNamespacesKinds, registerVars, inFunction, inMethod, variables);
if(!isNameOrProp(varincdec)){
throw new ParseException("Not a property or name", lexer.yyline());
}
if (s.type == SymbolType.INCREMENT) {
ret = new PreIncrementAVM2Item(null, varincdec);
} else if (s.type == SymbolType.DECREMENT) {
ret = new PreDecrementAVM2Item(null, varincdec);
}
break;*/
case SUPER: //constructor call
ParsedSymbol ss2 = lex();
if (ss2.type == SymbolType.PARENT_OPEN) {
@@ -1271,6 +1294,27 @@ public class ActionScriptParser {
GraphTargetItem ret = null;
ParsedSymbol s = lex();
switch (s.type) {
case NAMESPACE_OP:
s = lex();
if (s.type == SymbolType.BRACKET_OPEN) {
GraphTargetItem index = expression(openedNamespaces, openedNamespacesKinds, registerVars, inFunction, inMethod, true, variables);
NameAVM2Item name = new NameAVM2Item(new UnboundedTypeItem(), lexer.yyline(), null, null, false, openedNamespaces, openedNamespacesKinds);
name.setIndex(index);
name.setNs(expr);
ret = name;
expectedType(SymbolType.BRACKET_CLOSE);
} else {
lexer.pushback(s);
GraphTargetItem name = name(false, openedNamespaces, openedNamespacesKinds, registerVars, inFunction, inMethod, variables);
if (name instanceof NameAVM2Item) {
((NameAVM2Item) name).setNs(expr);
((NameAVM2Item) name).unresolved = false;
} else {
throw new ParseException("Not a property name", lexer.yyline());
}
ret = name;
}
break;
case TERNAR:
GraphTargetItem terOnTrue = expression(openedNamespaces, openedNamespacesKinds, registerVars, inFunction, inMethod, true, variables);
expectedType(SymbolType.COLON);
@@ -1413,13 +1457,13 @@ public class ActionScriptParser {
ret = expr;
break;
case INCREMENT: //postincrement
if (!(expr instanceof NameAVM2Item) && !(expr instanceof GetPropertyAVM2Item)) {
if (!(expr instanceof AssignableAVM2Item)) {
throw new ParseException("Invalid assignment", lexer.yyline());
}
ret = new PostIncrementAVM2Item(null, expr);
break;
case DECREMENT: //postdecrement
if (!(expr instanceof NameAVM2Item) && !(expr instanceof GetPropertyAVM2Item)) {
if (!(expr instanceof AssignableAVM2Item)) {
throw new ParseException("Invalid assignment", lexer.yyline());
}
ret = new PostDecrementAVM2Item(null, expr);
@@ -1447,6 +1491,16 @@ public class ActionScriptParser {
return ret;
}
private boolean isNameOrProp(GraphTargetItem item) {
if (item instanceof NameAVM2Item) {
return true;
}
if (item instanceof PropertyAVM2Item) {
return true;
}
return false;
}
private boolean isType(GraphTargetItem item) {
if (item == null) {
return false;
@@ -1626,7 +1680,10 @@ public class ActionScriptParser {
existsRemainder = true;
break;
case DELETE:
GraphTargetItem varDel = name(false, openedNamespaces, openedNamespacesKinds, registerVars, inFunction, inMethod, variables);
GraphTargetItem varDel = expression(openedNamespaces, openedNamespacesKinds, registerVars, inFunction, inMethod, true, variables);//name(false, openedNamespaces, openedNamespacesKinds, registerVars, inFunction, inMethod, variables);
if (!isNameOrProp(varDel)) {
throw new ParseException("Not a property or name", lexer.yyline());
}
if (varDel instanceof GetPropertyAVM2Item) {
GetPropertyAVM2Item gm = (GetPropertyAVM2Item) varDel;
ret = new DeletePropertyAVM2Item(null, gm.object, gm.propertyName);
@@ -1636,12 +1693,15 @@ public class ActionScriptParser {
break;
case INCREMENT:
case DECREMENT: //preincrement
GraphTargetItem prevar = name(false, openedNamespaces, openedNamespacesKinds, registerVars, inFunction, inMethod, variables);
GraphTargetItem varincdec = expression(openedNamespaces, openedNamespacesKinds, registerVars, inFunction, inMethod, true, variables);//name(false, openedNamespaces, openedNamespacesKinds, registerVars, inFunction, inMethod, variables);
if (!isNameOrProp(varincdec)) {
throw new ParseException("Not a property or name", lexer.yyline());
}
if (s.type == SymbolType.INCREMENT) {
ret = new PreIncrementAVM2Item(null, prevar);
ret = new PreIncrementAVM2Item(null, varincdec);
}
if (s.type == SymbolType.DECREMENT) {
ret = new PreDecrementAVM2Item(null, prevar);
ret = new PreDecrementAVM2Item(null, varincdec);
}
existsRemainder = true;
break;
@@ -1809,7 +1869,7 @@ public class ActionScriptParser {
}
ABC abc = new ABC(swf);
ActionScriptParser parser = new ActionScriptParser(abc, playerABCs);
parser.addScript(new String(Helper.readFile(src), "UTF-8"),true);
parser.addScript(new String(Helper.readFile(src), "UTF-8"), true);
abc.saveToStream(new FileOutputStream(new File(dst)));
} catch (Exception ex) {
Logger.getLogger(ActionScriptParser.class.getName()).log(Level.SEVERE, null, ex);

Some files were not shown because too many files have changed in this diff Show More