src/java.base/share/classes/jdk/internal/module/ModuleInfo.java
author rriggs
Sun, 29 Oct 2017 18:20:53 -0400
changeset 47471 304ef03403b1
parent 47216 71c04702a3d5
child 48203 4fd79561f38f
permissions -rw-r--r--
8190323: "the the" typos Reviewed-by: rriggs Contributed-by: christoph.dreis@freenet.de
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
     1
/*
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42703
diff changeset
     2
 * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved.
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
     4
 *
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    10
 *
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    15
 * accompanied this code).
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    16
 *
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    20
 *
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    23
 * questions.
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    24
 */
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    25
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    26
package jdk.internal.module;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    27
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    28
import java.io.DataInput;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    29
import java.io.DataInputStream;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    30
import java.io.EOFException;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    31
import java.io.IOException;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    32
import java.io.InputStream;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    33
import java.io.UncheckedIOException;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    34
import java.lang.module.InvalidModuleDescriptorException;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    35
import java.lang.module.ModuleDescriptor;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    36
import java.lang.module.ModuleDescriptor.Builder;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    37
import java.lang.module.ModuleDescriptor.Requires;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    38
import java.lang.module.ModuleDescriptor.Exports;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    39
import java.lang.module.ModuleDescriptor.Opens;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    40
import java.nio.ByteBuffer;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    41
import java.nio.BufferUnderflowException;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    42
import java.util.ArrayList;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    43
import java.util.Collections;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    44
import java.util.HashMap;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    45
import java.util.HashSet;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    46
import java.util.List;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    47
import java.util.Map;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    48
import java.util.Set;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    49
import java.util.function.Supplier;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    50
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    51
import jdk.internal.misc.JavaLangModuleAccess;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    52
import jdk.internal.misc.SharedSecrets;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    53
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    54
import static jdk.internal.module.ClassFileConstants.*;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    55
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    56
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    57
/**
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    58
 * Read module information from a {@code module-info} class file.
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    59
 *
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    60
 * @implNote The rationale for the hand-coded reader is startup performance
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    61
 * and fine control over the throwing of InvalidModuleDescriptorException.
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    62
 */
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    63
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    64
public final class ModuleInfo {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    65
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    66
    private static final JavaLangModuleAccess JLMA
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    67
        = SharedSecrets.getJavaLangModuleAccess();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    68
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    69
    // supplies the set of packages when ModulePackages attribute not present
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    70
    private final Supplier<Set<String>> packageFinder;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    71
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    72
    // indicates if the ModuleHashes attribute should be parsed
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    73
    private final boolean parseHashes;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    74
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    75
    private ModuleInfo(Supplier<Set<String>> pf, boolean ph) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    76
        packageFinder = pf;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    77
        parseHashes = ph;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    78
    }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    79
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    80
    private ModuleInfo(Supplier<Set<String>> pf) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    81
        this(pf, true);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    82
    }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    83
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    84
    /**
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    85
     * A holder class for the ModuleDescriptor that is created by reading the
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    86
     * Module and other standard class file attributes. It also holds the objects
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    87
     * that represent the non-standard class file attributes that are read from
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    88
     * the class file.
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    89
     */
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    90
    public static final class Attributes {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    91
        private final ModuleDescriptor descriptor;
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
    92
        private final ModuleTarget target;
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    93
        private final ModuleHashes recordedHashes;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    94
        private final ModuleResolution moduleResolution;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    95
        Attributes(ModuleDescriptor descriptor,
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
    96
                   ModuleTarget target,
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    97
                   ModuleHashes recordedHashes,
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    98
                   ModuleResolution moduleResolution) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
    99
            this.descriptor = descriptor;
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   100
            this.target = target;
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   101
            this.recordedHashes = recordedHashes;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   102
            this.moduleResolution = moduleResolution;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   103
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   104
        public ModuleDescriptor descriptor() {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   105
            return descriptor;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   106
        }
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   107
        public ModuleTarget target() {
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   108
            return target;
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   109
        }
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   110
        public ModuleHashes recordedHashes() {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   111
            return recordedHashes;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   112
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   113
        public ModuleResolution moduleResolution() {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   114
            return moduleResolution;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   115
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   116
    }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   117
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   118
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   119
    /**
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   120
     * Reads a {@code module-info.class} from the given input stream.
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   121
     *
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   122
     * @throws InvalidModuleDescriptorException
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   123
     * @throws IOException
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   124
     */
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   125
    public static Attributes read(InputStream in, Supplier<Set<String>> pf)
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   126
        throws IOException
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   127
    {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   128
        try {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   129
            return new ModuleInfo(pf).doRead(new DataInputStream(in));
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   130
        } catch (IllegalArgumentException | IllegalStateException e) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   131
            throw invalidModuleDescriptor(e.getMessage());
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   132
        } catch (EOFException x) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   133
            throw truncatedModuleDescriptor();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   134
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   135
    }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   136
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   137
    /**
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   138
     * Reads a {@code module-info.class} from the given byte buffer.
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   139
     *
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   140
     * @throws InvalidModuleDescriptorException
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   141
     * @throws UncheckedIOException
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   142
     */
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   143
    public static Attributes read(ByteBuffer bb, Supplier<Set<String>> pf) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   144
        try {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   145
            return new ModuleInfo(pf).doRead(new DataInputWrapper(bb));
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   146
        } catch (IllegalArgumentException | IllegalStateException e) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   147
            throw invalidModuleDescriptor(e.getMessage());
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   148
        } catch (EOFException x) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   149
            throw truncatedModuleDescriptor();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   150
        } catch (IOException ioe) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   151
            throw new UncheckedIOException(ioe);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   152
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   153
    }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   154
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   155
    /**
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   156
     * Reads a {@code module-info.class} from the given byte buffer
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   157
     * but ignore the {@code ModuleHashes} attribute.
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   158
     *
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   159
     * @throws InvalidModuleDescriptorException
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   160
     * @throws UncheckedIOException
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   161
     */
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   162
    public static Attributes readIgnoringHashes(ByteBuffer bb, Supplier<Set<String>> pf) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   163
        try {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   164
            return new ModuleInfo(pf, false).doRead(new DataInputWrapper(bb));
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   165
        } catch (IllegalArgumentException | IllegalStateException e) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   166
            throw invalidModuleDescriptor(e.getMessage());
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   167
        } catch (EOFException x) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   168
            throw truncatedModuleDescriptor();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   169
        } catch (IOException ioe) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   170
            throw new UncheckedIOException(ioe);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   171
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   172
    }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   173
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   174
    /**
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   175
     * Reads the input as a module-info class file.
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   176
     *
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   177
     * @throws IOException
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   178
     * @throws InvalidModuleDescriptorException
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   179
     * @throws IllegalArgumentException if thrown by the ModuleDescriptor.Builder
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   180
     *         because an identifier is not a legal Java identifier, duplicate
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   181
     *         exports, and many other reasons
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   182
     */
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   183
    private Attributes doRead(DataInput in) throws IOException {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   184
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   185
        int magic = in.readInt();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   186
        if (magic != 0xCAFEBABE)
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   187
            throw invalidModuleDescriptor("Bad magic number");
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   188
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   189
        int minor_version = in.readUnsignedShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   190
        int major_version = in.readUnsignedShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   191
        if (major_version < 53) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   192
            throw invalidModuleDescriptor("Must be >= 53.0");
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   193
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   194
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   195
        ConstantPool cpool = new ConstantPool(in);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   196
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   197
        int access_flags = in.readUnsignedShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   198
        if (access_flags != ACC_MODULE)
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   199
            throw invalidModuleDescriptor("access_flags should be ACC_MODULE");
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   200
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   201
        int this_class = in.readUnsignedShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   202
        String mn = cpool.getClassName(this_class);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   203
        if (!"module-info".equals(mn))
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   204
            throw invalidModuleDescriptor("this_class should be module-info");
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   205
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   206
        int super_class = in.readUnsignedShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   207
        if (super_class > 0)
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   208
            throw invalidModuleDescriptor("bad #super_class");
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   209
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   210
        int interfaces_count = in.readUnsignedShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   211
        if (interfaces_count > 0)
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   212
            throw invalidModuleDescriptor("Bad #interfaces");
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   213
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   214
        int fields_count = in.readUnsignedShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   215
        if (fields_count > 0)
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   216
            throw invalidModuleDescriptor("Bad #fields");
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   217
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   218
        int methods_count = in.readUnsignedShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   219
        if (methods_count > 0)
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   220
            throw invalidModuleDescriptor("Bad #methods");
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   221
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   222
        int attributes_count = in.readUnsignedShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   223
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   224
        // the names of the attributes found in the class file
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   225
        Set<String> attributes = new HashSet<>();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   226
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   227
        Builder builder = null;
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42703
diff changeset
   228
        Set<String> allPackages = null;
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   229
        String mainClass = null;
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   230
        ModuleTarget moduleTarget = null;
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   231
        ModuleHashes moduelHashes = null;
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   232
        ModuleResolution moduleResolution = null;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   233
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   234
        for (int i = 0; i < attributes_count ; i++) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   235
            int name_index = in.readUnsignedShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   236
            String attribute_name = cpool.getUtf8(name_index);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   237
            int length = in.readInt();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   238
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   239
            boolean added = attributes.add(attribute_name);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   240
            if (!added && isAttributeAtMostOnce(attribute_name)) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   241
                throw invalidModuleDescriptor("More than one "
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   242
                                              + attribute_name + " attribute");
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   243
            }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   244
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   245
            switch (attribute_name) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   246
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   247
                case MODULE :
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   248
                    builder = readModuleAttribute(in, cpool);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   249
                    break;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   250
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   251
                case MODULE_PACKAGES :
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42703
diff changeset
   252
                    allPackages = readModulePackagesAttribute(in, cpool);
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   253
                    break;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   254
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   255
                case MODULE_MAIN_CLASS :
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   256
                    mainClass = readModuleMainClassAttribute(in, cpool);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   257
                    break;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   258
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   259
                case MODULE_TARGET :
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   260
                    moduleTarget = readModuleTargetAttribute(in, cpool);
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   261
                    break;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   262
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   263
                case MODULE_HASHES :
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   264
                    if (parseHashes) {
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   265
                        moduelHashes = readModuleHashesAttribute(in, cpool);
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   266
                    } else {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   267
                        in.skipBytes(length);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   268
                    }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   269
                    break;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   270
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   271
                case MODULE_RESOLUTION :
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   272
                    moduleResolution = readModuleResolution(in, cpool);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   273
                    break;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   274
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   275
                default:
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   276
                    if (isAttributeDisallowed(attribute_name)) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   277
                        throw invalidModuleDescriptor(attribute_name
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   278
                                                      + " attribute not allowed");
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   279
                    } else {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   280
                        in.skipBytes(length);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   281
                    }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   282
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   283
            }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   284
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   285
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   286
        // the Module attribute is required
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   287
        if (builder == null) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   288
            throw invalidModuleDescriptor(MODULE + " attribute not found");
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   289
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   290
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   291
        // ModuleMainClass  attribute
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42703
diff changeset
   292
        if (mainClass != null) {
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42703
diff changeset
   293
            builder.mainClass(mainClass);
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42703
diff changeset
   294
        }
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42703
diff changeset
   295
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   296
        // If the ModulePackages attribute is not present then the packageFinder
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   297
        // is used to find the set of packages
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   298
        boolean usedPackageFinder = false;
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42703
diff changeset
   299
        if (allPackages == null && packageFinder != null) {
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   300
            try {
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42703
diff changeset
   301
                allPackages = packageFinder.get();
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   302
            } catch (UncheckedIOException x) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   303
                throw x.getCause();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   304
            }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   305
            usedPackageFinder = true;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   306
        }
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42703
diff changeset
   307
        if (allPackages != null) {
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42703
diff changeset
   308
            Set<String> knownPackages = JLMA.packages(builder);
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42703
diff changeset
   309
            if (!allPackages.containsAll(knownPackages)) {
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42703
diff changeset
   310
                Set<String> missingPackages = new HashSet<>(knownPackages);
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42703
diff changeset
   311
                missingPackages.removeAll(allPackages);
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42703
diff changeset
   312
                assert !missingPackages.isEmpty();
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42703
diff changeset
   313
                String missingPackage = missingPackages.iterator().next();
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42703
diff changeset
   314
                String tail;
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42703
diff changeset
   315
                if (usedPackageFinder) {
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42703
diff changeset
   316
                    tail = " not found in module";
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42703
diff changeset
   317
                } else {
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42703
diff changeset
   318
                    tail = " missing from ModulePackages class file attribute";
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   319
                }
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42703
diff changeset
   320
                throw invalidModuleDescriptor("Package " + missingPackage + tail);
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   321
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42703
diff changeset
   322
            }
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42703
diff changeset
   323
            builder.packages(allPackages);
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   324
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   325
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   326
        ModuleDescriptor descriptor = builder.build();
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   327
        return new Attributes(descriptor,
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   328
                              moduleTarget,
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   329
                              moduelHashes,
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   330
                              moduleResolution);
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   331
    }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   332
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   333
    /**
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   334
     * Reads the Module attribute, returning the ModuleDescriptor.Builder to
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   335
     * build the corresponding ModuleDescriptor.
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   336
     */
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   337
    private Builder readModuleAttribute(DataInput in, ConstantPool cpool)
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   338
        throws IOException
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   339
    {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   340
        // module_name
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   341
        int module_name_index = in.readUnsignedShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   342
        String mn = cpool.getModuleName(module_name_index);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   343
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   344
        int module_flags = in.readUnsignedShort();
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42703
diff changeset
   345
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42703
diff changeset
   346
        Set<ModuleDescriptor.Modifier> modifiers = new HashSet<>();
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   347
        boolean open = ((module_flags & ACC_OPEN) != 0);
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42703
diff changeset
   348
        if (open)
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42703
diff changeset
   349
            modifiers.add(ModuleDescriptor.Modifier.OPEN);
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42703
diff changeset
   350
        if ((module_flags & ACC_SYNTHETIC) != 0)
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42703
diff changeset
   351
            modifiers.add(ModuleDescriptor.Modifier.SYNTHETIC);
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42703
diff changeset
   352
        if ((module_flags & ACC_MANDATED) != 0)
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42703
diff changeset
   353
            modifiers.add(ModuleDescriptor.Modifier.MANDATED);
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   354
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42703
diff changeset
   355
        Builder builder = JLMA.newModuleBuilder(mn, false, modifiers);
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   356
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   357
        int module_version_index = in.readUnsignedShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   358
        if (module_version_index != 0) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   359
            String vs = cpool.getUtf8(module_version_index);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   360
            builder.version(vs);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   361
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   362
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   363
        int requires_count = in.readUnsignedShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   364
        boolean requiresJavaBase = false;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   365
        for (int i=0; i<requires_count; i++) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   366
            int requires_index = in.readUnsignedShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   367
            String dn = cpool.getModuleName(requires_index);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   368
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   369
            int requires_flags = in.readUnsignedShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   370
            Set<Requires.Modifier> mods;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   371
            if (requires_flags == 0) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   372
                mods = Collections.emptySet();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   373
            } else {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   374
                mods = new HashSet<>();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   375
                if ((requires_flags & ACC_TRANSITIVE) != 0)
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   376
                    mods.add(Requires.Modifier.TRANSITIVE);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   377
                if ((requires_flags & ACC_STATIC_PHASE) != 0)
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   378
                    mods.add(Requires.Modifier.STATIC);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   379
                if ((requires_flags & ACC_SYNTHETIC) != 0)
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   380
                    mods.add(Requires.Modifier.SYNTHETIC);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   381
                if ((requires_flags & ACC_MANDATED) != 0)
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   382
                    mods.add(Requires.Modifier.MANDATED);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   383
            }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   384
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   385
            int requires_version_index = in.readUnsignedShort();
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42703
diff changeset
   386
            if (requires_version_index == 0) {
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   387
                builder.requires(mods, dn);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   388
            } else {
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42703
diff changeset
   389
                String vs = cpool.getUtf8(requires_version_index);
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42703
diff changeset
   390
                JLMA.requires(builder, mods, dn, vs);
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   391
            }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   392
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   393
            if (dn.equals("java.base"))
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   394
                requiresJavaBase = true;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   395
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   396
        if (mn.equals("java.base")) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   397
            if (requires_count > 0) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   398
                throw invalidModuleDescriptor("The requires table for java.base"
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   399
                                              + " must be 0 length");
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   400
            }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   401
        } else if (!requiresJavaBase) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   402
            throw invalidModuleDescriptor("The requires table must have"
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   403
                                          + " an entry for java.base");
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   404
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   405
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   406
        int exports_count = in.readUnsignedShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   407
        if (exports_count > 0) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   408
            for (int i=0; i<exports_count; i++) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   409
                int exports_index = in.readUnsignedShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   410
                String pkg = cpool.getPackageName(exports_index);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   411
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   412
                Set<Exports.Modifier> mods;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   413
                int exports_flags = in.readUnsignedShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   414
                if (exports_flags == 0) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   415
                    mods = Collections.emptySet();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   416
                } else {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   417
                    mods = new HashSet<>();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   418
                    if ((exports_flags & ACC_SYNTHETIC) != 0)
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   419
                        mods.add(Exports.Modifier.SYNTHETIC);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   420
                    if ((exports_flags & ACC_MANDATED) != 0)
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   421
                        mods.add(Exports.Modifier.MANDATED);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   422
                }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   423
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   424
                int exports_to_count = in.readUnsignedShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   425
                if (exports_to_count > 0) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   426
                    Set<String> targets = new HashSet<>(exports_to_count);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   427
                    for (int j=0; j<exports_to_count; j++) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   428
                        int exports_to_index = in.readUnsignedShort();
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   429
                        String target = cpool.getModuleName(exports_to_index);
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   430
                        if (!targets.add(target)) {
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   431
                            throw invalidModuleDescriptor(pkg + " exported to "
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   432
                                                          + target + " more than once");
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   433
                        }
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   434
                    }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   435
                    builder.exports(mods, pkg, targets);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   436
                } else {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   437
                    builder.exports(mods, pkg);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   438
                }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   439
            }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   440
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   441
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   442
        int opens_count = in.readUnsignedShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   443
        if (opens_count > 0) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   444
            if (open) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   445
                throw invalidModuleDescriptor("The opens table for an open"
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   446
                                              + " module must be 0 length");
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   447
            }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   448
            for (int i=0; i<opens_count; i++) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   449
                int opens_index = in.readUnsignedShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   450
                String pkg = cpool.getPackageName(opens_index);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   451
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   452
                Set<Opens.Modifier> mods;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   453
                int opens_flags = in.readUnsignedShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   454
                if (opens_flags == 0) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   455
                    mods = Collections.emptySet();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   456
                } else {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   457
                    mods = new HashSet<>();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   458
                    if ((opens_flags & ACC_SYNTHETIC) != 0)
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   459
                        mods.add(Opens.Modifier.SYNTHETIC);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   460
                    if ((opens_flags & ACC_MANDATED) != 0)
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   461
                        mods.add(Opens.Modifier.MANDATED);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   462
                }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   463
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   464
                int open_to_count = in.readUnsignedShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   465
                if (open_to_count > 0) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   466
                    Set<String> targets = new HashSet<>(open_to_count);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   467
                    for (int j=0; j<open_to_count; j++) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   468
                        int opens_to_index = in.readUnsignedShort();
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   469
                        String target = cpool.getModuleName(opens_to_index);
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   470
                        if (!targets.add(target)) {
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   471
                            throw invalidModuleDescriptor(pkg + " opened to "
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   472
                                                          + target + " more than once");
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   473
                        }
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   474
                    }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   475
                    builder.opens(mods, pkg, targets);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   476
                } else {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   477
                    builder.opens(mods, pkg);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   478
                }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   479
            }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   480
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   481
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   482
        int uses_count = in.readUnsignedShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   483
        if (uses_count > 0) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   484
            for (int i=0; i<uses_count; i++) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   485
                int index = in.readUnsignedShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   486
                String sn = cpool.getClassName(index);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   487
                builder.uses(sn);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   488
            }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   489
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   490
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   491
        int provides_count = in.readUnsignedShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   492
        if (provides_count > 0) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   493
            for (int i=0; i<provides_count; i++) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   494
                int index = in.readUnsignedShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   495
                String sn = cpool.getClassName(index);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   496
                int with_count = in.readUnsignedShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   497
                List<String> providers = new ArrayList<>(with_count);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   498
                for (int j=0; j<with_count; j++) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   499
                    index = in.readUnsignedShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   500
                    String pn = cpool.getClassName(index);
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   501
                    if (!providers.add(pn)) {
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   502
                        throw invalidModuleDescriptor(sn + " provides " + pn
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   503
                                                      + " more than once");
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   504
                    }
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   505
                }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   506
                builder.provides(sn, providers);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   507
            }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   508
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   509
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   510
        return builder;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   511
    }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   512
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   513
    /**
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   514
     * Reads the ModulePackages attribute
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   515
     */
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   516
    private Set<String> readModulePackagesAttribute(DataInput in, ConstantPool cpool)
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   517
        throws IOException
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   518
    {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   519
        int package_count = in.readUnsignedShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   520
        Set<String> packages = new HashSet<>(package_count);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   521
        for (int i=0; i<package_count; i++) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   522
            int index = in.readUnsignedShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   523
            String pn = cpool.getPackageName(index);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   524
            boolean added = packages.add(pn);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   525
            if (!added) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   526
                throw invalidModuleDescriptor("Package " + pn + " in ModulePackages"
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   527
                                              + "attribute more than once");
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   528
            }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   529
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   530
        return packages;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   531
    }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   532
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   533
    /**
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   534
     * Reads the ModuleMainClass attribute
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   535
     */
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   536
    private String readModuleMainClassAttribute(DataInput in, ConstantPool cpool)
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   537
        throws IOException
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   538
    {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   539
        int index = in.readUnsignedShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   540
        return cpool.getClassName(index);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   541
    }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   542
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   543
    /**
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   544
     * Reads the ModuleTarget attribute
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   545
     */
