From 0c988bb7ae6b0b99629828eb0bbd09956b58974a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Thu, 18 Jan 2018 06:18:04 +0100 Subject: [PATCH 01/58] format_release_info - option to hide images --- travis/format_release_info.php | 42 ++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/travis/format_release_info.php b/travis/format_release_info.php index 7c596f19d..02712b756 100644 --- a/travis/format_release_info.php +++ b/travis/format_release_info.php @@ -133,13 +133,24 @@ function get_changelog_section($changelog_file, $section_name) { return $x; } +$do_images = true; + +if($do_images) +{ $ossupport_map=[ "windows" => "Works on Windows", "linux" => "Works on Linux", "macosx" => "Works with Mac OSX", "java" => "Works on java" ]; - +}else{ +$ossupport_map=[ + "windows" => "Win", + "linux" => "Lin", + "macosx" => "Mac", + "java" => "Java" + ]; +} $ICONS_URL = "https://github.com/jindrapetrik/jpexs-decompiler/wiki/images"; @@ -151,16 +162,37 @@ $body .= "## Downloads:\n". "| Name | File | OS |\n". "|---|---|---|\n"; + + $footer_links = []; foreach ($files as $f) { - $footer_links[$f["type_icon"]."_icon"] = $ICONS_URL."/downloads/16/".$f["type_icon"].".png"; + if($do_images) { + $footer_links[$f["type_icon"]."_icon"] = $ICONS_URL."/downloads/16/".$f["type_icon"].".png"; + } $footer_links[$f["file_name"]] = 'https://github.com/'.$github_repo.'/releases/download/'.$version_tag.'/'.$f["file_name"]; - $body .= "| **".$f["type_name"]."** | ![".$f["type_name"]."][".$f["type_icon"]."_icon] [".$f["file_name"]."] | "; + $body .= "| **".$f["type_name"]."** | "; + if($do_images) + { + $body .= "![".$f["type_name"]."][".$f["type_icon"]."_icon]"; + } + $body .= " [".$f["file_name"]."] | "; + $ossup_titles = []; foreach ($f["ossupport"] as $ossupport) { - $footer_links[$ossupport."_icon"] = $ICONS_URL."/os/24/".$ossupport.".png"; + if($do_images) + { + $footer_links[$ossupport."_icon"] = $ICONS_URL."/os/24/".$ossupport.".png"; + } $ossupport_title = $ossupport_map[$ossupport]; - $body .= "![".$ossupport_title."][".$ossupport."_icon]"; + $ossup_titles[] = $ossupport_title; + if($do_images) + { + $body .= "![".$ossupport_title."][".$ossupport."_icon]"; + } + } + if(!$do_images) + { + $body .= implode(", ",$ossup_titles); } $body .= " |\n"; } From 4c9380257ad6a76f1d4e8a95fd7270a4e6da260c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Thu, 18 Jan 2018 06:26:53 +0100 Subject: [PATCH 02/58] release info - nightly prerelease is marked prerelease --- travis/format_release_info.php | 14 +++++++++++++- travis/script.sh | 2 +- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/travis/format_release_info.php b/travis/format_release_info.php index 02712b756..b846b75f9 100644 --- a/travis/format_release_info.php +++ b/travis/format_release_info.php @@ -157,6 +157,13 @@ $ICONS_URL = "https://github.com/jindrapetrik/jpexs-decompiler/wiki/images"; $body = ""; +$is_prerelease = $changelog_section === "Unreleased"; + +if($is_prerelease) { + $body .= "## Prerelease WARNING\n". + "**This is prerelease nightly version. It should *NOT* be considered as stable.**\n\n"; +} + $body .= "## Downloads:\n". "\n". "| Name | File | OS |\n". @@ -225,7 +232,12 @@ if($changelog_data === false) } $body .= "\n"; -$body .= "## What's new:\n"; +if($is_prerelease) +{ + $body .= "## What's new since last stable version:\n"; +}else{ + $body .= "## What's new:\n"; +} $body .= $changelog_data; $body .= "\n"; foreach($footer_links as $title=>$link) diff --git a/travis/script.sh b/travis/script.sh index 836c02d9b..ee651939b 100644 --- a/travis/script.sh +++ b/travis/script.sh @@ -97,7 +97,7 @@ else export DEPLOY_FILEVER_TAG="${VERSION_NUMBER}_nightly${NEXT_NIGHTLY_VER}" export DEPLOY_RELEASE_TO_REMOVE=$LAST_NIGHTLY_TAG export DEPLOY_TAG_NAME=$NEXT_NIGHTLY_TAG - export DEPLOY_VERSION_NAME="version $LAST_STABLE_VER nightly $NEXT_NIGHTLY_VER" + export DEPLOY_VERSION_NAME="(PREVIEW) version $LAST_STABLE_VER nightly $NEXT_NIGHTLY_VER" export DEPLOY_DESCRIPTION=`php ./travis/format_release_info.php -filever $DEPLOY_FILEVER_TAG Unreleased $DEPLOY_TAG_NAME ./CHANGELOG.md "$TRAVIS_REPO_SLUG"` export DEPLOY_COMMITISH="dev" export DEPLOY_PRERELEASE=true From 54d9bc6b8c236e0bec62fd096e19637b31dd8367 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Thu, 18 Jan 2018 06:30:32 +0100 Subject: [PATCH 03/58] Unreleased section in CHANGELOG --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d4fdb3ad0..d390b0b7f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,8 @@ # Change Log All notable changes to this project will be documented in this file. +## [Unreleased] + ## [11.0.0] - 2018-01-17 ### Added - [#1240] AS search using multiple threads when parallel speedup is enabled From c842b17a0cc9abfc1a74192fbfe1161c322d5388 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Thu, 18 Jan 2018 09:51:52 +0100 Subject: [PATCH 04/58] Nightly build release info generation updated when Unreleased section is empty --- travis/format_release_info.php | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/travis/format_release_info.php b/travis/format_release_info.php index b846b75f9..12149de10 100644 --- a/travis/format_release_info.php +++ b/travis/format_release_info.php @@ -129,6 +129,9 @@ function get_changelog_section($changelog_file, $section_name) { if ($x === false) { return false; } + if(trim($x) === "") { //No Unreleased version data for example + return ""; + } $x = substr($x, strpos($x, "\n") + 1); //from start of the line return $x; } @@ -212,6 +215,11 @@ foreach ($files as $f) { } $changelog_data = get_changelog_section($changelog_path,$changelog_section); +if($changelog_data === false) +{ + fwrite(STDERR, "Cannot load changelog data\n"); + exit(1); +} $full_changelog = file_get_contents($changelog_path); if(preg_match_all('/\[([^\]]+)\][^(]/', $changelog_data."\n",$m)) { @@ -225,11 +233,6 @@ if(preg_match_all('/\[([^\]]+)\][^(]/', $changelog_data."\n",$m)) } } -if($changelog_data === false) -{ - fwrite(STDERR, "Cannot load changelog data\n"); - exit(1); -} $body .= "\n"; if($is_prerelease) @@ -238,6 +241,11 @@ if($is_prerelease) }else{ $body .= "## What's new:\n"; } +if($changelog_data === "") +{ + $body .= "No notable changes yet\n"; +} + $body .= $changelog_data; $body .= "\n"; foreach($footer_links as $title=>$link) From 56302e6e9048b68f58866757dc1bfd48fe921690 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Thu, 18 Jan 2018 09:55:49 +0100 Subject: [PATCH 05/58] Nightly build release info generation updated when Unreleased section is missing --- travis/format_release_info.php | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/travis/format_release_info.php b/travis/format_release_info.php index 12149de10..a1ca3ede5 100644 --- a/travis/format_release_info.php +++ b/travis/format_release_info.php @@ -217,8 +217,16 @@ foreach ($files as $f) { $changelog_data = get_changelog_section($changelog_path,$changelog_section); if($changelog_data === false) { - fwrite(STDERR, "Cannot load changelog data\n"); - exit(1); + if($is_prerelease) + { + //[Unreleased section may be missing] + $changelog_data = ""; + } + else + { + fwrite(STDERR, "Cannot load changelog data\n"); + exit(1); + } } $full_changelog = file_get_contents($changelog_path); if(preg_match_all('/\[([^\]]+)\][^(]/', $changelog_data."\n",$m)) From fc19983ae9948e165b4066143a4637846435935c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sat, 20 Jan 2018 21:09:27 +0100 Subject: [PATCH 06/58] loading list of fonts on demand - X11 load bug on Java9 --- .../flash/tags/DefineEditTextTag.java | 5 +-- .../decompiler/flash/tags/base/FontTag.java | 36 +++++++++++++++---- .../tags/base/MissingCharacterHandler.java | 7 ++-- .../decompiler/flash/xfl/XFLConverter.java | 11 +++--- .../jpexs/decompiler/flash/gui/FontPanel.java | 6 ++-- .../jpexs/decompiler/flash/gui/MainPanel.java | 2 +- 6 files changed, 47 insertions(+), 20 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineEditTextTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineEditTextTag.java index 3013c2ee0..ebe7e7f7e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineEditTextTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DefineEditTextTag.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.tags; import com.jpexs.decompiler.flash.SWF; @@ -1023,7 +1024,7 @@ public class DefineEditTextTag extends TextTag { ge.glyphIndex = -1; // always use system character glyphs in edit text - String fontName = ge.fontFace != null ? ge.fontFace : FontTag.defaultFontName; + String fontName = ge.fontFace != null ? ge.fontFace : FontTag.getDefaultFontName(); int fontStyle = font == null ? ge.fontStyle : font.getFontStyle(); ge.glyphAdvance = (int) Math.round(SWF.unitDivisor * FontTag.getSystemFontAdvance(fontName, fontStyle, (int) (lastStyle.fontHeight / SWF.unitDivisor), c, nextChar)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/FontTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/FontTag.java index 8975c6a35..b1ef5443d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/FontTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/FontTag.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.tags.base; import com.jpexs.decompiler.flash.SWF; @@ -121,14 +122,19 @@ public abstract class FontTag extends DrawableTag implements AloneTag { return fontNameTag.fontCopyright; } - public static Map> installedFontsByFamily; + private static Map> installedFontsByFamily; - public static Map installedFontsByName; + private static Map installedFontsByName; - public static String defaultFontName; + private static String defaultFontName; - static { - reload(); + private static boolean firstLoaded = false; + + private static void ensureLoaded() { + if (!firstLoaded) { + reload(); + } + firstLoaded = true; } public int getFontId() { @@ -259,6 +265,11 @@ public abstract class FontTag extends DrawableTag implements AloneTag { return gm.getAdvanceX(); } + public static String getDefaultFontName() { + ensureLoaded(); + return defaultFontName; + } + public static void reload() { installedFontsByFamily = FontHelper.getInstalledFonts(); installedFontsByName = new HashMap<>(); @@ -279,6 +290,7 @@ public abstract class FontTag extends DrawableTag implements AloneTag { } public static String getFontNameWithFallback(String fontName) { + ensureLoaded(); if (installedFontsByFamily.containsKey(fontName)) { return fontName; } @@ -307,6 +319,7 @@ public abstract class FontTag extends DrawableTag implements AloneTag { } public static String findInstalledFontName(String fontName) { + ensureLoaded(); if (installedFontsByName.containsKey(fontName)) { return fontName; } @@ -413,4 +426,15 @@ public abstract class FontTag extends DrawableTag implements AloneTag { public FontTag toClassicFont() { return this; } + + public static Map> getInstalledFontsByFamily() { + ensureLoaded(); + return installedFontsByFamily; + } + + public static Map getInstalledFontsByName() { + ensureLoaded(); + return installedFontsByName; + } + } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/MissingCharacterHandler.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/MissingCharacterHandler.java index f9e9b45b3..4174a0de5 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/MissingCharacterHandler.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/MissingCharacterHandler.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.tags.base; import java.awt.Font; @@ -30,10 +31,10 @@ public class MissingCharacterHandler { public boolean handle(TextTag textTag, FontTag font, char character) { String fontName = font.getFontNameIntag(); - if (!FontTag.installedFontsByFamily.containsKey(fontName)) { + if (!FontTag.getInstalledFontsByFamily().containsKey(fontName)) { return false; } - Map faces = FontTag.installedFontsByFamily.get(fontName); + Map faces = FontTag.getInstalledFontsByFamily().get(fontName); Font f = null; for (String face : faces.keySet()) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/XFLConverter.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/XFLConverter.java index 518914081..6ca70db83 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/XFLConverter.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/xfl/XFLConverter.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.xfl; import com.jpexs.decompiler.flash.AbortRetryIgnoreHandler; @@ -2358,7 +2359,7 @@ public class XFLConverter { fontName = font.getFontNameIntag(); } if (fontName == null) { - fontName = FontTag.defaultFontName; + fontName = FontTag.getDefaultFontName(); } int fontStyle = font.getFontStyle(); String installedFont; @@ -3035,7 +3036,7 @@ public class XFLConverter { fontName = font.getFontNameIntag(); } if (fontName == null) { - fontName = FontTag.defaultFontName; + fontName = FontTag.getDefaultFontName(); } int fontStyle = 0; if (font != null) { @@ -3197,7 +3198,7 @@ public class XFLConverter { fontName = ft.getFontNameIntag(); } if (fontName == null) { - fontName = FontTag.defaultFontName; + fontName = FontTag.getDefaultFontName(); } italic = ft.isItalic(); bold = ft.isBold(); @@ -3934,7 +3935,7 @@ public class XFLConverter { fontName = ft.getFontNameIntag(); } if (fontName == null) { - fontName = FontTag.defaultFontName; + fontName = FontTag.getDefaultFontName(); } italic = ft.isItalic(); bold = ft.isBold(); diff --git a/src/com/jpexs/decompiler/flash/gui/FontPanel.java b/src/com/jpexs/decompiler/flash/gui/FontPanel.java index 1fe3c9fe7..d43296056 100644 --- a/src/com/jpexs/decompiler/flash/gui/FontPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/FontPanel.java @@ -92,7 +92,7 @@ public class FontPanel extends JPanel { public static ComboBoxModel getFamilyModel() { Set famSet = new TreeSet<>(); - for (Font f : FontTag.installedFontsByName.values()) { + for (Font f : FontTag.getInstalledFontsByName().values()) { famSet.add(new FontFamily(f)); } return new DefaultComboBoxModel<>(new Vector<>(famSet)); @@ -101,7 +101,7 @@ public class FontPanel extends JPanel { public static ComboBoxModel getFaceModel(FontFamily family) { Set faceSet = new TreeSet<>(); - for (Font f : FontTag.installedFontsByFamily.get(family.familyEn).values()) { + for (Font f : FontTag.getInstalledFontsByFamily().get(family.familyEn).values()) { faceSet.add(new FontFace(f)); } @@ -403,7 +403,7 @@ public class FontPanel extends JPanel { fontFamilyNameSelection.setPreferredSize(new Dimension(100, fontFamilyNameSelection.getMinimumSize().height)); fontFamilyNameSelection.setModel(getFamilyModel()); - fontFamilyNameSelection.setSelectedItem(FontTag.defaultFontName); + fontFamilyNameSelection.setSelectedItem(FontTag.getDefaultFontName()); fontFaceSelection.setModel(getFaceModel((FontFamily) fontFamilyNameSelection.getSelectedItem())); fontFamilyNameSelection.addItemListener(new ItemListener() { @Override diff --git a/src/com/jpexs/decompiler/flash/gui/MainPanel.java b/src/com/jpexs/decompiler/flash/gui/MainPanel.java index 2f2f1f76a..e645319ac 100644 --- a/src/com/jpexs/decompiler/flash/gui/MainPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/MainPanel.java @@ -2676,7 +2676,7 @@ public final class MainPanel extends JPanel implements TreeSelectionListener, Se if (fontName == null) { fontName = font.getFontName(); } - final Font f = FontTag.installedFontsByName.get(fontName); + final Font f = FontTag.getInstalledFontsByName().get(fontName); if (f == null || !f.canDisplay(character)) { String msg = translate("error.font.nocharacter").replace("%char%", "" + character); logger.log(Level.SEVERE, "{0} FontId: {1} TextId: {2}", new Object[]{msg, font.getCharacterId(), textTag.getCharacterId()}); From d0e2fc0955ae2f77572126369fd86cf6f93f6806 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sat, 20 Jan 2018 21:16:14 +0100 Subject: [PATCH 07/58] Update changelog --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d390b0b7f..371f61643 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ All notable changes to this project will be documented in this file. ## [Unreleased] +### Fixed +- Accessing font list on demand - prevents loading X11 on systems without UI ## [11.0.0] - 2018-01-17 ### Added From 1e16fbb6e038faa6e4a2b4ab64186693a2fedd99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sat, 20 Jan 2018 21:13:34 +0100 Subject: [PATCH 08/58] ActionScript 2 - better class detection --- .../jpexs/decompiler/flash/action/Action.java | 227 ++++++++++-------- 1 file changed, 127 insertions(+), 100 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java index b830c8d36..c3adc4a2e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.action; import com.jpexs.decompiler.flash.AppResources; @@ -1231,118 +1232,144 @@ public abstract class Action implements GraphSourceItem { if (it.expression instanceof NotItem) { NotItem nti = (NotItem) it.expression; if ((nti.value instanceof GetMemberActionItem) || (nti.value instanceof GetVariableActionItem)) { - if (true) { //it.onFalse.isEmpty()){ //||(it.onFalse.get(0) instanceof UnsupportedActionItem)) { - if ((it.onTrue.size() == 1) && (it.onTrue.get(0) instanceof SetMemberActionItem) && (((SetMemberActionItem) it.onTrue.get(0)).value instanceof NewObjectActionItem)) { - // ignore - } else { - List parts = it.onTrue; - className = getWithoutGlobal(nti.value); - if (parts.size() >= 1) { - int ipos = 0; - - while ((parts.get(ipos) instanceof PopItem) || ((parts.get(ipos) instanceof IfItem) && ((((IfItem) parts.get(ipos)).onTrue.size() == 1) && (((IfItem) parts.get(ipos)).onTrue.get(0) instanceof SetMemberActionItem) && (((SetMemberActionItem) ((IfItem) parts.get(ipos)).onTrue.get(0)).value instanceof NewObjectActionItem)))) { - ipos++; - } - if (parts.get(ipos) instanceof ExtendsActionItem) { - ExtendsActionItem et = (ExtendsActionItem) parts.get(ipos); - extendsOp = getWithoutGlobal(et.superclass); - ipos++; - } - if (parts.get(ipos) instanceof StoreRegisterActionItem) { - StoreRegisterActionItem sr = (StoreRegisterActionItem) parts.get(ipos); - int instanceReg = sr.register.number; - if (sr.value instanceof GetMemberActionItem) { - GetMemberActionItem gm = (GetMemberActionItem) sr.value; - //gm.memberName should be "prototype" - if (gm.object instanceof TemporaryRegister) { - TemporaryRegister tm = (TemporaryRegister) gm.object; - int classReg = tm.getRegId(); - if (tm.value instanceof SetMemberActionItem) { - SetMemberActionItem sm = (SetMemberActionItem) tm.value; - if (sm.value instanceof StoreRegisterActionItem) { - sr = (StoreRegisterActionItem) sm.value; - if (sr.value instanceof FunctionActionItem) { - ((FunctionActionItem) (sr.value)).calculatedFunctionName = (className instanceof GetMemberActionItem) ? ((GetMemberActionItem) className).memberName : className; - functions.add((FunctionActionItem) sr.value); - - for (; ipos < parts.size(); ipos++) { - if (parts.get(ipos) instanceof ImplementsOpActionItem) { - ImplementsOpActionItem io = (ImplementsOpActionItem) parts.get(ipos); - implementsOp = io.superclasses; - continue; - } - if (parts.get(ipos) instanceof SetMemberActionItem) { - sm = (SetMemberActionItem) parts.get(ipos); - int rnum = -1; - if (sm.object instanceof DirectValueActionItem) { - DirectValueActionItem dv = (DirectValueActionItem) sm.object; - if (dv.value instanceof RegisterNumber) { - RegisterNumber rn = (RegisterNumber) dv.value; - rnum = rn.number; - } - } - if (sm.object instanceof TemporaryRegister) { - rnum = ((TemporaryRegister) sm.object).getRegId(); - } - if (rnum == instanceReg) { - if (sm.value instanceof FunctionActionItem) { - ((FunctionActionItem) sm.value).calculatedFunctionName = sm.objectName; - functions.add((FunctionActionItem) sm.value); - } else { - vars.add(new MyEntry<>(sm.objectName, sm.value)); - } - } else if (rnum == classReg) { - if (sm.value instanceof FunctionActionItem) { - ((FunctionActionItem) sm.value).calculatedFunctionName = sm.objectName; - staticFunctions.add((FunctionActionItem) sm.value); - } else { - staticVars.add(new MyEntry<>(sm.objectName, sm.value)); - } - } - - } - } - - } + if ((it.onTrue.size() == 1) && (it.onTrue.get(0) instanceof SetMemberActionItem) && (((SetMemberActionItem) it.onTrue.get(0)).value instanceof NewObjectActionItem)) { + // ignore + } else { + List parts = it.onTrue; + className = getWithoutGlobal(nti.value); + if (parts.size() >= 1) { + int ipos = 0; + while ((parts.get(ipos) instanceof PopItem) || ((parts.get(ipos) instanceof IfItem) && ((((IfItem) parts.get(ipos)).onTrue.size() == 1) && (((IfItem) parts.get(ipos)).onTrue.get(0) instanceof SetMemberActionItem) && (((SetMemberActionItem) ((IfItem) parts.get(ipos)).onTrue.get(0)).value instanceof NewObjectActionItem)))) { + ipos++; + } + if (parts.get(ipos) instanceof ExtendsActionItem) { + ExtendsActionItem et = (ExtendsActionItem) parts.get(ipos); + extendsOp = getWithoutGlobal(et.superclass); + ipos++; + } + int instanceReg = -1; + int classReg = -1; + if (parts.get(ipos) instanceof StoreRegisterActionItem) { + StoreRegisterActionItem sr = (StoreRegisterActionItem) parts.get(ipos); + instanceReg = sr.register.number; + if (sr.value instanceof GetMemberActionItem) { + GetMemberActionItem gm = (GetMemberActionItem) sr.value; + //gm.memberName should be "prototype" + if (gm.object instanceof TemporaryRegister) { + TemporaryRegister tm = (TemporaryRegister) gm.object; + classReg = tm.getRegId(); + if (tm.value instanceof SetMemberActionItem) { + SetMemberActionItem sm = (SetMemberActionItem) tm.value; + if (sm.value instanceof StoreRegisterActionItem) { + sr = (StoreRegisterActionItem) sm.value; + if (sr.value instanceof FunctionActionItem) { + ((FunctionActionItem) (sr.value)).calculatedFunctionName = (className instanceof GetMemberActionItem) ? ((GetMemberActionItem) className).memberName : className; + functions.add((FunctionActionItem) sr.value); } + } - List output2 = new ArrayList<>(); - for (int i = 0; i < prevCount; i++) { - output2.add(output.get(i)); - } - output2.add(new ClassActionItem(className, extendsOp, implementsOp, null/*FIXME*/, functions, vars, staticFunctions, staticVars)); - return output2; } } - } else if (parts.get(ipos) instanceof SetMemberActionItem) { - SetMemberActionItem sm = (SetMemberActionItem) parts.get(0); - if (sm.value instanceof FunctionActionItem) { - FunctionActionItem f = (FunctionActionItem) sm.value; - if (f.actions.isEmpty()) { - if (parts.size() == 2) { - if (parts.get(1) instanceof ImplementsOpActionItem) { - ImplementsOpActionItem iot = (ImplementsOpActionItem) parts.get(1); - implementsOp = iot.superclasses; - } else { - //ok = false; - break; + } + } else if (parts.get(ipos) instanceof SetMemberActionItem) { + SetMemberActionItem sm = (SetMemberActionItem) parts.get(0); + if (sm.value instanceof FunctionActionItem) { + FunctionActionItem f = (FunctionActionItem) sm.value; + if (f.actions.isEmpty()) { + if (parts.size() == 2) { + if (parts.get(1) instanceof ImplementsOpActionItem) { + ImplementsOpActionItem iot = (ImplementsOpActionItem) parts.get(1); + implementsOp = iot.superclasses; + } else { + //ok = false; + break; + } + } + List output2 = new ArrayList<>(); + for (int i = 0; i < prevCount; i++) { + output2.add(output.get(i)); + } + output2.add(new InterfaceActionItem(sm.objectName, implementsOp)); + return output2; + } + } + } + + GraphTargetItem constructor = null; + for (; ipos < parts.size(); ipos++) { + if (parts.get(ipos) instanceof ImplementsOpActionItem) { + ImplementsOpActionItem io = (ImplementsOpActionItem) parts.get(ipos); + implementsOp = io.superclasses; + continue; + } + if (parts.get(ipos) instanceof SetMemberActionItem) { + SetMemberActionItem sm = (SetMemberActionItem) parts.get(ipos); + + if (sm.object instanceof TemporaryRegister) { + TemporaryRegister treg = (TemporaryRegister) sm.object; + if (classReg > -1 && treg.getRegId() == classReg) { + + } else if (instanceReg > -1 && treg.getRegId() == instanceReg) { + + } else if (sm.object.value instanceof SetMemberActionItem) { + SetMemberActionItem sm2 = (SetMemberActionItem) sm.object.value; + if ((sm2.objectName instanceof DirectValueActionItem) && "prototype".equals(((DirectValueActionItem) sm2.objectName).getAsString())) { + classReg = treg.getRegId(); + extendsOp = getWithoutGlobal(sm2.object); + } else { + instanceReg = treg.getRegId(); + GraphTargetItem val = sm2.value; + if (val instanceof StoreRegisterActionItem) { + val = val.value; + } + if (val instanceof FunctionActionItem) { + constructor = val; + ((FunctionActionItem) (constructor)).calculatedFunctionName = (className instanceof GetMemberActionItem) ? ((GetMemberActionItem) className).memberName : className; } } - List output2 = new ArrayList<>(); - for (int i = 0; i < prevCount; i++) { - output2.add(output.get(i)); - } - output2.add(new InterfaceActionItem(sm.objectName, implementsOp)); - return output2; + } + + } + + int rnum = -1; + if (sm.object instanceof DirectValueActionItem) { + DirectValueActionItem dv = (DirectValueActionItem) sm.object; + if (dv.value instanceof RegisterNumber) { + RegisterNumber rn = (RegisterNumber) dv.value; + rnum = rn.number; + } + } + if (sm.object instanceof TemporaryRegister) { + rnum = ((TemporaryRegister) sm.object).getRegId(); + } + if (rnum == instanceReg) { + if (sm.value instanceof FunctionActionItem) { + ((FunctionActionItem) sm.value).calculatedFunctionName = sm.objectName; + functions.add((FunctionActionItem) sm.value); + } else { + vars.add(new MyEntry<>(sm.objectName, sm.value)); + } + } else if (rnum == classReg) { + if (sm.value instanceof FunctionActionItem) { + ((FunctionActionItem) sm.value).calculatedFunctionName = sm.objectName; + staticFunctions.add((FunctionActionItem) sm.value); + } else { + staticVars.add(new MyEntry<>(sm.objectName, sm.value)); } } } } + List output2 = new ArrayList<>(); + for (int i = 0; i < prevCount; i++) { + output2.add(output.get(i)); + } + output2.add(new ClassActionItem(className, extendsOp, implementsOp, constructor, functions, vars, staticFunctions, staticVars)); + return output2; + } - } else { - //ok = false; } + } else { ok = false; } From 4a64670494b7453fc2b747fa8213a0f5a4de612c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sat, 20 Jan 2018 21:46:57 +0100 Subject: [PATCH 09/58] AS2 Class detection - Switch instance reg and class reg --- .../src/com/jpexs/decompiler/flash/action/Action.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java index c3adc4a2e..a06470fc8 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java @@ -1315,10 +1315,10 @@ public abstract class Action implements GraphSourceItem { } else if (sm.object.value instanceof SetMemberActionItem) { SetMemberActionItem sm2 = (SetMemberActionItem) sm.object.value; if ((sm2.objectName instanceof DirectValueActionItem) && "prototype".equals(((DirectValueActionItem) sm2.objectName).getAsString())) { - classReg = treg.getRegId(); + instanceReg = treg.getRegId(); extendsOp = getWithoutGlobal(sm2.object); } else { - instanceReg = treg.getRegId(); + classReg = treg.getRegId(); GraphTargetItem val = sm2.value; if (val instanceof StoreRegisterActionItem) { val = val.value; From 16f6fa329cfe58d17ffa5a475dd6abe14f60f245 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 21 Jan 2018 08:16:09 +0100 Subject: [PATCH 10/58] AS2 test data: - added class for getter/setter testing - added class for vars/methods testing --- libsrc/ffdec_lib/testdata/as2/as2.fla | Bin 1085913 -> 1086014 bytes libsrc/ffdec_lib/testdata/as2/as2.swf | Bin 25991 -> 26590 bytes .../as2/com/jpexs/TestCallSetterGetter.as | 18 ++++++++++ .../as2/com/jpexs/TestSetterGetter.as | 34 ++++++++++++++++++ .../testdata/as2/com/jpexs/TestVarsMethods.as | 18 ++++++++++ 5 files changed, 70 insertions(+) create mode 100644 libsrc/ffdec_lib/testdata/as2/com/jpexs/TestCallSetterGetter.as create mode 100644 libsrc/ffdec_lib/testdata/as2/com/jpexs/TestSetterGetter.as create mode 100644 libsrc/ffdec_lib/testdata/as2/com/jpexs/TestVarsMethods.as diff --git a/libsrc/ffdec_lib/testdata/as2/as2.fla b/libsrc/ffdec_lib/testdata/as2/as2.fla index 72b8eca2ac0e3e6e327561248d696e664c32eaf7..e58e46ddeecf5ad7723d60dda18c3c88495d10a9 100644 GIT binary patch delta 17333 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∾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 BC+7eF delta 17261 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 Date: Sun, 21 Jan 2018 08:20:39 +0100 Subject: [PATCH 11/58] AS2 classes - maintain order of variables, maintain order of methods, variables before methods - stub for getters/setters detection --- .../jpexs/decompiler/flash/action/Action.java | 117 ++++++++++++++---- .../action/model/clauses/ClassActionItem.java | 105 ++++++++-------- .../model/clauses/InterfaceActionItem.java | 6 +- .../parser/script/ActionScript2Parser.java | 32 ++--- .../parser/script/ActionSourceGenerator.java | 60 +++++---- 5 files changed, 198 insertions(+), 122 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java index a06470fc8..2f813f080 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java @@ -24,6 +24,7 @@ import com.jpexs.decompiler.flash.SWFOutputStream; import com.jpexs.decompiler.flash.abc.avm2.parser.script.Reference; import com.jpexs.decompiler.flash.action.deobfuscation.ActionDeobfuscator; import com.jpexs.decompiler.flash.action.model.ActionItem; +import com.jpexs.decompiler.flash.action.model.CallMethodActionItem; import com.jpexs.decompiler.flash.action.model.ConstantPool; import com.jpexs.decompiler.flash.action.model.DirectValueActionItem; import com.jpexs.decompiler.flash.action.model.ExtendsActionItem; @@ -79,6 +80,7 @@ import com.jpexs.decompiler.graph.model.IfItem; import com.jpexs.decompiler.graph.model.LocalData; import com.jpexs.decompiler.graph.model.NotItem; import com.jpexs.decompiler.graph.model.PopItem; +import com.jpexs.decompiler.graph.model.PushItem; import com.jpexs.decompiler.graph.model.ScriptEndItem; import com.jpexs.helpers.ByteArrayRange; import com.jpexs.helpers.CancellableWorker; @@ -1217,10 +1219,8 @@ public abstract class Action implements GraphSourceItem { //return output; } List ret = new ArrayList<>(); - List functions = new ArrayList<>(); - List staticFunctions = new ArrayList<>(); - List> vars = new ArrayList<>(); - List> staticVars = new ArrayList<>(); + List> traits = new ArrayList<>(); + List traitsStatic = new ArrayList<>(); GraphTargetItem className; GraphTargetItem extendsOp = null; List implementsOp = new ArrayList<>(); @@ -1264,8 +1264,10 @@ public abstract class Action implements GraphSourceItem { if (sm.value instanceof StoreRegisterActionItem) { sr = (StoreRegisterActionItem) sm.value; if (sr.value instanceof FunctionActionItem) { - ((FunctionActionItem) (sr.value)).calculatedFunctionName = (className instanceof GetMemberActionItem) ? ((GetMemberActionItem) className).memberName : className; - functions.add((FunctionActionItem) sr.value); + ((FunctionActionItem) (sr.value)).calculatedFunctionName = sm.objectName; //(className instanceof GetMemberActionItem) ? ((GetMemberActionItem) className).memberName : className; + //This is probably a constructor + traits.add(new MyEntry<>(((FunctionActionItem) (sr.value)).calculatedFunctionName, ((FunctionActionItem) sr.value))); + traitsStatic.add(false); } } @@ -1296,14 +1298,12 @@ public abstract class Action implements GraphSourceItem { } } - GraphTargetItem constructor = null; for (; ipos < parts.size(); ipos++) { if (parts.get(ipos) instanceof ImplementsOpActionItem) { ImplementsOpActionItem io = (ImplementsOpActionItem) parts.get(ipos); implementsOp = io.superclasses; continue; - } - if (parts.get(ipos) instanceof SetMemberActionItem) { + } else if (parts.get(ipos) instanceof SetMemberActionItem) { SetMemberActionItem sm = (SetMemberActionItem) parts.get(ipos); if (sm.object instanceof TemporaryRegister) { @@ -1324,8 +1324,8 @@ public abstract class Action implements GraphSourceItem { val = val.value; } if (val instanceof FunctionActionItem) { - constructor = val; - ((FunctionActionItem) (constructor)).calculatedFunctionName = (className instanceof GetMemberActionItem) ? ((GetMemberActionItem) className).memberName : className; + //Is this a constructor? + //((FunctionActionItem) (constructor)).calculatedFunctionName = (className instanceof GetMemberActionItem) ? ((GetMemberActionItem) className).memberName : className; } } } @@ -1343,19 +1343,92 @@ public abstract class Action implements GraphSourceItem { if (sm.object instanceof TemporaryRegister) { rnum = ((TemporaryRegister) sm.object).getRegId(); } - if (rnum == instanceReg) { + + if (rnum == instanceReg || rnum == classReg) { if (sm.value instanceof FunctionActionItem) { ((FunctionActionItem) sm.value).calculatedFunctionName = sm.objectName; - functions.add((FunctionActionItem) sm.value); - } else { - vars.add(new MyEntry<>(sm.objectName, sm.value)); } - } else if (rnum == classReg) { - if (sm.value instanceof FunctionActionItem) { - ((FunctionActionItem) sm.value).calculatedFunctionName = sm.objectName; - staticFunctions.add((FunctionActionItem) sm.value); - } else { - staticVars.add(new MyEntry<>(sm.objectName, sm.value)); + traits.add(new MyEntry<>(sm.objectName, sm.value)); + traitsStatic.add(rnum == classReg); + } + } else if (parts.get(ipos) instanceof PushItem) { + if (parts.get(ipos).value instanceof CallMethodActionItem) { + CallMethodActionItem cm = (CallMethodActionItem) parts.get(ipos).value; + if (cm.methodName instanceof DirectValueActionItem) { + if ("addProperty".equals(((DirectValueActionItem) cm.methodName).getAsString())) { + int rnum = -1; + if (cm.scriptObject instanceof DirectValueActionItem) { + DirectValueActionItem dv = (DirectValueActionItem) cm.scriptObject; + if (dv.value instanceof RegisterNumber) { + RegisterNumber rn = (RegisterNumber) dv.value; + rnum = rn.number; + } + } + if (cm.scriptObject instanceof TemporaryRegister) { + rnum = ((TemporaryRegister) cm.scriptObject).getRegId(); + } + + if (cm.arguments.size() > 1) { + GraphTargetItem propertyName = cm.arguments.get(0); //name + GraphTargetItem propertyGetter = cm.arguments.get(1); //getter + GraphTargetItem propertySetter = cm.arguments.get(2); //setter + if ((propertyName instanceof DirectValueActionItem) && ((DirectValueActionItem) propertyName).isString()) { + String propertyNameStr = ((DirectValueActionItem) propertyName).getAsString(); + if (propertyGetter instanceof GetMemberActionItem) { + if (((GetMemberActionItem) propertyGetter).object instanceof TemporaryRegister) { + if (((TemporaryRegister) ((GetMemberActionItem) propertyGetter).object).getRegId() == rnum) { + if (((GetMemberActionItem) propertyGetter).memberName instanceof DirectValueActionItem) { + DirectValueActionItem mNameDv = (DirectValueActionItem) ((GetMemberActionItem) propertyGetter).memberName; + if (mNameDv.isString()) { + String getterNameStr = mNameDv.getAsString(); + if (getterNameStr.equals("__get__" + propertyNameStr)) { + //TODO: handle setter + } + } + } + + } + } + } else if (propertyGetter instanceof FunctionActionItem) { + FunctionActionItem getterFunc = (FunctionActionItem) propertyGetter; + if (getterFunc.actions.isEmpty() && getterFunc.functionName.isEmpty() && ((FunctionActionItem) propertyGetter).paramNames.isEmpty()) { + //well, no getter then + } else { + logger.severe("unexpected getter value for property " + propertyNameStr); + } + } else { + logger.severe("unexpected getter value for property " + propertyNameStr + ": " + propertyGetter.getClass().getSimpleName()); + } + + if (propertySetter instanceof GetMemberActionItem) { + if (((GetMemberActionItem) propertySetter).object instanceof TemporaryRegister) { + if (((TemporaryRegister) ((GetMemberActionItem) propertySetter).object).getRegId() == rnum) { + if (((GetMemberActionItem) propertySetter).memberName instanceof DirectValueActionItem) { + DirectValueActionItem mNameDv = (DirectValueActionItem) ((GetMemberActionItem) propertySetter).memberName; + if (mNameDv.isString()) { + String getterNameStr = mNameDv.getAsString(); + if (getterNameStr.equals("__set__" + propertyNameStr)) { + //TODO: handle setter + } + } + } + + } + } + } else if (propertySetter instanceof FunctionActionItem) { + FunctionActionItem setterFunc = (FunctionActionItem) propertySetter; + if (setterFunc.actions.isEmpty() && setterFunc.functionName.isEmpty() && ((FunctionActionItem) propertySetter).paramNames.isEmpty()) { + //well, no setter then + } else { + logger.severe("unexpected setter value for property " + propertyNameStr); + } + //no setter + } else { + logger.severe("unexpected setter value for property " + propertyNameStr + ": " + propertySetter.getClass().getSimpleName()); + } + } + } + } } } } @@ -1364,7 +1437,7 @@ public abstract class Action implements GraphSourceItem { for (int i = 0; i < prevCount; i++) { output2.add(output.get(i)); } - output2.add(new ClassActionItem(className, extendsOp, implementsOp, constructor, functions, vars, staticFunctions, staticVars)); + output2.add(new ClassActionItem(className, extendsOp, implementsOp, traits, traitsStatic)); return output2; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/ClassActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/ClassActionItem.java index 7054278c8..3743d3c84 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/ClassActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/ClassActionItem.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.action.model.clauses; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; @@ -44,56 +45,39 @@ import java.util.Set; */ public class ClassActionItem extends ActionItem implements Block { - public List functions; - - public List staticFunctions; - public GraphTargetItem extendsOp; public List implementsOp; public GraphTargetItem className; - public GraphTargetItem constructor; - - public List> vars; - - public List> staticVars; + //public GraphTargetItem constructor; + public List> traits; + public List traitsStatic; public Set uninitializedVars; @Override public List> getSubs() { List> ret = new ArrayList<>(); - if (functions != null) { - ret.add(functions); - } - if (staticFunctions != null) { - ret.add(staticFunctions); - } + //? is this needed for traits ? return ret; } - public ClassActionItem(GraphTargetItem className, GraphTargetItem extendsOp, List implementsOp, GraphTargetItem constructor, List functions, List> vars, List staticFunctions, List> staticVars) { + public ClassActionItem(GraphTargetItem className, GraphTargetItem extendsOp, List implementsOp, List> traits, List traitsStatic) { super(null, null, NOPRECEDENCE); this.className = className; - this.functions = functions; - this.vars = vars; + this.traits = traits; + this.traitsStatic = traitsStatic; this.extendsOp = extendsOp; this.implementsOp = implementsOp; - this.staticFunctions = staticFunctions; - this.staticVars = staticVars; - this.constructor = constructor; + //this.constructor = constructor; - List allFunc = new ArrayList<>(functions); - if (constructor != null) { - allFunc.add(constructor); - } this.uninitializedVars = new HashSet<>(); List allUsages = new ArrayList<>(); - for (GraphTargetItem it : allFunc) { - if (it instanceof FunctionActionItem) { - FunctionActionItem f = (FunctionActionItem) it; + for (MyEntry it : traits) { + if (it.getValue() instanceof FunctionActionItem) { + FunctionActionItem f = (FunctionActionItem) it.getValue(); detectUnitializedVars(f.actions, allUsages); } } @@ -102,7 +86,7 @@ public class ClassActionItem extends ActionItem implements Block { allMembers.add(it.toStringNoQuotes(LocalData.empty)); } uninitializedVars.addAll(allMembers); - for (MyEntry v : vars) { + for (MyEntry v : traits) { String s = v.getKey().toStringNoQuotes(LocalData.empty); if (uninitializedVars.contains(s)) { uninitializedVars.remove(s); @@ -176,38 +160,49 @@ public class ClassActionItem extends ActionItem implements Block { } writer.startBlock(); - if (constructor != null) { + /*if (constructor != null) { constructor.toString(writer, localData).newLine(); - } + }*/ + for (int pass = 1; pass <= 2; pass++) { + looptraits: + for (int i = 0; i < traits.size(); i++) { + MyEntry item = traits.get(i); - for (MyEntry item : vars) { - writer.append("var "); - item.getKey().toStringNoQuotes(writer, localData); - writer.append(" = "); - item.getValue().toString(writer, localData); - writer.append(";").newLine(); + switch (pass) { + //pass 1: add variables + case 1: + if (item.getValue() instanceof FunctionActionItem) { //ignore methods + continue looptraits; + } + break; + //pass 2: add methods + case 2: + if (!(item.getValue() instanceof FunctionActionItem)) { //ignore nonmethods + continue looptraits; + } + break; + + } + + if (traitsStatic.get(i)) { + writer.append("static "); + } + if (item.getValue() instanceof FunctionActionItem) { + item.getValue().toString(writer, localData).newLine(); + } else { + writer.append("var "); + item.getKey().toStringNoQuotes(writer, localData); + writer.append(" = "); + item.getValue().toString(writer, localData); + writer.append(";").newLine(); + } + } } for (String v : uninitializedVars) { writer.append("var "); writer.append(v); writer.append(";").newLine(); } - for (MyEntry item : staticVars) { - writer.append("static var "); - item.getKey().toStringNoQuotes(writer, localData); - writer.append(" = "); - item.getValue().toString(writer, localData); - writer.append(";").newLine(); - } - - for (GraphTargetItem f : functions) { - f.toString(writer, localData).newLine(); - } - for (GraphTargetItem f : staticFunctions) { - writer.append("static "); - f.toString(writer, localData).newLine(); - } - writer.endBlock(); writer.endClass(); return writer; @@ -230,7 +225,7 @@ public class ClassActionItem extends ActionItem implements Block { ActionSourceGenerator asGenerator = (ActionSourceGenerator) generator; SourceGeneratorLocalData localData2 = Helper.deepCopy(localData); asGenerator.setInMethod(localData2, true); - ret.addAll(asGenerator.generateTraits(localData2, false, className, extendsOp, implementsOp, constructor, functions, vars, staticFunctions, staticVars)); + ret.addAll(asGenerator.generateTraits(localData2, false, className, extendsOp, implementsOp, traits, traitsStatic)); return ret; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/InterfaceActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/InterfaceActionItem.java index 02e26e81b..48cd7ba49 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/InterfaceActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/InterfaceActionItem.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.action.model.clauses; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; @@ -20,6 +21,7 @@ import com.jpexs.decompiler.flash.action.Action; import com.jpexs.decompiler.flash.action.model.ActionItem; import com.jpexs.decompiler.flash.action.parser.script.ActionSourceGenerator; import com.jpexs.decompiler.flash.helpers.GraphTextWriter; +import com.jpexs.decompiler.flash.helpers.collections.MyEntry; import com.jpexs.decompiler.graph.CompilationException; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; @@ -72,7 +74,7 @@ public class InterfaceActionItem extends ActionItem { public List toSource(SourceGeneratorLocalData localData, SourceGenerator generator) throws CompilationException { List ret = new ArrayList<>(); ActionSourceGenerator asGenerator = (ActionSourceGenerator) generator; - ret.addAll(asGenerator.generateTraits(localData, true, name, null, superInterfaces, null, null, null, null, null)); + ret.addAll(asGenerator.generateTraits(localData, true, name, null, superInterfaces, new ArrayList>(), new ArrayList<>())); return ret; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2Parser.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2Parser.java index e464e50a6..961d2a403 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2Parser.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2Parser.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.action.parser.script; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; @@ -338,11 +339,8 @@ public class ActionScript2Parser { globalClassTypeStr.addAll(nameStr);*/ ParsedSymbol s; - FunctionActionItem constr = null; - List staticFunctions = new ArrayList<>(); - List> staticVars = new ArrayList<>(); - List instanceFunctions = new ArrayList<>(); - List> vars = new ArrayList<>(); + List> traits = new ArrayList<>(); + List traitsStatic = new ArrayList<>(); String classNameStr = ""; if (nameStr instanceof GetMemberActionItem) { @@ -373,16 +371,21 @@ public class ActionScript2Parser { expected(s, lexer.yyline(), SymbolType.IDENTIFIER, SymbolGroup.GLOBALFUNC); String fname = s.value.toString(); if (fname.equals(classNameStr)) { //constructor - constr = (function(!isInterface, "", true, variables, functions)); - } else if (!isInterface) { + //actually there's no difference, it's instance trait + } + if (!isInterface) { if (isStatic) { FunctionActionItem ft = function(!isInterface, "", true, variables, functions); ft.calculatedFunctionName = pushConst(fname); - staticFunctions.add(ft); + //staticFunctions.add(ft); + traits.add(new MyEntry<>(ft.calculatedFunctionName, ft)); + traitsStatic.add(true); } else { FunctionActionItem ft = function(!isInterface, "", true, variables, functions); ft.calculatedFunctionName = pushConst(fname); - instanceFunctions.add(ft); + //instanceFunctions.add(ft); + traits.add(new MyEntry<>(ft.calculatedFunctionName, ft)); + traitsStatic.add(false); } } break; @@ -396,11 +399,8 @@ public class ActionScript2Parser { s = lex(); } if (s.type == SymbolType.ASSIGN) { - if (isStatic) { - staticVars.add(new MyEntry<>(pushConst(ident), expression(false, false, true, variables, functions))); - } else { - vars.add(new MyEntry<>(pushConst(ident), expression(false, false, true, variables, functions))); - } + traits.add(new MyEntry<>(pushConst(ident), expression(false, false, true, variables, functions))); + traitsStatic.add(isStatic); s = lex(); } if (s.type != SymbolType.SEMICOLON) { @@ -417,7 +417,7 @@ public class ActionScript2Parser { if (isInterface) { return new InterfaceActionItem(nameStr, implementsStr); } else { - return new ClassActionItem(nameStr, extendsStr, implementsStr, constr, instanceFunctions, vars, staticFunctions, staticVars); + return new ClassActionItem(nameStr, extendsStr, implementsStr, traits, traitsStatic); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionSourceGenerator.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionSourceGenerator.java index d35b086cb..3cdd2102c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionSourceGenerator.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionSourceGenerator.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.action.parser.script; import com.jpexs.decompiler.flash.SWF; @@ -655,7 +656,7 @@ public class ActionSourceGenerator implements SourceGenerator { return new ActionPush(new ConstantIndex(index)); } - public List generateTraits(SourceGeneratorLocalData localData, boolean isInterface, GraphTargetItem name, GraphTargetItem extendsVal, List implementsStr, GraphTargetItem constructor, List functions, List> vars, List staticFunctions, List> staticVars) throws CompilationException { + public List generateTraits(SourceGeneratorLocalData localData, boolean isInterface, GraphTargetItem name, GraphTargetItem extendsVal, List implementsStr, List> traits, List traitsStatic) throws CompilationException { List extendsStr = getVarParts(extendsVal); List ret = new ArrayList<>(); List nameStr = getVarParts(name); @@ -683,6 +684,19 @@ public class ActionSourceGenerator implements SourceGenerator { globalClassTypeStr.add("_global"); globalClassTypeStr.addAll(nameStr); + String constructorName = nameStr.get(nameStr.size() - 1); //com.jpexs.MyClass => MyClass + GraphTargetItem constructor = null; + int constructorIndex = -1; + for (int t = 0; t < traits.size(); t++) { + MyEntry en = traits.get(t); + if (en.getValue() instanceof FunctionActionItem) { + if (constructorName.equals(getName(en.getKey()))) { + constructorIndex = t; + constructor = en.getValue(); + break; + } + } + } ParsedSymbol s = null; List constr = new ArrayList<>(); @@ -699,31 +713,23 @@ public class ActionSourceGenerator implements SourceGenerator { constr = (typeToActions(globalClassTypeStr, constr)); } if (!isInterface) { - for (GraphTargetItem f : staticFunctions) { - FunctionActionItem fi = (FunctionActionItem) f; - ifbody.add(new ActionPush(new RegisterNumber(1/*static*/))); - ifbody.add(new ActionPush(getName(fi.calculatedFunctionName))); - ifbody.addAll(toActionList(fi.toSource(localData, this))); - ifbody.add(new ActionSetMember()); - } - for (GraphTargetItem f : functions) { - FunctionActionItem fi = (FunctionActionItem) f; - ifbody.add(new ActionPush(new RegisterNumber(2/*instance*/))); - ifbody.add(new ActionPush(getName(fi.calculatedFunctionName))); - ifbody.addAll(toActionList(fi.toSource(localData, this))); - ifbody.add(new ActionSetMember()); - } - for (MyEntry en : staticVars) { - ifbody.add(new ActionPush(new RegisterNumber(1/*static*/))); - ifbody.add(new ActionPush(getName(en.getKey()))); - ifbody.addAll(toActionList(en.getValue().toSource(localData, this))); - ifbody.add(new ActionSetMember()); - } - for (MyEntry en : vars) { - ifbody.add(new ActionPush(new RegisterNumber(2/*instance*/))); - ifbody.add(new ActionPush(getName(en.getKey()))); - ifbody.addAll(toActionList(en.getValue().toSource(localData, this))); - ifbody.add(new ActionSetMember()); + for (int t = 0; t < traits.size(); t++) { + if (constructorIndex == t) { //constructor already handled + continue; + } + MyEntry en = traits.get(t); + if (en.getValue() instanceof FunctionActionItem) { + FunctionActionItem fi = (FunctionActionItem) en.getValue(); + ifbody.add(new ActionPush(new RegisterNumber(traitsStatic.get(t) ? 1 : 2))); + ifbody.add(new ActionPush(getName(en.getKey()))); + ifbody.addAll(toActionList(fi.toSource(localData, this))); + ifbody.add(new ActionSetMember()); + } else { + ifbody.add(new ActionPush(new RegisterNumber(traitsStatic.get(t) ? 1 : 2))); + ifbody.add(new ActionPush(getName(en.getKey()))); + ifbody.addAll(toActionList(en.getValue().toSource(localData, this))); + ifbody.add(new ActionSetMember()); + } } } From 3dd9cd10e51e751c298bb01c53b2b868de8f38d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 21 Jan 2018 08:24:20 +0100 Subject: [PATCH 12/58] renameAS2Identifiers compilation fix --- .../src/com/jpexs/decompiler/flash/SWF.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java index 4c80da999..f0dc48321 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash; import SevenZip.Compression.LZMA.Decoder; @@ -2297,9 +2298,15 @@ public final class SWF implements SWFContainerItem, Timelined { if (it instanceof ClassActionItem) { ClassActionItem cti = (ClassActionItem) it; List methods = new ArrayList<>(); - methods.addAll(cti.functions); - methods.addAll(cti.staticFunctions); + List vars = new ArrayList<>(); + for (MyEntry trait : cti.traits) { + if (trait.getValue() instanceof FunctionActionItem) { + methods.add(trait.getValue()); + } else { + vars.add(trait.getValue()); + } + } for (GraphTargetItem gti : methods) { if (gti instanceof FunctionActionItem) { FunctionActionItem fun = (FunctionActionItem) gti; @@ -2314,13 +2321,6 @@ public final class SWF implements SWFContainerItem, Timelined { } } - List vars = new ArrayList<>(); - for (MyEntry item : cti.vars) { - vars.add(item.getKey()); - } - for (MyEntry item : cti.staticVars) { - vars.add(item.getKey()); - } for (GraphTargetItem gti : vars) { if (gti instanceof DirectValueActionItem) { DirectValueActionItem dvf = (DirectValueActionItem) gti; From 5c6b2e01086610e1044025a976586964aaf8ee44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 21 Jan 2018 08:35:31 +0100 Subject: [PATCH 13/58] updated changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 371f61643..1f5eda8d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,8 +2,12 @@ All notable changes to this project will be documented in this file. ## [Unreleased] +### Added +- AS2 classes: maintain order of variables, and methods (place variables before methods) + ### Fixed - Accessing font list on demand - prevents loading X11 on systems without UI +- Better AS2 class detection ## [11.0.0] - 2018-01-17 ### Added From 2df93180365873e2d1c2fd0d9b5c9854e13d9028 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 21 Jan 2018 08:37:43 +0100 Subject: [PATCH 14/58] fix test --- .../test/com/jpexs/decompiler/flash/ActionScript2Test.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java index b56af5026..e2a59b1d0 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash; import com.jpexs.decompiler.flash.action.Action; @@ -311,6 +312,9 @@ public class ActionScript2Test extends ActionScript2TestBase { + "var mt = new com.jpexs.MyTest();\r\n" + "mt.test();\r\n" + "var c = new Cox(box1);\r\n" + + "var tg = new com.jpexs.TestSetterGetter();\r\n" + + "var tcg = new com.jpexs.TestCallSetterGetter();\r\n" + + "var tvm = new com.jpexs.TestVarsMethods();\r\n" ); } From b11fc959d1216cd98f87474a0a35a79084ecb541 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 21 Jan 2018 09:07:20 +0100 Subject: [PATCH 15/58] Introducing AS2 classes Test class AS2 classes - Test for maintaining vars/methods order --- .../src/com/jpexs/decompiler/flash/SWF.java | 7 +- .../decompiler/flash/ActionScript2Test.java | 1 + .../flash/ActionScript2TestClasses.java | 146 ++++++++++++++++++ libsrc/ffdec_lib/testdata/as2/as2.fla | Bin 1086014 -> 1086043 bytes libsrc/ffdec_lib/testdata/as2/as2.swf | Bin 26590 -> 26782 bytes .../as2/com/jpexs/TestMaintainOrder.as | 36 +++++ 6 files changed, 187 insertions(+), 3 deletions(-) create mode 100644 libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2TestClasses.java create mode 100644 libsrc/ffdec_lib/testdata/as2/com/jpexs/TestMaintainOrder.as diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java index f0dc48321..702d9a6fb 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java @@ -349,6 +349,8 @@ public final class SWF implements SWFContainerItem, Timelined { private static final DecompilerPool decompilerPool = new DecompilerPool(); + public static final String AS2_PKG_PREFIX = "__Packages."; + public static List swfSignatures = Arrays.asList( "FWS", // Uncompressed Flash "CWS", // ZLib compressed Flash @@ -2276,10 +2278,9 @@ public final class SWF implements SWFContainerItem, Timelined { DoInitActionTag dia = (DoInitActionTag) t; String exportName = getExportName(dia.spriteId); exportName = exportName != null ? exportName : "_unk_"; - final String pkgPrefix = "__Packages."; String[] classNameParts = null; - if (exportName.startsWith(pkgPrefix)) { - String className = exportName.substring(pkgPrefix.length()); + if (exportName.startsWith(AS2_PKG_PREFIX)) { + String className = exportName.substring(AS2_PKG_PREFIX.length()); if (className.contains(".")) { classNameParts = className.split("\\."); } else { diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java index e2a59b1d0..8d5ddab89 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java @@ -315,6 +315,7 @@ public class ActionScript2Test extends ActionScript2TestBase { + "var tg = new com.jpexs.TestSetterGetter();\r\n" + "var tcg = new com.jpexs.TestCallSetterGetter();\r\n" + "var tvm = new com.jpexs.TestVarsMethods();\r\n" + + "var tmo = new com.jpexs.TestMaintainOrder();\r\n" ); } diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2TestClasses.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2TestClasses.java new file mode 100644 index 000000000..120eac591 --- /dev/null +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2TestClasses.java @@ -0,0 +1,146 @@ +/* + * Copyright (C) 2010-2018 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.flash; + +import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.configuration.Configuration; +import com.jpexs.decompiler.flash.helpers.CodeFormatting; +import com.jpexs.decompiler.flash.helpers.HighlightedTextWriter; +import com.jpexs.decompiler.flash.tags.DoInitActionTag; +import com.jpexs.decompiler.flash.tags.Tag; +import java.io.BufferedInputStream; +import java.io.FileInputStream; +import java.io.IOException; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.fail; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; + +/** + * + * @author JPEXS + */ +public class ActionScript2TestClasses extends ActionScript2TestBase { + + @BeforeClass + public void init() throws IOException, InterruptedException { + //Main.initLogging(false); + Configuration.autoDeobfuscate.set(false); + Configuration.simplifyExpressions.set(false); + Configuration.decompile.set(true); + Configuration.registerNameFormat.set("_loc%d_"); + swf = new SWF(new BufferedInputStream(new FileInputStream("testdata/as2/as2.swf")), false); + } + + private void compareSrc(String classFullName, String expectedResult) { + DoInitActionTag dia = getClassSource(classFullName); + assertNotNull(dia); + HighlightedTextWriter writer = new HighlightedTextWriter(new CodeFormatting(), false); + try { + Action.actionsToSource(dia, dia.getActions(), "", writer); + } catch (InterruptedException ex) { + fail(); + } + String actualResult = cleanPCode(writer.toString()); + expectedResult = cleanPCode(expectedResult); + assertEquals(actualResult, expectedResult); + } + + private DoInitActionTag getClassSource(String classFullName) { + for (Tag t : swf.getTags()) { + if (t instanceof DoInitActionTag) { + DoInitActionTag dia = (DoInitActionTag) t; + String exportName = swf.getExportName(dia.spriteId); + if (exportName != null && exportName.startsWith(SWF.AS2_PKG_PREFIX)) { + String exportClassName = exportName.substring(SWF.AS2_PKG_PREFIX.length()); + if (exportClassName.equals(classFullName)) { + return dia; + } + } + } + } + return null; + } + + @Test + public void testVarsMethods() { + compareSrc("com.jpexs.TestVarsMethods", "class com.jpexs.TestVarsMethods\r\n" + + "{\r\n" + + "var instVar = 1;\r\n" + + "static var statVar = 2;\r\n" + + "function TestVarsMethods()\r\n" + + "{\r\n" + + "trace(\"constructor\");\r\n" + + "}\r\n" + + "function instMethod()\r\n" + + "{\r\n" + + "trace(\"instance method\");\r\n" + + "}\r\n" + + "static function statMethod()\r\n" + + "{\r\n" + + "trace(\"static method\");\r\n" + + "}\r\n" + + "}"); + } + + @Test + public void testMaintainOrder() { + compareSrc("com.jpexs.TestMaintainOrder", "class com.jpexs.TestMaintainOrder\r\n" + + "{\r\n" + + "var a = 1;\r\n" + + "static var b = 2;\r\n" + + "var c = 3;\r\n" + + "static var d = 4;\r\n" + + "static var e = 5;\r\n" + + "var f = 6;\r\n" + + "var g = 7;\r\n" + + "var _x1 = \"after method m\";\r\n" + + "function TestMaintainOrder()\r\n" + + "{\r\n" + + "}\r\n" + + "function h()\r\n" + + "{\r\n" + + "trace(\"8\");\r\n" + + "}\r\n" + + "function i()\r\n" + + "{\r\n" + + "trace(\"9\");\r\n" + + "}\r\n" + + "static function j()\r\n" + + "{\r\n" + + "trace(\"10\");\r\n" + + "}\r\n" + + "static function k()\r\n" + + "{\r\n" + + "trace(\"11\");\r\n" + + "}\r\n" + + "function l()\r\n" + + "{\r\n" + + "trace(\"12\");\r\n" + + "}\r\n" + + "static function m()\r\n" + + "{\r\n" + + "trace(\"13\");\r\n" + + "}\r\n" + + "function _x2()\r\n" + + "{\r\n" + + "trace(\"after _x1\");\r\n" + + "}\r\n" + + "}"); + } +} diff --git a/libsrc/ffdec_lib/testdata/as2/as2.fla b/libsrc/ffdec_lib/testdata/as2/as2.fla index e58e46ddeecf5ad7723d60dda18c3c88495d10a9..0bfd24c0fe50d329fe8fb0ac67aeaeadd1dc0ad1 100644 GIT binary patch delta 13957 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 w;mYcvOG=QN#X`` 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 Hujc&NGOm_h&ekrT?7q%UCqc#@ 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 gOqZ9=J3>Gb0KHQ<^!~@rIKw;s+VZ>u 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 v-I$2hNP|UCaw6Qm>r`W^ykx- Date: Sun, 21 Jan 2018 09:21:35 +0100 Subject: [PATCH 16/58] Direct editation of AS2 classes - save methods before variables, as in Flash CS6 --- .../parser/script/ActionSourceGenerator.java | 36 ++++++++++--------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionSourceGenerator.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionSourceGenerator.java index 3cdd2102c..3e4e6b73d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionSourceGenerator.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionSourceGenerator.java @@ -678,6 +678,7 @@ public class ActionSourceGenerator implements SourceGenerator { ret.add(new ActionNot()); ret.add(new ActionIf(Action.actionsToBytes(notBody, false, SWF.DEFAULT_VERSION).length)); ret.addAll(notBody); + ret.add(new ActionPop()); } List ifbody = new ArrayList<>(); List globalClassTypeStr = new ArrayList<>(); @@ -713,22 +714,25 @@ public class ActionSourceGenerator implements SourceGenerator { constr = (typeToActions(globalClassTypeStr, constr)); } if (!isInterface) { - for (int t = 0; t < traits.size(); t++) { - if (constructorIndex == t) { //constructor already handled - continue; - } - MyEntry en = traits.get(t); - if (en.getValue() instanceof FunctionActionItem) { - FunctionActionItem fi = (FunctionActionItem) en.getValue(); - ifbody.add(new ActionPush(new RegisterNumber(traitsStatic.get(t) ? 1 : 2))); - ifbody.add(new ActionPush(getName(en.getKey()))); - ifbody.addAll(toActionList(fi.toSource(localData, this))); - ifbody.add(new ActionSetMember()); - } else { - ifbody.add(new ActionPush(new RegisterNumber(traitsStatic.get(t) ? 1 : 2))); - ifbody.add(new ActionPush(getName(en.getKey()))); - ifbody.addAll(toActionList(en.getValue().toSource(localData, this))); - ifbody.add(new ActionSetMember()); + for (int pass = 1; pass <= 2; pass++) { //two passes, methods first, then variables + for (int t = 0; t < traits.size(); t++) { + if (constructorIndex == t) { //constructor already handled + continue; + } + MyEntry en = traits.get(t); + boolean isFunc = (en.getValue() instanceof FunctionActionItem); + if (pass == 1 && isFunc) { //Add methods in first pass + FunctionActionItem fi = (FunctionActionItem) en.getValue(); + ifbody.add(new ActionPush(new RegisterNumber(traitsStatic.get(t) ? 1 : 2))); + ifbody.add(new ActionPush(getName(en.getKey()))); + ifbody.addAll(toActionList(fi.toSource(localData, this))); + ifbody.add(new ActionSetMember()); + } else if (pass == 2 && !isFunc) { //add variables in second pass + ifbody.add(new ActionPush(new RegisterNumber(traitsStatic.get(t) ? 1 : 2))); + ifbody.add(new ActionPush(getName(en.getKey()))); + ifbody.addAll(toActionList(en.getValue().toSource(localData, this))); + ifbody.add(new ActionSetMember()); + } } } } From d8fca459cb4fec9b4c606cee0de64227d75e9ff7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 21 Jan 2018 09:28:48 +0100 Subject: [PATCH 17/58] Direct editation of AS2 classes - methods do not require ActionDefineFunction2 --- .../decompiler/flash/action/model/FunctionActionItem.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/FunctionActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/FunctionActionItem.java index d8eb4989e..227756a0b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/FunctionActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/FunctionActionItem.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.action.model; import com.jpexs.decompiler.flash.IdentifiersDeobfuscation; @@ -303,7 +304,7 @@ public class FunctionActionItem extends ActionItem { needsFun2 = true; } if (localData.inMethod) { - needsFun2 = true; + //needsFun2 = true; } if (localData.inFunction > 1) { needsFun2 = true; From e436dccb075169243b8bc0ef1616e1c0b6822957 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 21 Jan 2018 10:07:05 +0100 Subject: [PATCH 18/58] Direct editation of AS2 classes - minor changes to make it closer to original compiler --- .../flash/action/parser/script/ActionSourceGenerator.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionSourceGenerator.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionSourceGenerator.java index 3e4e6b73d..7ffe49060 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionSourceGenerator.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionSourceGenerator.java @@ -669,7 +669,7 @@ public class ActionSourceGenerator implements SourceGenerator { } List val = new ArrayList<>(); - val.add(new ActionPush((Long) 0L)); + val.add(new ActionPush((Double) 0.0)); val.add(pushConst("Object")); val.add(new ActionNewObject()); notBody.addAll(typeToActions(globalClassTypeStr, val)); @@ -707,11 +707,11 @@ public class ActionSourceGenerator implements SourceGenerator { if (!isInterface) { val.add(new ActionStoreRegister(1)); } - constr.addAll(typeToActions(globalClassTypeStr, val)); + constr.addAll(typeToActions(nameStr, val)); } else { constr.addAll(toActionList(((FunctionActionItem) constructor).toSource(localData, this))); constr.add(new ActionStoreRegister(1)); - constr = (typeToActions(globalClassTypeStr, constr)); + constr = (typeToActions(nameStr, constr)); } if (!isInterface) { for (int pass = 1; pass <= 2; pass++) { //two passes, methods first, then variables @@ -740,7 +740,7 @@ public class ActionSourceGenerator implements SourceGenerator { if (!isInterface) { ifbody.add(new ActionPush((Long) 1L)); ifbody.add(new ActionPush(Null.INSTANCE)); - ifbody.addAll(typeToActions(globalClassTypeStr, null)); + ifbody.addAll(typeToActions(nameStr, null)); ifbody.add(pushConst("prototype")); ifbody.add(new ActionGetMember()); ifbody.add(new ActionPush((Long) 3L)); From 091a2e12267ad1995f73721863061c364250c6a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 21 Jan 2018 10:59:19 +0100 Subject: [PATCH 19/58] - Sorting constantpool based on ActionPush position - ActionPush constant for maximum index of constant of type 8 push. --- .../parser/script/ActionScript2Parser.java | 56 +++++++++++++++++-- .../parser/script/ActionSourceGenerator.java | 4 +- .../flash/action/swf4/ActionPush.java | 11 +++- 3 files changed, 62 insertions(+), 9 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2Parser.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2Parser.java index 961d2a403..f41ac1076 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2Parser.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2Parser.java @@ -120,6 +120,7 @@ import com.jpexs.decompiler.flash.action.model.operations.SubtractActionItem; import com.jpexs.decompiler.flash.action.model.operations.URShiftActionItem; import com.jpexs.decompiler.flash.action.parser.ActionParseException; import com.jpexs.decompiler.flash.action.swf4.ActionIf; +import com.jpexs.decompiler.flash.action.swf4.ActionPush; import com.jpexs.decompiler.flash.action.swf4.ConstantIndex; import com.jpexs.decompiler.flash.action.swf5.ActionConstantPool; import com.jpexs.decompiler.flash.ecma.Null; @@ -1872,18 +1873,63 @@ public class ActionScript2Parser { return retTree; } - public List actionsFromTree(List tree, List constantPool) throws CompilationException { + private List generateActionList(List tree, List constantPool) throws CompilationException { ActionSourceGenerator gen = new ActionSourceGenerator(swfVersion, constantPool); + SourceGeneratorLocalData localData = new SourceGeneratorLocalData(new HashMap<>(), 0, Boolean.FALSE, 0); + return gen.generate(localData, tree); + } + + public List actionsFromTree(List tree, List constantPoolDraft) throws CompilationException { List ret = new ArrayList<>(); - SourceGeneratorLocalData localData = new SourceGeneratorLocalData( - new HashMap<>(), 0, Boolean.FALSE, 0); - List srcList = gen.generate(localData, tree); + + List srcList = generateActionList(tree, constantPoolDraft); + + List orderedConstantPool = new ArrayList<>(); + + boolean canChangeConstantIndices; + int lastIndex = constantPoolDraft.size() - 1; + if (lastIndex <= ActionPush.MAX_CONSTANT_INDEX_TYPE8) { + //can change constant indices as ActionPush contains always 1 byte per constant + canChangeConstantIndices = true; + } else { + //variable number bytes per ActionPush constant, + //must generate again to make relative offsets in jumps work + canChangeConstantIndices = false; + } + + //create ordered constant pool, update constantindices if they can be changed + for (GraphSourceItem src : srcList) { + if (src instanceof ActionPush) { + ActionPush ap = (ActionPush) src; + for (int i = 0; i < ap.values.size(); i++) { + Object val = ap.values.get(i); + if (val instanceof ConstantIndex) { + ConstantIndex ci = (ConstantIndex) val; + String cval = constantPoolDraft.get(ci.index); + int orderedIndex = orderedConstantPool.indexOf(cval); + if (orderedIndex == -1) { + orderedIndex = orderedConstantPool.size(); + orderedConstantPool.add(cval); + } + if (canChangeConstantIndices) { + ci.index = orderedIndex; + } + } + } + } + } + + if (!canChangeConstantIndices) { + //generate again, as number of bytes per ActionPush can change + srcList = generateActionList(tree, orderedConstantPool); + } + for (GraphSourceItem s : srcList) { if (s instanceof Action) { ret.add((Action) s); } } - ret.add(0, new ActionConstantPool(constantPool)); + ret.add(0, new ActionConstantPool(orderedConstantPool)); return ret; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionSourceGenerator.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionSourceGenerator.java index 7ffe49060..5f2d04bf5 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionSourceGenerator.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionSourceGenerator.java @@ -724,12 +724,12 @@ public class ActionSourceGenerator implements SourceGenerator { if (pass == 1 && isFunc) { //Add methods in first pass FunctionActionItem fi = (FunctionActionItem) en.getValue(); ifbody.add(new ActionPush(new RegisterNumber(traitsStatic.get(t) ? 1 : 2))); - ifbody.add(new ActionPush(getName(en.getKey()))); + ifbody.add(pushConst(getName(en.getKey()))); ifbody.addAll(toActionList(fi.toSource(localData, this))); ifbody.add(new ActionSetMember()); } else if (pass == 2 && !isFunc) { //add variables in second pass ifbody.add(new ActionPush(new RegisterNumber(traitsStatic.get(t) ? 1 : 2))); - ifbody.add(new ActionPush(getName(en.getKey()))); + ifbody.add(pushConst(getName(en.getKey()))); ifbody.addAll(toActionList(en.getValue().toSource(localData, this))); ifbody.add(new ActionSetMember()); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPush.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPush.java index 8c9d813c6..183caf9aa 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPush.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPush.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.action.swf4; import com.jpexs.decompiler.flash.BaseLocalData; @@ -62,6 +63,12 @@ public class ActionPush extends Action { public List constantPool; + /** + * Maximum constant index for storing in type 8, greater indices must be + * stored in type 9 + */ + public static final int MAX_CONSTANT_INDEX_TYPE8 = 255; + public ActionPush(int actionLength, SWFInputStream sis, int version) throws IOException { super(0x96, actionLength); int type; @@ -151,7 +158,7 @@ public class ActionPush extends Action { } } else if (o instanceof ConstantIndex) { int cIndex = ((ConstantIndex) o).index; - if (cIndex < 256) { + if (cIndex <= MAX_CONSTANT_INDEX_TYPE8) { sos.writeUI8(8); sos.writeUI8(cIndex); } else { From 800b48505f216c14000c228e51959c41283cf102 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 21 Jan 2018 10:59:33 +0100 Subject: [PATCH 20/58] updated changelog --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1f5eda8d1..0e1698ea8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,9 +5,13 @@ All notable changes to this project will be documented in this file. ### Added - AS2 classes: maintain order of variables, and methods (place variables before methods) +### Changed +- AS1/2 direct editation - generated constantpool is sorted according to ActionPush position + ### Fixed - Accessing font list on demand - prevents loading X11 on systems without UI - Better AS2 class detection +- AS2 direct editation - not generating Pop in class header ifs ## [11.0.0] - 2018-01-17 ### Added From 9e2497f2b8bd19c970e21a3fe9833275f7b17c1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 21 Jan 2018 12:23:25 +0100 Subject: [PATCH 21/58] Fix wrong constant indices when ConstantIndex copy --- .../flash/action/parser/script/ActionScript2Parser.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2Parser.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2Parser.java index f41ac1076..bb2711836 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2Parser.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2Parser.java @@ -1912,7 +1912,8 @@ public class ActionScript2Parser { orderedConstantPool.add(cval); } if (canChangeConstantIndices) { - ci.index = orderedIndex; + //Do NOT change ci.index directly - it may be cloned from other location + ap.values.set(i, new ConstantIndex(orderedIndex)); } } } @@ -1922,6 +1923,7 @@ public class ActionScript2Parser { if (!canChangeConstantIndices) { //generate again, as number of bytes per ActionPush can change srcList = generateActionList(tree, orderedConstantPool); + //FIXME!!! } for (GraphSourceItem s : srcList) { From 2f6d0e66ac646b38617768e51af4afc58988fdf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 21 Jan 2018 13:03:20 +0100 Subject: [PATCH 22/58] AS1/2 direct editation - reordering of large (>256 items) constantpools --- .../parser/script/ActionScript2Parser.java | 95 +++++++++++-------- .../script/NeedsGenerateAgainException.java | 37 ++++++++ .../flash/ActionScript2ParserTest.java | 22 ++++- 3 files changed, 111 insertions(+), 43 deletions(-) create mode 100644 libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/NeedsGenerateAgainException.java diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2Parser.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2Parser.java index bb2711836..3b41a5fac 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2Parser.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2Parser.java @@ -1879,66 +1879,77 @@ public class ActionScript2Parser { return gen.generate(localData, tree); } - public List actionsFromTree(List tree, List constantPoolDraft) throws CompilationException { + private List actionsFromTree(List tree, List constantPool, boolean doOrder) throws CompilationException, NeedsGenerateAgainException { List ret = new ArrayList<>(); - List srcList = generateActionList(tree, constantPoolDraft); + List srcList = generateActionList(tree, constantPool); - List orderedConstantPool = new ArrayList<>(); + if (doOrder) { + List orderedConstantPool = new ArrayList<>(); + boolean canChangeInPlace; + int lastIndex = constantPool.size() - 1; + if (lastIndex <= ActionPush.MAX_CONSTANT_INDEX_TYPE8) { + //can change constant indices as ActionPush contains always 1 byte per constant + canChangeInPlace = true; + } else { + //variable number bytes per ActionPush constant, + //must generate again to make relative offsets in jumps work + canChangeInPlace = false; + } - boolean canChangeConstantIndices; - int lastIndex = constantPoolDraft.size() - 1; - if (lastIndex <= ActionPush.MAX_CONSTANT_INDEX_TYPE8) { - //can change constant indices as ActionPush contains always 1 byte per constant - canChangeConstantIndices = true; - } else { - //variable number bytes per ActionPush constant, - //must generate again to make relative offsets in jumps work - canChangeConstantIndices = false; - } - - //create ordered constant pool, update constantindices if they can be changed - for (GraphSourceItem src : srcList) { - if (src instanceof ActionPush) { - ActionPush ap = (ActionPush) src; - for (int i = 0; i < ap.values.size(); i++) { - Object val = ap.values.get(i); - if (val instanceof ConstantIndex) { - ConstantIndex ci = (ConstantIndex) val; - String cval = constantPoolDraft.get(ci.index); - int orderedIndex = orderedConstantPool.indexOf(cval); - if (orderedIndex == -1) { - orderedIndex = orderedConstantPool.size(); - orderedConstantPool.add(cval); - } - if (canChangeConstantIndices) { - //Do NOT change ci.index directly - it may be cloned from other location - ap.values.set(i, new ConstantIndex(orderedIndex)); + //create ordered constant pool, update constantindices when we can changeinplace + for (GraphSourceItem src : srcList) { + if (src instanceof ActionPush) { + ActionPush ap = (ActionPush) src; + for (int i = 0; i < ap.values.size(); i++) { + Object val = ap.values.get(i); + if (val instanceof ConstantIndex) { + ConstantIndex ci = (ConstantIndex) val; + String cval = constantPool.get(ci.index); + int orderedIndex = orderedConstantPool.indexOf(cval); + if (orderedIndex == -1) { + orderedIndex = orderedConstantPool.size(); + orderedConstantPool.add(cval); + } + if (canChangeInPlace) { + //Do NOT change ci.index directly - it may be cloned from other location + ap.values.set(i, new ConstantIndex(orderedIndex)); + } } } } } + if (!canChangeInPlace) { + //generate again, as number of bytes per ActionPush can change + throw new NeedsGenerateAgainException(orderedConstantPool); + } + constantPool = orderedConstantPool; } - - if (!canChangeConstantIndices) { - //generate again, as number of bytes per ActionPush can change - srcList = generateActionList(tree, orderedConstantPool); - //FIXME!!! - } - for (GraphSourceItem s : srcList) { if (s instanceof Action) { ret.add((Action) s); } } - ret.add(0, new ActionConstantPool(orderedConstantPool)); + ret.add(0, new ActionConstantPool(constantPool)); return ret; } public List actionsFromString(String s) throws ActionParseException, IOException, CompilationException { - List constantPool = new ArrayList<>(); - List tree = treeFromString(s, constantPool); - return actionsFromTree(tree, constantPool); + try { + List constantPool = new ArrayList<>(); + List tree = treeFromString(s, constantPool); + return actionsFromTree(tree, constantPool, true); + } catch (NeedsGenerateAgainException nga) { + //Can happen when constantpool needs reordering and number of constants > 256 + try { + List newConstantPool = nga.getNewConstantPool(); + List tree = treeFromString(s, newConstantPool); + return actionsFromTree(tree, newConstantPool, false /*do not order again*/); + } catch (NeedsGenerateAgainException ex) { + //should not happen as doOrder parameter is set to false + return new ArrayList<>(); + } + } } private void versionRequired(ParsedSymbol s, int min) throws ActionParseException { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/NeedsGenerateAgainException.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/NeedsGenerateAgainException.java new file mode 100644 index 000000000..fcd5d9de5 --- /dev/null +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/NeedsGenerateAgainException.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2010-2018 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.flash.action.parser.script; + +import java.util.List; + +/** + * + * @author JPEXS + */ +public class NeedsGenerateAgainException extends Exception { + + private List newConstantPool; + + public NeedsGenerateAgainException(List newConstantPool) { + this.newConstantPool = newConstantPool; + } + + public List getNewConstantPool() { + return newConstantPool; + } + +} diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2ParserTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2ParserTest.java index 32131a3d4..e837c5fe2 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2ParserTest.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2ParserTest.java @@ -12,10 +12,12 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash; import com.jpexs.decompiler.flash.action.parser.script.ActionScript2Parser; +import com.jpexs.decompiler.flash.action.swf4.ActionPush; import com.jpexs.decompiler.flash.configuration.Configuration; import com.jpexs.decompiler.graph.CompilationException; import java.io.IOException; @@ -91,4 +93,22 @@ public class ActionScript2ParserTest extends ActionScript2TestBase { + " };\n" + "}"); } + + @Test + private void testAS2SimpleConstantPoolOrder() { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < ActionPush.MAX_CONSTANT_INDEX_TYPE8; i++) { + sb.append("trace(\"" + i + "\");\n"); + } + parseAS2(sb.toString()); + } + + @Test + private void testAS2LargeConstantPoolOrder() { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < ActionPush.MAX_CONSTANT_INDEX_TYPE8 + 100; i++) { + sb.append("trace(\"" + i + "\");\n"); + } + parseAS2(sb.toString()); + } } From c9e79920817fcb67472e0b888bb491dc9a41b5ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 21 Jan 2018 18:23:30 +0100 Subject: [PATCH 23/58] MyEntry Serializable --- .../jpexs/decompiler/flash/helpers/collections/MyEntry.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/helpers/collections/MyEntry.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/helpers/collections/MyEntry.java index 1b9e054be..6fc936f59 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/helpers/collections/MyEntry.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/helpers/collections/MyEntry.java @@ -12,9 +12,11 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.helpers.collections; +import java.io.Serializable; import java.util.Map.Entry; import java.util.Objects; @@ -24,7 +26,7 @@ import java.util.Objects; * @param Value * @author JPEXS */ -public class MyEntry implements Entry { +public class MyEntry implements Entry, Serializable { private final K key; From def79bd7a7a829cd20b6cf8395d691474681d5af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 21 Jan 2018 18:35:37 +0100 Subject: [PATCH 24/58] AS2 class detection - Fix seeing class where isn't --- .../jpexs/decompiler/flash/action/Action.java | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java index 2f813f080..28f4a0c6f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java @@ -1431,15 +1431,25 @@ public abstract class Action implements GraphSourceItem { } } } + } else { + break; } } - List output2 = new ArrayList<>(); - for (int i = 0; i < prevCount; i++) { - output2.add(output.get(i)); - } - output2.add(new ClassActionItem(className, extendsOp, implementsOp, traits, traitsStatic)); - return output2; + boolean isAClass = !(traits.isEmpty() && extendsOp == null && implementsOp.isEmpty()); + if (isAClass) { + List output2 = new ArrayList<>(); + for (int i = 0; i < prevCount; i++) { + output2.add(output.get(i)); + } + output2.add(new ClassActionItem(className, extendsOp, implementsOp, traits, traitsStatic)); + return output2; + } else { + ok = false; + } + + } else { + ok = false; } } From da586b105fcf90094b269ef9f04f737214d4ebd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Mon, 22 Jan 2018 22:06:40 +0100 Subject: [PATCH 25/58] - New AS2 class detector - Reference helper class moved to helper package. --- .../decompiler/flash/abc/avm2/AVM2Code.java | 5 +- .../AVM2DeobfuscatorRegisters.java | 5 +- .../AVM2DeobfuscatorRegistersOld.java | 5 +- .../flash/abc/avm2/graph/AVM2Graph.java | 11 +- .../flash/abc/avm2/graph/AVM2GraphSource.java | 5 +- .../instructions/InstructionDefinition.java | 5 +- .../parser/script/AVM2SourceGenerator.java | 4 +- .../parser/script/ActionScript3Parser.java | 4 +- .../parser/script/AssignableAVM2Item.java | 4 +- .../abc/avm2/parser/script/CallAVM2Item.java | 4 +- .../abc/avm2/parser/script/IndexAVM2Item.java | 4 +- .../abc/avm2/parser/script/NameAVM2Item.java | 4 +- .../abc/avm2/parser/script/NamespaceItem.java | 4 +- .../parser/script/NamespacedAVM2Item.java | 4 +- .../avm2/parser/script/PropertyAVM2Item.java | 4 +- .../jpexs/decompiler/flash/action/Action.java | 258 +------ .../decompiler/flash/action/ActionGraph.java | 17 +- .../flash/action/ActionGraphSource.java | 5 +- .../action/ActionScript2ClassDetector.java | 685 ++++++++++++++++++ .../src/com/jpexs/decompiler/graph/Graph.java | 21 +- .../parser/script => helpers}/Reference.java | 5 +- src/com/jpexs/decompiler/flash/gui/Main.java | 2 +- .../decompiler/flash/gui/abc/ABCPanel.java | 2 +- .../flash/gui/abc/DecompiledEditorPane.java | 2 +- .../gui/editor/LineMarkedEditorPane.java | 2 +- 25 files changed, 763 insertions(+), 308 deletions(-) create mode 100644 libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionScript2ClassDetector.java rename libsrc/ffdec_lib/src/com/jpexs/{decompiler/flash/abc/avm2/parser/script => helpers}/Reference.java (91%) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java index db9bad2a7..d94faf62c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.avm2; import com.jpexs.decompiler.flash.EndOfStreamException; @@ -264,7 +265,7 @@ import com.jpexs.decompiler.flash.abc.avm2.model.clauses.DeclarationAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.clauses.ForEachInAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.clauses.ForInAVM2Item; import com.jpexs.decompiler.flash.abc.avm2.parser.script.PropertyAVM2Item; -import com.jpexs.decompiler.flash.abc.avm2.parser.script.Reference; +import com.jpexs.helpers.Reference; import com.jpexs.decompiler.flash.abc.types.ABCException; import com.jpexs.decompiler.flash.abc.types.AssignedValue; import com.jpexs.decompiler.flash.abc.types.ConvertData; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorRegisters.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorRegisters.java index 758f06c8f..8d0499b23 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorRegisters.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorRegisters.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.avm2.deobfuscation; import com.jpexs.decompiler.flash.BaseLocalData; @@ -32,7 +33,7 @@ import com.jpexs.decompiler.flash.abc.avm2.instructions.localregs.SetLocalTypeIn import com.jpexs.decompiler.flash.abc.avm2.instructions.other.ReturnValueIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.other.ReturnVoidIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.other.ThrowIns; -import com.jpexs.decompiler.flash.abc.avm2.parser.script.Reference; +import com.jpexs.helpers.Reference; import com.jpexs.decompiler.flash.abc.types.MethodBody; import com.jpexs.decompiler.flash.abc.types.MethodInfo; import com.jpexs.decompiler.flash.abc.types.traits.Trait; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorRegistersOld.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorRegistersOld.java index 99d0da6e8..a53ab1816 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorRegistersOld.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/deobfuscation/AVM2DeobfuscatorRegistersOld.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.avm2.deobfuscation; import com.jpexs.decompiler.flash.BaseLocalData; @@ -30,7 +31,7 @@ import com.jpexs.decompiler.flash.abc.avm2.instructions.other.ReturnValueIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.other.ReturnVoidIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.other.ThrowIns; import com.jpexs.decompiler.flash.abc.avm2.model.NullAVM2Item; -import com.jpexs.decompiler.flash.abc.avm2.parser.script.Reference; +import com.jpexs.helpers.Reference; import com.jpexs.decompiler.flash.abc.types.MethodBody; import com.jpexs.decompiler.flash.abc.types.traits.Trait; import com.jpexs.decompiler.graph.Graph; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2Graph.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2Graph.java index 5f07c9ba6..a9d054920 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2Graph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2Graph.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.avm2.graph; import com.jpexs.decompiler.flash.BaseLocalData; @@ -571,8 +572,8 @@ public class AVM2Graph extends Graph { } @Override - protected void finalProcessAfter(List list, int level, FinalProcessLocalData localData) { - super.finalProcessAfter(list, level, localData); + protected void finalProcessAfter(List list, int level, FinalProcessLocalData localData, String path) { + super.finalProcessAfter(list, level, localData, path); for (int i = 0; i < list.size(); i++) { if (list.get(i) instanceof SetLocalAVM2Item) { SetLocalAVM2Item ri = (SetLocalAVM2Item) list.get(i); @@ -585,7 +586,7 @@ public class AVM2Graph extends Graph { } @Override - protected void finalProcess(List list, int level, FinalProcessLocalData localData) throws InterruptedException { + protected void finalProcess(List list, int level, FinalProcessLocalData localData, String path) throws InterruptedException { if (level == 0) { if (!list.isEmpty()) { @@ -702,7 +703,7 @@ public class AVM2Graph extends Graph { } } //Handle for loops at the end: - super.finalProcess(list, level, localData); + super.finalProcess(list, level, localData, path); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2GraphSource.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2GraphSource.java index 935238674..a6bb038d5 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2GraphSource.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/graph/AVM2GraphSource.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.avm2.graph; import com.jpexs.decompiler.flash.BaseLocalData; @@ -21,7 +22,7 @@ import com.jpexs.decompiler.flash.abc.AVM2LocalData; import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; import com.jpexs.decompiler.flash.abc.avm2.ConvertOutput; import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; -import com.jpexs.decompiler.flash.abc.avm2.parser.script.Reference; +import com.jpexs.helpers.Reference; import com.jpexs.decompiler.flash.abc.types.MethodBody; import com.jpexs.decompiler.graph.DottedChain; import com.jpexs.decompiler.graph.GraphPart; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/InstructionDefinition.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/InstructionDefinition.java index e8c59b02e..066712ffd 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/InstructionDefinition.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/instructions/InstructionDefinition.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.avm2.instructions; import com.jpexs.decompiler.flash.abc.ABC; @@ -29,7 +30,7 @@ import com.jpexs.decompiler.flash.abc.avm2.instructions.localregs.IncLocalIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.localregs.SetLocalTypeIns; import com.jpexs.decompiler.flash.abc.avm2.model.AVM2Item; import com.jpexs.decompiler.flash.abc.avm2.model.FullMultinameAVM2Item; -import com.jpexs.decompiler.flash.abc.avm2.parser.script.Reference; +import com.jpexs.helpers.Reference; import com.jpexs.decompiler.flash.abc.types.MethodBody; import com.jpexs.decompiler.flash.abc.types.Multiname; import com.jpexs.decompiler.flash.helpers.GraphTextWriter; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java index 9e3a06e4c..09b0239ef 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AVM2SourceGenerator.java @@ -12,9 +12,11 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.avm2.parser.script; +import com.jpexs.helpers.Reference; import com.jpexs.decompiler.flash.SWFInputStream; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; import com.jpexs.decompiler.flash.abc.ABC; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3Parser.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3Parser.java index c7becee79..fbb64fec9 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3Parser.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3Parser.java @@ -12,9 +12,11 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.avm2.parser.script; +import com.jpexs.helpers.Reference; import com.jpexs.decompiler.flash.SWC; import com.jpexs.decompiler.flash.SWF; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AssignableAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AssignableAVM2Item.java index 1f18b8d90..2534c027f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AssignableAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/AssignableAVM2Item.java @@ -12,9 +12,11 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.avm2.parser.script; +import com.jpexs.helpers.Reference; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instructions; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/CallAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/CallAVM2Item.java index 43b5b5715..fc65d41f0 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/CallAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/CallAVM2Item.java @@ -12,9 +12,11 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.avm2.parser.script; +import com.jpexs.helpers.Reference; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; import com.jpexs.decompiler.flash.abc.ABC; import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/IndexAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/IndexAVM2Item.java index 87e7c09f7..c91e506a7 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/IndexAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/IndexAVM2Item.java @@ -12,9 +12,11 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.avm2.parser.script; +import com.jpexs.helpers.Reference; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instructions; import com.jpexs.decompiler.flash.abc.types.Multiname; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NameAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NameAVM2Item.java index 46a4ad5a6..b03546135 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NameAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NameAVM2Item.java @@ -12,9 +12,11 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.avm2.parser.script; +import com.jpexs.helpers.Reference; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instructions; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NamespaceItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NamespaceItem.java index ca056fc58..c2cec4d21 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NamespaceItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NamespaceItem.java @@ -12,9 +12,11 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.avm2.parser.script; +import com.jpexs.helpers.Reference; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; import com.jpexs.decompiler.flash.abc.ABC; import com.jpexs.decompiler.flash.abc.types.Namespace; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NamespacedAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NamespacedAVM2Item.java index 819697414..8c82b63f5 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NamespacedAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/NamespacedAVM2Item.java @@ -12,9 +12,11 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.avm2.parser.script; +import com.jpexs.helpers.Reference; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; import com.jpexs.decompiler.flash.abc.ABC; import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/PropertyAVM2Item.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/PropertyAVM2Item.java index f30291de5..0f06f88d4 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/PropertyAVM2Item.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/PropertyAVM2Item.java @@ -12,9 +12,11 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.abc.avm2.parser.script; +import com.jpexs.helpers.Reference; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; import com.jpexs.decompiler.flash.abc.ABC; import com.jpexs.decompiler.flash.abc.avm2.AVM2ConstantPool; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java index 28f4a0c6f..0be700720 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java @@ -21,7 +21,7 @@ import com.jpexs.decompiler.flash.BaseLocalData; import com.jpexs.decompiler.flash.DisassemblyListener; import com.jpexs.decompiler.flash.SWF; import com.jpexs.decompiler.flash.SWFOutputStream; -import com.jpexs.decompiler.flash.abc.avm2.parser.script.Reference; +import com.jpexs.helpers.Reference; import com.jpexs.decompiler.flash.action.deobfuscation.ActionDeobfuscator; import com.jpexs.decompiler.flash.action.model.ActionItem; import com.jpexs.decompiler.flash.action.model.CallMethodActionItem; @@ -1214,262 +1214,6 @@ public abstract class Action implements GraphSourceItem { return ti; } - public static List checkClass(List output) { - if (true) { - //return output; - } - List ret = new ArrayList<>(); - List> traits = new ArrayList<>(); - List traitsStatic = new ArrayList<>(); - GraphTargetItem className; - GraphTargetItem extendsOp = null; - List implementsOp = new ArrayList<>(); - boolean ok = true; - int prevCount = 0; - for (GraphTargetItem t : output) { - if (t instanceof IfItem) { - IfItem it = (IfItem) t; - if (it.expression instanceof NotItem) { - NotItem nti = (NotItem) it.expression; - if ((nti.value instanceof GetMemberActionItem) || (nti.value instanceof GetVariableActionItem)) { - if ((it.onTrue.size() == 1) && (it.onTrue.get(0) instanceof SetMemberActionItem) && (((SetMemberActionItem) it.onTrue.get(0)).value instanceof NewObjectActionItem)) { - // ignore - } else { - List parts = it.onTrue; - className = getWithoutGlobal(nti.value); - if (parts.size() >= 1) { - int ipos = 0; - - while ((parts.get(ipos) instanceof PopItem) || ((parts.get(ipos) instanceof IfItem) && ((((IfItem) parts.get(ipos)).onTrue.size() == 1) && (((IfItem) parts.get(ipos)).onTrue.get(0) instanceof SetMemberActionItem) && (((SetMemberActionItem) ((IfItem) parts.get(ipos)).onTrue.get(0)).value instanceof NewObjectActionItem)))) { - ipos++; - } - if (parts.get(ipos) instanceof ExtendsActionItem) { - ExtendsActionItem et = (ExtendsActionItem) parts.get(ipos); - extendsOp = getWithoutGlobal(et.superclass); - ipos++; - } - int instanceReg = -1; - int classReg = -1; - if (parts.get(ipos) instanceof StoreRegisterActionItem) { - StoreRegisterActionItem sr = (StoreRegisterActionItem) parts.get(ipos); - instanceReg = sr.register.number; - if (sr.value instanceof GetMemberActionItem) { - GetMemberActionItem gm = (GetMemberActionItem) sr.value; - //gm.memberName should be "prototype" - if (gm.object instanceof TemporaryRegister) { - TemporaryRegister tm = (TemporaryRegister) gm.object; - classReg = tm.getRegId(); - if (tm.value instanceof SetMemberActionItem) { - SetMemberActionItem sm = (SetMemberActionItem) tm.value; - if (sm.value instanceof StoreRegisterActionItem) { - sr = (StoreRegisterActionItem) sm.value; - if (sr.value instanceof FunctionActionItem) { - ((FunctionActionItem) (sr.value)).calculatedFunctionName = sm.objectName; //(className instanceof GetMemberActionItem) ? ((GetMemberActionItem) className).memberName : className; - //This is probably a constructor - traits.add(new MyEntry<>(((FunctionActionItem) (sr.value)).calculatedFunctionName, ((FunctionActionItem) sr.value))); - traitsStatic.add(false); - } - - } - } - } - } - } else if (parts.get(ipos) instanceof SetMemberActionItem) { - SetMemberActionItem sm = (SetMemberActionItem) parts.get(0); - if (sm.value instanceof FunctionActionItem) { - FunctionActionItem f = (FunctionActionItem) sm.value; - if (f.actions.isEmpty()) { - if (parts.size() == 2) { - if (parts.get(1) instanceof ImplementsOpActionItem) { - ImplementsOpActionItem iot = (ImplementsOpActionItem) parts.get(1); - implementsOp = iot.superclasses; - } else { - //ok = false; - break; - } - } - List output2 = new ArrayList<>(); - for (int i = 0; i < prevCount; i++) { - output2.add(output.get(i)); - } - output2.add(new InterfaceActionItem(sm.objectName, implementsOp)); - return output2; - } - } - } - - for (; ipos < parts.size(); ipos++) { - if (parts.get(ipos) instanceof ImplementsOpActionItem) { - ImplementsOpActionItem io = (ImplementsOpActionItem) parts.get(ipos); - implementsOp = io.superclasses; - continue; - } else if (parts.get(ipos) instanceof SetMemberActionItem) { - SetMemberActionItem sm = (SetMemberActionItem) parts.get(ipos); - - if (sm.object instanceof TemporaryRegister) { - TemporaryRegister treg = (TemporaryRegister) sm.object; - if (classReg > -1 && treg.getRegId() == classReg) { - - } else if (instanceReg > -1 && treg.getRegId() == instanceReg) { - - } else if (sm.object.value instanceof SetMemberActionItem) { - SetMemberActionItem sm2 = (SetMemberActionItem) sm.object.value; - if ((sm2.objectName instanceof DirectValueActionItem) && "prototype".equals(((DirectValueActionItem) sm2.objectName).getAsString())) { - instanceReg = treg.getRegId(); - extendsOp = getWithoutGlobal(sm2.object); - } else { - classReg = treg.getRegId(); - GraphTargetItem val = sm2.value; - if (val instanceof StoreRegisterActionItem) { - val = val.value; - } - if (val instanceof FunctionActionItem) { - //Is this a constructor? - //((FunctionActionItem) (constructor)).calculatedFunctionName = (className instanceof GetMemberActionItem) ? ((GetMemberActionItem) className).memberName : className; - } - } - } - - } - - int rnum = -1; - if (sm.object instanceof DirectValueActionItem) { - DirectValueActionItem dv = (DirectValueActionItem) sm.object; - if (dv.value instanceof RegisterNumber) { - RegisterNumber rn = (RegisterNumber) dv.value; - rnum = rn.number; - } - } - if (sm.object instanceof TemporaryRegister) { - rnum = ((TemporaryRegister) sm.object).getRegId(); - } - - if (rnum == instanceReg || rnum == classReg) { - if (sm.value instanceof FunctionActionItem) { - ((FunctionActionItem) sm.value).calculatedFunctionName = sm.objectName; - } - traits.add(new MyEntry<>(sm.objectName, sm.value)); - traitsStatic.add(rnum == classReg); - } - } else if (parts.get(ipos) instanceof PushItem) { - if (parts.get(ipos).value instanceof CallMethodActionItem) { - CallMethodActionItem cm = (CallMethodActionItem) parts.get(ipos).value; - if (cm.methodName instanceof DirectValueActionItem) { - if ("addProperty".equals(((DirectValueActionItem) cm.methodName).getAsString())) { - int rnum = -1; - if (cm.scriptObject instanceof DirectValueActionItem) { - DirectValueActionItem dv = (DirectValueActionItem) cm.scriptObject; - if (dv.value instanceof RegisterNumber) { - RegisterNumber rn = (RegisterNumber) dv.value; - rnum = rn.number; - } - } - if (cm.scriptObject instanceof TemporaryRegister) { - rnum = ((TemporaryRegister) cm.scriptObject).getRegId(); - } - - if (cm.arguments.size() > 1) { - GraphTargetItem propertyName = cm.arguments.get(0); //name - GraphTargetItem propertyGetter = cm.arguments.get(1); //getter - GraphTargetItem propertySetter = cm.arguments.get(2); //setter - if ((propertyName instanceof DirectValueActionItem) && ((DirectValueActionItem) propertyName).isString()) { - String propertyNameStr = ((DirectValueActionItem) propertyName).getAsString(); - if (propertyGetter instanceof GetMemberActionItem) { - if (((GetMemberActionItem) propertyGetter).object instanceof TemporaryRegister) { - if (((TemporaryRegister) ((GetMemberActionItem) propertyGetter).object).getRegId() == rnum) { - if (((GetMemberActionItem) propertyGetter).memberName instanceof DirectValueActionItem) { - DirectValueActionItem mNameDv = (DirectValueActionItem) ((GetMemberActionItem) propertyGetter).memberName; - if (mNameDv.isString()) { - String getterNameStr = mNameDv.getAsString(); - if (getterNameStr.equals("__get__" + propertyNameStr)) { - //TODO: handle setter - } - } - } - - } - } - } else if (propertyGetter instanceof FunctionActionItem) { - FunctionActionItem getterFunc = (FunctionActionItem) propertyGetter; - if (getterFunc.actions.isEmpty() && getterFunc.functionName.isEmpty() && ((FunctionActionItem) propertyGetter).paramNames.isEmpty()) { - //well, no getter then - } else { - logger.severe("unexpected getter value for property " + propertyNameStr); - } - } else { - logger.severe("unexpected getter value for property " + propertyNameStr + ": " + propertyGetter.getClass().getSimpleName()); - } - - if (propertySetter instanceof GetMemberActionItem) { - if (((GetMemberActionItem) propertySetter).object instanceof TemporaryRegister) { - if (((TemporaryRegister) ((GetMemberActionItem) propertySetter).object).getRegId() == rnum) { - if (((GetMemberActionItem) propertySetter).memberName instanceof DirectValueActionItem) { - DirectValueActionItem mNameDv = (DirectValueActionItem) ((GetMemberActionItem) propertySetter).memberName; - if (mNameDv.isString()) { - String getterNameStr = mNameDv.getAsString(); - if (getterNameStr.equals("__set__" + propertyNameStr)) { - //TODO: handle setter - } - } - } - - } - } - } else if (propertySetter instanceof FunctionActionItem) { - FunctionActionItem setterFunc = (FunctionActionItem) propertySetter; - if (setterFunc.actions.isEmpty() && setterFunc.functionName.isEmpty() && ((FunctionActionItem) propertySetter).paramNames.isEmpty()) { - //well, no setter then - } else { - logger.severe("unexpected setter value for property " + propertyNameStr); - } - //no setter - } else { - logger.severe("unexpected setter value for property " + propertyNameStr + ": " + propertySetter.getClass().getSimpleName()); - } - } - } - } - } - } - } else { - break; - } - } - boolean isAClass = !(traits.isEmpty() && extendsOp == null && implementsOp.isEmpty()); - - if (isAClass) { - List output2 = new ArrayList<>(); - for (int i = 0; i < prevCount; i++) { - output2.add(output.get(i)); - } - output2.add(new ClassActionItem(className, extendsOp, implementsOp, traits, traitsStatic)); - return output2; - } else { - ok = false; - } - - } else { - ok = false; - } - } - - } else { - ok = false; - } - } else { - ok = false; - } - } else if (!(t instanceof PopItem)) { - prevCount++; - //ok = false; - } - if (!ok) { - break; - } - } - return output; - } - @Override public boolean ignoredLoops() { return false; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java index dcab0b63b..145f228e9 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.action; import com.jpexs.decompiler.flash.BaseLocalData; @@ -81,7 +82,7 @@ public class ActionGraph extends Graph { } @Override - public void finalProcessStack(TranslateStack stack, List output) { + public void finalProcessStack(TranslateStack stack, List output, String path) { if (stack.size() > 0) { for (int i = stack.size() - 1; i >= 0; i--) { //System.err.println(stack.get(i)); @@ -96,12 +97,10 @@ public class ActionGraph extends Graph { } @Override - protected void finalProcess(List list, int level, FinalProcessLocalData localData) throws InterruptedException { - List ret = Action.checkClass(list); - if (ret != list) { - list.clear(); - list.addAll(ret); - } + protected void finalProcess(List list, int level, FinalProcessLocalData localData, String path) throws InterruptedException { + + ActionScript2ClassDetector detector = new ActionScript2ClassDetector(); + detector.checkClass(list, path); int targetStart; int targetEnd; @@ -188,7 +187,7 @@ public class ActionGraph extends Graph { } } //Handle for loops at the end: - super.finalProcess(list, level, localData); + super.finalProcess(list, level, localData, path); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraphSource.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraphSource.java index 75b5cf097..664a19b25 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraphSource.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraphSource.java @@ -12,11 +12,12 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.action; import com.jpexs.decompiler.flash.BaseLocalData; -import com.jpexs.decompiler.flash.abc.avm2.parser.script.Reference; +import com.jpexs.helpers.Reference; import com.jpexs.decompiler.graph.GraphPart; import com.jpexs.decompiler.graph.GraphSource; import com.jpexs.decompiler.graph.GraphSourceItem; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionScript2ClassDetector.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionScript2ClassDetector.java new file mode 100644 index 000000000..d3e70c8c2 --- /dev/null +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionScript2ClassDetector.java @@ -0,0 +1,685 @@ +/* + * Copyright (C) 2010-2018 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.flash.action; + +import com.jpexs.decompiler.flash.action.model.CallFunctionActionItem; +import com.jpexs.helpers.Reference; +import com.jpexs.decompiler.flash.action.model.CallMethodActionItem; +import com.jpexs.decompiler.flash.action.model.DirectValueActionItem; +import com.jpexs.decompiler.flash.action.model.ExtendsActionItem; +import com.jpexs.decompiler.flash.action.model.FunctionActionItem; +import com.jpexs.decompiler.flash.action.model.GetMemberActionItem; +import com.jpexs.decompiler.flash.action.model.GetVariableActionItem; +import com.jpexs.decompiler.flash.action.model.ImplementsOpActionItem; +import com.jpexs.decompiler.flash.action.model.NewMethodActionItem; +import com.jpexs.decompiler.flash.action.model.NewObjectActionItem; +import com.jpexs.decompiler.flash.action.model.SetMemberActionItem; +import com.jpexs.decompiler.flash.action.model.SetVariableActionItem; +import com.jpexs.decompiler.flash.action.model.StoreRegisterActionItem; +import com.jpexs.decompiler.flash.action.model.TemporaryRegister; +import com.jpexs.decompiler.flash.action.model.clauses.ClassActionItem; +import com.jpexs.decompiler.flash.action.model.clauses.InterfaceActionItem; +import com.jpexs.decompiler.flash.action.swf4.RegisterNumber; +import com.jpexs.decompiler.flash.ecma.Null; +import com.jpexs.decompiler.flash.helpers.collections.MyEntry; +import com.jpexs.decompiler.graph.GraphTargetItem; +import com.jpexs.decompiler.graph.model.IfItem; +import com.jpexs.decompiler.graph.model.NotItem; +import com.jpexs.decompiler.graph.model.PopItem; +import com.jpexs.decompiler.graph.model.PushItem; +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * + * @author JPEXS + */ +public class ActionScript2ClassDetector { + + private static final Logger logger = Logger.getLogger(ActionScript2ClassDetector.class.getName()); + + private class AssertException extends Exception { + + private final String condition; + + public AssertException(String condition) { + super(condition); + this.condition = condition; + } + + public String getCondition() { + return condition; + } + + } + + /** + * Checks whether an item is direct submember of path. a.b.c.d is submember + * of a.b.c, x.y.z is not submember of x, + * + * @param item + * @param objectPath + * @param newPathItem New submember name + * @return + */ + private boolean isMemberOfPath(GraphTargetItem item, List objectPath, Reference newPathItem) { + List path = getMembersPath(item); + if (path == null) { + return false; + } + if (path.size() != objectPath.size() + 1) { + return false; + } + for (int i = 0; i < objectPath.size(); i++) { + if (!path.get(i).equals(objectPath.get(i))) { + return false; + } + } + newPathItem.setVal(path.get(path.size() - 1)); + return true; + } + + /** + * Gets path of variable and its getMembers: a.b.c.d => [a,b,c,d] + * + * @param item + * @return List of path or null if not members path + */ + private List getMembersPath(GraphTargetItem item) { + List ret = new ArrayList<>(); + while (item instanceof GetMemberActionItem) { + GetMemberActionItem mem = (GetMemberActionItem) item; + if (!(mem.memberName instanceof DirectValueActionItem)) { + return null; + } + DirectValueActionItem dv = ((DirectValueActionItem) mem.memberName); + if (!dv.isString()) { + return null; + } + ret.add(0, dv.getAsString()); + item = mem.object; + } + if (!(item instanceof GetVariableActionItem)) { + return null; + } + GetVariableActionItem gv = (GetVariableActionItem) item; + if (!(gv.name instanceof DirectValueActionItem)) { + return null; + } + DirectValueActionItem dv = ((DirectValueActionItem) gv.name); + if (!dv.isString()) { + return null; + } + String varName = dv.getAsString(); + ret.add(0, varName); + return ret; + } + + private GraphTargetItem setMemberToGetMember(GraphTargetItem item) { + if (item instanceof SetMemberActionItem) { + return new GetMemberActionItem(null, null, ((SetMemberActionItem) item).object, ((SetMemberActionItem) item).objectName); + } else if (item instanceof SetVariableActionItem) { + return new GetVariableActionItem(null, null, ((SetVariableActionItem) item).name); + } + return null; + } + + private GraphTargetItem newToGetMember(GraphTargetItem nobj) throws AssertException { + if (nobj instanceof NewMethodActionItem) { + NewMethodActionItem nm = (NewMethodActionItem) nobj; + return new GetMemberActionItem(nobj.getSrc(), nobj.getLineStartItem(), nm.scriptObject, nm.methodName); + } else if (nobj instanceof NewObjectActionItem) { + NewObjectActionItem no = (NewObjectActionItem) nobj; + return new GetVariableActionItem(nobj.getSrc(), nobj.getLineStartItem(), no.objectName); + } + throw new AssertException("NewMethod or NewObject expected"); + } + + private List getSetMembersPath(GraphTargetItem item) { + if (item instanceof SetVariableActionItem) { + SetVariableActionItem sv = (SetVariableActionItem) item; + if (!(sv.name instanceof DirectValueActionItem)) { + return null; + } + DirectValueActionItem nDv = (DirectValueActionItem) sv.name; + if (!nDv.isString()) { + return null; + } + List ret = new ArrayList<>(); + ret.add(nDv.getAsString()); + return ret; + } else if (item instanceof SetMemberActionItem) { + SetMemberActionItem sm = (SetMemberActionItem) item; + if (!(sm.objectName instanceof DirectValueActionItem)) { + return null; + } + DirectValueActionItem onDv = (DirectValueActionItem) sm.objectName; + if (!onDv.isString()) { + return null; + } + String currentMemberName = onDv.getAsString(); + List path = getMembersPath(sm.object); + if (path == null) { + return null; + } + path.add(currentMemberName); + return path; + } else { + return null; + } + } + + /** + * Get register id or -1 if not found + * + * @param item + * @return + */ + private int getAsRegisterNum(GraphTargetItem item, String assertName) throws AssertException { + if (item instanceof DirectValueActionItem) { + DirectValueActionItem dv = (DirectValueActionItem) item; + if (dv.value instanceof RegisterNumber) { + RegisterNumber rn = (RegisterNumber) dv.value; + return rn.number; + } + } + if (item instanceof TemporaryRegister) { + TemporaryRegister tr = (TemporaryRegister) item; + return tr.getRegId(); + } + throw new AssertException("not a register - " + assertName); + } + + /*private boolean isInstanceRegister(GraphTargetItem item, Reference instanceReg, Reference classReg,Reference extracted, String assertName) throws AssertException { + if (item instanceof DirectValueActionItem) { + DirectValueActionItem dv = (DirectValueActionItem) item; + if (dv.value instanceof RegisterNumber) { + RegisterNumber rn = (RegisterNumber) dv.value; + if (rn.number == instanceReg.getVal()) { + return true; + } else if (rn.number == classReg.getVal()) { + return false; + }else{ + throw new AssertException(assertName + " - unknown register"); + } + } + } + if (item instanceof TemporaryRegister) { + TemporaryRegister tr = (TemporaryRegister) item; + if (!"prototype".equals(getAsString(gm.memberName, "memberName"))) { + throw new AssertException("memberName not \"prototype\""); + } + return tr.getRegId(); + } + } + */ + public static GraphTargetItem getWithoutGlobal(GraphTargetItem ti) { + GraphTargetItem t = ti; + if (!(t instanceof GetMemberActionItem)) { + return ti; + } + GetMemberActionItem lastMember = null; + while (((GetMemberActionItem) t).object instanceof GetMemberActionItem) { + lastMember = (GetMemberActionItem) t; + t = ((GetMemberActionItem) t).object; + } + if (((GetMemberActionItem) t).object instanceof GetVariableActionItem) { + GetVariableActionItem v = (GetVariableActionItem) ((GetMemberActionItem) t).object; + if (v.name instanceof DirectValueActionItem) { + if (((DirectValueActionItem) v.name).value instanceof String) { + if (((DirectValueActionItem) v.name).value.equals("_global")) { + GetVariableActionItem gvt = new GetVariableActionItem(null, null, ((GetMemberActionItem) t).memberName); + if (lastMember == null) { + return gvt; + } else { + lastMember.object = gvt; + } + } + } + } + } + return ti; + } + + private String getAsString(GraphTargetItem item, String itemName) throws AssertException { + if (!(item instanceof DirectValueActionItem)) { + throw new AssertException(itemName + " not DirectValue"); + } + DirectValueActionItem mnDv = (DirectValueActionItem) item; + if (!mnDv.isString()) { + throw new AssertException(itemName + " not string"); + } + return mnDv.getAsString(); + } + + public void checkClass(List commands, String scriptPath) { + /* + class a.b.c.D: + + if(!_global.a) + { + _global.a = new Object(); + } + §§pop(); + if(!_global.a.b) + { + _global.a.b = new Object(); + } + §§pop(); + if(!_global.a.b.c) + { + _global.a.b.c = new Object(); + } + §§pop(); + if(!_global.a.b.c.D) + { + ... + §§push(ASSetPropFlags(a.b.c.D.prototype,null,1)); + } + §§pop(); + + */ + + List pathToSearchInIfCond = new ArrayList<>(); + pathToSearchInIfCond.add("_global"); + + looppos: + for (int pos = 0; pos < commands.size(); pos++) { + + //start with _global. + if (pathToSearchInIfCond.size() > 1) { + pathToSearchInIfCond.clear(); + pathToSearchInIfCond.add("_global"); + } + + loopcheck: + for (int checkPos = pos; checkPos < commands.size(); checkPos++) { + GraphTargetItem t = commands.get(checkPos); + if (t instanceof IfItem) { + IfItem it = (IfItem) t; + if (it.expression instanceof NotItem) { + NotItem nti = (NotItem) it.expression; + GraphTargetItem condType = nti.value; + Reference newMemberNameRef = new Reference<>(""); + if (isMemberOfPath(condType, pathToSearchInIfCond, newMemberNameRef)) { + pathToSearchInIfCond.add(newMemberNameRef.getVal()); + + //_global.a.b.c = new Object(); + if ((it.onTrue.size() == 1) && (it.onTrue.get(0) instanceof SetMemberActionItem) && (((SetMemberActionItem) it.onTrue.get(0)).value instanceof NewObjectActionItem)) { + //skip §§pop item if its there right after if + if (checkPos + 1 < commands.size()) { + GraphTargetItem tnext = commands.get(checkPos + 1); + if (tnext instanceof PopItem) { + checkPos++; + } + } + continue loopcheck; + } + + List parts = it.onTrue; + + List classNamePath = pathToSearchInIfCond; + classNamePath.remove(0); //remove "_global" + + int ppos = 0; + GraphTargetItem item = parts.get(ppos); + GraphTargetItem extendsOp = null; + List implementsOp = new ArrayList<>(); + if (item instanceof ExtendsActionItem) { + ExtendsActionItem et = (ExtendsActionItem) parts.get(ppos); + extendsOp = getWithoutGlobal(et.superclass); + ppos++; + item = parts.get(ppos); + } + try { + int instanceReg = -1; + int classReg = -1; + GraphTargetItem classNameTargetPath = null; + GraphTargetItem constructor = null; + if (item instanceof StoreRegisterActionItem) { + StoreRegisterActionItem sr = (StoreRegisterActionItem) item; + instanceReg = sr.register.number; + if (sr.value instanceof GetMemberActionItem) { + GetMemberActionItem gm = (GetMemberActionItem) sr.value; + if (gm.object instanceof TemporaryRegister) { + TemporaryRegister treg = (TemporaryRegister) gm.object; + classReg = treg.getRegId(); + if (!"prototype".equals(getAsString(gm.memberName, "memberName"))) { + throw new AssertException("memberName not \"prototype\""); + } + if ((treg.value instanceof SetMemberActionItem) || (treg.value instanceof SetVariableActionItem)) { + List path = getSetMembersPath(treg.value); + if (path == null || path.isEmpty()) { + logger.severe("Cannot detect class - tempreg value is not a path"); + break loopcheck; + } + //remove _global if it's there - happens for classes in global package + if ("_global".equals(path.get(0))) { + path.remove(0); + } + if (classNamePath.equals(path)) { + //can start with _global for classes on top level + classNameTargetPath = getWithoutGlobal(setMemberToGetMember(treg.value)); + + //treg.value.value is the value being set - treg.value is setmember ot setvariable + if (!(treg.value.value instanceof StoreRegisterActionItem)) { + throw new AssertException("Constructor expected to be in storeregister"); + } + if (!(treg.value.value.value instanceof FunctionActionItem)) { + throw new AssertException("Constructor expected as functionitem"); + } + constructor = treg.value.value.value; + } else { + throw new AssertException("temporaryreg value does not match class path"); + } + } else { + throw new AssertException("temporaryreg value not setmember/setvariable"); + } + } else { + throw new AssertException("Getmember does not have TemporaryRegister as object"); + } + } else { + throw new AssertException("Not Getmember in StoreRegister"); + } + ppos++; + } + List> traits = new ArrayList<>(); + List traitsStatic = new ArrayList<>(); + loopsetmembers: + for (; ppos < parts.size(); ppos++) { + item = parts.get(ppos); + if (item instanceof SetMemberActionItem) { + SetMemberActionItem sm = (SetMemberActionItem) item; + GraphTargetItem regValue; + int currentRegId = -1; + if (sm.object instanceof TemporaryRegister) { + TemporaryRegister tempReg = (TemporaryRegister) sm.object; + currentRegId = tempReg.getRegId(); + regValue = tempReg.value; + } else if ((sm.object instanceof DirectValueActionItem) && (((DirectValueActionItem) sm.object).value instanceof RegisterNumber)) { + DirectValueActionItem dv = (DirectValueActionItem) sm.object; + RegisterNumber rn = ((RegisterNumber) dv.value); + currentRegId = rn.number; + regValue = dv.computedRegValue; + } else { + //might be an interface + List path = getSetMembersPath(item); + if (path == null || path.isEmpty()) { + throw new AssertException("invalid setmember"); + } + //remove _global if it's there - happens for classes in global package + if ("_global".equals(path.get(0))) { + path.remove(0); + } + if (!path.equals(classNamePath)) { + throw new AssertException("wrong path in setmember"); + } + GraphTargetItem interfaceClass = getWithoutGlobal(setMemberToGetMember(item)); + if (!(sm.value instanceof FunctionActionItem)) { + logger.severe("Cannot detect class - not a function in setmember"); + break loopcheck; + } + FunctionActionItem f = (FunctionActionItem) sm.value; + if (!"".equals(f.functionName)) { + throw new AssertException("not unnamed func in setmember"); + } + if (!f.actions.isEmpty()) { + throw new AssertException("not empty function in setmember"); + } + if (!f.paramNames.isEmpty()) { + throw new AssertException("not empty params for function in setmember"); + } + ppos++; + for (; ppos < parts.size(); ppos++) { + item = parts.get(ppos); + if (item instanceof ImplementsOpActionItem) { + if (!implementsOp.isEmpty()) { + throw new AssertException("multiple implementsAction"); + } + ImplementsOpActionItem io = (ImplementsOpActionItem) item; + implementsOp = io.superclasses; + } else { + throw new AssertException("unknown iface item: " + item.getClass().getSimpleName()); + } + } + + InterfaceActionItem ifsItem = new InterfaceActionItem(interfaceClass, implementsOp); + for (int k = pos; k <= checkPos; k++) { + commands.remove(pos); + } + commands.add(pos, ifsItem); + + //remove §§pop after, if it's there + if (pos + 1 < commands.size()) { + if (commands.get(pos + 1) instanceof PopItem) { + commands.remove(pos + 1); + } + } + + // goto next line and check next classes + continue looppos; + } + //it was register .. continue class detection + if (currentRegId != instanceReg && currentRegId != classReg) { + if (!(regValue instanceof SetMemberActionItem)) { + throw new AssertException("temp register do not contain setmember"); + } + SetMemberActionItem sm2 = (SetMemberActionItem) regValue; + GraphTargetItem pathSource; + boolean isPrototype; + if ("prototype".equals(getAsString(sm2.objectName, "objectName"))) { + pathSource = sm2.object; + isPrototype = true; + } else { + pathSource = setMemberToGetMember(sm2); + isPrototype = false; + } + List memPath = getMembersPath(pathSource); + if (memPath == null) { + throw new AssertException("Invalid pathsource"); + } + if (!classNamePath.equals(memPath)) { + throw new AssertException("Invalid path of setmember:" + String.join(".", memPath)); + } + classNameTargetPath = pathSource; + if (!(sm2.value instanceof StoreRegisterActionItem)) { + throw new AssertException("Not storeregister"); + } + StoreRegisterActionItem sr = (StoreRegisterActionItem) sm2.value; + if (sr.register.number != currentRegId) { + throw new AssertException("Invalid storeregister"); + } + if (isPrototype && ((sr.value instanceof NewMethodActionItem) || (sr.value instanceof NewObjectActionItem))) { + extendsOp = newToGetMember(sr.value); + instanceReg = currentRegId; + } else if (!isPrototype && (sr.value instanceof FunctionActionItem)) { //constructor + constructor = sr.value; + classReg = currentRegId; + } else { + throw new AssertException("invalid storeregister value: " + sr.value.getClass().getSimpleName()); + } + } + + MyEntry trait = new MyEntry<>(sm.objectName, sm.value); + if (sm.value instanceof FunctionActionItem) { + FunctionActionItem f = (FunctionActionItem) sm.value; + f.calculatedFunctionName = sm.objectName; + } + traits.add(trait); + if (currentRegId == instanceReg) { + traitsStatic.add(false); + } else if (currentRegId == classReg) { + traitsStatic.add(true); + } + } else if (item instanceof ImplementsOpActionItem) { + ImplementsOpActionItem iot = (ImplementsOpActionItem) item; + implementsOp = iot.superclasses; + } else { + break loopsetmembers; + } + } + looppushes: + for (; ppos < parts.size(); ppos++) { + item = parts.get(ppos); + if (item instanceof PushItem) { + PushItem pi = (PushItem) item; + if (pi.value instanceof CallMethodActionItem) { + CallMethodActionItem cm = (CallMethodActionItem) pi.value; + String pushMethodName = getAsString(cm.methodName, "push methodName"); + if ("addProperty".equals(pushMethodName)) { + int rnumObject = getAsRegisterNum(cm.scriptObject, "addProperty not on register"); + if ((rnumObject != instanceReg) && (rnumObject != classReg)) { + throw new AssertException("unexpected addProperty object register " + rnumObject); + } + + if (cm.arguments.size() != 3) { + throw new AssertException("invalid number of arguments to addProperty: " + cm.arguments.size()); + } + GraphTargetItem propertyName = cm.arguments.get(0); + GraphTargetItem propertyGetter = cm.arguments.get(1); + GraphTargetItem propertySetter = cm.arguments.get(2); + String propertyNameStr = getAsString(propertyName, "propertyName"); + if (propertyGetter instanceof GetMemberActionItem) { + int regId = getAsRegisterNum(((GetMemberActionItem) propertyGetter).object, "getter member not register"); + if (rnumObject != regId) { + throw new AssertException("getter register does not match property register " + regId + " <=> " + rnumObject); + } + String getterNameStr = getAsString(((GetMemberActionItem) propertyGetter).memberName, "getter memberName"); + if (!(getterNameStr.equals("__get__" + propertyNameStr))) { + throw new AssertException("getter does not match property name"); + } + //TODO: handle getter HERE + + } else if (propertyGetter instanceof FunctionActionItem) { + FunctionActionItem getterFunc = (FunctionActionItem) propertyGetter; + if (!(getterFunc.actions.isEmpty() && getterFunc.functionName.isEmpty() && ((FunctionActionItem) propertyGetter).paramNames.isEmpty())) { + logger.severe("Cannot detect class - unexpected getter value for property " + propertyNameStr); + break loopcheck; + } + //we got empty getter + } else { + logger.severe("Cannot detect class - unexpected getter value for property " + propertyNameStr + ": " + propertyGetter.getClass().getSimpleName()); + break loopcheck; + } + + if (propertySetter instanceof GetMemberActionItem) { + int regId = getAsRegisterNum(((GetMemberActionItem) propertySetter).object, "setter member"); + if (rnumObject != regId) { + throw new AssertException("setter register does not match property register " + regId + " <=> " + rnumObject); + } + String setterNameStr = getAsString(((GetMemberActionItem) propertySetter).memberName, "setter memberNAme"); + if (!(setterNameStr.equals("__set__" + propertyNameStr))) { + throw new AssertException("setter does not match property name"); + } + //TODO: handle setter HERE + } else if (propertySetter instanceof FunctionActionItem) { + FunctionActionItem setterFunc = (FunctionActionItem) propertySetter; + if (!(setterFunc.actions.isEmpty() && setterFunc.functionName.isEmpty() && ((FunctionActionItem) propertySetter).paramNames.isEmpty())) { + throw new AssertException("unexpected getter value for property " + propertyNameStr); + } + //we got empty setter + } else { + throw new AssertException("unexpected setter value for property " + propertyNameStr + ": " + propertySetter.getClass().getSimpleName()); + } + + } else { + throw new AssertException("unknown push method name: " + pushMethodName); + } + + } else if (pi.value instanceof CallFunctionActionItem) { + CallFunctionActionItem cf = (CallFunctionActionItem) pi.value; + String funName = getAsString(cf.functionName, "pushitem function name"); + if (funName.equals("ASSetPropFlags")) { + //it should be ASSetPropFlags(a.b.c.D.prototype,null,1) as it sets prototype to hidden + //see http://www.ryanjuckett.com/programming/how-to-use-assetpropflags-in-actionscript-2-0/ + if (cf.arguments.size() != 3) { + throw new AssertException("Invalid number of arguments to ASSetPropFlags:" + cf.arguments.size() + ", 3 expected"); + } + GraphTargetItem obj = cf.arguments.get(0); + GraphTargetItem props = cf.arguments.get(1); + GraphTargetItem flags = cf.arguments.get(2); + List path = getMembersPath(obj); + if (path != null && !path.isEmpty() && "_global".equals(path.get(0))) { //For classes in toplevel package, there's _global in path + path.remove(0); //remove that _global + } + List classPathWithPrototype = new ArrayList<>(); + classPathWithPrototype.addAll(classNamePath); + classPathWithPrototype.add("prototype"); + if (!classPathWithPrototype.equals(path)) { + throw new AssertException("ASSetPropFlags not on prototype"); + } + if (!((props instanceof DirectValueActionItem) && (((DirectValueActionItem) props).value == Null.INSTANCE))) { + throw new AssertException("ASSetPropFlags properties param not null"); + } + if (!((flags instanceof DirectValueActionItem) && (((DirectValueActionItem) flags).value == (Long) 1L))) { + throw new AssertException("ASSetPropFlags flags not set to 1"); + } + } else { + throw new AssertException("unknown pushitem function call " + funName); + } + } else { + throw new AssertException("unknown pushitem - " + pi.value.getClass().getSimpleName()); + } + } else { + throw new AssertException("unknown item - " + item.getClass().getSimpleName()); + } + }//end loop pushes + + if (constructor != null) { //constructor should be there always, but just in calse + //add constructor as trait + traitsStatic.add(0, false); + DirectValueActionItem classBaseName = new DirectValueActionItem(classNamePath.get(classNamePath.size() - 1)); + ((FunctionActionItem) constructor).calculatedFunctionName = classBaseName; + traits.add(0, new MyEntry<>(classBaseName, constructor)); + } else { + throw new AssertException("No constructor found"); + } + + ClassActionItem clsItem = new ClassActionItem(classNameTargetPath, extendsOp, implementsOp, traits, traitsStatic); + for (int k = pos; k <= checkPos; k++) { + commands.remove(pos); + } + commands.add(pos, clsItem); + + //remove §§pop after, if it's there + if (pos + 1 < commands.size()) { + if (commands.get(pos + 1) instanceof PopItem) { + commands.remove(pos + 1); + } + } + + // goto next line and check next classes + continue looppos; + } catch (AssertException ex) { + logger.log(Level.WARNING, "{0}: Cannot detect class - {1}", new Object[]{scriptPath, ex.getCondition()}); + break loopcheck; + } + } else { + break loopcheck; //not !_global.a.b or not member of previous + } + } else { + break loopcheck; //not an if ! + } + } else { + break loopcheck; //not an if + } + } //loopcheck + }//looppos + } +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java index 2d21d6dbc..0347d2c0c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.graph; import com.jpexs.decompiler.flash.BaseLocalData; @@ -643,25 +644,25 @@ public class Graph { System.err.println("");//*/ List ret = printGraph(new HashMap<>(), new HashMap<>(), localData, stack, allParts, null, heads.get(0), null, loops, staticOperation, path); processIfs(ret); - finalProcessStack(stack, ret); - finalProcessAll(ret, 0, new FinalProcessLocalData()); + finalProcessStack(stack, ret, path); + finalProcessAll(ret, 0, new FinalProcessLocalData(), path); return ret; } - public void finalProcessStack(TranslateStack stack, List output) { + public void finalProcessStack(TranslateStack stack, List output, String path) { } - private void finalProcessAll(List list, int level, FinalProcessLocalData localData) throws InterruptedException { - finalProcess(list, level, localData); + private void finalProcessAll(List list, int level, FinalProcessLocalData localData, String path) throws InterruptedException { + finalProcess(list, level, localData, path); for (GraphTargetItem item : list) { if (item instanceof Block) { List> subs = ((Block) item).getSubs(); for (List sub : subs) { - finalProcessAll(sub, level + 1, localData); + finalProcessAll(sub, level + 1, localData, path); } } } - finalProcessAfter(list, level, localData); + finalProcessAfter(list, level, localData, path); } private boolean processSubBlk(Block b, GraphTargetItem replacement) { @@ -703,7 +704,7 @@ public class Graph { return allSubPush && atleastOne; } - protected void finalProcessAfter(List list, int level, FinalProcessLocalData localData) { + protected void finalProcessAfter(List list, int level, FinalProcessLocalData localData, String path) { if (list.size() >= 2) { if (list.get(list.size() - 1) instanceof ExitItem) { ExitItem e = (ExitItem) list.get(list.size() - 1); @@ -719,7 +720,7 @@ public class Graph { } } - protected void finalProcess(List list, int level, FinalProcessLocalData localData) throws InterruptedException { + protected void finalProcess(List list, int level, FinalProcessLocalData localData, String path) throws InterruptedException { //For detection based on debug line information boolean[] toDelete = new boolean[list.size()]; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/Reference.java b/libsrc/ffdec_lib/src/com/jpexs/helpers/Reference.java similarity index 91% rename from libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/Reference.java rename to libsrc/ffdec_lib/src/com/jpexs/helpers/Reference.java index 04e3465f1..6b86b8ca7 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/Reference.java +++ b/libsrc/ffdec_lib/src/com/jpexs/helpers/Reference.java @@ -12,8 +12,9 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ -package com.jpexs.decompiler.flash.abc.avm2.parser.script; + * License along with this library. + */ +package com.jpexs.helpers; /** * diff --git a/src/com/jpexs/decompiler/flash/gui/Main.java b/src/com/jpexs/decompiler/flash/gui/Main.java index 4c20d3422..ebe9bd36d 100644 --- a/src/com/jpexs/decompiler/flash/gui/Main.java +++ b/src/com/jpexs/decompiler/flash/gui/Main.java @@ -35,7 +35,7 @@ import com.jpexs.decompiler.flash.SwfOpenException; import com.jpexs.decompiler.flash.UrlResolver; import com.jpexs.decompiler.flash.Version; import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; -import com.jpexs.decompiler.flash.abc.avm2.parser.script.Reference; +import com.jpexs.helpers.Reference; import com.jpexs.decompiler.flash.configuration.Configuration; import com.jpexs.decompiler.flash.configuration.SwfSpecificConfiguration; import com.jpexs.decompiler.flash.console.CommandLineArgumentParser; diff --git a/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java b/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java index a8d1732b5..36f463c38 100644 --- a/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/abc/ABCPanel.java @@ -27,7 +27,7 @@ import com.jpexs.decompiler.flash.abc.ScriptPack; import com.jpexs.decompiler.flash.abc.avm2.AVM2Code; import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instructions; -import com.jpexs.decompiler.flash.abc.avm2.parser.script.Reference; +import com.jpexs.helpers.Reference; import com.jpexs.decompiler.flash.abc.types.ABCException; import com.jpexs.decompiler.flash.abc.types.MethodBody; import com.jpexs.decompiler.flash.abc.types.MethodInfo; diff --git a/src/com/jpexs/decompiler/flash/gui/abc/DecompiledEditorPane.java b/src/com/jpexs/decompiler/flash/gui/abc/DecompiledEditorPane.java index 485208609..0e6a42a48 100644 --- a/src/com/jpexs/decompiler/flash/gui/abc/DecompiledEditorPane.java +++ b/src/com/jpexs/decompiler/flash/gui/abc/DecompiledEditorPane.java @@ -24,7 +24,7 @@ import com.jpexs.decompiler.flash.abc.avm2.instructions.AVM2Instruction; import com.jpexs.decompiler.flash.abc.avm2.instructions.construction.ConstructSuperIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.executing.CallSuperIns; import com.jpexs.decompiler.flash.abc.avm2.instructions.executing.CallSuperVoidIns; -import com.jpexs.decompiler.flash.abc.avm2.parser.script.Reference; +import com.jpexs.helpers.Reference; import com.jpexs.decompiler.flash.abc.types.ClassInfo; import com.jpexs.decompiler.flash.abc.types.InstanceInfo; import com.jpexs.decompiler.flash.abc.types.Multiname; diff --git a/src/com/jpexs/decompiler/flash/gui/editor/LineMarkedEditorPane.java b/src/com/jpexs/decompiler/flash/gui/editor/LineMarkedEditorPane.java index 06c67ecbe..5bbdded28 100644 --- a/src/com/jpexs/decompiler/flash/gui/editor/LineMarkedEditorPane.java +++ b/src/com/jpexs/decompiler/flash/gui/editor/LineMarkedEditorPane.java @@ -16,7 +16,7 @@ */ package com.jpexs.decompiler.flash.gui.editor; -import com.jpexs.decompiler.flash.abc.avm2.parser.script.Reference; +import com.jpexs.helpers.Reference; import com.jpexs.decompiler.flash.configuration.Configuration; import com.jpexs.decompiler.flash.gui.AppStrings; import java.awt.Color; From 7baaa1f1ff0ca74099ce79c6398aff0da3937d79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Tue, 23 Jan 2018 07:03:10 +0100 Subject: [PATCH 26/58] AS2 class detector - check if else clause is empty, allow some code without push --- .../action/ActionScript2ClassDetector.java | 210 +++++++++--------- 1 file changed, 109 insertions(+), 101 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionScript2ClassDetector.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionScript2ClassDetector.java index d3e70c8c2..3eca2a6be 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionScript2ClassDetector.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionScript2ClassDetector.java @@ -312,16 +312,16 @@ public class ActionScript2ClassDetector { for (int checkPos = pos; checkPos < commands.size(); checkPos++) { GraphTargetItem t = commands.get(checkPos); if (t instanceof IfItem) { - IfItem it = (IfItem) t; - if (it.expression instanceof NotItem) { - NotItem nti = (NotItem) it.expression; + IfItem ifItem = (IfItem) t; + if (ifItem.expression instanceof NotItem) { + NotItem nti = (NotItem) ifItem.expression; GraphTargetItem condType = nti.value; Reference newMemberNameRef = new Reference<>(""); if (isMemberOfPath(condType, pathToSearchInIfCond, newMemberNameRef)) { pathToSearchInIfCond.add(newMemberNameRef.getVal()); //_global.a.b.c = new Object(); - if ((it.onTrue.size() == 1) && (it.onTrue.get(0) instanceof SetMemberActionItem) && (((SetMemberActionItem) it.onTrue.get(0)).value instanceof NewObjectActionItem)) { + if ((ifItem.onTrue.size() == 1) && (ifItem.onTrue.get(0) instanceof SetMemberActionItem) && (((SetMemberActionItem) ifItem.onTrue.get(0)).value instanceof NewObjectActionItem)) { //skip §§pop item if its there right after if if (checkPos + 1 < commands.size()) { GraphTargetItem tnext = commands.get(checkPos + 1); @@ -332,22 +332,26 @@ public class ActionScript2ClassDetector { continue loopcheck; } - List parts = it.onTrue; + List parts = ifItem.onTrue; - List classNamePath = pathToSearchInIfCond; - classNamePath.remove(0); //remove "_global" - - int ppos = 0; - GraphTargetItem item = parts.get(ppos); - GraphTargetItem extendsOp = null; - List implementsOp = new ArrayList<>(); - if (item instanceof ExtendsActionItem) { - ExtendsActionItem et = (ExtendsActionItem) parts.get(ppos); - extendsOp = getWithoutGlobal(et.superclass); - ppos++; - item = parts.get(ppos); - } try { + if (!ifItem.onFalse.isEmpty()) { + throw new AssertException("else clause of the if is not empty"); + } + + List classNamePath = pathToSearchInIfCond; + classNamePath.remove(0); //remove "_global" + + int ppos = 0; + GraphTargetItem item = parts.get(ppos); + GraphTargetItem extendsOp = null; + List implementsOp = new ArrayList<>(); + if (item instanceof ExtendsActionItem) { + ExtendsActionItem et = (ExtendsActionItem) parts.get(ppos); + extendsOp = getWithoutGlobal(et.superclass); + ppos++; + item = parts.get(ppos); + } int instanceReg = -1; int classReg = -1; GraphTargetItem classNameTargetPath = null; @@ -537,104 +541,103 @@ public class ActionScript2ClassDetector { looppushes: for (; ppos < parts.size(); ppos++) { item = parts.get(ppos); - if (item instanceof PushItem) { + GraphTargetItem curItem = item; + if (item instanceof PushItem) { //push is optional PushItem pi = (PushItem) item; - if (pi.value instanceof CallMethodActionItem) { - CallMethodActionItem cm = (CallMethodActionItem) pi.value; - String pushMethodName = getAsString(cm.methodName, "push methodName"); - if ("addProperty".equals(pushMethodName)) { - int rnumObject = getAsRegisterNum(cm.scriptObject, "addProperty not on register"); - if ((rnumObject != instanceReg) && (rnumObject != classReg)) { - throw new AssertException("unexpected addProperty object register " + rnumObject); - } + curItem = pi.value; + } + if (curItem instanceof CallMethodActionItem) { + CallMethodActionItem cm = (CallMethodActionItem) curItem; + String pushMethodName = getAsString(cm.methodName, "push methodName"); + if ("addProperty".equals(pushMethodName)) { + int rnumObject = getAsRegisterNum(cm.scriptObject, "addProperty not on register"); + if ((rnumObject != instanceReg) && (rnumObject != classReg)) { + throw new AssertException("unexpected addProperty object register " + rnumObject); + } - if (cm.arguments.size() != 3) { - throw new AssertException("invalid number of arguments to addProperty: " + cm.arguments.size()); + if (cm.arguments.size() != 3) { + throw new AssertException("invalid number of arguments to addProperty: " + cm.arguments.size()); + } + GraphTargetItem propertyName = cm.arguments.get(0); + GraphTargetItem propertyGetter = cm.arguments.get(1); + GraphTargetItem propertySetter = cm.arguments.get(2); + String propertyNameStr = getAsString(propertyName, "propertyName"); + if (propertyGetter instanceof GetMemberActionItem) { + int regId = getAsRegisterNum(((GetMemberActionItem) propertyGetter).object, "getter member not register"); + if (rnumObject != regId) { + throw new AssertException("getter register does not match property register " + regId + " <=> " + rnumObject); } - GraphTargetItem propertyName = cm.arguments.get(0); - GraphTargetItem propertyGetter = cm.arguments.get(1); - GraphTargetItem propertySetter = cm.arguments.get(2); - String propertyNameStr = getAsString(propertyName, "propertyName"); - if (propertyGetter instanceof GetMemberActionItem) { - int regId = getAsRegisterNum(((GetMemberActionItem) propertyGetter).object, "getter member not register"); - if (rnumObject != regId) { - throw new AssertException("getter register does not match property register " + regId + " <=> " + rnumObject); - } - String getterNameStr = getAsString(((GetMemberActionItem) propertyGetter).memberName, "getter memberName"); - if (!(getterNameStr.equals("__get__" + propertyNameStr))) { - throw new AssertException("getter does not match property name"); - } - //TODO: handle getter HERE + String getterNameStr = getAsString(((GetMemberActionItem) propertyGetter).memberName, "getter memberName"); + if (!(getterNameStr.equals("__get__" + propertyNameStr))) { + throw new AssertException("getter does not match property name"); + } + //TODO: handle getter HERE - } else if (propertyGetter instanceof FunctionActionItem) { - FunctionActionItem getterFunc = (FunctionActionItem) propertyGetter; - if (!(getterFunc.actions.isEmpty() && getterFunc.functionName.isEmpty() && ((FunctionActionItem) propertyGetter).paramNames.isEmpty())) { - logger.severe("Cannot detect class - unexpected getter value for property " + propertyNameStr); - break loopcheck; - } - //we got empty getter - } else { - logger.severe("Cannot detect class - unexpected getter value for property " + propertyNameStr + ": " + propertyGetter.getClass().getSimpleName()); + } else if (propertyGetter instanceof FunctionActionItem) { + FunctionActionItem getterFunc = (FunctionActionItem) propertyGetter; + if (!(getterFunc.actions.isEmpty() && getterFunc.functionName.isEmpty() && ((FunctionActionItem) propertyGetter).paramNames.isEmpty())) { + logger.severe("Cannot detect class - unexpected getter value for property " + propertyNameStr); break loopcheck; } - - if (propertySetter instanceof GetMemberActionItem) { - int regId = getAsRegisterNum(((GetMemberActionItem) propertySetter).object, "setter member"); - if (rnumObject != regId) { - throw new AssertException("setter register does not match property register " + regId + " <=> " + rnumObject); - } - String setterNameStr = getAsString(((GetMemberActionItem) propertySetter).memberName, "setter memberNAme"); - if (!(setterNameStr.equals("__set__" + propertyNameStr))) { - throw new AssertException("setter does not match property name"); - } - //TODO: handle setter HERE - } else if (propertySetter instanceof FunctionActionItem) { - FunctionActionItem setterFunc = (FunctionActionItem) propertySetter; - if (!(setterFunc.actions.isEmpty() && setterFunc.functionName.isEmpty() && ((FunctionActionItem) propertySetter).paramNames.isEmpty())) { - throw new AssertException("unexpected getter value for property " + propertyNameStr); - } - //we got empty setter - } else { - throw new AssertException("unexpected setter value for property " + propertyNameStr + ": " + propertySetter.getClass().getSimpleName()); - } - + //we got empty getter } else { - throw new AssertException("unknown push method name: " + pushMethodName); + logger.severe("Cannot detect class - unexpected getter value for property " + propertyNameStr + ": " + propertyGetter.getClass().getSimpleName()); + break loopcheck; } - } else if (pi.value instanceof CallFunctionActionItem) { - CallFunctionActionItem cf = (CallFunctionActionItem) pi.value; - String funName = getAsString(cf.functionName, "pushitem function name"); - if (funName.equals("ASSetPropFlags")) { - //it should be ASSetPropFlags(a.b.c.D.prototype,null,1) as it sets prototype to hidden - //see http://www.ryanjuckett.com/programming/how-to-use-assetpropflags-in-actionscript-2-0/ - if (cf.arguments.size() != 3) { - throw new AssertException("Invalid number of arguments to ASSetPropFlags:" + cf.arguments.size() + ", 3 expected"); + if (propertySetter instanceof GetMemberActionItem) { + int regId = getAsRegisterNum(((GetMemberActionItem) propertySetter).object, "setter member"); + if (rnumObject != regId) { + throw new AssertException("setter register does not match property register " + regId + " <=> " + rnumObject); } - GraphTargetItem obj = cf.arguments.get(0); - GraphTargetItem props = cf.arguments.get(1); - GraphTargetItem flags = cf.arguments.get(2); - List path = getMembersPath(obj); - if (path != null && !path.isEmpty() && "_global".equals(path.get(0))) { //For classes in toplevel package, there's _global in path - path.remove(0); //remove that _global + String setterNameStr = getAsString(((GetMemberActionItem) propertySetter).memberName, "setter memberNAme"); + if (!(setterNameStr.equals("__set__" + propertyNameStr))) { + throw new AssertException("setter does not match property name"); } - List classPathWithPrototype = new ArrayList<>(); - classPathWithPrototype.addAll(classNamePath); - classPathWithPrototype.add("prototype"); - if (!classPathWithPrototype.equals(path)) { - throw new AssertException("ASSetPropFlags not on prototype"); - } - if (!((props instanceof DirectValueActionItem) && (((DirectValueActionItem) props).value == Null.INSTANCE))) { - throw new AssertException("ASSetPropFlags properties param not null"); - } - if (!((flags instanceof DirectValueActionItem) && (((DirectValueActionItem) flags).value == (Long) 1L))) { - throw new AssertException("ASSetPropFlags flags not set to 1"); + //TODO: handle setter HERE + } else if (propertySetter instanceof FunctionActionItem) { + FunctionActionItem setterFunc = (FunctionActionItem) propertySetter; + if (!(setterFunc.actions.isEmpty() && setterFunc.functionName.isEmpty() && ((FunctionActionItem) propertySetter).paramNames.isEmpty())) { + throw new AssertException("unexpected getter value for property " + propertyNameStr); } + //we got empty setter } else { - throw new AssertException("unknown pushitem function call " + funName); + throw new AssertException("unexpected setter value for property " + propertyNameStr + ": " + propertySetter.getClass().getSimpleName()); + } + + } else { + throw new AssertException("unknown push method name: " + pushMethodName); + } + } else if (curItem instanceof CallFunctionActionItem) { + CallFunctionActionItem cf = (CallFunctionActionItem) curItem; + String funName = getAsString(cf.functionName, "pushitem function name"); + if (funName.equals("ASSetPropFlags")) { + //it should be ASSetPropFlags(a.b.c.D.prototype,null,1) as it sets prototype to hidden + //see http://www.ryanjuckett.com/programming/how-to-use-assetpropflags-in-actionscript-2-0/ + if (cf.arguments.size() != 3) { + throw new AssertException("Invalid number of arguments to ASSetPropFlags:" + cf.arguments.size() + ", 3 expected"); + } + GraphTargetItem obj = cf.arguments.get(0); + GraphTargetItem props = cf.arguments.get(1); + GraphTargetItem flags = cf.arguments.get(2); + List path = getMembersPath(obj); + if (path != null && !path.isEmpty() && "_global".equals(path.get(0))) { //For classes in toplevel package, there's _global in path + path.remove(0); //remove that _global + } + List classPathWithPrototype = new ArrayList<>(); + classPathWithPrototype.addAll(classNamePath); + classPathWithPrototype.add("prototype"); + if (!classPathWithPrototype.equals(path)) { + throw new AssertException("ASSetPropFlags not on prototype"); + } + if (!((props instanceof DirectValueActionItem) && (((DirectValueActionItem) props).value == Null.INSTANCE))) { + throw new AssertException("ASSetPropFlags properties param not null"); + } + if (!((flags instanceof DirectValueActionItem) && (((DirectValueActionItem) flags).value == (Long) 1L))) { + throw new AssertException("ASSetPropFlags flags not set to 1"); } } else { - throw new AssertException("unknown pushitem - " + pi.value.getClass().getSimpleName()); + throw new AssertException("unknown pushitem function call " + funName); } } else { throw new AssertException("unknown item - " + item.getClass().getSimpleName()); @@ -664,6 +667,11 @@ public class ActionScript2ClassDetector { } } + //???? fid 963 + if (!ifItem.onFalse.isEmpty()) { + commands.addAll(pos + 1, ifItem.onFalse); + } + // goto next line and check next classes continue looppos; } catch (AssertException ex) { From 205b9cda141f76cfc2dabef263f8a697b39c4adf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Thu, 25 Jan 2018 21:20:45 +0100 Subject: [PATCH 27/58] AS2 class detector - ignoring onFalse section, which can lead to invalid location --- .../flash/action/ActionScript2ClassDetector.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionScript2ClassDetector.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionScript2ClassDetector.java index 3eca2a6be..61117ef5a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionScript2ClassDetector.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionScript2ClassDetector.java @@ -336,7 +336,13 @@ public class ActionScript2ClassDetector { try { if (!ifItem.onFalse.isEmpty()) { - throw new AssertException("else clause of the if is not empty"); + //throw new AssertException("else clause of the if is not empty"); + //Note: When there is an else block, it may mean + //that the class was too long to fit maximum of + //jump bytes so the jump target is other invalid location + //(usually negative - will probably lead to other SWF tags) + + //so we will rather silently ignore onFalse section } List classNamePath = pathToSearchInIfCond; @@ -667,11 +673,6 @@ public class ActionScript2ClassDetector { } } - //???? fid 963 - if (!ifItem.onFalse.isEmpty()) { - commands.addAll(pos + 1, ifItem.onFalse); - } - // goto next line and check next classes continue looppos; } catch (AssertException ex) { From a904fdb3a3476dc228dd778cfeafee047d591125 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sat, 27 Jan 2018 09:45:01 +0100 Subject: [PATCH 28/58] AS2 class detector - checking other class variant --- .../action/ActionScript2ClassDetector.java | 862 +++++++++--------- 1 file changed, 453 insertions(+), 409 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionScript2ClassDetector.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionScript2ClassDetector.java index 61117ef5a..37b833f4e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionScript2ClassDetector.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionScript2ClassDetector.java @@ -268,427 +268,471 @@ public class ActionScript2ClassDetector { return mnDv.getAsString(); } - public void checkClass(List commands, String scriptPath) { - /* - class a.b.c.D: - - if(!_global.a) - { - _global.a = new Object(); - } - §§pop(); - if(!_global.a.b) - { - _global.a.b = new Object(); - } - §§pop(); - if(!_global.a.b.c) - { - _global.a.b.c = new Object(); - } - §§pop(); - if(!_global.a.b.c.D) - { - ... - §§push(ASSetPropFlags(a.b.c.D.prototype,null,1)); - } - §§pop(); - - */ + private boolean checkClassContent(List parts, int partsPos, int commandsStartPos, int commandsEndPos, List commands, List classNamePath, String scriptPath) { - List pathToSearchInIfCond = new ArrayList<>(); - pathToSearchInIfCond.add("_global"); - - looppos: - for (int pos = 0; pos < commands.size(); pos++) { - - //start with _global. - if (pathToSearchInIfCond.size() > 1) { - pathToSearchInIfCond.clear(); - pathToSearchInIfCond.add("_global"); + try { + GraphTargetItem item = parts.get(partsPos); + GraphTargetItem extendsOp = null; + List implementsOp = new ArrayList<>(); + if (item instanceof ExtendsActionItem) { + ExtendsActionItem et = (ExtendsActionItem) parts.get(partsPos); + extendsOp = getWithoutGlobal(et.superclass); + partsPos++; + item = parts.get(partsPos); } - - loopcheck: - for (int checkPos = pos; checkPos < commands.size(); checkPos++) { - GraphTargetItem t = commands.get(checkPos); - if (t instanceof IfItem) { - IfItem ifItem = (IfItem) t; - if (ifItem.expression instanceof NotItem) { - NotItem nti = (NotItem) ifItem.expression; - GraphTargetItem condType = nti.value; - Reference newMemberNameRef = new Reference<>(""); - if (isMemberOfPath(condType, pathToSearchInIfCond, newMemberNameRef)) { - pathToSearchInIfCond.add(newMemberNameRef.getVal()); - - //_global.a.b.c = new Object(); - if ((ifItem.onTrue.size() == 1) && (ifItem.onTrue.get(0) instanceof SetMemberActionItem) && (((SetMemberActionItem) ifItem.onTrue.get(0)).value instanceof NewObjectActionItem)) { - //skip §§pop item if its there right after if - if (checkPos + 1 < commands.size()) { - GraphTargetItem tnext = commands.get(checkPos + 1); - if (tnext instanceof PopItem) { - checkPos++; - } - } - continue loopcheck; + int instanceReg = -1; + int classReg = -1; + GraphTargetItem classNameTargetPath = null; + GraphTargetItem constructor = null; + if (item instanceof StoreRegisterActionItem) { + StoreRegisterActionItem sr = (StoreRegisterActionItem) item; + instanceReg = sr.register.number; + if (sr.value instanceof GetMemberActionItem) { + GetMemberActionItem gm = (GetMemberActionItem) sr.value; + if (gm.object instanceof TemporaryRegister) { + TemporaryRegister treg = (TemporaryRegister) gm.object; + classReg = treg.getRegId(); + if (!"prototype".equals(getAsString(gm.memberName, "memberName"))) { + throw new AssertException("memberName not \"prototype\""); + } + if ((treg.value instanceof SetMemberActionItem) || (treg.value instanceof SetVariableActionItem)) { + List path = getSetMembersPath(treg.value); + if (path == null || path.isEmpty()) { + throw new AssertException("Cannot detect class - tempreg value is not a path"); } + //remove _global if it's there - happens for classes in global package + if ("_global".equals(path.get(0))) { + path.remove(0); + } + if (classNamePath.equals(path)) { + //can start with _global for classes on top level + classNameTargetPath = getWithoutGlobal(setMemberToGetMember(treg.value)); - List parts = ifItem.onTrue; - - try { - if (!ifItem.onFalse.isEmpty()) { - //throw new AssertException("else clause of the if is not empty"); - //Note: When there is an else block, it may mean - //that the class was too long to fit maximum of - //jump bytes so the jump target is other invalid location - //(usually negative - will probably lead to other SWF tags) - - //so we will rather silently ignore onFalse section + //treg.value.value is the value being set - treg.value is setmember ot setvariable + if (!(treg.value.value instanceof StoreRegisterActionItem)) { + throw new AssertException("Constructor expected to be in storeregister"); } - - List classNamePath = pathToSearchInIfCond; - classNamePath.remove(0); //remove "_global" - - int ppos = 0; - GraphTargetItem item = parts.get(ppos); - GraphTargetItem extendsOp = null; - List implementsOp = new ArrayList<>(); - if (item instanceof ExtendsActionItem) { - ExtendsActionItem et = (ExtendsActionItem) parts.get(ppos); - extendsOp = getWithoutGlobal(et.superclass); - ppos++; - item = parts.get(ppos); + if (!(treg.value.value.value instanceof FunctionActionItem)) { + throw new AssertException("Constructor expected as functionitem"); } - int instanceReg = -1; - int classReg = -1; - GraphTargetItem classNameTargetPath = null; - GraphTargetItem constructor = null; - if (item instanceof StoreRegisterActionItem) { - StoreRegisterActionItem sr = (StoreRegisterActionItem) item; - instanceReg = sr.register.number; - if (sr.value instanceof GetMemberActionItem) { - GetMemberActionItem gm = (GetMemberActionItem) sr.value; - if (gm.object instanceof TemporaryRegister) { - TemporaryRegister treg = (TemporaryRegister) gm.object; - classReg = treg.getRegId(); - if (!"prototype".equals(getAsString(gm.memberName, "memberName"))) { - throw new AssertException("memberName not \"prototype\""); - } - if ((treg.value instanceof SetMemberActionItem) || (treg.value instanceof SetVariableActionItem)) { - List path = getSetMembersPath(treg.value); - if (path == null || path.isEmpty()) { - logger.severe("Cannot detect class - tempreg value is not a path"); - break loopcheck; - } - //remove _global if it's there - happens for classes in global package - if ("_global".equals(path.get(0))) { - path.remove(0); - } - if (classNamePath.equals(path)) { - //can start with _global for classes on top level - classNameTargetPath = getWithoutGlobal(setMemberToGetMember(treg.value)); - - //treg.value.value is the value being set - treg.value is setmember ot setvariable - if (!(treg.value.value instanceof StoreRegisterActionItem)) { - throw new AssertException("Constructor expected to be in storeregister"); - } - if (!(treg.value.value.value instanceof FunctionActionItem)) { - throw new AssertException("Constructor expected as functionitem"); - } - constructor = treg.value.value.value; - } else { - throw new AssertException("temporaryreg value does not match class path"); - } - } else { - throw new AssertException("temporaryreg value not setmember/setvariable"); - } - } else { - throw new AssertException("Getmember does not have TemporaryRegister as object"); - } - } else { - throw new AssertException("Not Getmember in StoreRegister"); - } - ppos++; - } - List> traits = new ArrayList<>(); - List traitsStatic = new ArrayList<>(); - loopsetmembers: - for (; ppos < parts.size(); ppos++) { - item = parts.get(ppos); - if (item instanceof SetMemberActionItem) { - SetMemberActionItem sm = (SetMemberActionItem) item; - GraphTargetItem regValue; - int currentRegId = -1; - if (sm.object instanceof TemporaryRegister) { - TemporaryRegister tempReg = (TemporaryRegister) sm.object; - currentRegId = tempReg.getRegId(); - regValue = tempReg.value; - } else if ((sm.object instanceof DirectValueActionItem) && (((DirectValueActionItem) sm.object).value instanceof RegisterNumber)) { - DirectValueActionItem dv = (DirectValueActionItem) sm.object; - RegisterNumber rn = ((RegisterNumber) dv.value); - currentRegId = rn.number; - regValue = dv.computedRegValue; - } else { - //might be an interface - List path = getSetMembersPath(item); - if (path == null || path.isEmpty()) { - throw new AssertException("invalid setmember"); - } - //remove _global if it's there - happens for classes in global package - if ("_global".equals(path.get(0))) { - path.remove(0); - } - if (!path.equals(classNamePath)) { - throw new AssertException("wrong path in setmember"); - } - GraphTargetItem interfaceClass = getWithoutGlobal(setMemberToGetMember(item)); - if (!(sm.value instanceof FunctionActionItem)) { - logger.severe("Cannot detect class - not a function in setmember"); - break loopcheck; - } - FunctionActionItem f = (FunctionActionItem) sm.value; - if (!"".equals(f.functionName)) { - throw new AssertException("not unnamed func in setmember"); - } - if (!f.actions.isEmpty()) { - throw new AssertException("not empty function in setmember"); - } - if (!f.paramNames.isEmpty()) { - throw new AssertException("not empty params for function in setmember"); - } - ppos++; - for (; ppos < parts.size(); ppos++) { - item = parts.get(ppos); - if (item instanceof ImplementsOpActionItem) { - if (!implementsOp.isEmpty()) { - throw new AssertException("multiple implementsAction"); - } - ImplementsOpActionItem io = (ImplementsOpActionItem) item; - implementsOp = io.superclasses; - } else { - throw new AssertException("unknown iface item: " + item.getClass().getSimpleName()); - } - } - - InterfaceActionItem ifsItem = new InterfaceActionItem(interfaceClass, implementsOp); - for (int k = pos; k <= checkPos; k++) { - commands.remove(pos); - } - commands.add(pos, ifsItem); - - //remove §§pop after, if it's there - if (pos + 1 < commands.size()) { - if (commands.get(pos + 1) instanceof PopItem) { - commands.remove(pos + 1); - } - } - - // goto next line and check next classes - continue looppos; - } - //it was register .. continue class detection - if (currentRegId != instanceReg && currentRegId != classReg) { - if (!(regValue instanceof SetMemberActionItem)) { - throw new AssertException("temp register do not contain setmember"); - } - SetMemberActionItem sm2 = (SetMemberActionItem) regValue; - GraphTargetItem pathSource; - boolean isPrototype; - if ("prototype".equals(getAsString(sm2.objectName, "objectName"))) { - pathSource = sm2.object; - isPrototype = true; - } else { - pathSource = setMemberToGetMember(sm2); - isPrototype = false; - } - List memPath = getMembersPath(pathSource); - if (memPath == null) { - throw new AssertException("Invalid pathsource"); - } - if (!classNamePath.equals(memPath)) { - throw new AssertException("Invalid path of setmember:" + String.join(".", memPath)); - } - classNameTargetPath = pathSource; - if (!(sm2.value instanceof StoreRegisterActionItem)) { - throw new AssertException("Not storeregister"); - } - StoreRegisterActionItem sr = (StoreRegisterActionItem) sm2.value; - if (sr.register.number != currentRegId) { - throw new AssertException("Invalid storeregister"); - } - if (isPrototype && ((sr.value instanceof NewMethodActionItem) || (sr.value instanceof NewObjectActionItem))) { - extendsOp = newToGetMember(sr.value); - instanceReg = currentRegId; - } else if (!isPrototype && (sr.value instanceof FunctionActionItem)) { //constructor - constructor = sr.value; - classReg = currentRegId; - } else { - throw new AssertException("invalid storeregister value: " + sr.value.getClass().getSimpleName()); - } - } - - MyEntry trait = new MyEntry<>(sm.objectName, sm.value); - if (sm.value instanceof FunctionActionItem) { - FunctionActionItem f = (FunctionActionItem) sm.value; - f.calculatedFunctionName = sm.objectName; - } - traits.add(trait); - if (currentRegId == instanceReg) { - traitsStatic.add(false); - } else if (currentRegId == classReg) { - traitsStatic.add(true); - } - } else if (item instanceof ImplementsOpActionItem) { - ImplementsOpActionItem iot = (ImplementsOpActionItem) item; - implementsOp = iot.superclasses; - } else { - break loopsetmembers; - } - } - looppushes: - for (; ppos < parts.size(); ppos++) { - item = parts.get(ppos); - GraphTargetItem curItem = item; - if (item instanceof PushItem) { //push is optional - PushItem pi = (PushItem) item; - curItem = pi.value; - } - if (curItem instanceof CallMethodActionItem) { - CallMethodActionItem cm = (CallMethodActionItem) curItem; - String pushMethodName = getAsString(cm.methodName, "push methodName"); - if ("addProperty".equals(pushMethodName)) { - int rnumObject = getAsRegisterNum(cm.scriptObject, "addProperty not on register"); - if ((rnumObject != instanceReg) && (rnumObject != classReg)) { - throw new AssertException("unexpected addProperty object register " + rnumObject); - } - - if (cm.arguments.size() != 3) { - throw new AssertException("invalid number of arguments to addProperty: " + cm.arguments.size()); - } - GraphTargetItem propertyName = cm.arguments.get(0); - GraphTargetItem propertyGetter = cm.arguments.get(1); - GraphTargetItem propertySetter = cm.arguments.get(2); - String propertyNameStr = getAsString(propertyName, "propertyName"); - if (propertyGetter instanceof GetMemberActionItem) { - int regId = getAsRegisterNum(((GetMemberActionItem) propertyGetter).object, "getter member not register"); - if (rnumObject != regId) { - throw new AssertException("getter register does not match property register " + regId + " <=> " + rnumObject); - } - String getterNameStr = getAsString(((GetMemberActionItem) propertyGetter).memberName, "getter memberName"); - if (!(getterNameStr.equals("__get__" + propertyNameStr))) { - throw new AssertException("getter does not match property name"); - } - //TODO: handle getter HERE - - } else if (propertyGetter instanceof FunctionActionItem) { - FunctionActionItem getterFunc = (FunctionActionItem) propertyGetter; - if (!(getterFunc.actions.isEmpty() && getterFunc.functionName.isEmpty() && ((FunctionActionItem) propertyGetter).paramNames.isEmpty())) { - logger.severe("Cannot detect class - unexpected getter value for property " + propertyNameStr); - break loopcheck; - } - //we got empty getter - } else { - logger.severe("Cannot detect class - unexpected getter value for property " + propertyNameStr + ": " + propertyGetter.getClass().getSimpleName()); - break loopcheck; - } - - if (propertySetter instanceof GetMemberActionItem) { - int regId = getAsRegisterNum(((GetMemberActionItem) propertySetter).object, "setter member"); - if (rnumObject != regId) { - throw new AssertException("setter register does not match property register " + regId + " <=> " + rnumObject); - } - String setterNameStr = getAsString(((GetMemberActionItem) propertySetter).memberName, "setter memberNAme"); - if (!(setterNameStr.equals("__set__" + propertyNameStr))) { - throw new AssertException("setter does not match property name"); - } - //TODO: handle setter HERE - } else if (propertySetter instanceof FunctionActionItem) { - FunctionActionItem setterFunc = (FunctionActionItem) propertySetter; - if (!(setterFunc.actions.isEmpty() && setterFunc.functionName.isEmpty() && ((FunctionActionItem) propertySetter).paramNames.isEmpty())) { - throw new AssertException("unexpected getter value for property " + propertyNameStr); - } - //we got empty setter - } else { - throw new AssertException("unexpected setter value for property " + propertyNameStr + ": " + propertySetter.getClass().getSimpleName()); - } - - } else { - throw new AssertException("unknown push method name: " + pushMethodName); - } - } else if (curItem instanceof CallFunctionActionItem) { - CallFunctionActionItem cf = (CallFunctionActionItem) curItem; - String funName = getAsString(cf.functionName, "pushitem function name"); - if (funName.equals("ASSetPropFlags")) { - //it should be ASSetPropFlags(a.b.c.D.prototype,null,1) as it sets prototype to hidden - //see http://www.ryanjuckett.com/programming/how-to-use-assetpropflags-in-actionscript-2-0/ - if (cf.arguments.size() != 3) { - throw new AssertException("Invalid number of arguments to ASSetPropFlags:" + cf.arguments.size() + ", 3 expected"); - } - GraphTargetItem obj = cf.arguments.get(0); - GraphTargetItem props = cf.arguments.get(1); - GraphTargetItem flags = cf.arguments.get(2); - List path = getMembersPath(obj); - if (path != null && !path.isEmpty() && "_global".equals(path.get(0))) { //For classes in toplevel package, there's _global in path - path.remove(0); //remove that _global - } - List classPathWithPrototype = new ArrayList<>(); - classPathWithPrototype.addAll(classNamePath); - classPathWithPrototype.add("prototype"); - if (!classPathWithPrototype.equals(path)) { - throw new AssertException("ASSetPropFlags not on prototype"); - } - if (!((props instanceof DirectValueActionItem) && (((DirectValueActionItem) props).value == Null.INSTANCE))) { - throw new AssertException("ASSetPropFlags properties param not null"); - } - if (!((flags instanceof DirectValueActionItem) && (((DirectValueActionItem) flags).value == (Long) 1L))) { - throw new AssertException("ASSetPropFlags flags not set to 1"); - } - } else { - throw new AssertException("unknown pushitem function call " + funName); - } - } else { - throw new AssertException("unknown item - " + item.getClass().getSimpleName()); - } - }//end loop pushes - - if (constructor != null) { //constructor should be there always, but just in calse - //add constructor as trait - traitsStatic.add(0, false); - DirectValueActionItem classBaseName = new DirectValueActionItem(classNamePath.get(classNamePath.size() - 1)); - ((FunctionActionItem) constructor).calculatedFunctionName = classBaseName; - traits.add(0, new MyEntry<>(classBaseName, constructor)); - } else { - throw new AssertException("No constructor found"); - } - - ClassActionItem clsItem = new ClassActionItem(classNameTargetPath, extendsOp, implementsOp, traits, traitsStatic); - for (int k = pos; k <= checkPos; k++) { - commands.remove(pos); - } - commands.add(pos, clsItem); - - //remove §§pop after, if it's there - if (pos + 1 < commands.size()) { - if (commands.get(pos + 1) instanceof PopItem) { - commands.remove(pos + 1); - } - } - - // goto next line and check next classes - continue looppos; - } catch (AssertException ex) { - logger.log(Level.WARNING, "{0}: Cannot detect class - {1}", new Object[]{scriptPath, ex.getCondition()}); - break loopcheck; + constructor = treg.value.value.value; + } else { + throw new AssertException("temporaryreg value does not match class path"); } } else { - break loopcheck; //not !_global.a.b or not member of previous + throw new AssertException("temporaryreg value not setmember/setvariable"); } } else { - break loopcheck; //not an if ! + throw new AssertException("Getmember does not have TemporaryRegister as object"); } } else { - break loopcheck; //not an if + throw new AssertException("Not Getmember in StoreRegister"); } - } //loopcheck - }//looppos + partsPos++; + } + List> traits = new ArrayList<>(); + List traitsStatic = new ArrayList<>(); + loopsetmembers: + for (; partsPos < parts.size(); partsPos++) { + item = parts.get(partsPos); + if (item instanceof PushItem) { //push is optional + PushItem pi = (PushItem) item; + item = pi.value; + } + if (item instanceof SetMemberActionItem) { + SetMemberActionItem sm = (SetMemberActionItem) item; + GraphTargetItem regValue; + int currentRegId = -1; + if (sm.object instanceof TemporaryRegister) { + TemporaryRegister tempReg = (TemporaryRegister) sm.object; + currentRegId = tempReg.getRegId(); + regValue = tempReg.value; + } else if ((sm.object instanceof DirectValueActionItem) && (((DirectValueActionItem) sm.object).value instanceof RegisterNumber)) { + DirectValueActionItem dv = (DirectValueActionItem) sm.object; + RegisterNumber rn = ((RegisterNumber) dv.value); + currentRegId = rn.number; + regValue = dv.computedRegValue; + } else { + //might be an interface + List path = getSetMembersPath(item); + if (path == null || path.isEmpty()) { + throw new AssertException("invalid setmember"); + } + //remove _global if it's there - happens for classes in global package + if ("_global".equals(path.get(0))) { + path.remove(0); + } + if (!path.equals(classNamePath)) { + throw new AssertException("wrong path in setmember"); + } + GraphTargetItem interfaceClass = getWithoutGlobal(setMemberToGetMember(item)); + if (!(sm.value instanceof FunctionActionItem)) { + throw new AssertException("not a function in setmember"); + } + FunctionActionItem f = (FunctionActionItem) sm.value; + if (!"".equals(f.functionName)) { + throw new AssertException("not unnamed func in setmember"); + } + if (!f.actions.isEmpty()) { + throw new AssertException("not empty function in setmember"); + } + if (!f.paramNames.isEmpty()) { + throw new AssertException("not empty params for function in setmember"); + } + partsPos++; + for (; partsPos < parts.size(); partsPos++) { + item = parts.get(partsPos); + if (item instanceof ImplementsOpActionItem) { + if (!implementsOp.isEmpty()) { + throw new AssertException("multiple implementsAction"); + } + ImplementsOpActionItem io = (ImplementsOpActionItem) item; + implementsOp = io.superclasses; + } else { + throw new AssertException("unknown iface item: " + item.getClass().getSimpleName()); + } + } + + InterfaceActionItem ifsItem = new InterfaceActionItem(interfaceClass, implementsOp); + for (int k = commandsStartPos; k <= commandsEndPos; k++) { + commands.remove(commandsStartPos); + } + commands.add(commandsStartPos, ifsItem); + + //remove §§pop after, if it's there + if (commandsStartPos + 1 < commands.size()) { + if (commands.get(commandsStartPos + 1) instanceof PopItem) { + commands.remove(commandsStartPos + 1); + } + } + + // goto next line and check next classes + return true; + } + //it was register .. continue class detection + if (currentRegId != instanceReg && currentRegId != classReg) { + if (!(regValue instanceof SetMemberActionItem)) { + throw new AssertException("temp register do not contain setmember"); + } + SetMemberActionItem sm2 = (SetMemberActionItem) regValue; + GraphTargetItem pathSource; + boolean isPrototype; + if ("prototype".equals(getAsString(sm2.objectName, "objectName"))) { + pathSource = sm2.object; + isPrototype = true; + } else { + pathSource = setMemberToGetMember(sm2); + isPrototype = false; + } + List memPath = getMembersPath(pathSource); + if (memPath == null) { + throw new AssertException("Invalid pathsource"); + } + if (!classNamePath.equals(memPath)) { + throw new AssertException("Invalid path of setmember:" + String.join(".", memPath)); + } + classNameTargetPath = pathSource; + if (!(sm2.value instanceof StoreRegisterActionItem)) { + throw new AssertException("Not storeregister"); + } + StoreRegisterActionItem sr = (StoreRegisterActionItem) sm2.value; + if (sr.register.number != currentRegId) { + throw new AssertException("Invalid storeregister"); + } + if (isPrototype && ((sr.value instanceof NewMethodActionItem) || (sr.value instanceof NewObjectActionItem))) { + extendsOp = newToGetMember(sr.value); + instanceReg = currentRegId; + } else if (!isPrototype && (sr.value instanceof FunctionActionItem)) { //constructor + constructor = sr.value; + classReg = currentRegId; + } else { + throw new AssertException("invalid storeregister value: " + sr.value.getClass().getSimpleName()); + } + } + + MyEntry trait = new MyEntry<>(sm.objectName, sm.value); + if (sm.value instanceof FunctionActionItem) { + FunctionActionItem f = (FunctionActionItem) sm.value; + f.calculatedFunctionName = sm.objectName; + } + traits.add(trait); + if (currentRegId == instanceReg) { + traitsStatic.add(false); + } else if (currentRegId == classReg) { + traitsStatic.add(true); + } + } else if (item instanceof ImplementsOpActionItem) { + ImplementsOpActionItem iot = (ImplementsOpActionItem) item; + implementsOp = iot.superclasses; + } else if (item instanceof CallMethodActionItem) { + CallMethodActionItem cm = (CallMethodActionItem) item; + String pushMethodName = getAsString(cm.methodName, "push methodName"); + if ("addProperty".equals(pushMethodName)) { + int rnumObject = getAsRegisterNum(cm.scriptObject, "addProperty not on register"); + if ((rnumObject != instanceReg) && (rnumObject != classReg)) { + throw new AssertException("unexpected addProperty object register " + rnumObject); + } + + if (cm.arguments.size() != 3) { + throw new AssertException("invalid number of arguments to addProperty: " + cm.arguments.size()); + } + GraphTargetItem propertyName = cm.arguments.get(0); + GraphTargetItem propertyGetter = cm.arguments.get(1); + GraphTargetItem propertySetter = cm.arguments.get(2); + String propertyNameStr = getAsString(propertyName, "propertyName"); + if (propertyGetter instanceof GetMemberActionItem) { + int regId = getAsRegisterNum(((GetMemberActionItem) propertyGetter).object, "getter member not register"); + if (rnumObject != regId) { + throw new AssertException("getter register does not match property register " + regId + " <=> " + rnumObject); + } + String getterNameStr = getAsString(((GetMemberActionItem) propertyGetter).memberName, "getter memberName"); + if (!(getterNameStr.equals("__get__" + propertyNameStr))) { + throw new AssertException("getter does not match property name"); + } + //TODO: handle getter HERE + + } else if (propertyGetter instanceof FunctionActionItem) { + FunctionActionItem getterFunc = (FunctionActionItem) propertyGetter; + if (!(getterFunc.actions.isEmpty() && getterFunc.functionName.isEmpty() && ((FunctionActionItem) propertyGetter).paramNames.isEmpty())) { + throw new AssertException("unexpected getter value for property " + propertyNameStr); + } + //we got empty getter + } else { + throw new AssertException("unexpected getter value for property " + propertyNameStr + ": " + propertyGetter.getClass().getSimpleName()); + } + + if (propertySetter instanceof GetMemberActionItem) { + int regId = getAsRegisterNum(((GetMemberActionItem) propertySetter).object, "setter member"); + if (rnumObject != regId) { + throw new AssertException("setter register does not match property register " + regId + " <=> " + rnumObject); + } + String setterNameStr = getAsString(((GetMemberActionItem) propertySetter).memberName, "setter memberNAme"); + if (!(setterNameStr.equals("__set__" + propertyNameStr))) { + throw new AssertException("setter does not match property name"); + } + //TODO: handle setter HERE + } else if (propertySetter instanceof FunctionActionItem) { + FunctionActionItem setterFunc = (FunctionActionItem) propertySetter; + if (!(setterFunc.actions.isEmpty() && setterFunc.functionName.isEmpty() && ((FunctionActionItem) propertySetter).paramNames.isEmpty())) { + throw new AssertException("unexpected getter value for property " + propertyNameStr); + } + //we got empty setter + } else { + throw new AssertException("unexpected setter value for property " + propertyNameStr + ": " + propertySetter.getClass().getSimpleName()); + } + + } else { + throw new AssertException("unknown push method name: " + pushMethodName); + } + } else if (item instanceof CallFunctionActionItem) { + CallFunctionActionItem cf = (CallFunctionActionItem) item; + String funName = getAsString(cf.functionName, "pushitem function name"); + if (funName.equals("ASSetPropFlags")) { + //it should be ASSetPropFlags(a.b.c.D.prototype,null,1) as it sets prototype to hidden + //see http://www.ryanjuckett.com/programming/how-to-use-assetpropflags-in-actionscript-2-0/ + if (cf.arguments.size() != 3) { + throw new AssertException("Invalid number of arguments to ASSetPropFlags:" + cf.arguments.size() + ", 3 expected"); + } + GraphTargetItem obj = cf.arguments.get(0); + GraphTargetItem props = cf.arguments.get(1); + GraphTargetItem flags = cf.arguments.get(2); + if ((obj instanceof DirectValueActionItem) && (((DirectValueActionItem) obj).value instanceof RegisterNumber)) { + RegisterNumber rn = (RegisterNumber) ((DirectValueActionItem) obj).value; + if (rn.number != instanceReg) { + throw new AssertException("ASSetPropFlags not on instanceReg"); + } + } else { + List path = getMembersPath(obj); + if (path != null && !path.isEmpty() && "_global".equals(path.get(0))) { //For classes in toplevel package, there's _global in path + path.remove(0); //remove that _global + } + List classPathWithPrototype = new ArrayList<>(); + classPathWithPrototype.addAll(classNamePath); + classPathWithPrototype.add("prototype"); + if (!classPathWithPrototype.equals(path)) { + throw new AssertException("ASSetPropFlags not on prototype"); + } + } + if (!((props instanceof DirectValueActionItem) && (((DirectValueActionItem) props).value == Null.INSTANCE))) { + throw new AssertException("ASSetPropFlags properties param not null"); + } + if (!((flags instanceof DirectValueActionItem) && (((DirectValueActionItem) flags).value == (Long) 1L))) { + throw new AssertException("ASSetPropFlags flags not set to 1"); + } + } else { + throw new AssertException("unknown pushitem function call " + funName); + } + } else { + throw new AssertException("unknown item - " + item.getClass().getSimpleName()); + } + } + + if (constructor != null) { //constructor should be there always, but just in calse + //add constructor as trait + traitsStatic.add(0, false); + DirectValueActionItem classBaseName = new DirectValueActionItem(classNamePath.get(classNamePath.size() - 1)); + ((FunctionActionItem) constructor).calculatedFunctionName = classBaseName; + traits.add(0, new MyEntry<>(classBaseName, constructor)); + } else { + throw new AssertException("No constructor found"); + } + + ClassActionItem clsItem = new ClassActionItem(classNameTargetPath, extendsOp, implementsOp, traits, traitsStatic); + for (int k = commandsStartPos; k <= commandsEndPos; k++) { + commands.remove(commandsStartPos); + } + commands.add(commandsStartPos, clsItem); + + //remove §§pop after, if it's there + if (commandsStartPos + 1 < commands.size()) { + if (commands.get(commandsStartPos + 1) instanceof PopItem) { + commands.remove(commandsStartPos + 1); + } + } + + // goto next line and check next classes + return true; + } catch (AssertException ex) { + logger.log(Level.WARNING, "{0}: Cannot detect class - {1}", new Object[]{scriptPath, ex.getCondition()}); + } + return false; + } + + private boolean checkIfVariants(List commands, int pos, String scriptPath) { + + + /* + Variant 1: + + if(!_global.a) + { + _global.a = new Object(); + } + §§pop(); + if(!_global.a.b) + { + _global.a.b = new Object(); + } + §§pop(); + if(!_global.a.b.c) + { + _global.a.b.c = new Object(); + } + §§pop(); + if(!_global.a.b.c.D) + { + ..class_content... + } + §§pop(); + */ + List pathToSearchVariant1 = new ArrayList<>(); + pathToSearchVariant1.add("_global"); + + check_variant1: + for (int checkPos = pos; checkPos < commands.size(); checkPos++) { + GraphTargetItem t = commands.get(checkPos); + if (t instanceof IfItem) { + IfItem ifItem = (IfItem) t; + if (ifItem.expression instanceof NotItem) { + NotItem nti = (NotItem) ifItem.expression; + GraphTargetItem condType = nti.value; + Reference newMemberNameRef = new Reference<>(""); + + if (isMemberOfPath(condType, pathToSearchVariant1, newMemberNameRef)) { + pathToSearchVariant1.add(newMemberNameRef.getVal()); + + //_global.a.b.c = new Object(); + if ((ifItem.onTrue.size() == 1) && (ifItem.onTrue.get(0) instanceof SetMemberActionItem) && (((SetMemberActionItem) ifItem.onTrue.get(0)).value instanceof NewObjectActionItem)) { + //skip §§pop item if its there right after if + if (checkPos + 1 < commands.size()) { + GraphTargetItem tnext = commands.get(checkPos + 1); + if (tnext instanceof PopItem) { + checkPos++; + } + } + continue check_variant1; + } + List classPath = pathToSearchVariant1; + classPath.remove(0); //remove _global + if (this.checkClassContent(ifItem.onTrue, 0, pos, checkPos, commands, classPath, scriptPath)) { + return true; + } else { + break check_variant1; + } + } else { + break check_variant1; + } + } else { + break check_variant1; //not an if ! + } + } else { + break check_variant1; //not an if + } + } //check_variant1 + + /* + + Variant 2: + + if(!a.b.c.D) + { + if(!a) + { + _global.a = new Object(); + } + if(!a.b) + { + _global.a.b = new Object(); + } + if(!a.b.c) + { + _global.a.b.c = new Object(); + } + ..class_content.. + } + */ + List variant2CurrentPath = new ArrayList<>(); + check_variant2: + if (commands.get(pos) instanceof IfItem) { + IfItem ifItem = (IfItem) commands.get(pos); + if (ifItem.expression instanceof NotItem) { + NotItem nti = (NotItem) ifItem.expression; + List memPath = getMembersPath(nti.value); + if (memPath == null) { + break check_variant2; + } + if (ifItem.onTrue.size() < memPath.size()) { + break check_variant2; + } + variant2CurrentPath.clear(); + List parts = ifItem.onTrue; + int checkPos = 0; + for (; checkPos < memPath.size() - 1; checkPos++) { + variant2CurrentPath.add(memPath.get(checkPos)); + if (!(parts.get(checkPos) instanceof IfItem)) { + break check_variant2; + } + IfItem ifItem2 = (IfItem) parts.get(checkPos); + if (ifItem2.expression instanceof NotItem) { + NotItem nti2 = (NotItem) ifItem2.expression; + List if2Path = getMembersPath(nti2.value); + if (!variant2CurrentPath.equals(if2Path)) { + break check_variant2; + } + } + } + if (checkClassContent(parts, checkPos, pos, pos, commands, memPath, scriptPath)) { + return true; + } + } + }//check_variant2 + + return false; + } + + public void checkClass(List commands, String scriptPath) { + for (int pos = 0; pos < commands.size(); pos++) { + checkIfVariants(commands, pos, scriptPath); + } } } From c0e6e728d9c9de7e9df8b76c1f9d4f34dd6be732 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sat, 27 Jan 2018 11:34:51 +0100 Subject: [PATCH 29/58] AS2 class detector - checking classes only in DoInitAction tags --- .../src/com/jpexs/decompiler/flash/SWF.java | 12 ++++---- .../jpexs/decompiler/flash/action/Action.java | 23 ++++++++------- .../decompiler/flash/action/ActionGraph.java | 29 ++++++++++--------- .../flash/action/ActionGraphSource.java | 7 +++-- .../flash/action/ActionLocalData.java | 14 ++++++--- .../action/ActionScript2ClassDetector.java | 2 +- .../action/flashlite/ActionFSCommand2.java | 2 +- .../action/flashlite/ActionStrictMode.java | 2 +- .../flash/action/special/ActionEnd.java | 2 +- .../flash/action/special/ActionNop.java | 2 +- .../flash/action/special/ActionUnknown.java | 2 +- .../flash/action/swf3/ActionGetURL.java | 2 +- .../flash/action/swf3/ActionGoToLabel.java | 2 +- .../flash/action/swf3/ActionGotoFrame.java | 2 +- .../flash/action/swf3/ActionNextFrame.java | 2 +- .../flash/action/swf3/ActionPlay.java | 2 +- .../flash/action/swf3/ActionPrevFrame.java | 2 +- .../flash/action/swf3/ActionSetTarget.java | 2 +- .../flash/action/swf3/ActionStop.java | 2 +- .../flash/action/swf3/ActionStopSounds.java | 2 +- .../action/swf3/ActionToggleQuality.java | 2 +- .../flash/action/swf3/ActionWaitForFrame.java | 7 +++-- .../flash/action/swf4/ActionAdd.java | 2 +- .../flash/action/swf4/ActionAnd.java | 2 +- .../flash/action/swf4/ActionAsciiToChar.java | 2 +- .../flash/action/swf4/ActionCall.java | 2 +- .../flash/action/swf4/ActionCharToAscii.java | 2 +- .../flash/action/swf4/ActionCloneSprite.java | 2 +- .../flash/action/swf4/ActionDivide.java | 2 +- .../flash/action/swf4/ActionEndDrag.java | 2 +- .../flash/action/swf4/ActionEquals.java | 2 +- .../flash/action/swf4/ActionGetProperty.java | 2 +- .../flash/action/swf4/ActionGetTime.java | 2 +- .../flash/action/swf4/ActionGetURL2.java | 2 +- .../flash/action/swf4/ActionGetVariable.java | 2 +- .../flash/action/swf4/ActionGotoFrame2.java | 2 +- .../flash/action/swf4/ActionLess.java | 2 +- .../action/swf4/ActionMBAsciiToChar.java | 2 +- .../action/swf4/ActionMBCharToAscii.java | 2 +- .../action/swf4/ActionMBStringExtract.java | 2 +- .../action/swf4/ActionMBStringLength.java | 2 +- .../flash/action/swf4/ActionMultiply.java | 2 +- .../flash/action/swf4/ActionNot.java | 2 +- .../flash/action/swf4/ActionOr.java | 2 +- .../flash/action/swf4/ActionPop.java | 2 +- .../flash/action/swf4/ActionPush.java | 2 +- .../flash/action/swf4/ActionRandomNumber.java | 2 +- .../flash/action/swf4/ActionRemoveSprite.java | 2 +- .../flash/action/swf4/ActionSetProperty.java | 2 +- .../flash/action/swf4/ActionSetTarget2.java | 2 +- .../flash/action/swf4/ActionSetVariable.java | 2 +- .../flash/action/swf4/ActionStartDrag.java | 2 +- .../flash/action/swf4/ActionStringAdd.java | 2 +- .../flash/action/swf4/ActionStringEquals.java | 2 +- .../action/swf4/ActionStringExtract.java | 2 +- .../flash/action/swf4/ActionStringLength.java | 2 +- .../flash/action/swf4/ActionStringLess.java | 2 +- .../flash/action/swf4/ActionSubtract.java | 2 +- .../flash/action/swf4/ActionToInteger.java | 2 +- .../flash/action/swf4/ActionTrace.java | 2 +- .../action/swf4/ActionWaitForFrame2.java | 7 +++-- .../flash/action/swf5/ActionAdd2.java | 2 +- .../flash/action/swf5/ActionBitAnd.java | 2 +- .../flash/action/swf5/ActionBitLShift.java | 2 +- .../flash/action/swf5/ActionBitOr.java | 2 +- .../flash/action/swf5/ActionBitRShift.java | 2 +- .../flash/action/swf5/ActionBitURShift.java | 2 +- .../flash/action/swf5/ActionBitXor.java | 2 +- .../flash/action/swf5/ActionCallFunction.java | 2 +- .../flash/action/swf5/ActionCallMethod.java | 2 +- .../flash/action/swf5/ActionConstantPool.java | 2 +- .../flash/action/swf5/ActionDecrement.java | 2 +- .../action/swf5/ActionDefineFunction.java | 2 +- .../flash/action/swf5/ActionDefineLocal.java | 2 +- .../flash/action/swf5/ActionDefineLocal2.java | 2 +- .../flash/action/swf5/ActionDelete.java | 2 +- .../flash/action/swf5/ActionDelete2.java | 2 +- .../flash/action/swf5/ActionEnumerate.java | 2 +- .../flash/action/swf5/ActionEquals2.java | 2 +- .../flash/action/swf5/ActionGetMember.java | 2 +- .../flash/action/swf5/ActionIncrement.java | 2 +- .../flash/action/swf5/ActionInitArray.java | 2 +- .../flash/action/swf5/ActionInitObject.java | 2 +- .../flash/action/swf5/ActionLess2.java | 2 +- .../flash/action/swf5/ActionModulo.java | 2 +- .../flash/action/swf5/ActionNewMethod.java | 2 +- .../flash/action/swf5/ActionNewObject.java | 2 +- .../action/swf5/ActionPushDuplicate.java | 2 +- .../flash/action/swf5/ActionReturn.java | 2 +- .../flash/action/swf5/ActionSetMember.java | 2 +- .../flash/action/swf5/ActionStackSwap.java | 2 +- .../action/swf5/ActionStoreRegister.java | 2 +- .../flash/action/swf5/ActionTargetPath.java | 2 +- .../flash/action/swf5/ActionToNumber.java | 2 +- .../flash/action/swf5/ActionToString.java | 2 +- .../flash/action/swf5/ActionTypeOf.java | 2 +- .../flash/action/swf6/ActionEnumerate2.java | 2 +- .../flash/action/swf6/ActionGreater.java | 2 +- .../flash/action/swf6/ActionInstanceOf.java | 2 +- .../flash/action/swf6/ActionStrictEquals.java | 2 +- .../action/swf6/ActionStringGreater.java | 2 +- .../flash/action/swf7/ActionCastOp.java | 2 +- .../action/swf7/ActionDefineFunction2.java | 2 +- .../flash/action/swf7/ActionExtends.java | 2 +- .../flash/action/swf7/ActionImplementsOp.java | 2 +- .../flash/action/swf7/ActionThrow.java | 2 +- .../flash/gui/action/ActionPanel.java | 8 +++-- .../decompiler/flash/gui/FlashPlayerTest.java | 2 +- 108 files changed, 163 insertions(+), 144 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java index 702d9a6fb..af9a30818 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java @@ -1968,6 +1968,7 @@ public final class SWF implements SWFContainerItem, Timelined { } private static void getVariables(ConstantPool constantPool, BaseLocalData localData, TranslateStack stack, List output, ActionGraphSource code, int ip, List> variables, List functions, HashMap strings, List visited, HashMap usageTypes, String path) throws InterruptedException { + ActionLocalData aLocalData = (ActionLocalData) localData; boolean debugMode = false; while ((ip > -1) && ip < code.size()) { if (visited.contains(ip)) { @@ -2034,7 +2035,7 @@ public final class SWF implements SWFContainerItem, Timelined { ip = code.adr2pos(addr); addr += size; int nextip = code.adr2pos(addr); - getVariables(variables, functions, strings, usageTypes, new ActionGraphSource(code.getActions().subList(ip, nextip), code.version, new HashMap<>(), new HashMap<>(), new HashMap<>()), 0, path + (cntName == null ? "" : "/" + cntName)); + getVariables(aLocalData.insideDoInitAction, variables, functions, strings, usageTypes, new ActionGraphSource(aLocalData.insideDoInitAction, code.getActions().subList(ip, nextip), code.version, new HashMap<>(), new HashMap<>(), new HashMap<>()), 0, path + (cntName == null ? "" : "/" + cntName)); ip = nextip; } List> r = new ArrayList<>(); @@ -2125,8 +2126,8 @@ public final class SWF implements SWFContainerItem, Timelined { } } - private static void getVariables(List> variables, List functions, HashMap strings, HashMap usageTypes, ActionGraphSource code, int addr, String path) throws InterruptedException { - ActionLocalData localData = new ActionLocalData(); + private static void getVariables(boolean insideDoInitAction, List> variables, List functions, HashMap strings, HashMap usageTypes, ActionGraphSource code, int addr, String path) throws InterruptedException { + ActionLocalData localData = new ActionLocalData(insideDoInitAction); getVariables(null, localData, new TranslateStack(path), new ArrayList<>(), code, code.adr2pos(addr), variables, functions, strings, new ArrayList<>(), usageTypes, path); } @@ -2134,7 +2135,8 @@ public final class SWF implements SWFContainerItem, Timelined { List> ret = new ArrayList<>(); ActionList actions = src.getActions(); actionsMap.put(src, actions); - getVariables(variables, functions, strings, usageTypes, new ActionGraphSource(actions, version, new HashMap<>(), new HashMap<>(), new HashMap<>()), 0, path); + boolean insideDoInitAction = src instanceof DoInitActionTag; + getVariables(insideDoInitAction, variables, functions, strings, usageTypes, new ActionGraphSource(insideDoInitAction, actions, version, new HashMap<>(), new HashMap<>(), new HashMap<>()), 0, path); return ret; } @@ -2290,7 +2292,7 @@ public final class SWF implements SWFContainerItem, Timelined { int staticOperation = Graph.SOP_USE_STATIC; //(Boolean) Configuration.getConfig("autoDeobfuscate", true) ? Graph.SOP_SKIP_STATIC : Graph.SOP_USE_STATIC; List dec; try { - dec = Action.actionsToTree(dia.getActions(), version, staticOperation, ""/*FIXME*/); + dec = Action.actionsToTree(true /*Yes, inside doInitAction*/, dia.getActions(), version, staticOperation, ""/*FIXME*/); } catch (EmptyStackException ex) { continue; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java index 0be700720..178d28d5a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java @@ -67,6 +67,7 @@ import com.jpexs.decompiler.flash.helpers.GraphTextWriter; import com.jpexs.decompiler.flash.helpers.NulWriter; import com.jpexs.decompiler.flash.helpers.SWFDecompilerPlugin; import com.jpexs.decompiler.flash.helpers.collections.MyEntry; +import com.jpexs.decompiler.flash.tags.DoInitActionTag; import com.jpexs.decompiler.flash.tags.base.ASMSource; import com.jpexs.decompiler.graph.Graph; import com.jpexs.decompiler.graph.GraphSource; @@ -759,7 +760,7 @@ public abstract class Action implements GraphSourceItem { * @param path the value of path * @throws java.lang.InterruptedException */ - public void translate(GraphSourceItem lineStartIns, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) throws InterruptedException { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartIns, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) throws InterruptedException { } @Override @@ -835,8 +836,8 @@ public abstract class Action implements GraphSourceItem { return -1; } - public static List actionsToTree(List actions, int version, int staticOperation, String path) throws InterruptedException { - return actionsToTree(new HashMap<>(), new HashMap<>(), new HashMap<>(), actions, version, staticOperation, path); + public static List actionsToTree(boolean insideDoInitAction, List actions, int version, int staticOperation, String path) throws InterruptedException { + return actionsToTree(insideDoInitAction, new HashMap<>(), new HashMap<>(), new HashMap<>(), actions, version, staticOperation, path); } /** @@ -861,7 +862,8 @@ public abstract class Action implements GraphSourceItem { @Override public List call() throws Exception { int staticOperation = Graph.SOP_USE_STATIC; //(Boolean) Configuration.getConfig("autoDeobfuscate", true) ? Graph.SOP_SKIP_STATIC : Graph.SOP_USE_STATIC; - List tree = actionsToTree(new HashMap<>(), new HashMap<>(), new HashMap<>(), actions, version, staticOperation, path); + boolean insideDoInitAction = (asm instanceof DoInitActionTag); + List tree = actionsToTree(insideDoInitAction, new HashMap<>(), new HashMap<>(), new HashMap<>(), actions, version, staticOperation, path); SWFDecompilerPlugin.fireActionTreeCreated(tree, swf); if (Configuration.autoDeobfuscate.get()) { new ActionDeobfuscator().actionTreeCreated(tree, swf); @@ -919,8 +921,8 @@ public abstract class Action implements GraphSourceItem { * @return List of treeItems * @throws java.lang.InterruptedException */ - public static List actionsToTree(HashMap regNames, HashMap variables, HashMap functions, List actions, int version, int staticOperation, String path) throws InterruptedException { - return ActionGraph.translateViaGraph(regNames, variables, functions, actions, version, staticOperation, path); + public static List actionsToTree(boolean insideDoInitAction, HashMap regNames, HashMap variables, HashMap functions, List actions, int version, int staticOperation, String path) throws InterruptedException { + return ActionGraph.translateViaGraph(insideDoInitAction, regNames, variables, functions, actions, version, staticOperation, path); } @Override @@ -932,7 +934,7 @@ public abstract class Action implements GraphSourceItem { } expectedSize += getStackPushCount(localData, stack);*/ - translate(aLocalData.lineStartAction, stack, output, aLocalData.regNames, aLocalData.variables, aLocalData.functions, staticOperation, path); + translate(aLocalData.insideDoInitAction, aLocalData.lineStartAction, stack, output, aLocalData.regNames, aLocalData.variables, aLocalData.functions, staticOperation, path); /*if (stack.size() != expectedSize && !(this instanceof ActionPushDuplicate)) { throw new Error("HONFIKA stack size mismatch"); }*/ @@ -968,11 +970,11 @@ public abstract class Action implements GraphSourceItem { this.ignored = ignored; } - public static List actionsPartToTree(Reference fi, HashMap registerNames, HashMap variables, HashMap functions, TranslateStack stack, List actions, int start, int end, int version, int staticOperation, String path) throws InterruptedException { + public static List actionsPartToTree(boolean insideDoInitAction, Reference fi, HashMap registerNames, HashMap variables, HashMap functions, TranslateStack stack, List actions, int start, int end, int version, int staticOperation, String path) throws InterruptedException { if (start < actions.size() && (end > 0) && (start > 0)) { logger.log(Level.FINE, "Entering {0}-{1}{2}", new Object[]{start, end, actions.size() > 0 ? (" (" + actions.get(start).toString() + " - " + actions.get(end == actions.size() ? end - 1 : end) + ")") : ""}); } - ActionLocalData localData = new ActionLocalData(registerNames, variables, functions); + ActionLocalData localData = new ActionLocalData(insideDoInitAction, registerNames, variables, functions); localData.lineStartAction = fi.getVal(); List output = new ArrayList<>(); int ip = start; @@ -1042,7 +1044,7 @@ public abstract class Action implements GraphSourceItem { } } } - out = ActionGraph.translateViaGraph(regNames, variables2, functions, actions.subList(adr2ip(actions, endAddr), adr2ip(actions, endAddr + size)), version, staticOperation, path + (cntName == null ? "" : "/" + cntName)); + out = ActionGraph.translateViaGraph(insideDoInitAction, regNames, variables2, functions, actions.subList(adr2ip(actions, endAddr), adr2ip(actions, endAddr + size)), version, staticOperation, path + (cntName == null ? "" : "/" + cntName)); } catch (OutOfMemoryError | TranslateException | StackOverflowError ex) { logger.log(Level.SEVERE, "Decompilation error in: " + path, ex); if (ex instanceof OutOfMemoryError) { @@ -1181,7 +1183,6 @@ public abstract class Action implements GraphSourceItem { ip++; } - //output = checkClass(output); logger.log(Level.FINE, "Leaving {0}-{1}", new Object[]{start, end}); return output; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java index 145f228e9..ce146e4f5 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java @@ -63,20 +63,21 @@ import java.util.Set; */ public class ActionGraph extends Graph { - public ActionGraph(List code, HashMap registerNames, HashMap variables, HashMap functions, int version) { - super(new ActionGraphSource(code, version, registerNames, variables, functions), new ArrayList<>()); - //this.version = version; - /*heads = makeGraph(code, new ArrayList()); - for (GraphPart head : heads) { - fixGraph(head); - makeMulti(head, new ArrayList()); - }*/ + private boolean insideDoInitAction; + + public ActionGraph(boolean insideDoInitAction, List code, HashMap registerNames, HashMap variables, HashMap functions, int version) { + super(new ActionGraphSource(insideDoInitAction, code, version, registerNames, variables, functions), new ArrayList<>()); + this.insideDoInitAction = insideDoInitAction; } - public static List translateViaGraph(HashMap registerNames, HashMap variables, HashMap functions, List code, int version, int staticOperation, String path) throws InterruptedException { + public boolean isInsideDoInitAction() { + return insideDoInitAction; + } - ActionGraph g = new ActionGraph(code, registerNames, variables, functions, version); - ActionLocalData localData = new ActionLocalData(registerNames); + public static List translateViaGraph(boolean insideDoInitAction, HashMap registerNames, HashMap variables, HashMap functions, List code, int version, int staticOperation, String path) throws InterruptedException { + + ActionGraph g = new ActionGraph(insideDoInitAction, code, registerNames, variables, functions, version); + ActionLocalData localData = new ActionLocalData(insideDoInitAction, registerNames); g.init(localData); return g.translate(localData, staticOperation, path); } @@ -99,8 +100,10 @@ public class ActionGraph extends Graph { @Override protected void finalProcess(List list, int level, FinalProcessLocalData localData, String path) throws InterruptedException { - ActionScript2ClassDetector detector = new ActionScript2ClassDetector(); - detector.checkClass(list, path); + if (insideDoInitAction) { + ActionScript2ClassDetector detector = new ActionScript2ClassDetector(); + detector.checkClass(list, path); + } int targetStart; int targetEnd; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraphSource.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraphSource.java index 664a19b25..4b576a1c6 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraphSource.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraphSource.java @@ -46,16 +46,19 @@ public class ActionGraphSource extends GraphSource { private final HashMap functions; + private final boolean insideDoInitAction; + public List getActions() { return actions; } - public ActionGraphSource(List actions, int version, HashMap registerNames, HashMap variables, HashMap functions) { + public ActionGraphSource(boolean insideDoInitAction, List actions, int version, HashMap registerNames, HashMap variables, HashMap functions) { this.actions = actions; this.version = version; this.registerNames = registerNames; this.variables = variables; this.functions = functions; + this.insideDoInitAction = insideDoInitAction; } @Override @@ -81,7 +84,7 @@ public class ActionGraphSource extends GraphSource { public List translatePart(GraphPart part, BaseLocalData localData, TranslateStack stack, int start, int end, int staticOperation, String path) throws InterruptedException { Reference fi = new Reference<>(localData.lineStartInstruction); - List r = Action.actionsPartToTree(fi, registerNames, variables, functions, stack, actions, start, end, version, staticOperation, path); + List r = Action.actionsPartToTree(this.insideDoInitAction, fi, registerNames, variables, functions, stack, actions, start, end, version, staticOperation, path); localData.lineStartInstruction = fi.getVal(); return r; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionLocalData.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionLocalData.java index f6b34f8b1..8471cef69 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionLocalData.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionLocalData.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.action; import com.jpexs.decompiler.flash.BaseLocalData; @@ -34,21 +35,26 @@ public class ActionLocalData extends BaseLocalData { public GraphSourceItem lineStartAction; - public ActionLocalData() { + public boolean insideDoInitAction; + + public ActionLocalData(boolean insideDoInitAction) { regNames = new HashMap<>(); variables = new HashMap<>(); functions = new HashMap<>(); + this.insideDoInitAction = insideDoInitAction; } - public ActionLocalData(HashMap regNames) { + public ActionLocalData(boolean insideDoInitAction, HashMap regNames) { this.regNames = regNames; variables = new HashMap<>(); functions = new HashMap<>(); + this.insideDoInitAction = insideDoInitAction; } - public ActionLocalData(HashMap regNames, HashMap variables, HashMap functions) { + public ActionLocalData(boolean insideDoInitAction, HashMap regNames, HashMap variables, HashMap functions) { this.regNames = regNames; this.variables = variables; this.functions = functions; + this.insideDoInitAction = insideDoInitAction; } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionScript2ClassDetector.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionScript2ClassDetector.java index 37b833f4e..1c2481b81 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionScript2ClassDetector.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionScript2ClassDetector.java @@ -229,7 +229,7 @@ public class ActionScript2ClassDetector { } } */ - public static GraphTargetItem getWithoutGlobal(GraphTargetItem ti) { + private static GraphTargetItem getWithoutGlobal(GraphTargetItem ti) { GraphTargetItem t = ti; if (!(t instanceof GetMemberActionItem)) { return ti; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/flashlite/ActionFSCommand2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/flashlite/ActionFSCommand2.java index dbb40a3de..f69368076 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/flashlite/ActionFSCommand2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/flashlite/ActionFSCommand2.java @@ -42,7 +42,7 @@ public class ActionFSCommand2 extends Action { } @Override - public void translate(GraphSourceItem lineStartItem, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartItem, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { long numArgs = popLong(stack); GraphTargetItem command = stack.pop(); List args = new ArrayList<>(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/flashlite/ActionStrictMode.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/flashlite/ActionStrictMode.java index b95732252..80040d793 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/flashlite/ActionStrictMode.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/flashlite/ActionStrictMode.java @@ -73,7 +73,7 @@ public class ActionStrictMode extends Action { } @Override - public void translate(GraphSourceItem lineStartItem, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartItem, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new StrictModeActionItem(this, lineStartItem, mode)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionEnd.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionEnd.java index 3370359dd..d292670f1 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionEnd.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionEnd.java @@ -52,7 +52,7 @@ public class ActionEnd extends Action { } @Override - public void translate(GraphSourceItem lineStartItem, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartItem, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { //output.add(new SimpleActionTreeItem(this, "end()")); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionNop.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionNop.java index 59a5c083b..237d2ec31 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionNop.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionNop.java @@ -48,7 +48,7 @@ public class ActionNop extends Action { } @Override - public void translate(GraphSourceItem lineStartItem, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartItem, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { //output.add(new SimpleActionTreeItem(this, "nop();")); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionUnknown.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionUnknown.java index 6e3a2fe91..3c8854c6e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionUnknown.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionUnknown.java @@ -45,6 +45,6 @@ public class ActionUnknown extends ActionNop { } @Override - public void translate(GraphSourceItem lineStartItem, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartItem, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGetURL.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGetURL.java index b9dcba8b4..4402a9f05 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGetURL.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGetURL.java @@ -97,7 +97,7 @@ public class ActionGetURL extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { String fsCommandPrefix = "FSCommand:"; if (urlString.startsWith(fsCommandPrefix) && targetString.isEmpty()) { String command = urlString.substring(fsCommandPrefix.length()); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGoToLabel.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGoToLabel.java index f86543b67..3a29e2329 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGoToLabel.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGoToLabel.java @@ -86,7 +86,7 @@ public class ActionGoToLabel extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new GotoLabelActionItem(this, lineStartAction, label)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGotoFrame.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGotoFrame.java index 302ea900c..87007a465 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGotoFrame.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGotoFrame.java @@ -82,7 +82,7 @@ public class ActionGotoFrame extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new GotoFrameActionItem(this, lineStartAction, frame)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionNextFrame.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionNextFrame.java index 7ef52294f..54e5c4c97 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionNextFrame.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionNextFrame.java @@ -53,7 +53,7 @@ public class ActionNextFrame extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new NextFrameActionItem(this, lineStartAction)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionPlay.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionPlay.java index 2d71f642e..17ac6f266 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionPlay.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionPlay.java @@ -52,7 +52,7 @@ public class ActionPlay extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { if (!output.isEmpty() && (output.get(output.size() - 1) instanceof GotoFrameActionItem)) { GotoFrameActionItem gta = (GotoFrameActionItem) output.remove(output.size() - 1); output.add(new GotoFrame2ActionItem(this, lineStartAction, new DirectValueActionItem(gta.frame + 1), false, true, 0)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionPrevFrame.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionPrevFrame.java index 1bd9a2d30..bea471769 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionPrevFrame.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionPrevFrame.java @@ -53,7 +53,7 @@ public class ActionPrevFrame extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new PrevFrameActionItem(this, lineStartAction)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionSetTarget.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionSetTarget.java index 02ca3e1d1..2f17d6a9d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionSetTarget.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionSetTarget.java @@ -90,7 +90,7 @@ public class ActionSetTarget extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new SetTargetActionItem(this, lineStartAction, targetName)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionStop.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionStop.java index a8f69f163..2e8a38461 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionStop.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionStop.java @@ -49,7 +49,7 @@ public class ActionStop extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new StopActionItem(this, lineStartAction)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionStopSounds.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionStopSounds.java index 9e7dd352c..d9268e653 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionStopSounds.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionStopSounds.java @@ -48,7 +48,7 @@ public class ActionStopSounds extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new StopAllSoundsActionItem(this, lineStartAction)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionToggleQuality.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionToggleQuality.java index 7b654e8d9..343848280 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionToggleQuality.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionToggleQuality.java @@ -48,7 +48,7 @@ public class ActionToggleQuality extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new ToggleHighQualityActionItem(this, lineStartAction)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionWaitForFrame.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionWaitForFrame.java index fc02ddf83..deb356b04 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionWaitForFrame.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionWaitForFrame.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.action.swf3; import com.jpexs.decompiler.flash.SWF; @@ -99,9 +100,9 @@ public class ActionWaitForFrame extends Action implements ActionStore { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) throws InterruptedException { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) throws InterruptedException { GraphTargetItem frameTi = new DirectValueActionItem(null, null, 0, new Long(frame), new ArrayList<>()); - List body = ActionGraph.translateViaGraph(regNames, variables, functions, skipped, SWF.DEFAULT_VERSION, staticOperation, path); + List body = ActionGraph.translateViaGraph(insideDoInitAction, regNames, variables, functions, skipped, SWF.DEFAULT_VERSION, staticOperation, path); output.add(new IfFrameLoadedActionItem(frameTi, body, this, lineStartAction)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAdd.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAdd.java index ed444160a..19b8e7f44 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAdd.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAdd.java @@ -53,7 +53,7 @@ public class ActionAdd extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new AddActionItem(this, lineStartAction, b, a, false)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAnd.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAnd.java index 97b0c7a4f..42e1813b3 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAnd.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAnd.java @@ -53,7 +53,7 @@ public class ActionAnd extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new AndActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAsciiToChar.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAsciiToChar.java index 767bf3823..e968b2e8f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAsciiToChar.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAsciiToChar.java @@ -53,7 +53,7 @@ public class ActionAsciiToChar extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); stack.push(new AsciiToCharActionItem(this, lineStartAction, a)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCall.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCall.java index 00ae17ac6..0e15e05bb 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCall.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCall.java @@ -58,7 +58,7 @@ public class ActionCall extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new CallActionItem(this, lineStartAction, stack.pop())); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCharToAscii.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCharToAscii.java index 0d29c72dc..a6b643b20 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCharToAscii.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCharToAscii.java @@ -53,7 +53,7 @@ public class ActionCharToAscii extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); stack.push(new CharToAsciiActionItem(this, lineStartAction, a)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCloneSprite.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCloneSprite.java index 76649d7ec..758d65e51 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCloneSprite.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCloneSprite.java @@ -59,7 +59,7 @@ public class ActionCloneSprite extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem depth = stack.pop(); GraphTargetItem source = stack.pop(); GraphTargetItem target = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionDivide.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionDivide.java index f9a8a28fb..668d4b9c2 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionDivide.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionDivide.java @@ -53,7 +53,7 @@ public class ActionDivide extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new DivideActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionEndDrag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionEndDrag.java index 275fd6eb7..def6d7280 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionEndDrag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionEndDrag.java @@ -52,7 +52,7 @@ public class ActionEndDrag extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new StopDragActionItem(this, lineStartAction)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionEquals.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionEquals.java index b6812c6bb..66a7af3df 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionEquals.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionEquals.java @@ -53,7 +53,7 @@ public class ActionEquals extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new EqActionItem(this, lineStartAction, b, a, false)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetProperty.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetProperty.java index cfb03654e..82043030e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetProperty.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetProperty.java @@ -64,7 +64,7 @@ public class ActionGetProperty extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem index = stack.pop(); GraphTargetItem target = stack.pop(); int indexInt = 0; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetTime.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetTime.java index fd50fb310..53c89e2ce 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetTime.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetTime.java @@ -49,7 +49,7 @@ public class ActionGetTime extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { stack.push(new GetTimeActionItem(this, lineStartAction)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetURL2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetURL2.java index 61dc5ce2e..82a8a8053 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetURL2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetURL2.java @@ -124,7 +124,7 @@ public class ActionGetURL2 extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem targetString = stack.pop(); GraphTargetItem urlString = stack.pop(); Integer num = null; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetVariable.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetVariable.java index 156ac352e..a958fe498 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetVariable.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetVariable.java @@ -64,7 +64,7 @@ public class ActionGetVariable extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem name = stack.pop(); String nameStr; if (name instanceof DirectValueActionItem) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGotoFrame2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGotoFrame2.java index b3bdb3f33..8b9e40d66 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGotoFrame2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGotoFrame2.java @@ -143,7 +143,7 @@ public class ActionGotoFrame2 extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem frame = stack.pop(); output.add(new GotoFrame2ActionItem(this, lineStartAction, frame, sceneBiasFlag, playFlag, sceneBias)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionLess.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionLess.java index 762e6fe8b..bb736f67e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionLess.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionLess.java @@ -53,7 +53,7 @@ public class ActionLess extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new LtActionItem(this, lineStartAction, b, a, false)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBAsciiToChar.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBAsciiToChar.java index f43e712f2..1a9f3b179 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBAsciiToChar.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBAsciiToChar.java @@ -53,7 +53,7 @@ public class ActionMBAsciiToChar extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); stack.push(new MBAsciiToCharActionItem(this, lineStartAction, a)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBCharToAscii.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBCharToAscii.java index f1d07eb2b..ecef9ab58 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBCharToAscii.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBCharToAscii.java @@ -53,7 +53,7 @@ public class ActionMBCharToAscii extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); stack.push(new MBCharToAsciiActionItem(this, lineStartAction, a)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBStringExtract.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBStringExtract.java index cf371db1b..9ff7864cf 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBStringExtract.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBStringExtract.java @@ -53,7 +53,7 @@ public class ActionMBStringExtract extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem count = stack.pop(); GraphTargetItem index = stack.pop(); GraphTargetItem value = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBStringLength.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBStringLength.java index d4683b027..84e6df110 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBStringLength.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBStringLength.java @@ -53,7 +53,7 @@ public class ActionMBStringLength extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); stack.push(new MBStringLengthActionItem(this, lineStartAction, a)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMultiply.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMultiply.java index b8649ac3e..e86acdae7 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMultiply.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMultiply.java @@ -53,7 +53,7 @@ public class ActionMultiply extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new MultiplyActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionNot.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionNot.java index 012c80cca..52d8161c4 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionNot.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionNot.java @@ -53,7 +53,7 @@ public class ActionNot extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); stack.push(a.invert(this)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionOr.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionOr.java index 7292018fb..4eff80e10 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionOr.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionOr.java @@ -53,7 +53,7 @@ public class ActionOr extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new OrActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPop.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPop.java index 9f0181b2f..0fa744297 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPop.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPop.java @@ -52,7 +52,7 @@ public class ActionPop extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem val = stack.pop(); output.add(val); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPush.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPush.java index 183caf9aa..bcf989921 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPush.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPush.java @@ -389,7 +389,7 @@ public class ActionPush extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { int pos = 0; for (Object o : values) { if (o instanceof ConstantIndex) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionRandomNumber.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionRandomNumber.java index f2f40dff6..4ead65188 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionRandomNumber.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionRandomNumber.java @@ -53,7 +53,7 @@ public class ActionRandomNumber extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem maximum = stack.pop(); stack.push(new RandomNumberActionItem(this, lineStartAction, maximum)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionRemoveSprite.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionRemoveSprite.java index 9c23e3036..80106f46b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionRemoveSprite.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionRemoveSprite.java @@ -55,7 +55,7 @@ public class ActionRemoveSprite extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem target = stack.pop(); output.add(new RemoveSpriteActionItem(this, lineStartAction, target)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetProperty.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetProperty.java index 14cc36af2..ce3a26c6f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetProperty.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetProperty.java @@ -70,7 +70,7 @@ public class ActionSetProperty extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem value = stack.pop().getThroughDuplicate(); GraphTargetItem index = stack.pop().getThroughDuplicate(); GraphTargetItem target = stack.pop().getThroughDuplicate(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetTarget2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetTarget2.java index 7f1cf51c7..a34cd1937 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetTarget2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetTarget2.java @@ -54,7 +54,7 @@ public class ActionSetTarget2 extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem target = stack.pop(); output.add(new SetTarget2ActionItem(this, lineStartAction, target)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetVariable.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetVariable.java index c4c564b35..4c421da6c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetVariable.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetVariable.java @@ -68,7 +68,7 @@ public class ActionSetVariable extends Action implements StoreTypeAction { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem value = stack.pop().getThroughDuplicate(); GraphTargetItem name = stack.pop(); String nameStr; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStartDrag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStartDrag.java index 244fcb91e..39cd5a110 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStartDrag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStartDrag.java @@ -54,7 +54,7 @@ public class ActionStartDrag extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem target = stack.pop(); GraphTargetItem lockCenter = stack.pop(); GraphTargetItem constrain = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringAdd.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringAdd.java index a79979a4a..16dd9d740 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringAdd.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringAdd.java @@ -53,7 +53,7 @@ public class ActionStringAdd extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new StringAddActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringEquals.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringEquals.java index a3697a2fe..7c2443d9a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringEquals.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringEquals.java @@ -53,7 +53,7 @@ public class ActionStringEquals extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new StringEqActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringExtract.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringExtract.java index 3bb04a3c9..eb8d71683 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringExtract.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringExtract.java @@ -53,7 +53,7 @@ public class ActionStringExtract extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem count = stack.pop(); GraphTargetItem index = stack.pop(); GraphTargetItem value = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringLength.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringLength.java index 1cd5a5fae..83e3b08c2 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringLength.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringLength.java @@ -53,7 +53,7 @@ public class ActionStringLength extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); stack.push(new StringLengthActionItem(this, lineStartAction, a)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringLess.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringLess.java index 8afefbbdd..fbfa1c193 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringLess.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringLess.java @@ -53,7 +53,7 @@ public class ActionStringLess extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new StringLtActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSubtract.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSubtract.java index b87655fd0..f1b64d9b2 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSubtract.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSubtract.java @@ -53,7 +53,7 @@ public class ActionSubtract extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new SubtractActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionToInteger.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionToInteger.java index 1869b66bc..80ab50aca 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionToInteger.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionToInteger.java @@ -53,7 +53,7 @@ public class ActionToInteger extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); stack.push(new ToIntegerActionItem(this, lineStartAction, a)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionTrace.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionTrace.java index db2d95695..65e4bc53b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionTrace.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionTrace.java @@ -53,7 +53,7 @@ public class ActionTrace extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem value = stack.pop(); output.add(new TraceActionItem(this, lineStartAction, value)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionWaitForFrame2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionWaitForFrame2.java index 19649085b..ab6de28dc 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionWaitForFrame2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionWaitForFrame2.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.action.swf4; import com.jpexs.decompiler.flash.BaseLocalData; @@ -145,9 +146,9 @@ public class ActionWaitForFrame2 extends Action implements ActionStore { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) throws InterruptedException { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) throws InterruptedException { GraphTargetItem frame = stack.pop(); - List body = ActionGraph.translateViaGraph(regNames, variables, functions, skipped, SWF.DEFAULT_VERSION, staticOperation, path); + List body = ActionGraph.translateViaGraph(insideDoInitAction, regNames, variables, functions, skipped, SWF.DEFAULT_VERSION, staticOperation, path); output.add(new IfFrameLoadedActionItem(frame, body, this, lineStartAction)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionAdd2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionAdd2.java index 323e9329e..3145db61b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionAdd2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionAdd2.java @@ -53,7 +53,7 @@ public class ActionAdd2 extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new AddActionItem(this, lineStartAction, b, a, true)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitAnd.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitAnd.java index 987f39c9a..cc4332ac5 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitAnd.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitAnd.java @@ -53,7 +53,7 @@ public class ActionBitAnd extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new BitAndActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitLShift.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitLShift.java index f8a9b739c..cc23921b3 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitLShift.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitLShift.java @@ -53,7 +53,7 @@ public class ActionBitLShift extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new LShiftActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitOr.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitOr.java index 8d2d38b3f..54976f587 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitOr.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitOr.java @@ -53,7 +53,7 @@ public class ActionBitOr extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new BitOrActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitRShift.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitRShift.java index 6f79e7e39..b0565ddc9 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitRShift.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitRShift.java @@ -53,7 +53,7 @@ public class ActionBitRShift extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new RShiftActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitURShift.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitURShift.java index 89232d503..78bee5c3f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitURShift.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitURShift.java @@ -53,7 +53,7 @@ public class ActionBitURShift extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new URShiftActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitXor.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitXor.java index 14ff4d69c..0eb5a9d32 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitXor.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitXor.java @@ -53,7 +53,7 @@ public class ActionBitXor extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new BitXorActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionCallFunction.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionCallFunction.java index 8067b3aba..0c0da6a54 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionCallFunction.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionCallFunction.java @@ -66,7 +66,7 @@ public class ActionCallFunction extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem functionName = stack.pop(); long numArgs = popLong(stack); List args = new ArrayList<>(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionCallMethod.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionCallMethod.java index 80f603fe9..87e2836da 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionCallMethod.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionCallMethod.java @@ -75,7 +75,7 @@ public class ActionCallMethod extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem methodName = stack.pop(); GraphTargetItem scriptObject = stack.pop(); long numArgs = popLong(stack); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionConstantPool.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionConstantPool.java index 44642fb99..fd2918da9 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionConstantPool.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionConstantPool.java @@ -117,6 +117,6 @@ public class ActionConstantPool extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDecrement.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDecrement.java index 9daf13bd0..1e25fd189 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDecrement.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDecrement.java @@ -53,7 +53,7 @@ public class ActionDecrement extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); stack.push(new DecrementActionItem(this, lineStartAction, a)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineFunction.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineFunction.java index 1f3ed7e2d..a38fb42da 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineFunction.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineFunction.java @@ -159,7 +159,7 @@ public class ActionDefineFunction extends Action implements GraphSourceItemConta } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineLocal.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineLocal.java index cf192dfa7..485ab6684 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineLocal.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineLocal.java @@ -57,7 +57,7 @@ public class ActionDefineLocal extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem value = stack.pop(); GraphTargetItem name = stack.pop(); String nameStr; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineLocal2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineLocal2.java index 776b6de1b..e3b7dbfc5 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineLocal2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineLocal2.java @@ -45,7 +45,7 @@ public class ActionDefineLocal2 extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem name = stack.pop(); output.add(new DefineLocalActionItem(this, lineStartAction, name, null)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDelete.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDelete.java index 473758f01..dad1a29b3 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDelete.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDelete.java @@ -54,7 +54,7 @@ public class ActionDelete extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem propertyName = stack.pop(); GraphTargetItem object = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDelete2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDelete2.java index 1c0db8f26..4be8b52b2 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDelete2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDelete2.java @@ -60,7 +60,7 @@ public class ActionDelete2 extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem propertyName = stack.pop(); stack.push(new DeleteActionItem(this, lineStartAction, null, propertyName)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionEnumerate.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionEnumerate.java index 8b2fe3f4b..3d6cca063 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionEnumerate.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionEnumerate.java @@ -65,7 +65,7 @@ public class ActionEnumerate extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem object = stack.pop(); //stack.push(new DirectValueActionItem(null, 0, new Null(), new ArrayList())); output.add(new EnumerateActionItem(this, lineStartAction, object)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionEquals2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionEquals2.java index 094fe0c34..810e99987 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionEquals2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionEquals2.java @@ -53,7 +53,7 @@ public class ActionEquals2 extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new EqActionItem(this, lineStartAction, b, a, true)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionGetMember.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionGetMember.java index 5b20f7ead..50adab2d0 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionGetMember.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionGetMember.java @@ -62,7 +62,7 @@ public class ActionGetMember extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem memberName = stack.pop(); GraphTargetItem object = stack.pop(); stack.push(new GetMemberActionItem(this, lineStartAction, object, memberName)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionIncrement.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionIncrement.java index ddd4a7d93..350d4d90d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionIncrement.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionIncrement.java @@ -53,7 +53,7 @@ public class ActionIncrement extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); stack.push(new IncrementActionItem(this, lineStartAction, a)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionInitArray.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionInitArray.java index 1c7aaf3aa..2bb0937b1 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionInitArray.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionInitArray.java @@ -60,7 +60,7 @@ public class ActionInitArray extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { long numArgs = popLong(stack); List args = new ArrayList<>(); for (int l = 0; l < numArgs; l++) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionInitObject.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionInitObject.java index ee1c753eb..0c3341ab7 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionInitObject.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionInitObject.java @@ -67,7 +67,7 @@ public class ActionInitObject extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { long numArgs = popLong(stack); List values = new ArrayList<>(); List names = new ArrayList<>(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionLess2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionLess2.java index 999fabcc9..299497df6 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionLess2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionLess2.java @@ -53,7 +53,7 @@ public class ActionLess2 extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new LtActionItem(this, lineStartAction, b, a, true)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionModulo.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionModulo.java index 16ad75989..7141d82c1 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionModulo.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionModulo.java @@ -53,7 +53,7 @@ public class ActionModulo extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new ModuloActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionNewMethod.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionNewMethod.java index 4bed79a9d..6c292fe4c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionNewMethod.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionNewMethod.java @@ -71,7 +71,7 @@ public class ActionNewMethod extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem methodName = stack.pop(); GraphTargetItem scriptObject = stack.pop(); long numArgs = popLong(stack); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionNewObject.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionNewObject.java index 9fa26f2c9..49719646e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionNewObject.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionNewObject.java @@ -71,7 +71,7 @@ public class ActionNewObject extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem objectName = stack.pop(); long numArgs = popLong(stack); List args = new ArrayList<>(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionPushDuplicate.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionPushDuplicate.java index 1a1d9a102..390a9c5a4 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionPushDuplicate.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionPushDuplicate.java @@ -54,7 +54,7 @@ public class ActionPushDuplicate extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem value = stack.peek(); stack.push(new DuplicateItem(this, lineStartAction, value)); value.getMoreSrc().add(new GraphSourceItemPos(this, 0)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionReturn.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionReturn.java index 4fd6f6bcd..f246c96d9 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionReturn.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionReturn.java @@ -55,7 +55,7 @@ public class ActionReturn extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem value = stack.pop(); output.add(new ReturnActionItem(this, lineStartAction, value)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionSetMember.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionSetMember.java index f0c8c5e1f..dff7fe2d4 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionSetMember.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionSetMember.java @@ -69,7 +69,7 @@ public class ActionSetMember extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem value = stack.pop().getThroughDuplicate(); GraphTargetItem memberName = stack.pop(); GraphTargetItem object = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionStackSwap.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionStackSwap.java index c230e9670..43283c664 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionStackSwap.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionStackSwap.java @@ -56,7 +56,7 @@ public class ActionStackSwap extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(a); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionStoreRegister.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionStoreRegister.java index 90fb74831..b5195953a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionStoreRegister.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionStoreRegister.java @@ -97,7 +97,7 @@ public class ActionStoreRegister extends Action implements StoreTypeAction { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem value = stack.pop(); RegisterNumber rn = new RegisterNumber(registerNumber); if (regNames.containsKey(registerNumber)) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionTargetPath.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionTargetPath.java index ee7034bfc..718f1f6e1 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionTargetPath.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionTargetPath.java @@ -62,7 +62,7 @@ public class ActionTargetPath extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem object = stack.pop(); stack.push(new TargetPathActionItem(this, lineStartAction, object)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionToNumber.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionToNumber.java index 52f610b92..e90b5e3f0 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionToNumber.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionToNumber.java @@ -53,7 +53,7 @@ public class ActionToNumber extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem object = stack.pop(); stack.push(new ToNumberActionItem(this, lineStartAction, object)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionToString.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionToString.java index e01e80d5d..5b5c443ac 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionToString.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionToString.java @@ -53,7 +53,7 @@ public class ActionToString extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem object = stack.pop(); stack.push(new ToStringActionItem(this, lineStartAction, object)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionTypeOf.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionTypeOf.java index 4401b0ee6..e4b30b5ab 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionTypeOf.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionTypeOf.java @@ -53,7 +53,7 @@ public class ActionTypeOf extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem object = stack.pop(); stack.push(new TypeOfActionItem(this, lineStartAction, object)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionEnumerate2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionEnumerate2.java index 036c74e41..fbe390b23 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionEnumerate2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionEnumerate2.java @@ -45,7 +45,7 @@ public class ActionEnumerate2 extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem object = stack.pop(); output.add(new EnumerateActionItem(this, lineStartAction, object)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionGreater.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionGreater.java index 536583eec..4e144f418 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionGreater.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionGreater.java @@ -53,7 +53,7 @@ public class ActionGreater extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new GtActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionInstanceOf.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionInstanceOf.java index fd0e4a119..3795bb7fd 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionInstanceOf.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionInstanceOf.java @@ -84,7 +84,7 @@ public class ActionInstanceOf extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new InstanceOfActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionStrictEquals.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionStrictEquals.java index 8b057623e..276a7ce8b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionStrictEquals.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionStrictEquals.java @@ -53,7 +53,7 @@ public class ActionStrictEquals extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new StrictEqActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionStringGreater.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionStringGreater.java index ac1c0ad25..e03d9629f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionStringGreater.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionStringGreater.java @@ -53,7 +53,7 @@ public class ActionStringGreater extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new StringGtActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionCastOp.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionCastOp.java index 9cf211127..410490cbb 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionCastOp.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionCastOp.java @@ -63,7 +63,7 @@ public class ActionCastOp extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem object = stack.pop(); GraphTargetItem constructor = stack.pop(); stack.push(new CastOpActionItem(this, lineStartAction, constructor, object)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionDefineFunction2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionDefineFunction2.java index 1c09685b8..5a1650cf6 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionDefineFunction2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionDefineFunction2.java @@ -267,7 +267,7 @@ public class ActionDefineFunction2 extends Action implements GraphSourceItemCont } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionExtends.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionExtends.java index 7da091b9f..a333563b1 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionExtends.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionExtends.java @@ -63,7 +63,7 @@ public class ActionExtends extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem superclass = stack.pop(); GraphTargetItem subclass = stack.pop(); output.add(new ExtendsActionItem(this, lineStartAction, subclass, superclass)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionImplementsOp.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionImplementsOp.java index 2cd6aaaf9..454cb3ef2 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionImplementsOp.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionImplementsOp.java @@ -67,7 +67,7 @@ public class ActionImplementsOp extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem subclass = stack.pop(); long inCount = popLong(stack); List superclasses = new ArrayList<>(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionThrow.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionThrow.java index d6698729a..b6c159324 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionThrow.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionThrow.java @@ -49,7 +49,7 @@ public class ActionThrow extends Action { } @Override - public void translate(GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem object = stack.pop(); output.add(new ThrowActionItem(this, lineStartAction, object)); } diff --git a/src/com/jpexs/decompiler/flash/gui/action/ActionPanel.java b/src/com/jpexs/decompiler/flash/gui/action/ActionPanel.java index 59d2eccde..80210f8ee 100644 --- a/src/com/jpexs/decompiler/flash/gui/action/ActionPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/action/ActionPanel.java @@ -55,6 +55,7 @@ import com.jpexs.decompiler.flash.helpers.hilight.Highlighting; import com.jpexs.decompiler.flash.search.ActionScriptSearch; import com.jpexs.decompiler.flash.search.ActionSearchResult; import com.jpexs.decompiler.flash.search.ScriptSearchListener; +import com.jpexs.decompiler.flash.tags.DoInitActionTag; import com.jpexs.decompiler.flash.tags.base.ASMSource; import com.jpexs.decompiler.graph.CompilationException; import com.jpexs.helpers.CancellableWorker; @@ -186,7 +187,7 @@ public class ActionPanel extends JPanel implements SearchListener(), new HashMap<>(), new HashMap<>(), SWF.DEFAULT_VERSION), ""); + boolean insideDoInitAction = (this.src instanceof DoInitActionTag); + GraphDialog gf = new GraphDialog(mainPanel.getMainFrame().getWindow(), new ActionGraph(insideDoInitAction, lastCode, new HashMap<>(), new HashMap<>(), new HashMap<>(), SWF.DEFAULT_VERSION), ""); gf.setVisible(true); } catch (InterruptedException ex) { logger.log(Level.SEVERE, null, ex); diff --git a/test/com/jpexs/decompiler/flash/gui/FlashPlayerTest.java b/test/com/jpexs/decompiler/flash/gui/FlashPlayerTest.java index 5735e4c58..88da30590 100644 --- a/test/com/jpexs/decompiler/flash/gui/FlashPlayerTest.java +++ b/test/com/jpexs/decompiler/flash/gui/FlashPlayerTest.java @@ -559,7 +559,7 @@ public class FlashPlayerTest { task.actions = newActions; List output = new ArrayList<>(); - ActionLocalData localData = new ActionLocalData(); + ActionLocalData localData = new ActionLocalData(false); TranslateStack stack = new TranslateStack(""); for (Action a : newActions) { a.translate(localData, stack, output, Graph.SOP_USE_STATIC, ""); From 08751b95242bbb9668c1aff350e77084a53d4882 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sat, 27 Jan 2018 13:38:52 +0100 Subject: [PATCH 30/58] AS2 classes tests reorganised --- ...ses.java => ActionScript2ClassesTest.java} | 29 +++++++------ .../decompiler/flash/ActionScript2Test.java | 41 ++++++++++++++---- libsrc/ffdec_lib/testdata/as2/as2.fla | Bin 1086043 -> 1086035 bytes libsrc/ffdec_lib/testdata/as2/as2.swf | Bin 26782 -> 26862 bytes .../testdata/as2/com/jpexs/MyTest.as | 15 ------- .../as2/com/jpexs/TestCallSetterGetter.as | 18 -------- .../as2/com/jpexs/flash/test/TestLoader.as | 12 +++++ .../test/testcases/TestCallSetterGetter.as | 18 ++++++++ .../test/testcases}/TestMaintainOrder.as | 2 +- .../test/testcases}/TestSetterGetter.as | 2 +- .../test/testcases}/TestVarsMethods.as | 2 +- 11 files changed, 82 insertions(+), 57 deletions(-) rename libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/{ActionScript2TestClasses.java => ActionScript2ClassesTest.java} (86%) delete mode 100644 libsrc/ffdec_lib/testdata/as2/com/jpexs/MyTest.as delete mode 100644 libsrc/ffdec_lib/testdata/as2/com/jpexs/TestCallSetterGetter.as create mode 100644 libsrc/ffdec_lib/testdata/as2/com/jpexs/flash/test/TestLoader.as create mode 100644 libsrc/ffdec_lib/testdata/as2/com/jpexs/flash/test/testcases/TestCallSetterGetter.as rename libsrc/ffdec_lib/testdata/as2/com/jpexs/{ => flash/test/testcases}/TestMaintainOrder.as (91%) rename libsrc/ffdec_lib/testdata/as2/com/jpexs/{ => flash/test/testcases}/TestSetterGetter.as (91%) rename libsrc/ffdec_lib/testdata/as2/com/jpexs/{ => flash/test/testcases}/TestVarsMethods.as (83%) diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2TestClasses.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2ClassesTest.java similarity index 86% rename from libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2TestClasses.java rename to libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2ClassesTest.java index 120eac591..329385913 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2TestClasses.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2ClassesTest.java @@ -30,12 +30,17 @@ import static org.testng.Assert.assertNotNull; import static org.testng.Assert.fail; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.fail; /** * * @author JPEXS */ -public class ActionScript2TestClasses extends ActionScript2TestBase { +public class ActionScript2ClassesTest extends ActionScript2TestBase { + + private final String BASE_TEST_PACKAGE = "com.jpexs.flash.test.testcases"; @BeforeClass public void init() throws IOException, InterruptedException { @@ -47,8 +52,8 @@ public class ActionScript2TestClasses extends ActionScript2TestBase { swf = new SWF(new BufferedInputStream(new FileInputStream("testdata/as2/as2.swf")), false); } - private void compareSrc(String classFullName, String expectedResult) { - DoInitActionTag dia = getClassSource(classFullName); + private void compareSrc(String testClassName, String expectedClassContents) { + DoInitActionTag dia = getClassSource(BASE_TEST_PACKAGE + "." + testClassName); assertNotNull(dia); HighlightedTextWriter writer = new HighlightedTextWriter(new CodeFormatting(), false); try { @@ -57,7 +62,10 @@ public class ActionScript2TestClasses extends ActionScript2TestBase { fail(); } String actualResult = cleanPCode(writer.toString()); - expectedResult = cleanPCode(expectedResult); + String expectedResult = cleanPCode("class " + BASE_TEST_PACKAGE + "." + testClassName + "\r\n" + + "{\r\n" + + expectedClassContents + "\r\n" + + "}"); assertEquals(actualResult, expectedResult); } @@ -79,9 +87,7 @@ public class ActionScript2TestClasses extends ActionScript2TestBase { @Test public void testVarsMethods() { - compareSrc("com.jpexs.TestVarsMethods", "class com.jpexs.TestVarsMethods\r\n" - + "{\r\n" - + "var instVar = 1;\r\n" + compareSrc("TestVarsMethods", "var instVar = 1;\r\n" + "static var statVar = 2;\r\n" + "function TestVarsMethods()\r\n" + "{\r\n" @@ -95,14 +101,12 @@ public class ActionScript2TestClasses extends ActionScript2TestBase { + "{\r\n" + "trace(\"static method\");\r\n" + "}\r\n" - + "}"); + ); } @Test public void testMaintainOrder() { - compareSrc("com.jpexs.TestMaintainOrder", "class com.jpexs.TestMaintainOrder\r\n" - + "{\r\n" - + "var a = 1;\r\n" + compareSrc("TestMaintainOrder", "var a = 1;\r\n" + "static var b = 2;\r\n" + "var c = 3;\r\n" + "static var d = 4;\r\n" @@ -140,7 +144,6 @@ public class ActionScript2TestClasses extends ActionScript2TestBase { + "function _x2()\r\n" + "{\r\n" + "trace(\"after _x1\");\r\n" - + "}\r\n" - + "}"); + + "}\r\n"); } } diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java index 8d5ddab89..b6d66c9c6 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java @@ -91,7 +91,7 @@ public class ActionScript2Test extends ActionScript2TestBase { @Test public void frame24_unicodeTest() { compareSrc(24, "trace(\"unicodeTest\");\r\n" - + "var k = \"\u05d4\u05d9\u05e4\u05d5\u05e4\u05d5\u05d8\u05de\u05d9, \u05d0\u05d5 \u05d0\";\r\n" + + "var k = \"היפופוטמי, או א\";\r\n" + "trace(k);\r\n" ); } @@ -309,13 +309,7 @@ public class ActionScript2Test extends ActionScript2TestBase { + "ship.moveUp(0.2);\r\n" + "enemy.moveRight(230);\r\n" + "enemy.moveLeft(100);\r\n" - + "var mt = new com.jpexs.MyTest();\r\n" - + "mt.test();\r\n" + "var c = new Cox(box1);\r\n" - + "var tg = new com.jpexs.TestSetterGetter();\r\n" - + "var tcg = new com.jpexs.TestCallSetterGetter();\r\n" - + "var tvm = new com.jpexs.TestVarsMethods();\r\n" - + "var tmo = new com.jpexs.TestMaintainOrder();\r\n" ); } @@ -672,7 +666,7 @@ public class ActionScript2Test extends ActionScript2TestBase { @Test public void frame55_pushTest() { compareSrc(55, "trace(\"pushTest\");\r\n" - + "53;" + + "53;\r\n" ); } @@ -810,6 +804,28 @@ public class ActionScript2Test extends ActionScript2TestBase { ); } + @Test + public void frame60_numbersTest() { + compareSrc(60, "trace(\"numbersTest\");\r\n" + + "var x = null;\r\n" + + "trace(\"null:\" + x);\r\n" + + "x = true;\r\n" + + "trace(\"true:\" + x);\r\n" + + "x = false;\r\n" + + "trace(\"false:\" + x);\r\n" + + "x = 1;\r\n" + + "trace(\"1:\" + x);\r\n" + + "x = 2147483647;\r\n" + + "trace(\"0x7fffffff:\" + x);\r\n" + + "x = 2147483648;\r\n" + + "trace(\"0x80000000:\" + x);\r\n" + + "x = -2147483648;\r\n" + + "trace(\"-0x80000000:\" + x);\r\n" + + "x = -2147483649;\r\n" + + "trace(\"-0x80000001:\" + x);\r\n" + ); + } + @Test public void frame61_switchDefaultTest() { compareSrc(61, "trace(\"switchDefaultTest\");\r\n" @@ -850,6 +866,7 @@ public class ActionScript2Test extends ActionScript2TestBase { ); } + @Test public void frame63_functionVariablesTest() { compareSrc(63, "function outfunc()\r\n" + "{\r\n" @@ -891,4 +908,12 @@ public class ActionScript2Test extends ActionScript2TestBase { + "trace(\"functionInnerParametersTest\");\r\n" ); } + + @Test + public void frame65_loadClassesTest() { + compareSrc(65, "trace(\"loadClassesTest\");\r\n" + + "var tst = new com.jpexs.flash.test.TestLoader();\r\n" + + "tst.includeTests();\r\n" + ); + } } diff --git a/libsrc/ffdec_lib/testdata/as2/as2.fla b/libsrc/ffdec_lib/testdata/as2/as2.fla index 0bfd24c0fe50d329fe8fb0ac67aeaeadd1dc0ad1..c0a1918eff39033cad922e6a946f3205d71fcfe8 100644 GIT binary patch delta 17732 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 fY+qP{x`M>q=lf94TnmL-aX69hl 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 delta 24934 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 cJ3>Gb0KHQ<^!~@r Date: Sat, 27 Jan 2018 17:59:03 +0100 Subject: [PATCH 31/58] AS1/2 break statement decompilation in for..in loops fixed --- CHANGELOG.md | 1 + .../decompiler/flash/action/ActionGraph.java | 9 +- .../src/com/jpexs/decompiler/graph/Graph.java | 76 +++++++----- .../jpexs/decompiler/graph/GraphSource.java | 3 +- .../decompiler/flash/ActionScript2Test.java | 110 ++++++++++++++++++ libsrc/ffdec_lib/testdata/as2/as2.fla | Bin 1086035 -> 1086307 bytes libsrc/ffdec_lib/testdata/as2/as2.swf | Bin 26862 -> 27166 bytes .../as2/com/jpexs/flash/test/TestLoader.as | 12 +- 8 files changed, 173 insertions(+), 38 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0e1698ea8..a903a3c37 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ All notable changes to this project will be documented in this file. ### Fixed - Accessing font list on demand - prevents loading X11 on systems without UI - Better AS2 class detection +- AS1/2 break statement decompilation in for..in loops - AS2 direct editation - not generating Pop in class header ifs ## [11.0.0] - 2018-01-17 diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java index ce146e4f5..07436c060 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java @@ -456,15 +456,15 @@ public class ActionGraph extends Graph { @Override protected int checkIp(int ip) { int oldIp = ip; - //return in for..in + //return/break in for..in GraphSourceItem action = code.get(ip); if ((action instanceof ActionPush) && (((ActionPush) action).values.size() == 1) && (((ActionPush) action).values.get(0) == Null.INSTANCE)) { - if (ip + 4 < code.size()) { + if (ip + 3 <= code.size()) { if ((code.get(ip + 1) instanceof ActionEquals) || (code.get(ip + 1) instanceof ActionEquals2)) { if (code.get(ip + 2) instanceof ActionNot) { if (code.get(ip + 3) instanceof ActionIf) { ActionIf aif = (ActionIf) code.get(ip + 3); - if (code.adr2pos(code.pos2adr(ip + 4) + aif.getJumpOffset()) == ip) { + if (code.adr2pos(code.pos2adr(ip + 3) + 5 /*IF numbytes*/ + aif.getJumpOffset()) == ip) { ip += 4; } } @@ -473,6 +473,9 @@ public class ActionGraph extends Graph { } } if (oldIp != ip) { + if (ip == code.size()) { //no next checkIp call since its after code size + return ip; + } return checkIp(ip); } return ip; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java index 0347d2c0c..a28f7b585 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java @@ -75,6 +75,11 @@ public class Graph { public static final int SOP_REMOVE_STATIC = 2; + private boolean debugPrintAllParts = false; + private boolean debugPrintLoopList = false; + private boolean debugGetLoops = false; + private boolean debugPrintGraph = false; + /** * Identify loop exits * @@ -595,10 +600,30 @@ public class Graph { } public List translate(BaseLocalData localData, int staticOperation, String path) throws InterruptedException { + Set allParts = new HashSet<>(); for (GraphPart head : heads) { populateParts(head, allParts); } + if (debugPrintAllParts) { + System.err.println("parts:"); + for (GraphPart p : allParts) { + System.err.print(p); + if (!p.nextParts.isEmpty()) { + System.err.print(", next: "); + } + boolean first = true; + for (GraphPart n : p.nextParts) { + if (!first) { + System.err.print(","); + } + System.err.print(n); + first = false; + } + System.err.println(""); + } + System.err.println("/parts"); + } TranslateStack stack = new TranslateStack(path); List loops = new ArrayList<>(); @@ -627,13 +652,14 @@ public class Graph { loops = loops2; } - /* - System.err.println(""); - for (Loop el : loops) { - System.err.println(el); - } - System.err.println(""); - */ + if (debugPrintLoopList) { + System.err.println(""); + for (Loop el : loops) { + System.err.println(el); + } + System.err.println(""); + } + //TODO: Make getPrecontinues faster getPrecontinues(path, localData, null, heads.get(0), allParts, loops, null); @@ -1102,7 +1128,6 @@ public class Graph { } private void markLevels(String path, BaseLocalData localData, GraphPart part, Set allParts, List loops, List stopPart, int level, Set visited, int recursionLevel) throws InterruptedException { - boolean debugMode = false; if (stopPart == null) { stopPart = new ArrayList<>(); } @@ -1110,9 +1135,6 @@ public class Graph { throw new RuntimeException(path + ": markLevels max recursion level reached"); } - if (debugMode) { - System.err.println("markLevels " + part); - } if (stopPart.contains(part)) { return; } @@ -1121,9 +1143,6 @@ public class Graph { return; } if (el.phase != 1) { - if (debugMode) { - //System.err.println("ignoring "+el); - } continue; } if (el.loopContinue == part) { @@ -1252,7 +1271,6 @@ public class Graph { } private void getLoops(BaseLocalData localData, GraphPart part, List loops, List stopPart, boolean first, int level, List visited) throws InterruptedException { - boolean debugMode = false; if (part == null) { return; @@ -1266,7 +1284,7 @@ public class Graph { visited.add(part); } - if (debugMode) { + if (debugGetLoops) { System.err.println("getloops: " + part); } //List loopContinues = getLoopsContinues(loops); @@ -1294,7 +1312,7 @@ public class Graph { loops2.remove(lastP1); if (!part.leadsTo(localData, this, code, lastP1.loopContinue, loops2)) { if (lastP1.breakCandidatesLocked == 0) { - if (debugMode) { + if (debugGetLoops) { System.err.println("added breakCandidate " + part + " to " + lastP1); } @@ -1424,6 +1442,7 @@ public class Graph { } } } + // if (lev1 <= lev2) { found = cand2; } else { @@ -1542,9 +1561,8 @@ public class Graph { ret = new ArrayList<>(); } //try { - boolean debugMode = false; - if (debugMode) { + if (debugPrintGraph) { System.err.println("PART " + part + " nextsize:" + part.nextParts.size()); } @@ -1584,19 +1602,19 @@ public class Graph { } } - if (debugMode) { + if (debugPrintGraph) { System.err.println("loopsize:" + loops.size()); } for (int l = loops.size() - 1; l >= 0; l--) { Loop el = loops.get(l); if (el == currentLoop) { - if (debugMode) { + if (debugPrintGraph) { System.err.println("ignoring current loop " + el); } continue; } if (el.phase != 1) { - if (debugMode) { + if (debugPrintGraph) { System.err.println("ignoring loop " + el); } continue; @@ -1605,7 +1623,7 @@ public class Graph { if (currentLoop != null) { currentLoop.phase = 0; } - if (debugMode) { + if (debugPrintGraph) { System.err.println("Adding break"); } ret.add(new BreakItem(null, localData.lineStartInstruction, el.id)); @@ -1615,7 +1633,7 @@ public class Graph { if (currentLoop != null) { currentLoop.phase = 0; } - if (debugMode) { + if (debugPrintGraph) { System.err.println("Adding precontinue"); } ret.add(new ContinueItem(null, localData.lineStartInstruction, el.id)); @@ -1625,7 +1643,7 @@ public class Graph { if (currentLoop != null) { currentLoop.phase = 0; } - if (debugMode) { + if (debugPrintGraph) { System.err.println("Adding continue"); } ret.add(new ContinueItem(null, localData.lineStartInstruction, el.id)); @@ -1637,7 +1655,7 @@ public class Graph { if (currentLoop != null) { currentLoop.phase = 0; } - if (debugMode) { + if (debugPrintGraph) { System.err.println("Stopped on part " + part); } return ret; @@ -2275,6 +2293,10 @@ public class Graph { ret.path = path; GraphPart part = ret; while (ip < code.size()) { + ip = checkIp(ip); + if (ip >= code.size()) { + break; + } if (visited2[ip] || ((ip != startip) && (refs.get(ip).size() > 1))) { part.end = lastIp; GraphPart found = null; @@ -2299,8 +2321,6 @@ public class Graph { part = gp; } } - - ip = checkIp(ip); lastIp = ip; GraphSourceItem ins = code.get(ip); if (ins.isIgnored()) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphSource.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphSource.java index b9f91d020..3bc7e66e3 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphSource.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/GraphSource.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.graph; import com.jpexs.decompiler.flash.BaseLocalData; diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java index b6d66c9c6..ec1637b32 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java @@ -916,4 +916,114 @@ public class ActionScript2Test extends ActionScript2TestBase { + "tst.includeTests();\r\n" ); } + + @Test + public void frame66_forInBreakTest() { + compareSrc(66, "function testFunc1()\r\n" + + "{\r\n" + + "for(var _loc1_ in obj)\r\n" + + "{\r\n" + + "trace(_loc1_);\r\n" + + "}\r\n" + + "}\r\n" + + "function testFunc2()\r\n" + + "{\r\n" + + "for(var _loc1_ in obj)\r\n" + + "{\r\n" + + "if(_loc1_ == \"b\")\r\n" + + "{\r\n" + + "trace(\"found\");\r\n" + + "break;\r\n" + + "}\r\n" + + "}\r\n" + + "}\r\n" + + "function testFunc3()\r\n" + + "{\r\n" + + "for(var _loc1_ in obj)\r\n" + + "{\r\n" + + "if(_loc1_ == \"b\")\r\n" + + "{\r\n" + + "trace(\"hi\");\r\n" + + "break;\r\n" + + "}\r\n" + + "}\r\n" + + "trace(\"after\");\r\n" + + "}\r\n" + + "function testFunc4()\r\n" + + "{\r\n" + + "for(var _loc1_ in obj)\r\n" + + "{\r\n" + + "if(_loc1_ == \"b\")\r\n" + + "{\r\n" + + "trace(\"hi\");\r\n" + + "}\r\n" + + "else if(_loc1_ == \"c\")\r\n" + + "{\r\n" + + "trace(\"hello\");\r\n" + + "}\r\n" + + "else\r\n" + + "{\r\n" + + "trace(\"hohoho\");\r\n" + + "continue;\r\n" + + "}\r\n" + + "break;\r\n" + + "}\r\n" + + "trace(\"after\");\r\n" + + "}\r\n" + + "function testFunc5()\r\n" + + "{\r\n" + + "var _loc1_ = {key1:1,key2:2,key3:3};\r\n" + + "for(var _loc3_ in obj)\r\n" + + "{\r\n" + + "if(_loc3_ == \"a\")\r\n" + + "{\r\n" + + "trace(\"loop1_break\");\r\n" + + "break;\r\n" + + "}\r\n" + + "if(_loc3_ == \"b\")\r\n" + + "{\r\n" + + "trace(\"hello\");\r\n" + + "for(var _loc2_ in _loc1_)\r\n" + + "{\r\n" + + "if(_loc2_ == \"key1\")\r\n" + + "{\r\n" + + "trace(\"loop2_break\");\r\n" + + "break;\r\n" + + "}\r\n" + + "trace(\"loop2_inside\");\r\n" + + "}\r\n" + + "trace(\"after_loop2\");\r\n" + + "}\r\n" + + "trace(\"loop1_inside\");\r\n" + + "}\r\n" + + "trace(\"after_loop1\");\r\n" + + "}\r\n" + + "function testFunc6()\r\n" + + "{\r\n" + + "var _loc1_ = {key1:1,key2:2,key3:3};\r\n" + + "for(var _loc3_ in obj)\r\n" + + "{\r\n" + + "if(_loc3_ == \"a\")\r\n" + + "{\r\n" + + "trace(\"loop1_break\");\r\n" + + "break;\r\n" + + "}\r\n" + + "trace(\"hello\");\r\n" + + "for(var _loc2_ in _loc1_)\r\n" + + "{\r\n" + + "if(_loc2_ == \"key1\")\r\n" + + "{\r\n" + + "trace(\"loop2_break\");\r\n" + + "break;\r\n" + + "}\r\n" + + "trace(\"loop2_inside\");\r\n" + + "}\r\n" + + "trace(\"after_loop2\");\r\n" + + "}\r\n" + + "trace(\"after_loop1\");\r\n" + + "}\r\n" + + "trace(\"forInBreakTest\");\r\n" + + "var obj = {a:5,b:6,c:7};\r\n" + ); + } } diff --git a/libsrc/ffdec_lib/testdata/as2/as2.fla b/libsrc/ffdec_lib/testdata/as2/as2.fla index c0a1918eff39033cad922e6a946f3205d71fcfe8..623e55c811c7ff96a2c7ef0ffd8a824b85fb0e82 100644 GIT binary patch delta 12797 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 delta 12500 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 diff --git a/libsrc/ffdec_lib/testdata/as2/as2.swf b/libsrc/ffdec_lib/testdata/as2/as2.swf index 043554b4acc8cb9d56a9e0fbfe6c2680d2a8cfed..3c6b3afbbecd7862efcd8cb2e8b105493a7c725d 100644 GIT binary patch delta 26874 zcmY&-T}v*y0vuOGZh$ey!~B`Pz^W1TmF!S^iCPG z07N4ueTpgyOFA1!triwpjz|h;Gfk4pE|Vf_ISFjNyX7jtP^H<}4lfUzqvi;jt z%ASzhjia9K=M+LdGS>H9T*PoRKDJJ3R%#p)XA)~`5Q>s>AxxJ`@7|f+2{(cArH17; zHJCq3tGb$#BdBOFNl%88o0r=FZY+^x&UwyzMLUvi^|TjT#?cW)epEH#$Df?Iryyc0x4$>4!RM z?Itc(O?p#u{X^jD;XIrxK4-bl_TAT*#rS^fMgIdzJa`{*1%_a5BW$sk9AfO557i>gVN1f*07^WaC zx{;dKYl^O~@6W%wBy{KSU}_7!t6k6+a}DW#UABm3UD)XbJ(W)b(p;S0bW(937Fw1| z+J)FJcgIJ+cepW9?)#tC^;61mc=BqZkmYbmTUlBLH(8IVj;nsB@p68FWMhMS^FLf1 zpRi%7leenF?gbjqz_0Sd<|(&(w|c4Z!5vILY`?R0x zDR+7Mr@T~bZ&fbVB+xxDm9CEK**yqDt78(b6aCDV%8WLPzd)M1B@%HuI)ty2p0R*D`QjaO{X@>A}!) zP%%C4a`<=pu_$1e{`|3c8p?2$-4pv>VH-1v8JH zJKD^93FI#gytMuJoNZ!-W&_^W^&D-!yk9(H7p+4228G&SPLyiDOPX#VYQ+-PC|SL~ zwUcM5DtX_3U#DnwHu)w_(9-1?=t;fsk1zNqKIS%B>lv6agr6|j-*3L_KJN(cjQvQ# za5qpll!=HV1X?3M@&*UL{D`OWy8gI-F9&|@@&VoqI!G>ve{?gse~VQ3d2j|GUq?W! zufZ)WMIaMSZvV#F^DC4Ywo2EGKgtXy_B?5bVaJ(~a@2i%hVg&nWLK*>->pM8C z-?e|fd0bpE%v``Ut4L!7j>x04Fx}6N4hhNHvRG3 zx3mZ`q2s{u(bLo2`uLVIVIhFl{eroJjxNq)vBMs9dWhRNJ-1*H^3{v;wm=8l(HpM7q!+;i-ZaEZUO36 z{x_eyWxd&%Je5-(&|HsFdmQ$PC;6|v?cSt)zbx?YBtFhC^K*B*NS=3WInTD~YEl&4 z1yJW77rhwKtMKL_+C6utx;WDjQ`@XSC$_bdR!E@_9M_d5R?RQDD}|D{jjx^Q$Vbn9 znebX=R|bD;V>no!f-Jl_>NyGPQUMDv-Sv%VDi3%Pom6l%g(f5#%Bj1ATnIZIGvicO z+vKMcQKv_}xuX;XySz(BMvW_4XuI2LFFlz!$B_3O3qnmBpX@( z$5`vEZl-kKcJ)@>XvDGJWN{y7L7kPk?sQi2)}oip#DUjqTRkB)p*5hB0~Fu$hD{zy zz#Md~{T96kk2ERTJLFmAE?J0T7vrVwLdcK{J28((hTyyUcW_6JuwIBWG>$G0mQ9DX zEU;ymBQU#YI7Oq8eBvhiN)wY2(&$7R2JgiX+!ycEKIcAW9hi?-ycZFhm3QNCv)oq! z?uAuuyzzwfcHD6VKAhH~3&69hTtaL`?yBA;ApZ7OBhxT3eP#<@xK($Wfv8i!)Z(`< zn~EV0fAICJ7N;AkSiy#k`x~XAnY=2aXa5k@(Gge|Ya{wqCtEh}+Kby-wY4PbL62qe z1X1N+guI8)=lxRZe4>Dr7XZ*1*A)*vUwspuA`aA_6yydLk2-u=0f*&j=ZCtcH=}4J z_1F9=1DQT8MVW?1@McFPu;DfV-Bg4Fbtjjc_$zb5)5J|DAlJdj9#^c|ngQ%xM_{5m z%?KPYD=@%3dpPTW8L*9q=%ubwECw^4)yCU1KsJxMxr%?P-l-h6~uj@AiK!ot^ED0PuADR-&K)(Gpy+#Tq*~J~st9{mS zRP&?79L(LFH^a^FqUDlls@?C9dRfT8Q^c1CE8tkAX!XrYjUnV)NdLBG&d=|d=meO- zf-ckLub-dlfZkS@phpTAUX z7m3g&ZUV+c%*IGU<7lM6NMBosHjaaSueROgPyI+&eGatE-wBpAyTg0x6lSg~PH$|c z6Vlv1s^t3xX^}RK+-|&_RSNRHB`Tovu;!su-f?E zC2+X~ z>T7d=u|b=epxBzQ^TeA!yvP`~G#6@6T*Nfp_gpwY=T2&Y!87f!TAHAT8h6xU#{6BL zpy<`oL3Ag*x^FkL_v=yxnn1VGHtH}(f=NfPJc~figHPN9y^@we$sP5yh1$61`60K= zi}zZ!(5JVG{m4ZBlH3QTCa%+Ws@rJQ2#e!=Ygy^!F>w4DxF5h5J``u{7jjR1}FthG$v}{rChY81C zXfjNDm7+M9;~FHb-PKv582AtW>Wdsm^x7ewDjgllyU8lEl~9%$q_AOj^7&+Pb@?B0B`=^h87be_H zE9#ao_s0`_xzlia3sAIIYgRfOEs0wswtv#bk+V>hzpYMUvROuw6R7m_pj>~f%5JoG zu1GtzWEogDSX`Vbv9R=*tkHP7eBe0;ZdT_oQv82%y1Ls$tW=AgG+QYcG`AifIIbkL zv^}xeT?}f}KW)Y2bbehAB9sPNDry~KoSbN4WM(5})uM9dm@nu$rSj^yHGXIETu~}1 za7f{a3!^mNc3los@(;%>sp96J2rY|NqN@Kn_3byJYoIPsOjv@Ean&f4zIgpK@OUxh zrylJIIWtiLTlRV>eJ=Y*J@Vq^1FT3;wS@Ibw^W+7Da~0Fo^%~)oEg%=!eN03k!ys8 zg$#=Y(`fL-m9o8kTTj+wS!I+zC+ERljPG~nHI+6-CtGV`e1kcfr2MDiPdRD)cm^!X zZ%>Rwr?GYUWIeJ>28Z|W9IeaWJ#6fc#pMk`mJg`!QytcGn<)XSWtg6)0Z#813h|EPR&+!Ccip~~4r@7A z15LvLg*)fj+R%^8vXnoX%@T37Of;n24{=I*c{JzZga1nA`JGr?fSb|0xBldmV zXlsl=@~Elrc}o|t%;lBysPFSrAg$t?_muv+UY3Zi#icgj*C2G7Y`#dM$^MO#{&hrz z{DqT1yi((C1jm}$*J$C#~6TxfI2PwnJ}1k$|A*|4r1zm|=LUurq|5qvJEsd^?G zYfbIOO^kFLCepb#2J%+6%#l^%iB%E2{O>k@$h?e{d!vtacXHLAzTZ&|-TjIFytKQ> zEDvwu5?VKcU*Ti{KJEsaIy^%J{U1Bq2hCra&rAP(PiM&IqBPR*VJk1p6?odK{?|pZ zu?nL(D|B_%4kG5(`gq9C|#~x9DH_%mNh0C6$#Q9 z5_D&(;q-BO*~WyZ-VL)+o++Ypu`40_EBl%Z+|>)Yy*jv9nwi~=IS%T^hTfXQ!RYC4 zQ2gy*%ez)0ve-tf0hXtJb%v&^d!WkDq!!7Qam}^VIaA-1Bom#=~nYbTtaK zYF5N6_6nW=tjC{18o0;gwdBJ2y{Wj@b4YR>61+B(lfAJ4?qQ{?i#YZT-+>ap^VHFONXkDKltl>@MQGzEg#)Y8o@2GKSL}6OQx8)_2N2HtgfPcL=PfEB>%g$6 zP$+OfPh{z=ySLmnRS-s~OF-iAXJ=O@Ijs*Lt5mfa+p2>=CH?%+$~R69?uKPZoN0mGQE@*3dPey z_1k+Tj6Vk6{ghtsTz!e~Th90mF=o5c#Y(8;j8ru8SzBCTpA8|C6!2>aVHfF9?(KLw z1kB z|27{>^J7CgqTf(p`A=C?jymCfyPu{5`njG0%S#QcYuB&6i7o4`Gy42fSYo1d@@f7~N^Cky;&f+D5;l}sI7Kg9SArgzKQuXAia9G%~D-}(mbrn$T)))Kh zaJR##nyAf22_eR_Z?*W~Zd&oD+z0LCUwi(jHmjeEweB_S@AtR4lB=ItFoH}y&9{E` z2X6)4r7Rx`p(C8ps>h4eV{6P2ueLCU;X(CbSZ<(+x17>CSbUCq2buN}x?kd(h2!gQc}G)BxjWV)|2 zz%TPI+n>LC;e@|vu6)7Ax_f3@LFlgjn$6ibA?q1xHX5z?PKU&QF(L>kUs3H{Prs+i zV(AxmSeU8;G>l&xq#1ZnmXK2x7UvMKu)33xCg+0Seqbvw+iJbUR(C@Dxax_W_q)np zCsA-8a)&g5eGKHtU^tP(iC^9!jIio~c-$!BPWG(~UMBti!O%BY_35KwnGuxvgAw;J z^S!UR)xrLEm0=or1Tg>scuwK(L9H)Gf9qSF(i63NPnzUh^QY~I5TsdfxUlLWy$5Ho zAAGPGg-^Ub+&S(t+`_{;uwZ$&amZGYqYyG7_N9+!_Nsf3vG#C8{PcmNy8PbKwV<#3F`T~NHx~cHgv}3^&vN*i#GX64jcK3Jj~F8ljdJGi;#6v z912YTb0sRwO=#{lyTEJ|dFGF4FQyzSyCWK1iFGD}>Lk^fSLr|aBm0^VgX~jzMp?sp zL9WiEkyvt5Co;g23p&NMme=bV@vq=p65h$TRuR*oIs#+zguu%nR)6nAs?$h}_h(1J zFkjyS=a1({G?L*fE$;V0LiT@Gt$hd?=w$L67n2Kk)nF#9Lc^i!9;uB_+7Id#qW1n-`0`1QF&HhNPsp0q0QC7@4%$ zzM0bSYT%NUEMoE`PHN2^B&(Rfeem%_$>dZw3r2zULU7uP)V-|txRzN4Zri}2{CORo zwY`rat@MJMCw*C~ZIKHo>r|k|!ymtMt8_w1^dDf)q zwYN4QCtQ?i_tQPQk0FcFbb^D?);n z=Q!peA)9yr-s)*Z7GjrLt4ep&o)m-lS3MPBjWy8^-5ENtuj@K?DIxut`O)BTHog*Q zMnhmpNz0y&7zYVo4iD{E(%3_lx$~D z>qE@ECZp}P4e~Nm=teR@<%W;YiK_bFbO&w^NGk6ww$9RBKdLtgKM9c*#Rbe(YVc*Q z4vo$_ez4^Txxk`wInlO;kl}xiDILV&yHh}Dj{G5pwx4-ozC z!T?8r`ED9m==-0C#||B6ncg8xSj5TfNCIg6o^mfecTSXS$*m$=u(>pfUix2lMy#if zqBILnD)vw~8QhjyX$>5+o;EdvK$3Ec<^ao*ET_qh9cJ ziv)v=X=Yhjv;k)Mt&T+gsyAj$ZsdeUg3!z4wbE05J)%$!vkS&$hBJ?)E&?Z0PU*To zzrp(MFMCkC2Wi;3trx^E*um$OO#}k-?gGL22`_!ntM7ApccY&Vegf%s-$Fjd!f9!~a_1n6+A}CWY+f zpBSEHzoh;pL}>7qkbn6VkEgyJksqX+2DrW7tU>7{8U5y_O=f)VYFmv4gbZOP>!2NI zHT(`5N}VWBe^)z4X~s@`z&7^Ps@Cvau9`eGNCX{A8dHur*5E0l^_1^SdAHED#?G$M zVht8nUSgc?yFWgFR{Cmnh+of9sPYrz$5`w>$fWME@zqwRqit(r+}8Yt`(Gb-;=8hR z&v$>p8m64@W*XuM>SwG2gW`i5WKp!I3MKGcCzxY%n!j%Q!TD~lw3iK`T66aj&VDKk zK}&d^gH@&X{GIQ&tNpx@U;j{8aXl}%g2Dq?*UIY&?XMR>;r)nlO&^oIxuP!oodvMWS_?x8G%!Hk@1y0D6U+=kE-lZUBi|{&|vwnsU zG1^^3)SN4&a(fYKIzsYEE$McbS;jm=%0tFCRCK4wH$&NOK!oL2@s^sK+uLFr`C_zn z9#qcKuzhQ_d4Y}waCq|ERIjwYExxB$3AnvyERKcV`ubhFj9`mHweYIm?m=JycFzto zDd3yvZQKatNJ^M=7V*kTeT{w{oD-)P5;VUxQ88G$UvGu=#dy3UIGDd)MOTTG)ypE- z6b3vYTk&e0^#u{B9Rj(#+`p8)U%j5_u!Gl%^2=S&hFA^&9SII_uzWVe5l56%m)n@x zd>Pk2d=R^Lqal^*>l~`SfroJ?Q1cEe*597O>$CR3gjcPVTc@Y&CUZ^L#DByql_H+* z@EZ+ss&t>r&6Tk6EP{7m?z*aq)FJQpa;)f&>X+NL^?V*2=2|OK7<=pLqo2qPvpC*v zIwH}N8HTw7H44gAC_cMAhf4%?a1i_`2bZq~>*_SvRO4v%O-EnpU-!K?Gccw5=QGU% zCM0}2ukl)G7A-{B-}vx*?c^G{w%~E5v7H7_X;c(_D&DxxSItg+*d9hqwq*fqPfEaU~05q)E&X0CN zj>q0g)N79A1I`R8!T~F@hxwFs%!`z3{(>#i)4@LbPJh)vGy3>pNB7YfL=qdhAKmlR zsvY@&YQPW9o1}@uY7)uHtdc_bx~P+#iPe7%`@Y%5Ou4H_PQ}^2W!pb^3kvMUeAm%k zOKd&6G2>%;H!pI5Y1SUVP43YW1Lv#|eH<8HM)5!u{|CPS!ct72zC&ENiY*@d>v8c2ar@Z{sIbuO%*Gtl^`%?Iu5#;%k5fKSYbp#{O{0 zuioMp38eg5gKx~WXf_!*xDMa&ZD{Zj;P7rOo)Qwa@8N^gR)>n7mYZWGqe9tZvn!E- zKn|FYOd?->ex@BQTwTG>a9_AydwqrHI{EllSW5QAzDn)FU)EOY`G+`ki@~2=i}~l5 zqmJ`lRy|rIq-Cq6taiq=!-Q(|yS#X@UI*2-A%8LEG%eYfve`d1JL_?kk5gQt(EUaH zN#b4OXFZjn`ESVWe7m(z*Atxxnkr&}x{2OComoYyP|UJMn&J4;cySM9T2o9_smm_E zfu~PlMUZv(l9(@_vtdzL;B8Vgo$5oWG8Ki4GY>2T}42R~Y2yR)8=1y-7et3^u6P!dBdOT@E%wfd;&>LL3t)Rt5L&gB%I&^tP1_((#qP4JJ2#VEQrAz=J~(A^gZl z7v4Ye!YznuTU z<2KU+;L`N}U;V#3(9~>@WJnf@VwrQwhwLdl{~Ly6(tVTo!>AkBx(_R3=oC!B&>@^Q zk&5~!uve94e}acr1z~(=kfbafk#ty-m3e{{>v+IUfn*e65oA$^_v!@1$AgwT?|0-4 zP%rv8TeH-c%WmjiLEjp&K^Csfprjb}?a2FhrxYlPQqRzU@?N-;++TL!GKO_w@?npR z%u4?M5rr^vqN6u5FX8Kj+&WO{BmAWZ^1fTvVL>YL73~t>=c+5(JTB+rJw-~WMDGGe zYk@frsu%4wl=k(4rUB^rL}eLyMIIU3giSv~KoKPD9VGjtus%-Ueb!JPfBb zUKVskjb}2{0KO0M*=G2F6WHE|GfatQOAY8vz#1?==BFO z5uUYxDitIHGLVfRcyUH&eX}B(&5@!H?u7fWLccwfOPr7>t`%p+GABn_nFe?%G5{X9 zOy1-O_9L_y61^iil8Ik1i6cn{4 z_`hZ_3%$Sw2H_R#Uv>z}%}|hUE2`#dQ5n+Q38uMH^~^l@tN{n?6xcWX(OyIn{0U@v zQfP9&s1m_y0KY8PUV7{$Dzf=wmQ*TB6C`Y-Ji_g%h z+{?#Ne5@M0A-Q$j3TBwAZ>m zxT|FtHNEaM5>?`z$UF`6h&FxFKlCM}Y72|LXTvQpf4PYwMeBv^F8*repmzA*5MqxC zy+-6s{x7;T+4;L|D4I2Z^k2AB*qXaCQkE(A5w=pAkiYz9x9-y8u7vj<_&S?_gbQ2& z(W+6%cu1Es;i)5eDF&YLAtk8zK$Sv^%rN4wo`EdJCP3Oqj-m>16xbhB4SgBXtx&ZPnURzr z_^~C@u$^+fP~(g*d+RO8s0rYPGfM)Y>L(n9W-_+=1-APC9nH6b&-IiQnA@VJqcy|~pUAg#uvYY^vTl8Wf{Y2mCssBhB z5IEjpq~MGpn$HxlmhhQ=-Ha&8BCW6TQK|M(5$vMQH%w7t`d5bIeJ0U(Ch>A#_<15m z^g7*CLVPft;BqX*b6=$LK^+lb%_KgEQD(J73a_$~7@HU)O%-45BxdS~%Bte%K}g{o z1;2752RT|8X$pWA)OJTyv02Tcpn1CfN)!vbklzYVPTYv8VlRo922lSk@kXPF5mls* z6p0^?CYRHZzJcPAZuG`$*eAP1J4$Oqd-?BWTO`educ)I(-~qp2K|-4K50c;iVfw@o zKnABIvL8mV`wYs9HfI^B$AT+P49hW067yl)#ly5k`Um(S#ZDsdH20%;TiXy)q#HngRd>BWVp;7kNS&0i#$*}mM zF~SJ+(8SVqrOCm0np(k6ED}oyX6H~x#nJZFAYU+pIQ>8wO0j2kMclN7ko)&Z^s~uP zg>{GeAYeHhPiHK8@}0*!(hKQ+I4~ z!5}OQv6;ch8mF$mk%=+t#b`nQ9X!mfL=`nze-11mzLs|&%?OcvXUj6SAAa7Yec z@$EObuf51O7Y9Y;Sp+9E%4r{&Up%s?dPfx?Yyg1_bY*ggE{?Q}k6!1%K9cQfzAL%g ztHk(U2`RhN|GFBv*7~y^xkrSRvg~C=QYWl_{PYysw zJ!J6bbg&oi7t)(=6cU*4kY$#Gb=?S?b`=NG)&{mCC#Qm{;AQ^W{C7KRv2d3A#38U5 z)Rph#Nm0>trhXvtR9SlE}tx@5VX8f0Lg|! zPFv)lB63y|JgJPuZiMy6gVu>23qa4VfUkGgMLw~KjES+W7I5c{?&Qg1|J<;WLbXC-BQ{DB+U1C=D+G1b{FjBy3&C>|QU9wVSc+zB z=CeFm~QZpU5F;$Ds3SP`Et1xF?dBnS-x4kpzeCP^89jWwf9DP3ftVP1i31AWIOZW}?kAf|GUhJ+diDq-Q3rNSdckv#UX z2=!TmtqI1a@W^EmJ%Xje7olQ_P3)pfszz;#8Y(x7QyIn^IIAO*^crNATws67=0T-%OTBdrhE z3};;jpr;Tdr0ECjkIy&5+nw?GF_1t*s5Y@6yC`WA)$(QUI2A+|2$euuVM?ZB2oc)H zaVd~4XA2B#?Duax5mOYfsuor{QNilF==fx~=p9>ds`b7sk|LEP_fDa{xW->5$6Gyo z*DYMo@zft_lfnjJmqOh-PKQh#3%orgz2z14O z9+vQ7Ig|?vibj>uzsjC4J|7=N{~5LWD;J)=@6GhceBDbzEPZX`BdH%J;J32TByqVM zfKxTQF@oKuhTTkh70&9st#;|z>wWpP1-@MwG5)d^zI|W&x*r4szVf?gb@vuKlt%&0 z&F1-Q;mJy-5SgAL)w*)w8&7p;FzU+jOJo}iF_)cu6`C(ptlvURPU&hbj3vmebQK}+ zw2uvRKXVze0cABzDinJM`^d?E-U(U5^)%cu;{!ia2pgiTmy>Q>{= z_UktbD|p}dkD~0dOErVDuVT@U@6cjV`lUwPB7<)%qz`+Q^lbUUt>=(#>a7j&=^}$uKcQd=5P%S}a+rz3;+< zl4^|7C>*tUWA+$PI>v%Ul|1l-B;UFJhtWcV5|gBDWk&WY~BfYvqfLa#6H-;ggC#iLIIc4jX5{-y#hq1 z{Q)mFh(qGiE@lX3>WTTfaWK!BI}cOe0l#VrQ|FO&C=dNcd-ML_K>>dOGl#Vu#kbaw z)g^;(S#&7>?3u96Xi^g!Qou>`8FAsrfqZ*w z=LvP&wB56#H1m6xt3ci|Vf#mCHA(u|i&0JlW*xVBbjs+NVS|k1QuLV?&_}j8;d@3I zR`V>_u_4%~=%`OtAhh{ry|X8?!iN*T@clkIQ?Vfl-Qy9%(IegJL@VRQaJk%xveX@d zX@U1FWPv>WGK4G|num;n7r(aoSKM4>2G~puB7HpjQ-<{y29Shie8b5paAzN(t*xuA zrm9%pw8GT`PHwp5610j-+)?(J%6`N_1<@@llYZXPcp!v_o(Lp4Sug3|Dw{_|;wt5R z#JESL;t&~Cxm00xU0ZG~ysY$1C_Jnybt*6tXa3!_R=p`@JfuJ|lHPO-YF(e;7S0Gen1=-^xR1jHp5Ry3_O{iRbV za-$Txyu^#|(g@JH8=l6J{Car!=+i6H;frZx}@$4H{pohZCoqr zI-TkxDW__urYa@ZLkm5!GhUnqZ)cImCFYNDQ=1FsX;V~M@#zv1_WS%_VU4TN+$K~) zZYRI;^Vf1Df2|_!xxD;_SS-0UOVhG-_`!I&0W9?&-x>7nF5fC<8flZdOVc;Kt8N@V zVAjb{Cbma6H|YM}022R_YmnuD2JN`|Slrs0zdCfHb>#0hH(PGIS`2W@u=epSy*1aL z(|dHHss(Qz-m7ocb{w&Pj0@cvns*{=*=Bgo5g;5muX>@z?Dgs;`~H;Zr6}tSptk*e z0H7czvq`mO(m!fA_Ujn5_;y)lb%~nAnKqxZ>HCGjj73{L_diNYmW`p{UUW#!f7c73 zZ~pWCzG<4yIn&{Na=51;AJNh@FZr(f-0GUt@O);X9rEogO-h>p=U>kK3zjP19ET&1 z!r?-JJeF!z!HPvxMfGLY!M+une{!MhEwIbeHg>1O6UFBV_u`qTOT4OCRhkwPAcOHq zeQ+?lSm0emO%p7!O%u`o!B zrmms4nHi7DYcCWe#pPJr>N+)NM(E+;*fnYe-DGsQF4!ivKXZoi5-Tfc=Hl-M4k*=( zDQhx&mpYa8wrkGFbiE#HEyVCK<+HTzs?GT5o%}iYm12{hcmshMk*;_44!=?yFJ)P6 z*IM~*7ZP;-utTgtgOyT2$C-KdR!dx2O(AZl(=m|raVvauc!J}Hk&zD1a@Wqj zgqT)SV{P(oUiG|X(5mWV?_b8hH@n|NUg4 z=pk+XH+UIgn(zPV&U489^ywJa@*~g8Ph~ zn!wO;uFK?MCQ)MOgBwI$3S@_7N1KdiHz?v-+Ulz9fDcJUHLuJ}^U%Uw36?d!dK3_O z>l85?Tq<1r^g%t4Hr+9q%rS`7WOVgsJaT!{vhJvB$Kr~!$4SFhWZQ%DX2F|WqOeHl z*0F5eaHZlR5_FsJLrI1mO^Lb5QaM5ETlnW@oQ*Wdv9>5Q@dVqM3oxbXT^qEvGbqp4 z=XdW`tZ<1e6LKv1izJV|tJF%rOD#pn{HW(fo9*~Gb^4*(_h@XCcx!(=)ZrE4qC>Le zJ9c?cof5{r7O`ow7t*(mn8l%^^)-CFAAhbRpsfWPB z_2eVv2c74YCYxws05}d9sFM9$%MBb%EcW8&+`Y^MS3$$?)8~oL#nquX%%m+O;4j{v zn;T6T-N3IA@UXvU1*IsDmfmV++-m`)+f(d&mVbBc9_^B8uW({KA)6C%6sk&RPd(&P ziFLHoFH9*fzjLGyRRViX&0U6pVv?HnikCH6;k zV8NQey+Q9x`NyNf3vyIE($pYCD1yJO_}|qvx#ZVSZe*v6WzcU|$qz>RCEGIn@adRi zGq_w;+P}}8yan!}Bs^KJS(ovvQ?a%&nqtq`Y{EW2l7G&g^gM+O`{wlj_R8K_EB;gT zFLSC#h$3~y17OPOR(1jA7C6oc*gs;ljHF!elOj1`aH-}K<||GgWF(0$^GeDb=-a2s zlUubV*d1=2sZw*jZg15lf{@ly>bV`ze;6r^Q~iu88N}U9jZIpl`|}0`D~JH3PR4N& zEPFrcS60gP3hEi0(1$p<@(LxD!^jkk) zG~6`0F!vT3@>EE3*W!@uaYm*jtUQwBg*&T$0`312yVw#a%O*3w4G98v=5tfT4hlfnvp8kY31-d=qx~87i<=55{KAqL(J-f^%(GsQi5t5swuy~r} z?w=10I;~8bS4_QzVOn9($HQn5-H~w;Hzy%k{g7MhVQ$;Zm=eG*a{T?I?fBcfYVI;# z9Ec*hI$y)wiqN-%z_LAUqcu8iTWuf98urAwSmMI~WR>^5D!Um&65IN(J9!$Vw5Vj6 z-9ZZVrLS-oir{w-Z1vhXPBpBDO4>Q1jxZ43jw-e;0SZo=3L!xeC)@{Sp>E zv)=|}DntM3{`sibPJ49*6nl?(0mm@F?kk}^Wv>B$6|p;dQlooEBl8P0Tfa4|=%2*+ zOlHK>F$>ihu_QhHXc!}VUG&}wUuFhh=|e@#j8vY04##Xe$Iogh|E8j@HsE!qgxLG# zsk)iLzT@{B_ZJQJ5tY)+cnJ?wa{Io~A@T>C(J2ld%F6|4kJTVHBO`|gs57SYF}<&z z%F;k$8nUg0=HSdR9pZt3-~Ne(x!g{b`iBm2Z|(O#BihFIYd+*cJn})>rN;OzD_neb zLvM`IL!M3B`jNWcUAMdO%zR@z@NId2=(kPe5FCyJaANIlTn5%WEdE>pE`U?$>oCNs z{Vm0YL9i)1K|Y7?wwxgpSatvP@6KsS{CmO$@70{Cnd#rekl%>X7%?#Qyk_9jIOzF%unjn-zwuMVZrhc)ohW7^Cw{0dSddDQWStay_`a zdS zmCV$!^>EO3x46PH14QT*38wUy8hJ?9dgb@7(kY>${3vzt;G2b11qydB-nN*LPj57G zK#fXAGKve=o%rf+D+QlUCzDfaHGQDZuOrH(x7CYC4PL^M+7L@qYH3B&u9C2E!}w7OCGK@zU$78j7%CSMiuvEvm8wp z@x=js9MN(yz_r-&=y2&iXI%@FXPihfS09ON2u*d2eXdG#jP1V~?m9Gq) ze@n|u%KI~hFB{Jd-_(T1>Yg?DfHc8Ph=b0NY;HOR5c`8U3a|wte-1FwE3!${eW7C? z330wT0w&J9-b6KO;4liTpAXkx%R^`}Y}Z0pk6R8QxLi_r(9f#}si7 zBcT>w0MIf+Bfpk_D^pIslx?~#%D08fpPc2IGopb#=0v@}Cf4cY*@$fZNdl%FYTr|R zPYL`Xc(4Z6yL;6d0uJ=_$UjNZuE)Eq%FYN(=resC>ZBWzMAx?C!ifiY;BSSm#_9oF6>`^%iS-2qjBB{`48;CfM!P=+E`mw;VBeGVX5*Btt zhc>7MZT9Nxqe?u+&TY4T!~M$w2iPl4%g((y_}p9)ILURVS&9GeC+;90dH8psA1Hiv zFBW$n+$_bfQErk-NgW3s@#?{wDe2Zr$y3B{Gxj+#IrS=*$oIP?k51ovmiPBBO|ET! zC2%|(tKaqaUSwk_LUXqK6U3?;@p7NFRTnh3-#?w%jmBi$V=f%tGwbhQZ3QO&5z8if zH;EHn*QfgAPZO4xbCa?8Kdrhn%|=k8;TU<+!o`p`=_Wu;NkIorC=6K+#HHu$%Na@K zw_8@w888w9?WPWflbyQv;ouBre^){yOf`-~Jgw=5%0nzGJ!Bw4Hdnyrns9 ze$Q6eKh{|V_2dr9cL^)b3%!st-*{PFdeAQjSHl${_g^s#md}{da?DgOyZZi50D&le z*HW5$%Di1K?u+h|E10HfN=W&rwNd)~1`uX-iJOgkZd6YmjW7ja$ou8Cv zTWewcT_AZ*g@Zt?h%NNtm0f#`oyG9t{q5DxLYt*cA}cGfI0wi{Y*o|nJdM^b^qKvT zdq8$`uXObpUd5bXGie@NV0eNbe}Q$YEf9G}GIZ>goA&KEO82ThGa)`W>;7EC-CIz@ z*lTOi~-B}SZVlHiXGJPZd zjzg}&okDz)&*gA|(!P5q9~)*ENis88^p*xUwDpfweSWA|7`2Tr^t}FDf0u*bt;Unf zcblCnh3D+@hIER*rEzB*>{(kFYLV#BVEyXA?tXqH8XZuuICfbZlXa<842FlL^e_`Seu`Z5w&0fk9*K7G~$_m7{W^ z)9r4n?2OSoI(_2h*XvaWyse&ny}s39U~IwVNlH~}MPS*&tIEnIp)loU#b}pdml%*yk;)++Jlh5nrfX4;L|;9-U74Xq>tki_=Bf=XYUF&*&vv57U;N z%m;|pK8Hl>amUx`e<*K=b&7p|hJXAB|L(xp9j3ruSF@RXy+0oQOy-_BbIzGFbIzPO zcXDsgz#>ac%&ZBQ_k3NEbYP-)?6pPN`z~eM4xhTwb6ZOHl#$;BZ0H&rq#TmfHA^oo zUC>#*KhN*TAc<0=jo&8q`kxce{HulAYh(|?>d?cB_myDG6KXUhn;QE)m z(1t%Y{FwQ^?j3(k?cIOIcKYg?&szn~zj>BSk*t}xxTM&5=feD51HQ-`H{fs*x+2r& z;58733*9?@HKgvT3iQ^dj&sK~ADjy9AFCgxsFy$CyyN_(i)gk7$`xNuJGCe);fI3$ z(?-sJ+Ufjbo%3dVs;6$q>QG6+Whs(vOI~@R|H|PbM=O8Bj{C&c-RhC{;ofU2*H4~V zy06nw9m$q-yfEzSl*Q3#WZ={wX>#7wrO)j#+dq|Qng*PC{m!^Ix0OZR zQ4H={bTxn6%)8I+KXCBXm#%EcS*YFOzi;1xfp6^E_srCv_a(kJ?@-i_SDbwtN=uMe z#^)%*dAonuIWZ9P@d_Lh;`!^5DDnEMuk?AJ!OX(H_oz{pWv0!k@s=_G|iRmoZ{Fxvw3W%Zo4z{Qg)1u|Dj*#_@jS+>W@`HvJ11v zU0)S2fB2T3&Zu!q)wad~6QUnKc?|REq3*BxdSxgQb(+?*?$#{nyUt&2l_l@|67=%e zo$G(fFa7cT&%gcaP~4$k3dZ#Rvi3XYU5KM12d?dqb7i7-OVvi%B%LsoV2?$_)0ryU<` z%ip<3yQXNdk9u2Brfy1BgAZD6i19%4hYrqbUU_tR(S)lnzji{=dBV!{=eLZ>o49`| zE-1p$_du{Je8RaS&;2@i$nOIyw{4GkqBKU5yX)Gb?^Y)d|>ad)+x8~O|V&>x8A1T4PU=IbgyQ=Eum=LahM!l}1wa~=cx1iP z13%3wf%GNACj>KttK#B3oqoEmoUzA^w#+n|%M+2)CzBvHVj+slO_oxf32}dwO=6@( z8vH5B2?*E#G6+HIWOT*J4MCJ$BFiqAuuE*s4!AJ{udxG?wBXi0)5JEJx?tj*CIwP} zT3qd7Ig$FXBB_Z;eS{(vR2Z!w&~XvQYP2F>ULaCai>x+_gB*+DB&@W|WX4+AFKwEZ zl!jQU&3u6aj$+CjsFW1R2^xQ-Lk2Xcpn!4Y*(}y!CSAF`bwATY0?;xqEU+XRiLJFr zg_`6rPn2S*ICr54iE^8y_)?Ms7vd0CD`^{=z^G!S%tf!N7Ij8VN=i?JwI>D)uUufE zloLR9WG-!`aJ4erqm|OVl?QDljz-8-gS=6b2X3WO;PJ?1aXei(wiUeIVQl!J#O>rcO){!I&s=_BAFL5J zo9x_nv@dmOU&(7f*-iV&LhWY}?R$tYlAHE%1s(yH!X1p=kylk}GU}1Fs+3;Zj5Bo( z29S(1@2mZ-t+g)+15@I)?~9sLpa{|{sR(r6rpCpb#w9|HOR0Ykk`o>>Zr00%P(|eZ zXRJ$SeOa9a5uNoF>TIZ)sjLO9`G_%E<73E=*BY&=Y3-)$WmRT9s;F{#B8T0-|Ft-#%4ss!XsK?VvU{!PjHHzI-$^^y0TI==kW>Bml;-el_Z6HXnyr7~`sm8r4E zkyqfvVIztwgpW}coq@5zq{77dp~mfkr4JgR+|p@`-hqEeTSVFt14M$ht~qBk>rGV# z2G`jMnqFsT>;xC)jDxXdlTQN3(wR)Hfa7#F`)I~dVKLBFqjg5J1ODgQFr)j;yigA0 z4Iti|D#e+(AuWwrLR)llBZAvW?$?e^JJPxvYNHxxNFR&_@feg+Ok0#F63~-93_a?v z3DqQGi6VbZJ4jsgBrq_A(6uQk!a>yJ=~|oGCFemtRRtjrf$jNF*j^8X?OhNeu$^|5 zKt2_1g%15$Ysw(j)c?NL#LxG*R`cEI6Dz|68&gGL4`f~UupO7R6&IH?j^g6V+L<~V zSqa%qPF2!ltRbi!3UfkY{03? zN$2+h-rVv!6O1IB-R!7fvjft*LS&KBBR@TarS3&J_CyaL9CZ#XKUifcKXD8aVSc&? zBO!kU5>n{fgSaChUoTE(vC_Ad68v~2__wWufYwR~Bm_zD;742?dl8_(Kl;e!MuKIT z0|G16#L>ZJP(G`I9B#vftAlB^h^>YZ$zey0REM~?23d1>CQuzJsD5zg3!h4t3+}+X z-~p@)&LS>&z(cy=RuP8N=aK{yZM==tf5Lwax1#61MWIy~34EBPbeg*##u(Wy3^(6R zT7wf5)VFf`t^7FGs6a@xg)jfF|NKw$pOfz$l0B^d?0}kl5ZN@an^*9pn1p9O=VrWk zTo`P3-$7Bm^Et2ML-{5>SiDDN^(CKvJPrSK9@tc|*Gk4Y4YG%!8?*-@6p;T=L7RWO z-w5RWMhfdU(uv5K-}v$ zwUzW5Tk&XD(WvJtFd|SU&~g7Y^Z!6IKl&hHgfK&)j1(BVhtSwnLNw1v_lSo=y}A6T zk1GTaDSc@O@Nnkj;W8&b-kb)q=9GU)%xU05nv?q;-s!Vlf+;pWi@N*?gK{V4GNTIE zT^V6%pN10R(R7rMfJ`VM5mlmuKB%}R5$Vcck<=E~BtV2$%0A_=43#4SA$8QYw3Yw0 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

7tsllBqW(rk7tD8YbO86 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 a0O%jNgCAXUHfyEhr!l0T{{!jNJ^^sb@nJgv diff --git a/libsrc/ffdec_lib/testdata/as2/com/jpexs/flash/test/TestLoader.as b/libsrc/ffdec_lib/testdata/as2/com/jpexs/flash/test/TestLoader.as index 3058fb789..4f12ac264 100644 --- a/libsrc/ffdec_lib/testdata/as2/com/jpexs/flash/test/TestLoader.as +++ b/libsrc/ffdec_lib/testdata/as2/com/jpexs/flash/test/TestLoader.as @@ -1,12 +1,12 @@ -/** +/** * Class for including other TestCases, it is called from frame 65 */ class com.jpexs.flash.test.TestLoader { - + public function includeTests() { - new com.jpexs.flash.test.testcases.TestSetterGetter(); - new com.jpexs.flash.test.testcases.TestCallSetterGetter(); - new com.jpexs.flash.test.testcases.TestVarsMethods(); - new com.jpexs.flash.test.testcases.TestMaintainOrder(); + new com.jpexs.flash.test.testcases.TestSetterGetter(); + new com.jpexs.flash.test.testcases.TestCallSetterGetter(); + new com.jpexs.flash.test.testcases.TestVarsMethods(); + new com.jpexs.flash.test.testcases.TestMaintainOrder(); } } \ No newline at end of file From e862df59c1777d6703b2360553b1cbc97d2c6e6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sat, 27 Jan 2018 20:25:07 +0100 Subject: [PATCH 32/58] AS1/2: Displaying script path on invalid jump error log --- CHANGELOG.md | 1 + libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java | 4 ++-- .../src/com/jpexs/decompiler/flash/action/ActionGraph.java | 6 +++--- .../jpexs/decompiler/flash/action/ActionGraphSource.java | 7 +++++-- .../src/com/jpexs/decompiler/flash/tags/DoActionTag.java | 5 +++-- .../com/jpexs/decompiler/flash/tags/DoInitActionTag.java | 5 +++-- .../com/jpexs/decompiler/flash/tags/base/ButtonAction.java | 5 +++-- .../com/jpexs/decompiler/flash/types/BUTTONCONDACTION.java | 5 +++-- .../com/jpexs/decompiler/flash/types/CLIPACTIONRECORD.java | 5 +++-- src/com/jpexs/decompiler/flash/gui/action/ActionPanel.java | 2 +- 10 files changed, 27 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a903a3c37..92469add4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ All notable changes to this project will be documented in this file. ## [Unreleased] ### Added - AS2 classes: maintain order of variables, and methods (place variables before methods) +- AS1/2: displaying script path in the error log when jump to invalid address ### Changed - AS1/2 direct editation - generated constantpool is sorted according to ActionPush position diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java index af9a30818..1b3da466d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java @@ -2035,7 +2035,7 @@ public final class SWF implements SWFContainerItem, Timelined { ip = code.adr2pos(addr); addr += size; int nextip = code.adr2pos(addr); - getVariables(aLocalData.insideDoInitAction, variables, functions, strings, usageTypes, new ActionGraphSource(aLocalData.insideDoInitAction, code.getActions().subList(ip, nextip), code.version, new HashMap<>(), new HashMap<>(), new HashMap<>()), 0, path + (cntName == null ? "" : "/" + cntName)); + getVariables(aLocalData.insideDoInitAction, variables, functions, strings, usageTypes, new ActionGraphSource(path, aLocalData.insideDoInitAction, code.getActions().subList(ip, nextip), code.version, new HashMap<>(), new HashMap<>(), new HashMap<>()), 0, path + (cntName == null ? "" : "/" + cntName)); ip = nextip; } List> r = new ArrayList<>(); @@ -2136,7 +2136,7 @@ public final class SWF implements SWFContainerItem, Timelined { ActionList actions = src.getActions(); actionsMap.put(src, actions); boolean insideDoInitAction = src instanceof DoInitActionTag; - getVariables(insideDoInitAction, variables, functions, strings, usageTypes, new ActionGraphSource(insideDoInitAction, actions, version, new HashMap<>(), new HashMap<>(), new HashMap<>()), 0, path); + getVariables(insideDoInitAction, variables, functions, strings, usageTypes, new ActionGraphSource(path, insideDoInitAction, actions, version, new HashMap<>(), new HashMap<>(), new HashMap<>()), 0, path); return ret; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java index 07436c060..d2bde66db 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java @@ -65,8 +65,8 @@ public class ActionGraph extends Graph { private boolean insideDoInitAction; - public ActionGraph(boolean insideDoInitAction, List code, HashMap registerNames, HashMap variables, HashMap functions, int version) { - super(new ActionGraphSource(insideDoInitAction, code, version, registerNames, variables, functions), new ArrayList<>()); + public ActionGraph(String path, boolean insideDoInitAction, List code, HashMap registerNames, HashMap variables, HashMap functions, int version) { + super(new ActionGraphSource(path, insideDoInitAction, code, version, registerNames, variables, functions), new ArrayList<>()); this.insideDoInitAction = insideDoInitAction; } @@ -76,7 +76,7 @@ public class ActionGraph extends Graph { public static List translateViaGraph(boolean insideDoInitAction, HashMap registerNames, HashMap variables, HashMap functions, List code, int version, int staticOperation, String path) throws InterruptedException { - ActionGraph g = new ActionGraph(insideDoInitAction, code, registerNames, variables, functions, version); + ActionGraph g = new ActionGraph(path, insideDoInitAction, code, registerNames, variables, functions, version); ActionLocalData localData = new ActionLocalData(insideDoInitAction, registerNames); g.init(localData); return g.translate(localData, staticOperation, path); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraphSource.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraphSource.java index 4b576a1c6..e1458a84b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraphSource.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraphSource.java @@ -48,17 +48,20 @@ public class ActionGraphSource extends GraphSource { private final boolean insideDoInitAction; + private final String path; + public List getActions() { return actions; } - public ActionGraphSource(boolean insideDoInitAction, List actions, int version, HashMap registerNames, HashMap variables, HashMap functions) { + public ActionGraphSource(String path, boolean insideDoInitAction, List actions, int version, HashMap registerNames, HashMap variables, HashMap functions) { this.actions = actions; this.version = version; this.registerNames = registerNames; this.variables = variables; this.functions = functions; this.insideDoInitAction = insideDoInitAction; + this.path = path; } @Override @@ -139,7 +142,7 @@ public class ActionGraphSource extends GraphSource { } //ret = adr2posInside(adr); if (ret == -1) { - Logger.getLogger(ActionGraphSource.class.getName()).log(Level.SEVERE, "Address loc" + Helper.formatAddress(adr) + " not found"); + Logger.getLogger(ActionGraphSource.class.getName()).log(Level.SEVERE, "{0} - address loc{1} not found", new Object[]{path, Helper.formatAddress(adr)}); /*System.err.println("Addr loc"+Helper.formatAddress(adr)+" not found"); int pos=0; for(long l:posCache){ diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DoActionTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DoActionTag.java index 4389b3e7b..a274a9209 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DoActionTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DoActionTag.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.tags; import com.jpexs.decompiler.flash.DisassemblyListener; @@ -140,7 +141,7 @@ public class DoActionTag extends Tag implements ASMSource { actions = getActions(); } - return Action.actionsToSource(this, actions, toString()/*FIXME?*/, writer); + return Action.actionsToSource(this, actions, getScriptName(), writer); } /** diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DoInitActionTag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DoInitActionTag.java index 2ffab0cf9..951cfc90a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DoInitActionTag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/DoInitActionTag.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.tags; import com.jpexs.decompiler.flash.DisassemblyListener; @@ -148,7 +149,7 @@ public class DoInitActionTag extends Tag implements CharacterIdTag, ASMSource { actions = getActions(); } - return Action.actionsToSource(this, actions, toString()/*FIXME?*/, writer); + return Action.actionsToSource(this, actions, getScriptName(), writer); } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ButtonAction.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ButtonAction.java index d03e2ed96..0404f998c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ButtonAction.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/tags/base/ButtonAction.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.tags.base; import com.jpexs.decompiler.flash.DisassemblyListener; @@ -70,7 +71,7 @@ public class ButtonAction implements ASMSource { actions = getActions(); } - return Action.actionsToSource(this, actions, toString()/*FIXME?*/, writer); + return Action.actionsToSource(this, actions, getScriptName(), writer); } /** diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/BUTTONCONDACTION.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/BUTTONCONDACTION.java index dc9dbc44d..f5448ca69 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/BUTTONCONDACTION.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/BUTTONCONDACTION.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.types; import com.jpexs.decompiler.flash.DisassemblyListener; @@ -195,7 +196,7 @@ public class BUTTONCONDACTION implements ASMSource, Serializable { actions = getActions(); } - return Action.actionsToSource(this, actions, toString()/*FIXME?*/, writer); + return Action.actionsToSource(this, actions, getScriptName(), writer); } /** diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/CLIPACTIONRECORD.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/CLIPACTIONRECORD.java index d81c8dfbc..b01fda5d2 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/CLIPACTIONRECORD.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/types/CLIPACTIONRECORD.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.types; import com.jpexs.decompiler.flash.DisassemblyListener; @@ -197,7 +198,7 @@ public class CLIPACTIONRECORD implements ASMSource, Serializable { actions = getActions(); } - return Action.actionsToSource(this, actions, toString()/*FIXME?*/, writer); + return Action.actionsToSource(this, actions, getScriptName(), writer); } /** diff --git a/src/com/jpexs/decompiler/flash/gui/action/ActionPanel.java b/src/com/jpexs/decompiler/flash/gui/action/ActionPanel.java index 80210f8ee..f9acb01be 100644 --- a/src/com/jpexs/decompiler/flash/gui/action/ActionPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/action/ActionPanel.java @@ -941,7 +941,7 @@ public class ActionPanel extends JPanel implements SearchListener(), new HashMap<>(), new HashMap<>(), SWF.DEFAULT_VERSION), ""); + GraphDialog gf = new GraphDialog(mainPanel.getMainFrame().getWindow(), new ActionGraph(this.src.getScriptName(), insideDoInitAction, lastCode, new HashMap<>(), new HashMap<>(), new HashMap<>(), SWF.DEFAULT_VERSION), ""); gf.setVisible(true); } catch (InterruptedException ex) { logger.log(Level.SEVERE, null, ex); From 08b02ae83cc6d567e220d32694961e2bd309b3b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sat, 27 Jan 2018 20:43:42 +0100 Subject: [PATCH 33/58] ActionRandomNumber fixed for nonpositive numbers --- CHANGELOG.md | 1 + .../flash/action/model/RandomNumberActionItem.java | 9 +++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 92469add4..1450b5f9d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ All notable changes to this project will be documented in this file. - Better AS2 class detection - AS1/2 break statement decompilation in for..in loops - AS2 direct editation - not generating Pop in class header ifs +- AS1/2 deobfuscation - ActionRandom fixed for nonpositive numbers ## [11.0.0] - 2018-01-17 ### Added diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/RandomNumberActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/RandomNumberActionItem.java index fd0c7aa28..15c4261cc 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/RandomNumberActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/RandomNumberActionItem.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.action.model; import com.jpexs.decompiler.flash.SourceGeneratorLocalData; @@ -41,7 +42,11 @@ public class RandomNumberActionItem extends ActionItem { } public static Integer getResult(Object maximum) { - return rnd.nextInt(EcmaScript.toInt32(maximum)); + int maximumInt = EcmaScript.toInt32(maximum); + if (maximumInt <= 0) { + return 0; + } + return rnd.nextInt(maximumInt); } @Override From faac405da2dc58a651432f9c48a35d019f1aa773 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sat, 27 Jan 2018 21:19:44 +0100 Subject: [PATCH 34/58] fix nullpointer on ActionCloneSprite ActionScriptObject - return Undefined for missing getMember --- .../decompiler/flash/action/ActionScriptObject.java | 6 ++++-- .../flash/action/swf4/ActionCloneSprite.java | 11 ++++++++--- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionScriptObject.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionScriptObject.java index 91806c2a3..b9f4d0bdd 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionScriptObject.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionScriptObject.java @@ -12,9 +12,11 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.action; +import com.jpexs.decompiler.flash.ecma.Null; import com.jpexs.decompiler.flash.ecma.Undefined; import java.util.ArrayList; import java.util.HashMap; @@ -181,6 +183,6 @@ public class ActionScriptObject implements Cloneable { } } } - return null; + return Undefined.INSTANCE; } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCloneSprite.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCloneSprite.java index 758d65e51..5b2a63575 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCloneSprite.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCloneSprite.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.action.swf4; import com.jpexs.decompiler.flash.BaseLocalData; @@ -21,6 +22,7 @@ import com.jpexs.decompiler.flash.action.ActionScriptObject; import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.CloneSpriteActionItem; import com.jpexs.decompiler.flash.ecma.EcmaScript; +import com.jpexs.decompiler.flash.ecma.Undefined; import com.jpexs.decompiler.flash.types.annotations.SWFVersion; import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; @@ -53,8 +55,11 @@ public class ActionCloneSprite extends Action { int depth = EcmaScript.toInt32(lda.stack.pop()); String source = EcmaScript.toString(lda.stack.pop()); String target = EcmaScript.toString(lda.stack.pop()); - lda.stage.setMember(target, ((ActionScriptObject) lda.stage.getMember(source)).clone()); - lda.stage.addToDisplayList(depth, lda.stage.getMember(target)); + Object clonedMember = lda.stage.getMember(source); + if (clonedMember != Undefined.INSTANCE) { + lda.stage.setMember(target, ((ActionScriptObject) clonedMember).clone()); + lda.stage.addToDisplayList(depth, lda.stage.getMember(target)); + } return true; } From 654fd8ba6de9d0bac98babb53bc82ad058e16725 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 28 Jan 2018 07:32:20 +0100 Subject: [PATCH 35/58] AS1/2 switch detection refactoring to make it more readable --- .../decompiler/flash/action/ActionGraph.java | 58 +++++++++++-------- 1 file changed, 34 insertions(+), 24 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java index d2bde66db..d9dfe0685 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java @@ -312,6 +312,14 @@ public class ActionGraph extends Graph { List caseValues = new ArrayList<>(); boolean hasDefault = false; + /* + case 5: + default: + trace("5 & def"); + ... + case 6: + + */ for (int i = 0; i < caseBodyParts.size(); i++) { caseValues.add(caseValuesMap.get(i)); if (caseBodyParts.get(i) == defaultPart) { @@ -324,8 +332,12 @@ public class ActionGraph extends Graph { } if (!hasDefault) { - //List stops = new ArrayList<>(); - //stops.addAll(caseBodyParts); + /* + default: + trace("def"); + case 1: + trace("1"); + */ for (int i = 0; i < caseBodyParts.size(); i++) { if (defaultPart.leadsTo(localData, this, code, caseBodyParts.get(i), loops)) { caseValuesMap.add(i, new DefaultItem()); @@ -337,21 +349,28 @@ public class ActionGraph extends Graph { } } if (!hasDefault) { + /* + case 1: + ... + case 2: + ... + default: + trace("def"); + */ caseValuesMap.add(new DefaultItem()); caseBodyParts.add(defaultPart); caseValues.add(caseValuesMap.get(caseValuesMap.size() - 1)); } List> caseCommands = new ArrayList<>(); - GraphPart next; - - next = breakPart; + GraphPart next = breakPart; GraphTargetItem ti = checkLoop(next, stopPart, loops); + + //create switch as new loop break command detection to work currentLoop = new Loop(loops.size(), null, next); currentLoop.phase = 1; loops.add(currentLoop); - //switchLoc.getNextPartPath(new ArrayList()); List valuesMapping = new ArrayList<>(); List caseBodies = new ArrayList<>(); for (int i = 0; i < caseValues.size(); i++) { @@ -362,45 +381,36 @@ public class ActionGraph extends Graph { valuesMapping.add(caseBodies.indexOf(cur)); } - /*List ignored = new ArrayList<>(); - for (Loop l : loops) { - ignored.add(l.loopContinue); - }*/ for (int i = 0; i < caseBodies.size(); i++) { - List cc = new ArrayList<>(); - GraphPart nextCase = null; - nextCase = next; + List currentCaseCommands = new ArrayList<>(); + GraphPart nextCase = next; if (next != null) { if (i < caseBodies.size() - 1) { if (!caseBodies.get(i).leadsTo(localData, this, code, caseBodies.get(i + 1), loops)) { - cc.add(new BreakItem(null, localData.lineStartInstruction, currentLoop.id)); + currentCaseCommands.add(new BreakItem(null, localData.lineStartInstruction, currentLoop.id)); } else { nextCase = caseBodies.get(i + 1); } } } List stopPart2x = new ArrayList<>(stopPart); - //stopPart2.add(nextCase); for (GraphPart b : caseBodies) { if (b != caseBodies.get(i)) { stopPart2x.add(b); } } - /*if (defaultPart != null) { - stopPart2x.add(defaultPart); - }*/ if (breakPart != null) { stopPart2x.add(breakPart); } - cc.addAll(0, printGraph(partCodes, partCodePos, localData, stack, allParts, null, caseBodies.get(i), stopPart2x, loops, staticOperation, path)); - if (cc.size() >= 2) { - if (cc.get(cc.size() - 1) instanceof BreakItem) { - if ((cc.get(cc.size() - 2) instanceof ContinueItem) || (cc.get(cc.size() - 2) instanceof BreakItem)) { - cc.remove(cc.size() - 1); + currentCaseCommands.addAll(0, printGraph(partCodes, partCodePos, localData, stack, allParts, null, caseBodies.get(i), stopPart2x, loops, staticOperation, path)); + if (currentCaseCommands.size() >= 2) { + if (currentCaseCommands.get(currentCaseCommands.size() - 1) instanceof BreakItem) { + if ((currentCaseCommands.get(currentCaseCommands.size() - 2) instanceof ContinueItem) || (currentCaseCommands.get(currentCaseCommands.size() - 2) instanceof BreakItem)) { + currentCaseCommands.remove(currentCaseCommands.size() - 1); } } } - caseCommands.add(cc); + caseCommands.add(currentCaseCommands); } //If the lastone is default empty and alone, remove it From 7380c3c604c1bd04fee89a3426799fd895a83cd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 28 Jan 2018 10:03:39 +0100 Subject: [PATCH 36/58] AS1/2 switch detection fix - default clause also used when detecting break --- .../src/com/jpexs/decompiler/flash/action/ActionGraph.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java index d9dfe0685..e1a3b2dc6 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java @@ -308,8 +308,6 @@ public class ActionGraph extends Graph { defaultPart = defaultPart.nextParts.get(0); } - GraphPart breakPart = getMostCommonPart(localData, caseBodyParts, loops); - List caseValues = new ArrayList<>(); boolean hasDefault = false; /* @@ -362,6 +360,7 @@ public class ActionGraph extends Graph { caseValues.add(caseValuesMap.get(caseValuesMap.size() - 1)); } + GraphPart breakPart = getMostCommonPart(localData, caseBodyParts, loops); List> caseCommands = new ArrayList<>(); GraphPart next = breakPart; From 2e31ef23a0c9f779e9b278d8f4f53ba7586837fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 28 Jan 2018 10:04:38 +0100 Subject: [PATCH 37/58] AS1/2 switch detection fix - causing two default labels --- .../src/com/jpexs/decompiler/flash/action/ActionGraph.java | 1 + 1 file changed, 1 insertion(+) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java index e1a3b2dc6..d872ce1a3 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java @@ -326,6 +326,7 @@ public class ActionGraph extends Graph { caseBodyParts.add(i, defaultPart); caseValues.add(caseValuesMap.get(i)); hasDefault = true; + break; } } From 455d30bb2d33cbbcdfd4bb8924a2cfa180c121a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 28 Jan 2018 11:54:47 +0100 Subject: [PATCH 38/58] Switch variant generator --- .../generators/SwitchVariantsGenerator.java | 206 ++++++++++++++++++ 1 file changed, 206 insertions(+) create mode 100644 libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/generators/SwitchVariantsGenerator.java diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/generators/SwitchVariantsGenerator.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/generators/SwitchVariantsGenerator.java new file mode 100644 index 000000000..c961f709e --- /dev/null +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/generators/SwitchVariantsGenerator.java @@ -0,0 +1,206 @@ +package com.jpexs.decompiler.flash.generators; + +import java.io.PrintWriter; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Objects; +import java.util.Random; +import java.util.Set; + +/** + * + * @author JPEXS + */ +public class SwitchVariantsGenerator { + + /* + switch(x) + { + place1: + place2: + place3: + } + + Variants: + A) place of default (place1,place2,place3 or no place) + B) place1 can be same as place2. place2 can be same as place3 if place3 present. + B.2) if there is default on that place, it cannot be same as following + C) places that are not same as following place have break or do not have break, + C.2) last one place does not have break (its presence does not matter) + */ + public static void main(String[] args) { + int numValueCases = 2; + + int maxSeedBits = getRandomBitsNeeded(numValueCases); + long maxSeed = 1 << (maxSeedBits + 1); + Set switchSet = new HashSet<>(); + + for (long s = 0; s < maxSeed; s++) { + seed = s; + Switch p = new Switch(); + + //A + p.defaultPlace = rnd(0, numValueCases + 1); //0 = no default clause + if (p.defaultPlace > 0) { + p.numPlaces = numValueCases + 1; + } else { + p.numPlaces = numValueCases; + } + //B + + for (int place = 1; place < p.numPlaces /*not counting last*/; place++) { + if (place == p.defaultPlace) { //B.2 + p.placeSameAsNext.put(place, false); + } else { + p.placeSameAsNext.put(place, rndBool()); + } + } + p.placeSameAsNext.put(p.numPlaces, Boolean.FALSE); //last one cannot be same, but put there false + //C + for (int place = 1; place < p.numPlaces /*last one break does not matter*/; place++) { + if (!p.placeSameAsNext.get(place)) { + p.placeHasBreak.put(place, rndBool()); + } + } + switchSet.add(p); + } + + Switch.toStringPrefix = Switch.TAB; + int pos = 0; + for (Switch s : switchSet) { + pos++; + System.out.println("function test" + pos + "()"); + System.out.println("{"); + System.out.print(s.toString()); + System.out.println("}"); + } + } + + private static class Switch { + + public int defaultPlace; + public int numPlaces; + public Map placeSameAsNext = new HashMap<>(); + public Map placeHasBreak = new HashMap<>(); + + public static final String TAB = " "; + + public static String toStringPrefix = ""; + + @Override + public int hashCode() { + int hash = 3; + hash = 31 * hash + this.defaultPlace; + hash = 31 * hash + this.numPlaces; + hash = 31 * hash + Objects.hashCode(this.placeSameAsNext); + hash = 31 * hash + Objects.hashCode(this.placeHasBreak); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + final Switch other = (Switch) obj; + if (this.defaultPlace != other.defaultPlace) { + return false; + } + if (this.numPlaces != other.numPlaces) { + return false; + } + if (!Objects.equals(this.placeSameAsNext, other.placeSameAsNext)) { + return false; + } + if (!Objects.equals(this.placeHasBreak, other.placeHasBreak)) { + return false; + } + return true; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + final String NL = "\r\n"; + sb.append(toStringPrefix).append("var _loc1_=random(100);").append(NL); + sb.append(toStringPrefix).append("switch(_loc1_)").append(NL); + sb.append(toStringPrefix).append("{").append(NL); + int checkedVal = 0; + for (int place = 1; place <= numPlaces; place++) { + sb.append(toStringPrefix); + if (defaultPlace == place) { + sb.append(TAB).append("default"); + } else { + checkedVal++; + sb.append(TAB).append("case ").append(checkedVal); + } + sb.append(":").append(NL); + if (!placeSameAsNext.get(place)) { + sb.append(toStringPrefix).append(TAB).append(TAB).append("trace(\"place").append(place).append("\");").append(NL); + if (placeHasBreak.containsKey(place) && placeHasBreak.get(place)) { + sb.append(toStringPrefix).append(TAB).append(TAB).append("break;").append(NL); + } + } + } + + sb.append(toStringPrefix).append("}").append(NL); + sb.append(toStringPrefix).append("trace(\"after switch\");").append(NL); + return sb.toString(); + } + + } + + //private static Random RANDOM = new Random(); + private static long seed = 0; + + private static boolean rndBool() { + return nextBit() == 1; + } + + private static int rnd(int min, int max) { + return nextInt(max - min + 1) + min; + } + + private static int nextInt(int bound) { + int bits = getBitsNeeded(bound); + int value = 0; + for (int i = 0; i < bits; i++) { + value = value + (nextBit() << i); + } + return value; + } + + private static int nextBit() { + int bit = (int) (seed & 1); + seed = seed >> 1; + return bit; + } + + private static int getBitsNeeded(int value) { + int numBits = 0; + while (value > 0) { + numBits++; + value = value >> 1; + } + return numBits; + } + + private static int getRandomBitsNeeded(int numCases) { + int x = 0; + int value = numCases + 1; + while (value > 0) { + x++; + value = value >> 1; + } + int y = numCases - 1; + int z = y + 2; + return x + y + z; + } +} From d898ec2076f3e52ce60c977fd672c1940d21c6df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 28 Jan 2018 12:03:10 +0100 Subject: [PATCH 39/58] AS1/2 switch detection - better handling position of default branch --- CHANGELOG.md | 1 + .../decompiler/flash/action/ActionGraph.java | 68 +- .../decompiler/flash/ActionScript2Test.java | 847 ++++++++++++++++++ libsrc/ffdec_lib/testdata/as2/as2.fla | Bin 1086307 -> 1086903 bytes libsrc/ffdec_lib/testdata/as2/as2.swf | Bin 27166 -> 27819 bytes 5 files changed, 894 insertions(+), 22 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1450b5f9d..1c0274ddc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ All notable changes to this project will be documented in this file. - AS1/2 break statement decompilation in for..in loops - AS2 direct editation - not generating Pop in class header ifs - AS1/2 deobfuscation - ActionRandom fixed for nonpositive numbers +- AS1/2 switch statement detection - fixes of default section position ## [11.0.0] - 2018-01-17 ### Added diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java index d872ce1a3..3d673c633 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java @@ -302,15 +302,14 @@ public class ActionGraph extends Graph { stack.push(set); } else { part = part.nextParts.get(1); - //caseBodyParts.add(part); GraphPart defaultPart = part; if (code.size() > defaultPart.start && code.get(defaultPart.start) instanceof ActionJump) { defaultPart = defaultPart.nextParts.get(0); } - List caseValues = new ArrayList<>(); boolean hasDefault = false; /* + case 4: case 5: default: trace("5 & def"); @@ -318,13 +317,12 @@ public class ActionGraph extends Graph { case 6: */ - for (int i = 0; i < caseBodyParts.size(); i++) { - caseValues.add(caseValuesMap.get(i)); + //must go backwards to hit case 5, not case 4 + for (int i = caseBodyParts.size() - 1; i >= 0; i--) { if (caseBodyParts.get(i) == defaultPart) { - i++; - caseValuesMap.add(i, new DefaultItem()); - caseBodyParts.add(i, defaultPart); - caseValues.add(caseValuesMap.get(i)); + DefaultItem di = new DefaultItem(); + caseValuesMap.add(i + 1, di); + caseBodyParts.add(i + 1, defaultPart); hasDefault = true; break; } @@ -332,21 +330,48 @@ public class ActionGraph extends Graph { if (!hasDefault) { /* + case 1: + trace("1"); + case 2: + trace("2"); //no break default: trace("def"); - case 1: - trace("1"); + ... + case 3: */ - for (int i = 0; i < caseBodyParts.size(); i++) { - if (defaultPart.leadsTo(localData, this, code, caseBodyParts.get(i), loops)) { - caseValuesMap.add(i, new DefaultItem()); - caseBodyParts.add(i, defaultPart); - caseValues.add(i, caseValuesMap.get(i)); + //must go backwards to hit case 2, not case 1 + for (int i = caseBodyParts.size() - 1; i >= 0; i--) { + if (caseBodyParts.get(i).leadsTo(localData, this, code, defaultPart, loops)) { + DefaultItem di = new DefaultItem(); + caseValuesMap.add(i + 1, di); + caseBodyParts.add(i + 1, defaultPart); hasDefault = true; break; } } } + + if (!hasDefault) { + /* + case 1: + trace("1"); + break; + default: + trace("def"); //no break + case 2: + trace("2"); + */ + for (int i = 0; i < caseBodyParts.size(); i++) { + if (defaultPart.leadsTo(localData, this, code, caseBodyParts.get(i), loops)) { + DefaultItem di = new DefaultItem(); + caseValuesMap.add(i, di); + caseBodyParts.add(i, defaultPart); + hasDefault = true; + break; + } + } + } + if (!hasDefault) { /* case 1: @@ -358,7 +383,6 @@ public class ActionGraph extends Graph { */ caseValuesMap.add(new DefaultItem()); caseBodyParts.add(defaultPart); - caseValues.add(caseValuesMap.get(caseValuesMap.size() - 1)); } GraphPart breakPart = getMostCommonPart(localData, caseBodyParts, loops); @@ -373,7 +397,7 @@ public class ActionGraph extends Graph { loops.add(currentLoop); List valuesMapping = new ArrayList<>(); List caseBodies = new ArrayList<>(); - for (int i = 0; i < caseValues.size(); i++) { + for (int i = 0; i < caseValuesMap.size(); i++) { GraphPart cur = caseBodyParts.get(i); if (!caseBodies.contains(cur)) { caseBodies.add(cur); @@ -422,15 +446,16 @@ public class ActionGraph extends Graph { } if (lastc.isEmpty()) { int cnt2 = 0; - if (caseValues.get(caseValues.size() - 1) instanceof DefaultItem) { + if (caseValuesMap.get(caseValuesMap.size() - 1) instanceof DefaultItem) { for (int i = valuesMapping.size() - 1; i >= 0; i--) { if (valuesMapping.get(i) == caseCommands.size() - 1) { cnt2++; } } + + caseValuesMap.remove(caseValuesMap.size() - 1); + valuesMapping.remove(valuesMapping.size() - 1); if (cnt2 == 1) { - caseValues.remove(caseValues.size() - 1); - valuesMapping.remove(valuesMapping.size() - 1); caseCommands.remove(lastc); } } @@ -442,13 +467,12 @@ public class ActionGraph extends Graph { if (!lastc.isEmpty() && (lastc.get(lastc.size() - 1) instanceof BreakItem)) { BreakItem bi = (BreakItem) lastc.get(lastc.size() - 1); lastc.remove(lastc.size() - 1); - } } ret = new ArrayList<>(); ret.addAll(output); - SwitchItem sti = new SwitchItem(null, switchStartItem, currentLoop, switchedObject, caseValues, caseCommands, valuesMapping); + SwitchItem sti = new SwitchItem(null, switchStartItem, currentLoop, switchedObject, caseValuesMap, caseCommands, valuesMapping); ret.add(sti); currentLoop.phase = 2; if (next != null) { diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java index ec1637b32..73652164e 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java @@ -1026,4 +1026,851 @@ public class ActionScript2Test extends ActionScript2TestBase { + "var obj = {a:5,b:6,c:7};\r\n" ); } + + @Test + public void frame67_switchVariantsTest() { + compareSrc(67, "function test1()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "trace(\"place1\");\r\n" + + "case 2:\r\n" + + "trace(\"place2\");\r\n" + + "}\r\n" + + "trace(\"place3\");\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test2()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "case 2:\r\n" + + "case 3:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test3()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "trace(\"place1\");\r\n" + + "case 2:\r\n" + + "trace(\"place2\");\r\n" + + "case 3:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test4()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "trace(\"place1\");\r\n" + + "break;\r\n" + + "case 2:\r\n" + + "trace(\"place2\");\r\n" + + "default:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test5()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "trace(\"place1\");\r\n" + + "break;\r\n" + + "case 2:\r\n" + + "trace(\"place2\");\r\n" + + "case 3:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test6()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "trace(\"place1\");\r\n" + + "break;\r\n" + + "case 2:\r\n" + + "}\r\n" + + "trace(\"place3\");\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test7()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "trace(\"place1\");\r\n" + + "case 2:\r\n" + + "trace(\"place2\");\r\n" + + "break;\r\n" + + "default:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test8()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "case 2:\r\n" + + "trace(\"place2\");\r\n" + + "case 3:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test9()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "trace(\"place1\");\r\n" + + "case 2:\r\n" + + "case 3:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test10()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "trace(\"place1\");\r\n" + + "break;\r\n" + + "case 2:\r\n" + + "trace(\"place3\");\r\n" + + "break;\r\n" + + "default:\r\n" + + "trace(\"place2\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test11()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "trace(\"place1\");\r\n" + + "break;\r\n" + + "case 2:\r\n" + + "trace(\"place2\");\r\n" + + "break;\r\n" + + "case 3:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test12()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "trace(\"place1\");\r\n" + + "break;\r\n" + + "case 2:\r\n" + + "case 3:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test13()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "default:\r\n" + + "trace(\"place2\");\r\n" + + "break;\r\n" + + "case 2:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test14()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "case 2:\r\n" + + "trace(\"place2\");\r\n" + + "break;\r\n" + + "case 3:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test15()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "trace(\"place1\");\r\n" + + "case 2:\r\n" + + "trace(\"place2\");\r\n" + + "case 3:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test16()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "case 2:\r\n" + + "case 3:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test17()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "trace(\"place1\");\r\n" + + "break;\r\n" + + "case 2:\r\n" + + "trace(\"place2\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test18()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "trace(\"place1\");\r\n" + + "case 2:\r\n" + + "trace(\"place2\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test19()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "case 2:\r\n" + + "trace(\"place2\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test20()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "trace(\"place1\");\r\n" + + "break;\r\n" + + "case 2:\r\n" + + "trace(\"place2\");\r\n" + + "case 3:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test21()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "trace(\"place1\");\r\n" + + "case 2:\r\n" + + "trace(\"place2\");\r\n" + + "break;\r\n" + + "case 3:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test22()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "trace(\"place1\");\r\n" + + "case 2:\r\n" + + "trace(\"place2\");\r\n" + + "break;\r\n" + + "case 3:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test23()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "trace(\"place1\");\r\n" + + "break;\r\n" + + "case 2:\r\n" + + "trace(\"place2\");\r\n" + + "break;\r\n" + + "default:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test24()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "case 2:\r\n" + + "trace(\"place2\");\r\n" + + "}\r\n" + + "trace(\"place3\");\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test25()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "trace(\"place1\");\r\n" + + "case 2:\r\n" + + "case 3:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test26()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "case 2:\r\n" + + "trace(\"place2\");\r\n" + + "case 3:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test27()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "trace(\"place1\");\r\n" + + "break;\r\n" + + "case 2:\r\n" + + "trace(\"place2\");\r\n" + + "break;\r\n" + + "case 3:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test28()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "trace(\"place1\");\r\n" + + "break;\r\n" + + "case 2:\r\n" + + "default:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test29()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "case 2:\r\n" + + "trace(\"place2\");\r\n" + + "break;\r\n" + + "default:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test30()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "trace(\"place1\");\r\n" + + "break;\r\n" + + "case 2:\r\n" + + "case 3:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test31()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "case 2:\r\n" + + "trace(\"place2\");\r\n" + + "break;\r\n" + + "case 3:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test32()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "case 2:\r\n" + + "}\r\n" + + "trace(\"place3\");\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test33()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "default:\r\n" + + "trace(\"place1\");\r\n" + + "case 1:\r\n" + + "trace(\"place2\");\r\n" + + "break;\r\n" + + "case 2:\r\n" + + "}\r\n" + + "trace(\"place3\");\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test34()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "trace(\"place1\");\r\n" + + "case 2:\r\n" + + "trace(\"place2\");\r\n" + + "case 3:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test35()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "trace(\"place2\");\r\n" + + "case 2:\r\n" + + "trace(\"place3\");\r\n" + + "break;\r\n" + + "default:\r\n" + + "trace(\"place1\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test36()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "default:\r\n" + + "trace(\"place1\");\r\n" + + "case 1:\r\n" + + "trace(\"place2\");\r\n" + + "break;\r\n" + + "case 2:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test37()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "trace(\"place1\");\r\n" + + "break;\r\n" + + "case 2:\r\n" + + "trace(\"place2\");\r\n" + + "case 3:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test38()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "default:\r\n" + + "trace(\"place1\");\r\n" + + "break;\r\n" + + "case 1:\r\n" + + "case 2:\r\n" + + "}\r\n" + + "trace(\"place3\");\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test39()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "trace(\"place1\");\r\n" + + "case 2:\r\n" + + "trace(\"place2\");\r\n" + + "break;\r\n" + + "case 3:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test40()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "trace(\"place1\");\r\n" + + "break;\r\n" + + "case 2:\r\n" + + "trace(\"place2\");\r\n" + + "break;\r\n" + + "case 3:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test41()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "trace(\"place1\");\r\n" + + "case 2:\r\n" + + "case 3:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test42()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "case 2:\r\n" + + "trace(\"place2\");\r\n" + + "case 3:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test43()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "trace(\"place1\");\r\n" + + "break;\r\n" + + "case 2:\r\n" + + "case 3:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test44()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "case 2:\r\n" + + "trace(\"place2\");\r\n" + + "break;\r\n" + + "case 3:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test45()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "case 2:\r\n" + + "case 3:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test46()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "trace(\"place1\");\r\n" + + "default:\r\n" + + "trace(\"place2\");\r\n" + + "break;\r\n" + + "case 2:\r\n" + + "}\r\n" + + "trace(\"place3\");\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test47()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "trace(\"place1\");\r\n" + + "case 2:\r\n" + + "trace(\"place2\");\r\n" + + "case 3:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test48()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "trace(\"place1\");\r\n" + + "break;\r\n" + + "default:\r\n" + + "trace(\"place2\");\r\n" + + "case 2:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test49()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "trace(\"place1\");\r\n" + + "default:\r\n" + + "trace(\"place2\");\r\n" + + "break;\r\n" + + "case 2:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test50()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "trace(\"place1\");\r\n" + + "break;\r\n" + + "case 2:\r\n" + + "trace(\"place2\");\r\n" + + "case 3:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test51()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "default:\r\n" + + "trace(\"place2\");\r\n" + + "break;\r\n" + + "case 2:\r\n" + + "}\r\n" + + "trace(\"place3\");\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test52()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "trace(\"place1\");\r\n" + + "case 2:\r\n" + + "trace(\"place2\");\r\n" + + "break;\r\n" + + "case 3:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test53()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "trace(\"place1\");\r\n" + + "case 2:\r\n" + + "case 3:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test54()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "case 2:\r\n" + + "trace(\"place3\");\r\n" + + "break;\r\n" + + "default:\r\n" + + "trace(\"place1\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test55()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "case 2:\r\n" + + "trace(\"place2\");\r\n" + + "case 3:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test56()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "trace(\"place2\");\r\n" + + "break;\r\n" + + "case 2:\r\n" + + "trace(\"place3\");\r\n" + + "break;\r\n" + + "default:\r\n" + + "trace(\"place1\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test57()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "trace(\"place1\");\r\n" + + "break;\r\n" + + "case 2:\r\n" + + "trace(\"place2\");\r\n" + + "break;\r\n" + + "case 3:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test58()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "trace(\"place1\");\r\n" + + "break;\r\n" + + "case 2:\r\n" + + "case 3:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test59()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "case 2:\r\n" + + "trace(\"place2\");\r\n" + + "break;\r\n" + + "case 3:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "function test60()\r\n" + + "{\r\n" + + "var _loc1_ = random(100);\r\n" + + "switch(_loc1_)\r\n" + + "{\r\n" + + "case 1:\r\n" + + "case 2:\r\n" + + "case 3:\r\n" + + "trace(\"place3\");\r\n" + + "}\r\n" + + "trace(\"after switch\");\r\n" + + "}\r\n" + + "trace(\"switchVariantsTest\");\r\n" + ); + } } diff --git a/libsrc/ffdec_lib/testdata/as2/as2.fla b/libsrc/ffdec_lib/testdata/as2/as2.fla index 623e55c811c7ff96a2c7ef0ffd8a824b85fb0e82..cad3e071e176477e607ffef6a9b4ed0b9743efa4 100644 GIT binary patch delta 18842 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 diff --git a/libsrc/ffdec_lib/testdata/as2/as2.swf b/libsrc/ffdec_lib/testdata/as2/as2.swf index 3c6b3afbbecd7862efcd8cb2e8b105493a7c725d..c9832c61c8e2ea9c478a8156c91b55774068db09 100644 GIT binary patch delta 25739 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 delta 25115 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 Date: Sun, 28 Jan 2018 13:10:25 +0100 Subject: [PATCH 40/58] universalloop extends whileloop better while loop detection --- .../src/com/jpexs/decompiler/graph/Graph.java | 20 +++-- .../graph/model/UniversalLoopItem.java | 76 ++----------------- 2 files changed, 20 insertions(+), 76 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java index a28f7b585..a9bcffe39 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java @@ -1692,10 +1692,9 @@ public class Graph { //makeAllCommands(currentRet, stack); stack = (TranslateStack) stack.clone(); stack.clear(); - loopItem = new UniversalLoopItem(null, localData.lineStartInstruction, currentLoop); + loopItem = new UniversalLoopItem(null, localData.lineStartInstruction, currentLoop, new ArrayList<>()); //loopItem.commands=printGraph(visited, localData, stack, allParts, parent, part, stopPart, loops); currentRet.add(loopItem); - loopItem.commands = new ArrayList<>(); currentRet = loopItem.commands; //return ret; } @@ -2073,6 +2072,7 @@ public class Graph { List bodyBranch = null; boolean inverted = false; boolean breakpos2 = false; + BreakItem addBreakItem = null; if ((ifi.onTrue.size() == 1) && (ifi.onTrue.get(0) instanceof BreakItem)) { BreakItem bi = (BreakItem) ifi.onTrue.get(0); if (bi.loopId == currentLoop.id) { @@ -2086,12 +2086,13 @@ public class Graph { } } else if (loopItem.commands.size() == 2 && (loopItem.commands.get(1) instanceof BreakItem)) { BreakItem bi = (BreakItem) loopItem.commands.get(1); - if (bi.loopId == currentLoop.id) { - if (ifi.onTrue.isEmpty()) { - inverted = true; - } - bodyBranch = inverted ? ifi.onFalse : ifi.onTrue; - breakpos2 = true; + if (ifi.onTrue.isEmpty()) { + inverted = true; + } + bodyBranch = inverted ? ifi.onFalse : ifi.onTrue; + breakpos2 = true; + if (bi.loopId != currentLoop.id) { //it's break of another parent loop + addBreakItem = bi; //we must add it after the loop } } if (bodyBranch != null) { @@ -2130,6 +2131,9 @@ public class Graph { } else { ret.add(index, li = new WhileItem(expr.getSrc(), expr.getLineStartItem(), currentLoop, exprList, commands)); } + if (addBreakItem != null) { + ret.add(index + 1, addBreakItem); + } loopTypeFound = true; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/UniversalLoopItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/UniversalLoopItem.java index c20546d59..6dd9e4b2e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/UniversalLoopItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/model/UniversalLoopItem.java @@ -12,17 +12,14 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.graph.model; -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.GraphSourceItem; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.Loop; -import com.jpexs.decompiler.graph.TypeItem; import java.util.ArrayList; import java.util.List; @@ -30,72 +27,15 @@ import java.util.List; * * @author JPEXS */ -public class UniversalLoopItem extends LoopItem implements Block { +public class UniversalLoopItem extends WhileItem implements Block { - public List commands; + static final List TRUE_EXPRESSION = new ArrayList<>(); - private boolean labelUsed; - - public UniversalLoopItem(GraphSourceItem src, GraphSourceItem lineStartIns, Loop loop) { - super(src, lineStartIns, loop); + static { + TRUE_EXPRESSION.add(new TrueItem(null, null)); } - @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").append(loop.id).append(":").newLine(); - } - writer.append("while"); - if (writer.getFormatting().spaceBeforeParenthesesWhileParentheses) { - writer.append(" "); - } - writer.append("(true)"); - appendBlock(null, writer, localData, commands); - 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 List> getSubs() { - List> ret = new ArrayList<>(); - if (commands != null) { - ret.add(commands); - } - return ret; - } - - @Override - public boolean hasReturnValue() { - return false; - } - - @Override - public GraphTargetItem returnType() { - return TypeItem.UNBOUNDED; + public UniversalLoopItem(GraphSourceItem src, GraphSourceItem lineStartIns, Loop loop, List commands) { + super(src, lineStartIns, loop, TRUE_EXPRESSION, commands); } } From f524523762c95a492f33318bdc506352490f7b14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 28 Jan 2018 13:30:54 +0100 Subject: [PATCH 41/58] correct jump pos, removed old comments --- .../jpexs/decompiler/flash/action/Action.java | 100 ++---------------- 1 file changed, 7 insertions(+), 93 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java index 178d28d5a..d52275288 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java @@ -1077,7 +1077,7 @@ public abstract class Action implements GraphSourceItem { if (actions.get(ip + 2) instanceof ActionNot) { if (actions.get(ip + 3) instanceof ActionIf) { ActionIf aif = (ActionIf) actions.get(ip + 3); - if (adr2ip(actions, ip2adr(actions, ip + 4) + aif.getJumpOffset()) == ip) { + if (adr2ip(actions, ip2adr(actions, ip + 3) + 5 + aif.getJumpOffset()) == ip) { ip += 4; continue; } @@ -1087,100 +1087,14 @@ public abstract class Action implements GraphSourceItem { } } - /*ActionJump && ActionIf removed*/ - /*if ((action instanceof ActionEnumerate2) || (action instanceof ActionEnumerate)) { - loopStart = ip + 1; - isForIn = true; - ip += 4; - action.translate(localData, stack, output); - EnumerateActionItem en = (EnumerateActionItem) stack.peek(); - inItem = en.object; - continue; - } else*/ /*if (action instanceof ActionTry) { - ActionTry atry = (ActionTry) action; - List tryCommands = ActionGraph.translateViaGraph(registerNames, variables, functions, atry.tryBody, version); - ActionItem catchName; - if (atry.catchInRegisterFlag) { - catchName = new DirectValueActionItem(atry, -1, new RegisterNumber(atry.catchRegister), new ArrayList<>()); - } else { - catchName = new DirectValueActionItem(atry, -1, atry.catchName, new ArrayList<>()); - } - List catchExceptions = new ArrayList(); - catchExceptions.add(catchName); - List> catchCommands = new ArrayList>(); - catchCommands.add(ActionGraph.translateViaGraph(registerNames, variables, functions, atry.catchBody, version)); - List finallyCommands = ActionGraph.translateViaGraph(registerNames, variables, functions, atry.finallyBody, version); - output.add(new TryActionItem(tryCommands, catchExceptions, catchCommands, finallyCommands)); - } else if (action instanceof ActionWith) { - ActionWith awith = (ActionWith) action; - List withCommands = ActionGraph.translateViaGraph(registerNames, variables, functions,new ArrayList() , version); //TODO:parse with actions - output.add(new WithActionItem(action, stack.pop(), withCommands)); - } else */ if (false) { - } /*if (action instanceof ActionStoreRegister) { - if ((ip + 1 <= end) && (actions.get(ip + 1) instanceof ActionPop)) { - action.translate(localData, stack, output); - stack.pop(); - ip++; - } else { - try { - action.translate(localData, stack, output); - } catch (Exception ex) { - // ignore - } - } - } */ /*else if (action instanceof ActionStrictEquals) { - if ((ip + 1 < actions.size()) && (actions.get(ip + 1) instanceof ActionIf)) { - List caseValues = new ArrayList(); - List> caseCommands = new ArrayList>(); - caseValues.add(stack.pop()); - ActionItem switchedObject = stack.pop(); - if (output.size() > 0) { - if (output.get(output.size() - 1) instanceof StoreRegisterActionItem) { - output.remove(output.size() - 1); - } - } - int caseStart = ip + 2; - List caseBodyIps = new ArrayList(); - long defaultAddr = 0; - caseBodyIps.add(adr2ip(actions, ((ActionIf) actions.get(ip + 1)).getRef(version), version)); - ip++; - do { - ip++; - if ((actions.get(ip - 1) instanceof ActionStrictEquals) && (actions.get(ip) instanceof ActionIf)) { - caseValues.add(actionsToStackTree(registerNames, jumpsOrIfs, actions, constants, caseStart, ip - 2, version).pop()); - caseStart = ip + 1; - caseBodyIps.add(adr2ip(actions, ((ActionIf) actions.get(ip)).getRef(version), version)); - if (actions.get(ip + 1) instanceof ActionJump) { - defaultAddr = ((ActionJump) actions.get(ip + 1)).getRef(version); - ip = adr2ip(actions, defaultAddr, version); - break; - } - } - } while (ip < end); - - for (int i = 0; i < caseBodyIps.size(); i++) { - int caseEnd = ip - 1; - if (i < caseBodyIps.size() - 1) { - caseEnd = caseBodyIps.get(i + 1) - 1; - } - caseCommands.add(actionsToTree(registerNames, unknownJumps, loopList, jumpsOrIfs, stack, constants, actions, caseBodyIps.get(i), caseEnd, version)); - } - output.add(new SwitchActionItem(action, defaultAddr, switchedObject, caseValues, caseCommands, null)); - continue; - } else { - action.translate(stack, constants, output, registerNames); - } - } */ else { - - if (action instanceof ActionStore) { - ActionStore store = (ActionStore) action; - store.setStore(actions.subList(ip + 1, ip + 1 + store.getStoreSize())); - ip = ip + 1 + store.getStoreSize() - 1/*ip++ will be next*/; - } - - action.translate(localData, stack, output, staticOperation, path); + if (action instanceof ActionStore) { + ActionStore store = (ActionStore) action; + store.setStore(actions.subList(ip + 1, ip + 1 + store.getStoreSize())); + ip = ip + 1 + store.getStoreSize() - 1/*ip++ will be next*/; } + action.translate(localData, stack, output, staticOperation, path); + ip++; } logger.log(Level.FINE, "Leaving {0}-{1}", new Object[]{start, end}); From da3cf1454c6f29f67f49e6437602b25b1b2dcdf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 28 Jan 2018 16:08:20 +0100 Subject: [PATCH 42/58] AS1/2 Try..catch with error types support - decompilation and direct editation --- CHANGELOG.md | 2 +- .../action/model/clauses/TryActionItem.java | 119 +++++++++++++++--- .../parser/script/ActionScript2Parser.java | 21 +++- .../flash/action/swf7/ActionTry.java | 102 ++++++++++++--- .../decompiler/flash/ActionScript2Test.java | 62 +++++++++ libsrc/ffdec_lib/testdata/as2/MyError.as | 4 + libsrc/ffdec_lib/testdata/as2/as2.fla | Bin 1086903 -> 1087014 bytes libsrc/ffdec_lib/testdata/as2/as2.swf | Bin 27819 -> 28066 bytes 8 files changed, 275 insertions(+), 35 deletions(-) create mode 100644 libsrc/ffdec_lib/testdata/as2/MyError.as diff --git a/CHANGELOG.md b/CHANGELOG.md index 1c0274ddc..bc2c27f95 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ All notable changes to this project will be documented in this file. ### Added - AS2 classes: maintain order of variables, and methods (place variables before methods) - AS1/2: displaying script path in the error log when jump to invalid address - +- AS1/2: Try..catch with Error types - decompilation and direct editation ### Changed - AS1/2 direct editation - generated constantpool is sorted according to ActionPush position diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/TryActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/TryActionItem.java index 42dcc5ddb..fa6fc486c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/TryActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/TryActionItem.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.action.model.clauses; import com.jpexs.decompiler.flash.SWF; @@ -20,9 +21,21 @@ import com.jpexs.decompiler.flash.SourceGeneratorLocalData; import com.jpexs.decompiler.flash.action.Action; import com.jpexs.decompiler.flash.action.model.ActionItem; import com.jpexs.decompiler.flash.action.model.ConstantPool; +import com.jpexs.decompiler.flash.action.model.DirectValueActionItem; import com.jpexs.decompiler.flash.action.parser.script.ActionSourceGenerator; +import com.jpexs.decompiler.flash.action.swf4.ActionIf; import com.jpexs.decompiler.flash.action.swf4.ActionJump; +import com.jpexs.decompiler.flash.action.swf4.ActionPop; +import com.jpexs.decompiler.flash.action.swf4.ActionPush; +import com.jpexs.decompiler.flash.action.swf4.RegisterNumber; +import com.jpexs.decompiler.flash.action.swf5.ActionDefineLocal; +import com.jpexs.decompiler.flash.action.swf5.ActionEquals2; +import com.jpexs.decompiler.flash.action.swf5.ActionPushDuplicate; +import com.jpexs.decompiler.flash.action.swf5.ActionStackSwap; +import com.jpexs.decompiler.flash.action.swf7.ActionCastOp; +import com.jpexs.decompiler.flash.action.swf7.ActionThrow; import com.jpexs.decompiler.flash.action.swf7.ActionTry; +import com.jpexs.decompiler.flash.ecma.Null; import com.jpexs.decompiler.flash.helpers.GraphTextWriter; import com.jpexs.decompiler.graph.Block; import com.jpexs.decompiler.graph.CompilationException; @@ -33,6 +46,8 @@ import com.jpexs.decompiler.graph.model.ContinueItem; import com.jpexs.decompiler.graph.model.LocalData; import java.util.ArrayList; import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; /** * @@ -42,7 +57,9 @@ public class TryActionItem extends ActionItem implements Block { public List tryCommands; - public List catchExceptions; + public List catchExceptionNames; + + public List catchExceptionTypes; public List> catchCommands; @@ -61,10 +78,11 @@ public class TryActionItem extends ActionItem implements Block { return ret; } - public TryActionItem(List tryCommands, List catchExceptions, List> catchCommands, List finallyCommands) { + public TryActionItem(List tryCommands, List catchExceptionNames, List catchExceptionTypes, List> catchCommands, List finallyCommands) { super(null, null, NOPRECEDENCE); this.tryCommands = tryCommands; - this.catchExceptions = catchExceptions; + this.catchExceptionNames = catchExceptionNames; + this.catchExceptionTypes = catchExceptionTypes; this.catchCommands = catchCommands; this.finallyCommands = finallyCommands; } @@ -73,19 +91,23 @@ public class TryActionItem extends ActionItem implements Block { public GraphTextWriter appendTo(GraphTextWriter writer, LocalData localData) throws InterruptedException { writer.append("try"); appendBlock(null, writer, localData, tryCommands); - for (int e = 0; e < catchExceptions.size(); e++) { + for (int e = 0; e < catchExceptionNames.size(); e++) { writer.newLine(); writer.append("catch"); if (writer.getFormatting().spaceBeforeParenthesesCatchParentheses) { writer.append(" "); } writer.append("("); - catchExceptions.get(e).toStringNoQuotes(writer, localData); + catchExceptionNames.get(e).toStringNoQuotes(writer, localData); + if (catchExceptionTypes.get(e) != null) { + writer.append(":"); + catchExceptionTypes.get(e).toStringNoQuotes(writer, localData); + } writer.append(")"); List commands = catchCommands.get(e); appendBlock(null, writer, localData, commands); } - if (catchExceptions.isEmpty() || finallyCommands.size() > 0) { + if (catchExceptionNames.isEmpty() || finallyCommands.size() > 0) { writer.newLine(); writer.append("finally"); appendBlock(null, writer, localData, finallyCommands); @@ -140,15 +162,82 @@ public class TryActionItem extends ActionItem implements Block { List finallyCommandsA = finallyCommands == null ? null : asGenerator.toActionList(asGenerator.generate(localData, finallyCommands)); List catchCommandsA = null; String catchName = null; - if (catchExceptions != null) { - if (!catchExceptions.isEmpty()) { - catchName = catchExceptions.get(0).toStringNoQuotes(LocalData.create(new ConstantPool(asGenerator.getConstantPool()))); - } - - } int catchSize = 0; + int catchRegister = 0; + boolean catchInRegisterFlag = false; if (catchCommands != null && !catchCommands.isEmpty()) { - catchCommandsA = asGenerator.toActionList(asGenerator.generate(localData, catchCommands.get(0))); + + List fullCatchBody = new ArrayList<>(); + + if (catchExceptionNames.size() == 1 && catchExceptionTypes.get(0) == null) { //catch everything without any type + GraphTargetItem ename = catchExceptionNames.get(0); + if (ename instanceof DirectValueActionItem) { + catchName = ((DirectValueActionItem) ename).getAsString(); + } else { + Logger.getLogger(TryActionItem.class.getName()).log(Level.SEVERE, "Invalid catchName, string expected"); + } + catchInRegisterFlag = false; + fullCatchBody = GraphTargetItem.toSourceMerge(localData, generator, catchCommands.get(0)); + } else { + catchInRegisterFlag = true; + catchRegister = asGenerator.getTempRegister(localData); + boolean allCatched = false; + for (int i = catchExceptionNames.size() - 1; i >= 0; i--) { + GraphTargetItem etype = catchExceptionTypes.get(i); + if (etype == null) { + allCatched = true; + break; + } + } + + if (!allCatched) { + fullCatchBody.addAll(0, GraphTargetItem.toSourceMerge(localData, generator, + new ActionPush(new RegisterNumber(catchRegister)), + new ActionThrow() + )); + } + + for (int i = catchExceptionNames.size() - 1; i >= 0; i--) { + GraphTargetItem ename = catchExceptionNames.get(i); + GraphTargetItem etype = catchExceptionTypes.get(i); + List ebody = catchCommands.get(i); + if (etype == null) { + fullCatchBody.addAll(0, GraphTargetItem.toSourceMerge(localData, generator, + new DirectValueActionItem(new RegisterNumber(catchRegister)), + ename, + new ActionStackSwap(), + new ActionDefineLocal(), + ebody + )); + } else { + List ifBody = GraphTargetItem.toSourceMerge(localData, generator, + ename, + new ActionStackSwap(), + new ActionDefineLocal(), + ebody); + fullCatchBody.add(0, new ActionPop()); + int toFinishSize = Action.actionsToBytes(asGenerator.toActionList(fullCatchBody), false, SWF.DEFAULT_VERSION).length; + ActionJump finishJump = new ActionJump(toFinishSize); + ifBody.add(finishJump); + List ifBodyA = asGenerator.toActionList(ifBody); + int ifBodySize = Action.actionsToBytes(ifBodyA, false, SWF.DEFAULT_VERSION).length; + fullCatchBody.addAll(0, ifBody); + fullCatchBody.addAll(0, + GraphTargetItem.toSourceMerge(localData, generator, + etype, + new ActionPush(new RegisterNumber(catchRegister)), + new ActionCastOp(), + new ActionPushDuplicate(), + new ActionPush(Null.INSTANCE), + new ActionEquals2(), + new ActionIf(ifBodySize) + )); + + } + } + asGenerator.releaseTempRegister(localData, catchRegister); + } + catchCommandsA = asGenerator.toActionList(fullCatchBody); catchSize = Action.actionsToBytes(catchCommandsA, false, SWF.DEFAULT_VERSION).length; tryCommandsA.add(new ActionJump(catchSize)); } @@ -157,7 +246,7 @@ public class TryActionItem extends ActionItem implements Block { finallySize = Action.actionsToBytes(finallyCommandsA, false, SWF.DEFAULT_VERSION).length; } int trySize = Action.actionsToBytes(tryCommandsA, false, SWF.DEFAULT_VERSION).length; - ret.add(new ActionTry(false, finallyCommands != null, catchCommands != null, catchName, 0, trySize, catchSize, finallySize, SWF.DEFAULT_VERSION)); + ret.add(new ActionTry(catchInRegisterFlag, finallyCommands != null, catchCommands != null, catchName, catchRegister, trySize, catchSize, finallySize, SWF.DEFAULT_VERSION)); ret.addAll(tryCommandsA); if (catchCommandsA != null) { ret.addAll(catchCommandsA); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2Parser.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2Parser.java index 3b41a5fac..9e506a13a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2Parser.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2Parser.java @@ -1152,14 +1152,25 @@ public class ActionScript2Parser { s = lex(); boolean found = false; List> catchCommands = null; - List catchExceptions = new ArrayList<>(); - if (s.type == SymbolType.CATCH) { + List catchExceptionNames = new ArrayList<>(); + List catchExceptionTypes = new ArrayList<>(); + + while (s.type == SymbolType.CATCH) { expectedType(SymbolType.PARENT_OPEN); s = lex(); expected(s, lexer.yyline(), SymbolType.IDENTIFIER, SymbolType.STRING); - catchExceptions.add(pushConst((String) s.value)); + catchExceptionNames.add(pushConst((String) s.value)); + s = lex(); + if (s.type == SymbolType.COLON) { + catchExceptionTypes.add(type(variables)); + } else { + catchExceptionTypes.add(null); + lexer.pushback(s); + } expectedType(SymbolType.PARENT_CLOSE); - catchCommands = new ArrayList<>(); + if (catchCommands == null) { + catchCommands = new ArrayList<>(); + } List cc = new ArrayList<>(); cc.add(command(inFunction, inMethod, forinlevel, true, variables, functions)); catchCommands.add(cc); @@ -1177,7 +1188,7 @@ public class ActionScript2Parser { expected(s, lexer.yyline(), SymbolType.CATCH, SymbolType.FINALLY); } lexer.pushback(s); - ret = new TryActionItem(tryCommands, catchExceptions, catchCommands, finallyCommands); + ret = new TryActionItem(tryCommands, catchExceptionNames, catchExceptionTypes, catchCommands, finallyCommands); break; case THROW: ret = new ThrowActionItem(null, null, expression(inFunction, inMethod, true, variables, functions)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionTry.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionTry.java index f5cdc4667..f10f44463 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionTry.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionTry.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.action.swf7; import com.jpexs.decompiler.flash.SWFInputStream; @@ -21,12 +22,16 @@ import com.jpexs.decompiler.flash.action.Action; import com.jpexs.decompiler.flash.action.ActionList; import com.jpexs.decompiler.flash.action.LocalDataArea; import com.jpexs.decompiler.flash.action.model.ActionItem; +import com.jpexs.decompiler.flash.action.model.CastOpActionItem; +import com.jpexs.decompiler.flash.action.model.DefineLocalActionItem; import com.jpexs.decompiler.flash.action.model.DirectValueActionItem; +import com.jpexs.decompiler.flash.action.model.ThrowActionItem; import com.jpexs.decompiler.flash.action.model.clauses.TryActionItem; import com.jpexs.decompiler.flash.action.parser.ActionParseException; import com.jpexs.decompiler.flash.action.parser.pcode.ASMParsedSymbol; import com.jpexs.decompiler.flash.action.parser.pcode.FlasmLexer; import com.jpexs.decompiler.flash.action.swf4.RegisterNumber; +import com.jpexs.decompiler.flash.ecma.Null; import com.jpexs.decompiler.flash.exporters.modes.ScriptExportMode; import com.jpexs.decompiler.flash.types.annotations.Reserved; import com.jpexs.decompiler.flash.types.annotations.SWFVersion; @@ -34,6 +39,9 @@ import com.jpexs.decompiler.graph.GraphSourceItem; import com.jpexs.decompiler.graph.GraphSourceItemContainer; import com.jpexs.decompiler.graph.GraphTargetItem; import com.jpexs.decompiler.graph.TranslateStack; +import com.jpexs.decompiler.graph.model.IfItem; +import com.jpexs.decompiler.graph.model.PopItem; +import com.jpexs.decompiler.graph.model.PushItem; import com.jpexs.helpers.Helper; import com.jpexs.helpers.utf8.Utf8Helper; import java.io.IOException; @@ -274,23 +282,89 @@ public class ActionTry extends Action implements GraphSourceItemContainer { @Override public void translateContainer(List> contents, GraphSourceItem lineStartItem, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions) { List tryCommands = contents.get(0); - ActionItem catchName; - if (catchInRegisterFlag) { - catchName = new DirectValueActionItem(this, lineStartItem, -1, new RegisterNumber(this.catchRegister), new ArrayList<>()); - } else { - catchName = new DirectValueActionItem(this, lineStartItem, -1, this.catchName, new ArrayList<>()); - } - List catchExceptions = new ArrayList<>(); - if (catchBlockFlag) { - catchExceptions.add(catchName); - } + + List catchExceptionNames = new ArrayList<>(); + List catchExceptionTypes = new ArrayList<>(); List> catchCommands = new ArrayList<>(); + if (catchBlockFlag) { - catchCommands.add(contents.get(1)); + List body = contents.get(1); + if (catchInRegisterFlag) { + //catchName = new DirectValueActionItem(this, lineStartItem, -1, new RegisterNumber(this.catchRegister), new ArrayList<>()); + if (body.size() >= 2) { + int pos = 0; + loopex: + while (body.get(pos) instanceof PushItem) { + PushItem pi = (PushItem) body.get(pos); + if (pi.value instanceof CastOpActionItem) { + CastOpActionItem co = (CastOpActionItem) pi.value; + if ((co.object instanceof DirectValueActionItem) && (((DirectValueActionItem) co.object).value instanceof RegisterNumber)) { + RegisterNumber rn = (RegisterNumber) ((DirectValueActionItem) co.object).value; + if (rn.number == catchRegister) { + catchExceptionTypes.add(co.constructor); + if (body.get(pos + 1) instanceof IfItem) { + IfItem ifi = (IfItem) body.get(pos + 1); + if (!ifi.onTrue.isEmpty()) { + if (ifi.onTrue.get(0) instanceof DefineLocalActionItem) { + DefineLocalActionItem dl = (DefineLocalActionItem) ifi.onTrue.get(0); + catchExceptionNames.add(dl.name); + List catchBody = new ArrayList<>(ifi.onTrue); + catchBody.remove(0); + catchCommands.add(catchBody); + if (!ifi.onFalse.isEmpty()) { + if (ifi.onFalse.get(0) instanceof PopItem) { + pos = 1; + body = ifi.onFalse; + continue loopex; + } else { + break; + } + } else { + break; + } + /*if (body.size() == pos + 4) { + if (body.get(pos + 2) instanceof PopItem) { + if (body.get(pos + 3) instanceof ThrowActionItem) { + ThrowActionItem ta = (ThrowActionItem) body.get(pos + 3); + if (ta.value instanceof DirectValueActionItem) { + if (((DirectValueActionItem) ta.value).value instanceof RegisterNumber) { + RegisterNumber rn2 = (RegisterNumber) ((DirectValueActionItem) ta.value).value; + if (rn2.number == catchRegister) { + break; + } + } + } + } + } + }else{ + + }*/ + } + } + } + } + } + + } + } + if (body.get(pos) instanceof DefineLocalActionItem) { + DefineLocalActionItem dl = (DefineLocalActionItem) body.get(pos); + catchExceptionNames.add(dl.name); + catchExceptionTypes.add(null); + List catchBody = new ArrayList<>(body); + catchBody.remove(0); //pop + catchBody.remove(0); //definelocal + catchCommands.add(catchBody); + } + } + } else { + catchExceptionNames.add(new DirectValueActionItem(this, lineStartItem, -1, this.catchName, new ArrayList<>())); + catchExceptionTypes.add(null); + catchCommands.add(body); + } } List finallyCommands = contents.get(2); - output.add(new TryActionItem(tryCommands, catchExceptions, catchCommands, finallyCommands)); - + output.add(new TryActionItem(tryCommands, catchExceptionNames, catchExceptionTypes, catchCommands, finallyCommands)); } @Override diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java index 73652164e..c557b9895 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java @@ -1873,4 +1873,66 @@ public class ActionScript2Test extends ActionScript2TestBase { + "trace(\"switchVariantsTest\");\r\n" ); } + + @Test + public void frame68_tryTypeTest() { + compareSrc(68, "trace(\"tryTypeTest\");\r\n" + + "var a = 5;\r\n" + + "try\r\n" + + "{\r\n" + + "a = a / 0;\r\n" + + "}\r\n" + + "catch(e)\r\n" + + "{\r\n" + + "trace(\"err:\" + e);\r\n" + + "}\r\n" + + "try\r\n" + + "{\r\n" + + "a = a / 0;\r\n" + + "}\r\n" + + "catch(e)\r\n" + + "{\r\n" + + "if(a == 0)\r\n" + + "{\r\n" + + "throw e;\r\n" + + "}\r\n" + + "else\r\n" + + "{\r\n" + + "trace(\"err:\" + e);\r\n" + + "}\r\n" + + "}\r\n" + + "try\r\n" + + "{\r\n" + + "a = a / 0;\r\n" + + "}\r\n" + + "catch(e:MyError)\r\n" + + "{\r\n" + + "trace(\"err:\" + e);\r\n" + + "}\r\n" + + "try\r\n" + + "{\r\n" + + "a = a / 0;\r\n" + + "}\r\n" + + "catch(e1:MyError)\r\n" + + "{\r\n" + + "trace(\"err:\" + e1);\r\n" + + "}\r\n" + + "catch(e2)\r\n" + + "{\r\n" + + "trace(\"err:\" + e2);\r\n" + + "}\r\n" + + "try\r\n" + + "{\r\n" + + "a = a / 0;\r\n" + + "}\r\n" + + "catch(e:MyError)\r\n" + + "{\r\n" + + "trace(\"err:\" + e);\r\n" + + "}\r\n" + + "catch(e2:Error)\r\n" + + "{\r\n" + + "trace(\"err:\" + e2);\r\n" + + "}\r\n" + ); + } } diff --git a/libsrc/ffdec_lib/testdata/as2/MyError.as b/libsrc/ffdec_lib/testdata/as2/MyError.as new file mode 100644 index 000000000..17155b011 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/as2/MyError.as @@ -0,0 +1,4 @@ +class MyError extends Error +{ + var message = "My custom error occurred"; +} \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/as2/as2.fla b/libsrc/ffdec_lib/testdata/as2/as2.fla index cad3e071e176477e607ffef6a9b4ed0b9743efa4..a84106d3808a54f451155110493497f9e1400597 100644 GIT binary patch delta 11287 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 KfI1HNuKouyqWLcX diff --git a/libsrc/ffdec_lib/testdata/as2/as2.swf b/libsrc/ffdec_lib/testdata/as2/as2.swf index c9832c61c8e2ea9c478a8156c91b55774068db09..58a2056d815013887748c558aec013e58196345b 100644 GIT binary patch delta 22627 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%0DhV`<&C`Cr3P>^1@$buMbO@&R(k}fA0ubGos_j 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 From eca98106d2a569f7a46579ab9b0e879d4ceb7348 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Mon, 29 Jan 2018 22:13:59 +0100 Subject: [PATCH 43/58] AS1/2: Properly handling of Flash7 scripts exported to Flash5/6 - ActionDefineFunction local registers --- CHANGELOG.md | 2 + .../src/com/jpexs/decompiler/flash/SWF.java | 22 +- .../jpexs/decompiler/flash/action/Action.java | 18 +- ...ionDefineFunctionPushRegistersCleaner.java | 225 ++++++++++++++++++ .../decompiler/flash/action/ActionGraph.java | 16 +- .../flash/action/ActionGraphSource.java | 7 +- .../flash/action/ActionLocalData.java | 2 + .../action/flashlite/ActionFSCommand2.java | 2 +- .../action/flashlite/ActionStrictMode.java | 2 +- .../flash/action/special/ActionEnd.java | 2 +- .../flash/action/special/ActionNop.java | 2 +- .../flash/action/special/ActionUnknown.java | 2 +- .../flash/action/swf3/ActionGetURL.java | 2 +- .../flash/action/swf3/ActionGoToLabel.java | 2 +- .../flash/action/swf3/ActionGotoFrame.java | 2 +- .../flash/action/swf3/ActionNextFrame.java | 2 +- .../flash/action/swf3/ActionPlay.java | 2 +- .../flash/action/swf3/ActionPrevFrame.java | 2 +- .../flash/action/swf3/ActionSetTarget.java | 2 +- .../flash/action/swf3/ActionStop.java | 2 +- .../flash/action/swf3/ActionStopSounds.java | 2 +- .../action/swf3/ActionToggleQuality.java | 2 +- .../flash/action/swf3/ActionWaitForFrame.java | 4 +- .../flash/action/swf4/ActionAdd.java | 5 +- .../flash/action/swf4/ActionAnd.java | 2 +- .../flash/action/swf4/ActionAsciiToChar.java | 2 +- .../flash/action/swf4/ActionCall.java | 2 +- .../flash/action/swf4/ActionCharToAscii.java | 2 +- .../flash/action/swf4/ActionCloneSprite.java | 2 +- .../flash/action/swf4/ActionDivide.java | 2 +- .../flash/action/swf4/ActionEndDrag.java | 2 +- .../flash/action/swf4/ActionEquals.java | 2 +- .../flash/action/swf4/ActionGetProperty.java | 2 +- .../flash/action/swf4/ActionGetTime.java | 2 +- .../flash/action/swf4/ActionGetURL2.java | 2 +- .../flash/action/swf4/ActionGetVariable.java | 2 +- .../flash/action/swf4/ActionGotoFrame2.java | 2 +- .../flash/action/swf4/ActionLess.java | 2 +- .../action/swf4/ActionMBAsciiToChar.java | 2 +- .../action/swf4/ActionMBCharToAscii.java | 2 +- .../action/swf4/ActionMBStringExtract.java | 2 +- .../action/swf4/ActionMBStringLength.java | 2 +- .../flash/action/swf4/ActionMultiply.java | 2 +- .../flash/action/swf4/ActionNot.java | 2 +- .../flash/action/swf4/ActionOr.java | 2 +- .../flash/action/swf4/ActionPop.java | 2 +- .../flash/action/swf4/ActionPush.java | 2 +- .../flash/action/swf4/ActionRandomNumber.java | 2 +- .../flash/action/swf4/ActionRemoveSprite.java | 2 +- .../flash/action/swf4/ActionSetProperty.java | 2 +- .../flash/action/swf4/ActionSetTarget2.java | 2 +- .../flash/action/swf4/ActionSetVariable.java | 2 +- .../flash/action/swf4/ActionStartDrag.java | 2 +- .../flash/action/swf4/ActionStringAdd.java | 2 +- .../flash/action/swf4/ActionStringEquals.java | 2 +- .../action/swf4/ActionStringExtract.java | 2 +- .../flash/action/swf4/ActionStringLength.java | 2 +- .../flash/action/swf4/ActionStringLess.java | 2 +- .../flash/action/swf4/ActionSubtract.java | 2 +- .../flash/action/swf4/ActionToInteger.java | 2 +- .../flash/action/swf4/ActionTrace.java | 2 +- .../action/swf4/ActionWaitForFrame2.java | 4 +- .../flash/action/swf5/ActionAdd2.java | 2 +- .../flash/action/swf5/ActionBitAnd.java | 2 +- .../flash/action/swf5/ActionBitLShift.java | 2 +- .../flash/action/swf5/ActionBitOr.java | 2 +- .../flash/action/swf5/ActionBitRShift.java | 2 +- .../flash/action/swf5/ActionBitURShift.java | 2 +- .../flash/action/swf5/ActionBitXor.java | 2 +- .../flash/action/swf5/ActionCallFunction.java | 2 +- .../flash/action/swf5/ActionCallMethod.java | 2 +- .../flash/action/swf5/ActionConstantPool.java | 2 +- .../flash/action/swf5/ActionDecrement.java | 2 +- .../action/swf5/ActionDefineFunction.java | 2 +- .../flash/action/swf5/ActionDefineLocal.java | 2 +- .../flash/action/swf5/ActionDefineLocal2.java | 2 +- .../flash/action/swf5/ActionDelete.java | 2 +- .../flash/action/swf5/ActionDelete2.java | 2 +- .../flash/action/swf5/ActionEnumerate.java | 2 +- .../flash/action/swf5/ActionEquals2.java | 2 +- .../flash/action/swf5/ActionGetMember.java | 2 +- .../flash/action/swf5/ActionIncrement.java | 2 +- .../flash/action/swf5/ActionInitArray.java | 2 +- .../flash/action/swf5/ActionInitObject.java | 2 +- .../flash/action/swf5/ActionLess2.java | 2 +- .../flash/action/swf5/ActionModulo.java | 2 +- .../flash/action/swf5/ActionNewMethod.java | 2 +- .../flash/action/swf5/ActionNewObject.java | 2 +- .../action/swf5/ActionPushDuplicate.java | 2 +- .../flash/action/swf5/ActionReturn.java | 2 +- .../flash/action/swf5/ActionSetMember.java | 2 +- .../flash/action/swf5/ActionStackSwap.java | 2 +- .../action/swf5/ActionStoreRegister.java | 2 +- .../flash/action/swf5/ActionTargetPath.java | 2 +- .../flash/action/swf5/ActionToNumber.java | 2 +- .../flash/action/swf5/ActionToString.java | 2 +- .../flash/action/swf5/ActionTypeOf.java | 2 +- .../flash/action/swf6/ActionEnumerate2.java | 2 +- .../flash/action/swf6/ActionGreater.java | 2 +- .../flash/action/swf6/ActionInstanceOf.java | 2 +- .../flash/action/swf6/ActionStrictEquals.java | 2 +- .../action/swf6/ActionStringGreater.java | 2 +- .../flash/action/swf7/ActionCastOp.java | 2 +- .../action/swf7/ActionDefineFunction2.java | 2 +- .../flash/action/swf7/ActionExtends.java | 2 +- .../flash/action/swf7/ActionImplementsOp.java | 2 +- .../flash/action/swf7/ActionThrow.java | 2 +- .../src/com/jpexs/decompiler/graph/Graph.java | 5 + ...DefineFunctionPushRegisterCleanerTest.java | 136 +++++++++++ .../testdata/as2_definefunc_regs/MyClass.as | 37 +++ .../as2_definefunc_regs.fla | Bin 0 -> 21504 bytes .../as2_definefunc_regs.html | 18 ++ .../as2_definefunc_regs.swf | Bin 0 -> 415 bytes .../testdata/as2_definefunc_regs/readme.txt | 6 + .../flash/gui/action/ActionPanel.java | 2 +- 115 files changed, 573 insertions(+), 130 deletions(-) create mode 100644 libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionDefineFunctionPushRegistersCleaner.java create mode 100644 libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionDefineFunctionPushRegisterCleanerTest.java create mode 100644 libsrc/ffdec_lib/testdata/as2_definefunc_regs/MyClass.as create mode 100644 libsrc/ffdec_lib/testdata/as2_definefunc_regs/as2_definefunc_regs.fla create mode 100644 libsrc/ffdec_lib/testdata/as2_definefunc_regs/as2_definefunc_regs.html create mode 100644 libsrc/ffdec_lib/testdata/as2_definefunc_regs/as2_definefunc_regs.swf create mode 100644 libsrc/ffdec_lib/testdata/as2_definefunc_regs/readme.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index bc2c27f95..34cde5a52 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,8 @@ All notable changes to this project will be documented in this file. - AS2 classes: maintain order of variables, and methods (place variables before methods) - AS1/2: displaying script path in the error log when jump to invalid address - AS1/2: Try..catch with Error types - decompilation and direct editation +- AS1/2: Properly handling of Flash7 scripts exported to Flash5/6 - ActionDefineFunction local registers + ### Changed - AS1/2 direct editation - generated constantpool is sorted according to ActionPush position diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java index 1b3da466d..1887061b7 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java @@ -2035,7 +2035,7 @@ public final class SWF implements SWFContainerItem, Timelined { ip = code.adr2pos(addr); addr += size; int nextip = code.adr2pos(addr); - getVariables(aLocalData.insideDoInitAction, variables, functions, strings, usageTypes, new ActionGraphSource(path, aLocalData.insideDoInitAction, code.getActions().subList(ip, nextip), code.version, new HashMap<>(), new HashMap<>(), new HashMap<>()), 0, path + (cntName == null ? "" : "/" + cntName)); + getVariables(aLocalData.insideDoInitAction, variables, functions, strings, usageTypes, new ActionGraphSource(path, aLocalData.insideDoInitAction, (ins instanceof ActionDefineFunction), code.getActions().subList(ip, nextip), code.version, new HashMap<>(), new HashMap<>(), new HashMap<>()), 0, path + (cntName == null ? "" : "/" + cntName)); ip = nextip; } List> r = new ArrayList<>(); @@ -2131,35 +2131,35 @@ public final class SWF implements SWFContainerItem, Timelined { getVariables(null, localData, new TranslateStack(path), new ArrayList<>(), code, code.adr2pos(addr), variables, functions, strings, new ArrayList<>(), usageTypes, path); } - private List> getVariables(List> variables, HashMap actionsMap, List functions, HashMap strings, HashMap usageTypes, ASMSource src, String path) throws InterruptedException { + private List> getVariables(boolean insideDefineFunction1, List> variables, HashMap actionsMap, List functions, HashMap strings, HashMap usageTypes, ASMSource src, String path) throws InterruptedException { List> ret = new ArrayList<>(); ActionList actions = src.getActions(); actionsMap.put(src, actions); boolean insideDoInitAction = src instanceof DoInitActionTag; - getVariables(insideDoInitAction, variables, functions, strings, usageTypes, new ActionGraphSource(path, insideDoInitAction, actions, version, new HashMap<>(), new HashMap<>(), new HashMap<>()), 0, path); + getVariables(insideDoInitAction, variables, functions, strings, usageTypes, new ActionGraphSource(path, insideDoInitAction, insideDefineFunction1, actions, version, new HashMap<>(), new HashMap<>(), new HashMap<>()), 0, path); return ret; } - private void getVariables(Iterable tags, String path, List> variables, HashMap actionsMap, List functions, HashMap strings, HashMap usageTypes) throws InterruptedException { + private void getVariables(boolean insideDefineFunction1, Iterable tags, String path, List> variables, HashMap actionsMap, List functions, HashMap strings, HashMap usageTypes) throws InterruptedException { List processed = new ArrayList<>(); for (Tag t : tags) { String subPath = path + "/" + t.toString(); if (t instanceof ASMSource) { - addVariable((ASMSource) t, subPath, processed, variables, actionsMap, functions, strings, usageTypes); + addVariable(insideDefineFunction1, (ASMSource) t, subPath, processed, variables, actionsMap, functions, strings, usageTypes); } if (t instanceof ASMSourceContainer) { List processed2 = new ArrayList<>(); for (ASMSource asm : ((ASMSourceContainer) t).getSubItems()) { - addVariable(asm, subPath + "/" + asm.toString(), processed2, variables, actionsMap, functions, strings, usageTypes); + addVariable(insideDefineFunction1, asm, subPath + "/" + asm.toString(), processed2, variables, actionsMap, functions, strings, usageTypes); } } if (t instanceof DefineSpriteTag) { - getVariables(((DefineSpriteTag) t).getTags(), path + "/" + t.toString(), variables, actionsMap, functions, strings, usageTypes); + getVariables(insideDefineFunction1, ((DefineSpriteTag) t).getTags(), path + "/" + t.toString(), variables, actionsMap, functions, strings, usageTypes); } } } - private void addVariable(ASMSource asm, String path, List processed, List> variables, HashMap actionsMap, List functions, HashMap strings, HashMap usageTypes) throws InterruptedException { + private void addVariable(boolean insideDefineFunction1, ASMSource asm, String path, List processed, List> variables, HashMap actionsMap, List functions, HashMap strings, HashMap usageTypes) throws InterruptedException { int pos = 1; String infPath2 = path; while (processed.contains(infPath2)) { @@ -2168,7 +2168,7 @@ public final class SWF implements SWFContainerItem, Timelined { } processed.add(infPath2); informListeners("getVariables", infPath2); - getVariables(variables, actionsMap, functions, strings, usageTypes, asm, path); + getVariables(insideDefineFunction1, variables, actionsMap, functions, strings, usageTypes, asm, path); } public boolean as3StringConstantExists(String str) { @@ -2257,7 +2257,7 @@ public final class SWF implements SWFContainerItem, Timelined { HashMap usageTypes = new HashMap<>(); int ret = 0; - getVariables(getTags(), "", allVariableNames, actionsMap, allFunctions, allStrings, usageTypes); + getVariables(false, getTags(), "", allVariableNames, actionsMap, allFunctions, allStrings, usageTypes); informListeners("rename", ""); int fc = 0; for (MyEntry it : allVariableNames) { @@ -2292,7 +2292,7 @@ public final class SWF implements SWFContainerItem, Timelined { int staticOperation = Graph.SOP_USE_STATIC; //(Boolean) Configuration.getConfig("autoDeobfuscate", true) ? Graph.SOP_SKIP_STATIC : Graph.SOP_USE_STATIC; List dec; try { - dec = Action.actionsToTree(true /*Yes, inside doInitAction*/, dia.getActions(), version, staticOperation, ""/*FIXME*/); + dec = Action.actionsToTree(true /*Yes, inside doInitAction*/, false, dia.getActions(), version, staticOperation, ""/*FIXME*/); } catch (EmptyStackException ex) { continue; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java index d52275288..b674cffc5 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java @@ -760,7 +760,7 @@ public abstract class Action implements GraphSourceItem { * @param path the value of path * @throws java.lang.InterruptedException */ - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartIns, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) throws InterruptedException { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartIns, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) throws InterruptedException { } @Override @@ -836,8 +836,8 @@ public abstract class Action implements GraphSourceItem { return -1; } - public static List actionsToTree(boolean insideDoInitAction, List actions, int version, int staticOperation, String path) throws InterruptedException { - return actionsToTree(insideDoInitAction, new HashMap<>(), new HashMap<>(), new HashMap<>(), actions, version, staticOperation, path); + public static List actionsToTree(boolean insideDoInitAction, boolean insideDefineFunction1, List actions, int version, int staticOperation, String path) throws InterruptedException { + return actionsToTree(insideDoInitAction, insideDefineFunction1, new HashMap<>(), new HashMap<>(), new HashMap<>(), actions, version, staticOperation, path); } /** @@ -863,7 +863,7 @@ public abstract class Action implements GraphSourceItem { public List call() throws Exception { int staticOperation = Graph.SOP_USE_STATIC; //(Boolean) Configuration.getConfig("autoDeobfuscate", true) ? Graph.SOP_SKIP_STATIC : Graph.SOP_USE_STATIC; boolean insideDoInitAction = (asm instanceof DoInitActionTag); - List tree = actionsToTree(insideDoInitAction, new HashMap<>(), new HashMap<>(), new HashMap<>(), actions, version, staticOperation, path); + List tree = actionsToTree(insideDoInitAction, false, new HashMap<>(), new HashMap<>(), new HashMap<>(), actions, version, staticOperation, path); SWFDecompilerPlugin.fireActionTreeCreated(tree, swf); if (Configuration.autoDeobfuscate.get()) { new ActionDeobfuscator().actionTreeCreated(tree, swf); @@ -921,8 +921,8 @@ public abstract class Action implements GraphSourceItem { * @return List of treeItems * @throws java.lang.InterruptedException */ - public static List actionsToTree(boolean insideDoInitAction, HashMap regNames, HashMap variables, HashMap functions, List actions, int version, int staticOperation, String path) throws InterruptedException { - return ActionGraph.translateViaGraph(insideDoInitAction, regNames, variables, functions, actions, version, staticOperation, path); + public static List actionsToTree(boolean insideDoInitAction, boolean insideDefineFunction1, HashMap regNames, HashMap variables, HashMap functions, List actions, int version, int staticOperation, String path) throws InterruptedException { + return ActionGraph.translateViaGraph(insideDoInitAction, insideDefineFunction1, regNames, variables, functions, actions, version, staticOperation, path); } @Override @@ -934,7 +934,7 @@ public abstract class Action implements GraphSourceItem { } expectedSize += getStackPushCount(localData, stack);*/ - translate(aLocalData.insideDoInitAction, aLocalData.lineStartAction, stack, output, aLocalData.regNames, aLocalData.variables, aLocalData.functions, staticOperation, path); + translate(aLocalData.insideDoInitAction, aLocalData.insideDefineFunction1, aLocalData.lineStartAction, stack, output, aLocalData.regNames, aLocalData.variables, aLocalData.functions, staticOperation, path); /*if (stack.size() != expectedSize && !(this instanceof ActionPushDuplicate)) { throw new Error("HONFIKA stack size mismatch"); }*/ @@ -970,7 +970,7 @@ public abstract class Action implements GraphSourceItem { this.ignored = ignored; } - public static List actionsPartToTree(boolean insideDoInitAction, Reference fi, HashMap registerNames, HashMap variables, HashMap functions, TranslateStack stack, List actions, int start, int end, int version, int staticOperation, String path) throws InterruptedException { + public static List actionsPartToTree(boolean insideDoInitAction, boolean insideDefineFunction1, Reference fi, HashMap registerNames, HashMap variables, HashMap functions, TranslateStack stack, List actions, int start, int end, int version, int staticOperation, String path) throws InterruptedException { if (start < actions.size() && (end > 0) && (start > 0)) { logger.log(Level.FINE, "Entering {0}-{1}{2}", new Object[]{start, end, actions.size() > 0 ? (" (" + actions.get(start).toString() + " - " + actions.get(end == actions.size() ? end - 1 : end) + ")") : ""}); } @@ -1044,7 +1044,7 @@ public abstract class Action implements GraphSourceItem { } } } - out = ActionGraph.translateViaGraph(insideDoInitAction, regNames, variables2, functions, actions.subList(adr2ip(actions, endAddr), adr2ip(actions, endAddr + size)), version, staticOperation, path + (cntName == null ? "" : "/" + cntName)); + out = ActionGraph.translateViaGraph(insideDoInitAction, (cnt instanceof ActionDefineFunction), regNames, variables2, functions, actions.subList(adr2ip(actions, endAddr), adr2ip(actions, endAddr + size)), version, staticOperation, path + (cntName == null ? "" : "/" + cntName)); } catch (OutOfMemoryError | TranslateException | StackOverflowError ex) { logger.log(Level.SEVERE, "Decompilation error in: " + path, ex); if (ex instanceof OutOfMemoryError) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionDefineFunctionPushRegistersCleaner.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionDefineFunctionPushRegistersCleaner.java new file mode 100644 index 000000000..704c8c8c4 --- /dev/null +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionDefineFunctionPushRegistersCleaner.java @@ -0,0 +1,225 @@ +/* + * Copyright (C) 2010-2018 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.flash.action; + +import com.jpexs.decompiler.flash.action.swf4.ActionJump; +import com.jpexs.decompiler.flash.action.swf4.ActionPop; +import com.jpexs.decompiler.flash.action.swf4.ActionPush; +import com.jpexs.decompiler.flash.action.swf4.RegisterNumber; +import com.jpexs.decompiler.flash.action.swf5.ActionReturn; +import com.jpexs.decompiler.flash.action.swf5.ActionStoreRegister; +import com.jpexs.decompiler.flash.ecma.Undefined; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.Iterator; +import java.util.List; +import java.util.Set; +import java.util.TreeSet; + +/** + * Cleaner for ActionDefineFunction push registers. From Flash 7 onwards, + * functions are stored as ActionDefineFunction2 with use up to 255 local + * registers. When exporting SWF to lower formats Flash5-Flash6 in Flash IDE + * (for example MX 2004), all ActionDefineFunction2 are replaced with + * ActionDefineFunction, and it also use local registers (4 of them are + * available). The code of ActionDefineFunction is also modified that it pushes + * all previous values of registers on the code start and pops them back on code + * exit or when return action shows up. All returns are replaced with jump to + * popping part. This makes code flow tangled and the decompiler cannot properly + * handle it. The cleaner will fix this mess. + * + * @author JPEXS + */ +public class ActionDefineFunctionPushRegistersCleaner { + + public List cleanPushRegisters(List code) { + ActionList actionList = new ActionList(code); + + if (actionList.isEmpty()) { + return code; + } + + /* + ON BEGINNING: + Push register1 register2 normalval + */ + List pushedRegisters = new ArrayList<>(); + int pos = 0; + loopregs: + while (actionList.get(pos) instanceof ActionPush) { + ActionPush ap = (ActionPush) actionList.get(pos); + for (int i = 0; i < ap.values.size(); i++) { + if (ap.values.get(i) instanceof RegisterNumber) { + RegisterNumber rn = (RegisterNumber) ap.values.get(i); + pushedRegisters.add(rn.number); + } else { + break loopregs; + } + } + pos++; + } + if (pushedRegisters.isEmpty()) { + return code; + } + + /* + ON FINISH: + + when function returns something: + StoreRegister 0 ;return value + Pop + StoreRegister 2 + Pop + StoreRegister 1 + Pop + Push register0 + Return + + when function does not return anything: + StoreRegister 2 + Pop + StoreRegister 1 + Pop + + + */ + int returnReg = -1; + pos = actionList.size() - 1; + if (actionList.get(pos) instanceof ActionReturn) { + pos--; + if (pos == -1) { + return code; + } + if (!(actionList.get(pos) instanceof ActionPush)) { + return code; + } + ActionPush pu = (ActionPush) actionList.get(pos); + if (pu.values.size() != 1) { + return code; + } + if (!(pu.values.get(0) instanceof RegisterNumber)) { + return code; + } + RegisterNumber rn = (RegisterNumber) pu.values.get(0); + returnReg = rn.number; + pos--; + if (pos == -1) { + return code; + } + } + for (int i = 0; i < pushedRegisters.size(); i++) { + if (!(actionList.get(pos) instanceof ActionPop)) { + return code; + } + pos--; + if (pos == -1) { + return code; + } + if (!(actionList.get(pos) instanceof ActionStoreRegister)) { + return code; + } + ActionStoreRegister asr = (ActionStoreRegister) actionList.get(pos); + int expectedReg = pushedRegisters.get(i); + if (asr.registerNumber != expectedReg) { + return code; + } + pos--; + if (pos == -1) { + return code; + } + } + + Set refPos = new TreeSet<>(new Comparator() { + @Override + public int compare(Integer o1, Integer o2) { + return o2 - o1; //biggest first + } + }); + if (returnReg > -1) { + if (!(actionList.get(pos) instanceof ActionPop)) { + return code; + } + pos--; + if (pos == -1) { + return code; + } + if (!(actionList.get(pos) instanceof ActionStoreRegister)) { + return code; + } + ActionStoreRegister asr = (ActionStoreRegister) actionList.get(pos); + int expectedReg = returnReg; + if (asr.registerNumber != expectedReg) { + return code; + } + + if (!(actionList.get(pos - 1) instanceof ActionJump)) { + refPos.add(pos - 1); + } + Iterator ait = actionList.getReferencesFor(asr); + while (ait.hasNext()) { + Action a = ait.next(); + refPos.add(actionList.indexOf(a)); + } + pos--; + } + + //process code... + //TODO: make this somehow create new list instead of modifying current one + for (Integer jp : refPos) { + int index = jp; + Action a = actionList.get(index); + if (a instanceof ActionJump) { + actionList.remove(index); + actionList.addAction(index, new ActionReturn()); + } else if ((a instanceof ActionPush) && ((ActionPush) a).values.size() == 1 && ((ActionPush) a).values.get(0) == Undefined.INSTANCE) { + actionList.remove(a); + } else { + actionList.addAction(index + 1, new ActionReturn()); + pos++; + } + } + + int posFromEnd = actionList.size() - pos - 1; + + actionList.removeAction(actionList.size() - posFromEnd, posFromEnd); + + pos = 0; + int removedCnt = pushedRegisters.size(); + loopregs2: + while (actionList.get(pos) instanceof ActionPush) { + ActionPush ap = (ActionPush) actionList.get(pos); + for (int i = 0; i < ap.values.size(); i++) { + if (ap.values.get(i) instanceof RegisterNumber) { + ap.values.remove(i); + i--; + removedCnt--; + if (ap.values.isEmpty()) { + actionList.removeAction(pos); + } + if (removedCnt == 0) { + break loopregs2; + } + } else { + break loopregs2; + } + } + pos++; + } + + return actionList; + } +} diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java index 3d673c633..a8ec73a74 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java @@ -65,8 +65,8 @@ public class ActionGraph extends Graph { private boolean insideDoInitAction; - public ActionGraph(String path, boolean insideDoInitAction, List code, HashMap registerNames, HashMap variables, HashMap functions, int version) { - super(new ActionGraphSource(path, insideDoInitAction, code, version, registerNames, variables, functions), new ArrayList<>()); + public ActionGraph(String path, boolean insideDoInitAction, boolean insideDefineFunction1, List code, HashMap registerNames, HashMap variables, HashMap functions, int version) { + super(new ActionGraphSource(path, insideDoInitAction, insideDefineFunction1, code, version, registerNames, variables, functions), new ArrayList<>()); this.insideDoInitAction = insideDoInitAction; } @@ -74,9 +74,17 @@ public class ActionGraph extends Graph { return insideDoInitAction; } - public static List translateViaGraph(boolean insideDoInitAction, HashMap registerNames, HashMap variables, HashMap functions, List code, int version, int staticOperation, String path) throws InterruptedException { + @Override + protected void afterPopupateAllParts(Set allParts) { - ActionGraph g = new ActionGraph(path, insideDoInitAction, code, registerNames, variables, functions, version); + } + + public static List translateViaGraph(boolean insideDoInitAction, boolean insideDefineFunction1, HashMap registerNames, HashMap variables, HashMap functions, List code, int version, int staticOperation, String path) throws InterruptedException { + if (insideDefineFunction1) { + ActionDefineFunctionPushRegistersCleaner fixer = new ActionDefineFunctionPushRegistersCleaner(); + code = fixer.cleanPushRegisters(code); + } + ActionGraph g = new ActionGraph(path, insideDoInitAction, insideDefineFunction1, code, registerNames, variables, functions, version); ActionLocalData localData = new ActionLocalData(insideDoInitAction, registerNames); g.init(localData); return g.translate(localData, staticOperation, path); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraphSource.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraphSource.java index e1458a84b..1b502e52c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraphSource.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraphSource.java @@ -48,19 +48,22 @@ public class ActionGraphSource extends GraphSource { private final boolean insideDoInitAction; + private final boolean insideDefineFunction1; + private final String path; public List getActions() { return actions; } - public ActionGraphSource(String path, boolean insideDoInitAction, List actions, int version, HashMap registerNames, HashMap variables, HashMap functions) { + public ActionGraphSource(String path, boolean insideDoInitAction, boolean insideDefineFunction1, List actions, int version, HashMap registerNames, HashMap variables, HashMap functions) { this.actions = actions; this.version = version; this.registerNames = registerNames; this.variables = variables; this.functions = functions; this.insideDoInitAction = insideDoInitAction; + this.insideDefineFunction1 = insideDefineFunction1; this.path = path; } @@ -87,7 +90,7 @@ public class ActionGraphSource extends GraphSource { public List translatePart(GraphPart part, BaseLocalData localData, TranslateStack stack, int start, int end, int staticOperation, String path) throws InterruptedException { Reference fi = new Reference<>(localData.lineStartInstruction); - List r = Action.actionsPartToTree(this.insideDoInitAction, fi, registerNames, variables, functions, stack, actions, start, end, version, staticOperation, path); + List r = Action.actionsPartToTree(this.insideDoInitAction, this.insideDefineFunction1, fi, registerNames, variables, functions, stack, actions, start, end, version, staticOperation, path); localData.lineStartInstruction = fi.getVal(); return r; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionLocalData.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionLocalData.java index 8471cef69..cf425951a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionLocalData.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionLocalData.java @@ -37,6 +37,8 @@ public class ActionLocalData extends BaseLocalData { public boolean insideDoInitAction; + public boolean insideDefineFunction1 = false; + public ActionLocalData(boolean insideDoInitAction) { regNames = new HashMap<>(); variables = new HashMap<>(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/flashlite/ActionFSCommand2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/flashlite/ActionFSCommand2.java index f69368076..d202d85f0 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/flashlite/ActionFSCommand2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/flashlite/ActionFSCommand2.java @@ -42,7 +42,7 @@ public class ActionFSCommand2 extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartItem, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartItem, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { long numArgs = popLong(stack); GraphTargetItem command = stack.pop(); List args = new ArrayList<>(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/flashlite/ActionStrictMode.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/flashlite/ActionStrictMode.java index 80040d793..667746d9b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/flashlite/ActionStrictMode.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/flashlite/ActionStrictMode.java @@ -73,7 +73,7 @@ public class ActionStrictMode extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartItem, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartItem, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new StrictModeActionItem(this, lineStartItem, mode)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionEnd.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionEnd.java index d292670f1..a830d05fc 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionEnd.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionEnd.java @@ -52,7 +52,7 @@ public class ActionEnd extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartItem, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartItem, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { //output.add(new SimpleActionTreeItem(this, "end()")); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionNop.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionNop.java index 237d2ec31..a74c6764f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionNop.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionNop.java @@ -48,7 +48,7 @@ public class ActionNop extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartItem, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartItem, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { //output.add(new SimpleActionTreeItem(this, "nop();")); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionUnknown.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionUnknown.java index 3c8854c6e..88de63203 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionUnknown.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionUnknown.java @@ -45,6 +45,6 @@ public class ActionUnknown extends ActionNop { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartItem, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartItem, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGetURL.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGetURL.java index 4402a9f05..4a46a1443 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGetURL.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGetURL.java @@ -97,7 +97,7 @@ public class ActionGetURL extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { String fsCommandPrefix = "FSCommand:"; if (urlString.startsWith(fsCommandPrefix) && targetString.isEmpty()) { String command = urlString.substring(fsCommandPrefix.length()); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGoToLabel.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGoToLabel.java index 3a29e2329..99a77bdce 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGoToLabel.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGoToLabel.java @@ -86,7 +86,7 @@ public class ActionGoToLabel extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new GotoLabelActionItem(this, lineStartAction, label)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGotoFrame.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGotoFrame.java index 87007a465..c9c837b08 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGotoFrame.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGotoFrame.java @@ -82,7 +82,7 @@ public class ActionGotoFrame extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new GotoFrameActionItem(this, lineStartAction, frame)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionNextFrame.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionNextFrame.java index 54e5c4c97..53b540d96 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionNextFrame.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionNextFrame.java @@ -53,7 +53,7 @@ public class ActionNextFrame extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new NextFrameActionItem(this, lineStartAction)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionPlay.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionPlay.java index 17ac6f266..d2e4c1cd1 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionPlay.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionPlay.java @@ -52,7 +52,7 @@ public class ActionPlay extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { if (!output.isEmpty() && (output.get(output.size() - 1) instanceof GotoFrameActionItem)) { GotoFrameActionItem gta = (GotoFrameActionItem) output.remove(output.size() - 1); output.add(new GotoFrame2ActionItem(this, lineStartAction, new DirectValueActionItem(gta.frame + 1), false, true, 0)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionPrevFrame.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionPrevFrame.java index bea471769..e3505fe7b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionPrevFrame.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionPrevFrame.java @@ -53,7 +53,7 @@ public class ActionPrevFrame extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new PrevFrameActionItem(this, lineStartAction)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionSetTarget.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionSetTarget.java index 2f17d6a9d..8f8f68825 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionSetTarget.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionSetTarget.java @@ -90,7 +90,7 @@ public class ActionSetTarget extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new SetTargetActionItem(this, lineStartAction, targetName)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionStop.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionStop.java index 2e8a38461..5fd859e5e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionStop.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionStop.java @@ -49,7 +49,7 @@ public class ActionStop extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new StopActionItem(this, lineStartAction)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionStopSounds.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionStopSounds.java index d9268e653..b3454a416 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionStopSounds.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionStopSounds.java @@ -48,7 +48,7 @@ public class ActionStopSounds extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new StopAllSoundsActionItem(this, lineStartAction)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionToggleQuality.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionToggleQuality.java index 343848280..19ea72fd6 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionToggleQuality.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionToggleQuality.java @@ -48,7 +48,7 @@ public class ActionToggleQuality extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new ToggleHighQualityActionItem(this, lineStartAction)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionWaitForFrame.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionWaitForFrame.java index deb356b04..9382e0960 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionWaitForFrame.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionWaitForFrame.java @@ -100,9 +100,9 @@ public class ActionWaitForFrame extends Action implements ActionStore { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) throws InterruptedException { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) throws InterruptedException { GraphTargetItem frameTi = new DirectValueActionItem(null, null, 0, new Long(frame), new ArrayList<>()); - List body = ActionGraph.translateViaGraph(insideDoInitAction, regNames, variables, functions, skipped, SWF.DEFAULT_VERSION, staticOperation, path); + List body = ActionGraph.translateViaGraph(insideDoInitAction, insideDefineFunction1, regNames, variables, functions, skipped, SWF.DEFAULT_VERSION, staticOperation, path); output.add(new IfFrameLoadedActionItem(frameTi, body, this, lineStartAction)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAdd.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAdd.java index 19b8e7f44..3c446fba5 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAdd.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAdd.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.action.swf4; import com.jpexs.decompiler.flash.BaseLocalData; @@ -53,7 +54,7 @@ public class ActionAdd extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new AddActionItem(this, lineStartAction, b, a, false)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAnd.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAnd.java index 42e1813b3..41946d6b1 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAnd.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAnd.java @@ -53,7 +53,7 @@ public class ActionAnd extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new AndActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAsciiToChar.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAsciiToChar.java index e968b2e8f..d998313eb 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAsciiToChar.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAsciiToChar.java @@ -53,7 +53,7 @@ public class ActionAsciiToChar extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); stack.push(new AsciiToCharActionItem(this, lineStartAction, a)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCall.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCall.java index 0e15e05bb..0c95ed2e4 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCall.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCall.java @@ -58,7 +58,7 @@ public class ActionCall extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new CallActionItem(this, lineStartAction, stack.pop())); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCharToAscii.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCharToAscii.java index a6b643b20..ea24a8a3e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCharToAscii.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCharToAscii.java @@ -53,7 +53,7 @@ public class ActionCharToAscii extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); stack.push(new CharToAsciiActionItem(this, lineStartAction, a)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCloneSprite.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCloneSprite.java index 5b2a63575..0ac1fd0f3 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCloneSprite.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCloneSprite.java @@ -64,7 +64,7 @@ public class ActionCloneSprite extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem depth = stack.pop(); GraphTargetItem source = stack.pop(); GraphTargetItem target = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionDivide.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionDivide.java index 668d4b9c2..6cfa6fdef 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionDivide.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionDivide.java @@ -53,7 +53,7 @@ public class ActionDivide extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new DivideActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionEndDrag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionEndDrag.java index def6d7280..22224d0c6 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionEndDrag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionEndDrag.java @@ -52,7 +52,7 @@ public class ActionEndDrag extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new StopDragActionItem(this, lineStartAction)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionEquals.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionEquals.java index 66a7af3df..fdada2174 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionEquals.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionEquals.java @@ -53,7 +53,7 @@ public class ActionEquals extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new EqActionItem(this, lineStartAction, b, a, false)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetProperty.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetProperty.java index 82043030e..36f2c193d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetProperty.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetProperty.java @@ -64,7 +64,7 @@ public class ActionGetProperty extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem index = stack.pop(); GraphTargetItem target = stack.pop(); int indexInt = 0; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetTime.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetTime.java index 53c89e2ce..03cb4cd8b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetTime.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetTime.java @@ -49,7 +49,7 @@ public class ActionGetTime extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { stack.push(new GetTimeActionItem(this, lineStartAction)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetURL2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetURL2.java index 82a8a8053..e480cc0fa 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetURL2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetURL2.java @@ -124,7 +124,7 @@ public class ActionGetURL2 extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem targetString = stack.pop(); GraphTargetItem urlString = stack.pop(); Integer num = null; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetVariable.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetVariable.java index a958fe498..2a9eeec7d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetVariable.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetVariable.java @@ -64,7 +64,7 @@ public class ActionGetVariable extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem name = stack.pop(); String nameStr; if (name instanceof DirectValueActionItem) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGotoFrame2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGotoFrame2.java index 8b9e40d66..3b67092bf 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGotoFrame2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGotoFrame2.java @@ -143,7 +143,7 @@ public class ActionGotoFrame2 extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem frame = stack.pop(); output.add(new GotoFrame2ActionItem(this, lineStartAction, frame, sceneBiasFlag, playFlag, sceneBias)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionLess.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionLess.java index bb736f67e..eab14aecd 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionLess.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionLess.java @@ -53,7 +53,7 @@ public class ActionLess extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new LtActionItem(this, lineStartAction, b, a, false)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBAsciiToChar.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBAsciiToChar.java index 1a9f3b179..5e9ad9cb7 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBAsciiToChar.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBAsciiToChar.java @@ -53,7 +53,7 @@ public class ActionMBAsciiToChar extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); stack.push(new MBAsciiToCharActionItem(this, lineStartAction, a)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBCharToAscii.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBCharToAscii.java index ecef9ab58..3dba0cfac 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBCharToAscii.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBCharToAscii.java @@ -53,7 +53,7 @@ public class ActionMBCharToAscii extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); stack.push(new MBCharToAsciiActionItem(this, lineStartAction, a)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBStringExtract.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBStringExtract.java index 9ff7864cf..403f41c48 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBStringExtract.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBStringExtract.java @@ -53,7 +53,7 @@ public class ActionMBStringExtract extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem count = stack.pop(); GraphTargetItem index = stack.pop(); GraphTargetItem value = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBStringLength.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBStringLength.java index 84e6df110..77374875f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBStringLength.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBStringLength.java @@ -53,7 +53,7 @@ public class ActionMBStringLength extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); stack.push(new MBStringLengthActionItem(this, lineStartAction, a)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMultiply.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMultiply.java index e86acdae7..b8947c9b8 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMultiply.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMultiply.java @@ -53,7 +53,7 @@ public class ActionMultiply extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new MultiplyActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionNot.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionNot.java index 52d8161c4..1f6bc80f0 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionNot.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionNot.java @@ -53,7 +53,7 @@ public class ActionNot extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); stack.push(a.invert(this)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionOr.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionOr.java index 4eff80e10..0ddb2d24f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionOr.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionOr.java @@ -53,7 +53,7 @@ public class ActionOr extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new OrActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPop.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPop.java index 0fa744297..ad133aeae 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPop.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPop.java @@ -52,7 +52,7 @@ public class ActionPop extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem val = stack.pop(); output.add(val); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPush.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPush.java index bcf989921..1b26b1295 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPush.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPush.java @@ -389,7 +389,7 @@ public class ActionPush extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { int pos = 0; for (Object o : values) { if (o instanceof ConstantIndex) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionRandomNumber.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionRandomNumber.java index 4ead65188..3a9d1d6c9 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionRandomNumber.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionRandomNumber.java @@ -53,7 +53,7 @@ public class ActionRandomNumber extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem maximum = stack.pop(); stack.push(new RandomNumberActionItem(this, lineStartAction, maximum)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionRemoveSprite.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionRemoveSprite.java index 80106f46b..97e65588c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionRemoveSprite.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionRemoveSprite.java @@ -55,7 +55,7 @@ public class ActionRemoveSprite extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem target = stack.pop(); output.add(new RemoveSpriteActionItem(this, lineStartAction, target)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetProperty.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetProperty.java index ce3a26c6f..69564eda4 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetProperty.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetProperty.java @@ -70,7 +70,7 @@ public class ActionSetProperty extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem value = stack.pop().getThroughDuplicate(); GraphTargetItem index = stack.pop().getThroughDuplicate(); GraphTargetItem target = stack.pop().getThroughDuplicate(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetTarget2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetTarget2.java index a34cd1937..82ff0bcfc 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetTarget2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetTarget2.java @@ -54,7 +54,7 @@ public class ActionSetTarget2 extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem target = stack.pop(); output.add(new SetTarget2ActionItem(this, lineStartAction, target)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetVariable.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetVariable.java index 4c421da6c..806425dff 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetVariable.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetVariable.java @@ -68,7 +68,7 @@ public class ActionSetVariable extends Action implements StoreTypeAction { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem value = stack.pop().getThroughDuplicate(); GraphTargetItem name = stack.pop(); String nameStr; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStartDrag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStartDrag.java index 39cd5a110..4df4169d0 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStartDrag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStartDrag.java @@ -54,7 +54,7 @@ public class ActionStartDrag extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem target = stack.pop(); GraphTargetItem lockCenter = stack.pop(); GraphTargetItem constrain = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringAdd.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringAdd.java index 16dd9d740..df83ffe01 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringAdd.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringAdd.java @@ -53,7 +53,7 @@ public class ActionStringAdd extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new StringAddActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringEquals.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringEquals.java index 7c2443d9a..40fab28ee 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringEquals.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringEquals.java @@ -53,7 +53,7 @@ public class ActionStringEquals extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new StringEqActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringExtract.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringExtract.java index eb8d71683..6c481744d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringExtract.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringExtract.java @@ -53,7 +53,7 @@ public class ActionStringExtract extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem count = stack.pop(); GraphTargetItem index = stack.pop(); GraphTargetItem value = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringLength.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringLength.java index 83e3b08c2..acc19e95b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringLength.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringLength.java @@ -53,7 +53,7 @@ public class ActionStringLength extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); stack.push(new StringLengthActionItem(this, lineStartAction, a)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringLess.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringLess.java index fbfa1c193..1c157c562 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringLess.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringLess.java @@ -53,7 +53,7 @@ public class ActionStringLess extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new StringLtActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSubtract.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSubtract.java index f1b64d9b2..e87bf7ceb 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSubtract.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSubtract.java @@ -53,7 +53,7 @@ public class ActionSubtract extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new SubtractActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionToInteger.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionToInteger.java index 80ab50aca..db078a6ad 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionToInteger.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionToInteger.java @@ -53,7 +53,7 @@ public class ActionToInteger extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); stack.push(new ToIntegerActionItem(this, lineStartAction, a)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionTrace.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionTrace.java index 65e4bc53b..c41fa5d80 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionTrace.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionTrace.java @@ -53,7 +53,7 @@ public class ActionTrace extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem value = stack.pop(); output.add(new TraceActionItem(this, lineStartAction, value)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionWaitForFrame2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionWaitForFrame2.java index ab6de28dc..e25e3c21b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionWaitForFrame2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionWaitForFrame2.java @@ -146,9 +146,9 @@ public class ActionWaitForFrame2 extends Action implements ActionStore { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) throws InterruptedException { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) throws InterruptedException { GraphTargetItem frame = stack.pop(); - List body = ActionGraph.translateViaGraph(insideDoInitAction, regNames, variables, functions, skipped, SWF.DEFAULT_VERSION, staticOperation, path); + List body = ActionGraph.translateViaGraph(insideDoInitAction, insideDefineFunction1, regNames, variables, functions, skipped, SWF.DEFAULT_VERSION, staticOperation, path); output.add(new IfFrameLoadedActionItem(frame, body, this, lineStartAction)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionAdd2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionAdd2.java index 3145db61b..f42607162 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionAdd2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionAdd2.java @@ -53,7 +53,7 @@ public class ActionAdd2 extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new AddActionItem(this, lineStartAction, b, a, true)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitAnd.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitAnd.java index cc4332ac5..d5c4b3a68 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitAnd.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitAnd.java @@ -53,7 +53,7 @@ public class ActionBitAnd extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new BitAndActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitLShift.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitLShift.java index cc23921b3..ffad9789b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitLShift.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitLShift.java @@ -53,7 +53,7 @@ public class ActionBitLShift extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new LShiftActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitOr.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitOr.java index 54976f587..89ed1cd3b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitOr.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitOr.java @@ -53,7 +53,7 @@ public class ActionBitOr extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new BitOrActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitRShift.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitRShift.java index b0565ddc9..84cbe025e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitRShift.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitRShift.java @@ -53,7 +53,7 @@ public class ActionBitRShift extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new RShiftActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitURShift.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitURShift.java index 78bee5c3f..e5ca97736 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitURShift.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitURShift.java @@ -53,7 +53,7 @@ public class ActionBitURShift extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new URShiftActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitXor.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitXor.java index 0eb5a9d32..79f9c5ab4 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitXor.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitXor.java @@ -53,7 +53,7 @@ public class ActionBitXor extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new BitXorActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionCallFunction.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionCallFunction.java index 0c0da6a54..76aae74ff 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionCallFunction.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionCallFunction.java @@ -66,7 +66,7 @@ public class ActionCallFunction extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem functionName = stack.pop(); long numArgs = popLong(stack); List args = new ArrayList<>(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionCallMethod.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionCallMethod.java index 87e2836da..31d23c9d4 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionCallMethod.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionCallMethod.java @@ -75,7 +75,7 @@ public class ActionCallMethod extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem methodName = stack.pop(); GraphTargetItem scriptObject = stack.pop(); long numArgs = popLong(stack); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionConstantPool.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionConstantPool.java index fd2918da9..03106db19 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionConstantPool.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionConstantPool.java @@ -117,6 +117,6 @@ public class ActionConstantPool extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDecrement.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDecrement.java index 1e25fd189..55935126c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDecrement.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDecrement.java @@ -53,7 +53,7 @@ public class ActionDecrement extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); stack.push(new DecrementActionItem(this, lineStartAction, a)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineFunction.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineFunction.java index a38fb42da..3994b2438 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineFunction.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineFunction.java @@ -159,7 +159,7 @@ public class ActionDefineFunction extends Action implements GraphSourceItemConta } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineLocal.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineLocal.java index 485ab6684..eba5d1a77 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineLocal.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineLocal.java @@ -57,7 +57,7 @@ public class ActionDefineLocal extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem value = stack.pop(); GraphTargetItem name = stack.pop(); String nameStr; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineLocal2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineLocal2.java index e3b7dbfc5..de71611b4 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineLocal2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineLocal2.java @@ -45,7 +45,7 @@ public class ActionDefineLocal2 extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem name = stack.pop(); output.add(new DefineLocalActionItem(this, lineStartAction, name, null)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDelete.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDelete.java index dad1a29b3..a406f26db 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDelete.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDelete.java @@ -54,7 +54,7 @@ public class ActionDelete extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem propertyName = stack.pop(); GraphTargetItem object = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDelete2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDelete2.java index 4be8b52b2..9b1a4603f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDelete2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDelete2.java @@ -60,7 +60,7 @@ public class ActionDelete2 extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem propertyName = stack.pop(); stack.push(new DeleteActionItem(this, lineStartAction, null, propertyName)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionEnumerate.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionEnumerate.java index 3d6cca063..adb68b3d6 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionEnumerate.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionEnumerate.java @@ -65,7 +65,7 @@ public class ActionEnumerate extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem object = stack.pop(); //stack.push(new DirectValueActionItem(null, 0, new Null(), new ArrayList())); output.add(new EnumerateActionItem(this, lineStartAction, object)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionEquals2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionEquals2.java index 810e99987..2184982aa 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionEquals2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionEquals2.java @@ -53,7 +53,7 @@ public class ActionEquals2 extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new EqActionItem(this, lineStartAction, b, a, true)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionGetMember.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionGetMember.java index 50adab2d0..f67906ac7 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionGetMember.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionGetMember.java @@ -62,7 +62,7 @@ public class ActionGetMember extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem memberName = stack.pop(); GraphTargetItem object = stack.pop(); stack.push(new GetMemberActionItem(this, lineStartAction, object, memberName)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionIncrement.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionIncrement.java index 350d4d90d..d9be4829b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionIncrement.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionIncrement.java @@ -53,7 +53,7 @@ public class ActionIncrement extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); stack.push(new IncrementActionItem(this, lineStartAction, a)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionInitArray.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionInitArray.java index 2bb0937b1..25d68882e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionInitArray.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionInitArray.java @@ -60,7 +60,7 @@ public class ActionInitArray extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { long numArgs = popLong(stack); List args = new ArrayList<>(); for (int l = 0; l < numArgs; l++) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionInitObject.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionInitObject.java index 0c3341ab7..e92e04886 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionInitObject.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionInitObject.java @@ -67,7 +67,7 @@ public class ActionInitObject extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { long numArgs = popLong(stack); List values = new ArrayList<>(); List names = new ArrayList<>(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionLess2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionLess2.java index 299497df6..9c93eef53 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionLess2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionLess2.java @@ -53,7 +53,7 @@ public class ActionLess2 extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new LtActionItem(this, lineStartAction, b, a, true)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionModulo.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionModulo.java index 7141d82c1..0c3d50f4c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionModulo.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionModulo.java @@ -53,7 +53,7 @@ public class ActionModulo extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new ModuloActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionNewMethod.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionNewMethod.java index 6c292fe4c..774fdd2ec 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionNewMethod.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionNewMethod.java @@ -71,7 +71,7 @@ public class ActionNewMethod extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem methodName = stack.pop(); GraphTargetItem scriptObject = stack.pop(); long numArgs = popLong(stack); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionNewObject.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionNewObject.java index 49719646e..7fe784ec3 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionNewObject.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionNewObject.java @@ -71,7 +71,7 @@ public class ActionNewObject extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem objectName = stack.pop(); long numArgs = popLong(stack); List args = new ArrayList<>(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionPushDuplicate.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionPushDuplicate.java index 390a9c5a4..b379a9cfd 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionPushDuplicate.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionPushDuplicate.java @@ -54,7 +54,7 @@ public class ActionPushDuplicate extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem value = stack.peek(); stack.push(new DuplicateItem(this, lineStartAction, value)); value.getMoreSrc().add(new GraphSourceItemPos(this, 0)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionReturn.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionReturn.java index f246c96d9..b4374f9c4 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionReturn.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionReturn.java @@ -55,7 +55,7 @@ public class ActionReturn extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem value = stack.pop(); output.add(new ReturnActionItem(this, lineStartAction, value)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionSetMember.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionSetMember.java index dff7fe2d4..a85abe486 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionSetMember.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionSetMember.java @@ -69,7 +69,7 @@ public class ActionSetMember extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem value = stack.pop().getThroughDuplicate(); GraphTargetItem memberName = stack.pop(); GraphTargetItem object = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionStackSwap.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionStackSwap.java index 43283c664..040909115 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionStackSwap.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionStackSwap.java @@ -56,7 +56,7 @@ public class ActionStackSwap extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(a); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionStoreRegister.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionStoreRegister.java index b5195953a..da6cd9944 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionStoreRegister.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionStoreRegister.java @@ -97,7 +97,7 @@ public class ActionStoreRegister extends Action implements StoreTypeAction { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem value = stack.pop(); RegisterNumber rn = new RegisterNumber(registerNumber); if (regNames.containsKey(registerNumber)) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionTargetPath.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionTargetPath.java index 718f1f6e1..c4f18ed8b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionTargetPath.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionTargetPath.java @@ -62,7 +62,7 @@ public class ActionTargetPath extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem object = stack.pop(); stack.push(new TargetPathActionItem(this, lineStartAction, object)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionToNumber.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionToNumber.java index e90b5e3f0..2e355a48a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionToNumber.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionToNumber.java @@ -53,7 +53,7 @@ public class ActionToNumber extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem object = stack.pop(); stack.push(new ToNumberActionItem(this, lineStartAction, object)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionToString.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionToString.java index 5b5c443ac..67e9ca9a8 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionToString.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionToString.java @@ -53,7 +53,7 @@ public class ActionToString extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem object = stack.pop(); stack.push(new ToStringActionItem(this, lineStartAction, object)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionTypeOf.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionTypeOf.java index e4b30b5ab..c5dd11c77 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionTypeOf.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionTypeOf.java @@ -53,7 +53,7 @@ public class ActionTypeOf extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem object = stack.pop(); stack.push(new TypeOfActionItem(this, lineStartAction, object)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionEnumerate2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionEnumerate2.java index fbe390b23..5b1111a9e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionEnumerate2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionEnumerate2.java @@ -45,7 +45,7 @@ public class ActionEnumerate2 extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem object = stack.pop(); output.add(new EnumerateActionItem(this, lineStartAction, object)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionGreater.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionGreater.java index 4e144f418..b19340a11 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionGreater.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionGreater.java @@ -53,7 +53,7 @@ public class ActionGreater extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new GtActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionInstanceOf.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionInstanceOf.java index 3795bb7fd..4b21769fe 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionInstanceOf.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionInstanceOf.java @@ -84,7 +84,7 @@ public class ActionInstanceOf extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new InstanceOfActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionStrictEquals.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionStrictEquals.java index 276a7ce8b..ea1d6ec32 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionStrictEquals.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionStrictEquals.java @@ -53,7 +53,7 @@ public class ActionStrictEquals extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new StrictEqActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionStringGreater.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionStringGreater.java index e03d9629f..65a049aac 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionStringGreater.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionStringGreater.java @@ -53,7 +53,7 @@ public class ActionStringGreater extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new StringGtActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionCastOp.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionCastOp.java index 410490cbb..fc8954e73 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionCastOp.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionCastOp.java @@ -63,7 +63,7 @@ public class ActionCastOp extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem object = stack.pop(); GraphTargetItem constructor = stack.pop(); stack.push(new CastOpActionItem(this, lineStartAction, constructor, object)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionDefineFunction2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionDefineFunction2.java index 5a1650cf6..f71f8472d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionDefineFunction2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionDefineFunction2.java @@ -267,7 +267,7 @@ public class ActionDefineFunction2 extends Action implements GraphSourceItemCont } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionExtends.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionExtends.java index a333563b1..7679c3ded 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionExtends.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionExtends.java @@ -63,7 +63,7 @@ public class ActionExtends extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem superclass = stack.pop(); GraphTargetItem subclass = stack.pop(); output.add(new ExtendsActionItem(this, lineStartAction, subclass, superclass)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionImplementsOp.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionImplementsOp.java index 454cb3ef2..69afe9a04 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionImplementsOp.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionImplementsOp.java @@ -67,7 +67,7 @@ public class ActionImplementsOp extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem subclass = stack.pop(); long inCount = popLong(stack); List superclasses = new ArrayList<>(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionThrow.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionThrow.java index b6c159324..d9c4b760d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionThrow.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionThrow.java @@ -49,7 +49,7 @@ public class ActionThrow extends Action { } @Override - public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem object = stack.pop(); output.add(new ThrowActionItem(this, lineStartAction, object)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java index a9bcffe39..297bf6638 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java @@ -599,12 +599,17 @@ public class Graph { return g.translate(localData, staticOperation, path); } + protected void afterPopupateAllParts(Set allParts) { + + } + public List translate(BaseLocalData localData, int staticOperation, String path) throws InterruptedException { Set allParts = new HashSet<>(); for (GraphPart head : heads) { populateParts(head, allParts); } + afterPopupateAllParts(allParts); if (debugPrintAllParts) { System.err.println("parts:"); for (GraphPart p : allParts) { diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionDefineFunctionPushRegisterCleanerTest.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionDefineFunctionPushRegisterCleanerTest.java new file mode 100644 index 000000000..e70b6c743 --- /dev/null +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionDefineFunctionPushRegisterCleanerTest.java @@ -0,0 +1,136 @@ +/* + * Copyright (C) 2010-2018 JPEXS, All rights reserved. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3.0 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. + */ +package com.jpexs.decompiler.flash; + +import com.jpexs.decompiler.flash.action.Action; +import com.jpexs.decompiler.flash.configuration.Configuration; +import com.jpexs.decompiler.flash.helpers.CodeFormatting; +import com.jpexs.decompiler.flash.helpers.HighlightedTextWriter; +import com.jpexs.decompiler.flash.tags.DoInitActionTag; +import com.jpexs.decompiler.flash.tags.Tag; +import java.io.BufferedInputStream; +import java.io.FileInputStream; +import java.io.IOException; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.fail; +import org.testng.annotations.BeforeClass; +import org.testng.annotations.Test; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.fail; + +/** + * + * @author JPEXS + */ +public class ActionDefineFunctionPushRegisterCleanerTest extends ActionScript2TestBase { + + @BeforeClass + public void init() throws IOException, InterruptedException { + //Main.initLogging(false); + Configuration.autoDeobfuscate.set(false); + Configuration.simplifyExpressions.set(false); + Configuration.decompile.set(true); + Configuration.registerNameFormat.set("_loc%d_"); + swf = new SWF(new BufferedInputStream(new FileInputStream("testdata/as2_definefunc_regs/as2_definefunc_regs.swf")), false); + } + + private void compareSrc(String testClassName, String expectedClassContents) { + DoInitActionTag dia = getClassSource(testClassName); + assertNotNull(dia); + HighlightedTextWriter writer = new HighlightedTextWriter(new CodeFormatting(), false); + try { + Action.actionsToSource(dia, dia.getActions(), "", writer); + } catch (InterruptedException ex) { + fail(); + } + String actualResult = cleanPCode(writer.toString()); + String expectedResult = cleanPCode("class " + testClassName + "\r\n" + + "{\r\n" + + expectedClassContents + "\r\n" + + "}"); + assertEquals(actualResult, expectedResult); + } + + private DoInitActionTag getClassSource(String classFullName) { + for (Tag t : swf.getTags()) { + if (t instanceof DoInitActionTag) { + DoInitActionTag dia = (DoInitActionTag) t; + String exportName = swf.getExportName(dia.spriteId); + if (exportName != null && exportName.startsWith(SWF.AS2_PKG_PREFIX)) { + String exportClassName = exportName.substring(SWF.AS2_PKG_PREFIX.length()); + if (exportClassName.equals(classFullName)) { + return dia; + } + } + } + } + return null; + } + + @Test + public void testMyClass() { + compareSrc("MyClass", "function MyClass()\n" + + "{\r\n" + + "}\r\n" + + "function testNoReturn()\r\n" + + "{\r\n" + + "var _loc2_ = 5;\r\n" + + "var _loc1_ = _loc2_ + 27;\r\n" + + "trace(\"hi:\" + _loc1_);\r\n" + + "}\r\n" + + "function testSimpleReturn()\r\n" + + "{\r\n" + + "var a = 5;\r\n" + + "var _loc1_ = 30;\r\n" + + "return \"bagr\" + _loc1_;\r\n" + + "}\r\n" + + "function testReturns()\r\n" + + "{\r\n" + + "var _loc2_ = 10;\r\n" + + "if(_loc2_ > 2)\r\n" + + "{\r\n" + + "_loc2_ = _loc2_ + 1;\r\n" + + "var _loc1_ = 0;\r\n" + + "while(_loc1_ < 100)\r\n" + + "{\r\n" + + "if(_loc2_ + _loc1_ == 27)\r\n" + + "{\r\n" + + "return _loc2_ + 7;\r\n" + + "}\r\n" + + "_loc1_ = _loc1_ + 27;\r\n" + + "_loc1_ = _loc1_ + 1;\r\n" + + "}\r\n" + + "}\r\n" + + "else if(_loc2_ == 4)\r\n" + + "{\r\n" + + "return 4;\r\n" + + "}\r\n" + + "return 3;\r\n" + + "}\r\n" + + "function testSomeReturns()\r\n" + + "{\r\n" + + "var _loc1_ = 5;\r\n" + + "if(_loc1_ < 10)\r\n" + + "{\r\n" + + "return _loc1_;\r\n" + + "}\r\n" + + "}\r\r" + ); + } +} diff --git a/libsrc/ffdec_lib/testdata/as2_definefunc_regs/MyClass.as b/libsrc/ffdec_lib/testdata/as2_definefunc_regs/MyClass.as new file mode 100644 index 000000000..feeadef60 --- /dev/null +++ b/libsrc/ffdec_lib/testdata/as2_definefunc_regs/MyClass.as @@ -0,0 +1,37 @@ +class MyClass { + + function testNoReturn(){ + var a = 5; + var b = a + 27; + trace("hi:"+b); + } + + function testSimpleReturn(){ + var a = 5; + var b = 5 * 6; + return "bagr"+b; + } + + function testReturns(){ + var a = 10; + if(a > 2){ + a++; + for(var i=0;i<100;i++){ + if(a + i == 27){ + return a + 7; + } + i+= 27; + } + } else if (a == 4){ + return 4; + } + return 3; + } + + function testSomeReturns(){ + var a = 5; + if(a < 10){ + return a; + } + } +} \ No newline at end of file diff --git a/libsrc/ffdec_lib/testdata/as2_definefunc_regs/as2_definefunc_regs.fla b/libsrc/ffdec_lib/testdata/as2_definefunc_regs/as2_definefunc_regs.fla new file mode 100644 index 0000000000000000000000000000000000000000..12827914268a54ec7a34ba2165927e8bcaffa672 GIT binary patch literal 21504 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 + + + +as2_definefunc_regs + + + + + + + + + + + + + diff --git a/libsrc/ffdec_lib/testdata/as2_definefunc_regs/as2_definefunc_regs.swf b/libsrc/ffdec_lib/testdata/as2_definefunc_regs/as2_definefunc_regs.swf new file mode 100644 index 0000000000000000000000000000000000000000..1ef4bdb28176d1002378498c5744c342125a1d32 GIT binary patch literal 415 zcmV;Q0bu?^S5pQI0{{ScoPAQuO2a@DJu^*ATD3kuYbmhuNTM?`-Y>RbYqJ}7@ zCNvT37w8uRL=>0)m7fyto!itF#4Lt6=iYnfoXI@F?gLAoz=FcD&hxxc+5nKP1J{^C z@tu#3LoZ3tJV0J%S{b@gt(m<-zu)z)@4diJc8cD-`k}e_5@R0yAdIfOa3T~BqcloK zv5(YG(sp#=r;o!2+}`aOqIWllLw`(qxblLb;e|=0CmQ$#KI--Sv^$LAlh6wiWEw6u zc~$Mz)pw0GJw?6Q66%>kbTSJTT-_$1Y7CTHl7?MmWrCJ=Y-!fD%mG2ZpjOfET9#^U zo2sEYqG5~1zG%2}M&lr};cSVR3_CRZs>wm7P+~tKk}*{uOSvNTJ+V`nwL_PTfJ2Tr zx23yMEC2pJ(WGYO+z>qF<`!68)A?+QBb_n53=wrWBRRW-%uQvcGgQ}Xss5GIvNayE z3YA5$C_}2Q7*G;0n^gZ1w=8k%(), new HashMap<>(), new HashMap<>(), SWF.DEFAULT_VERSION), ""); + GraphDialog gf = new GraphDialog(mainPanel.getMainFrame().getWindow(), new ActionGraph(this.src.getScriptName(), insideDoInitAction, false, lastCode, new HashMap<>(), new HashMap<>(), new HashMap<>(), SWF.DEFAULT_VERSION), ""); gf.setVisible(true); } catch (InterruptedException ex) { logger.log(Level.SEVERE, null, ex); From a7f457ad9d6fe310227119f0074000e4c46d4305 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Tue, 30 Jan 2018 07:39:16 +0100 Subject: [PATCH 44/58] AS1/2: break on the end of for..in loop --- CHANGELOG.md | 1 + .../flash/FinalProcessLocalData.java | 9 ++- .../decompiler/flash/action/ActionGraph.java | 52 ++++++++++++------ .../action/model/clauses/ForInActionItem.java | 3 +- .../src/com/jpexs/decompiler/graph/Graph.java | 2 +- .../decompiler/flash/ActionScript2Test.java | 13 +++++ libsrc/ffdec_lib/testdata/as2/as2.fla | Bin 1087014 -> 1087059 bytes libsrc/ffdec_lib/testdata/as2/as2.swf | Bin 28066 -> 28109 bytes 8 files changed, 59 insertions(+), 21 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 34cde5a52..207a1f879 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ All notable changes to this project will be documented in this file. - AS2 direct editation - not generating Pop in class header ifs - AS1/2 deobfuscation - ActionRandom fixed for nonpositive numbers - AS1/2 switch statement detection - fixes of default section position +- AS1/2: break on the end of for..in loop ## [11.0.0] - 2018-01-17 ### Added diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/FinalProcessLocalData.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/FinalProcessLocalData.java index 50eecdd4f..6d6cced57 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/FinalProcessLocalData.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/FinalProcessLocalData.java @@ -12,10 +12,13 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash; +import com.jpexs.decompiler.graph.Loop; import java.util.HashSet; +import java.util.List; /** * @@ -24,8 +27,10 @@ import java.util.HashSet; public class FinalProcessLocalData { public final HashSet temporaryRegisters; + public final List loops; - public FinalProcessLocalData() { + public FinalProcessLocalData(List loops) { temporaryRegisters = new HashSet<>(); + this.loops = loops; } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java index a8ec73a74..ba3f09202 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java @@ -49,6 +49,7 @@ import com.jpexs.decompiler.graph.TranslateStack; import com.jpexs.decompiler.graph.model.BreakItem; import com.jpexs.decompiler.graph.model.ContinueItem; import com.jpexs.decompiler.graph.model.DefaultItem; +import com.jpexs.decompiler.graph.model.IfItem; import com.jpexs.decompiler.graph.model.SwitchItem; import com.jpexs.decompiler.graph.model.WhileItem; import java.util.ArrayList; @@ -171,31 +172,48 @@ public class ActionGraph extends Graph { } while (again); for (int t = 1/*not first*/; t < list.size(); t++) { GraphTargetItem it = list.get(t); + List checkedBody = null; + GraphTargetItem checkedCondition = null; + Loop checkedLoop = null; if (it instanceof WhileItem) { WhileItem wi = (WhileItem) it; - if ((!wi.commands.isEmpty()) && (wi.commands.get(0) instanceof SetTypeActionItem)) { - SetTypeActionItem sti = (SetTypeActionItem) wi.commands.get(0); - if (wi.expression.get(wi.expression.size() - 1) instanceof NeqActionItem) { - NeqActionItem ne = (NeqActionItem) wi.expression.get(wi.expression.size() - 1); - if (ne.rightSide instanceof DirectValueActionItem) { - DirectValueActionItem dv = (DirectValueActionItem) ne.rightSide; - if (dv.value == Null.INSTANCE) { - GraphTargetItem en = list.get(t - 1); - if (en instanceof EnumerateActionItem) { - EnumerateActionItem eti = (EnumerateActionItem) en; - list.remove(t); - wi.commands.remove(0); - list.add(t, new ForInActionItem(null, null, wi.loop, sti.getObject(), eti.object, wi.commands)); - list.remove(t - 1); - t--; + checkedBody = wi.commands; + checkedCondition = wi.expression.get(wi.expression.size() - 1); + checkedLoop = wi.loop; + } else if (it instanceof IfItem) { + IfItem ifi = (IfItem) it; + if (ifi.onFalse.isEmpty()) { + checkedBody = ifi.onTrue; + checkedCondition = ifi.expression; + checkedLoop = null; + } + } + if (checkedBody != null && (!checkedBody.isEmpty()) && (checkedBody.get(0) instanceof SetTypeActionItem)) { + SetTypeActionItem sti = (SetTypeActionItem) checkedBody.get(0); + if (checkedCondition instanceof NeqActionItem) { + NeqActionItem ne = (NeqActionItem) checkedCondition; + if (ne.rightSide instanceof DirectValueActionItem) { + DirectValueActionItem dv = (DirectValueActionItem) ne.rightSide; + if (dv.value == Null.INSTANCE) { + GraphTargetItem en = list.get(t - 1); + if (en instanceof EnumerateActionItem) { + EnumerateActionItem eti = (EnumerateActionItem) en; + list.remove(t); + checkedBody.remove(0); + if (checkedLoop == null) { + checkedLoop = new Loop(localData.loops.size(), null, null); + checkedBody.add(new BreakItem(null, null, checkedLoop.id)); } + list.add(t, new ForInActionItem(null, null, checkedLoop, sti.getObject(), eti.object, checkedBody)); + list.remove(t - 1); + t--; } - } + } } - } + } //Handle for loops at the end: super.finalProcess(list, level, localData, path); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/ForInActionItem.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/ForInActionItem.java index ad2e4bf53..921dfc9d3 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/ForInActionItem.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/model/clauses/ForInActionItem.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.action.model.clauses; import com.jpexs.decompiler.flash.SWF; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java index 297bf6638..6e445b030 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/graph/Graph.java @@ -676,7 +676,7 @@ public class Graph { List ret = printGraph(new HashMap<>(), new HashMap<>(), localData, stack, allParts, null, heads.get(0), null, loops, staticOperation, path); processIfs(ret); finalProcessStack(stack, ret, path); - finalProcessAll(ret, 0, new FinalProcessLocalData(), path); + finalProcessAll(ret, 0, new FinalProcessLocalData(loops), path); return ret; } diff --git a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java index c557b9895..700e78f3f 100644 --- a/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java +++ b/libsrc/ffdec_lib/test/com/jpexs/decompiler/flash/ActionScript2Test.java @@ -1935,4 +1935,17 @@ public class ActionScript2Test extends ActionScript2TestBase { + "}\r\n" ); } + + @Test + public void frame69_forInBreakTest() { + compareSrc(69, "trace(\"forInBreakTest\");\r\n" + + "var obj = {a:5,b:6,c:7};\r\n" + + "for(var k in obj)\r\n" + + "{\r\n" + + "trace(k);\r\n" + + "break;\r\n" + + "}\r\n" + + "trace(\"after\");\r\n" + ); + } } diff --git a/libsrc/ffdec_lib/testdata/as2/as2.fla b/libsrc/ffdec_lib/testdata/as2/as2.fla index a84106d3808a54f451155110493497f9e1400597..4b38fcd3803e418e2e2c000eddb3e5c53b067546 100644 GIT binary patch delta 17889 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 QSb%UNumv|2D96A60I0Cnv;Y7A diff --git a/libsrc/ffdec_lib/testdata/as2/as2.swf b/libsrc/ffdec_lib/testdata/as2/as2.swf index 58a2056d815013887748c558aec013e58196345b..3b108882706afbc09bc96a8b163dc5acbba794d0 100644 GIT binary patch literal 28109 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 WrDWv2kDSS0Yx`~j#`FJ@<}OJa;#7+O literal 28066 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 From 2f9c44db300fdc1e5f1f6f41e5af6c9e35205c8e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Wed, 31 Jan 2018 07:24:45 +0100 Subject: [PATCH 45/58] AS1/2: DefineFunction push registers cleanup - remove insideDefineFunction1 parameter, execute the cleanup for whole script as decompiler adapter, fixing bugs in the cleanup and refactoring. --- .../src/com/jpexs/decompiler/flash/SWF.java | 10 +- .../jpexs/decompiler/flash/action/Action.java | 18 +- ...ionDefineFunctionPushRegistersCleaner.java | 218 ++++++++++++------ .../decompiler/flash/action/ActionGraph.java | 12 +- .../flash/action/ActionGraphSource.java | 7 +- .../flash/action/ActionListReader.java | 16 +- .../flash/action/ActionLocalData.java | 2 - .../deobfuscation/ActionDeobfuscator.java | 3 +- .../action/flashlite/ActionFSCommand2.java | 5 +- .../action/flashlite/ActionStrictMode.java | 5 +- .../flash/action/special/ActionEnd.java | 5 +- .../flash/action/special/ActionNop.java | 5 +- .../flash/action/special/ActionUnknown.java | 5 +- .../flash/action/swf3/ActionGetURL.java | 2 +- .../flash/action/swf3/ActionGoToLabel.java | 2 +- .../flash/action/swf3/ActionGotoFrame.java | 2 +- .../flash/action/swf3/ActionNextFrame.java | 2 +- .../flash/action/swf3/ActionPlay.java | 2 +- .../flash/action/swf3/ActionPrevFrame.java | 2 +- .../flash/action/swf3/ActionSetTarget.java | 2 +- .../flash/action/swf3/ActionStop.java | 2 +- .../flash/action/swf3/ActionStopSounds.java | 2 +- .../action/swf3/ActionToggleQuality.java | 2 +- .../flash/action/swf3/ActionWaitForFrame.java | 4 +- .../flash/action/swf4/ActionAdd.java | 2 +- .../flash/action/swf4/ActionAnd.java | 2 +- .../flash/action/swf4/ActionAsciiToChar.java | 2 +- .../flash/action/swf4/ActionCall.java | 2 +- .../flash/action/swf4/ActionCharToAscii.java | 2 +- .../flash/action/swf4/ActionCloneSprite.java | 2 +- .../flash/action/swf4/ActionDivide.java | 2 +- .../flash/action/swf4/ActionEndDrag.java | 2 +- .../flash/action/swf4/ActionEquals.java | 2 +- .../flash/action/swf4/ActionGetProperty.java | 2 +- .../flash/action/swf4/ActionGetTime.java | 2 +- .../flash/action/swf4/ActionGetURL2.java | 2 +- .../flash/action/swf4/ActionGetVariable.java | 2 +- .../flash/action/swf4/ActionGotoFrame2.java | 2 +- .../flash/action/swf4/ActionLess.java | 2 +- .../action/swf4/ActionMBAsciiToChar.java | 2 +- .../action/swf4/ActionMBCharToAscii.java | 2 +- .../action/swf4/ActionMBStringExtract.java | 2 +- .../action/swf4/ActionMBStringLength.java | 2 +- .../flash/action/swf4/ActionMultiply.java | 2 +- .../flash/action/swf4/ActionNot.java | 2 +- .../flash/action/swf4/ActionOr.java | 2 +- .../flash/action/swf4/ActionPop.java | 2 +- .../flash/action/swf4/ActionPush.java | 2 +- .../flash/action/swf4/ActionRandomNumber.java | 2 +- .../flash/action/swf4/ActionRemoveSprite.java | 2 +- .../flash/action/swf4/ActionSetProperty.java | 2 +- .../flash/action/swf4/ActionSetTarget2.java | 2 +- .../flash/action/swf4/ActionSetVariable.java | 2 +- .../flash/action/swf4/ActionStartDrag.java | 2 +- .../flash/action/swf4/ActionStringAdd.java | 2 +- .../flash/action/swf4/ActionStringEquals.java | 2 +- .../action/swf4/ActionStringExtract.java | 2 +- .../flash/action/swf4/ActionStringLength.java | 2 +- .../flash/action/swf4/ActionStringLess.java | 2 +- .../flash/action/swf4/ActionSubtract.java | 2 +- .../flash/action/swf4/ActionToInteger.java | 2 +- .../flash/action/swf4/ActionTrace.java | 2 +- .../action/swf4/ActionWaitForFrame2.java | 4 +- .../flash/action/swf5/ActionAdd2.java | 2 +- .../flash/action/swf5/ActionBitAnd.java | 2 +- .../flash/action/swf5/ActionBitLShift.java | 2 +- .../flash/action/swf5/ActionBitOr.java | 2 +- .../flash/action/swf5/ActionBitRShift.java | 2 +- .../flash/action/swf5/ActionBitURShift.java | 2 +- .../flash/action/swf5/ActionBitXor.java | 2 +- .../flash/action/swf5/ActionCallFunction.java | 2 +- .../flash/action/swf5/ActionCallMethod.java | 2 +- .../flash/action/swf5/ActionConstantPool.java | 2 +- .../flash/action/swf5/ActionDecrement.java | 2 +- .../action/swf5/ActionDefineFunction.java | 2 +- .../flash/action/swf5/ActionDefineLocal.java | 2 +- .../flash/action/swf5/ActionDefineLocal2.java | 2 +- .../flash/action/swf5/ActionDelete.java | 2 +- .../flash/action/swf5/ActionDelete2.java | 2 +- .../flash/action/swf5/ActionEnumerate.java | 2 +- .../flash/action/swf5/ActionEquals2.java | 2 +- .../flash/action/swf5/ActionGetMember.java | 2 +- .../flash/action/swf5/ActionIncrement.java | 2 +- .../flash/action/swf5/ActionInitArray.java | 2 +- .../flash/action/swf5/ActionInitObject.java | 2 +- .../flash/action/swf5/ActionLess2.java | 2 +- .../flash/action/swf5/ActionModulo.java | 2 +- .../flash/action/swf5/ActionNewMethod.java | 2 +- .../flash/action/swf5/ActionNewObject.java | 2 +- .../action/swf5/ActionPushDuplicate.java | 2 +- .../flash/action/swf5/ActionReturn.java | 2 +- .../flash/action/swf5/ActionSetMember.java | 2 +- .../flash/action/swf5/ActionStackSwap.java | 2 +- .../action/swf5/ActionStoreRegister.java | 2 +- .../flash/action/swf5/ActionTargetPath.java | 2 +- .../flash/action/swf5/ActionToNumber.java | 2 +- .../flash/action/swf5/ActionToString.java | 2 +- .../flash/action/swf5/ActionTypeOf.java | 2 +- .../flash/action/swf6/ActionEnumerate2.java | 2 +- .../flash/action/swf6/ActionGreater.java | 2 +- .../flash/action/swf6/ActionInstanceOf.java | 2 +- .../flash/action/swf6/ActionStrictEquals.java | 2 +- .../action/swf6/ActionStringGreater.java | 2 +- .../flash/action/swf7/ActionCastOp.java | 2 +- .../action/swf7/ActionDefineFunction2.java | 2 +- .../flash/action/swf7/ActionExtends.java | 2 +- .../flash/action/swf7/ActionImplementsOp.java | 2 +- .../flash/action/swf7/ActionThrow.java | 2 +- .../flash/gui/action/ActionPanel.java | 2 +- 109 files changed, 293 insertions(+), 214 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java index 1887061b7..b926843d5 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java @@ -2035,7 +2035,7 @@ public final class SWF implements SWFContainerItem, Timelined { ip = code.adr2pos(addr); addr += size; int nextip = code.adr2pos(addr); - getVariables(aLocalData.insideDoInitAction, variables, functions, strings, usageTypes, new ActionGraphSource(path, aLocalData.insideDoInitAction, (ins instanceof ActionDefineFunction), code.getActions().subList(ip, nextip), code.version, new HashMap<>(), new HashMap<>(), new HashMap<>()), 0, path + (cntName == null ? "" : "/" + cntName)); + getVariables(aLocalData.insideDoInitAction, variables, functions, strings, usageTypes, new ActionGraphSource(path, aLocalData.insideDoInitAction, code.getActions().subList(ip, nextip), code.version, new HashMap<>(), new HashMap<>(), new HashMap<>()), 0, path + (cntName == null ? "" : "/" + cntName)); ip = nextip; } List> r = new ArrayList<>(); @@ -2136,7 +2136,7 @@ public final class SWF implements SWFContainerItem, Timelined { ActionList actions = src.getActions(); actionsMap.put(src, actions); boolean insideDoInitAction = src instanceof DoInitActionTag; - getVariables(insideDoInitAction, variables, functions, strings, usageTypes, new ActionGraphSource(path, insideDoInitAction, insideDefineFunction1, actions, version, new HashMap<>(), new HashMap<>(), new HashMap<>()), 0, path); + getVariables(insideDoInitAction, variables, functions, strings, usageTypes, new ActionGraphSource(path, insideDoInitAction, actions, version, new HashMap<>(), new HashMap<>(), new HashMap<>()), 0, path); return ret; } @@ -2292,7 +2292,7 @@ public final class SWF implements SWFContainerItem, Timelined { int staticOperation = Graph.SOP_USE_STATIC; //(Boolean) Configuration.getConfig("autoDeobfuscate", true) ? Graph.SOP_SKIP_STATIC : Graph.SOP_USE_STATIC; List dec; try { - dec = Action.actionsToTree(true /*Yes, inside doInitAction*/, false, dia.getActions(), version, staticOperation, ""/*FIXME*/); + dec = Action.actionsToTree(true /*Yes, inside doInitAction*/, dia.getActions(), version, staticOperation, ""/*FIXME*/); } catch (EmptyStackException ex) { continue; } @@ -2989,7 +2989,8 @@ public final class SWF implements SWFContainerItem, Timelined { timelined.setModified(true); timelined.resetTimeline(); } else // timeline should be always the swf here - if (removeDependencies) { + { + if (removeDependencies) { removeTagWithDependenciesFromTimeline(tag, timelined.getTimeline()); timelined.setModified(true); } else { @@ -2998,6 +2999,7 @@ public final class SWF implements SWFContainerItem, Timelined { timelined.setModified(true); } } + } } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java index b674cffc5..d52275288 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/Action.java @@ -760,7 +760,7 @@ public abstract class Action implements GraphSourceItem { * @param path the value of path * @throws java.lang.InterruptedException */ - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartIns, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) throws InterruptedException { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartIns, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) throws InterruptedException { } @Override @@ -836,8 +836,8 @@ public abstract class Action implements GraphSourceItem { return -1; } - public static List actionsToTree(boolean insideDoInitAction, boolean insideDefineFunction1, List actions, int version, int staticOperation, String path) throws InterruptedException { - return actionsToTree(insideDoInitAction, insideDefineFunction1, new HashMap<>(), new HashMap<>(), new HashMap<>(), actions, version, staticOperation, path); + public static List actionsToTree(boolean insideDoInitAction, List actions, int version, int staticOperation, String path) throws InterruptedException { + return actionsToTree(insideDoInitAction, new HashMap<>(), new HashMap<>(), new HashMap<>(), actions, version, staticOperation, path); } /** @@ -863,7 +863,7 @@ public abstract class Action implements GraphSourceItem { public List call() throws Exception { int staticOperation = Graph.SOP_USE_STATIC; //(Boolean) Configuration.getConfig("autoDeobfuscate", true) ? Graph.SOP_SKIP_STATIC : Graph.SOP_USE_STATIC; boolean insideDoInitAction = (asm instanceof DoInitActionTag); - List tree = actionsToTree(insideDoInitAction, false, new HashMap<>(), new HashMap<>(), new HashMap<>(), actions, version, staticOperation, path); + List tree = actionsToTree(insideDoInitAction, new HashMap<>(), new HashMap<>(), new HashMap<>(), actions, version, staticOperation, path); SWFDecompilerPlugin.fireActionTreeCreated(tree, swf); if (Configuration.autoDeobfuscate.get()) { new ActionDeobfuscator().actionTreeCreated(tree, swf); @@ -921,8 +921,8 @@ public abstract class Action implements GraphSourceItem { * @return List of treeItems * @throws java.lang.InterruptedException */ - public static List actionsToTree(boolean insideDoInitAction, boolean insideDefineFunction1, HashMap regNames, HashMap variables, HashMap functions, List actions, int version, int staticOperation, String path) throws InterruptedException { - return ActionGraph.translateViaGraph(insideDoInitAction, insideDefineFunction1, regNames, variables, functions, actions, version, staticOperation, path); + public static List actionsToTree(boolean insideDoInitAction, HashMap regNames, HashMap variables, HashMap functions, List actions, int version, int staticOperation, String path) throws InterruptedException { + return ActionGraph.translateViaGraph(insideDoInitAction, regNames, variables, functions, actions, version, staticOperation, path); } @Override @@ -934,7 +934,7 @@ public abstract class Action implements GraphSourceItem { } expectedSize += getStackPushCount(localData, stack);*/ - translate(aLocalData.insideDoInitAction, aLocalData.insideDefineFunction1, aLocalData.lineStartAction, stack, output, aLocalData.regNames, aLocalData.variables, aLocalData.functions, staticOperation, path); + translate(aLocalData.insideDoInitAction, aLocalData.lineStartAction, stack, output, aLocalData.regNames, aLocalData.variables, aLocalData.functions, staticOperation, path); /*if (stack.size() != expectedSize && !(this instanceof ActionPushDuplicate)) { throw new Error("HONFIKA stack size mismatch"); }*/ @@ -970,7 +970,7 @@ public abstract class Action implements GraphSourceItem { this.ignored = ignored; } - public static List actionsPartToTree(boolean insideDoInitAction, boolean insideDefineFunction1, Reference fi, HashMap registerNames, HashMap variables, HashMap functions, TranslateStack stack, List actions, int start, int end, int version, int staticOperation, String path) throws InterruptedException { + public static List actionsPartToTree(boolean insideDoInitAction, Reference fi, HashMap registerNames, HashMap variables, HashMap functions, TranslateStack stack, List actions, int start, int end, int version, int staticOperation, String path) throws InterruptedException { if (start < actions.size() && (end > 0) && (start > 0)) { logger.log(Level.FINE, "Entering {0}-{1}{2}", new Object[]{start, end, actions.size() > 0 ? (" (" + actions.get(start).toString() + " - " + actions.get(end == actions.size() ? end - 1 : end) + ")") : ""}); } @@ -1044,7 +1044,7 @@ public abstract class Action implements GraphSourceItem { } } } - out = ActionGraph.translateViaGraph(insideDoInitAction, (cnt instanceof ActionDefineFunction), regNames, variables2, functions, actions.subList(adr2ip(actions, endAddr), adr2ip(actions, endAddr + size)), version, staticOperation, path + (cntName == null ? "" : "/" + cntName)); + out = ActionGraph.translateViaGraph(insideDoInitAction, regNames, variables2, functions, actions.subList(adr2ip(actions, endAddr), adr2ip(actions, endAddr + size)), version, staticOperation, path + (cntName == null ? "" : "/" + cntName)); } catch (OutOfMemoryError | TranslateException | StackOverflowError ex) { logger.log(Level.SEVERE, "Decompilation error in: " + path, ex); if (ex instanceof OutOfMemoryError) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionDefineFunctionPushRegistersCleaner.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionDefineFunctionPushRegistersCleaner.java index 704c8c8c4..ff2121c22 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionDefineFunctionPushRegistersCleaner.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionDefineFunctionPushRegistersCleaner.java @@ -16,13 +16,16 @@ */ package com.jpexs.decompiler.flash.action; +import com.jpexs.decompiler.flash.SWF; import com.jpexs.decompiler.flash.action.swf4.ActionJump; import com.jpexs.decompiler.flash.action.swf4.ActionPop; import com.jpexs.decompiler.flash.action.swf4.ActionPush; import com.jpexs.decompiler.flash.action.swf4.RegisterNumber; +import com.jpexs.decompiler.flash.action.swf5.ActionDefineFunction; import com.jpexs.decompiler.flash.action.swf5.ActionReturn; import com.jpexs.decompiler.flash.action.swf5.ActionStoreRegister; import com.jpexs.decompiler.flash.ecma.Undefined; +import com.jpexs.decompiler.flash.helpers.SWFDecompilerAdapter; import java.util.ArrayList; import java.util.Comparator; import java.util.Iterator; @@ -44,13 +47,39 @@ import java.util.TreeSet; * * @author JPEXS */ -public class ActionDefineFunctionPushRegistersCleaner { +public class ActionDefineFunctionPushRegistersCleaner extends SWFDecompilerAdapter { - public List cleanPushRegisters(List code) { - ActionList actionList = new ActionList(code); + @Override + public void actionListParsed(ActionList actions, SWF swf) throws InterruptedException { + cleanActionDefineFunctions(actions); + } - if (actionList.isEmpty()) { - return code; + private void cleanActionDefineFunctions(ActionList actions) { + for (int i = actions.size() - 1; i >= 0; i--) { + Action action = actions.get(i); + if (action instanceof ActionDefineFunction) { + ActionDefineFunction def = (ActionDefineFunction) action; + + List sizes = def.getContainerSizes(); + long endAddress = action.getAddress() + def.getHeaderSize() + sizes.get(0); + int lastIndex = actions.getIndexByAddress(endAddress); + int startIndex = i + 1; + int count = lastIndex - startIndex; + cleanPushRegisters(actions, startIndex, count); + } + } + } + + /** + * + * @param code + * @param startIndex Index of first Action in DefineFunction body + * @param count Count of actions in DefineFunction + * @return + */ + private boolean cleanPushRegisters(ActionList code, int startIndex, int count) { + if (count == 0) { + return false; } /* @@ -58,10 +87,10 @@ public class ActionDefineFunctionPushRegistersCleaner { Push register1 register2 normalval */ List pushedRegisters = new ArrayList<>(); - int pos = 0; + int pos = startIndex; loopregs: - while (actionList.get(pos) instanceof ActionPush) { - ActionPush ap = (ActionPush) actionList.get(pos); + while (code.get(pos) instanceof ActionPush) { + ActionPush ap = (ActionPush) code.get(pos); for (int i = 0; i < ap.values.size(); i++) { if (ap.values.get(i) instanceof RegisterNumber) { RegisterNumber rn = (RegisterNumber) ap.values.get(i); @@ -71,9 +100,12 @@ public class ActionDefineFunctionPushRegistersCleaner { } } pos++; + if (pos >= code.size()) { + return false; + } } if (pushedRegisters.isEmpty()) { - return code; + return false; } /* @@ -95,131 +127,165 @@ public class ActionDefineFunctionPushRegistersCleaner { StoreRegister 1 Pop + when original function has some returns, but no return at the end of function: + Push undefined + locjump: StoreRegister 0 + Pop + ... */ int returnReg = -1; - pos = actionList.size() - 1; - if (actionList.get(pos) instanceof ActionReturn) { + pos = startIndex + count - 1; + if (code.get(pos) instanceof ActionReturn) { pos--; - if (pos == -1) { - return code; + if (pos < startIndex) { + return false; } - if (!(actionList.get(pos) instanceof ActionPush)) { - return code; + if (!(code.get(pos) instanceof ActionPush)) { + return false; } - ActionPush pu = (ActionPush) actionList.get(pos); + ActionPush pu = (ActionPush) code.get(pos); if (pu.values.size() != 1) { - return code; + return false; } if (!(pu.values.get(0) instanceof RegisterNumber)) { - return code; + return false; } RegisterNumber rn = (RegisterNumber) pu.values.get(0); returnReg = rn.number; pos--; - if (pos == -1) { - return code; + if (pos < startIndex) { + return false; } + } for (int i = 0; i < pushedRegisters.size(); i++) { - if (!(actionList.get(pos) instanceof ActionPop)) { - return code; + if (!(code.get(pos) instanceof ActionPop)) { + return false; } pos--; - if (pos == -1) { - return code; + if (pos < startIndex) { + return false; } - if (!(actionList.get(pos) instanceof ActionStoreRegister)) { - return code; + if (!(code.get(pos) instanceof ActionStoreRegister)) { + return false; } - ActionStoreRegister asr = (ActionStoreRegister) actionList.get(pos); + ActionStoreRegister asr = (ActionStoreRegister) code.get(pos); int expectedReg = pushedRegisters.get(i); if (asr.registerNumber != expectedReg) { - return code; + return false; } pos--; - if (pos == -1) { - return code; + if (pos < startIndex) { + return false; } } - Set refPos = new TreeSet<>(new Comparator() { + Set jumpsToReturnPositions = new TreeSet<>(new Comparator() { @Override public int compare(Integer o1, Integer o2) { return o2 - o1; //biggest first } }); + + int posBeforeFinishPart; + Action actionBeforeFinishPart = null; if (returnReg > -1) { - if (!(actionList.get(pos) instanceof ActionPop)) { - return code; + if (!(code.get(pos) instanceof ActionPop)) { + return false; } pos--; - if (pos == -1) { - return code; + if (pos < startIndex) { + return false; } - if (!(actionList.get(pos) instanceof ActionStoreRegister)) { - return code; + if (!(code.get(pos) instanceof ActionStoreRegister)) { + return false; } - ActionStoreRegister asr = (ActionStoreRegister) actionList.get(pos); + ActionStoreRegister asr = (ActionStoreRegister) code.get(pos); int expectedReg = returnReg; if (asr.registerNumber != expectedReg) { - return code; + return false; } - if (!(actionList.get(pos - 1) instanceof ActionJump)) { - refPos.add(pos - 1); - } - Iterator ait = actionList.getReferencesFor(asr); + Iterator ait = code.getReferencesFor(asr); while (ait.hasNext()) { Action a = ait.next(); - refPos.add(actionList.indexOf(a)); + if (!(a instanceof ActionJump)) { + return false; + } + jumpsToReturnPositions.add(code.indexOf(a)); } pos--; + if (!(code.get(pos) instanceof ActionJump)) { + actionBeforeFinishPart = code.get(pos); + } + posBeforeFinishPart = pos; + } else { + posBeforeFinishPart = pos; } //process code... - //TODO: make this somehow create new list instead of modifying current one - for (Integer jp : refPos) { + //replace jumps to return with returns + for (Integer jp : jumpsToReturnPositions) { int index = jp; - Action a = actionList.get(index); - if (a instanceof ActionJump) { - actionList.remove(index); - actionList.addAction(index, new ActionReturn()); - } else if ((a instanceof ActionPush) && ((ActionPush) a).values.size() == 1 && ((ActionPush) a).values.get(0) == Undefined.INSTANCE) { - actionList.remove(a); - } else { - actionList.addAction(index + 1, new ActionReturn()); - pos++; + code.removeAction(index); + code.addAction(index, new ActionReturn()); + } + + //previous action (not jump) also leads to finishpart, we might add return there aswell + if (returnReg > -1 && actionBeforeFinishPart != null) { + if ((actionBeforeFinishPart instanceof ActionPush) && ((ActionPush) actionBeforeFinishPart).values.size() == 1 && ((ActionPush) actionBeforeFinishPart).values.get(0) == Undefined.INSTANCE) { + //its return undefined, which is same as no return + code.removeAction(posBeforeFinishPart); + posBeforeFinishPart--; + count--; + } else if (actionBeforeFinishPart instanceof ActionReturn) { + //it was a jump that was replaced with Return + } else if (actionBeforeFinishPart instanceof ActionJump) { + //its jump to another location, we will not add return there + } else { //might be another returned value + posBeforeFinishPart++; + code.addAction(posBeforeFinishPart, new ActionReturn()); + count++; //action added, but not removed, we increase total count } } - int posFromEnd = actionList.size() - pos - 1; + //remove finishPart + int removeStartIndex = posBeforeFinishPart + 1; + int removeCount = startIndex + count - removeStartIndex; + code.removeAction(removeStartIndex, removeCount); - actionList.removeAction(actionList.size() - posFromEnd, posFromEnd); - - pos = 0; - int removedCnt = pushedRegisters.size(); + //remove pushes from beginning part + pos = startIndex; + int registersLeft = pushedRegisters.size(); loopregs2: - while (actionList.get(pos) instanceof ActionPush) { - ActionPush ap = (ActionPush) actionList.get(pos); - for (int i = 0; i < ap.values.size(); i++) { - if (ap.values.get(i) instanceof RegisterNumber) { - ap.values.remove(i); - i--; - removedCnt--; - if (ap.values.isEmpty()) { - actionList.removeAction(pos); - } - if (removedCnt == 0) { - break loopregs2; - } + while (code.get(pos) instanceof ActionPush) { + ActionPush currentPush = (ActionPush) code.get(pos); + + List currentPushedValues = currentPush.values; + List newPushedValues = new ArrayList<>(); + for (int i = 0; i < currentPushedValues.size(); i++) { + if (registersLeft > 0 && currentPushedValues.get(i) instanceof RegisterNumber) { + registersLeft--; } else { - break loopregs2; + newPushedValues.add(currentPushedValues.get(i)); } } + if (newPushedValues.size() != currentPushedValues.size()) { + code.removeAction(pos); //remove that push + if (!newPushedValues.isEmpty()) { + ActionPush newPush = new ActionPush(newPushedValues.toArray()); + newPush.constantPool = currentPush.constantPool; + code.addAction(pos, newPush); //replace with different push + } else { + pos--; //action removed, but not added + } + } + if (registersLeft == 0) { //we removed all unwanted registers + break; + } pos++; } - - return actionList; + return true; } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java index ba3f09202..1ce070baa 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraph.java @@ -66,8 +66,8 @@ public class ActionGraph extends Graph { private boolean insideDoInitAction; - public ActionGraph(String path, boolean insideDoInitAction, boolean insideDefineFunction1, List code, HashMap registerNames, HashMap variables, HashMap functions, int version) { - super(new ActionGraphSource(path, insideDoInitAction, insideDefineFunction1, code, version, registerNames, variables, functions), new ArrayList<>()); + public ActionGraph(String path, boolean insideDoInitAction, List code, HashMap registerNames, HashMap variables, HashMap functions, int version) { + super(new ActionGraphSource(path, insideDoInitAction, code, version, registerNames, variables, functions), new ArrayList<>()); this.insideDoInitAction = insideDoInitAction; } @@ -80,12 +80,8 @@ public class ActionGraph extends Graph { } - public static List translateViaGraph(boolean insideDoInitAction, boolean insideDefineFunction1, HashMap registerNames, HashMap variables, HashMap functions, List code, int version, int staticOperation, String path) throws InterruptedException { - if (insideDefineFunction1) { - ActionDefineFunctionPushRegistersCleaner fixer = new ActionDefineFunctionPushRegistersCleaner(); - code = fixer.cleanPushRegisters(code); - } - ActionGraph g = new ActionGraph(path, insideDoInitAction, insideDefineFunction1, code, registerNames, variables, functions, version); + public static List translateViaGraph(boolean insideDoInitAction, HashMap registerNames, HashMap variables, HashMap functions, List code, int version, int staticOperation, String path) throws InterruptedException { + ActionGraph g = new ActionGraph(path, insideDoInitAction, code, registerNames, variables, functions, version); ActionLocalData localData = new ActionLocalData(insideDoInitAction, registerNames); g.init(localData); return g.translate(localData, staticOperation, path); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraphSource.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraphSource.java index 1b502e52c..e1458a84b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraphSource.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionGraphSource.java @@ -48,22 +48,19 @@ public class ActionGraphSource extends GraphSource { private final boolean insideDoInitAction; - private final boolean insideDefineFunction1; - private final String path; public List getActions() { return actions; } - public ActionGraphSource(String path, boolean insideDoInitAction, boolean insideDefineFunction1, List actions, int version, HashMap registerNames, HashMap variables, HashMap functions) { + public ActionGraphSource(String path, boolean insideDoInitAction, List actions, int version, HashMap registerNames, HashMap variables, HashMap functions) { this.actions = actions; this.version = version; this.registerNames = registerNames; this.variables = variables; this.functions = functions; this.insideDoInitAction = insideDoInitAction; - this.insideDefineFunction1 = insideDefineFunction1; this.path = path; } @@ -90,7 +87,7 @@ public class ActionGraphSource extends GraphSource { public List translatePart(GraphPart part, BaseLocalData localData, TranslateStack stack, int start, int end, int staticOperation, String path) throws InterruptedException { Reference fi = new Reference<>(localData.lineStartInstruction); - List r = Action.actionsPartToTree(this.insideDoInitAction, this.insideDefineFunction1, fi, registerNames, variables, functions, stack, actions, start, end, version, staticOperation, path); + List r = Action.actionsPartToTree(this.insideDoInitAction, fi, registerNames, variables, functions, stack, actions, start, end, version, staticOperation, path); localData.lineStartInstruction = fi.getVal(); return r; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionListReader.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionListReader.java index 1a9b7eaca..81855dd48 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionListReader.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionListReader.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.action; import com.jpexs.decompiler.flash.DisassemblyListener; @@ -31,7 +32,11 @@ import com.jpexs.decompiler.flash.configuration.Configuration; import com.jpexs.decompiler.flash.helpers.SWFDecompilerPlugin; import com.jpexs.decompiler.graph.GraphSourceItemContainer; import com.jpexs.helpers.CancellableWorker; +import com.jpexs.helpers.Helper; import com.jpexs.helpers.stat.Statistics; +import com.jpexs.helpers.utf8.Utf8Helper; +import java.io.ByteArrayInputStream; +import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; @@ -163,6 +168,15 @@ public class ActionListReader { } } + //TODO: This cleaner needs to be executed only before actual decompilation, not when disassembly only + try { + new ActionDefineFunctionPushRegistersCleaner().actionListParsed(actions, sis.getSwf()); + } catch (ThreadDeath | InterruptedException ex) { + throw ex; + } catch (Throwable ex) { + logger.log(Level.SEVERE, "Cleaning push registers in ActionDefineFunction failed: " + path, ex); + } + return actions; } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionLocalData.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionLocalData.java index cf425951a..8471cef69 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionLocalData.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/ActionLocalData.java @@ -37,8 +37,6 @@ public class ActionLocalData extends BaseLocalData { public boolean insideDoInitAction; - public boolean insideDefineFunction1 = false; - public ActionLocalData(boolean insideDoInitAction) { regNames = new HashMap<>(); variables = new HashMap<>(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/deobfuscation/ActionDeobfuscator.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/deobfuscation/ActionDeobfuscator.java index ab21d6aea..5a2a67f4f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/deobfuscation/ActionDeobfuscator.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/deobfuscation/ActionDeobfuscator.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.action.deobfuscation; import com.jpexs.decompiler.flash.IdentifiersDeobfuscation; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/flashlite/ActionFSCommand2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/flashlite/ActionFSCommand2.java index d202d85f0..74999df6e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/flashlite/ActionFSCommand2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/flashlite/ActionFSCommand2.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.action.flashlite; import com.jpexs.decompiler.flash.BaseLocalData; @@ -42,7 +43,7 @@ public class ActionFSCommand2 extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartItem, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartItem, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { long numArgs = popLong(stack); GraphTargetItem command = stack.pop(); List args = new ArrayList<>(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/flashlite/ActionStrictMode.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/flashlite/ActionStrictMode.java index 667746d9b..a83f6bbc8 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/flashlite/ActionStrictMode.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/flashlite/ActionStrictMode.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.action.flashlite; import com.jpexs.decompiler.flash.SWFInputStream; @@ -73,7 +74,7 @@ public class ActionStrictMode extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartItem, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartItem, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new StrictModeActionItem(this, lineStartItem, mode)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionEnd.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionEnd.java index a830d05fc..550898b50 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionEnd.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionEnd.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.action.special; import com.jpexs.decompiler.flash.action.Action; @@ -52,7 +53,7 @@ public class ActionEnd extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartItem, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartItem, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { //output.add(new SimpleActionTreeItem(this, "end()")); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionNop.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionNop.java index a74c6764f..a44569044 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionNop.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionNop.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.action.special; import com.jpexs.decompiler.flash.action.Action; @@ -48,7 +49,7 @@ public class ActionNop extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartItem, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartItem, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { //output.add(new SimpleActionTreeItem(this, "nop();")); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionUnknown.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionUnknown.java index 88de63203..8e1947052 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionUnknown.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/special/ActionUnknown.java @@ -12,7 +12,8 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library. */ + * License along with this library. + */ package com.jpexs.decompiler.flash.action.special; import com.jpexs.decompiler.flash.action.LocalDataArea; @@ -45,6 +46,6 @@ public class ActionUnknown extends ActionNop { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartItem, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartItem, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGetURL.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGetURL.java index 4a46a1443..4402a9f05 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGetURL.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGetURL.java @@ -97,7 +97,7 @@ public class ActionGetURL extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { String fsCommandPrefix = "FSCommand:"; if (urlString.startsWith(fsCommandPrefix) && targetString.isEmpty()) { String command = urlString.substring(fsCommandPrefix.length()); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGoToLabel.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGoToLabel.java index 99a77bdce..3a29e2329 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGoToLabel.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGoToLabel.java @@ -86,7 +86,7 @@ public class ActionGoToLabel extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new GotoLabelActionItem(this, lineStartAction, label)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGotoFrame.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGotoFrame.java index c9c837b08..87007a465 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGotoFrame.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionGotoFrame.java @@ -82,7 +82,7 @@ public class ActionGotoFrame extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new GotoFrameActionItem(this, lineStartAction, frame)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionNextFrame.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionNextFrame.java index 53b540d96..54e5c4c97 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionNextFrame.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionNextFrame.java @@ -53,7 +53,7 @@ public class ActionNextFrame extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new NextFrameActionItem(this, lineStartAction)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionPlay.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionPlay.java index d2e4c1cd1..17ac6f266 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionPlay.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionPlay.java @@ -52,7 +52,7 @@ public class ActionPlay extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { if (!output.isEmpty() && (output.get(output.size() - 1) instanceof GotoFrameActionItem)) { GotoFrameActionItem gta = (GotoFrameActionItem) output.remove(output.size() - 1); output.add(new GotoFrame2ActionItem(this, lineStartAction, new DirectValueActionItem(gta.frame + 1), false, true, 0)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionPrevFrame.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionPrevFrame.java index e3505fe7b..bea471769 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionPrevFrame.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionPrevFrame.java @@ -53,7 +53,7 @@ public class ActionPrevFrame extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new PrevFrameActionItem(this, lineStartAction)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionSetTarget.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionSetTarget.java index 8f8f68825..2f17d6a9d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionSetTarget.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionSetTarget.java @@ -90,7 +90,7 @@ public class ActionSetTarget extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new SetTargetActionItem(this, lineStartAction, targetName)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionStop.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionStop.java index 5fd859e5e..2e8a38461 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionStop.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionStop.java @@ -49,7 +49,7 @@ public class ActionStop extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new StopActionItem(this, lineStartAction)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionStopSounds.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionStopSounds.java index b3454a416..d9268e653 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionStopSounds.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionStopSounds.java @@ -48,7 +48,7 @@ public class ActionStopSounds extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new StopAllSoundsActionItem(this, lineStartAction)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionToggleQuality.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionToggleQuality.java index 19ea72fd6..343848280 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionToggleQuality.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionToggleQuality.java @@ -48,7 +48,7 @@ public class ActionToggleQuality extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new ToggleHighQualityActionItem(this, lineStartAction)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionWaitForFrame.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionWaitForFrame.java index 9382e0960..deb356b04 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionWaitForFrame.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf3/ActionWaitForFrame.java @@ -100,9 +100,9 @@ public class ActionWaitForFrame extends Action implements ActionStore { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) throws InterruptedException { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) throws InterruptedException { GraphTargetItem frameTi = new DirectValueActionItem(null, null, 0, new Long(frame), new ArrayList<>()); - List body = ActionGraph.translateViaGraph(insideDoInitAction, insideDefineFunction1, regNames, variables, functions, skipped, SWF.DEFAULT_VERSION, staticOperation, path); + List body = ActionGraph.translateViaGraph(insideDoInitAction, regNames, variables, functions, skipped, SWF.DEFAULT_VERSION, staticOperation, path); output.add(new IfFrameLoadedActionItem(frameTi, body, this, lineStartAction)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAdd.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAdd.java index 3c446fba5..ef754c664 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAdd.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAdd.java @@ -54,7 +54,7 @@ public class ActionAdd extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new AddActionItem(this, lineStartAction, b, a, false)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAnd.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAnd.java index 41946d6b1..42e1813b3 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAnd.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAnd.java @@ -53,7 +53,7 @@ public class ActionAnd extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new AndActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAsciiToChar.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAsciiToChar.java index d998313eb..e968b2e8f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAsciiToChar.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionAsciiToChar.java @@ -53,7 +53,7 @@ public class ActionAsciiToChar extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); stack.push(new AsciiToCharActionItem(this, lineStartAction, a)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCall.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCall.java index 0c95ed2e4..0e15e05bb 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCall.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCall.java @@ -58,7 +58,7 @@ public class ActionCall extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new CallActionItem(this, lineStartAction, stack.pop())); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCharToAscii.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCharToAscii.java index ea24a8a3e..a6b643b20 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCharToAscii.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCharToAscii.java @@ -53,7 +53,7 @@ public class ActionCharToAscii extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); stack.push(new CharToAsciiActionItem(this, lineStartAction, a)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCloneSprite.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCloneSprite.java index 0ac1fd0f3..5b2a63575 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCloneSprite.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionCloneSprite.java @@ -64,7 +64,7 @@ public class ActionCloneSprite extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem depth = stack.pop(); GraphTargetItem source = stack.pop(); GraphTargetItem target = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionDivide.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionDivide.java index 6cfa6fdef..668d4b9c2 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionDivide.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionDivide.java @@ -53,7 +53,7 @@ public class ActionDivide extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new DivideActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionEndDrag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionEndDrag.java index 22224d0c6..def6d7280 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionEndDrag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionEndDrag.java @@ -52,7 +52,7 @@ public class ActionEndDrag extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { output.add(new StopDragActionItem(this, lineStartAction)); } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionEquals.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionEquals.java index fdada2174..66a7af3df 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionEquals.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionEquals.java @@ -53,7 +53,7 @@ public class ActionEquals extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new EqActionItem(this, lineStartAction, b, a, false)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetProperty.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetProperty.java index 36f2c193d..82043030e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetProperty.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetProperty.java @@ -64,7 +64,7 @@ public class ActionGetProperty extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem index = stack.pop(); GraphTargetItem target = stack.pop(); int indexInt = 0; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetTime.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetTime.java index 03cb4cd8b..53c89e2ce 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetTime.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetTime.java @@ -49,7 +49,7 @@ public class ActionGetTime extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { stack.push(new GetTimeActionItem(this, lineStartAction)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetURL2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetURL2.java index e480cc0fa..82a8a8053 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetURL2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetURL2.java @@ -124,7 +124,7 @@ public class ActionGetURL2 extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem targetString = stack.pop(); GraphTargetItem urlString = stack.pop(); Integer num = null; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetVariable.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetVariable.java index 2a9eeec7d..a958fe498 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetVariable.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGetVariable.java @@ -64,7 +64,7 @@ public class ActionGetVariable extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem name = stack.pop(); String nameStr; if (name instanceof DirectValueActionItem) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGotoFrame2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGotoFrame2.java index 3b67092bf..8b9e40d66 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGotoFrame2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionGotoFrame2.java @@ -143,7 +143,7 @@ public class ActionGotoFrame2 extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem frame = stack.pop(); output.add(new GotoFrame2ActionItem(this, lineStartAction, frame, sceneBiasFlag, playFlag, sceneBias)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionLess.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionLess.java index eab14aecd..bb736f67e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionLess.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionLess.java @@ -53,7 +53,7 @@ public class ActionLess extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new LtActionItem(this, lineStartAction, b, a, false)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBAsciiToChar.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBAsciiToChar.java index 5e9ad9cb7..1a9f3b179 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBAsciiToChar.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBAsciiToChar.java @@ -53,7 +53,7 @@ public class ActionMBAsciiToChar extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); stack.push(new MBAsciiToCharActionItem(this, lineStartAction, a)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBCharToAscii.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBCharToAscii.java index 3dba0cfac..ecef9ab58 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBCharToAscii.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBCharToAscii.java @@ -53,7 +53,7 @@ public class ActionMBCharToAscii extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); stack.push(new MBCharToAsciiActionItem(this, lineStartAction, a)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBStringExtract.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBStringExtract.java index 403f41c48..9ff7864cf 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBStringExtract.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBStringExtract.java @@ -53,7 +53,7 @@ public class ActionMBStringExtract extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem count = stack.pop(); GraphTargetItem index = stack.pop(); GraphTargetItem value = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBStringLength.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBStringLength.java index 77374875f..84e6df110 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBStringLength.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMBStringLength.java @@ -53,7 +53,7 @@ public class ActionMBStringLength extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); stack.push(new MBStringLengthActionItem(this, lineStartAction, a)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMultiply.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMultiply.java index b8947c9b8..e86acdae7 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMultiply.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionMultiply.java @@ -53,7 +53,7 @@ public class ActionMultiply extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new MultiplyActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionNot.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionNot.java index 1f6bc80f0..52d8161c4 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionNot.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionNot.java @@ -53,7 +53,7 @@ public class ActionNot extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); stack.push(a.invert(this)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionOr.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionOr.java index 0ddb2d24f..4eff80e10 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionOr.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionOr.java @@ -53,7 +53,7 @@ public class ActionOr extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new OrActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPop.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPop.java index ad133aeae..0fa744297 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPop.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPop.java @@ -52,7 +52,7 @@ public class ActionPop extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem val = stack.pop(); output.add(val); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPush.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPush.java index 1b26b1295..bcf989921 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPush.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionPush.java @@ -389,7 +389,7 @@ public class ActionPush extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { int pos = 0; for (Object o : values) { if (o instanceof ConstantIndex) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionRandomNumber.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionRandomNumber.java index 3a9d1d6c9..4ead65188 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionRandomNumber.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionRandomNumber.java @@ -53,7 +53,7 @@ public class ActionRandomNumber extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem maximum = stack.pop(); stack.push(new RandomNumberActionItem(this, lineStartAction, maximum)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionRemoveSprite.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionRemoveSprite.java index 97e65588c..80106f46b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionRemoveSprite.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionRemoveSprite.java @@ -55,7 +55,7 @@ public class ActionRemoveSprite extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem target = stack.pop(); output.add(new RemoveSpriteActionItem(this, lineStartAction, target)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetProperty.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetProperty.java index 69564eda4..ce3a26c6f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetProperty.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetProperty.java @@ -70,7 +70,7 @@ public class ActionSetProperty extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem value = stack.pop().getThroughDuplicate(); GraphTargetItem index = stack.pop().getThroughDuplicate(); GraphTargetItem target = stack.pop().getThroughDuplicate(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetTarget2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetTarget2.java index 82ff0bcfc..a34cd1937 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetTarget2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetTarget2.java @@ -54,7 +54,7 @@ public class ActionSetTarget2 extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem target = stack.pop(); output.add(new SetTarget2ActionItem(this, lineStartAction, target)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetVariable.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetVariable.java index 806425dff..4c421da6c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetVariable.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSetVariable.java @@ -68,7 +68,7 @@ public class ActionSetVariable extends Action implements StoreTypeAction { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem value = stack.pop().getThroughDuplicate(); GraphTargetItem name = stack.pop(); String nameStr; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStartDrag.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStartDrag.java index 4df4169d0..39cd5a110 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStartDrag.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStartDrag.java @@ -54,7 +54,7 @@ public class ActionStartDrag extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem target = stack.pop(); GraphTargetItem lockCenter = stack.pop(); GraphTargetItem constrain = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringAdd.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringAdd.java index df83ffe01..16dd9d740 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringAdd.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringAdd.java @@ -53,7 +53,7 @@ public class ActionStringAdd extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new StringAddActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringEquals.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringEquals.java index 40fab28ee..7c2443d9a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringEquals.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringEquals.java @@ -53,7 +53,7 @@ public class ActionStringEquals extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new StringEqActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringExtract.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringExtract.java index 6c481744d..eb8d71683 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringExtract.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringExtract.java @@ -53,7 +53,7 @@ public class ActionStringExtract extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem count = stack.pop(); GraphTargetItem index = stack.pop(); GraphTargetItem value = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringLength.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringLength.java index acc19e95b..83e3b08c2 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringLength.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringLength.java @@ -53,7 +53,7 @@ public class ActionStringLength extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); stack.push(new StringLengthActionItem(this, lineStartAction, a)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringLess.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringLess.java index 1c157c562..fbfa1c193 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringLess.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionStringLess.java @@ -53,7 +53,7 @@ public class ActionStringLess extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new StringLtActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSubtract.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSubtract.java index e87bf7ceb..f1b64d9b2 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSubtract.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionSubtract.java @@ -53,7 +53,7 @@ public class ActionSubtract extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new SubtractActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionToInteger.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionToInteger.java index db078a6ad..80ab50aca 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionToInteger.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionToInteger.java @@ -53,7 +53,7 @@ public class ActionToInteger extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); stack.push(new ToIntegerActionItem(this, lineStartAction, a)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionTrace.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionTrace.java index c41fa5d80..65e4bc53b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionTrace.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionTrace.java @@ -53,7 +53,7 @@ public class ActionTrace extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem value = stack.pop(); output.add(new TraceActionItem(this, lineStartAction, value)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionWaitForFrame2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionWaitForFrame2.java index e25e3c21b..ab6de28dc 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionWaitForFrame2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf4/ActionWaitForFrame2.java @@ -146,9 +146,9 @@ public class ActionWaitForFrame2 extends Action implements ActionStore { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) throws InterruptedException { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) throws InterruptedException { GraphTargetItem frame = stack.pop(); - List body = ActionGraph.translateViaGraph(insideDoInitAction, insideDefineFunction1, regNames, variables, functions, skipped, SWF.DEFAULT_VERSION, staticOperation, path); + List body = ActionGraph.translateViaGraph(insideDoInitAction, regNames, variables, functions, skipped, SWF.DEFAULT_VERSION, staticOperation, path); output.add(new IfFrameLoadedActionItem(frame, body, this, lineStartAction)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionAdd2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionAdd2.java index f42607162..3145db61b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionAdd2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionAdd2.java @@ -53,7 +53,7 @@ public class ActionAdd2 extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new AddActionItem(this, lineStartAction, b, a, true)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitAnd.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitAnd.java index d5c4b3a68..cc4332ac5 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitAnd.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitAnd.java @@ -53,7 +53,7 @@ public class ActionBitAnd extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new BitAndActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitLShift.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitLShift.java index ffad9789b..cc23921b3 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitLShift.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitLShift.java @@ -53,7 +53,7 @@ public class ActionBitLShift extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new LShiftActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitOr.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitOr.java index 89ed1cd3b..54976f587 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitOr.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitOr.java @@ -53,7 +53,7 @@ public class ActionBitOr extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new BitOrActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitRShift.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitRShift.java index 84cbe025e..b0565ddc9 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitRShift.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitRShift.java @@ -53,7 +53,7 @@ public class ActionBitRShift extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new RShiftActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitURShift.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitURShift.java index e5ca97736..78bee5c3f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitURShift.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitURShift.java @@ -53,7 +53,7 @@ public class ActionBitURShift extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new URShiftActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitXor.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitXor.java index 79f9c5ab4..0eb5a9d32 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitXor.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionBitXor.java @@ -53,7 +53,7 @@ public class ActionBitXor extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new BitXorActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionCallFunction.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionCallFunction.java index 76aae74ff..0c0da6a54 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionCallFunction.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionCallFunction.java @@ -66,7 +66,7 @@ public class ActionCallFunction extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem functionName = stack.pop(); long numArgs = popLong(stack); List args = new ArrayList<>(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionCallMethod.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionCallMethod.java index 31d23c9d4..87e2836da 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionCallMethod.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionCallMethod.java @@ -75,7 +75,7 @@ public class ActionCallMethod extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem methodName = stack.pop(); GraphTargetItem scriptObject = stack.pop(); long numArgs = popLong(stack); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionConstantPool.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionConstantPool.java index 03106db19..fd2918da9 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionConstantPool.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionConstantPool.java @@ -117,6 +117,6 @@ public class ActionConstantPool extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { } } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDecrement.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDecrement.java index 55935126c..1e25fd189 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDecrement.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDecrement.java @@ -53,7 +53,7 @@ public class ActionDecrement extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); stack.push(new DecrementActionItem(this, lineStartAction, a)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineFunction.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineFunction.java index 3994b2438..a38fb42da 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineFunction.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineFunction.java @@ -159,7 +159,7 @@ public class ActionDefineFunction extends Action implements GraphSourceItemConta } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineLocal.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineLocal.java index eba5d1a77..485ab6684 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineLocal.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineLocal.java @@ -57,7 +57,7 @@ public class ActionDefineLocal extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem value = stack.pop(); GraphTargetItem name = stack.pop(); String nameStr; diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineLocal2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineLocal2.java index de71611b4..e3b7dbfc5 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineLocal2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDefineLocal2.java @@ -45,7 +45,7 @@ public class ActionDefineLocal2 extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem name = stack.pop(); output.add(new DefineLocalActionItem(this, lineStartAction, name, null)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDelete.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDelete.java index a406f26db..dad1a29b3 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDelete.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDelete.java @@ -54,7 +54,7 @@ public class ActionDelete extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem propertyName = stack.pop(); GraphTargetItem object = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDelete2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDelete2.java index 9b1a4603f..4be8b52b2 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDelete2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionDelete2.java @@ -60,7 +60,7 @@ public class ActionDelete2 extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem propertyName = stack.pop(); stack.push(new DeleteActionItem(this, lineStartAction, null, propertyName)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionEnumerate.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionEnumerate.java index adb68b3d6..3d6cca063 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionEnumerate.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionEnumerate.java @@ -65,7 +65,7 @@ public class ActionEnumerate extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem object = stack.pop(); //stack.push(new DirectValueActionItem(null, 0, new Null(), new ArrayList())); output.add(new EnumerateActionItem(this, lineStartAction, object)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionEquals2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionEquals2.java index 2184982aa..810e99987 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionEquals2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionEquals2.java @@ -53,7 +53,7 @@ public class ActionEquals2 extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new EqActionItem(this, lineStartAction, b, a, true)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionGetMember.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionGetMember.java index f67906ac7..50adab2d0 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionGetMember.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionGetMember.java @@ -62,7 +62,7 @@ public class ActionGetMember extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem memberName = stack.pop(); GraphTargetItem object = stack.pop(); stack.push(new GetMemberActionItem(this, lineStartAction, object, memberName)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionIncrement.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionIncrement.java index d9be4829b..350d4d90d 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionIncrement.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionIncrement.java @@ -53,7 +53,7 @@ public class ActionIncrement extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); stack.push(new IncrementActionItem(this, lineStartAction, a)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionInitArray.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionInitArray.java index 25d68882e..2bb0937b1 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionInitArray.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionInitArray.java @@ -60,7 +60,7 @@ public class ActionInitArray extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { long numArgs = popLong(stack); List args = new ArrayList<>(); for (int l = 0; l < numArgs; l++) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionInitObject.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionInitObject.java index e92e04886..0c3341ab7 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionInitObject.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionInitObject.java @@ -67,7 +67,7 @@ public class ActionInitObject extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { long numArgs = popLong(stack); List values = new ArrayList<>(); List names = new ArrayList<>(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionLess2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionLess2.java index 9c93eef53..299497df6 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionLess2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionLess2.java @@ -53,7 +53,7 @@ public class ActionLess2 extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new LtActionItem(this, lineStartAction, b, a, true)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionModulo.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionModulo.java index 0c3d50f4c..7141d82c1 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionModulo.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionModulo.java @@ -53,7 +53,7 @@ public class ActionModulo extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new ModuloActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionNewMethod.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionNewMethod.java index 774fdd2ec..6c292fe4c 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionNewMethod.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionNewMethod.java @@ -71,7 +71,7 @@ public class ActionNewMethod extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem methodName = stack.pop(); GraphTargetItem scriptObject = stack.pop(); long numArgs = popLong(stack); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionNewObject.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionNewObject.java index 7fe784ec3..49719646e 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionNewObject.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionNewObject.java @@ -71,7 +71,7 @@ public class ActionNewObject extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem objectName = stack.pop(); long numArgs = popLong(stack); List args = new ArrayList<>(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionPushDuplicate.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionPushDuplicate.java index b379a9cfd..390a9c5a4 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionPushDuplicate.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionPushDuplicate.java @@ -54,7 +54,7 @@ public class ActionPushDuplicate extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem value = stack.peek(); stack.push(new DuplicateItem(this, lineStartAction, value)); value.getMoreSrc().add(new GraphSourceItemPos(this, 0)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionReturn.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionReturn.java index b4374f9c4..f246c96d9 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionReturn.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionReturn.java @@ -55,7 +55,7 @@ public class ActionReturn extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem value = stack.pop(); output.add(new ReturnActionItem(this, lineStartAction, value)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionSetMember.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionSetMember.java index a85abe486..dff7fe2d4 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionSetMember.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionSetMember.java @@ -69,7 +69,7 @@ public class ActionSetMember extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem value = stack.pop().getThroughDuplicate(); GraphTargetItem memberName = stack.pop(); GraphTargetItem object = stack.pop(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionStackSwap.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionStackSwap.java index 040909115..43283c664 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionStackSwap.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionStackSwap.java @@ -56,7 +56,7 @@ public class ActionStackSwap extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(a); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionStoreRegister.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionStoreRegister.java index da6cd9944..b5195953a 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionStoreRegister.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionStoreRegister.java @@ -97,7 +97,7 @@ public class ActionStoreRegister extends Action implements StoreTypeAction { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem value = stack.pop(); RegisterNumber rn = new RegisterNumber(registerNumber); if (regNames.containsKey(registerNumber)) { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionTargetPath.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionTargetPath.java index c4f18ed8b..718f1f6e1 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionTargetPath.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionTargetPath.java @@ -62,7 +62,7 @@ public class ActionTargetPath extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem object = stack.pop(); stack.push(new TargetPathActionItem(this, lineStartAction, object)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionToNumber.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionToNumber.java index 2e355a48a..e90b5e3f0 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionToNumber.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionToNumber.java @@ -53,7 +53,7 @@ public class ActionToNumber extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem object = stack.pop(); stack.push(new ToNumberActionItem(this, lineStartAction, object)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionToString.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionToString.java index 67e9ca9a8..5b5c443ac 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionToString.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionToString.java @@ -53,7 +53,7 @@ public class ActionToString extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem object = stack.pop(); stack.push(new ToStringActionItem(this, lineStartAction, object)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionTypeOf.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionTypeOf.java index c5dd11c77..e4b30b5ab 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionTypeOf.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf5/ActionTypeOf.java @@ -53,7 +53,7 @@ public class ActionTypeOf extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem object = stack.pop(); stack.push(new TypeOfActionItem(this, lineStartAction, object)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionEnumerate2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionEnumerate2.java index 5b1111a9e..fbe390b23 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionEnumerate2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionEnumerate2.java @@ -45,7 +45,7 @@ public class ActionEnumerate2 extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem object = stack.pop(); output.add(new EnumerateActionItem(this, lineStartAction, object)); } diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionGreater.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionGreater.java index b19340a11..4e144f418 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionGreater.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionGreater.java @@ -53,7 +53,7 @@ public class ActionGreater extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new GtActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionInstanceOf.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionInstanceOf.java index 4b21769fe..3795bb7fd 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionInstanceOf.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionInstanceOf.java @@ -84,7 +84,7 @@ public class ActionInstanceOf extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new InstanceOfActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionStrictEquals.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionStrictEquals.java index ea1d6ec32..276a7ce8b 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionStrictEquals.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionStrictEquals.java @@ -53,7 +53,7 @@ public class ActionStrictEquals extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new StrictEqActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionStringGreater.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionStringGreater.java index 65a049aac..e03d9629f 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionStringGreater.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf6/ActionStringGreater.java @@ -53,7 +53,7 @@ public class ActionStringGreater extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem a = stack.pop(); GraphTargetItem b = stack.pop(); stack.push(new StringGtActionItem(this, lineStartAction, b, a)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionCastOp.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionCastOp.java index fc8954e73..410490cbb 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionCastOp.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionCastOp.java @@ -63,7 +63,7 @@ public class ActionCastOp extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem object = stack.pop(); GraphTargetItem constructor = stack.pop(); stack.push(new CastOpActionItem(this, lineStartAction, constructor, object)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionDefineFunction2.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionDefineFunction2.java index f71f8472d..5a1650cf6 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionDefineFunction2.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionDefineFunction2.java @@ -267,7 +267,7 @@ public class ActionDefineFunction2 extends Action implements GraphSourceItemCont } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { } @Override diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionExtends.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionExtends.java index 7679c3ded..a333563b1 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionExtends.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionExtends.java @@ -63,7 +63,7 @@ public class ActionExtends extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem superclass = stack.pop(); GraphTargetItem subclass = stack.pop(); output.add(new ExtendsActionItem(this, lineStartAction, subclass, superclass)); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionImplementsOp.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionImplementsOp.java index 69afe9a04..454cb3ef2 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionImplementsOp.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionImplementsOp.java @@ -67,7 +67,7 @@ public class ActionImplementsOp extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem subclass = stack.pop(); long inCount = popLong(stack); List superclasses = new ArrayList<>(); diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionThrow.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionThrow.java index d9c4b760d..b6c159324 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionThrow.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/swf7/ActionThrow.java @@ -49,7 +49,7 @@ public class ActionThrow extends Action { } @Override - public void translate(boolean insideDoInitAction, boolean insideDefineFunction1, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { + public void translate(boolean insideDoInitAction, GraphSourceItem lineStartAction, TranslateStack stack, List output, HashMap regNames, HashMap variables, HashMap functions, int staticOperation, String path) { GraphTargetItem object = stack.pop(); output.add(new ThrowActionItem(this, lineStartAction, object)); } diff --git a/src/com/jpexs/decompiler/flash/gui/action/ActionPanel.java b/src/com/jpexs/decompiler/flash/gui/action/ActionPanel.java index 821a1487c..f9acb01be 100644 --- a/src/com/jpexs/decompiler/flash/gui/action/ActionPanel.java +++ b/src/com/jpexs/decompiler/flash/gui/action/ActionPanel.java @@ -941,7 +941,7 @@ public class ActionPanel extends JPanel implements SearchListener(), new HashMap<>(), new HashMap<>(), SWF.DEFAULT_VERSION), ""); + GraphDialog gf = new GraphDialog(mainPanel.getMainFrame().getWindow(), new ActionGraph(this.src.getScriptName(), insideDoInitAction, lastCode, new HashMap<>(), new HashMap<>(), new HashMap<>(), SWF.DEFAULT_VERSION), ""); gf.setVisible(true); } catch (InterruptedException ex) { logger.log(Level.SEVERE, null, ex); From 2b9fc72bafc21706550ba4ced860dde8b44ff8de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 4 Feb 2018 08:35:20 +0100 Subject: [PATCH 46/58] Correctly handling TagScript on getASMs --- libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java index b926843d5..f6a249ee6 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/SWF.java @@ -1711,8 +1711,9 @@ public final class SWF implements SWFContainerItem, Timelined { } private void getASMs(boolean exportFileNames, TreeItem treeItem, List nodesToExport, boolean exportAll, Map asmsToExport, String path) { - boolean exportNode = nodesToExport.contains(treeItem); TreeItem realItem = treeItem instanceof TagScript ? ((TagScript) treeItem).getTag() : treeItem; + boolean exportNode = nodesToExport.contains(treeItem) || nodesToExport.contains(realItem); + if (realItem instanceof ASMSource && (exportAll || exportNode)) { String npath = path; String exPath = path; @@ -2989,8 +2990,7 @@ public final class SWF implements SWFContainerItem, Timelined { timelined.setModified(true); timelined.resetTimeline(); } else // timeline should be always the swf here - { - if (removeDependencies) { + if (removeDependencies) { removeTagWithDependenciesFromTimeline(tag, timelined.getTimeline()); timelined.setModified(true); } else { @@ -2999,7 +2999,6 @@ public final class SWF implements SWFContainerItem, Timelined { timelined.setModified(true); } } - } } @Override From ee71b9179c90f2ad096cdba183799b40e30a4152 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 4 Feb 2018 08:36:33 +0100 Subject: [PATCH 47/58] Correctly handling TagScript in ExportDialog - prevented display export type selection for some AS1/2 scripts --- src/com/jpexs/decompiler/flash/gui/ExportDialog.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/com/jpexs/decompiler/flash/gui/ExportDialog.java b/src/com/jpexs/decompiler/flash/gui/ExportDialog.java index 485d55396..f5a33f53d 100644 --- a/src/com/jpexs/decompiler/flash/gui/ExportDialog.java +++ b/src/com/jpexs/decompiler/flash/gui/ExportDialog.java @@ -45,6 +45,7 @@ import com.jpexs.decompiler.flash.tags.base.SoundTag; import com.jpexs.decompiler.flash.tags.base.SymbolClassTypeTag; import com.jpexs.decompiler.flash.tags.base.TextTag; import com.jpexs.decompiler.flash.timeline.Frame; +import com.jpexs.decompiler.flash.timeline.TagScript; import com.jpexs.decompiler.flash.treeitems.TreeItem; import java.awt.BorderLayout; import java.awt.Container; @@ -92,14 +93,14 @@ public class ExportDialog extends AppDialog { {ImageTag.class}, {DefineVideoStreamTag.class}, {SoundTag.class}, - {ASMSource.class, ScriptPack.class}, + {ASMSource.class, ScriptPack.class, TagScript.class}, {DefineBinaryDataTag.class}, {Frame.class}, {Frame.class}, {ButtonTag.class}, {FontTag.class}, {MorphShapeTag.class}, - {SymbolClassTypeTag.class}, + {SymbolClassTypeTag.class} }; //Enum classes for values @@ -116,7 +117,7 @@ public class ExportDialog extends AppDialog { ButtonExportMode.class, FontExportMode.class, MorphShapeExportMode.class, - SymbolClassExportMode.class, + SymbolClassExportMode.class }; Class[] zoomClasses = { @@ -125,7 +126,7 @@ public class ExportDialog extends AppDialog { TextExportMode.class, FrameExportMode.class, SpriteExportMode.class, - ButtonExportMode.class, + ButtonExportMode.class }; private final JComboBox[] combos; From 338a10e4d3cf840af4d07ac2f9dfd9070a2bad79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 4 Feb 2018 08:37:55 +0100 Subject: [PATCH 48/58] Export selection fix added to changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 207a1f879..c3661f850 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,6 +19,7 @@ All notable changes to this project will be documented in this file. - AS1/2 deobfuscation - ActionRandom fixed for nonpositive numbers - AS1/2 switch statement detection - fixes of default section position - AS1/2: break on the end of for..in loop +- AS1/2: Export selection dialog did not allow to select script export formats and/or export script at all ## [11.0.0] - 2018-01-17 ### Added From eb9959a171137dc2dae13ca51071e782679d9a41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sat, 10 Feb 2018 22:31:04 +0100 Subject: [PATCH 49/58] Fix: HAS_OPTIONAL flag in AVM2 code displayed twice --- .../src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java index d94faf62c..2600d6842 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/AVM2Code.java @@ -1176,7 +1176,6 @@ public class AVM2Code implements Cloneable { writer.appendNoHilight("flag "); writer.hilightSpecial("HAS_OPTIONAL", HighlightSpecialType.FLAG_HAS_OPTIONAL); writer.newLine(); - writer.appendNoHilight("flag HAS_OPTIONAL").newLine(); } if (info.flagHas_paramnames()) { writer.appendNoHilight("flag "); @@ -2173,8 +2172,7 @@ public class AVM2Code implements Cloneable { ins.operands[j] = updater.updateOperandOffset(target, ins.operands[j]); } }*/ //Faster, but not so universal - { - if (ins.definition instanceof IfTypeIns) { + if (ins.definition instanceof IfTypeIns) { long target = ins.getTargetAddress(); try { ins.operands[0] = updater.updateOperandOffset(ins.getAddress(), target, ins.operands[0]); @@ -2182,7 +2180,6 @@ public class AVM2Code implements Cloneable { throw new ConvertException("Invalid offset (" + ins + ")", i); } } - } ins.setAddress(updater.updateInstructionOffset(ins.getAddress())); //Note: changing operands here does not change instruction byte length as offsets are always S24 (not variable length) } From 508d9b7802d3fa38eaa70edae2a03b3a478140ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sat, 10 Feb 2018 22:31:46 +0100 Subject: [PATCH 50/58] updated changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c3661f850..1e3396237 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ All notable changes to this project will be documented in this file. - AS1/2 switch statement detection - fixes of default section position - AS1/2: break on the end of for..in loop - AS1/2: Export selection dialog did not allow to select script export formats and/or export script at all +- AS3 P-code - HAS_OPTIONAL flag in AVM2 code displayed twice ## [11.0.0] - 2018-01-17 ### Added From 666dcad86eedd6992425643dd7e0671000887b2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jindra=20Pet=C5=99=C3=ADk?= Date: Sun, 1 Apr 2018 11:56:09 +0200 Subject: [PATCH 51/58] =?UTF-8?q?Issue=201449=20-=20Turkish=20translation?= =?UTF-8?q?=20by=20Osman=20=C3=96Z?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- installer.nsi | 1 + lib/jsyntaxpane-0.9.5.jar | Bin 566236 -> 571686 bytes .../flash/locales/AppResources_tr.properties | 42 + .../locales/docs/pcode/AS3_tr.properties | 1461 +++++++++++++++++ .../locales/docs/pcode/AS3other_tr.properties | 92 ++ .../defaultsyntaxkit/config_tr.properties | 118 ++ .../config_tr.properties | 36 + .../flasm3syntaxkit/config_tr.properties | 45 + .../flasmsyntaxkit/config_tr.properties | 40 + .../jsyntaxpane/Bundle_tr.properties | 38 + nsis_locales/Turkish.nsh | 63 + .../flash/gui/SelectLanguageDialog.java | 2 +- .../gui/locales/AboutDialog_tr.properties | 27 + .../AdvancedSettingsDialog_tr.properties | 449 +++++ .../gui/locales/DebugLogDialog_tr.properties | 19 + .../gui/locales/ErrorLogFrame_tr.properties | 21 + .../gui/locales/ExportDialog_tr.properties | 99 ++ .../gui/locales/FontEmbedDialog_tr.properties | 26 + .../locales/FontPreviewDialog_tr.properties | 16 + .../gui/locales/GraphDialog_tr.properties | 16 + .../locales/LoadFromCacheFrame_tr.properties | 21 + .../locales/LoadFromMemoryFrame_tr.properties | 32 + .../gui/locales/LoadingDialog_tr.properties | 16 + .../flash/gui/locales/MainFrame_tr.properties | 774 +++++++++ .../flash/gui/locales/ModeFrame_tr.properties | 20 + .../locales/NewVersionDialog_tr.properties | 28 + .../gui/locales/RenameDialog_tr.properties | 22 + .../ReplaceCharacterDialog_tr.properties | 20 + .../locales/ReplaceTraceDialog_tr.properties | 20 + .../gui/locales/SearchDialog_tr.properties | 31 + .../locales/SearchResultsDialog_tr.properties | 18 + .../SelectLanguageDialog_tr.properties | 22 + .../abc/DeobfuscationDialog_tr.properties | 24 + .../locales/abc/NewTraitDialog_tr.properties | 24 + .../gui/locales/abc/UsageFrame_tr.properties | 19 + .../locales/proxy/ProxyFrame_tr.properties | 35 + 36 files changed, 3736 insertions(+), 1 deletion(-) create mode 100644 libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/locales/AppResources_tr.properties create mode 100644 libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/locales/docs/pcode/AS3_tr.properties create mode 100644 libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/locales/docs/pcode/AS3other_tr.properties create mode 100644 libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/defaultsyntaxkit/config_tr.properties create mode 100644 libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_tr.properties create mode 100644 libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_tr.properties create mode 100644 libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_tr.properties create mode 100644 libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/jsyntaxpane/Bundle_tr.properties create mode 100644 nsis_locales/Turkish.nsh create mode 100644 src/com/jpexs/decompiler/flash/gui/locales/AboutDialog_tr.properties create mode 100644 src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog_tr.properties create mode 100644 src/com/jpexs/decompiler/flash/gui/locales/DebugLogDialog_tr.properties create mode 100644 src/com/jpexs/decompiler/flash/gui/locales/ErrorLogFrame_tr.properties create mode 100644 src/com/jpexs/decompiler/flash/gui/locales/ExportDialog_tr.properties create mode 100644 src/com/jpexs/decompiler/flash/gui/locales/FontEmbedDialog_tr.properties create mode 100644 src/com/jpexs/decompiler/flash/gui/locales/FontPreviewDialog_tr.properties create mode 100644 src/com/jpexs/decompiler/flash/gui/locales/GraphDialog_tr.properties create mode 100644 src/com/jpexs/decompiler/flash/gui/locales/LoadFromCacheFrame_tr.properties create mode 100644 src/com/jpexs/decompiler/flash/gui/locales/LoadFromMemoryFrame_tr.properties create mode 100644 src/com/jpexs/decompiler/flash/gui/locales/LoadingDialog_tr.properties create mode 100644 src/com/jpexs/decompiler/flash/gui/locales/MainFrame_tr.properties create mode 100644 src/com/jpexs/decompiler/flash/gui/locales/ModeFrame_tr.properties create mode 100644 src/com/jpexs/decompiler/flash/gui/locales/NewVersionDialog_tr.properties create mode 100644 src/com/jpexs/decompiler/flash/gui/locales/RenameDialog_tr.properties create mode 100644 src/com/jpexs/decompiler/flash/gui/locales/ReplaceCharacterDialog_tr.properties create mode 100644 src/com/jpexs/decompiler/flash/gui/locales/ReplaceTraceDialog_tr.properties create mode 100644 src/com/jpexs/decompiler/flash/gui/locales/SearchDialog_tr.properties create mode 100644 src/com/jpexs/decompiler/flash/gui/locales/SearchResultsDialog_tr.properties create mode 100644 src/com/jpexs/decompiler/flash/gui/locales/SelectLanguageDialog_tr.properties create mode 100644 src/com/jpexs/decompiler/flash/gui/locales/abc/DeobfuscationDialog_tr.properties create mode 100644 src/com/jpexs/decompiler/flash/gui/locales/abc/NewTraitDialog_tr.properties create mode 100644 src/com/jpexs/decompiler/flash/gui/locales/abc/UsageFrame_tr.properties create mode 100644 src/com/jpexs/decompiler/flash/gui/locales/proxy/ProxyFrame_tr.properties diff --git a/installer.nsi b/installer.nsi index 7fa252cf4..9df8adea5 100644 --- a/installer.nsi +++ b/installer.nsi @@ -368,6 +368,7 @@ var SMDir !insertmacro LANG_LOAD "Russian" !insertmacro LANG_LOAD "Spanish" !insertmacro LANG_LOAD "Swedish" + !insertmacro LANG_LOAD "Turkish" !insertmacro LANG_LOAD "Ukrainian" !insertmacro LANG_LOAD "Italian" diff --git a/lib/jsyntaxpane-0.9.5.jar b/lib/jsyntaxpane-0.9.5.jar index 656f583cfa8c30a93336a05d429dcc88ffe4a78f..79d74f13d0d542aabadf2b197b9f3ac9c8210bbe 100644 GIT binary patch delta 30409 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 delta 25390 zcmaJ~2RxPE|G)Qg?|tmOce3|LR)bVVW~9t0Dn+u2(#@!ZjEn~nB0Cbfh0ID{Et)E` zQYndcTL1Hmi(9|f|Gs*@_xOC?pK(5CJm)#j=iG1Ehed-ui?|(ZSXkK!$j8Gg&nlf; zp35D4Z=5KNIS**x(wEE81TDVC{9JXg!_`&6B;1uZK0D}!!leiIb1eB+|M=`;v!g}g zc5qH*M}^5OuV;UxAJ?```A#QH`m5N6L>`I1>Tj?&vzp)~^;T>&yg}vFIM1%ApD9>! z*XNaePDglCq@Gy8RyvpD^H14lsMZ0zQu@~)cWWtjm>x2-R&`KRU9!*QkL#6J%e)@a zpB~&ju4$in1On9AYD>M*A$!wV9_{*a>@ z!G#TwAOi)|W$>^`BAPVV)+1kt-BAOGFXJW~JMwowkT`S!;>wU_M-3u>S1pBjGNd_B z{vmc}9G1buA%WJMdXp-nrCf|U%G z3P4!Nc7+oQHzK=RVy8<82Z1ml3Okq+#bFZ@NVH+Z`~U}r^R~-l!Swxdj3i;SC}#^2 zD!bFH%At!$Ago}4Pi+CRMW&Eo!|aBeL=4xvQ5Taq?@q!+DV{8NiOXAz7lWzpeu6og z0fkLsq;Fw~xbH_IDY!t|ekxu%89j@8mwW6NZYwXTor=kNW~^YxN<{_6xR&8!R=o7` z%oP@lTU*JA>uam#!b^9~`UzrO!!8377ZRUS+cmEL2kN*hqpo*p#&UP4q4~;P+-TZ0 zhI4t>AzVdSuLxf1yxA$lhNx)UH&fh|(fLNFq4n84B1(ENNLY`N{(Er`*H-kB9haMo`2*`9^ovr&8XT})mWVe3{mWwFMpjhcJ9lBF z9u@+@kO~+15XI>cD#S4?o^*E&;xSgVtI%KT5EV%fQuWbmv4(J-4^ftGpig{A#MrzB z#Lu`9HY1`D8%AAYP8=hnHKeOq5_55_*KLTJICa*6$cs^7ZfD{oCiUByn1OZV&T3e7 zgq1)TW6Ma36sKR>NMylA0=>hNco$cf?L(Z!y~x}`)qO+@o{K>B8B>uee^mT%r=L%ru{9!HW9p^;@6t1;FoO z{+1UJxmdW78h<)>jr%&V(#HqO93YCpw_SjlRpm$=5jI_{niz_=MOrQKKGqi7>xle# za1Wj%#$)paozh6G##`{hCE_Z);eWQwb+no`q6;6^@Z>&X1~wY#`TfLac&CgVAWGoH z;$h-pT!ZQuQ4_~{JR{!4+fVl$(FO;^yeGC}qn>W@iTGX~GqF^Z6p4w!jbfx{7%@+r zWTuK0M=VH(LL4k9${00Ik3~cZ9aZZr24Ywx2!t3zxL%Sh2Cwvn$n+rx z7BLAdu(LZ^)b%kT)gqQ`9gKRVpM|7=QG36zglb_$Gey>3+$_&(RyI7ak{ei?amSzR zWmS|!&1#j1Y;Z0x@NO33K0mWmErfDBr*8XR*0J}??CPn z!jKbwBafp>k8bqIcCRath}KWq z##XHtzFZBy^YZcX{8P`LD=uGKb|>r3$M}t*(s#xqb#H#1A$jH49OkqVnemmO(Wm*v z-24pfU!7U*bxkCplvrHv!RjV=^ofPbJKeDB=bVnXnE&jO^mIW#gE$ZBQcb)DyZSPghr6n<$xloxeo1*;{N$nZ+z!vpO@_Fps zSK=HS>TMNY=|-+UFVU0uM3W^@JbR5;=rHtytEQ-6yvzOl%9JC z^CI<;FQq0ImLylZ9+!Ps=>=bjn*DLJqM}oPNAbkKyDA~>+R}*xqrRL$O;Xv-80RhJ zk9W%S-6WRjt$DvulJl5gWw81adPEeYSIZotU-S*TyG&r*odl`fZs#c=p2?=bi!M z&o+BW%3X_iZS#&f=f&l@1%A2OWF)MyF0Zl!l4#kv6q2~pw7FEKa7|b8+Sp}fvE1te z1BF*^+DJbGUa}MRKd-E?FRNiwsb8^7su{0HkOH*PXR2eZzW$*E|6|RX z*$`X$wI?enf8rnS>6f*m|%QM4vin(w|U6O!wH?5`gt>|il= z{SxN(q;LGPi~h5ez{iVL9^ba*gfQpRrd0z;J?ZPh+DI>Zt{QjvnSM;&Q&|xn z<Mqzkj*{@^qy32PTeJ!`LVXZ0GiFn@-m*FFp{E25BW7xH-Z6o=_ zoBVV9AElH}=+Hh__MEj{7kW*RS2Wf9p5d!&%U-YMov;l&%o#ml^DSzTzqZ_?b#5z9 z6e+J%t+ve&pAZQu<#lxDxNS^St@Lp5Fo_;K{yez*z|;P__r`bZJ2hEn%?Lf zm0cSzJpQoZQOfaFv4mp^hUXQZ2)xY@)4P8-{Hodyp;j}AvQwLB&N25-YG?dP&t&OO zewXy4J3YyfL=D)YWy~D}uFbZjq8^^lH^|PjK9Rdu-tQ@FTIe_MdWWx=;MH zUOQE&a-ZwT8dn`#X@v(>mfDiGyANACb>1o%E3nM9VyUN(tkfO|>hp^qa5u91k2Gt# z*&)AHTiHCC^1kS+?0?$Y!V3JIQcj}B7PsGxEbnyv@F>muT9p9jZ)2MGnU4=B(FN^3 z4vDkjzsouwO^6q1KR( ze$Zay5#>iegjHGMcAx$l_PeQb=|>F;?dWduP@Qw0=m80Dj{m+zT(@);`y|!;pomq0 zYqqv^NUmGD`F7DGzi(;Fb-&SC4rtuFqGQTsHz1Q0OFr>vV4zX6-(yRk(t)F#BYLl+ zX9;3HyW;Z=PIn32J1{b8@?A4?MM&4MDZyxOI z;asjMav*njwS$;Sh=%IzS@BXx!al;OS}Bz8*IgBOZ1tiIE?VOgFN5`S2KtZr(y3GW zm%nVKnQrSpCb;qP%hzrLUerEkn{?=lV(iRWyOmXT@1;u|RXZyARu^VQh-GZ-u^N@M0inTR1N#|Ja?A!RMOeciZdi(o$w@imHK_ ziIl3I>miSIB7+Pc`(6+$Ik@@!kA5z@Elaz8cc(|IH$;;&{4dwq2h}TzJAPG;o5{{` zkKMj)LyxZtjhg9l;kobm;ES)$OC%@f9?B7X5}VlMwxU4njVq6`Z^Nu-2UP7Hb$2Gr zu1WE|%?~KgI>}0Y(f8w`7n)|zi2CX4tez=zo>lB^plq6 zF+BOJJ)?5Etx-n&)S6fKKI?BwsD zH4N#jO0biZM%;1D4r__uf#sj?6MxXV6{}y1H}g8Pgvo1A-x)YhzoUIx{LuUAN3CPR&qhaLFs0na;zBr&E5$LqAnCdY)(Bd7!ZSI}3&W z$)Sub7O2t(Y@7RJvfEiL6r%QxmfVdOk&EEWplL;17r9rE zAe%C|df(-wsiyCPN1vPfXSYug3Q|^VyI*pvYRG22Nv6b2L+gWvdpxav@h-W~)qhhi zVArAQcRi7pJasnbRo;G=^YqwbVgjAT=cTp62^mvsLMRb_y(L?IP<@v8&Z*JAKd8Bf zl4kehaEI*@;l4f}Cks#RnqHshH04`wzPN6fkuwhMb8K|wi(Fe@UH`>sowIB0!!tdX zxs_^^e-K_ummXDjnO67cNcw)VIB-NKPdQaSOn6mot2JA2Y8v(I&L57(EkDHaJSUc0 zgc@&M-|Z6+5CUI%f99&+RHn%b?jf7zom$@~>lEpes-ZH)q588r1w)gS(<>j-vUt`P zCnmjGuI^JGU1z@YTHBXdvz`H4h{Hn0Ng$rU;C@d?X~}`(1(9Rdw*vd+}mc! zU)W7i+O8C|Um#!i-HVfBFL+kn^DQ|kb#-uEs`Ax!!~@b-t0;N!U7nejr12&3DKgmt zNtq|S{_}PyuuC0V;niEdlWh3SaG4M76**Hf^XT!o!Ld5Y(;xGOgr=Tn-s_v(AzIUs zm6w}m`XQE6z1MWz$Gp}F&f*_8O#Oy+?JLaJ=2i6Z^!;3R-%-n(BQI37zAw`~UC)AJ zZ~vtartRuq#{^`uDle_(DctwS;Mj#1k4wuQthL zan8&o-~Mw#e&|Jq-vK$Yz|0k%n)YD_N{b+P~?~ll$ zp;*H%3q zQqzMqWJF81O&ns^vhO$Z3(%Qf^x=Trncmh_N@>fXyL$G@3L zuW4nc?KX}3Fp&DmX|3KRx$aAP^4CjLV_)=#MVT3WwcTL&jdQK`pVRX9E;Oy<%GG^W ztRj{Y#33l|UKA?V7n#J_rnR@ybgRgwGNdBw{&TWBXYxUhWWsCr-Q_aG%gX7PJ3p1>YxzMB{&GqhLFWV)9 zY(o+Kxvi9gm$QXG7`t`7-NCh&WlY3TYd33`R$28o{^o40GZOm*VjX#gy2|bjtjS_8 zH>>bmX-J!T|9WbJP^m*Y%Z)o#hZcv|#mk9&k~~vbaY$caAq=#@In5#bo~S@`;i?MCLy zr{dz)Rwh4xBYq_OiSV#ponMZrfpF3|caqTKjk{Qq-fgDo5QI&7w(ZIHYTBgU=zhqQ zR$xPV%X^_9Q|NnMa!;w7nR|@{xy>poY>315YTv}(JZE|HTZ9l`TjZB@TaB=- zC2S4B{_Wza*NcPRS`2%+21gWU9%PXl?yXz>;#V@K#ej!>|7wU@-KgbmQJQB3nfA4GATRm^yj2Y@|3Xku(exoOy?0sa`%k0a3p+>J& z9{X0Y89eo!s!-evOM7jlH9t*zpf8vbnx*S`J>bD7n^_z8CErV<&2CwmTbfxm&{p3y zEFSMDY+n<%WhhAgrAKf7{dbe@-{0~$zTyopa8CVrlJ~QQ;o~~JG>@r-4dCC_r0oAb z?tX21^3{fxh~=wiCa0HfG?nOBFVwFT8ZF^Lvk~|%Rjzn#)6uso2Ck8`{WdOLUJoKn zk2iGxT=JcRM?%QTq|oJ&%JW;UQ!lvXK6#fHR8%$WGV-X~sPmF#<@l;AIjMx%RJ~g7 zcaYQB9Nk@RL9RFKe&==QXZ_CpeOq`mI{%ZZC0D=rQy#}(#av!$<0E`-Jqcs?#sim? ztBrKuzkHH?w92s2CqdJV{`Cs&kE2;qb0n|D&EdZFfJnrSEZ4la`-!i}0UadUU{mHpwUN zeCg%W7n1vzL*+eN4n8<1=Td&gCB4jLeVajUZ=;I7)yX`co2p0Mvu@e)Pgq^cU#$Dn z+^uOs^# zvRTjW9oh2$7PHHWcXm9#>EV%z9&3qivs=x(^=|dQyh}1YTJp9lIm|SsQF`<_tGOoo zvsJ8?Z5mO(c%$=#6r3UkHC$8r{Z>z>wVyYO;te%iqx|(g>BWQW?kcs-51NuYa>WV` z(zZRnbr zW_VPeEU(yav90c`Tw#;+iL+-&fl|{C--%Xs{C;d{!WQ|5BiC@~4qd)dtnaQ&erZIW zFYB2yiH2>JVeQs#-I`%K3BMgHU$2jMcRX>VSBdYB;CRurcki&R%Gevl6ZCev zCV1;530@B9!krytae8GXc|Ep?-BeAs!1wtrYsh=>o$bqK$t&?9v5veIFYY);w#AFh z_2f9bXx2auBJv^coM%kejVb{{1Yk%FH3Vz#0Nc1zjbt4n`T|b8wc3{i5U1hY?PO`X zbrV?*H@=%rcEB*)C$kk71I$nOatFY?xkxs{Fd)Fx8X~;1xLVzC?7pJYF zVAaEx3umMERNiO~d%VMBIJMoq8%+(%n-=+Sf(VfSdPOcddHf{l&& zVZN0@N18U1tb{U%rP@Lr`gg~3VpJ4vq;A^LR@^P|ZK4G0asDB9i_7!RJLS=R@>v&p@-GRS}MI_KNxI|2e`Yc8IW?$=ZK zKB>Cw%hp7}roeSpgDp!}RJu!#>uJ9Hq~HDab;X^D^u{1X`MBrn*9=YtnAksS;^cFv znNeZe94Bz;+OB2GhwAPa9~zJ){wY0GaI?W7Hn1jlq{%lz(T}D`4u}g}z3GFSze=jR zUPIJ1(Ix|8w|cBWr>63enua|6NuMpJ?)>=p`(yf~f@0Eu^BOz1nZaZq-E+#WcS=tk zOF!>(&Cm5la%9ZIfBm4#zK>Hnkhb#I$fVw zExx>S3D=`Ns|dP}%Uff(FJ)fcVrVsSfBdKH1K}ZoSDG&$aGm@TzltubYnofHIWAxI z@M~8t$NWD zQw=|?`Y3FO!=Q5)M}&xpwI2<>FFX--YcN?a&9-xU*vFHaD!VmQ1KjTTf81hHbVoF3 zMBd0GE2Z@8R;O!U_rR0m8*6&^+nfvK%T7>uILmLa<+f#mZ~bukaIu%c1?SdJ>09g$ zue1+d4<8SnwH{4uj@Zjx(m)G!_)gqW z>~W;r(e9FvS#98bkK)_izv}xu6VlEnpLh77o7q?Ex6ix<9?LQw;j!CgIXkm;RCx=x z_B|cvXNFBgm81IXb}AS0`AnvdXj=0Z2QNNWe=~it_0`VvkFJIs7uNb(W?O$h z()!RuXy+$^n}kkI{+m0V+&0{7{E?=@u{n<&{pX?WbYk_#zT2)D9B^;vfR{Naxr`yY3pLu=xxN#!;>T&Mg-DaN;@T8uvP}kkCXWF2v=d-$F>U4NW zO0(nStAm6s+zA_4I& zr7yFlg*n1M7+DV)t-4`yF_)|-6B5^6y5Y$+(a9g;oq31eyH=DWE*6sbd_7ZbfL|i( zzspW;F-^|vif!3OD zAMKJBUkk|`S}Xt5(dJ&ixtj5g>@X64E^CNS^om-+bZ)`fJ;^Ltccz!VFK%s-YA*`- zq*?Xjsq6Z~?~AX+P2XL4{1114tHW3Mrle(i9b~+WC)u=gZl^}+2MfQD_D`XlQv0e+ zJF3xIOK_bCKYnoOM0i27MB|V;XNbH_Xl%EJO~0e^YU%5g)YdY{3A7~ z%eP{m+0`Uo)zhm~y-vTqA$i}leuby+yCo(M4To06#r{6J$H^hiE#$<0weFpd)i2R? zcf2*WE1a1KosC{yr{&PoGGrc^wceAj{0pgEAp*`YxBGP062E&{;}yaZRta3l%B7sDV?x~VB;D;FkKYDGDM zzhl<)pqS$t!n`O?NvMWq>Xw3bumVs4Nel9Dj2A_S9_~YVLPVLB;>ByZ!QJvDV9Mdl zEfgg@Gor|k!br2Yvz_9CXE-SDqNw744M7xsoVsfdg^^IPEsS!Ai05pCQ_kSn%zcyu zyePY$QcFZr)P_B(C$fP3H1v)QvgZ`ww=@bHohzDBfrBs6D7W!qQY>W$Ui=nM*@#KCw6-h1gc)=LnKp2#!2OvN8M;;#nsIi7@%-NR0A32; z%B0BChtE^ma7@t!%4573eUZ|K7adzDR(R}BwNe)2)N5^&x41VKx+vdpK>ZcUY8)_o zjS^2neKh*!ek2zd%mmkB%*WdQDAhR5^Csm4=Gd=Ky=`RxQ;az#bBEG`V}|=FAgK+l z$BTQEXSlK62b60#HFJQ{ju%~@&ecb3m=c6jlSTm+&9>1l%gX5i?a@Vq&n1B<%N~Y= z;NM3;fKNQ9^y8|xjZ>%?+`2P1+8j8wj0E?!Q5Izfq*FM+{Sb9o_CqQ+EXhXYps)T)Ng!i2?Egvm zg@F@VoX=+gumB2%e`SHZAO#j`Ar8C_QK#`@D>s!yL95psm!ww>WP}Ca=`R#hI2i^) zLPFFFIP$hQ^%Y*cBufSPi)d796{+kLtk|kfy+=mdEgzQLeH5r#%1|L>eo&IsVcLM)EZo6l`Hi*7C<e|PruO4mXZ!{l5ulla;jv(s zdb=<60N#`<{HT+7QENMO5HIrVqz>c7nLz4uyf_d{eS_&7+(W1D1Uh|DopjkSYAnWh z)hPhE@k)z~U3;|@`OmKuTqrytp#fB=ve1!nIBy|9l0 zvBRZVR2BGg2^FGu*HiD|HOXtF9>K(feoK7e2V&xwel(mvo>4jJ$1l!RtGETYiw5Yt zqww>!06m7G(MTR@r#fPlmh<(C<%R1CsW$Lv3W%|8H&q<3+pYho=P?yiK274vK!qx% z0`zDe`mEvyC| zjcYH64iehAL@#U3 zf{l&uU}~_2_eek*8N6&faE%1SN6(jnz|A(#3NDp~CINP0wb6YSfIR>%D>R24gRN{gXzQ-m)^F5Za!z-NOK=32qqeTL{&P4}4O)ije4qyD zF(0&mh17vTWCH`XQ-{P^IY4aSX*wh-i_n0XxsTvniI?!sYzZ+VhA0d-t3&vDvKL5` zwjoqWZX!vL1v}hPZCFZ@pTe?-lgN&O#85zPb4uZY7~=$mzbB3Cl7yyAZ=S;eH}92wSW2Q?1Xg=8@W zK6*d_9|a+sEYO>72*}$hu-PEhcmWwjw^7iFB1c3})<02R#$;27io$vH879%n2V+#^ zI0-zdBH17P+l#v0MbPn5u@Ghz^;1{^ct``;C1Ho6-{qvufI%S#yQQTKZ>MLcZ$ zs3I&3s84cisHa2Hz^C~Tqt+uZ7MP8skZA|?^Cm_^POdC~qbyl=R1-MFB7wkB6=Cdf zu>zzH^B6+NVHiY*1QDZU@N#g&GKLUx`UL|^b0A}QaFWhR;i=-J|jp88`nP&>UnLH zs$mQ*mO*x8<)zu0LQF{SB0;F)0XwwM`)`LmdtRGNh&rXhp#x9a+@b>pihb&w;2CI5Yub zJNGG#Y1;^p;&8_@NEqf_1__|>L~TM{1AvDCOU&?3ZgX&OK!ystTY#`5;eZpD0lTvv z47LhJeTPtq-VCbHiCYwS`ErJg-EzQ{-i>nOm*asoJacQN40w1QT+D&}8Hyk?w8I49 z|IEPDhuD4dcFQj-P%C!`)NZa`NSB!mL(#I~Ja7O5z1D!v+XgBY2r9C zMX27I?Y=jVO@@Dw@%vG|wUIpV_Z1L!PzUB+32KrWjdQr+SF0gx3j+>7ILD8n+KW~~ zi&5>gQ>8(BLB~7C`?nt{Nem<}%xwnoqwuG_UlV?@5eP%zMh24j=RTz|ju|NYoEb!c zH=9AiSk$A;fX&PT21@}|aTNkKzD6q?{AphhHN|jj!j>$=v zQQ-sTjAlzl*rzM!*s!w&B!Ipl$y_&b@Cux64hfOYS2OtXXz!i0Q?HT+w|WOK(3rDG1iJ#0oCeVu;Xe-7wwOz?A*aD;QrFN+9QqZ56f9VYcQ{OS^(MjYp85S-!&@S zG1oc!5LU`{Os({4NB~tECRVcf8ffD)|ESG_9ab~c=B);@7j7c5I?Ubo7s82pmQnmd z84fpx1kjg2$Z;>2xCRm?9en{fTG=b{p4!}fYP1_z^9R0TOR5BT#tIT< z94h0^+C_xW=0^L?{L!<&$DLhcGbYRhfE14LofH8DTv^!y3qX$YQdat?^0F zRIYY4ACOZ3Qw4JayjhG{7gqr1pYF_gHiD>Gqk{3k@i*QDUhCKZp1lUfqiGOD;b1FJ zBlHfGgzyG+Fy3Vwd|pG&$F+j?69VnOn8|gDJ_ZHn<}efJ61nxpkAW&sRWYzdp~Hk{ zHNf!x>mU`hi4F?yd;cBO>K)iBnP1c)L03dP>~D3NJPFhafm1ci zQ>?K$h7T|YHJWcDGh0w28B2_3Z%GtHd8loX4ZV-vf~W?8`ALPz%~l%>FKY*}!A_=- zDAqVrh^{GzIUat4wy^_bk~2n*wgcS&jb$N1{@@Jr*@JE%??M!Sy-dMU7Mc3zPXYct zi5`P_?ZJ}?s=(16C}{LV6v)8uJV6-HhC=UIwFocK2eUb952imvB-;T{6SiQ~i(5ct z5eXSIa6%^66~P0@XW_p)_epq<1LGE4hbUkV!4w#WfZHqLGqwuja0EOk0`72x1Yr|L zNCaJ#&z(91bF(Z{5PRS~j*u1#Y72{ajGQa%?t(oPv-q9>&Pv%p!K^86HH)BMBIp`xuc6US7qhmFjxHGf&2N?&~2j z)ECP=+S>*|5BC4Zmp!Q%v?vv*F>QpnrSh!iPCJ5*%p8NG@Ys4h26KlV|55o0)^f&U z@P}b4uIsDqDjt$wVgpnGRP%zqjsh9th`1Nec3?=jt7H>*{*gz=B0N&@KWk5 zqq0O7P}zM&7!Nr|39oQr@Cp!KO$o*WCn@pRy+z39%Q3R#1`r>l{|PpgPbLBX&VXzF zu?-ovD%J4JMo0_}+5i>|NXM&jJKfL=V94ep^TLH#gF#d4z^sZcix512yG6V1sF%;jM0&<6+CIc22%XOHh}UpqZE_w^KI}=n6DIB_+-RrJx27 z&)-w#lG_MM77pHoFOgREzOZ`?rZgq4zgIUB4=~#;o4~UJ>h9ns;F9rEjC_5VC<$x0 zfe@g)Wp04iJv7JTfj5s4De%5P{4U=0bazl1m;o%o48XjK`aFyY-E?Evc?Wc{+?XK3 zX77kPu!%dvhK)O*i%+6-NjTn}u~f_hbkfi?+~f{vW8S<$D1Cx3#RF2;MEuj7nx3i$ z{Q$|55dq(fPic&;Fo_Tl8W|MkvoF{u$WIF%^MOP#E&DxyJv|W;OmqNy375r5BJiXS z#3_d;Jf*#B#zKxjXmSI`Fd5pwcWKN%GhBex6Our&Os8a-us?lqtg|O$nh*8_Mh)U| zddE=`|Gd#uJzOaB13POjDA$#GqO{vnLfx+$pbF7~% zg6p?{8$yB)B#uJGYP=kJz!S-BnZNsXg&78YKOm$RCg!{p?J9ms)5XCc{pk~5zCN02&1J&62ef}u*-?zi7X>)k)`3aFJ zeUM4NbQ$cp4cx>)HlYN3hcSV=zdrSW0A{Zf;9?%i`Q;d%?hghldOv#N54y&S3WO{U z^KQcz()Ie&8oz+044{E|#kr{pfiA_mTQU$L6;xxwDs>=+hz}TV4Dg6#*a6X-c8)Bv zfVFHp5Zh3TxdQSN$?)FojLqRTfEU<6=Ea0jhkqad`}#Qm7Sg%2M&K~>a=ZOJ z1_hapLJQQ??f_~y8Zllr9sEqdyz86+faiSy66hA2J|m$$1uo|2z8g&# zJ~sgDP-0UTqDJr{Mg~ce{PSvtp4gi}Kt=XHYCJAsc&nWZHGw;UnzPLq*|3et(;Enn z)Qa-5cj1k9>-A%IB2fHq^E+II&2~YCn0wK?fNX9Xrgw1{xNRX3fRG^PcZ8gPI|IN2 zHhTxg=LlpxG-?C_F{e(9401Gu=WBJvePATnH@0_MU9qKo?q z#>?$txPU~jKg78UbHU>(#t#f)xR4qI#7e;~1fo)_7Z*c^;*oI~_$^qILST-SVj3zR zda$7-x*HNfq5e)r0{m!b8JkD$Ehgkdp`ofE7av08YVR!vP8Ot&cpCqu>W2zRLdX!;z6WJOwTc z#+P9Be_B1H!A`0dSVzpi4ndX@r>79SD!Pc6%TEQ*p3Ezl**|1BkcA@p&(3L_7soWR zMjiwg^OLhF*!9{2>7pTf($iJH7c3{0!8(C?H7!p?P%>~MJB1&exX{PPC)>&r5xg3} zYtIE3arYJMy$7r!ge(MW@>96rkr2iV^B&>p z2*Mnp_%nKj&^nh3pw4K$f~9g1XaMFoDX1VQS$NzCZ!4xOEGBOX4dF9kj5%~P z40yA04g50f=I0(hga7Z4t+-P}xT_Nz#9ry=~&wWZ`c-;}GHi}|O z+?vB65r6Lq+ebiB@IfC61n;oKmo7}XT+DcH1g|BBywT$QdCuz@ussAW=5{yrrNCnc zC{l211ZYVF3y(yArPWS9oc?1wg-v7r9UVkKFyg9)55~bHF$pf_S@a5cTZHP{wHK^u zP<=^zfxZs`^K=flZ!cH^qs&Q!2?Z@=>g)p}6J^?i5(~>7l(`5_*$45Wwc!#lwe&zx?NfZn5Hsayx_5y16<7Gq$F`(fEU&{012TM&ao@FkpURlS7F{+rliaZ zC}EYUJ^<>u8TL5<31HcA)0vq7}WM4A^p?o}moc+4VGTHjpTBLlUt41VpV*Qw>I*sH1T3{yo@WokIX(SBF7BG9U-46?It4fsGYO+Dio&^FTB`kKsEGF~;Et zPy_aEiw{AIV96LT$szU^DSv6FfKg2S=a&DDjwy(40o90%0rL%lKbW>oX$)YW{ew5Y zgyDNz0lp95vHFe10Ox&MFrIiUc$P$~Z5#{8j_nvZEEc?#LCGly*|rlS4_%?~!UM6m zWoX|K4g*k49dPM01w6YO!z=bsL}BANhGpwGpiBB1#sle$5S%>6%SU+MuVcK2ag4^8 zLddB%Ffzz)s3(c z4sbDV>aaXRpo;Luql_7C*HNH>`vpRlW~5^Zp_MO{<2t7aTvGuTcwC(Ol*Z(}WWeRo zom}dtX%f<_6T!uNqZWh5j)FM*B;cM6_E#@QnxpX_&)&R6b;42aL7HxR0;7U=62Npi z@ea&gB&q>CdV(=WFFOY4u^&9sYO_U-!T@v;xUyA=1F8QWfB21=nu-Y zfDg^l(*T{cl?;z1Lx!+S5u;lWlK^=m2S%QH22>pfd!uN0=2Jt#I%Y07$fV-Mhv7l8 zD7JCDJ4GlQNmG3fR+G%o01*tDR*XZ3h)XLo0TcoYWoD?06bc2|de|1Tbe@&$hYHWL z0POG&*jgR|JED#j>fBI{04R=sP#aYclo6bC9PjT;IjT%`(gGWB2sFBcF-1wFfY699 zL7hVKB=N1`WQ1I5f{{ULA5IQR1>{6CjEp3%!go>`Z8C!J)GaX{Nb=)?SEey|4rzd= zZHMq=;p8;1K10SO;u`2{=!dy$ia5aaSzxI-od%x&5$Jr1D~J;=f_#<61fWng7$o{A z!7ESU&8nF}iwFb!5^z}}K>Sl0^T82Otp>7xxM8(MNCq^(J9YJE+W;UNTs90O_%4mP z3AT~|7`8tFX=1}T<^-ro{(7A3NtH)!V!R&+FWMR5t%f}^z$W?MwRC0Dp5lT)*TSCO zRDL+99(R5E#O6I)Kv=v%V>>h9$r}(nNVS|BKS`Ou;**UCc^⁣mrb^tL`Xge)OOY z>5pACLQ-&jfB|NQE_fk$Kdd(5*+4^<52j&$EEOW;y<0Id^H^F&3VDGn&1nB9_S%Nw z=f=`p8t^~RbpaR@8B3TWnmNFtdLT+(IBr&*O??#&%!U4=gEtt{0Wvso9cX1pp%@vY zyyE1`xj^-caEuJ{xOo|`U*-~s|IyvM5BAAp#Hcq9$UoYT$s@xA4e(r2@jt?C2Qlc} z&_VHwwv`Vc6$$wVe4eLfk%F8rtUS6Fek*jppQA60t(HN=XiX~9qk6fzLGl6{;Ri<6SCR_fjtpm z&z8yFnv4ZPAdeq!lg>h*@M`t~-hAgXEdo4?yahbw9ypgf{g1KEf(1fz-7uqI)hx0q z=lut7TRexChNW{D(LGxX9Oy2c_6HJDlm!B7BJF_s_}VxE))A7 zd`C5I;WVU*4Fc&BV0c;GoEkZ_ry^-<`3MJW*`b{QG&mnRjiVh4P0#+HvES3Q06#y! zbDaUYCc&;Z(y>ro%sq83mHQu$PhVajG}m2GFM7JSU(Nw7{}^1%bN7-?L`WO`8En|A zpDMbbAIFpdS4_I*01NstKHDOI@_7K(XHkoWAGpgOfB|(3yro;m)aUxH&MEw>A5WG8 zbv*ygv;XSHa~bFV=ybZdKxn=nk5&MMNAE1)&G%!sO2BKoyMV{sk8}N|OCEs=m#h z`Ad@vc=O#@t`_h&95$If($AJ}v+-ci9hj#wwzKHws`zc4VqR?iWNz4f&mR zaOfV)x@d(1+wFHa0bDS+m?zcP?{j!wbiIKLSq0YcxVqU;$*HBBOp2XnGAaF}p7h@|Np>CXf@%1^=aK*Lk4H6=X2a0Xohzwim__ z-Wmwyfz)B_)B(CwLObTd;|6xXFym7ivjx_!1G&23ckK0mV@yXF7$ERn8nc)k)6K)i zi=Jp$unb$*2y7qW!2AL^#WM5D!i9Fx-gHp;j$P27ecAe@UpLN&5p#hN9r37FCaM|nUn z!H?~8!Bb6`4?J|h2Cm*ZbyaO`z~u$urpLT4P&;JgT)wK4=CxC1$V@tY1o6o`Nv)PQ{u&H% \u00e7al\u0131\u015fma zaman\u0131nda \u00e7\u00f6z\u00fcmlendi\u011finde. Dize parametredir, Vekt\u00f6r temel s\u0131n\u0131ft\u0131r. +instruction.applytype.stackBefore = baseType, typeParam1, ..., typeParamN +instruction.applytype.stackAfter = baseType +instruction.applytype.operands = typeParamCount + +instruction.pushfloat4.shortDescription = Y\u0131\u011f\u0131ndaki float4 de\u011ferini itin +instruction.pushfloat4.description = +instruction.pushfloat4.stackBefore = +instruction.pushfloat4.stackAfter = float4Value +instruction.pushfloat4.operands = float4 + +instruction.newobject.shortDescription = Yeni nesne olu\u015fturur +instruction.newobject.description = +instruction.newobject.stackBefore = name1, de\u011fer1, ad2, de\u011fer2, ..., adN, de\u011ferN +instruction.newobject.stackAfter = newObject +instruction.newobject.operands = propertyCount + +instruction.newarray.shortDescription = Yeni dizi olu\u015fturur +instruction.newarray.description = +instruction.newarray.stackBefore = de\u011fer1, de\u011fer2, ..., de\u011ferN +instruction.newarray.stackAfter = newArray +instruction.newarray.operands = valueCount + +instruction.newactivation.shortDescription = Yeni etkinle\u015ftirme nesnesi olu\u015fturur +instruction.newactivation.description = +instruction.newactivation.stackBefore = +instruction.newactivation.stackAfter = newActivation +instruction.newactivation.operands = + +instruction.newclass.shortDescription = Yeni s\u0131n\u0131f olu\u015fturur +instruction.newclass.description = +instruction.newclass.stackBefore = baseType +instruction.newclass.stackAfter = newClass +instruction.newclass.operands = s\u0131n\u0131f + +instruction.getdescendants.shortDescription = Soylar\u0131 al +instruction.getdescendants.description = +instruction.getdescendants.stackBefore = obj, [ns], [isim] +instruction.getdescendants.stackAfter = de\u011fer +instruction.getdescendants.operands = i\u015flenen1 + +instruction.newcatch.shortDescription = Yeni kapsam\u0131 yakala olu\u015ftur +instruction.newcatch.description = +instruction.newcatch.stackBefore = +instruction.newcatch.stackAfter = catchScope +instruction.newcatch.operands = istisna + +#Undocumented: +instruction.deldescendants.shortDescription = Soylar\u0131 sil +instruction.deldescendants.description = +#instruction.deldescendants.stackBefore = +#instruction.deldescendants.stackAfter = +instruction.deldescendants.operands = + +#Undocumented: +instruction.findpropglobal.shortDescription = Global kapsamda m\u00fclk arama +instruction.findpropglobal.description = +instruction.findpropglobal.stackBefore = [ns], [name] +instruction.findpropglobal.stackAfter = obj +instruction.findpropglobal.operands = \u00f6zellik + +instruction.findpropstrict.shortDescription = Kapsam y\u0131\u011f\u0131n\u0131nda arama \u00f6zelli\u011fi, bulunamad\u0131\u011f\u0131nda hata +instruction.findpropstrict.description = +instruction.findpropstrict.stackBefore = [ns], [name] +instruction.findpropstrict.stackAfter = obj +instruction.findpropstrict.operands = \u00f6zellik + +instruction.findproperty.shortDescription = Kapsam y\u0131\u011f\u0131n\u0131nda arama \u00f6zelli\u011fi, bulunamad\u0131\u011f\u0131nda \u00fcst nesne +instruction.findproperty.description = +instruction.findproperty.stackBefore = [ns], [name] +instruction.findproperty.stackAfter = obj +instruction.findproperty.operands = \u00f6zellik + +#Undocumented: +instruction.finddef.shortDescription = Komut dosyas\u0131 d\u00fczeyi tan\u0131m\u0131 ara +instruction.finddef.description = +instruction.finddef.stackBefore = [ns], [name] +instruction.finddef.stackAfter = obj +instruction.finddef.operands = \u00f6zellik + +instruction.getlex.shortDescription = M\u00fclk bulmak ve almak +instruction.getlex.description = +instruction.getlex.stackBefore = +instruction.getlex.stackAfter = obj +instruction.getlex.operands = \u00f6zellik + +instruction.setproperty.shortDescription = \u00d6zellik +instruction.setproperty.description = +instruction.setproperty.stackBefore = obj, [ns], [name], value +instruction.setproperty.stackAfter = +instruction.setproperty.operands = \u00f6zellik + +instruction.getlocal.shortDescription = Yerel kay\u0131t de\u011feri al\u0131n +instruction.getlocal.description = +instruction.getlocal.stackBefore = +instruction.getlocal.stackAfter = de\u011fer +instruction.getlocal.operands = localRegIndex + +instruction.setlocal.shortDescription = Yerel kay\u0131t de\u011ferini ayarla +instruction.setlocal.description = +instruction.setlocal.stackBefore = de\u011fer +instruction.setlocal.stackAfter = +instruction.setlocal.operands = localRegIndex + +instruction.getglobalscope.shortDescription = K\u00fcresel kapsam\u0131 getir +instruction.getglobalscope.description = +instruction.getglobalscope.stackBefore = +instruction.getglobalscope.stackAfter = obj +instruction.getglobalscope.operands = + +instruction.getscopeobject.shortDescription = Kapsam nesnesi al +instruction.getscopeobject.description = +instruction.getscopeobject.stackBefore = +instruction.getscopeobject.stackAfter = obj +instruction.getscopeobject.operands = scopeIndex + +instruction.getproperty.shortDescription = M\u00fclk edin +instruction.getproperty.description = +instruction.getproperty.stackBefore = obj, [ns], [name] +instruction.getproperty.stackAfter = de\u011fer +instruction.getproperty.operands = \u00f6zellik + +instruction.getouterscope.shortDescription = T\u00fcm d\u00fczeylerde kapsam nesnesi al\u0131n +instruction.getouterscope.description = +instruction.getouterscope.stackBefore = +instruction.getouterscope.stackAfter = obj +instruction.getouterscope.operands = allLevelScopeIndex + +instruction.initproperty.shortDescription = M\u00fclk ba\u015flat +instruction.initproperty.description = +instruction.initproperty.stackBefore = obj, [ns], [isim], de\u011fer +instruction.initproperty.stackAfter = +instruction.initproperty.operands = \u00f6zellik + +#Undocumented: +instruction.setpropertylate.shortDescription = Set \u00f6zelli\u011fi (y\u0131\u011f\u0131n\u0131 temel al\u0131r) +instruction.setpropertylate.description = +#instruction.setpropertylate.stackBefore = +#instruction.setpropertylate.stackAfter = +#instruction.setpropertylate.operands = + +instruction.deleteproperty.shortDescription = M\u00fclk\u00fc sil +instruction.deleteproperty.description = +instruction.deleteproperty.stackBefore = obj, [ns], [isim] +instruction.deleteproperty.stackAfter = boolResult +instruction.deleteproperty.operands = \u00f6zellik + +#Undocumented: +instruction.deletepropertylate.shortDescription = M\u00fclk\u00fc sil (y\u0131\u011f\u0131n\u0131 temel al\u0131r) +instruction.deletepropertylate.description = +#instruction.deletepropertylate.stackBefore = +#instruction.deletepropertylate.stackAfter = +instruction.deletepropertylate.operands = + +instruction.getslot.shortDescription = Bir alan\u0131n de\u011ferini al +instruction.getslot.description = +instruction.getslot.stackBefore = obj +instruction.getslot.stackAfter = de\u011fer +instruction.getslot.operands = slotIndex + +instruction.setslot.shortDescription = Bir yuvan\u0131n de\u011ferini ayarla +instruction.setslot.description = +instruction.setslot.stackBefore = obj, de\u011fer +instruction.setslot.stackAfter = +instruction.setslot.operands = slotIndex + +instruction.getglobalslot.shortDescription = Genel kapsamdaki alan\u0131n de\u011ferini al +instruction.getglobalslot.description = +instruction.getglobalslot.stackBefore = +instruction.getglobalslot.stackAfter = de\u011fer +instruction.getglobalslot.operands = slotIndex + +instruction.setglobalslot.shortDescription = Yuvan\u0131n global kapsamdaki de\u011ferini ayarlay\u0131n +instruction.setglobalslot.description = +instruction.setglobalslot.stackBefore = de\u011fer +instruction.setglobalslot.stackAfter = +instruction.setglobalslot.operands = slotIndex + +instruction.convert_s.shortDescription = De\u011feri dizede d\u00f6n\u00fc\u015ft\u00fcr +instruction.convert_s.description = +instruction.convert_s.stackBefore = de\u011fer +instruction.convert_s.stackAfter = stringValue +instruction.convert_s.operands = + +instruction.esc_xelem.shortDescription = XML \u00f6\u011fesi \u00e7\u0131k\u0131\u015f +instruction.esc_xelem.description = +instruction.esc_xelem.stackBefore = de\u011fer +instruction.esc_xelem.stackAfter = stringValue +instruction.esc_xelem.operands = + +instruction.esc_xattr.shortDescription = XML \u00f6zniteli\u011fini \u00e7\u0131k\u0131\u015f +instruction.esc_xattr.description = +instruction.esc_xattr.stackBefore = de\u011fer +instruction.esc_xattr.stackAfter = stringValue +instruction.esc_xattr.operands = + +instruction.convert_i.shortDescription = De\u011feri tamsay\u0131ya \u00e7evir +instruction.convert_i.description = +instruction.convert_i.stackBefore = de\u011fer +instruction.convert_i.stackAfter = intValue +instruction.convert_i.operands = + +instruction.convert_u.shortDescription = De\u011feri i\u015faretsiz tamsay\u0131ya \u00e7evir +instruction.convert_u.description = +instruction.convert_u.stackBefore = de\u011fer +instruction.convert_u.stackAfter = uintValue +instruction.convert_u.operands = + +instruction.convert_d.shortDescription = De\u011feri \u00e7ift olarak d\u00f6n\u00fc\u015ft\u00fcr +instruction.convert_d.description = +instruction.convert_d.stackBefore = de\u011fer +instruction.convert_d.stackAfter = doubleValue +instruction.convert_d.operands = + +instruction.convert_b.shortDescription = De\u011feri boole de\u011ferine \u00e7evir +instruction.convert_b.description = +instruction.convert_b.stackBefore = de\u011fer +instruction.convert_b.stackAfter = booleanValue +instruction.convert_b.operands = + +instruction.convert_o.shortDescription = De\u011feri nesneye d\u00f6n\u00fc\u015ft\u00fcr +instruction.convert_o.description = +instruction.convert_o.stackBefore = de\u011fer +instruction.convert_o.stackAfter = de\u011fer +instruction.convert_o.operands = + +instruction.checkfilter.shortDescription = Nesnenin filtre i\u015flemine tabi olabilece\u011fini kontrol edin +instruction.checkfilter.description = +instruction.checkfilter.stackBefore = de\u011fer +instruction.checkfilter.stackAfter = de\u011fer +instruction.checkfilter.operands = + +instruction.convert_m.shortDescription = De\u011feri ondal\u0131k say\u0131ya \u00e7evir +instruction.convert_m.description = +instruction.convert_m.stackBefore = de\u011fer +instruction.convert_m.stackAfter = decimalValue +instruction.convert_m.operands = + +instruction.convert_m_p.shortDescription = Say\u0131 ba\u011flam\u0131yla ondal\u0131k de\u011fere d\u00f6n\u00fc\u015ft\u00fcrme +instruction.convert_m_p.description = +instruction.convert_m_p.stackBefore = de\u011fer +instruction.convert_m_p.stackAfter = decimalValue +instruction.convert_m_p.operands = numberContext + +instruction.convert_f.shortDescription = De\u011feri float'a d\u00f6n\u00fc\u015ft\u00fcr +instruction.convert_f.description = +instruction.convert_f.stackBefore = de\u011fer +instruction.convert_f.stackAfter = floatValue +instruction.convert_f.operands = + +instruction.convert_f4.shortDescription = De\u011feri float4'e d\u00f6n\u00fc\u015ft\u00fcr +instruction.convert_f4.description = +instruction.convert_f4.stackBefore = de\u011fer +instruction.convert_f4.stackAfter = float4Value +instruction.convert_f4.operands = + +instruction.coerce.shortDescription = Belirtilen t\u00fcre \u00e7arpma de\u011feri +instruction.coerce.description = +instruction.coerce.stackBefore = de\u011fer +instruction.coerce.stackAfter = coercedValue +instruction.coerce.operands = tip + +instruction.coerce_b.shortDescription = Boole de\u011ferini kuvvetlendir +instruction.coerce_b.description = +instruction.coerce_b.stackBefore = de\u011fer +instruction.coerce_b.stackAfter = booleanValue +instruction.coerce_b.operands = +instruction.coerce_b.deprecated = Bunun yerine convert_b kullan\u0131n + +instruction.coerce_a.shortDescription = Her t\u00fcre kuantum de\u011feri +instruction.coerce_a.description = +instruction.coerce_a.stackBefore = de\u011fer +instruction.coerce_a.stackAfter = de\u011fer +instruction.coerce_a.operands = + +instruction.coerce_i.shortDescription = Say\u0131y\u0131 tamsay\u0131ya \u00e7arpar +instruction.coerce_i.description = +instruction.coerce_i.stackBefore = de\u011fer +instruction.coerce_i.stackAfter = intValue +instruction.coerce_i.operands = +instruction.coerce_i.deprecated = Bunun yerine convert_i kullan\u0131n + +instruction.coerce_d.shortDescription = \u00c7ift kat kuvvet de\u011feri +instruction.coerce_d.description = +instruction.coerce_d.stackBefore = de\u011fer +instruction.coerce_d.stackAfter = doubleValue +instruction.coerce_d.operands = +instruction.coerce_d.deprecated = Bunun yerine convert_d kullan\u0131n + +instruction.coerce_s.shortDescription = Dizeye kuvvet katmak +instruction.coerce_s.description = +instruction.coerce_s.stackBefore = de\u011fer +instruction.coerce_s.stackAfter = stringValue +instruction.coerce_s.operands = + +instruction.astype.shortDescription = Ayn\u0131 de\u011feri d\u00f6nd\u00fcr\u00fcr veya belirtilmemi\u015fse bo\u015f olur +instruction.astype.description = +instruction.astype.stackBefore = de\u011fer +instruction.astype.stackAfter = de\u011fer +instruction.astype.operands = tip +instruction.astypelate.shortDescription = Ayn\u0131 de\u011feri d\u00f6nd\u00fcr\u00fcr veya belirtilmemi\u015fse bo\u015f olur (y\u0131\u011f\u0131n tabanl\u0131) +instruction.astypelate.description = +instruction.astypelate.stackBefore = de\u011fer, tip +instruction.astypelate.stackAfter = de\u011fer +instruction.astypelate.operands = + +instruction.coerce_u.shortDescription = \u0130\u015faretsiz tamsay\u0131ya kuvvet de\u011feri koy +instruction.coerce_u.description = +instruction.coerce_u.stackBefore = de\u011fer +instruction.coerce_u.stackAfter = uintValue +instruction.coerce_u.operands = + +instruction.coerce_o.shortDescription = Nesne i\u00e7in de\u011feri zorla +instruction.coerce_o.description = +instruction.coerce_o.stackBefore = de\u011fer +instruction.coerce_o.stackAfter = de\u011fer +instruction.coerce_o.operands = + +instruction.negate_p.shortDescription = Say\u0131 ba\u011flam\u0131n\u0131 kullanarak de\u011feri negatifle\u015ftir +instruction.negate_p.description = +instruction.negate_p.stackBefore = de\u011fer +instruction.negate_p.stackAfter = -de\u011fer +instruction.negate_p.operands = operand1 + +instruction.negate.shortDescription = De\u011feri olumsuz +instruction.negate.description = +instruction.negate.stackBefore = de\u011fer +instruction.negate.stackAfter = -de\u011fer +instruction.negate.operands = + +instruction.increment.shortDescription = Artma de\u011feri +instruction.increment.description = +instruction.increment.stackBefore = de\u011fer +instruction.increment.stackAfter = incrementedValue +instruction.increment.operands = + +instruction.inclocal.shortDescription = Yerel kayd\u0131 art\u0131r\u0131n +instruction.inclocal.description = +instruction.inclocal.stackBefore = +instruction.inclocal.stackAfter = +instruction.inclocal.operands = localRegister + +instruction.decrement.shortDescription = Azaltma de\u011feri +instruction.decrement.description = +instruction.decrement.stackBefore = de\u011fer +instruction.decrement.stackAfter = decrementedValue +instruction.decrement.operands = + +instruction.declocal.shortDescription = Yerel kayd\u0131 d\u00fc\u015f\u00fcrmek +instruction.declocal.description = +instruction.declocal.stackBefore = +instruction.declocal.stackAfter = +instruction.declocal.operands = localRegister + +instruction.typeof.shortDescription = De\u011fer t\u00fcr\u00fcn\u00fcn ad\u0131n\u0131 \u00f6\u011frenin +instruction.typeof.description = +instruction.typeof.stackBefore = de\u011fer +instruction.typeof.stackAfter = typeName +instruction.typeof.operands = + +instruction.not.shortDescription = Boolean reddetmek +instruction.not.description = +instruction.not.stackBefore = de\u011fer +instruction.not.stackAfter = !de\u011fer +instruction.not.operands = + +instruction.bitnot.shortDescription = Bitwise olarak reddetmek +instruction.bitnot.description = +instruction.bitnot.stackBefore = de\u011fer +instruction.bitnot.stackAfter = ~de\u011fer +instruction.bitnot.operands = + +#Undocumented: +instruction.concat.shortDescription = Art arda Ekle +instruction.concat.description = +#instruction.concat.stackBefore = +#instruction.concat.stackAfter = +#instruction.concat.operands = + +#Undocumented: +instruction.add_d.shortDescription = Add_d +instruction.add_d.description = +#instruction.add_d.stackBefore = +#instruction.add_d.stackAfter = +#instruction.add_d.operands = + +instruction.increment_p.shortDescription = Say\u0131 i\u00e7eri\u011fini kullanarak art\u0131m de\u011feri +instruction.increment_p.description = +instruction.increment_p.stackBefore = de\u011fer +instruction.increment_p.stackAfter = incrementedValue +instruction.increment_p.operands = numberContext + +instruction.inclocal_p.shortDescription = Numara ba\u011flam\u0131n\u0131 kullanarak yerel kayd\u0131 artt\u0131rma +instruction.inclocal_p.description = +instruction.inclocal_p.stackBefore = +instruction.inclocal_p.stackAfter = +instruction.inclocal_p.operands = numberContext, localRegister + +instruction.decrement_p.shortDescription = Say\u0131 ba\u011flam\u0131n\u0131 kullanarak de\u011feri d\u00fc\u015f\u00fcrme +instruction.decrement_p.description = +instruction.decrement_p.stackBefore = de\u011fer +instruction.decrement_p.stackAfter = decrementedValue +instruction.decrement_p.operands = numberContext + +instruction.declocal_p.shortDescription = Numara ba\u011flam\u0131n\u0131 kullanarak yerel kayd\u0131 d\u00fc\u015f\u00fcrme +instruction.declocal_p.description = +instruction.declocal_p.stackBefore = +instruction.declocal_p.stackAfter = +instruction.declocal_p.operands = numberContext, localRegister + +instruction.add.shortDescription = \u0130ki de\u011fer ekle +instruction.add.description = +instruction.add.stackBefore = de\u011fer1, de\u011fer2 +instruction.add.stackAfter = de\u011fer3 +instruction.add.operands = + +instruction.subtract.shortDescription = \u0130ki de\u011feri \u00e7\u0131kar +instruction.subtract.description = +instruction.subtract.stackBefore = de\u011fer1, de\u011fer2 +instruction.subtract.stackAfter = de\u011fer3 +instruction.subtract.operands = + +instruction.multiply.shortDescription = \u0130ki de\u011feri \u00e7arp\u0131n +instruction.multiply.description = +instruction.multiply.stackBefore = de\u011fer1, de\u011fer2 +instruction.multiply.stackAfter = de\u011fer3 +instruction.multiply.operands = + +instruction.divide.shortDescription = \u0130ki de\u011feri b\u00f6l +instruction.divide.description = +instruction.divide.stackBefore = de\u011fer1, de\u011fer2 +instruction.divide.stackAfter = de\u011fer3 +instruction.divide.operands = + +instruction.modulo.shortDescription = Modulo iki de\u011feri b\u00f6ler +instruction.modulo.description = +instruction.modulo.stackBefore = de\u011fer1, de\u011fer2 +instruction.modulo.stackAfter = de\u011fer3 +instruction.modulo.operands = + +instruction.lshift.shortDescription = Bitsel sola kayd\u0131rma +instruction.lshift.description = +instruction.lshift.stackBefore = de\u011fer1, de\u011fer2 +instruction.lshift.stackAfter = de\u011fer3 +instruction.lshift.operands = + +instruction.rshift.shortDescription = Bitsel sa\u011fa kayd\u0131rma +instruction.rshift.description = +instruction.rshift.stackBefore = de\u011fer1, de\u011fer2 +instruction.rshift.stackAfter = de\u011fer3 +instruction.rshift.operands = + +instruction.urshift.shortDescription = Bitsel i\u015faretsiz sa\u011fa kayd\u0131rma +instruction.urshift.description = +instruction.urshift.stackBefore = de\u011fer1, de\u011fer2 +instruction.urshift.stackAfter = de\u011fer3 +instruction.urshift.operands = + +instruction.bitand.shortDescription = Bitsel ve +instruction.bitand.description = +instruction.bitand.stackBefore = de\u011fer1, de\u011fer2 +instruction.bitand.stackAfter = de\u011fer3 +instruction.bitand.operands = + +instruction.bitor.shortDescription = Bitsel veya +instruction.bitor.description = +instruction.bitor.stackBefore = de\u011fer1, de\u011fer2 +instruction.bitor.stackAfter = de\u011fer3 +instruction.bitor.operands = + +instruction.bitxor.shortDescription = Bitsel xor +instruction.bitxor.description = +instruction.bitxor.stackBefore = de\u011fer1, de\u011fer2 +instruction.bitxor.stackAfter = de\u011fer3 +instruction.bitxor.operands = + +instruction.equals.shortDescription = \u0130ki de\u011feri kar\u015f\u0131la\u015ft\u0131r\u0131n +instruction.equals.description = +instruction.equals.stackBefore = de\u011fer1, de\u011fer2 +instruction.equals.stackAfter = booleanResult +instruction.equals.operands = + +instruction.strictequals.shortDescription = S\u0131k\u0131 iki de\u011fer kar\u015f\u0131la\u015ft\u0131r +instruction.strictequals.description = +instruction.strictequals.stackBefore = de\u011fer1, de\u011fer2 +instruction.strictequals.stackAfter = booleanResult +instruction.strictequals.operands = + +instruction.lessthan.shortDescription = Bu de\u011ferin di\u011fer de\u011ferden d\u00fc\u015f\u00fck olup olmad\u0131\u011f\u0131n\u0131 kontrol edin +instruction.lessthan.description = +instruction.lessthan.stackBefore = de\u011fer1, de\u011fer2 +instruction.lessthan.stackAfter = booleanResult +instruction.lessthan.operands = + +instruction.lessequals.shortDescription = Bu de\u011ferin di\u011fer de\u011ferden daha az veya e\u015fit oldu\u011funu kontrol edin +instruction.lessequals.description = +instruction.lessequals.stackBefore = de\u011fer1, de\u011fer2 +instruction.lessequals.stackAfter = booleanResult +instruction.lessequals.operands = booleanResult + +instruction.greaterthan.shortDescription = Bu de\u011ferin di\u011fer de\u011ferden b\u00fcy\u00fck veya e\u015fit oldu\u011funu kontrol edin +instruction.greaterthan.description = +instruction.greaterthan.stackBefore = de\u011fer1, de\u011fer2 +instruction.greaterthan.stackAfter = booleanResult +instruction.greaterthan.operands = + +instruction.greaterequals.shortDescription = Bu de\u011ferin di\u011fer de\u011ferden b\u00fcy\u00fck veya e\u015fit oldu\u011funu kontrol edin +instruction.greaterequals.description = +instruction.greaterequals.stackBefore = de\u011fer1, de\u011fer2 +instruction.greaterequals.stackAfter = booleanResult +instruction.greaterequals.operands = + +instruction.instanceof.shortDescription = Nesnenin prototip zincirinde var olup olmad\u0131\u011f\u0131n\u0131 kontrol edin +instruction.instanceof.description = +instruction.instanceof.stackBefore = value, type +instruction.instanceof.stackAfter = booleanResult +instruction.instanceof.operands = + +instruction.istype.shortDescription = Nesnenin belirtilen t\u00fcrde oldu\u011funu kontrol edin +instruction.istype.description = +instruction.istype.stackBefore = de\u011fer +instruction.istype.stackAfter = booleanResult +instruction.istype.operands = tip + +instruction.istypelate.shortDescription = Nesnenin belirtilen t\u00fcrde oldu\u011funu kontrol edin (y\u0131\u011f\u0131n\u0131 temel al\u0131r) +instruction.istypelate.description = +instruction.istypelate.stackBefore = de\u011fer, tip +instruction.istypelate.stackAfter = booleanResult +instruction.istypelate.operands = + +instruction.in.shortDescription = Nesnenin m\u00fclk\u00fc adland\u0131rd\u0131\u011f\u0131n\u0131 kontrol et +instruction.in.description = +instruction.in.stackBefore = isim, obj +instruction.in.stackAfter = booleanResult +instruction.in.operands = + +instruction.add_p.shortDescription = Say\u0131 ba\u011flam\u0131n\u0131 kullanarak iki de\u011fer ekle +instruction.add_p.description = +instruction.add_p.stackBefore = de\u011fer1, de\u011fer2 +instruction.add_p.stackAfter = de\u011fer3 +instruction.add_p.operands = numberContext + +instruction.subtract_p.shortDescription = Say\u0131 ba\u011flam\u0131n\u0131 kullanarak iki de\u011feri \u00e7\u0131kar\u0131n +instruction.subtract_p.description = +instruction.subtract_p.stackBefore = de\u011fer1, de\u011fer2 +instruction.subtract_p.stackAfter = de\u011fer3 +instruction.subtract_p.operands = numberContext + +instruction.multiply_p.shortDescription = Say\u0131 ba\u011flam\u0131n\u0131 kullanarak iki de\u011feri \u00e7arp\u0131n +instruction.multiply_p.description = +instruction.multiply_p.stackBefore = de\u011fer1, de\u011fer2 +instruction.multiply_p.stackAfter = de\u011fer3 +instruction.multiply_p.operands = numberContext + +instruction.divide_p.shortDescription = Say\u0131 ba\u011flam\u0131n\u0131 kullanarak iki de\u011feri b\u00f6l +instruction.divide_p.description = +instruction.divide_p.stackBefore = de\u011fer1, de\u011fer2 +instruction.divide_p.stackAfter = de\u011fer3 +instruction.divide_p.operands = numberContext + +instruction.modulo_p.shortDescription = Mod\u00fclo, say\u0131 i\u00e7eri\u011fini kullanarak iki de\u011feri b\u00f6ler +instruction.modulo_p.description = +instruction.modulo_p.stackBefore = de\u011fer1, de\u011fer2 +instruction.modulo_p.stackAfter = de\u011fer3 +instruction.modulo_p.operands = numberContext + +instruction.increment_i.shortDescription = Tamsay\u0131 de\u011feri art\u0131\u015f\u0131 +instruction.increment_i.description = +instruction.increment_i.stackBefore = de\u011fer +instruction.increment_i.stackAfter = incrementedValue +instruction.increment_i.operands = + +instruction.decrement_i.shortDescription = D\u00fczeltme tamsay\u0131 de\u011feri +instruction.decrement_i.description = +instruction.decrement_i.stackBefore = de\u011fer +instruction.decrement_i.stackAfter = decrementedValue +instruction.decrement_i.operands = + +instruction.inclocal_i.shortDescription = Yerel kay\u0131t tamsay\u0131 de\u011ferini art\u0131rmak +instruction.inclocal_i.description = +instruction.inclocal_i.stackBefore = +instruction.inclocal_i.stackAfter = +instruction.inclocal_i.operands = localRegister + +instruction.declocal_i.shortDescription = Yerel kay\u0131t tamsay\u0131 de\u011ferinin d\u00fc\u015f\u00fcr\u00fclmesi +instruction.declocal_i.description = +instruction.declocal_i.stackBefore = +instruction.declocal_i.stackAfter = +instruction.declocal_i.operands = localRegister + +instruction.negate_i.shortDescription = Negatif tamsay\u0131 de\u011feri +instruction.negate_i.description = +instruction.negate_i.stackBefore = de\u011fer +instruction.negate_i.stackAfter = -de\u011fer +instruction.negate_i.operands = + +instruction.add_i.shortDescription = \u0130ki tamsay\u0131 de\u011feri ekle +instruction.add_i.description = +instruction.add_i.stackBefore = de\u011fer1, de\u011fer2 +instruction.add_i.stackAfter = de\u011fer3 +instruction.add_i.operands = + +instruction.subtract_i.shortDescription = \u0130ki tamsay\u0131 de\u011ferini \u00e7\u0131kar +instruction.subtract_i.description = +instruction.subtract_i.stackBefore = de\u011fer1, de\u011fer2 +instruction.subtract_i.stackAfter = de\u011fer3 +instruction.subtract_i.operands = + +instruction.multiply_i.shortDescription = \u0130ki tam say\u0131 de\u011feri \u00e7arp\u0131n +instruction.multiply_i.description = +instruction.multiply_i.stackBefore = de\u011fer1, de\u011fer2 +instruction.multiply_i.stackAfter = de\u011fer3 +instruction.multiply_i.operands = + +instruction.getlocal_0.shortDescription = Yerel kay\u0131t al\u0131n 0 +instruction.getlocal_0.description = +instruction.getlocal_0.stackBefore = +instruction.getlocal_0.stackAfter = de\u011fer +instruction.getlocal_0.operands = + +instruction.getlocal_1.shortDescription = Yerel kay\u0131t al\u0131n 1 +instruction.getlocal_1.description = +instruction.getlocal_1.stackBefore = +instruction.getlocal_1.stackAfter = de\u011fer +instruction.getlocal_1.operands = + +instruction.getlocal_2.shortDescription = Yerel kay\u0131t al\u0131n 2 +instruction.getlocal_2.description = +instruction.getlocal_2.stackBefore = +instruction.getlocal_2.stackAfter = de\u011fer +instruction.getlocal_2.operands = + +instruction.getlocal_3.shortDescription = Yerel kay\u0131t al\u0131n 3 +instruction.getlocal_3.description = +instruction.getlocal_3.stackBefore = +instruction.getlocal_3.stackAfter = de\u011fer +instruction.getlocal_3.operands = + +instruction.setlocal_0.shortDescription = Yerel kay\u0131t ayarla 0 +instruction.setlocal_0.description = +instruction.setlocal_0.stackBefore = de\u011fer +instruction.setlocal_0.stackAfter = +instruction.setlocal_0.operands = + +instruction.setlocal_1.shortDescription = Yerel kay\u0131t ayarla 1 +instruction.setlocal_1.description = +instruction.setlocal_1.stackBefore = de\u011fer +instruction.setlocal_1.stackAfter = +instruction.setlocal_1.operands = + +instruction.setlocal_2.shortDescription = Yerel kay\u0131t ayarla 2 +instruction.setlocal_2.description = +instruction.setlocal_2.stackBefore = de\u011fer +instruction.setlocal_2.stackAfter = +instruction.setlocal_2.operands = + +instruction.setlocal_3.shortDescription = Yerel kay\u0131t ayarla 3 +instruction.setlocal_3.description = +instruction.setlocal_3.stackBefore = de\u011fer +instruction.setlocal_3.stackAfter = +instruction.setlocal_3.operands = + +#Undocumented: +instruction.invalid.shortDescription = Ge\u00e7ersiz +instruction.invalid.description = +#instruction.invalid.stackBefore = +#instruction.invalid.stackAfter = +#instruction.invalid.operands = + +#Undocumented: +instruction.abs_jump.shortDescription = Mutlak s\u0131\u00e7rama +instruction.abs_jump.description = +#instruction.abs_jump.stackBefore = +#instruction.abs_jump.stackAfter = +#instruction.abs_jump.operands = + +instruction.debug.shortDescription = Hata ay\u0131klama bilgisi +instruction.debug.description = +instruction.debug.stackBefore = +instruction.debug.stackAfter = +instruction.debug.operands = debugType, regName, localRegister, extra + +instruction.debugline.shortDescription = Sat\u0131r numaras\u0131 bilgisini hata ay\u0131klama +instruction.debugline.description = +instruction.debugline.stackBefore = +instruction.debugline.stackAfter = +instruction.debugline.operands = lineNumber + +instruction.debugfile.shortDescription = Hata ay\u0131klama dosyas\u0131 bilgisi +instruction.debugfile.description = +instruction.debugfile.stackBefore = +instruction.debugfile.stackAfter = +instruction.debugfile.operands = fileName + +instruction.bkptline.shortDescription = Hat \u00fczerinde kesme noktas\u0131 +instruction.bkptline.description = +instruction.bkptline.stackBefore = +instruction.bkptline.stackAfter = +instruction.bkptline.operands = lineNumber + +#Undocumented: +instruction.timestamp.shortDescription = Zaman Damgas\u0131 +instruction.timestamp.description = +instruction.timestamp.stackBefore = +instruction.timestamp.stackAfter = +instruction.timestamp.operands = + +#Undocumented: +instruction.verifypass.shortDescription = Ge\u00e7i\u015fi do\u011frulay\u0131n +instruction.verifypass.description = +#instruction.verifypass.stackBefore = +#instruction.verifypass.stackAfter = +#instruction.verifypass.operands = + +#Undocumented: +instruction.alloc.shortDescription = Ay\u0131rma +instruction.alloc.description = +#instruction.alloc.stackBefore = +#instruction.alloc.stackAfter = +#instruction.alloc.operands = + +#Undocumented: +instruction.mark.shortDescription = \u0130\u015faretli +instruction.mark.description = +#instruction.mark.stackBefore = +#instruction.mark.stackAfter = +#instruction.mark.operands = + +#Undocumented: +instruction.wb.shortDescription = Wb +instruction.wb.description = +#instruction.wb.stackBefore = +#instruction.wb.stackAfter = +#instruction.wb.operands = + +#Undocumented: +instruction.prologue.shortDescription = Ba\u015flang\u0131\u00e7 +instruction.prologue.description = +#instruction.prologue.stackBefore = +#instruction.prologue.stackAfter = +#instruction.prologue.operands = + +#Undocumented: +instruction.sendenter.shortDescription = G\u00f6nder ENTER +instruction.sendenter.description = +#instruction.sendenter.stackBefore = +#instruction.sendenter.stackAfter = +#instruction.sendenter.operands = + +#Undocumented: +instruction.doubletoatom.shortDescription = Atom i\u00e7in \u00c7ift +instruction.doubletoatom.description = +#instruction.doubletoatom.stackBefore = +#instruction.doubletoatom.stackAfter = +#instruction.doubletoatom.operands = + +#Undocumented: +instruction.sweep.shortDescription = S\u00fcp\u00fcrme +instruction.sweep.description = +#instruction.sweep.stackBefore = +#instruction.sweep.stackAfter = +#instruction.sweep.operands = + +#Undocumented: +instruction.codegenop.shortDescription = CodeGenOp +instruction.codegenop.description = +#instruction.codegenop.stackBefore = +#instruction.codegenop.stackAfter = +#instruction.codegenop.operands = + +#Undocumented: +instruction.verifyop.shortDescription = VerifyOp +instruction.verifyop.description = +#instruction.verifyop.stackBefore = +#instruction.verifyop.stackAfter = +#instruction.verifyop.operands = + +#Undocumented: +instruction.decode.shortDescription = Kod \u00c7\u00f6zme +instruction.decode.description = +#instruction.decode.stackBefore = +#instruction.decode.stackAfter = +#instruction.decode.operands = + + +instruction.unplus.shortDescription = Birlik art\u0131 - say\u0131sal kuvvet +instruction.unplus.description = +instruction.unplus.stackBefore = de\u011fer +instruction.unplus.stackAfter = de\u011fer +instruction.unplus.operands = + +instruction.pushconstant.shortDescription = \u0130stifte sabit de\u011feri bast\u0131r +instruction.pushconstant.description = +#instruction.pushconstant.stackBefore = +#instruction.pushconstant.stackAfter = +instruction.pushconstant.operands = de\u011fer \ No newline at end of file diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/locales/docs/pcode/AS3other_tr.properties b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/locales/docs/pcode/AS3other_tr.properties new file mode 100644 index 000000000..c2a3ada47 --- /dev/null +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/locales/docs/pcode/AS3other_tr.properties @@ -0,0 +1,92 @@ +# Copyright (C) 2010-2016 JPEXS, All rights reserved. +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 3.0 of the License, or (at your option) any later version. +# +# This library 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 +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library. +ui.list.heading = AVM2 p-kodu +ui.list.pageTitle = AVM2 p-kodu +ui.list.documentTitle = AVM2 p-kodu +ui.list.pageDescription = P-kodu ayarlar\u0131n\u0131n listesi + + +name.QName = Kalifiye Ad +name.QNameA = Nitelendirilmi\u015f \u0130sim Niteli\u011fi +name.RTQName = \u00c7al\u0131\u015fma Zaman\u0131 Kalifiye Ad\u0131 +name.RTQNameA = \u00d6znitelikte \u00c7al\u0131\u015fma Zaman\u0131 Niteli\u011finin Ad\u0131 +name.RTQNameL = \u00c7al\u0131\u015fma Zaman\u0131 Kalifiye Ad\u0131 Ge\u00e7 +name.RTQNameLA = \u00c7al\u0131\u015fma Zaman\u0131 Kalifiye Ad\u0131 Ge\u00e7erlilik Sonu +name.Multiname = Birden Fazla Ad Alan\u0131 Ad\u0131 +name.MultinameA = \u00d6zniteli\u011fin \u00c7oklu \u0130sim Alan Ad\u0131 +name.MultinameL = Birden Fazla Ad Alan\u0131 Ad\u0131 Ge\u00e7 +name.MultinameLA = Birden Fazla Ad Alan\u0131 Ad\u0131 Ge\u00e7erlilik Sonu +name.TypeName = Tip Ad\u0131 + +namespacekind.Namespace = Ad alan\u0131 +namespacekind.PrivateNamespace = \u00d6zel Ad Alan\u0131 +namespacekind.PackageNamespace = Paket Ad Alan\u0131 +namespacekind.PackageInternalNs = Paket \u0130\u00e7 Ad Alan\u0131 +namespacekind.ProtectedNamespace = Korunan Ad Alan\u0131 +namespacekind.ExplicitNamespace = A\u00e7\u0131k Ad Alan\u0131 +namespacekind.StaticProtectedNs = Statik Ad Alan\u0131 + +trait = \u00d6zellik +#types: +trait.method = Tip y\u00f6nteminin \u00f6zelli\u011fi +trait.slot = Tip yuvas\u0131n\u0131n \u00f6zelli\u011fi +trait.const = Const tipinin \u00f6zelli\u011fi +trait.method = Tip y\u00f6nteminin \u00f6zelli\u011fi +trait.setter = S\u0131n\u0131fland\u0131r\u0131c\u0131 tipinin \u00f6zelli\u011fi +trait.getter = T\u00fcr al\u0131c\u0131n\u0131n \u00f6zelli\u011fi +trait.class = S\u0131n\u0131f t\u00fcr\u00fcn\u00fcn \u00f6zelli\u011fi +trait.function = Tip i\u015flevin niteli\u011fi + +trait.metadata = Meta veri +trait.metadata.item = Bir meta veri \u00f6\u011fesi +trait.metadata.end = Meta verilerin sonu + +trait.flag = \u00d6zel bayrak +trait.flag.METADATA = \u00d6zellikler metadata ekli +trait.flag.FINAL = Son a\u015fama +trait.flag.OVERRIDE = \u00d6zellik \u00fcst \u00f6\u011feyi ge\u00e7ersiz k\u0131lar. + +#method/getter/setter +trait.dispid = G\u00f6nderim kimli\u011fi +#slot/const/class/function +trait.slotid = Yuva kimli\u011fi + +method = Y\u00f6ntem +method.name = Y\u00f6ntemin ad\u0131 +method.flag = Y\u00f6ntem bayra\u011f\u0131 +method.flag.NEED_ARGUMENTS = Kay\u0131t defterindeki "ba\u011f\u0131ms\u0131z de\u011fi\u015fkenler" nesnesi olu\u015fturma method_info.param_count+1 +method.flag.NEED_ACTIVATION = Bu y\u00f6ntem, yeni etkinle\u015ftirme talimat\u0131 kullan\u0131r +method.flag.NEED_REST = Dizide kay\u0131t arg\u00fcmanlar\u0131 yaratmak method_info.param_count+1 +method.flag.HAS_OPTIONAL = Bu y\u00f6ntemin iste\u011fe ba\u011fl\u0131 ba\u011f\u0131ms\u0131z de\u011fi\u015fkenleri var +method.flag.IGNORE_REST = ?? +method.flag.EXPLICIT = ?? +method.flag.SETSDXNS = Bu y\u00f6ntem, dxns veya dxnslate talimatlar\u0131n\u0131 kullan\u0131r +method.flag.HAS_PARAMNAMES = Bu y\u00f6ntem, method_info'da parametre adlar\u0131na sahiptir +method.param = Parametre t\u00fcr\u00fc +method.paramname = Parametrenin ad\u0131 +method.optional = \u0130ste\u011fe ba\u011fl\u0131 parametre i\u00e7in varsay\u0131lan de\u011fer +method.returns = Y\u00f6ntemin geri d\u00f6n\u00fc\u015f t\u00fcr\u00fc +method.body = Y\u00f6ntemin bedeni +method.body.maxstack = Herhangi bir \u00e7al\u0131\u015ft\u0131rma noktas\u0131nda maksimum y\u0131\u011f\u0131n yuvas\u0131 say\u0131s\u0131 +method.body.localcount = En y\u00fcksek numaral\u0131 yerel kay\u0131t art\u0131 i\u015fareti dizini +method.body.initscopedepth = Eri\u015filebilen minimum kapsam derinli\u011fi (maks. \u00d6l\u00e7e\u011fe g\u00f6re) +method.body.maxscopedepth = Eri\u015filebilen maksimum kapsam derinli\u011fi +method.body.try = \u0130stisna blo\u011fu +method.body.try.from = \u0130stisnan\u0131n etkinle\u015ftirildi\u011fi ba\u015flang\u0131\u00e7 \u200b\u200bkonumu +method.body.try.to = \u0130stisna devre d\u0131\u015f\u0131 b\u0131rak\u0131ld\u0131ktan sonra biti\u015f pozisyonu +method.body.try.target = Bu t\u00fcrden istisnalar at\u0131ld\u0131\u011f\u0131nda hangi denetime atlanaca\u011f\u0131 konumu +method.body.try.type = \u00d6rt\u00fcl\u00fc istisna t\u00fcr\u00fc +method.body.try.name = \u00d6zel durum nesnesinin ad\u0131 +method.body.code = Metot g\u00f6vdesi kodu \ No newline at end of file diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/defaultsyntaxkit/config_tr.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/defaultsyntaxkit/config_tr.properties new file mode 100644 index 000000000..ecbf2cb72 --- /dev/null +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/defaultsyntaxkit/config_tr.properties @@ -0,0 +1,118 @@ +DefaultAction.copy-to-clipboard.MenuText = Kopya +DefaultAction.cut-to-clipboard.MenuText = Kesmek +DefaultAction.paste-from-clipboard.MenuText = Yap\u0131\u015ft\u0131rmak +DefaultAction.select-all.MenuText = Hepsini Se\u00e7 + +Action.find.MenuText = Bulmak +Action.find.ToolTip = Bul ve De\u011fi\u015ftir ileti\u015fim kutusunu g\u00f6r\u00fcnt\u00fcle +Action.find-next.MenuText = Sonrakini Bul +Action.find-next.ToolTip = Son Bulmay\u0131 Yinele +Action.goto-line.MenuText = Sat\u0131r Numaras\u0131na Git +Action.goto-line.ToolTip = Sat\u0131r Numaras\u0131na Git +Action.indent.MenuText = Sat\u0131rba\u015f\u0131 +Action.unindent.MenuText = Girintisiz +Action.undo.MenuText = Geri al +Action.redo.MenuText = Yeniden Yapmak +Action.delete-lines.MenuText = \u00c7izgi(ler) Sil +Action.dup-lines-up.MenuText = Yukar\u0131daki Yinelenen Sat\u0131r +Action.dup-lines-down.MenuText = \u00c7izgileri A\u015fa\u011f\u0131 \u00c7o\u011falt +Action.toggle-lines.MenuText = Sat\u0131r Say\u0131lar\u0131n\u0131 De\u011fi\u015ftir +Action.show-abbs.MenuText = K\u0131saltmalar\u0131 g\u00f6ster +Action.show-abbs.ToolTip = K\u0131saltmalar\u0131 g\u00f6ster +Action.complete-word.MenuText = Tam Kelime +Action.jump-to-pair.MenuText = \u00c7ifte Ge\u00e7 +Action.toggle-comments.MenuText = Yorumlar\u0131 De\u011fi\u015ftir/A\u00e7/Kapat + +# !!!! FFDec translators - please do not edit anything below this line !!! +#========================================================================== + +Components = jsyntaxpane.components.PairsMarker, \ + jsyntaxpane.components.LineNumbersRuler +# This is the color to highlight tokens whenever the cursor is on them +TokenMarker.Color = 0xffeeaa +# Colors for PairMarkers +PairMarker.Color = 0xffbb77 +# +# Right Margin for LineNumbers border in pixels, Default = 5 +LineNumbers.RightMargin = 7 +# Foreground for line numbers, Default = Black +LineNumbers.Foreground = 0x333300 +# Background for line numbers, Default = White +LineNumbers.Background = 0xeeeeff +# Color to use for highlighting current line background +LineNumbers.CurrentBack = 0xccccee +# Default color for the Caret, Black +CaretColor = 0x000000 +# Actions: +Action.quick-find = jsyntaxpane.actions.QuickFindAction, control F +Action.find = jsyntaxpane.actions.FindReplaceAction, control H +Action.find-next = jsyntaxpane.actions.FindNextAction, F3 +Action.goto-line = jsyntaxpane.actions.GotoLineAction, control G + +Action.indent = jsyntaxpane.actions.IndentAction, TAB +Action.indent.Abbreviations = ${class_path}/abbreviations.properties +Action.unindent = jsyntaxpane.actions.UnindentAction, shift TAB + +Action.jindent = jsyntaxpane.actions.JIndentAction, ENTER +Action.undo = jsyntaxpane.actions.UndoAction, menu Z +Action.redo = jsyntaxpane.actions.RedoAction, menu Y +Action.delete-lines = jsyntaxpane.actions.DeleteLinesAction, control E +Action.dup-lines-up = jsyntaxpane.actions.DuplicateLinesAction, shift control UP +Action.dup-lines-down = jsyntaxpane.actions.DuplicateLinesAction, shift control DOWN + +Action.toggle-lines = jsyntaxpane.actions.ToggleComponentAction, control F2 +Action.toggle-lines.Component = jsyntaxpane.components.LineNumbersRuler + +Action.toggle-comments = jsyntaxpane.actions.ToggleCommentsAction, control SLASH +Action.toggle-comments.SmallIcon = comment.png +Action.jump-to-pair = jsyntaxpane.actions.JumpToPairAction, control OPEN_BRACKET +Action.complete-word = jsyntaxpane.actions.CompleteWordAction, control K + +Action.smart-home = jsyntaxpane.actions.SmartHomeAction, HOME +Action.smart-home-select = jsyntaxpane.actions.SmartHomeSelectAction, shift HOME +Action.show-abbs = jsyntaxpane.actions.ShowAbbsAction, F8 + +# +# View configuration: +TextAA = ON +DEFAULT_EDIT_MENU= \ + cut-to-clipboard , \ + copy-to-clipboard , \ + paste-from-clipboard , \ + - , \ + select-all , \ + - , \ + undo , \ + redo , \ + - , \ + find , \ + find-next , \ + goto-line , \ + jump-to-pair , \ + - , \ + complete-word + +# Default Popup Menu +PopupMenu = \ + ${DEFAULT_EDIT_MENU} , \ + - , \ + goto-line , \ + toggle-comments +# TokenType attributes +Style.OPERATOR = 0x000000, 0 +Style.DELIMITER = 0x000000, 1 +Style.KEYWORD = 0x3333ee, 0 +Style.KEYWORD2 = 0x3333ee, 3 +Style.TYPE = 0x000000, 2 +Style.TYPE2 = 0x000000, 1 +Style.TYPE3 = 0x000000, 3 +Style.STRING = 0xcc6600, 0 +Style.STRING2 = 0xcc6600, 1 +Style.NUMBER = 0x999933, 1 +Style.REGEX = 0xcc6600, 0 +Style.IDENTIFIER = 0x000000, 0 +Style.COMMENT = 0x339933, 2 +Style.COMMENT2 = 0x339933, 3 +Style.DEFAULT = 0x000000, 0 +Style.WARNING = 0xCC0000, 0 +Style.ERROR = 0xCC0000, 3 \ No newline at end of file diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_tr.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_tr.properties new file mode 100644 index 000000000..7eed09f59 --- /dev/null +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3methodinfosyntaxkit/config_tr.properties @@ -0,0 +1,36 @@ +Action.toggle-token-marker.MenuText = \u0130\u015faret \u0130\u015faret\u00e7isini De\u011fi\u015ftir + +# !!!! FFDec translators - please do not edit anything below this line !!! +#========================================================================== + +# +# JavaSyntaxKit Specific properties. +# +Components = jsyntaxpane.components.LineNumbersBreakpointsRuler, \ + jsyntaxpane.components.TokenMarker +TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 +# +# Performs single color selection (Default = false) +# +SingleColorSelect = true +RightMarginColumn = 80 +RightMarginColor = 0xdddddd +# +# Java Actions +Action.indent.WordRegex=\\w+|\\/(\\*)+ +#Action.parenthesis = jsyntaxpane.actions.PairAction, typed ( +Action.toggle-token-marker = jsyntaxpane.actions.ToggleComponentAction, control F3 +Action.toggle-token-marker.Component = jsyntaxpane.components.TokenMarker +#Action.brackets = jsyntaxpane.actions.PairAction, typed [ +Action.quotes = jsyntaxpane.actions.PairAction, typed ' +Action.double-quotes = jsyntaxpane.actions.PairAction, typed " +# +# These are the completions to be in the IntelliSense completion dialog +# comma separated values. +# Vertical bars: if there is one, it will position the cursor. If there are +# two, they will be start and end of selection +PopupMenu = \ + ${DEFAULT_EDIT_MENU} , \ + - , \ + toggle-lines , \ + toggle-token-marker \ No newline at end of file diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_tr.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_tr.properties new file mode 100644 index 000000000..3504d2d17 --- /dev/null +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasm3syntaxkit/config_tr.properties @@ -0,0 +1,45 @@ +Action.combo-completion.MenuText = Bir talimat se\u00e7 +Action.toggle-token-marker.MenuText = \u0130\u015faret \u0130\u015faret\u00e7isini De\u011fi\u015ftir + +# !!!! FFDec translators - please do not edit anything below this line !!! +#========================================================================== + +# +# JavaSyntaxKit Specific properties. +# +Components = jsyntaxpane.components.PairsMarker, \ + jsyntaxpane.components.LineNumbersBreakpointsRuler, \ + jsyntaxpane.components.TokenMarker +TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 +# +# Performs single color selection (Default = false) +# +SingleColorSelect = true +RightMarginColumn = 80 +RightMarginColor = 0xdddddd +# +# Java Actions +Action.indent.WordRegex=\\w+|\\/(\\*)+ +#Action.parenthesis = jsyntaxpane.actions.PairAction, typed ( +Action.toggle-token-marker = jsyntaxpane.actions.ToggleComponentAction, control F3 +Action.toggle-token-marker.Component = jsyntaxpane.components.TokenMarker +#Action.brackets = jsyntaxpane.actions.PairAction, typed [ +Action.quotes = jsyntaxpane.actions.PairAction, typed ' +Action.double-quotes = jsyntaxpane.actions.PairAction, typed " +# For completions, you have to define the Action (key to trigger completions): +Action.combo-completion = jsyntaxpane.actions.ComboCompletionAction, control SPACE +Action.combo-completion.ItemsURL=${class_path}/combocompletions.txt +# +# These are the completions to be in the IntelliSense completion dialog +# comma separated values. +# Vertical bars: if there is one, it will position the cursor. If there are +# two, they will be start and end of selection +PopupMenu = \ + ${DEFAULT_EDIT_MENU} , \ + - , \ + toggle-lines , \ + toggle-token-marker + +Style.KEYWORD = 0x0000ff, 1 +Style.KEYWORD2 = 0x007f7f, 1 +Style.OPERATOR = 0x7f007f, 0 \ No newline at end of file diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_tr.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_tr.properties new file mode 100644 index 000000000..cefe52504 --- /dev/null +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/META-INF/services/jsyntaxpane/syntaxkits/flasmsyntaxkit/config_tr.properties @@ -0,0 +1,40 @@ +Action.toggle-token-marker.MenuText = \u0130\u015faret \u0130\u015faret\u00e7isini De\u011fi\u015ftir + +# !!!! FFDec translators - please do not edit anything below this line !!! +#========================================================================== + +# +# JavaSyntaxKit Specific properties. +# +Components = jsyntaxpane.components.LineNumbersBreakpointsRuler, \ + jsyntaxpane.components.TokenMarker +TokenMarker.TokenTypes = IDENTIFIER, TYPE, TYPE2, TYPE3 +# +# Performs single color selection (Default = false) +# +SingleColorSelect = true +RightMarginColumn = 80 +RightMarginColor = 0xdddddd +# +# Java Actions +Action.indent.WordRegex=\\w+|\\/(\\*)+ +#Action.parenthesis = jsyntaxpane.actions.PairAction, typed ( +Action.toggle-token-marker = jsyntaxpane.actions.ToggleComponentAction, control F3 +Action.toggle-token-marker.Component = jsyntaxpane.components.TokenMarker +#Action.brackets = jsyntaxpane.actions.PairAction, typed [ +Action.quotes = jsyntaxpane.actions.PairAction, typed ' +Action.double-quotes = jsyntaxpane.actions.PairAction, typed " +# For completions, you have to define the Action (key to trigger completions): +Action.combo-completion = jsyntaxpane.actions.ComboCompletionAction, control SPACE +Action.combo-completion.MenuText = Completions +Action.combo-completion.ItemsURL=${class_path}/combocompletions.txt +# +# These are the completions to be in the IntelliSense completion dialog +# comma separated values. +# Vertical bars: if there is one, it will position the cursor. If there are +# two, they will be start and end of selection +PopupMenu = \ + ${DEFAULT_EDIT_MENU} , \ + - , \ + toggle-lines , \ + toggle-token-marker \ No newline at end of file diff --git a/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/jsyntaxpane/Bundle_tr.properties b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/jsyntaxpane/Bundle_tr.properties new file mode 100644 index 000000000..8fe363333 --- /dev/null +++ b/libsrc/jsyntaxpane/jsyntaxpane/src/main/resources/jsyntaxpane/Bundle_tr.properties @@ -0,0 +1,38 @@ +SyntaxTester.title = JSyntaxPane Test Cihaz\u0131 +SyntaxTester.lblCaretPos.text = D\u00fczeltme Pozisyonu +SyntaxTester.lblToken.text = \u0130mlecin alt\u0131ndaki simge +SyntaxTester.jEdtTest.contentType = +NO_TOKEN_AT_CURSOR = \u0130\u015faret\u00e7i yok + +HTMLPreviewFrame.title = HTML \u00d6nizleme +HTMLPreviewFrame.jEdtHtml.contentType = metin/HTML +QuickFindDialog.jChkWrap.text = Sarmak +QuickFindDialog.jChkRegExp.text = Reg Exp +QuickFindDialog.jChkIgnoreCase.text = Vakay\u0131 Yoksay +QuickFindDialog.jLabel1.text = H\u0131zl\u0131 arama +QuickFindDialog.NotFound = bulunamad\u0131 +ReplaceDialog.jChkRegex.text = D\u00fczenli \u0130fade +ReplaceDialog.jChkIgnoreCase.text = Vakay\u0131 Yoksay +ReplaceDialog.jLblReplace.text = De\u011fi\u015ftirmek +ReplaceDialog.jTglHighlight.text = Vurgulamak +ReplaceDialog.jBtnReplaceAll.text = Hepsini de\u011fi\u015ftir +ReplaceDialog.jBtnPrev.text = \u00d6nceki +ReplaceDialog.jChkWrap.toolTipText = Sona erdi\u011finde ba\u015fa sar\u0131n +ReplaceDialog.jChkWrap.text = Etraf\u0131na sarmak +ReplaceDialog.title = Bul ve De\u011fi\u015ftir +ReplaceDialog.jBtnNext.text = Sonraki +ReplaceDialog.jLblFind.text = Bulmak +ReplaceDialog.jBtnReplace.text = De\u011fi\u015ftirmek +ShowAbbsDialog.title = K\u0131saltmalar +GotoLineDialog.title = Sat\u0131ra git. +GotoLineDialog.jBtnOk.text = Gidi\u015f + +DocumentSearchData.SearchStringNotFound = Arama Dizesi {0} bulunamad\u0131 +DocumentSearchData.Find = Bulmak +ScriptAction.NoScriptConfigured = \u0130\u015flemin komut dosyas\u0131 i\u015flevi yap\u0131land\u0131r\u0131lmad\u0131 +ScriptAction.ErrorInScript = Komut Dosyas\u0131ndaki Hata +ScriptAction.NoScriptFoundIn = \u0130\u00e7inde hi\u00e7bir komut dosyas\u0131 bulunamad\u0131: +ScriptRunnerAction.ErrorExecutingScript = Komut dosyas\u0131 \u00e7al\u0131\u015ft\u0131r\u0131l\u0131rken hata olu\u015ftu:\\n +ScriptRunnerAction.ScriptError = Komut Dosyas\u0131 Hatas\u0131 +ScriptRunnerAction.ScriptEngineNotFound = [{0}] i\u00e7in komut dosyas\u0131 bulunamad\u0131. Bu \u0130\u015flemi Devre D\u0131\u015f\u0131 B\u0131rakma +ShowAbbsAction.NoAbbsForType = Bu i\u00e7erik t\u00fcr\u00fc i\u00e7in k\u0131saltma yok diff --git a/nsis_locales/Turkish.nsh b/nsis_locales/Turkish.nsh new file mode 100644 index 000000000..5a0da00c6 --- /dev/null +++ b/nsis_locales/Turkish.nsh @@ -0,0 +1,63 @@ +!define LANG "TURKISH" ; Must be the lang name define by NSIS +!insertmacro LANG_STRING STRING_SWC_NOTFOUND "PlayerGlobal.SWC, Adobe web sayfalarında bulunamadı. Belki de güvenlik duvarınız erişimi engelliyor veya etkinleştirilmiş bazı proxy'iniz var. Daha sonra gelişmiş ayarlarda SWC dosyasının yolunu ayarlayabilirsiniz." +!insertmacro LANG_STRING STRING_SAVED_TO "kaydedildi" +!insertmacro LANG_STRING STRING_EXISTS_SKIP_DOWNLOAD "zaten var, indirmeyi atla" +!insertmacro LANG_STRING STRING_STARTING_DOWNLOAD "İndirme işlemini başlatma" +!insertmacro LANG_STRING STRING_DESKTOP_SHORTCUT "Masaüstü kısayolu" +!insertmacro LANG_STRING STRING_ADD_CONTEXT_MENU "Bağlam menüsüne ekle" +!insertmacro LANG_STRING STRING_SECTION_APP "Uygulama GUI ve Kütüphaneler" +!insertmacro LANG_STRING STRING_SECTION_SWC "Adobe sitesinden FlashPlayer kitaplığını indirin - ActionScript doğrudan düzenlenmesi ve diğer özellikleri için kullanışlıdır" +!insertmacro LANG_STRING STRING_SECTION_CONTEXT_MENU "Windows Gezgini'nde SWF ve GFX dosyalarının içerik menüsüne FFDec ekler." +!insertmacro LANG_STRING STRING_SECTION_SHORTCUT "Masaüstünde kısayol oluşturur" +!insertmacro LANG_STRING STRING_UNINST_USER "Kullanıcı yapılandırmasını kaldır" +!insertmacro LANG_STRING STRING_HELP_US "Bize yardım et" +!insertmacro LANG_STRING STRING_HELP_US_FREE "Bu bütün decompiler Serbest ve Açık Kaynaktır. Bize destek olmak istiyorsan, diğer insanlara dekomprizanımızı anlatabilirsin. Sayfalarımızın bağlantısını kullanın, bir kelime paylaşın." +!insertmacro LANG_STRING STRING_HELP_US_DONATE "Yazarın gelişmekte olan vakit ve kaynaklar için takdirlerinizi belirtmek isterseniz parasal bağışları kabul ve takdir ediyoruz." +!insertmacro LANG_STRING STRING_HELP_US_MORE "Daha fazla bilgi için buraya tıklayın:" +!insertmacro LANG_STRING STRING_HELP_US_DOYOU "Bize yardımcı olabileceğini biliyor musun?" +!insertmacro LANG_STRING STRING_HELP_US_BUTTON "Bize yardım et!" +!insertmacro LANG_STRING STRING_SWC "PlayerGlobal.swc indirin" +!insertmacro LANG_STRING STRING_SWC_CHECK "En yeni PlayerGlobal.swc dosyası için Adobe sitesini kontrol etme" + +;Flash ActiveX: +!insertmacro LANG_STRING STRING_FLASH_AX_REQUIRED_TITLE "Flash Player ActiveX denetimi gerekiyor" +!insertmacro LANG_STRING STRING_FLASH_AX_REQUIRED "Bu uygulama Flash ActiveX kontrolü gerektiriyor" +!insertmacro LANG_STRING STRING_FLASH_AX_WILLINSTALL "Bu uygulama, Flash ActiveX denetiminin kurulmasını gerektirir. Bu, kurulumun bir parçası olarak indirilecek ve yüklenecektir." +!insertmacro LANG_STRING STRING_FLASH_AX_ALREADYINSTALLED "Flash ActiveX yüklü" +!insertmacro LANG_STRING STRING_FLASH_AX_MISSING "Sonuç: Flash ActiveX eksik." +!insertmacro LANG_STRING STRING_FLASH_AX_WILLDOWNLOAD "Flash'ı indirme hakkında " +!insertmacro LANG_STRING STRING_FLASH_AX_DOWNRESULT "İndirme sonucu = " +!insertmacro LANG_STRING STRING_FLASH_AX_CANNOTDOWNLOAD "Flash ActiveX'i karşıdan yükleyemiyor. Daha sonra manuel olarak indirebilir veya kendi flash görüntüleyicimizi kullanabilirsiniz." +!insertmacro LANG_STRING STRING_FLASH_AX_LAUNCHSETUP "Flash kurulumunu başlatma" +!insertmacro LANG_STRING STRING_FLASH_AX_INTERRUPTED "Flash kurulumu anormal şekilde kesildi - dönüş kodu" +!insertmacro LANG_STRING STRING_FLASH_AX_SETUPOUTCOME "Flash Kurulumun sonuçlarını kontrol etme" +!insertmacro LANG_STRING STRING_FLASH_AX_UNABLEFINDAFTER "Flash kurulumu başarılı olmasına rağmen Flash ActiveX'i bulunamadı." +!insertmacro LANG_STRING STRING_FLASH_AX_UNABLEINSTALL "Flash ActiveX yüklenemiyor. Daha sonra manuel olarak indirebilir veya kendi flash görüntüleyicimizi kullanabilirsiniz." +!insertmacro LANG_STRING STRING_FLASH_AX_SETUPFINISHED "Flash Kurulumu tamamlandı" +!insertmacro LANG_STRING STRING_FLASH_AX_DETECTING "Flash ActiveX'i Algılama" + +;JRE: +!insertmacro LANG_STRING STRING_JRE_REQUIRED_TITLE "JRE Kurulumu Gerekli" +!insertmacro LANG_STRING STRING_JRE_REQUIRED "Bu uygulama, Java $ {JRE_VERSION} veya üstünü gerektirir" +!insertmacro LANG_STRING STRING_JRE_REQUIRED_INFO "Bu uygulama, Java Runtime Environment'ın kurulumunu gerektirir. Bu, kurulumun bir parçası olarak indirilecek ve yüklenecektir." +!insertmacro LANG_STRING STRING_JRE_UPDATEREQUIRED_TITLE "JRE Güncellemesi Gerekli" +!insertmacro LANG_STRING STRING_JRE_UPDATEREQUIRED "Bu uygulama, Java $ {JRE_VERSION} veya üstünü gerektirir" +!insertmacro LANG_STRING STRING_JRE_UPDATEREQUIRED_INFO "Bu uygulama, Java Çalışma Zamanı Ortamı'nın daha yeni bir sürümünü gerektirir. Bu, kurulumun bir parçası olarak indirilecek ve yüklenecektir." +!insertmacro LANG_STRING STRING_JRE_DETECTVERSION "JRE Sürümünü Algılama" +!insertmacro LANG_STRING STRING_JRE_DETECTCOMPLETE "JRE Sürüm algılama tamamlandı - sonuç = " +!insertmacro LANG_STRING STRING_JRE_DETECTCOMPLETE_OLD "Eski JRE bulundu" +!insertmacro LANG_STRING STRING_JRE_DETECTCOMPLETE_NO "JRE Bulunamadı" +!insertmacro LANG_STRING STRING_JRE_DETECTCOMPARE_1 "Karşılaştırma sürümü " +!insertmacro LANG_STRING STRING_JRE_DETECTCOMPARE_2 " için " +!insertmacro LANG_STRING STRING_JRE_DETECTCOMPARE_3 " içinde sonuç " +!insertmacro LANG_STRING STRING_JRE_WILLDOWNLOAD "JRE hakkında bilgi almak için " +!insertmacro LANG_STRING STRING_JRE_DOWNRESULT "İndirme sonucu = " +!insertmacro LANG_STRING STRING_JRE_CANNOTDOWNLOAD "Java indirilemiyor. Daha sonra manuel olarak indirebilirsiniz." +!insertmacro LANG_STRING STRING_JRE_LAUNCHSETUP "JRE kurulumunu başlatma" +!insertmacro LANG_STRING STRING_JRE_SETUPFINISHED "JRE Kurulumu tamamlandı" +!insertmacro LANG_STRING STRING_JRE_INTERRUPTED "JRE kurulumu anormal şekilde kesildi - dönüş kodu " +!insertmacro LANG_STRING STRING_JRE_SETUPOUTCOME "JRE Kurulumunun sonucunu kontrol etme" +!insertmacro LANG_STRING STRING_JRE_UNABLEFINDAFTER "JRE kurulumu başarılı olmasına rağmen $ {JRE_VERSION} değerinin üstündeki JRE'yi bulamıyor" +!insertmacro LANG_STRING STRING_JRE_UNABLEINSTALL "Java yüklenemiyor. Daha sonra manuel olarak kurabilirsiniz." + +;!insertmacro LANG_STRING STRING_ "" diff --git a/src/com/jpexs/decompiler/flash/gui/SelectLanguageDialog.java b/src/com/jpexs/decompiler/flash/gui/SelectLanguageDialog.java index 036dadb62..09ae3bfee 100644 --- a/src/com/jpexs/decompiler/flash/gui/SelectLanguageDialog.java +++ b/src/com/jpexs/decompiler/flash/gui/SelectLanguageDialog.java @@ -41,7 +41,7 @@ public class SelectLanguageDialog extends AppDialog { public String languageCode = null; - protected static final String[] languages = new String[]{"en", "ca", "cs", "zh", "de", "es", "fr", "hu", "it", "nl", "pl", "pt", "pt-BR", "ru", "sv", "uk"}; + protected static final String[] languages = new String[]{"en", "ca", "cs", "zh", "de", "es", "fr", "hu", "it", "nl", "pl", "pt", "pt-BR", "ru", "sv", "tr", "uk"}; public SelectLanguageDialog() { setSize(350, 130); diff --git a/src/com/jpexs/decompiler/flash/gui/locales/AboutDialog_tr.properties b/src/com/jpexs/decompiler/flash/gui/locales/AboutDialog_tr.properties new file mode 100644 index 000000000..abc6af3b1 --- /dev/null +++ b/src/com/jpexs/decompiler/flash/gui/locales/AboutDialog_tr.properties @@ -0,0 +1,27 @@ +# Copyright (C) 2010-2016 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 . + +version = versiyon +by = taraf\u0131ndan +button.ok = OK +dialog.title = Hakk\u0131nda +contributors = Katk\u0131da Bulunanlar: +#In the translation, replace "english" with target language name +translation.author.label = T\u00fcrk\u00e7e \u00e7evirmen yazar\u0131: +#In the translation, insert your name here +translation.author = Osman \u00d6Z +developers = Geli\u015ftiriciler: +developers.others = + GitHub ve Google kodundan ba\u015fkalar\u0131 +translators = \u00c7evirmenler: \ No newline at end of file diff --git a/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog_tr.properties b/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog_tr.properties new file mode 100644 index 000000000..7bad5a220 --- /dev/null +++ b/src/com/jpexs/decompiler/flash/gui/locales/AdvancedSettingsDialog_tr.properties @@ -0,0 +1,449 @@ +# Copyright (C) 2010-2016 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 . + +advancedSettings.dialog.title = Geli\u015fmi\u015f Ayarlar +advancedSettings.restartConfirmation = Baz\u0131 de\u011fi\u015fikliklerin y\u00fcr\u00fcrl\u00fc\u011fe girmesi i\u00e7in program\u0131 yeniden ba\u015flatman\u0131z gerekir. \u015eimdi yeniden ba\u015flatmak istiyor musunuz? +advancedSettings.columns.name = \u0130sim +advancedSettings.columns.value = De\u011fer +advancedSettings.columns.description = A\u00e7\u0131klama +default = varsay\u0131lan + +config.group.name.export = \u0130hracat +config.group.description.export = \u0130hracat konfig\u00fcrasyonu + +config.group.name.script = Senaryo +config.group.description.script = ActionScript ayr\u0131\u015ft\u0131rma ile ilgili + +config.group.name.update = G\u00fcncellemeler +config.group.description.update = G\u00fcncellemeleri kontrol etme + +config.group.name.format = Bi\u00e7imlendirme +config.group.description.format = ActionScript kod bi\u00e7imlendirmesi + +config.group.name.limit = S\u0131n\u0131rlar\u0131 +config.group.description.limit = Karart\u0131lm\u0131\u015f kod i\u00e7in ayr\u0131\u015ft\u0131rma s\u0131n\u0131rlar\u0131 vb. + +config.group.name.ui = Arabirim +config.group.description.ui = Kullan\u0131c\u0131 arabirimi yap\u0131land\u0131rmas\u0131 + +config.group.name.debug = Hata ay\u0131klama +config.group.description.debug = Hata ay\u0131klama ayarlar\u0131 + +config.group.name.display = G\u00f6r\u00fcnt\u00fcle +config.group.description.display = Flash nesnelerin g\u00f6sterimi vb. + +config.group.name.decompilation = Ayr\u0131\u015ft\u0131rma +config.group.description.decompilation = K\u00fcresel ayr\u0131\u015ft\u0131rma fonksiyonlar\u0131 + +config.group.name.other = Ba\u015fka +config.group.description.other = Di\u011fer S\u0131n\u0131fland\u0131r\u0131lmam\u0131\u015f yap\u0131land\u0131rmalar + +config.name.openMultipleFiles = Birden \u00e7ok dosyay\u0131 a\u00e7 +config.description.openMultipleFiles = Bir pencerede birden fazla dosyay\u0131 ayn\u0131 anda a\u00e7man\u0131za izin verir + +config.name.decompile = ActionScript kaynak g\u00f6ster +config.description.decompile = AS ayr\u0131\u015ft\u0131rmas\u0131n\u0131 devre d\u0131\u015f\u0131 b\u0131rakabilirsiniz, bu durumda yaln\u0131zca P kodu g\u00f6sterilir + +config.name.dumpView = D\u00f6k\u00fcm G\u00f6r\u00fcn\u00fcm\u00fc +config.description.dumpView = Ham veri d\u00f6k\u00fcm\u00fcn\u00fc g\u00f6r\u00fcnt\u00fcleme + +config.name.useHexColorFormat = Onalt\u0131l\u0131k renk format\u0131 +config.description.useHexColorFormat = Renkleri onalt\u0131l\u0131k bi\u00e7imde g\u00f6ster + +config.name.parallelSpeedUp = Paralel SpeedUp +config.description.parallelSpeedUp = Paralellik, ayr\u0131\u015ft\u0131rmay\u0131 h\u0131zland\u0131rabilir + +config.name.parallelSpeedUpThreadCount = Konu say\u0131s\u0131 +config.description.parallelSpeedUpThreadCount = Paralel h\u0131zland\u0131rma i\u00e7in i\u015f par\u00e7ac\u0131\u011f\u0131 say\u0131s\u0131 + +config.name.autoDeobfuscate = Otomatik ayr\u0131\u015ft\u0131rma +config.description.autoDeobfuscate = ActionScript ayr\u0131\u015ft\u0131rmas\u0131 olmadan \u00f6nce ayr\u0131\u015ft\u0131rma \u00f6\u011fesini her dosyada \u00e7al\u0131\u015ft\u0131rma + +config.name.cacheOnDisk = Diskte \u00f6nbelle\u011fe alma kullan +config.description.cacheOnDisk = Bellek yerine sabit s\u00fcr\u00fcc\u00fcdeki b\u00f6l\u00fcmleri zaten \u00f6nbelle\u011fe alma + +config.name.internalFlashViewer = Kendi fla\u015f g\u00f6r\u00fcnt\u00fcleyicisini kullan +config.description.internalFlashViewer = Fla\u015f par\u00e7alar\u0131 g\u00f6sterimi i\u00e7in standart Flash Player yerine JPEXS Flash Viewer'\u0131 kullan\u0131n + +config.name.gotoMainClassOnStartup = Ba\u015flang\u0131\u00e7ta ana s\u0131n\u0131fa gidin (AS3) +config.description.gotoMainClassOnStartup = SWF a\u00e7\u0131ld\u0131\u011f\u0131nda AS3 dosyas\u0131n\u0131n belge s\u0131n\u0131f\u0131na gidiyor + +config.name.autoRenameIdentifiers = Otomatik yeniden adland\u0131rma tan\u0131mlay\u0131c\u0131lar\u0131 +config.description.autoRenameIdentifiers = SWF y\u00fck\u00fcnde ge\u00e7ersiz tan\u0131mlay\u0131c\u0131lar\u0131 otomatik olarak yeniden adland\u0131r\u0131n + +config.name.offeredAssociation = (Dahili) SWF dosyalar\u0131 ile ili\u015fkili g\u00f6r\u00fcnt\u00fc +config.description.offeredAssociation = Dosya ili\u015fkilendirmesi hakk\u0131nda diyalog zaten g\u00f6r\u00fcnt\u00fcleniyor + +config.name.decimalAddress = Ondal\u0131k adresleri kullan +config.description.decimalAddress = Onalt\u0131l\u0131k yerine ondal\u0131k adresleri kullan + +config.name.showAllAddresses = T\u00fcm adresleri g\u00f6ster +config.description.showAllAddresses = T\u00fcm ActionScript komut adreslerini g\u00f6r\u00fcnt\u00fcleme + +config.name.useFrameCache = \u00c7er\u00e7eve \u00f6nbellek kullan +config.description.useFrameCache = \u00c7er\u00e7eveleri yeniden olu\u015fturmadan \u00f6nce \u00f6nbelle\u011fe al + +config.name.useRibbonInterface = \u015eerit aray\u00fcz\u00fc +config.description.useRibbonInterface = \u015eerit men\u00fcs\u00fc olmaks\u0131z\u0131n klasik aray\u00fcz\u00fc kullanmak i\u00e7in i\u015fareti kald\u0131r\u0131n + +config.name.openFolderAfterFlaExport = FLA d\u0131\u015fa aktarmadan sonra klas\u00f6r\u00fc a\u00e7 +config.description.openFolderAfterFlaExport = FLA dosyas\u0131n\u0131 d\u0131\u015fa aktard\u0131ktan sonra \u00e7\u0131k\u0131\u015f dizini g\u00f6r\u00fcnt\u00fcleme + +config.name.useDetailedLogging = FFDec ayr\u0131nt\u0131l\u0131 G\u00fcnl\u00fc\u011f\u00fc +config.description.useDetailedLogging = Ayr\u0131nt\u0131l\u0131 hata iletilerini ve FFDec'in hata ay\u0131klamas\u0131 i\u00e7in bilgi g\u00fcnl\u00fc\u011f\u00fcn\u00fc yaz\u0131n + +config.name._debugMode = Hata ay\u0131klama modunda FFDec +config.description._debugMode = FFDec hata ay\u0131klama modu. Hata ay\u0131klama men\u00fcs\u00fcn\u00fc a\u00e7ar. Bu, hata ay\u0131klay\u0131c\u0131 i\u015flevselli\u011fi ile ilgisi yoktur + +config.name.resolveConstants = Sabitleri AS1/2 p-kodunda \u00e7\u00f6zme +config.description.resolveConstants = P kod penceresinde ger\u00e7ek de\u011ferler yerine 'sabitxx' g\u00f6stermek i\u00e7in bunu kapat\u0131n + +config.name.sublimiter = Kod alt s\u0131n\u0131r\u0131 +config.description.sublimiter = Karart\u0131lm\u0131\u015f kod i\u00e7in kod alt s\u0131n\u0131r\u0131. + +config.name.exportTimeout = Toplam d\u0131\u015fa aktarma zaman a\u015f\u0131m\u0131 (saniye) +config.description.exportTimeout = Decompiler bu saatten sonra d\u0131\u015fa aktarmay\u0131 durduracak + +config.name.decompilationTimeoutFile = Tek dosya \u00e7\u00f6zme zaman a\u015f\u0131m\u0131 (saniye) +config.description.decompilationTimeoutFile = Decompiler, bu sefer bir dosyaya eri\u015ftikten sonra ActionScript decompilation'\u0131 durduracakt\u0131r + +config.name.paramNamesEnable = AS3'te parametre adlar\u0131n\u0131 etkinle\u015ftir +config.description.paramNamesEnable = Flash CS 5.5 gibi resmi programlar yanl\u0131\u015f parametre isimleri indeksleri ekler, \u00e7\u00fcnk\u00fc decompiling parametre adlar\u0131n\u0131 kullanmak sorunlara neden olabilir + +config.name.displayFileName = Ba\u015fl\u0131kta SWF ad\u0131n\u0131 g\u00f6ster +config.description.displayFileName = Pencere ba\u015fl\u0131\u011f\u0131nda SWF dosyas\u0131/url ad\u0131n\u0131 g\u00f6r\u00fcnt\u00fcleyin (Ekran g\u00f6r\u00fcnt\u00fcleri olu\u015fturabilirsiniz) + +config.name._debugCopy = FFDec hata ay\u0131klama derlemesi +config.description._debugCopy = Ayn\u0131 ikili kod \u00fcretti\u011finden emin olmak i\u00e7in a\u00e7\u0131ld\u0131ktan hemen sonra SWF dosyas\u0131n\u0131 tekrar derlemeye \u00e7al\u0131\u015f\u0131r. Yaln\u0131zca FFDec'in \u00e7\u00f6z\u00fclmesi i\u00e7in kullan\u0131n! + +config.name.dumpTags = Etiketleri konsola d\u00f6k\u00fcmle +config.description.dumpTags = SWF dosyas\u0131n\u0131 okurken etiketleri konsola d\u00f6k\u00fcm\u00fc d\u00f6kme + +config.name.decompilationTimeoutSingleMethod = AS3: Tek y\u00f6ntem decompilation zaman a\u015f\u0131m\u0131 (saniye) +config.description.decompilationTimeoutSingleMethod = Decompiler, bu sefer bir y\u00f6ntemle eri\u015ftikten sonra ActionScript decompilation'\u0131 durduracakt\u0131r + +config.name.lastRenameType = (\u00c7evrimi\u00e7i) Son yeniden adland\u0131rma t\u00fcr\u00fc +config.description.lastRenameType = Son kullan\u0131lan adlar\u0131 yeniden adland\u0131r tiplendir + +config.name.lastSaveDir = (\u00c7evrimi\u00e7i) Son kaydetme dizini +config.description.lastSaveDir = Son kullan\u0131lan kaydetme dizini + +config.name.lastOpenDir = (\u00c7evrimi\u00e7i) Son a\u00e7\u0131k dizin +config.description.lastOpenDir = En son kullan\u0131lan a\u00e7\u0131k dizin + +config.name.lastExportDir = (\u00c7evrimi\u00e7i) Son ihra\u00e7 rehberi +config.description.lastExportDir = Son kullan\u0131lan ihra\u00e7 rehberi + +config.name.locale = Dil +config.description.locale = Yerel ayar tan\u0131mlay\u0131c\u0131 + +config.name.registerNameFormat = De\u011fi\u015fken bi\u00e7imi kaydet +config.description.registerNameFormat = Yerel kay\u0131t de\u011fi\u015fken adlar\u0131n\u0131n bi\u00e7imi. Kay\u0131t numaras\u0131 i\u00e7in %d kullan\u0131n. + +config.name.maxRecentFileCount = Maksimum yeni say\u0131m +config.description.maxRecentFileCount = Maksimum yeni dosya say\u0131s\u0131 + +config.name.recentFiles = (\u00c7evrimi\u00e7i) En yeni resimler +config.description.recentFiles = Son a\u00e7\u0131lan dosyalar + +config.name.fontPairingMap = (\u00c7evrimi\u00e7i) \u0130\u00e7e aktarma i\u00e7in font \u00e7iftleri +config.description.fontPairingMap = Yeni karakterleri i\u00e7e aktarmak i\u00e7in font \u00e7iftleri + +config.name.lastUpdatesCheckDate = (\u00c7evrimi\u00e7i) Son g\u00fcncelleme tarihi kontrol edin +config.description.lastUpdatesCheckDate = Sunucudaki g\u00fcncellemeleri kontrol etme tarihi + +config.name.gui.window.width = (\u00c7evrimi\u00e7i) Son pencere geni\u015fli\u011fi +config.description.gui.window.width = Son kaydedilen pencere geni\u015fli\u011fi + +config.name.gui.window.height = (\u00c7evrimi\u00e7i) Son pencere y\u00fcksekli\u011fi +config.description.gui.window.height = Son kaydedilen pencere y\u00fcksekli\u011fi + +config.name.gui.window.maximized.horizontal = (\u00c7evrimi\u00e7i) Yatay olarak maksimize edilmi\u015f pencere +config.description.gui.window.maximized.horizontal = Son pencere durumu - yatay olarak maksimize edildi + +config.name.gui.window.maximized.vertical = (\u00c7evrimi\u00e7i) Dikey maksimize edilmi\u015f pencere +config.description.gui.window.maximized.vertical = Son pencere durumu - dikey olarak maksimize edildi + +config.name.gui.avm2.splitPane.dividerLocationPercent = (\u00c7evrimi\u00e7i) AS3 Ay\u0131r\u0131c\u0131 konumu +config.description.gui.avm2.splitPane.dividerLocationPercent = + +config.name.gui.actionSplitPane.dividerLocationPercent = (\u00c7evrimi\u00e7i) AS1/2 ay\u0131r\u0131c\u0131 konumu +config.description.gui.actionSplitPane.dividerLocationPercent = + +config.name.gui.previewSplitPane.dividerLocationPercent = (\u00c7evrimi\u00e7i) Ay\u0131r\u0131c\u0131 konumunu \u00f6nizle +config.description.gui.previewSplitPane.dividerLocationPercent = + +config.name.gui.splitPane1.dividerLocationPercent = (\u00c7evrimi\u00e7i) Ay\u0131r\u0131c\u0131 konumu 1 +config.description.gui.splitPane1.dividerLocationPercent = + +config.name.gui.splitPane2.dividerLocationPercent = (\u00c7evrimi\u00e7i) Ay\u0131r\u0131c\u0131 konumu 2 +config.description.gui.splitPane2.dividerLocationPercent = + +config.name.saveAsExeScaleMode = EXE \u00f6l\u00e7ek modu olarak kaydet +config.description.saveAsExeScaleMode = EXE d\u0131\u015fa aktarma i\u00e7in \u00f6l\u00e7ekleme modu + +config.name.syntaxHighlightLimit = S\u00f6zdizimini en fazla karakter ile vurggula +config.description.syntaxHighlightLimit = S\u00f6z dizimini \u00e7al\u0131\u015ft\u0131rmak i\u00e7in maksimum karakter say\u0131s\u0131 a\u00e7\u0131k + +config.name.guiFontPreviewSampleText = (\u00c7evrimi\u00e7i) Last font preview sample text +config.description.guiFontPreviewSampleText = Son yaz\u0131 tipi \u00f6nizleme \u00f6rnek metin + +config.name.gui.fontPreviewWindow.width = (\u00c7evrimi\u00e7i) Son yaz\u0131 tipi \u00f6nizleme penceresinin geni\u015fli\u011fi +config.description.gui.fontPreviewWindow.width = + +config.name.gui.fontPreviewWindow.height = (\u00c7evrimi\u00e7i) Son yaz\u0131 tipi \u00f6nizleme penceresinin y\u00fcksekli\u011fi +config.description.gui.fontPreviewWindow.height = + +config.name.gui.fontPreviewWindow.posX = (\u00c7evrimi\u00e7i) Son yaz\u0131 tipi \u00f6nizleme penceresi X +config.description.gui.fontPreviewWindow.posX = + +config.name.gui.fontPreviewWindow.posY = (\u00c7evrimi\u00e7i) Son yaz\u0131 tipi \u00f6nizleme penceresi Y +config.description.gui.fontPreviewWindow.posY = + +config.name.formatting.indent.size = Girinti ba\u015f\u0131na karakterler +config.description.formatting.indent.size = Bir girinti i\u00e7in say\u0131 veya bo\u015fluklar (veya sekmeler) + +config.name.formatting.indent.useTabs = Girinti i\u00e7in sekmeler +config.description.formatting.indent.useTabs = Girinti bo\u015fluklar\u0131 yerine sekmeler kullan\u0131n + +config.name.beginBlockOnNewLine = Yeni sat\u0131ra k\u0131vr\u0131ml\u0131 parantez +config.description.beginBlockOnNewLine = Yeni sat\u0131ra k\u0131vr\u0131ml\u0131 parantezle ba\u015flay\u0131n + +config.name.check.updates.delay = G\u00fcncellemelerde gecikmeyi kontrol et +config.description.check.updates.delay = Uygulama ba\u015flatmada g\u00fcncellemeler i\u00e7in otomatik kontroller aras\u0131ndaki minimum s\u00fcre + +config.name.check.updates.stable = Kararl\u0131 s\u00fcr\u00fcmleri kontrol et +config.description.check.updates.stable = Kararl\u0131 s\u00fcr\u00fcm g\u00fcncellemelerini kontrol etme + +config.name.check.updates.nightly = Gece versiyonlar\u0131n\u0131 kontrol et +config.description.check.updates.nightly = Gece s\u00fcr\u00fcm g\u00fcncellemelerini kontrol etme + +config.name.check.updates.enabled = G\u00fcncellemelerin kontrol\u00fc etkinle\u015ftirildi +config.description.check.updates.enabled = Uygulama ba\u015flat\u0131ld\u0131\u011f\u0131nda g\u00fcncellemeleri otomatik olarak kontrol etme + +config.name.export.formats = (\u00c7evrimi\u00e7i) d\u0131\u015fa aktarma bi\u00e7imleri +config.description.export.formats = En son kullan\u0131lan d\u0131\u015fa aktarma bi\u00e7imleri + +config.name.textExportSingleFile = Metinleri tek bir dosyaya aktar +config.description.textExportSingleFile = Metinleri birden \u00e7ok yerine tek bir dosyaya d\u0131\u015fa aktarma + +config.name.textExportSingleFileSeparator = Tek bir dosya metin ihracat\u0131nda metin ay\u0131r\u0131c\u0131 +config.description.textExportSingleFileSeparator = Tek dosya metin d\u0131\u015fa aktarma metinleri aras\u0131na eklemek i\u00e7in metin + +config.name.textExportSingleFileRecordSeparator = Tek bir dosya metin d\u0131\u015fa aktarma kay\u0131tlar\u0131n\u0131n ay\u0131r\u0131c\u0131s\u0131 +config.description.textExportSingleFileRecordSeparator = Tek dosya metin d\u0131\u015fa aktarma metin kay\u0131tlar\u0131 aras\u0131na eklenecek metin + +config.name.warning.experimental.as12edit = AS1/2 do\u011frudan d\u00fczenleme uyar\u0131s\u0131 +config.description.warning.experimental.as12edit = AS1/2 deneysel do\u011frudan d\u00fczenlemede uyar\u0131 g\u00f6ster + +config.name.warning.experimental.as3edit = AS3 do\u011frudan d\u00fczenleme uyar\u0131s\u0131 +config.description.warning.experimental.as3edit = AS3 deneysel do\u011frudan d\u00fczenlemesinde uyar\u0131 g\u00f6ster + +config.name.packJavaScripts = JavaScript'leri paketleyin +config.description.packJavaScripts = Canvas Export'da olu\u015fturulan komut dosyalar\u0131nda JavaScript paketleyici \u00e7al\u0131\u015ft\u0131r\u0131n. + +config.name.textExportExportFontFace = SVG d\u0131\u015fa aktar\u0131m\u0131nda font-y\u00fcz\u00fcn\u00fc kullan\u0131n +config.description.textExportExportFontFace = \u015eekil yerine yaz\u0131 tipi y\u00fcz\u00fcn\u00fc kullanarak yaz\u0131 tipi dosyalar\u0131n\u0131 SVG'ye kat\u0131\u015ft\u0131r\u0131n + +config.name.lzmaFastBytes = LZMA h\u0131zl\u0131 bayt (ge\u00e7erli de\u011ferler: 5-255) +config.description.lzmaFastBytes = LZMA enkoderinin h\u0131zl\u0131 bayt parametresi + +config.name.pluginPath = Eklenti Yolu +config.description.pluginPath = - + +config.name.showMethodBodyId = Metod g\u00f6vde kimli\u011fini g\u00f6ster +config.description.showMethodBodyId = Komut sat\u0131r\u0131n\u0131 i\u00e7e aktarmak i\u00e7in y\u00f6ntem nesnesinin kimli\u011fini g\u00f6sterir + +config.name.export.zoom = (\u00c7evrimi\u00e7i) Yak\u0131nla\u015ft\u0131rmay\u0131 d\u0131\u015fa aktar +config.description.export.zoom = Son kullan\u0131lan d\u0131\u015fa aktarma yak\u0131nla\u015ft\u0131rmas\u0131 + +config.name.debuggerPort = Hata ay\u0131klay\u0131c\u0131 ba\u011flant\u0131 noktas\u0131 +config.description.debuggerPort = Soket hata ay\u0131klama i\u00e7in kullan\u0131lan ba\u011flant\u0131 noktas\u0131 + +config.name.displayDebuggerInfo = (\u00c7evrimi\u00e7i) Hata ay\u0131klay\u0131c\u0131 bilgisini g\u00f6ster +config.description.displayDebuggerInfo = Anahtarlamadan \u00f6nce hata ay\u0131klay\u0131c\u0131 hakk\u0131ndaki bilgileri g\u00f6r\u00fcnt\u00fcleyin + +config.name.randomDebuggerPackage = Hata ay\u0131klay\u0131c\u0131 i\u00e7in rasgele paket ad\u0131 kullan\u0131n +config.description.randomDebuggerPackage = Bu, Hata Ay\u0131klay\u0131c\u0131 paketini, rasgele dize olarak yeniden adland\u0131r\u0131r; bu da hata ay\u0131klay\u0131c\u0131 varl\u0131\u011f\u0131n\u0131 ActionScript taraf\u0131ndan alg\u0131lanmas\u0131n\u0131 zorla\u015ft\u0131r\u0131r + +config.name.lastDebuggerReplaceFunction = (\u00c7evrimi\u00e7i) Son se\u00e7ilen iz de\u011fi\u015ftirme +config.description.lastDebuggerReplaceFunction = Son olarak iz i\u015flevinin yerini al\u0131p hata ay\u0131klay\u0131c\u0131yla de\u011fi\u015ftirilen i\u015flev ad\u0131 + +config.name.getLocalNamesFromDebugInfo = AS3: Hata ay\u0131klama bilgilerinden yerel kay\u0131t adlar\u0131 al\u0131n +config.description.getLocalNamesFromDebugInfo = Hata ay\u0131klama bilgisi mevcutsa, yerel kay\u0131tlar\u0131 _loc_x_'dan ger\u00e7ek adlara yeniden adland\u0131r\u0131r. Baz\u0131 karartmalar burada hatal\u0131 kay\u0131t isimleri kulland\u0131klar\u0131 i\u00e7in bu kapat\u0131labilir. + +config.name.tagTreeShowEmptyFolders = Bo\u015f klas\u00f6rleri g\u00f6ster +config.description.tagTreeShowEmptyFolders = Etiket a\u011fac\u0131nda bo\u015f klas\u00f6rleri g\u00f6ster. + +config.name.autoLoadEmbeddedSwfs = Kat\u0131\u015ft\u0131r\u0131lm\u0131\u015f SWF'leri otomatik y\u00fckle +config.description.autoLoadEmbeddedSwfs = Kat\u0131\u015ft\u0131r\u0131lm\u0131\u015f SWF'leri DefineBinaryData etiketlerinden otomatik olarak y\u00fckleyin. + +config.name.overrideTextExportFileName = Metin d\u0131\u015fa aktarma dosya ad\u0131n\u0131 ge\u00e7ersiz k\u0131l +config.description.overrideTextExportFileName = D\u0131\u015fa aktar\u0131lan metnin dosya ad\u0131n\u0131 \u00f6zelle\u015ftirebilirsiniz. Ge\u00e7erli SWF'nin dosya ad\u0131n\u0131 kullanmak i\u00e7in {filename} yer tutucu kullan\u0131n. + +config.name.showOldTextDuringTextEditing = Metin d\u00fczenleme s\u0131ras\u0131nda eski metni g\u00f6ster +config.description.showOldTextDuringTextEditing = \u00d6nizleme alan\u0131nda metin etiketinin orijinal metnini gri renkle g\u00f6sterir. + +config.group.name.import = \u0130thalat +config.group.description.import = \u0130thalat\u0131n konfig\u00fcrasyonu + +config.name.textImportResizeTextBoundsMode = Metin s\u0131n\u0131rlamal\u0131 yeniden boyutland\u0131rma modu +config.description.textImportResizeTextBoundsMode = Metin, metin d\u00fczenlemesinden sonra yeniden boyutland\u0131rma kipini s\u0131n\u0131rlar. + +config.name.showCloseConfirmation = SWF kapat onay\u0131n\u0131 tekrar g\u00f6ster +config.description.showCloseConfirmation = De\u011fi\u015ftirilen dosyalar i\u00e7in SWF kapat onay\u0131n\u0131 tekrar g\u00f6ster. + +config.name.showCodeSavedMessage = Kay\u0131tl\u0131 mesaj\u0131 tekrar g\u00f6ster +config.description.showCodeSavedMessage = Kay\u0131tl\u0131 mesaj\u0131 tekrar g\u00f6ster + +config.name.showTraitSavedMessage = Yeniden \u00f6zellik kaydedilen mesaj\u0131 g\u00f6ster +config.description.showTraitSavedMessage = Yeniden \u00f6zellik kaydedilen mesaj\u0131 g\u00f6ster + +config.name.updateProxyAddress = G\u00fcncellemeleri kontrol etmek i\u00e7in Http Proxy adresi +config.description.updateProxyAddress = G\u00fcncellemeleri kontrol etmek i\u00e7in Http Proxy adresi. Bi\u00e7im: example.com:8080 + +config.name.editorMode = Edit\u00f6r Modu +config.description.editorMode = Bir Metin veya Komut Dosyas\u0131 d\u00fc\u011f\u00fcm\u00fc se\u00e7ti\u011finizde metin alanlar\u0131n\u0131 otomatik olarak d\u00fczenlenebilir yap\u0131n + +config.name.autoSaveTagModifications = Etiket de\u011fi\u015fikliklerini otomatik kaydet +config.description.autoSaveTagModifications = A\u011fa\u00e7ta yeni bir etiket se\u00e7ti\u011finizde de\u011fi\u015fiklikleri kaydedin + +config.name.saveSessionOnExit = \u00c7\u0131k\u0131\u015fta oturumu kaydet +config.description.saveSessionOnExit = Ge\u00e7erli oturumu kaydedin ve FFDec yeniden ba\u015flat\u0131ld\u0131ktan sonra tekrar a\u00e7\u0131n (yaln\u0131zca ger\u00e7ek dosyalarla \u00e7al\u0131\u015f\u0131r) + +config.name._showDebugMenu = FFDec hata ay\u0131klama men\u00fcs\u00fcn\u00fc g\u00f6ster +config.description._showDebugMenu = Kar\u0131\u015ft\u0131r\u0131c\u0131y\u0131 hata ay\u0131klama i\u00e7in kurdele hata ay\u0131klama men\u00fcs\u00fcn\u00fc g\u00f6sterir. + +config.name.allowOnlyOneInstance = Yaln\u0131zca bir FFDec \u00f6rne\u011fine izin ver (Yaln\u0131zca Windows OS) +config.description.allowOnlyOneInstance = FFDec daha sonra yaln\u0131zca bir kez \u00e7al\u0131\u015ft\u0131r\u0131labilir, a\u00e7\u0131lan t\u00fcm dosyalar bir pencereye eklenir. Yaln\u0131zca Windows i\u015fletim sistemi ile \u00e7al\u0131\u015f\u0131r. + +config.name.scriptExportSingleFile = Komut dosyalar\u0131n\u0131 tek bir dosyaya aktar +config.description.scriptExportSingleFile = Komut dosyalar\u0131n\u0131 birden \u00e7ok yerine tek bir dosyaya d\u0131\u015fa aktarma + +config.name.setFFDecVersionInExportedFont = D\u0131\u015fa aktar\u0131lan fontta FFDec s\u00fcr\u00fcm numaras\u0131n\u0131 ayarla +config.description.setFFDecVersionInExportedFont = Bu ayar devre d\u0131\u015f\u0131 b\u0131rak\u0131ld\u0131\u011f\u0131nda, FFDec ge\u00e7erli FFDec s\u00fcr\u00fcm numaras\u0131n\u0131 d\u0131\u015fa aktar\u0131lan fonta eklemeyecektir. + +config.name.gui.skin = Kullan\u0131c\u0131 Arabirimi Cildi +config.description.gui.skin = Cildi g\u00f6rmek ve hissetmek + +config.name.lastSessionFiles = Son oturum dosyalar\u0131 +config.description.lastSessionFiles = Son oturumdaki dosyalar\u0131 a\u00e7ar + +config.name.lastSessionSelection = Son oturum se\u00e7imi +config.description.lastSessionSelection = Son oturumdaki se\u00e7imi i\u00e7erir + +config.name.loopMedia = D\u00f6ng\u00fcsel sesler ve spritler +config.description.loopMedia = Sesleri ve sprite'leri otomatik olarak yeniden ba\u015flat\u0131r + +config.name.gui.timeLineSplitPane.dividerLocationPercent = (\u00c7evrimi\u00e7i) Zaman \u00c7izelgesi B\u00f6l\u00fcc\u00fc konumu +config.description.gui.timeLineSplitPane.dividerLocationPercent = + +config.name.cacheImages = \u00d6nbellek g\u00f6r\u00fcnt\u00fcleri +config.description.cacheImages = \u00c7\u00f6z\u00fclen resim nesnelerini \u00f6nbellekle sakla + +config.name.swfSpecificConfigs = SWF'ye \u00f6zel yap\u0131land\u0131rmalar +config.description.swfSpecificConfigs = SWF'ye \u00f6zg\u00fc yap\u0131land\u0131rmalar\u0131 i\u00e7erir + +config.name.exeExportMode = EXE d\u0131\u015fa aktarma modu +config.description.exeExportMode = EXE d\u0131\u015fa aktarma modu + +config.name.ignoreCLikePackages = FlashCC/Alchemy veya benzeri paketleri yoksay +config.description.ignoreCLikePackages = FlashCC/Alchemy paketleri genellikle do\u011fru \u015fekilde ayr\u0131\u015ft\u0131r\u0131lamaz. Di\u011fer paketlerin derlemesini h\u0131zland\u0131rmak i\u00e7in bunlar\u0131 devre d\u0131\u015f\u0131 b\u0131rakabilirsiniz. + +config.name.overwriteExistingFiles = Varolan dosyalar\u0131n \u00fczerine yaz +config.description.overwriteExistingFiles = D\u0131\u015fa aktarma s\u0131ras\u0131nda mevcut dosyalar\u0131n \u00fczerine yaz\u0131n. \u015eu an i\u00e7in yaln\u0131zca AS2/3 komut dosyalar\u0131 i\u00e7in + +config.name.smartNumberFormatting = Ak\u0131ll\u0131 say\u0131 bi\u00e7imlendirmesini kullan +config.description.smartNumberFormatting = \u00d6zel say\u0131lar\u0131 bi\u00e7imlendirin (\u00f6rne\u011fin renkler ve saatler) + +config.name.enableScriptInitializerDisplay = G\u00f6r\u00fcnt\u00fc komut dosyas\u0131 ba\u015flat\u0131c\u0131lar\u0131 +config.description.enableScriptInitializerDisplay = Komut ba\u015flat\u0131c\u0131lar\u0131 g\u00f6r\u00fcnt\u00fcleme ve d\u00fczenleme i\u015flemini etkinle\u015ftir. Bu ayar, vurgulamak i\u00e7in her s\u0131n\u0131f dosyas\u0131na bir yeni sat\u0131r ekleyebilir. + +config.name.autoOpenLoadedSWFs = \u00c7al\u0131\u015ft\u0131r\u0131l\u0131rken y\u00fcklenen SWF'leri a\u00e7 (Harici g\u00f6r\u00fcnt\u00fcleyici = yaln\u0131zca WIN) +config.description.autoOpenLoadedSWFs = FFDec harici oynat\u0131c\u0131da oynat\u0131ld\u0131\u011f\u0131nda SWF'yi \u00e7al\u0131\u015ft\u0131rarak AS3 s\u0131n\u0131f\u0131 Loader taraf\u0131ndan y\u00fcklenen t\u00fcm SWF'leri otomatik olarak a\u00e7ar. Bu \u00f6zellik yaln\u0131zca Windows'dur. + +config.name.lastSessionFileTitles = Son oturum dosyas\u0131 ba\u015fl\u0131klar\u0131 +config.description.lastSessionFileTitles = Son oturumdaki a\u00e7\u0131lm\u0131\u015f dosya ba\u015fl\u0131klar\u0131n\u0131 i\u00e7erir (\u00f6rne\u011fin URL'den y\u00fcklendi\u011finde vs.) + +config.group.name.paths = Yollar +config.group.description.paths = Gerekli dosyalar\u0131n yeri +config.group.tip.paths = Projekt\u00f6r\u00fc ve Playerglobal'\u0131 indirin adobe webpage. Flex SDK can be downloaded on adobe devnet. +config.group.link.paths = https://www.adobe.com/support/flashplayer/debug_downloads.html http://www.adobe.com/devnet/flex/flex-sdk-download.html + +config.name.playerLocation = 1) Flash Player projekt\u00f6r yolu +config.description.playerLocation = Ba\u011f\u0131ms\u0131z flash oynat\u0131c\u0131n\u0131n y\u00fcr\u00fct\u00fclebilir konumu. \u00c7al\u0131\u015ft\u0131rma eylemi i\u00e7in kullan\u0131l\u0131r. + +config.name.playerDebugLocation = 2) Flash Player projekt\u00f6r i\u00e7erik hata ay\u0131klay\u0131c\u0131 yolu +config.description.playerDebugLocation = Tek ba\u015f\u0131na hata ay\u0131klama flash oynat\u0131c\u0131n\u0131n y\u00fcr\u00fct\u00fclebilir konumu. Hata ay\u0131klama eylemi i\u00e7in kullan\u0131l\u0131r. + +config.name.playerLibLocation = 3) PlayerGlobal (.swc) yolu +config.description.playerLibLocation = Playerglobal.swc flash player kitapl\u0131\u011f\u0131n\u0131n yeri. \u00c7o\u011funlukla AS3 derlemesi i\u00e7in kullan\u0131l\u0131r. + +config.name.debugHalt = Hata ay\u0131klama ba\u015flatmada durma +config.description.debugHalt = Hata ay\u0131klama i\u015fleminin ba\u015flang\u0131c\u0131nda SWF'yi duraklat\u0131n. + +config.name.gui.avm2.splitPane.vars.dividerLocationPercent = (Dahili) Hata ay\u0131klama men\u00fcs\u00fc b\u00f6l\u00fcc\u00fc konumu +config.description.gui.avm2.splitPane.vars.dividerLocationPercent = + +tip = Tip:\u0020 + +config.name.gui.action.splitPane.vars.dividerLocationPercent = (Dahili) AS1/2 Hata ay\u0131klama men\u00fcs\u00fc b\u00f6l\u00fcc\u00fc konumu +config.description.gui.action.splitPane.vars.dividerLocationPercent = + +config.name.setMovieDelay = D\u0131\u015f oyuncudaki SWF'yi de\u011fi\u015ftirmeden \u00f6nce gecikme ms +config.description.setMovieDelay = Bu de\u011feri 1000 ms'nin alt\u0131nda de\u011fi\u015ftirmeniz \u00f6nerilmez + +config.name.warning.svgImport = SVG i\u00e7e aktarma konusunda uyar\u0131 +config.description.warning.svgImport = + +config.name.shapeImport.useNonSmoothedFill = Bir \u015fekil bir resimle de\u011fi\u015ftirildi\u011finde p\u00fcr\u00fczs\u00fcz dolguyu kullan\u0131n +config.description.shapeImport.useNonSmoothedFill = + +config.name.internalFlashViewer.execute.as12 = Kendi fla\u015f g\u00f6r\u00fcnt\u00fcleyicide AS1/2 (Deneysel) +config.description.internalFlashViewer.execute.as12 = FFDec fla\u015f g\u00f6r\u00fcnt\u00fcleyicisini kullanarak SWF oynatma s\u0131ras\u0131nda ActionScript 1/2 y\u00fcr\u00fctmeyi deneyin + +config.name.warning.hexViewNotUpToDate = Onalt\u0131l\u0131k g\u00f6r\u00fcn\u00fcm\u00fc g\u00f6ster g\u00fcncel uyar\u0131 de\u011fil +config.description.warning.hexViewNotUpToDate = + +config.name.displayDupInstructions = G\u00f6ster \u00a7\u00a7d\u00fc\u015f\u00fck talimatlar +config.description.displayDupInstructions = Kodda g\u00f6sterilecek \u00a7\u00a7d\u00fc\u015f\u00fck talimatlar. Bunlar olmadan kod kolayca derlenebilir ancak yan etkileri olan baz\u0131 dupped kodlar iki kez y\u00fcr\u00fct\u00fclebilir. + +config.name.useRegExprLiteral = RegExp dosyas\u0131n\u0131 /pattern/mod de\u011fi\u015fkeni olarak derleyelim. +config.description.useRegExprLiteral = Normal ifadeleri ayr\u0131\u015ft\u0131r\u0131rken /pattern/mod s\u00f6zdizimini kullan\u0131n. aksi takdirde yeni RegExp ("pat", "mod") kullan\u0131l\u0131r + +config.name.handleSkinPartsAutomatically = [SkinPart] meta verisini otomatik olarak y\u00f6netin +config.description.handleSkinPartsAutomatically = D\u00fczenlemeleri [SkinPart] meta verilerini otomatik olarak derleyip do\u011frudan d\u00fczenler. Kapat\u0131ld\u0131\u011f\u0131nda _skinParts \u00f6zelli\u011fi ve getter y\u00f6ntemi g\u00f6r\u00fcn\u00fcr ve manuel olarak d\u00fczenlenebilir. + +config.name.simplifyExpressions = Deyimleri basitle\u015ftir +config.description.simplifyExpressions = Kodun okunabilir olmas\u0131n\u0131 sa\u011flamak i\u00e7in ifadeleri de\u011ferlendirin ve basitle\u015ftirin + +config.name.resetLetterSpacingOnTextImport = Metin i\u00e7e aktar\u0131m\u0131nda Mektup Yerle\u015fimini S\u0131f\u0131rla +config.description.resetLetterSpacingOnTextImport = Kiril yaz\u0131 tipleri i\u00e7in daha kullan\u0131\u015fl\u0131, \u00e7\u00fcnk\u00fc bunlar daha geni\u015f + +config.name.flexSdkLocation = 4) Flex SDK dizin yolu +config.description.flexSdkLocation = Adobe Flex SDK'n\u0131n konumu. \u00c7o\u011funlukla AS3 derlemesi i\u00e7in kullan\u0131l\u0131r. + +config.name.useFlexAs3Compiler = Flex SDK AS3 derleyici kullan\u0131n +config.description.useFlexAs3Compiler = ActionScript do\u011frudan d\u00fczenleme s\u0131ras\u0131nda Flex SDK'den AS3 derleyicisi kullan\u0131n (Flex SDK dizininin ayarlanmas\u0131 gereklidir) + +config.name.showSetAdvanceValuesMessage = Avans de\u011ferlerini ayarlama hakk\u0131nda bilgileri tekrar g\u00f6ster +config.description.showSetAdvanceValuesMessage = Avans de\u011ferlerini ayarlama hakk\u0131nda bilgileri tekrar g\u00f6ster + +config.name.gui.fontSizeMultiplier = Yaz\u0131 tipi boyutu \u00e7arpan\u0131 +config.description.gui.fontSizeMultiplier = Yaz\u0131 tipi boyutu \u00e7arpan\u0131 + +#Do not translate the Font Styles (Plain... etc.) +config.name.gui.sourceFont = Kaynak yaz\u0131 tipi stili +config.description.gui.sourceFont = FontNameFontSize-FontStyle(D\u00fcz, Kal\u0131n, \u0130talik BoldItalic)-FontSize \ No newline at end of file diff --git a/src/com/jpexs/decompiler/flash/gui/locales/DebugLogDialog_tr.properties b/src/com/jpexs/decompiler/flash/gui/locales/DebugLogDialog_tr.properties new file mode 100644 index 000000000..03bc4b831 --- /dev/null +++ b/src/com/jpexs/decompiler/flash/gui/locales/DebugLogDialog_tr.properties @@ -0,0 +1,19 @@ +# Copyright (C) 2010-2016 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 . + +dialog.title = Hata ay\u0131klay\u0131c\u0131 G\u00fcnl\u00fc\u011f\u00fc +button.clear = Temizle +button.close = Kapat +msg.header = ba\u011flan %clientid%: \ No newline at end of file diff --git a/src/com/jpexs/decompiler/flash/gui/locales/ErrorLogFrame_tr.properties b/src/com/jpexs/decompiler/flash/gui/locales/ErrorLogFrame_tr.properties new file mode 100644 index 000000000..a06d98edb --- /dev/null +++ b/src/com/jpexs/decompiler/flash/gui/locales/ErrorLogFrame_tr.properties @@ -0,0 +1,21 @@ +# Copyright (C) 2010-2016 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 . + +copy = Panoya kopyala +details = Detaylar\u0131 g\u00f6ster +dialog.title = Giri\u015f + +#after version 1.7.0u1: +clear = Temizle \ No newline at end of file diff --git a/src/com/jpexs/decompiler/flash/gui/locales/ExportDialog_tr.properties b/src/com/jpexs/decompiler/flash/gui/locales/ExportDialog_tr.properties new file mode 100644 index 000000000..45eb055db --- /dev/null +++ b/src/com/jpexs/decompiler/flash/gui/locales/ExportDialog_tr.properties @@ -0,0 +1,99 @@ +# Copyright (C) 2010-2016 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 . +shapes = Bi\u00e7im +shapes.svg = SVG +shapes.png = PNG +shapes.bmp = BMP +shapes.canvas = HTML5 Canvas +shapes.swf = SWF + +texts = Metinler +texts.plain = D\u00fcz metin +texts.formatted = Bi\u00e7imlendirilmi\u015f metin +texts.svg = SVG + +images = G\u00f6r\u00fcnt\u00fcler +images.png_gif_jpeg = PNG/GIF/JPEG +images.png = PNG +images.jpeg = JPEG +images.bmp = BMP + +movies = Filmler +movies.flv = FLV (Ses yok) + +sounds = Sesler +sounds.mp3_wav_flv = MP3/WAV/FLV +sounds.flv = FLV (Audio only) +sounds.mp3_wav = MP3/WAV +sounds.wav = WAV + +scripts = Komutlar +scripts.as = ActionScript +scripts.pcode = P-code +scripts.pcode_hex = P-code with Hex +scripts.hex = B\u00fcy\u00fc +scripts.constants = Sabitler +scripts.as_method_stubs = ActionScript y\u00f6ntemi taslaklar\u0131 + +binaryData = \u0130kili veri +binaryData.raw = Raw + +dialog.title = \u0130hracat... + +button.ok = OK +button.cancel = \u0130ptal + +morphshapes = Morph \u015fekilleri +morphshapes.gif = GIF +morphshapes.svg = SVG +morphshapes.canvas = HTML5 Canvas +morphshapes.swf = SWF + +frames = \u00c7er\u00e7eveler +frames.png = PNG +frames.gif = GIF +frames.avi = AVI +frames.svg = SVG +frames.canvas = HTML5 Canvas +frames.pdf = PDF +frames.bmp = BMP +frames.swf = SWF + +sprites = Hareketliler +sprites.png = PNG +sprites.gif = GIF +sprites.avi = AVI +sprites.svg = SVG +sprites.canvas = HTML5 Canvas +sprites.pdf = PDF +sprites.bmp = BMP +sprites.swf = SWF + +buttons = D\u00fc\u011fmeler +buttons.png = PNG +buttons.svg = SVG +buttons.bmp = BMP +buttons.swf = SWF + +fonts = Yaz\u0131 +fonts.ttf = TTF +fonts.woff = WOFF + +zoom = Yak\u0131nla\u015ft\u0131rmak +zoom.percent = % +zoom.invalid = Ge\u00e7ersiz yak\u0131nla\u015ft\u0131rma de\u011feri. + +symbolclass = Sembol S\u0131n\u0131f\u0131 haritalama +symbolclass.csv = CSV \ No newline at end of file diff --git a/src/com/jpexs/decompiler/flash/gui/locales/FontEmbedDialog_tr.properties b/src/com/jpexs/decompiler/flash/gui/locales/FontEmbedDialog_tr.properties new file mode 100644 index 000000000..b6841c1db --- /dev/null +++ b/src/com/jpexs/decompiler/flash/gui/locales/FontEmbedDialog_tr.properties @@ -0,0 +1,26 @@ +# Copyright (C) 2010-2016 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 . + +range.description = %name% (%available% of %total% characters) +dialog.title = Yaz\u0131 tipi g\u00f6mme +label.individual = Bireysel karakterler: +button.loadfont = Yaz\u0131tipini diskten y\u00fckle... +filter.ttf = True Type Font dosyalar\u0131 (*.ttf) +error.invalidfontfile = Ge\u00e7ersiz yaz\u0131 tipi dosyas\u0131 +error.cannotreadfontfile = Yaz\u0131 tipi dosyas\u0131 okunam\u0131yor +installed = Kurulmu\u015f: +ttffile.noselection = TTF dosyas\u0131: