From ffe6a4f9e1449ce9a78372f11bfc0ef6cd7d6842 Mon Sep 17 00:00:00 2001 From: Chen Liang Date: Wed, 23 Apr 2025 21:39:55 +0000 Subject: [PATCH] 8355335: Avoid pattern matching switches in core ClassFile API Reviewed-by: asotona --- .../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 62d812ce8d4..56682214566 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 final class BlockCodeBuilderImpl } 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 48d5ceb72d6..b4c8ad58705 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 13ca52f18de..9eac25d567c 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 7bd0fc2ca1b..e96351b8856 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 286d29029ad..c8c6d254650 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 @@ public final class CodeImpl //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 f40da3a2bea..d7eaffb3250 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