44359
c6761862ca0b 8174823: Module system implementation refresh (3/2017)
alanb
parents: 43712
diff changeset
   546
    private ModuleTarget readModuleTargetAttribute(DataInput in, ConstantPool cpool)
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   547
        throws IOException
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   548
    {
45004
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44359
diff changeset
   549
        String targetPlatform = null;
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   550
45004
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44359
diff changeset
   551
        int index = in.readUnsignedShort();
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44359
diff changeset
   552
        if (index != 0)
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44359
diff changeset
   553
            targetPlatform = cpool.getUtf8(index);
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   554
45004
ea3137042a61 8178380: Module system implementation refresh (5/2017)
alanb
parents: 44359
diff changeset
   555
        return new ModuleTarget(targetPlatform);
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   556
    }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   557
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   558
    /**
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   559
     * Reads the ModuleHashes attribute
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   560
     */
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   561
    private ModuleHashes readModuleHashesAttribute(DataInput in, ConstantPool cpool)
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   562
        throws IOException
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   563
    {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   564
        int algorithm_index = in.readUnsignedShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   565
        String algorithm = cpool.getUtf8(algorithm_index);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   566
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   567
        int hash_count = in.readUnsignedShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   568
        Map<String, byte[]> map = new HashMap<>(hash_count);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   569
        for (int i=0; i<hash_count; i++) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   570
            int module_name_index = in.readUnsignedShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   571
            String mn = cpool.getModuleName(module_name_index);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   572
            int hash_length = in.readUnsignedShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   573
            if (hash_length == 0) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   574
                throw invalidModuleDescriptor("hash_length == 0");
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   575
            }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   576
            byte[] hash = new byte[hash_length];
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   577
            in.readFully(hash);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   578
            map.put(mn, hash);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   579
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   580
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   581
        return new ModuleHashes(algorithm, map);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   582
    }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   583
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   584
    /**
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   585
     * Reads the ModuleResolution attribute.
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   586
     */
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   587
    private ModuleResolution readModuleResolution(DataInput in,
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   588
                                                  ConstantPool cpool)
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   589
        throws IOException
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   590
    {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   591
        int flags = in.readUnsignedShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   592
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   593
        int reason = 0;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   594
        if ((flags & WARN_DEPRECATED) != 0)
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   595
            reason = WARN_DEPRECATED;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   596
        if ((flags & WARN_DEPRECATED_FOR_REMOVAL) != 0) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   597
            if (reason != 0)
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   598
                throw invalidModuleDescriptor("Bad module resolution flags:" + flags);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   599
            reason = WARN_DEPRECATED_FOR_REMOVAL;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   600
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   601
        if ((flags & WARN_INCUBATING) != 0) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   602
            if (reason != 0)
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   603
                throw invalidModuleDescriptor("Bad module resolution flags:" + flags);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   604
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   605
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   606
        return new ModuleResolution(flags);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   607
    }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   608
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   609
    /**
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   610
     * Returns true if the given attribute can be present at most once
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   611
     * in the class file. Returns false otherwise.
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   612
     */
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   613
    private static boolean isAttributeAtMostOnce(String name) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   614
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   615
        if (name.equals(MODULE) ||
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   616
                name.equals(SOURCE_FILE) ||
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   617
                name.equals(SDE) ||
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   618
                name.equals(MODULE_PACKAGES) ||
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   619
                name.equals(MODULE_MAIN_CLASS) ||
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   620
                name.equals(MODULE_TARGET) ||
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   621
                name.equals(MODULE_HASHES) ||
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   622
                name.equals(MODULE_RESOLUTION))
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   623
            return true;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   624
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   625
        return false;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   626
    }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   627
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   628
    /**
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   629
     * Return true if the given attribute name is the name of a pre-defined
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42703
diff changeset
   630
     * attribute in JVMS 4.7 that is not allowed in a module-info class.
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   631
     */
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   632
    private static boolean isAttributeDisallowed(String name) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   633
        Set<String> notAllowed = predefinedNotAllowed;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   634
        if (notAllowed == null) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   635
            notAllowed = Set.of(
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   636
                    "ConstantValue",
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   637
                    "Code",
43712
5dfd0950317c 8173393: Module system implementation refresh (2/2017)
alanb
parents: 42703
diff changeset
   638
                    "Deprecated",
42703
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   639
                    "StackMapTable",
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   640
                    "Exceptions",
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   641
                    "EnclosingMethod",
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   642
                    "Signature",
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   643
                    "LineNumberTable",
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   644
                    "LocalVariableTable",
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   645
                    "LocalVariableTypeTable",
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   646
                    "RuntimeVisibleParameterAnnotations",
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   647
                    "RuntimeInvisibleParameterAnnotations",
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   648
                    "RuntimeVisibleTypeAnnotations",
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   649
                    "RuntimeInvisibleTypeAnnotations",
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   650
                    "Synthetic",
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   651
                    "AnnotationDefault",
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   652
                    "BootstrapMethods",
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   653
                    "MethodParameters");
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   654
            predefinedNotAllowed = notAllowed;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   655
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   656
        return notAllowed.contains(name);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   657
    }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   658
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   659
    // lazily created set the pre-defined attributes that are not allowed
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   660
    private static volatile Set<String> predefinedNotAllowed;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   661
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   662
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   663
    /**
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   664
     * The constant pool in a class file.
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   665
     */
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   666
    private static class ConstantPool {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   667
        static final int CONSTANT_Utf8 = 1;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   668
        static final int CONSTANT_Integer = 3;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   669
        static final int CONSTANT_Float = 4;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   670
        static final int CONSTANT_Long = 5;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   671
        static final int CONSTANT_Double = 6;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   672
        static final int CONSTANT_Class = 7;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   673
        static final int CONSTANT_String = 8;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   674
        static final int CONSTANT_Fieldref = 9;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   675
        static final int CONSTANT_Methodref = 10;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   676
        static final int CONSTANT_InterfaceMethodref = 11;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   677
        static final int CONSTANT_NameAndType = 12;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   678
        static final int CONSTANT_MethodHandle = 15;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   679
        static final int CONSTANT_MethodType = 16;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   680
        static final int CONSTANT_InvokeDynamic = 18;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   681
        static final int CONSTANT_Module = 19;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   682
        static final int CONSTANT_Package = 20;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   683
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   684
        private static class Entry {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   685
            protected Entry(int tag) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   686
                this.tag = tag;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   687
            }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   688
            final int tag;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   689
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   690
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   691
        private static class IndexEntry extends Entry {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   692
            IndexEntry(int tag, int index) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   693
                super(tag);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   694
                this.index = index;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   695
            }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   696
            final int index;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   697
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   698
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   699
        private static class Index2Entry extends Entry {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   700
            Index2Entry(int tag, int index1, int index2) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   701
                super(tag);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   702
                this.index1 = index1;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   703
                this.index2 = index2;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   704
            }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   705
            final int index1,  index2;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   706
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   707
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   708
        private static class ValueEntry extends Entry {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   709
            ValueEntry(int tag, Object value) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   710
                super(tag);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   711
                this.value = value;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   712
            }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   713
            final Object value;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   714
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   715
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   716
        final Entry[] pool;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   717
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   718
        ConstantPool(DataInput in) throws IOException {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   719
            int count = in.readUnsignedShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   720
            pool = new Entry[count];
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   721
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   722
            for (int i = 1; i < count; i++) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   723
                int tag = in.readUnsignedByte();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   724
                switch (tag) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   725
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   726
                    case CONSTANT_Utf8:
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   727
                        String svalue = in.readUTF();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   728
                        pool[i] = new ValueEntry(tag, svalue);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   729
                        break;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   730
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   731
                    case CONSTANT_Class:
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   732
                    case CONSTANT_Package:
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   733
                    case CONSTANT_Module:
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   734
                    case CONSTANT_String:
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   735
                        int index = in.readUnsignedShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   736
                        pool[i] = new IndexEntry(tag, index);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   737
                        break;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   738
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   739
                    case CONSTANT_Double:
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   740
                        double dvalue = in.readDouble();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   741
                        pool[i] = new ValueEntry(tag, dvalue);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   742
                        i++;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   743
                        break;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   744
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   745
                    case CONSTANT_Fieldref:
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   746
                    case CONSTANT_InterfaceMethodref:
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   747
                    case CONSTANT_Methodref:
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   748
                    case CONSTANT_InvokeDynamic:
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   749
                    case CONSTANT_NameAndType:
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   750
                        int index1 = in.readUnsignedShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   751
                        int index2 = in.readUnsignedShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   752
                        pool[i] = new Index2Entry(tag, index1, index2);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   753
                        break;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   754
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   755
                    case CONSTANT_MethodHandle:
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   756
                        int refKind = in.readUnsignedByte();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   757
                        index = in.readUnsignedShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   758
                        pool[i] = new Index2Entry(tag, refKind, index);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   759
                        break;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   760
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   761
                    case CONSTANT_MethodType:
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   762
                        index = in.readUnsignedShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   763
                        pool[i] = new IndexEntry(tag, index);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   764
                        break;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   765
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   766
                    case CONSTANT_Float:
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   767
                        float fvalue = in.readFloat();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   768
                        pool[i] = new ValueEntry(tag, fvalue);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   769
                        break;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   770
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   771
                    case CONSTANT_Integer:
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   772
                        int ivalue = in.readInt();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   773
                        pool[i] = new ValueEntry(tag, ivalue);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   774
                        break;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   775
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   776
                    case CONSTANT_Long:
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   777
                        long lvalue = in.readLong();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   778
                        pool[i] = new ValueEntry(tag, lvalue);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   779
                        i++;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   780
                        break;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   781
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   782
                    default:
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   783
                        throw invalidModuleDescriptor("Bad constant pool entry: "
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   784
                                                      + i);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   785
                }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   786
            }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   787
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   788
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   789
        String getClassName(int index) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   790
            checkIndex(index);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   791
            Entry e = pool[index];
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   792
            if (e.tag != CONSTANT_Class) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   793
                throw invalidModuleDescriptor("CONSTANT_Class expected at entry: "
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   794
                                              + index);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   795
            }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   796
            String value = getUtf8(((IndexEntry) e).index);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   797
            checkUnqualifiedName("CONSTANT_Class", index, value);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   798
            return value.replace('/', '.');  // internal form -> binary name
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   799
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   800
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   801
        String getPackageName(int index) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   802
            checkIndex(index);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   803
            Entry e = pool[index];
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   804
            if (e.tag != CONSTANT_Package) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   805
                throw invalidModuleDescriptor("CONSTANT_Package expected at entry: "
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   806
                                              + index);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   807
            }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   808
            String value = getUtf8(((IndexEntry) e).index);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   809
            checkUnqualifiedName("CONSTANT_Package", index, value);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   810
            return value.replace('/', '.');  // internal form -> binary name
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   811
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   812
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   813
        String getModuleName(int index) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   814
            checkIndex(index);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   815
            Entry e = pool[index];
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   816
            if (e.tag != CONSTANT_Module) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   817
                throw invalidModuleDescriptor("CONSTANT_Module expected at entry: "
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   818
                                              + index);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   819
            }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   820
            String value = getUtf8(((IndexEntry) e).index);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   821
            return decodeModuleName(index, value);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   822
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   823
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   824
        String getUtf8(int index) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   825
            checkIndex(index);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   826
            Entry e = pool[index];
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   827
            if (e.tag != CONSTANT_Utf8) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   828
                throw invalidModuleDescriptor("CONSTANT_Utf8 expected at entry: "
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   829
                                              + index);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   830
            }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   831
            return (String) (((ValueEntry) e).value);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   832
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   833
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   834
        void checkIndex(int index) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   835
            if (index < 1 || index >= pool.length)
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   836
                throw invalidModuleDescriptor("Index into constant pool out of range");
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   837
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   838
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   839
        void checkUnqualifiedName(String what, int index, String value) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   840
            int len = value.length();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   841
            if (len == 0) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   842
                throw invalidModuleDescriptor(what + " at entry " + index
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   843
                                              + " has zero length");
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   844
            }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   845
            for (int i=0; i<len; i++) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   846
                char c = value.charAt(i);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   847
                if (c == '.' || c == ';' || c == '[') {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   848
                    throw invalidModuleDescriptor(what + " at entry " + index
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   849
                                                  + " has illegal character: '"
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   850
                                                  + c + "'");
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   851
                }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   852
            }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   853
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   854
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   855
        /**
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   856
         * "Decode" a module name that has been read from the constant pool.
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   857
         */
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   858
        String decodeModuleName(int index, String value) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   859
            int len = value.length();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   860
            if (len == 0) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   861
                throw invalidModuleDescriptor("CONSTANT_Module at entry "
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   862
                                              + index + " is zero length");
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   863
            }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   864
            int i = 0;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   865
            while (i < len) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   866
                int cp = value.codePointAt(i);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   867
                if (cp == ':' || cp == '@' || cp < 0x20) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   868
                    throw invalidModuleDescriptor("CONSTANT_Module at entry "
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   869
                                                  + index + " has illegal character: "
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   870
                                                  + Character.getName(cp));
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   871
                }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   872
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   873
                // blackslash is the escape character
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   874
                if (cp == '\\')
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   875
                    return decodeModuleName(index, i, value);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   876
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   877
                i += Character.charCount(cp);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   878
            }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   879
            return value;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   880
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   881
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   882
        /**
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   883
         * "Decode" a module name that has been read from the constant pool and
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   884
         * partly checked for illegal characters (up to position {@code i}).
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   885
         */
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   886
        String decodeModuleName(int index, int i, String value) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   887
            StringBuilder sb = new StringBuilder();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   888
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   889
            // copy the code points that have been checked
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   890
            int j = 0;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   891
            while (j < i) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   892
                int cp = value.codePointAt(j);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   893
                sb.appendCodePoint(cp);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   894
                j += Character.charCount(cp);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   895
            }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   896
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   897
            // decode from position {@code i} to end
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   898
            int len = value.length();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   899
            while (i < len) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   900
                int cp = value.codePointAt(i);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   901
                if (cp == ':' || cp == '@' || cp < 0x20) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   902
                    throw invalidModuleDescriptor("CONSTANT_Module at entry "
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   903
                                                  + index + " has illegal character: "
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   904
                                                  + Character.getName(cp));
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   905
                }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   906
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   907
                // blackslash is the escape character
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   908
                if (cp == '\\') {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   909
                    j = i + Character.charCount(cp);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   910
                    if (j >= len) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   911
                        throw invalidModuleDescriptor("CONSTANT_Module at entry "
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   912
                                                       + index + " has illegal "
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   913
                                                       + "escape sequence");
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   914
                    }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   915
                    int next = value.codePointAt(j);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   916
                    if (next != '\\' && next != ':' && next != '@') {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   917
                        throw invalidModuleDescriptor("CONSTANT_Module at entry "
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   918
                                                      + index + " has illegal "
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   919
                                                      + "escape sequence");
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   920
                    }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   921
                    sb.appendCodePoint(next);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   922
                    i += Character.charCount(next);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   923
                } else {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   924
                    sb.appendCodePoint(cp);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   925
                }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   926
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   927
                i += Character.charCount(cp);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   928
            }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   929
            return sb.toString();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   930
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   931
    }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   932
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   933
    /**
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   934
     * A DataInput implementation that reads from a ByteBuffer.
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   935
     */
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   936
    private static class DataInputWrapper implements DataInput {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   937
        private final ByteBuffer bb;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   938
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   939
        DataInputWrapper(ByteBuffer bb) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   940
            this.bb = bb;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   941
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   942
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   943
        @Override
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   944
        public void readFully(byte b[]) throws IOException {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   945
            readFully(b, 0, b.length);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   946
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   947
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   948
        @Override
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   949
        public void readFully(byte b[], int off, int len) throws IOException {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   950
            try {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   951
                bb.get(b, off, len);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   952
            } catch (BufferUnderflowException e) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   953
                throw new EOFException(e.getMessage());
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   954
            }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   955
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   956
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   957
        @Override
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   958
        public int skipBytes(int n) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   959
            int skip = Math.min(n, bb.remaining());
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   960
            bb.position(bb.position() + skip);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   961
            return skip;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   962
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   963
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   964
        @Override
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   965
        public boolean readBoolean() throws IOException {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   966
            try {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   967
                int ch = bb.get();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   968
                return (ch != 0);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   969
            } catch (BufferUnderflowException e) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   970
                throw new EOFException(e.getMessage());
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   971
            }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   972
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   973
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   974
        @Override
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   975
        public byte readByte() throws IOException {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   976
            try {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   977
                return bb.get();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   978
            } catch (BufferUnderflowException e) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   979
                throw new EOFException(e.getMessage());
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   980
            }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   981
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   982
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   983
        @Override
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   984
        public int readUnsignedByte() throws IOException {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   985
            try {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   986
                return ((int) bb.get()) & 0xff;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   987
            } catch (BufferUnderflowException e) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   988
                throw new EOFException(e.getMessage());
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   989
            }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   990
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   991
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   992
        @Override
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   993
        public short readShort() throws IOException {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   994
            try {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   995
                return bb.getShort();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   996
            } catch (BufferUnderflowException e) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   997
                throw new EOFException(e.getMessage());
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   998
            }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
   999
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1000
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1001
        @Override
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1002
        public int readUnsignedShort() throws IOException {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1003
            try {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1004
                return ((int) bb.getShort()) & 0xffff;
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1005
            } catch (BufferUnderflowException e) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1006
                throw new EOFException(e.getMessage());
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1007
            }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1008
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1009
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1010
        @Override
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1011
        public char readChar() throws IOException {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1012
            try {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1013
                return bb.getChar();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1014
            } catch (BufferUnderflowException e) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1015
                throw new EOFException(e.getMessage());
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1016
            }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1017
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1018
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1019
        @Override
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1020
        public int readInt() throws IOException {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1021
            try {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1022
                return bb.getInt();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1023
            } catch (BufferUnderflowException e) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1024
                throw new EOFException(e.getMessage());
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1025
            }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1026
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1027
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1028
        @Override
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1029
        public long readLong() throws IOException {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1030
            try {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1031
                return bb.getLong();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1032
            } catch (BufferUnderflowException e) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1033
                throw new EOFException(e.getMessage());
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1034
            }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1035
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1036
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1037
        @Override
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1038
        public float readFloat() throws IOException {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1039
            try {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1040
                return bb.getFloat();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1041
            } catch (BufferUnderflowException e) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1042
                throw new EOFException(e.getMessage());
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1043
            }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1044
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1045
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1046
        @Override
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1047
        public double readDouble() throws IOException {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1048
            try {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1049
                return bb.getDouble();
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1050
            } catch (BufferUnderflowException e) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1051
                throw new EOFException(e.getMessage());
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1052
            }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1053
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1054
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1055
        @Override
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1056
        public String readLine() {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1057
            throw new RuntimeException("not implemented");
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1058
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1059
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1060
        @Override
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1061
        public String readUTF() throws IOException {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1062
            // ### Need to measure the performance and feasibility of using
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1063
            // the UTF-8 decoder instead.
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1064
            return DataInputStream.readUTF(this);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1065
        }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1066
    }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1067
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1068
    /**
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1069
     * Returns an InvalidModuleDescriptorException with the given detail
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1070
     * message
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1071
     */
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1072
    private static InvalidModuleDescriptorException
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1073
    invalidModuleDescriptor(String msg) {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1074
        return new InvalidModuleDescriptorException(msg);
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1075
    }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1076
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1077
    /**
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1078
     * Returns an InvalidModuleDescriptorException with a detail message to
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1079
     * indicate that the class file is truncated.
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1080
     */
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1081
    private static InvalidModuleDescriptorException truncatedModuleDescriptor() {
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1082
        return invalidModuleDescriptor("Truncated module-info.class");
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1083
    }
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1084
20c39ea4a507 8170987: Module system implementation refresh (12/2016)
alanb
parents:
diff changeset
  1085
}