jdk/src/java.base/share/classes/jdk/internal/jimage/BasicImageWriter.java
author martin
Tue, 15 Sep 2015 21:56:04 -0700
changeset 32649 2ee9017c7597
parent 31673 135283550686
permissions -rw-r--r--
8136583: Core libraries should use blessed modifier order Summary: Run blessed-modifier-order script (see bug) Reviewed-by: psandoz, chegar, alanb, plevart
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
     1
/*
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
     2
 * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
     4
 *
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    10
 *
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    15
 * accompanied this code).
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    16
 *
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    20
 *
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    23
 * questions.
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    24
*/
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    25
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    26
package jdk.internal.jimage;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    27
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    28
import java.nio.ByteOrder;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    29
import java.util.ArrayList;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    30
import java.util.List;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    31
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    32
public final class BasicImageWriter {
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    33
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    34
    public static final String IMAGE_EXT = ".jimage";
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    35
    public static final String BOOT_NAME = "bootmodules";
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    36
    public static final String BOOT_IMAGE_NAME = BOOT_NAME + IMAGE_EXT;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    37
32649
2ee9017c7597 8136583: Core libraries should use blessed modifier order
martin
parents: 31673
diff changeset
    38
    private static final int RETRY_LIMIT = 1000;
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    39
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    40
    private ByteOrder byteOrder;
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    41
    private ImageStringsWriter strings;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    42
    private int length;
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    43
    private int[] redirect;
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    44
    private ImageLocationWriter[] locations;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    45
    private List<ImageLocationWriter> input;
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    46
    private ImageStream headerStream;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    47
    private ImageStream redirectStream;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    48
    private ImageStream locationOffsetStream;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    49
    private ImageStream locationStream;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    50
    private ImageStream allIndexStream;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    51
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    52
    public BasicImageWriter() {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    53
        this(ByteOrder.nativeOrder());
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    54
    }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    55
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    56
    public BasicImageWriter(ByteOrder byteOrder) {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    57
        this.byteOrder = byteOrder;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    58
        this.input = new ArrayList<>();
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    59
        this.strings = new ImageStringsWriter();
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    60
        this.headerStream = new ImageStream(byteOrder);
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    61
        this.redirectStream = new ImageStream(byteOrder);
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    62
        this.locationOffsetStream = new ImageStream(byteOrder);
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    63
        this.locationStream = new ImageStream(byteOrder);
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    64
        this.allIndexStream = new ImageStream(byteOrder);
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    65
    }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    66
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    67
    public ByteOrder getByteOrder() {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    68
        return byteOrder;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    69
    }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    70
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    71
    public int addString(String string) {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    72
        return addString(new UTF8String(string));
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    73
    }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    74
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    75
    public int addString(UTF8String string) {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    76
        return strings.add(string);
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    77
    }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    78
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    79
    public String getString(int offset) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    80
        UTF8String utf8 = strings.get(offset);
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    81
        return utf8 != null? utf8.toString() : null;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    82
    }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    83
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    84
    public void addLocation(String fullname, long contentOffset,
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    85
            long compressedSize, long uncompressedSize) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    86
        ImageLocationWriter location =
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    87
                ImageLocationWriter.newLocation(new UTF8String(fullname), strings,
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    88
                        contentOffset, compressedSize, uncompressedSize);
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    89
        input.add(location);
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    90
        length++;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    91
    }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    92
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    93
    ImageLocationWriter[] getLocations() {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    94
        return locations;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    95
    }
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    96
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    97
    int getLocationsCount() {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
    98
        return input.size();
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
    99
    }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   100
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   101
    private void generatePerfectHash() {
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   102
        PerfectHashBuilder<ImageLocationWriter> builder =
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   103
            new PerfectHashBuilder<>(
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   104
                new PerfectHashBuilder.Entry<ImageLocationWriter>().getClass(),
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   105
                new PerfectHashBuilder.Bucket<ImageLocationWriter>().getClass());
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   106
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   107
        input.forEach((location) -> {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   108
            builder.put(location.getFullName(), location);
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   109
        });
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   110
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   111
        builder.generate();
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   112
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   113
        length = builder.getCount();
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   114
        redirect = builder.getRedirect();
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   115
        PerfectHashBuilder.Entry<ImageLocationWriter>[] order = builder.getOrder();
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   116
        locations = new ImageLocationWriter[length];
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   117
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   118
        for (int i = 0; i < length; i++) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   119
            locations[i] = order[i].getValue();
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   120
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   121
    }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   122
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   123
    private void prepareStringBytes() {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   124
        strings.getStream().align(2);
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   125
    }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   126
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   127
    private void prepareRedirectBytes() {
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   128
        for (int i = 0; i < length; i++) {
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   129
            redirectStream.putInt(redirect[i]);
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   130
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   131
    }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   132
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   133
    private void prepareLocationBytes() {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   134
        // Reserve location offset zero for empty locations
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   135
        locationStream.put(ImageLocationWriter.ATTRIBUTE_END << 3);
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   136
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   137
        for (int i = 0; i < length; i++) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   138
            ImageLocationWriter location = locations[i];
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   139
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   140
            if (location != null) {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   141
                location.writeTo(locationStream);
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   142
            }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   143
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   144
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   145
        locationStream.align(2);
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   146
    }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   147
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   148
    private void prepareOffsetBytes() {
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   149
        for (int i = 0; i < length; i++) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   150
            ImageLocationWriter location = locations[i];
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   151
            int offset = location != null ? location.getLocationOffset() : 0;
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   152
            locationOffsetStream.putInt(offset);
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   153
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   154
    }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   155
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   156
    private void prepareHeaderBytes() {
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   157
        ImageHeader header = new ImageHeader(input.size(), length,
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   158
                locationStream.getSize(), strings.getSize());
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   159
        header.writeTo(headerStream);
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   160
    }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   161
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   162
    private void prepareTableBytes() {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   163
        allIndexStream.put(headerStream);
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   164
        allIndexStream.put(redirectStream);
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   165
        allIndexStream.put(locationOffsetStream);
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   166
        allIndexStream.put(locationStream);
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   167
        allIndexStream.put(strings.getStream());
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   168
    }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   169
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   170
    public byte[] getBytes() {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   171
        if (allIndexStream.getSize() == 0) {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   172
            generatePerfectHash();
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   173
            prepareStringBytes();
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   174
            prepareRedirectBytes();
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   175
            prepareLocationBytes();
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   176
            prepareOffsetBytes();
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   177
            prepareHeaderBytes();
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   178
            prepareTableBytes();
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   179
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   180
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   181
        return allIndexStream.toArray();
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   182
    }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   183
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   184
    ImageLocationWriter find(UTF8String key) {
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   185
        int index = redirect[key.hashCode() % length];
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   186
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   187
        if (index < 0) {
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   188
            index = -index - 1;
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   189
        } else {
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   190
            index = key.hashCode(index) % length;
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   191
        }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   192
31673
135283550686 8080511: Refresh of jimage support
jfdenise
parents: 27565
diff changeset
   193
        return locations[index];
27565
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   194
    }
729f9700483a 8049367: Modular Run-Time Images
chegar
parents:
diff changeset
   195
}