1 /*
2 * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23 package org.openjdk.asmtools.jasm;
24
25 import java.io.IOException;
26 import java.util.List;
27
28 /**
29 * Base class of the "classes[]" data of attributes
30 * <p>
31 * JEP 181 (Nest-based Access Control): class file 55.0
32 * NestMembers_attribute {
33 * u2 attribute_name_index;
34 * u4 attribute_length;
35 * u2 number_of_classes;
36 * u2 classes[number_of_classes];
37 * }
38 * <p>
39 * JEP 360 (Sealed types): class file 59.65535
40 * PermittedSubclasses_attribute {
41 * u2 attribute_name_index;
42 * u4 attribute_length;
43 * u2 number_of_classes;
44 * u2 classes[number_of_classes];
45 * }
46 */
47 public class ClassArrayAttr extends AttrData {
48
49 List<ConstantPool.ConstCell> classes;
50
51 public ClassArrayAttr(String attributeName, ClassData cdata, List<ConstantPool.ConstCell> classes) {
52 super(cdata, attributeName);
53 this.classes = classes;
54 }
55
56 @Override
57 public int attrLength() {
58 return 2 + classes.size() * 2;
59 }
60
61 @Override
62 public void write(CheckedDataOutputStream out) throws IOException {
63 super.write(out);
64 out.writeShort(classes.size());
65 for (ConstantPool.ConstCell c : classes) {
66 out.writeShort(c.arg);
67 }
68 }
69 }