Skip to content

Commit 9f8a9db

Browse files
author
duke
committed
Backport 7ff4ea8
1 parent 56fcf0b commit 9f8a9db

File tree

2 files changed

+94
-4
lines changed

2 files changed

+94
-4
lines changed

src/jdk.compiler/share/classes/com/sun/tools/javac/jvm/ClassReader.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 1999, 2023, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 1999, 2024, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -2174,7 +2174,7 @@ public void visitCompoundAnnotationProxy(CompoundAnnotationProxy proxy) {
21742174

21752175
Type resolvePossibleProxyType(Type t) {
21762176
if (t instanceof ProxyType proxyType) {
2177-
Assert.check(requestingOwner.owner.kind == MDL);
2177+
Assert.check(requestingOwner.owner instanceof ModuleSymbol);
21782178
ModuleSymbol prevCurrentModule = currentModule;
21792179
currentModule = (ModuleSymbol) requestingOwner.owner;
21802180
try {

test/langtools/tools/javac/modules/AnnotationsOnModules.java

Lines changed: 92 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2016, 2024, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -23,7 +23,7 @@
2323

2424
/*
2525
* @test
26-
* @bug 8159602 8170549 8171255 8171322 8254023
26+
* @bug 8159602 8170549 8171255 8171322 8254023 8341966
2727
* @summary Test annotations on module declaration.
2828
* @library /tools/lib
2929
* @enablePreview
@@ -35,8 +35,10 @@
3535
*/
3636

3737
import java.io.File;
38+
import java.io.OutputStream;
3839
import java.nio.file.Files;
3940
import java.nio.file.Path;
41+
import java.util.ArrayList;
4042
import java.util.Arrays;
4143
import java.util.HashSet;
4244
import java.util.List;
@@ -55,6 +57,7 @@
5557
import java.lang.classfile.*;
5658
import java.lang.classfile.ClassFile;
5759
import java.lang.classfile.attribute.*;
60+
import java.lang.reflect.AccessFlag;
5861
import toolbox.JavacTask;
5962
import toolbox.Task;
6063
import toolbox.Task.OutputKind;
@@ -726,6 +729,93 @@ public TestCase(String extraDecl, String decl, String use, String expectedAnnota
726729
}
727730
}
728731

732+
@Test
733+
public void testBrokenModuleInfoClassWithAnnotation(Path base) throws Exception {
734+
Path lib = base.resolve("lib");
735+
tb.writeJavaFiles(lib,
736+
"""
737+
@Deprecated
738+
module m{}
739+
""");
740+
741+
Path libClasses = base.resolve("lib-classes");
742+
Files.createDirectories(libClasses);
743+
744+
new JavacTask(tb)
745+
.options("--release", "21")
746+
.outdir(libClasses)
747+
.files(findJavaFiles(lib))
748+
.run()
749+
.writeAll();
750+
751+
Path modifiedModuleInfo = libClasses.resolve("module-info.class");
752+
ClassModel cm1 = ClassFile.of().parse(modifiedModuleInfo);
753+
byte[] newBytes = ClassFile.of().transformClass(cm1, (builder, element) -> {
754+
if (element instanceof ModuleAttribute attr) {
755+
List<ModuleRequireInfo> requires = new ArrayList<>();
756+
757+
for (ModuleRequireInfo mri : attr.requires()) {
758+
if (mri.requires().name().equalsString("java.base")) {
759+
requires.add(ModuleRequireInfo.of(mri.requires(),
760+
List.of(AccessFlag.TRANSITIVE),
761+
mri.requiresVersion()
762+
.orElse(null)));
763+
} else {
764+
requires.add(mri);
765+
}
766+
}
767+
768+
builder.accept(ModuleAttribute.of(attr.moduleName(),
769+
attr.moduleFlagsMask(),
770+
attr.moduleVersion()
771+
.orElseGet(() -> null),
772+
requires,
773+
attr.exports(),
774+
attr.opens(),
775+
attr.uses(),
776+
attr.provides()));
777+
} else {
778+
builder.accept(element);
779+
}
780+
});
781+
782+
try (OutputStream out = Files.newOutputStream(modifiedModuleInfo)) {
783+
out.write(newBytes);
784+
}
785+
786+
Path src = base.resolve("src");
787+
Path classes = base.resolve("classes");
788+
789+
tb.writeJavaFiles(src,
790+
"""
791+
public class C {}
792+
""");
793+
794+
Files.createDirectories(classes);
795+
796+
List<String> actualErrors =
797+
new JavacTask(tb)
798+
.options("--module-path", libClasses.toString(),
799+
"--add-modules", "m",
800+
"-XDshould-stop.at=FLOW",
801+
"-XDdev",
802+
"-XDrawDiagnostics")
803+
.outdir(classes)
804+
.files(findJavaFiles(src))
805+
.run(Task.Expect.FAIL)
806+
.writeAll()
807+
.getOutputLines(OutputKind.DIRECT);
808+
List<String> expectedErrors = List.of(
809+
"- compiler.err.cant.access: m.module-info, (compiler.misc.bad.class.file.header: module-info.class, (compiler.misc.bad.requires.flag: ACC_TRANSITIVE (0x0020))",
810+
"1 error"
811+
);
812+
813+
if (!expectedErrors.equals(actualErrors)) {
814+
throw new AssertionError("Unexpected errors, expected: " + expectedErrors +
815+
", but got: " + actualErrors);
816+
}
817+
}
818+
729819
private static final String OPT_EXPECTED_ANNOTATIONS = "expectedAnnotations";
730820

731821
@SupportedAnnotationTypes("*")

0 commit comments

Comments
 (0)