diff --git a/src/com/jpexs/decompiler/flash/abc/avm2/model/NewFunctionAVM2Item.java b/src/com/jpexs/decompiler/flash/abc/avm2/model/NewFunctionAVM2Item.java index 5bb7cfcc6..4fbda5e13 100644 --- a/src/com/jpexs/decompiler/flash/abc/avm2/model/NewFunctionAVM2Item.java +++ b/src/com/jpexs/decompiler/flash/abc/avm2/model/NewFunctionAVM2Item.java @@ -1,92 +1,91 @@ -/* - * Copyright (C) 2010-2014 JPEXS - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.jpexs.decompiler.flash.abc.avm2.model; - -import com.jpexs.decompiler.flash.abc.ABC; -import com.jpexs.decompiler.flash.abc.avm2.ConstantPool; -import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; -import com.jpexs.decompiler.flash.abc.types.MethodBody; -import com.jpexs.decompiler.flash.abc.types.MethodInfo; -import com.jpexs.decompiler.flash.exporters.modes.ScriptExportMode; -import com.jpexs.decompiler.flash.helpers.GraphTextWriter; -import com.jpexs.decompiler.flash.helpers.NulWriter; -import com.jpexs.decompiler.graph.GraphTargetItem; -import com.jpexs.decompiler.graph.TypeItem; -import com.jpexs.decompiler.graph.model.LocalData; -import java.util.List; -import java.util.Stack; - -public class NewFunctionAVM2Item extends AVM2Item { - - public String functionName; - public String path; - public boolean isStatic; - public int scriptIndex; - public int classIndex; - public ABC abc; - public List fullyQualifiedNames; - public ConstantPool constants; - public List methodInfo; - public int methodIndex; - - public NewFunctionAVM2Item(AVM2Instruction instruction, String functionName, String path, boolean isStatic, int scriptIndex, int classIndex, ABC abc, List fullyQualifiedNames, ConstantPool constants, List methodInfo, int methodIndex) { - super(instruction, PRECEDENCE_PRIMARY); - this.functionName = functionName; - this.path = path; - this.isStatic = isStatic; - this.scriptIndex = scriptIndex; - this.classIndex = classIndex; - this.abc = abc; - this.fullyQualifiedNames = fullyQualifiedNames; - this.constants = constants; - this.methodInfo = methodInfo; - this.methodIndex = methodIndex; - } - - @Override - public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { - MethodBody body = abc.findBody(methodIndex); - writer.append("function" + (!functionName.isEmpty() ? " " + functionName : "")); - writer.startMethod(methodIndex); - writer.appendNoHilight("("); - methodInfo.get(methodIndex).getParamStr(writer, constants, body, abc, fullyQualifiedNames); - writer.appendNoHilight("):"); - methodInfo.get(methodIndex).getReturnTypeStr(writer, constants, fullyQualifiedNames); - writer.endMethod(); - writer.newLine(); - writer.append("{").newLine(); - if (body != null) { - if (writer instanceof NulWriter) { - body.convert(path + "/inner", ScriptExportMode.AS, isStatic, scriptIndex, classIndex, abc, null, constants, methodInfo, new Stack()/*scopeStack*/, false, writer, fullyQualifiedNames, null, false); - } else { - body.toString(path + "/inner", ScriptExportMode.AS, isStatic, scriptIndex, classIndex, abc, null, constants, methodInfo, new Stack()/*scopeStack*/, false, writer, fullyQualifiedNames, null); - } - } - writer.append("}"); - return writer; - } - - @Override - public GraphTargetItem returnType() { - return new TypeItem("Function"); - } - - @Override - public boolean hasReturnValue() { - return true; - } -} +/* + * Copyright (C) 2010-2014 JPEXS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.jpexs.decompiler.flash.abc.avm2.model; + +import com.jpexs.decompiler.flash.abc.ABC; +import com.jpexs.decompiler.flash.abc.avm2.ConstantPool; +import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; +import com.jpexs.decompiler.flash.abc.types.MethodBody; +import com.jpexs.decompiler.flash.abc.types.MethodInfo; +import com.jpexs.decompiler.flash.exporters.modes.ScriptExportMode; +import com.jpexs.decompiler.flash.helpers.GraphTextWriter; +import com.jpexs.decompiler.flash.helpers.NulWriter; +import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.TypeItem; +import com.jpexs.decompiler.graph.model.LocalData; +import java.util.List; +import java.util.Stack; + +public class NewFunctionAVM2Item extends AVM2Item { + + public String functionName; + public String path; + public boolean isStatic; + public int scriptIndex; + public int classIndex; + public ABC abc; + public List fullyQualifiedNames; + public ConstantPool constants; + public List methodInfo; + public int methodIndex; + + public NewFunctionAVM2Item(AVM2Instruction instruction, String functionName, String path, boolean isStatic, int scriptIndex, int classIndex, ABC abc, List fullyQualifiedNames, ConstantPool constants, List methodInfo, int methodIndex) { + super(instruction, PRECEDENCE_PRIMARY); + this.functionName = functionName; + this.path = path; + this.isStatic = isStatic; + this.scriptIndex = scriptIndex; + this.classIndex = classIndex; + this.abc = abc; + this.fullyQualifiedNames = fullyQualifiedNames; + this.constants = constants; + this.methodInfo = methodInfo; + this.methodIndex = methodIndex; + } + + @Override + public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { + MethodBody body = abc.findBody(methodIndex); + writer.append("function" + (!functionName.isEmpty() ? " " + functionName : "")); + writer.startMethod(methodIndex); + writer.appendNoHilight("("); + methodInfo.get(methodIndex).getParamStr(writer, constants, body, abc, fullyQualifiedNames); + writer.appendNoHilight("):"); + methodInfo.get(methodIndex).getReturnTypeStr(writer, constants, fullyQualifiedNames); + writer.endMethod(); + writer.startBlock(); + if (body != null) { + if (writer instanceof NulWriter) { + body.convert(path + "/inner", ScriptExportMode.AS, isStatic, scriptIndex, classIndex, abc, null, constants, methodInfo, new Stack()/*scopeStack*/, false, writer, fullyQualifiedNames, null, false); + } else { + body.toString(path + "/inner", ScriptExportMode.AS, isStatic, scriptIndex, classIndex, abc, null, constants, methodInfo, new Stack()/*scopeStack*/, false, writer, fullyQualifiedNames, null); + } + } + writer.endBlock(); + return writer; + } + + @Override + public GraphTargetItem returnType() { + return new TypeItem("Function"); + } + + @Override + public boolean hasReturnValue() { + return true; + } +} diff --git a/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/ForEachInAVM2Item.java b/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/ForEachInAVM2Item.java index b945e2e6d..5af2202a5 100644 --- a/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/ForEachInAVM2Item.java +++ b/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/ForEachInAVM2Item.java @@ -1,141 +1,138 @@ -/* - * Copyright (C) 2010-2014 JPEXS - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.jpexs.decompiler.flash.abc.avm2.model.clauses; - -import com.jpexs.decompiler.flash.SourceGeneratorLocalData; -import com.jpexs.decompiler.flash.abc.avm2.model.InAVM2Item; -import com.jpexs.decompiler.flash.abc.avm2.model.LocalRegAVM2Item; -import com.jpexs.decompiler.flash.abc.avm2.model.SetTypeAVM2Item; -import com.jpexs.decompiler.flash.abc.avm2.parser.script.AVM2SourceGenerator; -import com.jpexs.decompiler.flash.helpers.GraphTextWriter; -import com.jpexs.decompiler.flash.helpers.LoopWithType; -import com.jpexs.decompiler.flash.helpers.NulWriter; -import com.jpexs.decompiler.graph.Block; -import com.jpexs.decompiler.graph.CompilationException; -import com.jpexs.decompiler.graph.GraphSourceItem; -import com.jpexs.decompiler.graph.GraphTargetItem; -import com.jpexs.decompiler.graph.Loop; -import com.jpexs.decompiler.graph.SourceGenerator; -import com.jpexs.decompiler.graph.TypeItem; -import com.jpexs.decompiler.graph.model.ContinueItem; -import com.jpexs.decompiler.graph.model.LocalData; -import com.jpexs.decompiler.graph.model.LoopItem; -import java.util.ArrayList; -import java.util.List; - -public class ForEachInAVM2Item extends LoopItem implements Block { - - public InAVM2Item expression; - public List commands; - private boolean labelUsed; - - @Override - public List> getSubs() { - List> ret = new ArrayList<>(); - if (commands != null) { - ret.add(commands); - } - return ret; - } - - public ForEachInAVM2Item(GraphSourceItem instruction, Loop loop, InAVM2Item expression, List commands) { - super(instruction, loop); - if (!commands.isEmpty()) { - GraphTargetItem firstAssign = commands.get(0); - if (firstAssign instanceof SetTypeAVM2Item) { - if (expression.object instanceof LocalRegAVM2Item) { - if (((SetTypeAVM2Item) firstAssign).getValue().getNotCoerced() instanceof LocalRegAVM2Item) { - if (((LocalRegAVM2Item) ((SetTypeAVM2Item) firstAssign).getValue().getNotCoerced()).regIndex == ((LocalRegAVM2Item) expression.object).regIndex) { - commands.remove(0); - expression.object = ((SetTypeAVM2Item) firstAssign).getObject(); - } - } - - } - //locAssign. - } - } - this.expression = expression; - this.commands = commands; - } - - @Override - public boolean needsSemicolon() { - return false; - } - - @Override - public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { - if (writer instanceof NulWriter) { - ((NulWriter) writer).startLoop(loop.id, LoopWithType.LOOP_TYPE_LOOP); - } - if (labelUsed) { - writer.append("loop" + loop.id + ":").newLine(); - } - writer.append("for each"); - if (writer.getFormatting().spaceBeforeParenthesesForEachParentheses) { - writer.append(" "); - } - writer.append("("); - expression.toString(writer, localData); - writer.append(")").newLine(); - writer.append("{").newLine(); - writer.indent(); - for (GraphTargetItem ti : commands) { - if (!ti.isEmpty()) { - ti.toStringSemicoloned(writer, localData).newLine(); - } - } - writer.unindent(); - writer.append("}"); - if (writer instanceof NulWriter) { - LoopWithType loopOjb = ((NulWriter) writer).endLoop(loop.id); - labelUsed = loopOjb.used; - } - return writer; - } - - @Override - public List getContinues() { - List ret = new ArrayList<>(); - for (GraphTargetItem ti : commands) { - if (ti instanceof ContinueItem) { - ret.add((ContinueItem) ti); - } - if (ti instanceof Block) { - ret.addAll(((Block) ti).getContinues()); - } - } - return ret; - } - - @Override - public boolean hasReturnValue() { - return false; - } - - @Override - public GraphTargetItem returnType() { - return TypeItem.UNBOUNDED; - } - - @Override - public List toSource(SourceGeneratorLocalData localData, SourceGenerator generator) throws CompilationException { - return ((AVM2SourceGenerator) generator).generate(localData, this); - } - -} +/* + * Copyright (C) 2010-2014 JPEXS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.jpexs.decompiler.flash.abc.avm2.model.clauses; + +import com.jpexs.decompiler.flash.SourceGeneratorLocalData; +import com.jpexs.decompiler.flash.abc.avm2.model.InAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.LocalRegAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.SetTypeAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.parser.script.AVM2SourceGenerator; +import com.jpexs.decompiler.flash.helpers.GraphTextWriter; +import com.jpexs.decompiler.flash.helpers.LoopWithType; +import com.jpexs.decompiler.flash.helpers.NulWriter; +import com.jpexs.decompiler.graph.Block; +import com.jpexs.decompiler.graph.CompilationException; +import com.jpexs.decompiler.graph.GraphSourceItem; +import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.Loop; +import com.jpexs.decompiler.graph.SourceGenerator; +import com.jpexs.decompiler.graph.TypeItem; +import com.jpexs.decompiler.graph.model.ContinueItem; +import com.jpexs.decompiler.graph.model.LocalData; +import com.jpexs.decompiler.graph.model.LoopItem; +import java.util.ArrayList; +import java.util.List; + +public class ForEachInAVM2Item extends LoopItem implements Block { + + public InAVM2Item expression; + public List commands; + private boolean labelUsed; + + @Override + public List> getSubs() { + List> ret = new ArrayList<>(); + if (commands != null) { + ret.add(commands); + } + return ret; + } + + public ForEachInAVM2Item(GraphSourceItem instruction, Loop loop, InAVM2Item expression, List commands) { + super(instruction, loop); + if (!commands.isEmpty()) { + GraphTargetItem firstAssign = commands.get(0); + if (firstAssign instanceof SetTypeAVM2Item) { + if (expression.object instanceof LocalRegAVM2Item) { + if (((SetTypeAVM2Item) firstAssign).getValue().getNotCoerced() instanceof LocalRegAVM2Item) { + if (((LocalRegAVM2Item) ((SetTypeAVM2Item) firstAssign).getValue().getNotCoerced()).regIndex == ((LocalRegAVM2Item) expression.object).regIndex) { + commands.remove(0); + expression.object = ((SetTypeAVM2Item) firstAssign).getObject(); + } + } + + } + //locAssign. + } + } + this.expression = expression; + this.commands = commands; + } + + @Override + public boolean needsSemicolon() { + return false; + } + + @Override + public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { + if (writer instanceof NulWriter) { + ((NulWriter) writer).startLoop(loop.id, LoopWithType.LOOP_TYPE_LOOP); + } + if (labelUsed) { + writer.append("loop" + loop.id + ":").newLine(); + } + writer.append("for each"); + if (writer.getFormatting().spaceBeforeParenthesesForEachParentheses) { + writer.append(" "); + } + writer.append("("); + expression.toString(writer, localData); + writer.append(")").startBlock(); + for (GraphTargetItem ti : commands) { + if (!ti.isEmpty()) { + ti.toStringSemicoloned(writer, localData).newLine(); + } + } + writer.endBlock(); + if (writer instanceof NulWriter) { + LoopWithType loopOjb = ((NulWriter) writer).endLoop(loop.id); + labelUsed = loopOjb.used; + } + return writer; + } + + @Override + public List getContinues() { + List ret = new ArrayList<>(); + for (GraphTargetItem ti : commands) { + if (ti instanceof ContinueItem) { + ret.add((ContinueItem) ti); + } + if (ti instanceof Block) { + ret.addAll(((Block) ti).getContinues()); + } + } + return ret; + } + + @Override + public boolean hasReturnValue() { + return false; + } + + @Override + public GraphTargetItem returnType() { + return TypeItem.UNBOUNDED; + } + + @Override + public List toSource(SourceGeneratorLocalData localData, SourceGenerator generator) throws CompilationException { + return ((AVM2SourceGenerator) generator).generate(localData, this); + } + +} diff --git a/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/ForInAVM2Item.java b/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/ForInAVM2Item.java index 522be1dd7..4e2b7d335 100644 --- a/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/ForInAVM2Item.java +++ b/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/ForInAVM2Item.java @@ -1,140 +1,137 @@ -/* - * Copyright (C) 2010-2014 JPEXS - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package com.jpexs.decompiler.flash.abc.avm2.model.clauses; - -import com.jpexs.decompiler.flash.SourceGeneratorLocalData; -import com.jpexs.decompiler.flash.abc.avm2.model.InAVM2Item; -import com.jpexs.decompiler.flash.abc.avm2.model.LocalRegAVM2Item; -import com.jpexs.decompiler.flash.abc.avm2.model.SetTypeAVM2Item; -import com.jpexs.decompiler.flash.abc.avm2.parser.script.AVM2SourceGenerator; -import com.jpexs.decompiler.flash.helpers.GraphTextWriter; -import com.jpexs.decompiler.flash.helpers.LoopWithType; -import com.jpexs.decompiler.flash.helpers.NulWriter; -import com.jpexs.decompiler.graph.Block; -import com.jpexs.decompiler.graph.CompilationException; -import com.jpexs.decompiler.graph.GraphSourceItem; -import com.jpexs.decompiler.graph.GraphTargetItem; -import com.jpexs.decompiler.graph.Loop; -import com.jpexs.decompiler.graph.SourceGenerator; -import com.jpexs.decompiler.graph.TypeItem; -import com.jpexs.decompiler.graph.model.ContinueItem; -import com.jpexs.decompiler.graph.model.LocalData; -import com.jpexs.decompiler.graph.model.LoopItem; -import java.util.ArrayList; -import java.util.List; - -public class ForInAVM2Item extends LoopItem implements Block { - - public InAVM2Item expression; - public List commands; - private boolean labelUsed; - - @Override - public List> getSubs() { - List> ret = new ArrayList<>(); - if (commands != null) { - ret.add(commands); - } - return ret; - } - - public ForInAVM2Item(GraphSourceItem instruction, Loop loop, InAVM2Item expression, List commands) { - super(instruction, loop); - if (!commands.isEmpty()) { - GraphTargetItem firstAssign = commands.get(0); - if (firstAssign instanceof SetTypeAVM2Item) { - if (expression.object instanceof LocalRegAVM2Item) { - if (((SetTypeAVM2Item) firstAssign).getValue().getNotCoerced() instanceof LocalRegAVM2Item) { - if (((LocalRegAVM2Item) ((SetTypeAVM2Item) firstAssign).getValue().getNotCoerced()).regIndex == ((LocalRegAVM2Item) expression.object).regIndex) { - commands.remove(0); - expression.object = ((SetTypeAVM2Item) firstAssign).getObject(); - } - } - - } - //locAssign. - } - } - this.expression = expression; - this.commands = commands; - } - - @Override - public boolean needsSemicolon() { - return false; - } - - @Override - public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { - if (writer instanceof NulWriter) { - ((NulWriter) writer).startLoop(loop.id, LoopWithType.LOOP_TYPE_LOOP); - } - if (labelUsed) { - writer.append("loop" + loop.id + ":").newLine(); - } - writer.append("for"); - if (writer.getFormatting().spaceBeforeParenthesesForParentheses) { - writer.append(" "); - } - writer.append("("); - expression.toString(writer, localData); - writer.append(")").newLine(); - writer.append("{").newLine(); - writer.indent(); - for (GraphTargetItem ti : commands) { - if (!ti.isEmpty()) { - ti.toStringSemicoloned(writer, localData).newLine(); - } - } - writer.unindent(); - writer.append("}"); - if (writer instanceof NulWriter) { - LoopWithType loopOjb = ((NulWriter) writer).endLoop(loop.id); - labelUsed = loopOjb.used; - } - return writer; - } - - @Override - public List getContinues() { - List ret = new ArrayList<>(); - for (GraphTargetItem ti : commands) { - if (ti instanceof ContinueItem) { - ret.add((ContinueItem) ti); - } - if (ti instanceof Block) { - ret.addAll(((Block) ti).getContinues()); - } - } - return ret; - } - - @Override - public boolean hasReturnValue() { - return false; - } - - @Override - public GraphTargetItem returnType() { - return TypeItem.UNBOUNDED; - } - - @Override - public List toSource(SourceGeneratorLocalData localData, SourceGenerator generator) throws CompilationException { - return ((AVM2SourceGenerator) generator).generate(localData, this); - } -} +/* + * Copyright (C) 2010-2014 JPEXS + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.jpexs.decompiler.flash.abc.avm2.model.clauses; + +import com.jpexs.decompiler.flash.SourceGeneratorLocalData; +import com.jpexs.decompiler.flash.abc.avm2.model.InAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.LocalRegAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.model.SetTypeAVM2Item; +import com.jpexs.decompiler.flash.abc.avm2.parser.script.AVM2SourceGenerator; +import com.jpexs.decompiler.flash.helpers.GraphTextWriter; +import com.jpexs.decompiler.flash.helpers.LoopWithType; +import com.jpexs.decompiler.flash.helpers.NulWriter; +import com.jpexs.decompiler.graph.Block; +import com.jpexs.decompiler.graph.CompilationException; +import com.jpexs.decompiler.graph.GraphSourceItem; +import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.Loop; +import com.jpexs.decompiler.graph.SourceGenerator; +import com.jpexs.decompiler.graph.TypeItem; +import com.jpexs.decompiler.graph.model.ContinueItem; +import com.jpexs.decompiler.graph.model.LocalData; +import com.jpexs.decompiler.graph.model.LoopItem; +import java.util.ArrayList; +import java.util.List; + +public class ForInAVM2Item extends LoopItem implements Block { + + public InAVM2Item expression; + public List commands; + private boolean labelUsed; + + @Override + public List> getSubs() { + List> ret = new ArrayList<>(); + if (commands != null) { + ret.add(commands); + } + return ret; + } + + public ForInAVM2Item(GraphSourceItem instruction, Loop loop, InAVM2Item expression, List commands) { + super(instruction, loop); + if (!commands.isEmpty()) { + GraphTargetItem firstAssign = commands.get(0); + if (firstAssign instanceof SetTypeAVM2Item) { + if (expression.object instanceof LocalRegAVM2Item) { + if (((SetTypeAVM2Item) firstAssign).getValue().getNotCoerced() instanceof LocalRegAVM2Item) { + if (((LocalRegAVM2Item) ((SetTypeAVM2Item) firstAssign).getValue().getNotCoerced()).regIndex == ((LocalRegAVM2Item) expression.object).regIndex) { + commands.remove(0); + expression.object = ((SetTypeAVM2Item) firstAssign).getObject(); + } + } + + } + //locAssign. + } + } + this.expression = expression; + this.commands = commands; + } + + @Override + public boolean needsSemicolon() { + return false; + } + + @Override + public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { + if (writer instanceof NulWriter) { + ((NulWriter) writer).startLoop(loop.id, LoopWithType.LOOP_TYPE_LOOP); + } + if (labelUsed) { + writer.append("loop" + loop.id + ":").newLine(); + } + writer.append("for"); + if (writer.getFormatting().spaceBeforeParenthesesForParentheses) { + writer.append(" "); + } + writer.append("("); + expression.toString(writer, localData); + writer.append(")").startBlock(); + for (GraphTargetItem ti : commands) { + if (!ti.isEmpty()) { + ti.toStringSemicoloned(writer, localData).newLine(); + } + } + writer.endBlock(); + if (writer instanceof NulWriter) { + LoopWithType loopOjb = ((NulWriter) writer).endLoop(loop.id); + labelUsed = loopOjb.used; + } + return writer; + } + + @Override + public List getContinues() { + List ret = new ArrayList<>(); + for (GraphTargetItem ti : commands) { + if (ti instanceof ContinueItem) { + ret.add((ContinueItem) ti); + } + if (ti instanceof Block) { + ret.addAll(((Block) ti).getContinues()); + } + } + return ret; + } + + @Override + public boolean hasReturnValue() { + return false; + } + + @Override + public GraphTargetItem returnType() { + return TypeItem.UNBOUNDED; + } + + @Override + public List toSource(SourceGeneratorLocalData localData, SourceGenerator generator) throws CompilationException { + return ((AVM2SourceGenerator) generator).generate(localData, this); + } +} diff --git a/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/TryAVM2Item.java b/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/TryAVM2Item.java index 8b6be6918..6354ba810 100644 --- a/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/TryAVM2Item.java +++ b/src/com/jpexs/decompiler/flash/abc/avm2/model/clauses/TryAVM2Item.java @@ -66,43 +66,34 @@ public class TryAVM2Item extends AVM2Item implements Block { @Override public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { - writer.append("try").newLine(); - writer.append("{").newLine(); - writer.indent(); + writer.append("try").startBlock(); for (GraphTargetItem ti : tryCommands) { if (!ti.isEmpty()) { ti.toStringSemicoloned(writer, localData).newLine(); } - } - writer.unindent(); - writer.append("}"); + } + writer.endBlock(); for (int e = 0; e < catchExceptions.size(); e++) { writer.newLine(); writer.append("catch(" + catchExceptions.get(e).getVarName(localData.constantsAvm2, localData.fullyQualifiedNames) + ":" + catchExceptions.get(e).getTypeName(localData.constantsAvm2, localData.fullyQualifiedNames) + ")"); - writer.newLine(); - writer.append("{").newLine(); - writer.indent(); + writer.startBlock(); List commands = catchCommands.get(e); for (GraphTargetItem ti : commands) { if (!ti.isEmpty()) { ti.toStringSemicoloned(writer, localData).newLine(); } } - writer.unindent(); - writer.append("}"); + writer.endBlock(); } if (finallyCommands.size() > 0) { writer.newLine(); - writer.append("finally").newLine(); - writer.append("{").newLine(); - writer.indent(); + writer.append("finally").startBlock(); for (GraphTargetItem ti : finallyCommands) { if (!ti.isEmpty()) { ti.toStringSemicoloned(writer, localData).newLine(); } } - writer.unindent(); - writer.append("}"); + writer.endBlock(); } return writer; } diff --git a/src/com/jpexs/decompiler/flash/abc/types/traits/TraitMethodGetterSetter.java b/src/com/jpexs/decompiler/flash/abc/types/traits/TraitMethodGetterSetter.java index 7aaadd745..b08c28ac1 100644 --- a/src/com/jpexs/decompiler/flash/abc/types/traits/TraitMethodGetterSetter.java +++ b/src/com/jpexs/decompiler/flash/abc/types/traits/TraitMethodGetterSetter.java @@ -96,11 +96,11 @@ public class TraitMethodGetterSetter extends Trait { if (classIndex != -1 && abc.instance_info.get(classIndex).isInterface() || bodyIndex == -1) { writer.appendNoHilight(";"); } else { - writer.appendNoHilight(" {").newLine(); + writer.startBlock(); if (bodyIndex != -1) { abc.bodies.get(bodyIndex).toString(path, exportMode, isStatic, scriptIndex, classIndex, abc, this, abc.constants, abc.method_info, new Stack(), false, writer, fullyQualifiedNames, null); - } - writer.appendNoHilight("}"); + } + writer.endBlock(); } writer.newLine(); return writer;