mirror of
https://git.huckle.dev/Huckles-Minecraft-Archive/jpexs-decompiler.git
synced 2026-09-25 06:21:16 +00:00
AS3 parser - namespaces, :: operator, etc.
This commit is contained in:
@@ -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();
|
||||
|
||||
+5
-6
@@ -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");
|
||||
|
||||
+3
-3
@@ -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();
|
||||
|
||||
+3
-3
@@ -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");
|
||||
|
||||
+22
-3
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
+21
-3
@@ -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();
|
||||
|
||||
+3
-3
@@ -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");
|
||||
|
||||
+3
-3
@@ -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");
|
||||
|
||||
+3
-3
@@ -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();
|
||||
|
||||
+94
-36
@@ -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);
|
||||
|
||||
+1793
-1622
File diff suppressed because it is too large
Load Diff
+120
-60
@@ -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
Reference in New Issue
Block a user