test/tools/javac/annotations/typeAnnotations/classfile/TypeAnnotationPropagationTest.java

Mon, 04 Dec 2017 10:33:18 -0500

author
sadayapalam
date
Mon, 04 Dec 2017 10:33:18 -0500
changeset 3556
47a91ecb0b87
permissions
-rw-r--r--

8191969: javac produces incorrect RuntimeInvisibleTypeAnnotations length attribute
Reviewed-by: jlahoda, vromero

sadayapalam@3556 1 /*
sadayapalam@3556 2 * Copyright (c) 2017, Google Inc. All rights reserved.
sadayapalam@3556 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
sadayapalam@3556 4 *
sadayapalam@3556 5 * This code is free software; you can redistribute it and/or modify it
sadayapalam@3556 6 * under the terms of the GNU General Public License version 2 only, as
sadayapalam@3556 7 * published by the Free Software Foundation.
sadayapalam@3556 8 *
sadayapalam@3556 9 * This code is distributed in the hope that it will be useful, but WITHOUT
sadayapalam@3556 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
sadayapalam@3556 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
sadayapalam@3556 12 * version 2 for more details (a copy is included in the LICENSE file that
sadayapalam@3556 13 * accompanied this code).
sadayapalam@3556 14 *
sadayapalam@3556 15 * You should have received a copy of the GNU General Public License version
sadayapalam@3556 16 * 2 along with this work; if not, write to the Free Software Foundation,
sadayapalam@3556 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
sadayapalam@3556 18 *
sadayapalam@3556 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
sadayapalam@3556 20 * or visit www.oracle.com if you need additional information or have any
sadayapalam@3556 21 * questions.
sadayapalam@3556 22 */
sadayapalam@3556 23
sadayapalam@3556 24 /*
sadayapalam@3556 25 * @test
sadayapalam@3556 26 * @bug 8144185 8191969
sadayapalam@3556 27 * @summary javac produces incorrect RuntimeInvisibleTypeAnnotations length attribute
sadayapalam@3556 28 */
sadayapalam@3556 29
sadayapalam@3556 30 import static java.lang.annotation.ElementType.TYPE_USE;
sadayapalam@3556 31 import static java.lang.annotation.RetentionPolicy.RUNTIME;
sadayapalam@3556 32
sadayapalam@3556 33 import com.sun.tools.classfile.Attribute;
sadayapalam@3556 34 import com.sun.tools.classfile.ClassFile;
sadayapalam@3556 35 import com.sun.tools.classfile.Code_attribute;
sadayapalam@3556 36 import com.sun.tools.classfile.Method;
sadayapalam@3556 37 import com.sun.tools.classfile.RuntimeVisibleTypeAnnotations_attribute;
sadayapalam@3556 38 import com.sun.tools.classfile.TypeAnnotation;
sadayapalam@3556 39 import java.lang.annotation.Retention;
sadayapalam@3556 40 import java.lang.annotation.Target;
sadayapalam@3556 41 import java.util.Arrays;
sadayapalam@3556 42 import java.util.Objects;
sadayapalam@3556 43
sadayapalam@3556 44 public class TypeAnnotationPropagationTest extends ClassfileTestHelper {
sadayapalam@3556 45 public static void main(String[] args) throws Exception {
sadayapalam@3556 46 new TypeAnnotationPropagationTest().run();
sadayapalam@3556 47 }
sadayapalam@3556 48
sadayapalam@3556 49 public void run() throws Exception {
sadayapalam@3556 50 ClassFile cf = getClassFile("TypeAnnotationPropagationTest$Test.class");
sadayapalam@3556 51
sadayapalam@3556 52 Method f = null;
sadayapalam@3556 53 for (Method m : cf.methods) {
sadayapalam@3556 54 if (m.getName(cf.constant_pool).contains("f")) {
sadayapalam@3556 55 f = m;
sadayapalam@3556 56 break;
sadayapalam@3556 57 }
sadayapalam@3556 58 }
sadayapalam@3556 59
sadayapalam@3556 60 int idx = f.attributes.getIndex(cf.constant_pool, Attribute.Code);
sadayapalam@3556 61 Code_attribute cattr = (Code_attribute) f.attributes.get(idx);
sadayapalam@3556 62 idx = cattr.attributes.getIndex(cf.constant_pool, Attribute.RuntimeVisibleTypeAnnotations);
sadayapalam@3556 63 RuntimeVisibleTypeAnnotations_attribute attr =
sadayapalam@3556 64 (RuntimeVisibleTypeAnnotations_attribute) cattr.attributes.get(idx);
sadayapalam@3556 65
sadayapalam@3556 66 TypeAnnotation anno = attr.annotations[0];
sadayapalam@3556 67 assertEquals(anno.position.lvarOffset, new int[] {3}, "start_pc");
sadayapalam@3556 68 assertEquals(anno.position.lvarLength, new int[] {8}, "length");
sadayapalam@3556 69 assertEquals(anno.position.lvarIndex, new int[] {1}, "index");
sadayapalam@3556 70 }
sadayapalam@3556 71
sadayapalam@3556 72 void assertEquals(int[] actual, int[] expected, String message) {
sadayapalam@3556 73 if (!Arrays.equals(actual, expected)) {
sadayapalam@3556 74 throw new AssertionError(
sadayapalam@3556 75 String.format(
sadayapalam@3556 76 "actual: %s, expected: %s, %s",
sadayapalam@3556 77 Arrays.toString(actual), Arrays.toString(expected), message));
sadayapalam@3556 78 }
sadayapalam@3556 79 }
sadayapalam@3556 80
sadayapalam@3556 81 /** ********************* Test class ************************ */
sadayapalam@3556 82 static class Test {
sadayapalam@3556 83 void f() {
sadayapalam@3556 84 @A String s = "";
sadayapalam@3556 85 Runnable r =
sadayapalam@3556 86 () -> {
sadayapalam@3556 87 Objects.requireNonNull(s);
sadayapalam@3556 88 Objects.requireNonNull(s);
sadayapalam@3556 89 Objects.requireNonNull(s);
sadayapalam@3556 90 Objects.requireNonNull(s);
sadayapalam@3556 91 Objects.requireNonNull(s);
sadayapalam@3556 92 Objects.requireNonNull(s);
sadayapalam@3556 93 };
sadayapalam@3556 94 }
sadayapalam@3556 95
sadayapalam@3556 96 @Retention(RUNTIME)
sadayapalam@3556 97 @Target(TYPE_USE)
sadayapalam@3556 98 @interface A {}
sadayapalam@3556 99 }
sadayapalam@3556 100 }

mercurial