From eb08ae8bfea3d76c33461ea1ec0ed6ecc0c47dec Mon Sep 17 00:00:00 2001 From: David Thompson Date: Thu, 4 Jan 2024 15:32:00 -0500 Subject: [PATCH] fix nested patterns in boolean assignment Boolean assignments are working, but switch statements aren't. Fully removes unused pattern variables from stack map frame. Fixes #1804 Signed-off-by: David Thompson --- .../internal/compiler/ast/GuardedPattern.java | 4 ++++ .../compiler/ast/InstanceOfExpression.java | 19 ++++++++++++++++-- .../jdt/internal/compiler/ast/Pattern.java | 5 +++++ .../internal/compiler/ast/RecordPattern.java | 7 +++++++ .../internal/compiler/ast/TypePattern.java | 7 +++++++ org.eclipse.jdt.core/jdtCompilerAdapter.jar | Bin 14386 -> 0 bytes 6 files changed, 40 insertions(+), 2 deletions(-) delete mode 100644 org.eclipse.jdt.core/jdtCompilerAdapter.jar diff --git a/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/GuardedPattern.java b/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/GuardedPattern.java index 6db84d30b35..921d5dc6851 100644 --- a/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/GuardedPattern.java +++ b/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/GuardedPattern.java @@ -210,6 +210,10 @@ public void wrapupGeneration(CodeStream codeStream) { this.primaryPattern.wrapupGeneration(codeStream); } @Override + public void fullWrapupGeneration(CodeStream codeStream) { + this.primaryPattern.fullWrapupGeneration(codeStream); + } + @Override protected void generatePatternVariable(BlockScope currentScope, CodeStream codeStream, BranchLabel trueLabel, BranchLabel falseLabel) { this.primaryPattern.generatePatternVariable(currentScope, codeStream, trueLabel, falseLabel); diff --git a/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/InstanceOfExpression.java b/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/InstanceOfExpression.java index 0cb159691b4..7f15fe694bc 100644 --- a/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/InstanceOfExpression.java +++ b/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/InstanceOfExpression.java @@ -117,7 +117,7 @@ public void generateCode(BlockScope currentScope, CodeStream codeStream, boolean int pc = codeStream.position; - if (this.elementVariable != null) { + if (this.elementVariable != null || this.pattern != null) { addAssignment(currentScope, codeStream, this.secretInstanceOfPatternExpressionValue); codeStream.load(this.secretInstanceOfPatternExpressionValue); } else { @@ -125,7 +125,22 @@ public void generateCode(BlockScope currentScope, CodeStream codeStream, boolean } codeStream.instance_of(this.type, this.type.resolvedType); - if (this.elementVariable != null) { + if (this.pattern != null) { + BranchLabel trueLabel = new BranchLabel(codeStream); + BranchLabel falseLabel = new BranchLabel(codeStream); + BranchLabel continueLabel = new BranchLabel(codeStream); + codeStream.ifeq(falseLabel); + codeStream.load(this.secretInstanceOfPatternExpressionValue); + this.pattern.generateOptimizedBoolean(currentScope, codeStream, trueLabel, falseLabel); + this.pattern.fullWrapupGeneration(codeStream); + codeStream.removeVariable(this.secretInstanceOfPatternExpressionValue); + trueLabel.place(); + codeStream.iconst_1(); + codeStream.goto_(continueLabel); + falseLabel.place(); + codeStream.iconst_0(); + continueLabel.place(); + } else if (this.elementVariable != null) { BranchLabel actionLabel = new BranchLabel(codeStream); codeStream.dup(); codeStream.ifeq(actionLabel); diff --git a/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Pattern.java b/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Pattern.java index a64a3abcaa4..7ae8879d630 100644 --- a/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Pattern.java +++ b/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/Pattern.java @@ -115,6 +115,11 @@ public void resumeVariables(CodeStream codeStream, BlockScope scope) { protected abstract void generatePatternVariable(BlockScope currentScope, CodeStream codeStream, BranchLabel trueLabel, BranchLabel falseLabel); protected abstract void wrapupGeneration(CodeStream codeStream); + /** + * Clean up all variables (actual and secret) used in this pattern and child patterns. + */ + protected abstract void fullWrapupGeneration(CodeStream codeStream); + public TypeReference getType() { return null; } diff --git a/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/RecordPattern.java b/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/RecordPattern.java index e3eaefdb90e..6deedbae76f 100644 --- a/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/RecordPattern.java +++ b/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/RecordPattern.java @@ -397,6 +397,13 @@ public void wrapupGeneration(CodeStream codeStream) { super.wrapupGeneration(codeStream); } @Override + public void fullWrapupGeneration(CodeStream codeStream) { + for (Pattern p : this.patterns) { + p.fullWrapupGeneration(codeStream); + } + super.fullWrapupGeneration(codeStream); + } + @Override public void suspendVariables(CodeStream codeStream, BlockScope scope) { codeStream.removeNotDefinitelyAssignedVariables(scope, this.thenInitStateIndex1); } diff --git a/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/TypePattern.java b/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/TypePattern.java index bbf3f090b7a..61848aa97b5 100644 --- a/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/TypePattern.java +++ b/org.eclipse.jdt.core.compiler.batch/src/org/eclipse/jdt/internal/compiler/ast/TypePattern.java @@ -137,6 +137,13 @@ public void wrapupGeneration(CodeStream codeStream) { codeStream.removeVariable(this.secretPatternVariable); } @Override + public void fullWrapupGeneration(CodeStream codeStream) { + this.wrapupGeneration(codeStream); + if (this.local != null) { + codeStream.removeVariable(this.local.binding); + } + } + @Override public LocalDeclaration getPatternVariable() { return this.local; } diff --git a/org.eclipse.jdt.core/jdtCompilerAdapter.jar b/org.eclipse.jdt.core/jdtCompilerAdapter.jar deleted file mode 100644 index 8b78e733e319d326a100f32cc8f3233f69f869fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14386 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 OK0j}K?oT@~u>S+8_~I%6