From 90bf2057fefb4f42563fe69cef58bf4be257d7e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Mon, 25 Jan 2021 21:34:21 +0100 Subject: [PATCH] AS3 p-code more RAbcDasm like: lookupswitch caseoffsets in brackets --- CHANGELOG.md | 1 + .../avm2/instructions/AVM2Instruction.java | 10 ++++-- .../abc/avm2/parser/pcode/ASM3Parser.java | 34 +++++++++++++------ 3 files changed, 32 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2339e1177..62ffb843b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,7 @@ All notable changes to this project will be documented in this file. - AS3 test methods separated to classes - AS3 p-code more RAbcDasm like: parenthesis after True/False/Undefined/Null trait kinds - AS3 p-code more RAbcDasm like: commas in parameters list (WARNING: Breaks backward compatibility) +- AS3 p-code more RAbcDasm like: lookupswitch caseoffsets in brackets ### Removed - Code structure detection in Graphviz graphs as it was usually wrong diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/AVM2Instruction.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/AVM2Instruction.java index 9578de898..b040175ae 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/AVM2Instruction.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/AVM2Instruction.java @@ -336,13 +336,17 @@ public class AVM2Instruction implements Cloneable, GraphSourceItem { s.append(Helper.formatAddress(address + operands[i])); break; case AVM2Code.OPT_CASE_OFFSETS: - s.append(" "); - s.append(operands[i]); + s.append(" ["); + boolean first = true; for (int j = i + 1; j < operands.length; j++) { - s.append(" "); + if (!first) { + s.append(", "); + } + first = false; s.append("ofs"); s.append(Helper.formatAddress(address + operands[j])); } + s.append("]"); break; default: s.append(" "); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/pcode/ASM3Parser.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/pcode/ASM3Parser.java index ca08f78f8..1d8f3bffb 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/pcode/ASM3Parser.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/pcode/ASM3Parser.java @@ -1025,21 +1025,35 @@ public class ASM3Parser { break; case AVM2Code.OPT_CASE_OFFSETS: - if (parsedOperand.type == ParsedSymbol.TYPE_INTEGER) { - int patCount = (int) (long) (Long) parsedOperand.value; - operandsList.add(patCount); + if (parsedOperand.type == ParsedSymbol.TYPE_BRACKET_OPEN) { + parsedOperand = lexer.lex(); - for (int c = 0; c <= patCount; c++) { + int c = 0; + while (parsedOperand.type == ParsedSymbol.TYPE_IDENTIFIER) { + offsetItems.add(new CaseOffsetItem((String) parsedOperand.value, code.code.size(), i + (c + 1))); + c++; parsedOperand = lexer.lex(); - if (parsedOperand.type == ParsedSymbol.TYPE_IDENTIFIER) { - offsetItems.add(new CaseOffsetItem((String) parsedOperand.value, code.code.size(), i + (c + 1))); - operandsList.add(0); - } else { - throw new AVM2ParseException("Offset expected", lexer.yyline()); + if (parsedOperand.type == ParsedSymbol.TYPE_BRACKET_CLOSE) { + break; } + if (parsedOperand.type != ParsedSymbol.TYPE_COMMA) { + throw new AVM2ParseException("Comma , expected", lexer.yyline()); + } + parsedOperand = lexer.lex(); + } + if (parsedOperand.type != ParsedSymbol.TYPE_BRACKET_CLOSE) { + throw new AVM2ParseException("Bracket close ] expected", lexer.yyline()); + } + if (c == 0) { + throw new AVM2ParseException("At least single offset expected", lexer.yyline()); + } + + operandsList.add(c - 1); + for (int d = 0; d < c; d++) { + operandsList.add(0); } } else { - throw new AVM2ParseException("Case count expected", lexer.yyline()); + throw new AVM2ParseException("Bracket open [ expected", lexer.yyline()); } break; case AVM2Code.OPT_S8: