From 1c687a6d23b8aed176bc22ba75947f7751ddd87f Mon Sep 17 00:00:00 2001 From: Matt Date: Mon, 14 Oct 2024 09:13:45 -0400 Subject: [PATCH] Fix varies NPE's in handling abstract methods in the UI --- .../recaf/ui/pane/editing/assembler/ControlFlowLines.java | 6 +++++- .../ui/pane/editing/assembler/JvmStackAnalysisPane.java | 6 +++++- .../recaf/ui/pane/editing/assembler/JvmVariablesPane.java | 6 +++++- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/recaf-ui/src/main/java/software/coley/recaf/ui/pane/editing/assembler/ControlFlowLines.java b/recaf-ui/src/main/java/software/coley/recaf/ui/pane/editing/assembler/ControlFlowLines.java index 5b0eabb34..245844608 100644 --- a/recaf-ui/src/main/java/software/coley/recaf/ui/pane/editing/assembler/ControlFlowLines.java +++ b/recaf-ui/src/main/java/software/coley/recaf/ui/pane/editing/assembler/ControlFlowLines.java @@ -14,6 +14,7 @@ import javafx.util.Duration; import me.darknet.assembler.ast.ASTElement; import me.darknet.assembler.ast.primitive.ASTArray; +import me.darknet.assembler.ast.primitive.ASTCode; import me.darknet.assembler.ast.primitive.ASTInstruction; import me.darknet.assembler.ast.primitive.ASTLabel; import me.darknet.assembler.ast.primitive.ASTObject; @@ -199,7 +200,10 @@ private void updateModel() { Consumer methodConsumer = astMethod -> { if (currentMethod != null && !Objects.equals(currentMethod.getName(), astMethod.getName().literal())) return; - for (ASTInstruction instruction : astMethod.code().instructions()) { + ASTCode code = astMethod.code(); + if (code == null) + return; + for (ASTInstruction instruction : code.instructions()) { if (instruction instanceof ASTLabel label) { readUpdater.accept(label.identifier().content(), label); } else { diff --git a/recaf-ui/src/main/java/software/coley/recaf/ui/pane/editing/assembler/JvmStackAnalysisPane.java b/recaf-ui/src/main/java/software/coley/recaf/ui/pane/editing/assembler/JvmStackAnalysisPane.java index 5ac028e3b..92c823966 100644 --- a/recaf-ui/src/main/java/software/coley/recaf/ui/pane/editing/assembler/JvmStackAnalysisPane.java +++ b/recaf-ui/src/main/java/software/coley/recaf/ui/pane/editing/assembler/JvmStackAnalysisPane.java @@ -14,6 +14,7 @@ import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import me.darknet.assembler.ast.ASTElement; +import me.darknet.assembler.ast.primitive.ASTCode; import me.darknet.assembler.ast.primitive.ASTEmpty; import me.darknet.assembler.ast.primitive.ASTInstruction; import me.darknet.assembler.ast.specific.ASTClass; @@ -185,7 +186,10 @@ private int getSelectedInsnIndexOfMethod(@Nonnull ASTMethod method) { int pos = editor.getCodeArea().getCaretPosition(); if (!method.range().within(pos)) return -1; - List instructions = method.code().instructions(); + ASTCode code = method.code(); + if (code == null) + return -1; + List instructions = code.instructions(); int paragraph = editor.getCodeArea().getCurrentParagraph(); int result = Collections.binarySearch(instructions, new ASTEmpty(new Token( new Range(pos, pos + 1), diff --git a/recaf-ui/src/main/java/software/coley/recaf/ui/pane/editing/assembler/JvmVariablesPane.java b/recaf-ui/src/main/java/software/coley/recaf/ui/pane/editing/assembler/JvmVariablesPane.java index 0b62e64f6..91332efd6 100644 --- a/recaf-ui/src/main/java/software/coley/recaf/ui/pane/editing/assembler/JvmVariablesPane.java +++ b/recaf-ui/src/main/java/software/coley/recaf/ui/pane/editing/assembler/JvmVariablesPane.java @@ -17,6 +17,7 @@ import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import me.darknet.assembler.ast.ASTElement; +import me.darknet.assembler.ast.primitive.ASTCode; import me.darknet.assembler.ast.primitive.ASTIdentifier; import me.darknet.assembler.ast.primitive.ASTInstruction; import me.darknet.assembler.ast.specific.ASTClass; @@ -220,7 +221,10 @@ private void updateTable() { String literalName = parameter.literal(); variableUsages.putIfAbsent(literalName, emptyUsage); } - for (ASTInstruction instruction : astMethod.code().instructions()) { + ASTCode code = astMethod.code(); + if (code == null) + return; + for (ASTInstruction instruction : code.instructions()) { String insnName = instruction.identifier().content(); boolean isLoad = insnName.endsWith("load"); if (((isLoad || insnName.endsWith("store")) && insnName.charAt(1) != 'a') || insnName.equals("iinc")) {