diff --git a/CHANGELOG.md b/CHANGELOG.md index be7a80b2e..e8839e75d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ All notable changes to this project will be documented in this file. ## [Unreleased] ### Fixed - [#2474] Gotos incorrectly decompiled +- AS1/2/3 highligter - brackets parsing error causing memory leak / crash ## [24.0.1] - 2025-06-27 ### Fixed diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3SimpleParser.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3SimpleParser.java index 539e5c865..b153f5dba 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3SimpleParser.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/abc/avm2/parser/script/ActionScript3SimpleParser.java @@ -1650,8 +1650,8 @@ public class ActionScript3SimpleParser implements SimpleParser { arrCnt++; expression(errors, thisType, needsActivation, importedClasses, openedNamespaces, registerVars, inFunction, inMethod, isStatic, true, variables, false, abc); s = lex(); - if (!s.isType(SymbolType.COMMA, SymbolType.BRACKET_CLOSE)) { - expected(errors, s, lexer.yyline(), SymbolType.COMMA, SymbolType.BRACKET_CLOSE); + if (!expected(errors, s, lexer.yyline(), SymbolType.COMMA, SymbolType.BRACKET_CLOSE)) { + break; } } } else { diff --git a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2SimpleParser.java b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2SimpleParser.java index 6b173571b..935ea9f04 100644 --- a/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2SimpleParser.java +++ b/libsrc/ffdec_lib/src/com/jpexs/decompiler/flash/action/parser/script/ActionScript2SimpleParser.java @@ -1249,8 +1249,8 @@ public class ActionScript2SimpleParser implements SimpleParser { arrCnt++; expression(errors, inFunction, inMethod, inTellTarget, true, variables, false, hasEval); s = lex(); - if (!s.isType(SymbolType.COMMA, SymbolType.BRACKET_CLOSE)) { - expected(errors, s, lexer.yyline(), SymbolType.COMMA, SymbolType.BRACKET_CLOSE); + if (!expected(errors, s, lexer.yyline(), SymbolType.COMMA, SymbolType.BRACKET_CLOSE)) { + break; } } } else { diff --git a/src/com/jpexs/decompiler/flash/gui/editor/VariableMarker.java b/src/com/jpexs/decompiler/flash/gui/editor/VariableMarker.java index 040b0f3ea..8ccd6a481 100644 --- a/src/com/jpexs/decompiler/flash/gui/editor/VariableMarker.java +++ b/src/com/jpexs/decompiler/flash/gui/editor/VariableMarker.java @@ -998,6 +998,7 @@ public class VariableMarker implements SyntaxComponent, CaretListener, PropertyC errors.clear(); removeErrorMarkers(); highlightsPanel.repaint(); + boolean doClear = false; try { SyntaxDocument sDoc = (SyntaxDocument) pane.getDocument(); @@ -1051,7 +1052,23 @@ public class VariableMarker implements SyntaxComponent, CaretListener, PropertyC Path type = newExternalTypes.get(i); newSimpleExternalClassNameToFullClassName.put(type.getLast(), type); } - definitionPosToReferences = newDefinitionPosToReferences; + + definitionPosToReferences.clear(); + referenceToDefinition.clear(); + externalTypes.clear(); + referenceToExternalTypeIndex.clear(); + externalTypeIndexToReference.clear(); + simpleExternalClassNameToFullClassName.clear(); + referenceToExternalTraitKey.clear(); + externalTraitKeyToReference.clear(); + separatorPosToType.clear(); + localTypeTraits.clear(); + definitionToType.clear(); + definitionToCallType.clear(); + separatorIsStatic.clear(); + variableSuggestions.clear(); + + definitionPosToReferences = newDefinitionPosToReferences; referenceToDefinition = newReferenceToDefinition; externalTypes = newExternalTypes; referenceToExternalTypeIndex = newReferenceToExternalTypeIndex; @@ -1071,12 +1088,31 @@ public class VariableMarker implements SyntaxComponent, CaretListener, PropertyC } catch (BadLocationException | IOException | InterruptedException ex) { definitionPosToReferences.clear(); referenceToDefinition.clear(); - //ex.printStackTrace(); + doClear = true; } catch (SimpleParseException ex) { - definitionPosToReferences.clear(); - referenceToDefinition.clear(); + doClear = true; errors.put((int) ex.position, ex.getMessage()); } + + if (doClear) { + definitionPosToReferences.clear(); + referenceToDefinition.clear(); + definitionPosToReferences.clear(); + referenceToDefinition.clear(); + externalTypes.clear(); + referenceToExternalTypeIndex.clear(); + externalTypeIndexToReference.clear(); + simpleExternalClassNameToFullClassName.clear(); + referenceToExternalTraitKey.clear(); + externalTraitKeyToReference.clear(); + separatorPosToType.clear(); + localTypeTraits.clear(); + definitionToType.clear(); + definitionToCallType.clear(); + separatorIsStatic.clear(); + variableSuggestions.clear(); + } + Timer tim = errorsTimer; if (tim != null) { tim.cancel();