From ae3df67cdc938e3ab1257d1011215e461101d0b4 Mon Sep 17 00:00:00 2001 From: liach Date: Tue, 22 Apr 2025 18:10:37 -0500 Subject: [PATCH] 8355335: Avoid pattern matching switches in core ClassFile API --- .../classfile/impl/BlockCodeBuilderImpl.java | 11 +++++------ .../internal/classfile/impl/ChainedClassBuilder.java | 8 +++----- .../internal/classfile/impl/ChainedFieldBuilder.java | 8 +++----- .../classfile/impl/ChainedMethodBuilder.java | 8 +++----- .../jdk/internal/classfile/impl/CodeImpl.java | 12 +++++++----- .../classfile/impl/NonterminalCodeBuilder.java | 12 +++++++----- 6 files changed, 28 insertions(+), 31 deletions(-) diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/BlockCodeBuilderImpl.java b/src/java.base/share/classes/jdk/internal/classfile/impl/BlockCodeBuilderImpl.java index 62d812ce8d41f..56682214566d4 100644 --- a/src/java.base/share/classes/jdk/internal/classfile/impl/BlockCodeBuilderImpl.java +++ b/src/java.base/share/classes/jdk/internal/classfile/impl/BlockCodeBuilderImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -72,11 +72,10 @@ public boolean isEmpty() { } private int topLocal(CodeBuilder parent) { - return switch (parent) { - case BlockCodeBuilderImpl b -> b.topLocal; - case ChainedCodeBuilder b -> b.terminal.curTopLocal(); - case TerminalCodeBuilder b -> b.curTopLocal(); - }; + if (parent instanceof BlockCodeBuilderImpl bcb) { + return bcb.topLocal; + } + return findTerminal(parent).curTopLocal(); } @Override diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/ChainedClassBuilder.java b/src/java.base/share/classes/jdk/internal/classfile/impl/ChainedClassBuilder.java index 48d5ceb72d641..b4c8ad5870535 100644 --- a/src/java.base/share/classes/jdk/internal/classfile/impl/ChainedClassBuilder.java +++ b/src/java.base/share/classes/jdk/internal/classfile/impl/ChainedClassBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -39,10 +39,8 @@ public final class ChainedClassBuilder public ChainedClassBuilder(ClassBuilder downstream, Consumer consumer) { this.consumer = consumer; - this.terminal = switch (downstream) { - case ChainedClassBuilder cb -> cb.terminal; - case DirectClassBuilder db -> db; - }; + this.terminal = downstream instanceof ChainedClassBuilder ccb ? + ccb.terminal : (DirectClassBuilder) downstream; } @Override diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/ChainedFieldBuilder.java b/src/java.base/share/classes/jdk/internal/classfile/impl/ChainedFieldBuilder.java index 13ca52f18de2f..9eac25d567c8a 100644 --- a/src/java.base/share/classes/jdk/internal/classfile/impl/ChainedFieldBuilder.java +++ b/src/java.base/share/classes/jdk/internal/classfile/impl/ChainedFieldBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -38,10 +38,8 @@ public final class ChainedFieldBuilder implements FieldBuilder { public ChainedFieldBuilder(FieldBuilder downstream, Consumer consumer) { this.consumer = consumer; - this.terminal = switch (downstream) { - case ChainedFieldBuilder cb -> cb.terminal; - case TerminalFieldBuilder tb -> tb; - }; + this.terminal = downstream instanceof ChainedFieldBuilder cfb ? + cfb.terminal : (TerminalFieldBuilder) downstream; } @Override diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/ChainedMethodBuilder.java b/src/java.base/share/classes/jdk/internal/classfile/impl/ChainedMethodBuilder.java index 7bd0fc2ca1b23..e96351b88567e 100644 --- a/src/java.base/share/classes/jdk/internal/classfile/impl/ChainedMethodBuilder.java +++ b/src/java.base/share/classes/jdk/internal/classfile/impl/ChainedMethodBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -41,10 +41,8 @@ public final class ChainedMethodBuilder implements MethodBuilder { public ChainedMethodBuilder(MethodBuilder downstream, Consumer consumer) { this.consumer = consumer; - this.terminal = switch (downstream) { - case ChainedMethodBuilder cb -> cb.terminal; - case TerminalMethodBuilder tb -> tb; - }; + this.terminal = downstream instanceof ChainedMethodBuilder cmb ? + cmb.terminal : (TerminalMethodBuilder) downstream; } @Override diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/CodeImpl.java b/src/java.base/share/classes/jdk/internal/classfile/impl/CodeImpl.java index 286d29029ad24..c8c6d2546502b 100644 --- a/src/java.base/share/classes/jdk/internal/classfile/impl/CodeImpl.java +++ b/src/java.base/share/classes/jdk/internal/classfile/impl/CodeImpl.java @@ -264,14 +264,16 @@ private void inflateJumpTargets() { //fallback to jump targets inflation without StackMapTableAttribute for (int pos=codeStart; pos br.target(); - case DiscontinuedInstruction.JsrInstruction jsr -> jsr.target(); - case LookupSwitchInstruction ls -> { + switch (i.opcode().kind()) { + case BRANCH -> ((BranchInstruction) i).target(); + case DISCONTINUED_JSR -> ((DiscontinuedInstruction.JsrInstruction) i).target(); + case LOOKUP_SWITCH -> { + var ls = (LookupSwitchInstruction) i; ls.defaultTarget(); ls.cases(); } - case TableSwitchInstruction ts -> { + case TABLE_SWITCH -> { + var ts = (TableSwitchInstruction) i; ts.defaultTarget(); ts.cases(); } diff --git a/src/java.base/share/classes/jdk/internal/classfile/impl/NonterminalCodeBuilder.java b/src/java.base/share/classes/jdk/internal/classfile/impl/NonterminalCodeBuilder.java index f40da3a2beac6..d7eaffb325072 100644 --- a/src/java.base/share/classes/jdk/internal/classfile/impl/NonterminalCodeBuilder.java +++ b/src/java.base/share/classes/jdk/internal/classfile/impl/NonterminalCodeBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -35,10 +35,12 @@ public abstract sealed class NonterminalCodeBuilder implements CodeBuilder public NonterminalCodeBuilder(CodeBuilder parent) { this.parent = parent; - this.terminal = switch (parent) { - case NonterminalCodeBuilder cb -> cb.terminal; - case TerminalCodeBuilder cb -> cb; - }; + this.terminal = findTerminal(parent); + } + + static TerminalCodeBuilder findTerminal(CodeBuilder cob) { + return cob instanceof NonterminalCodeBuilder ncb ? + ncb.terminal : (TerminalCodeBuilder) cob; } @Override