src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Source.java
author erikj
Tue, 12 Sep 2017 19:03:39 +0200
changeset 47216 71c04702a3d5
parent 45725 nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/Source.java@083026107a26
child 47277 69c3639a49a6
permissions -rw-r--r--
8187443: Forest Consolidation: Move files to unified layout Reviewed-by: darcy, ihse
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     1
/*
45725
083026107a26 8181105: Nashorn file descriptor leak
anazarov
parents: 39351
diff changeset
     2
 * Copyright (c) 2010, 2017, Oracle and/or its affiliates. All rights reserved.
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     4
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    10
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    15
 * accompanied this code).
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    16
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    20
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    23
 * questions.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    24
 */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    25
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    26
package jdk.nashorn.internal.runtime;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    27
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    28
import java.io.ByteArrayOutputStream;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    29
import java.io.File;
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
    30
import java.io.FileNotFoundException;
30513
14cefab8350f 8080090: -d option should dump script source as well
sundar
parents: 29407
diff changeset
    31
import java.io.FileOutputStream;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    32
import java.io.IOError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    33
import java.io.IOException;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    34
import java.io.InputStream;
30513
14cefab8350f 8080090: -d option should dump script source as well
sundar
parents: 29407
diff changeset
    35
import java.io.PrintWriter;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    36
import java.io.Reader;
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
    37
import java.lang.ref.WeakReference;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    38
import java.net.MalformedURLException;
39351
a049c96353ae 8160435: Source.baseURL is slow for URLs with unregistered protocol
hannesw
parents: 36517
diff changeset
    39
import java.net.URI;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    40
import java.net.URISyntaxException;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    41
import java.net.URL;
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
    42
import java.net.URLConnection;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    43
import java.nio.charset.Charset;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    44
import java.nio.charset.StandardCharsets;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    45
import java.nio.file.Files;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    46
import java.nio.file.Path;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    47
import java.nio.file.Paths;
23767
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 20559
diff changeset
    48
import java.security.MessageDigest;
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 20559
diff changeset
    49
import java.security.NoSuchAlgorithmException;
30513
14cefab8350f 8080090: -d option should dump script source as well
sundar
parents: 29407
diff changeset
    50
import java.time.LocalDateTime;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    51
import java.util.Arrays;
25255
cf56cdc2c663 8049225: Source class exposes public mutable array
attila
parents: 25250
diff changeset
    52
import java.util.Base64;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    53
import java.util.Objects;
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
    54
import java.util.WeakHashMap;
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
    55
import jdk.nashorn.api.scripting.URLReader;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    56
import jdk.nashorn.internal.parser.Token;
24769
attila
parents: 24206
diff changeset
    57
import jdk.nashorn.internal.runtime.logging.DebugLogger;
attila
parents: 24206
diff changeset
    58
import jdk.nashorn.internal.runtime.logging.Loggable;
attila
parents: 24206
diff changeset
    59
import jdk.nashorn.internal.runtime.logging.Logger;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    60
/**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    61
 * Source objects track the origin of JavaScript entities.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    62
 */
24769
attila
parents: 24206
diff changeset
    63
@Logger(name="source")
attila
parents: 24206
diff changeset
    64
public final class Source implements Loggable {
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
    65
    private static final int BUF_SIZE = 8 * 1024;
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
    66
    private static final Cache CACHE = new Cache();
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
    67
25255
cf56cdc2c663 8049225: Source class exposes public mutable array
attila
parents: 25250
diff changeset
    68
    // Message digest to file name encoder
cf56cdc2c663 8049225: Source class exposes public mutable array
attila
parents: 25250
diff changeset
    69
    private final static Base64.Encoder BASE64 = Base64.getUrlEncoder().withoutPadding();
cf56cdc2c663 8049225: Source class exposes public mutable array
attila
parents: 25250
diff changeset
    70
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    71
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    72
     * Descriptive name of the source as supplied by the user. Used for error
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    73
     * reporting to the user. For example, SyntaxError will use this to print message.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    74
     * Used to implement __FILE__. Also used for SourceFile in .class for debugger usage.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    75
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    76
    private final String name;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    77
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    78
    /**
39351
a049c96353ae 8160435: Source.baseURL is slow for URLs with unregistered protocol
hannesw
parents: 36517
diff changeset
    79
     * Base path or URL of this source. Used to implement __DIR__, which can be
a049c96353ae 8160435: Source.baseURL is slow for URLs with unregistered protocol
hannesw
parents: 36517
diff changeset
    80
     * used to load scripts relative to the location of the current script.
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    81
     * This will be null when it can't be computed.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    82
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    83
    private final String base;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    84
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
    85
    /** Source content */
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
    86
    private final Data data;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    87
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    88
    /** Cached hash code */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    89
    private int hash;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    90
25255
cf56cdc2c663 8049225: Source class exposes public mutable array
attila
parents: 25250
diff changeset
    91
    /** Base64-encoded SHA1 digest of this source object */
cf56cdc2c663 8049225: Source class exposes public mutable array
attila
parents: 25250
diff changeset
    92
    private volatile byte[] digest;
23767
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 20559
diff changeset
    93
26055
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 25255
diff changeset
    94
    /** source URL set via //@ sourceURL or //# sourceURL directive */
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 25255
diff changeset
    95
    private String explicitURL;
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 25255
diff changeset
    96
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
    97
    // Do *not* make this public, ever! Trusts the URL and content.
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
    98
    private Source(final String name, final String base, final Data data) {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
    99
        this.name = name;
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   100
        this.base = base;
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   101
        this.data = data;
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   102
    }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   103
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   104
    private static synchronized Source sourceFor(final String name, final String base, final URLData data) throws IOException {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   105
        try {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   106
            final Source newSource = new Source(name, base, data);
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   107
            final Source existingSource = CACHE.get(newSource);
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   108
            if (existingSource != null) {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   109
                // Force any access errors
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   110
                data.checkPermissionAndClose();
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   111
                return existingSource;
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   112
            }
24993
b707d46bae40 8046898: Make sure that lazy compilation is the default, remove redundant "enable lazy compilation" flags, added warning message if compile logging is enabled and lazy is switched off. Verified existing test suite code coverage equivalence between lazy and eager.
lagergren
parents: 24881
diff changeset
   113
b707d46bae40 8046898: Make sure that lazy compilation is the default, remove redundant "enable lazy compilation" flags, added warning message if compile logging is enabled and lazy is switched off. Verified existing test suite code coverage equivalence between lazy and eager.
lagergren
parents: 24881
diff changeset
   114
            // All sources in cache must be fully loaded
b707d46bae40 8046898: Make sure that lazy compilation is the default, remove redundant "enable lazy compilation" flags, added warning message if compile logging is enabled and lazy is switched off. Verified existing test suite code coverage equivalence between lazy and eager.
lagergren
parents: 24881
diff changeset
   115
            data.load();
b707d46bae40 8046898: Make sure that lazy compilation is the default, remove redundant "enable lazy compilation" flags, added warning message if compile logging is enabled and lazy is switched off. Verified existing test suite code coverage equivalence between lazy and eager.
lagergren
parents: 24881
diff changeset
   116
            CACHE.put(newSource, newSource);
b707d46bae40 8046898: Make sure that lazy compilation is the default, remove redundant "enable lazy compilation" flags, added warning message if compile logging is enabled and lazy is switched off. Verified existing test suite code coverage equivalence between lazy and eager.
lagergren
parents: 24881
diff changeset
   117
b707d46bae40 8046898: Make sure that lazy compilation is the default, remove redundant "enable lazy compilation" flags, added warning message if compile logging is enabled and lazy is switched off. Verified existing test suite code coverage equivalence between lazy and eager.
lagergren
parents: 24881
diff changeset
   118
            return newSource;
24778
2ff5d7041566 8044638: Tidy up Nashorn codebase for code standards
attila
parents: 24769
diff changeset
   119
        } catch (final RuntimeException e) {
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   120
            final Throwable cause = e.getCause();
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   121
            if (cause instanceof IOException) {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   122
                throw (IOException) cause;
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   123
            }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   124
            throw e;
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   125
        }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   126
    }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   127
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   128
    private static class Cache extends WeakHashMap<Source, WeakReference<Source>> {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   129
        public Source get(final Source key) {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   130
            final WeakReference<Source> ref = super.get(key);
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   131
            return ref == null ? null : ref.get();
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   132
        }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   133
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   134
        public void put(final Source key, final Source value) {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   135
            assert !(value.data instanceof RawData);
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   136
            put(key, new WeakReference<>(value));
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   137
        }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   138
    }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   139
24881
67cf2d94e00a 8044798: API for debugging Nashorn
sundar
parents: 24778
diff changeset
   140
    /* package-private */
67cf2d94e00a 8044798: API for debugging Nashorn
sundar
parents: 24778
diff changeset
   141
    DebuggerSupport.SourceInfo getSourceInfo() {
67cf2d94e00a 8044798: API for debugging Nashorn
sundar
parents: 24778
diff changeset
   142
        return new DebuggerSupport.SourceInfo(getName(), data.hashCode(),  data.url(), data.array());
67cf2d94e00a 8044798: API for debugging Nashorn
sundar
parents: 24778
diff changeset
   143
    }
67cf2d94e00a 8044798: API for debugging Nashorn
sundar
parents: 24778
diff changeset
   144
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   145
    // Wrapper to manage lazy loading
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   146
    private static interface Data {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   147
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   148
        URL url();
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   149
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   150
        int length();
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   151
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   152
        long lastModified();
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   153
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   154
        char[] array();
25240
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   155
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   156
        boolean isEvalCode();
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   157
    }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   158
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   159
    private static class RawData implements Data {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   160
        private final char[] array;
25240
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   161
        private final boolean evalCode;
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   162
        private int hash;
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   163
25240
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   164
        private RawData(final char[] array, final boolean evalCode) {
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   165
            this.array = Objects.requireNonNull(array);
25240
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   166
            this.evalCode = evalCode;
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   167
        }
16230
c38c724d82e7 8008103: Source object should maintain URL of the script source as a private field
sundar
parents: 16151
diff changeset
   168
25240
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   169
        private RawData(final String source, final boolean evalCode) {
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   170
            this.array = Objects.requireNonNull(source).toCharArray();
25240
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   171
            this.evalCode = evalCode;
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   172
        }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   173
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   174
        private RawData(final Reader reader) throws IOException {
25240
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   175
            this(readFully(reader), false);
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   176
        }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   177
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   178
        @Override
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   179
        public int hashCode() {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   180
            int h = hash;
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   181
            if (h == 0) {
25240
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   182
                h = hash = Arrays.hashCode(array) ^ (evalCode? 1 : 0);
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   183
            }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   184
            return h;
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   185
        }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   186
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   187
        @Override
24778
2ff5d7041566 8044638: Tidy up Nashorn codebase for code standards
attila
parents: 24769
diff changeset
   188
        public boolean equals(final Object obj) {
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   189
            if (this == obj) {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   190
                return true;
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   191
            }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   192
            if (obj instanceof RawData) {
25240
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   193
                final RawData other = (RawData)obj;
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   194
                return Arrays.equals(array, other.array) && evalCode == other.evalCode;
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   195
            }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   196
            return false;
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   197
        }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   198
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   199
        @Override
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   200
        public String toString() {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   201
            return new String(array());
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   202
        }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   203
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   204
        @Override
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   205
        public URL url() {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   206
            return null;
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   207
        }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   208
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   209
        @Override
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   210
        public int length() {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   211
            return array.length;
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   212
        }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   213
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   214
        @Override
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   215
        public long lastModified() {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   216
            return 0;
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   217
        }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   218
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   219
        @Override
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   220
        public char[] array() {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   221
            return array;
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   222
        }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   223
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   224
25240
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   225
        @Override
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   226
        public boolean isEvalCode() {
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   227
            return evalCode;
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   228
        }
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   229
    }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   230
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   231
    private static class URLData implements Data {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   232
        private final URL url;
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   233
        protected final Charset cs;
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   234
        private int hash;
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   235
        protected char[] array;
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   236
        protected int length;
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   237
        protected long lastModified;
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   238
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   239
        private URLData(final URL url, final Charset cs) {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   240
            this.url = Objects.requireNonNull(url);
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   241
            this.cs = cs;
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   242
        }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   243
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   244
        @Override
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   245
        public int hashCode() {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   246
            int h = hash;
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   247
            if (h == 0) {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   248
                h = hash = url.hashCode();
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   249
            }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   250
            return h;
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   251
        }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   252
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   253
        @Override
24778
2ff5d7041566 8044638: Tidy up Nashorn codebase for code standards
attila
parents: 24769
diff changeset
   254
        public boolean equals(final Object other) {
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   255
            if (this == other) {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   256
                return true;
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   257
            }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   258
            if (!(other instanceof URLData)) {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   259
                return false;
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   260
            }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   261
24778
2ff5d7041566 8044638: Tidy up Nashorn codebase for code standards
attila
parents: 24769
diff changeset
   262
            final URLData otherData = (URLData) other;
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   263
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   264
            if (url.equals(otherData.url)) {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   265
                // Make sure both have meta data loaded
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   266
                try {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   267
                    if (isDeferred()) {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   268
                        // Data in cache is always loaded, and we only compare to cached data.
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   269
                        assert !otherData.isDeferred();
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   270
                        loadMeta();
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   271
                    } else if (otherData.isDeferred()) {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   272
                        otherData.loadMeta();
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   273
                    }
24778
2ff5d7041566 8044638: Tidy up Nashorn codebase for code standards
attila
parents: 24769
diff changeset
   274
                } catch (final IOException e) {
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   275
                    throw new RuntimeException(e);
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   276
                }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   277
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   278
                // Compare meta data
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   279
                return this.length == otherData.length && this.lastModified == otherData.lastModified;
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   280
            }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   281
            return false;
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   282
        }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   283
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   284
        @Override
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   285
        public String toString() {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   286
            return new String(array());
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   287
        }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   288
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   289
        @Override
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   290
        public URL url() {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   291
            return url;
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   292
        }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   293
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   294
        @Override
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   295
        public int length() {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   296
            return length;
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   297
        }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   298
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   299
        @Override
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   300
        public long lastModified() {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   301
            return lastModified;
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   302
        }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   303
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   304
        @Override
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   305
        public char[] array() {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   306
            assert !isDeferred();
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   307
            return array;
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   308
        }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   309
25240
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   310
        @Override
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   311
        public boolean isEvalCode() {
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   312
            return false;
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   313
        }
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   314
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   315
        boolean isDeferred() {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   316
            return array == null;
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   317
        }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   318
25250
b5a4e0ac31d1 8047359: large string size RangeError should be thrown rather than reporting negative length
sundar
parents: 25240
diff changeset
   319
        @SuppressWarnings("try")
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   320
        protected void checkPermissionAndClose() throws IOException {
24993
b707d46bae40 8046898: Make sure that lazy compilation is the default, remove redundant "enable lazy compilation" flags, added warning message if compile logging is enabled and lazy is switched off. Verified existing test suite code coverage equivalence between lazy and eager.
lagergren
parents: 24881
diff changeset
   321
            try (InputStream in = url.openStream()) {
b707d46bae40 8046898: Make sure that lazy compilation is the default, remove redundant "enable lazy compilation" flags, added warning message if compile logging is enabled and lazy is switched off. Verified existing test suite code coverage equivalence between lazy and eager.
lagergren
parents: 24881
diff changeset
   322
                // empty
b707d46bae40 8046898: Make sure that lazy compilation is the default, remove redundant "enable lazy compilation" flags, added warning message if compile logging is enabled and lazy is switched off. Verified existing test suite code coverage equivalence between lazy and eager.
lagergren
parents: 24881
diff changeset
   323
            }
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   324
            debug("permission checked for ", url);
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   325
        }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   326
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   327
        protected void load() throws IOException {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   328
            if (array == null) {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   329
                final URLConnection c = url.openConnection();
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   330
                try (InputStream in = c.getInputStream()) {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   331
                    array = cs == null ? readFully(in) : readFully(in, cs);
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   332
                    length = array.length;
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   333
                    lastModified = c.getLastModified();
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   334
                    debug("loaded content for ", url);
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   335
                }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   336
            }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   337
        }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   338
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   339
        protected void loadMeta() throws IOException {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   340
            if (length == 0 && lastModified == 0) {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   341
                final URLConnection c = url.openConnection();
45725
083026107a26 8181105: Nashorn file descriptor leak
anazarov
parents: 39351
diff changeset
   342
                try (InputStream in = c.getInputStream()) {
083026107a26 8181105: Nashorn file descriptor leak
anazarov
parents: 39351
diff changeset
   343
                    length = c.getContentLength();
083026107a26 8181105: Nashorn file descriptor leak
anazarov
parents: 39351
diff changeset
   344
                    lastModified = c.getLastModified();
083026107a26 8181105: Nashorn file descriptor leak
anazarov
parents: 39351
diff changeset
   345
                    debug("loaded metadata for ", url);
083026107a26 8181105: Nashorn file descriptor leak
anazarov
parents: 39351
diff changeset
   346
                }
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   347
            }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   348
        }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   349
    }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   350
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   351
    private static class FileData extends URLData {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   352
        private final File file;
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   353
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   354
        private FileData(final File file, final Charset cs) {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   355
            super(getURLFromFile(file), cs);
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   356
            this.file = file;
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   357
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   358
        }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   359
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   360
        @Override
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   361
        protected void checkPermissionAndClose() throws IOException {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   362
            if (!file.canRead()) {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   363
                throw new FileNotFoundException(file + " (Permission Denied)");
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   364
            }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   365
            debug("permission checked for ", file);
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   366
        }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   367
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   368
        @Override
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   369
        protected void loadMeta() {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   370
            if (length == 0 && lastModified == 0) {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   371
                length = (int) file.length();
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   372
                lastModified = file.lastModified();
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   373
                debug("loaded metadata for ", file);
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   374
            }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   375
        }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   376
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   377
        @Override
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   378
        protected void load() throws IOException {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   379
            if (array == null) {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   380
                array = cs == null ? readFully(file) : readFully(file, cs);
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   381
                length = array.length;
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   382
                lastModified = file.lastModified();
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   383
                debug("loaded content for ", file);
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   384
            }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   385
        }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   386
    }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   387
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   388
    private static void debug(final Object... msg) {
24769
attila
parents: 24206
diff changeset
   389
        final DebugLogger logger = getLoggerStatic();
attila
parents: 24206
diff changeset
   390
        if (logger != null) {
attila
parents: 24206
diff changeset
   391
            logger.info(msg);
attila
parents: 24206
diff changeset
   392
        }
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   393
    }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   394
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   395
    private char[] data() {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   396
        return data.array();
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   397
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   398
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   399
    /**
24993
b707d46bae40 8046898: Make sure that lazy compilation is the default, remove redundant "enable lazy compilation" flags, added warning message if compile logging is enabled and lazy is switched off. Verified existing test suite code coverage equivalence between lazy and eager.
lagergren
parents: 24881
diff changeset
   400
     * Returns a Source instance
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   401
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   402
     * @param name    source name
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   403
     * @param content contents as char array
25240
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   404
     * @param isEval does this represent code from 'eval' call?
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   405
     * @return source instance
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   406
     */
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   407
    public static Source sourceFor(final String name, final char[] content, final boolean isEval) {
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   408
        return new Source(name, baseName(name), new RawData(content, isEval));
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   409
    }
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   410
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   411
    /**
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   412
     * Returns a Source instance
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   413
     *
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   414
     * @param name    source name
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   415
     * @param content contents as char array
24993
b707d46bae40 8046898: Make sure that lazy compilation is the default, remove redundant "enable lazy compilation" flags, added warning message if compile logging is enabled and lazy is switched off. Verified existing test suite code coverage equivalence between lazy and eager.
lagergren
parents: 24881
diff changeset
   416
     *
b707d46bae40 8046898: Make sure that lazy compilation is the default, remove redundant "enable lazy compilation" flags, added warning message if compile logging is enabled and lazy is switched off. Verified existing test suite code coverage equivalence between lazy and eager.
lagergren
parents: 24881
diff changeset
   417
     * @return source instance
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   418
     */
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   419
    public static Source sourceFor(final String name, final char[] content) {
25240
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   420
        return sourceFor(name, content, false);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   421
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   422
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   423
    /**
24993
b707d46bae40 8046898: Make sure that lazy compilation is the default, remove redundant "enable lazy compilation" flags, added warning message if compile logging is enabled and lazy is switched off. Verified existing test suite code coverage equivalence between lazy and eager.
lagergren
parents: 24881
diff changeset
   424
     * Returns a Source instance
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   425
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   426
     * @param name    source name
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   427
     * @param content contents as string
25240
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   428
     * @param isEval does this represent code from 'eval' call?
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   429
     * @return source instance
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   430
     */
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   431
    public static Source sourceFor(final String name, final String content, final boolean isEval) {
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   432
        return new Source(name, baseName(name), new RawData(content, isEval));
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   433
    }
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   434
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   435
    /**
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   436
     * Returns a Source instance
24993
b707d46bae40 8046898: Make sure that lazy compilation is the default, remove redundant "enable lazy compilation" flags, added warning message if compile logging is enabled and lazy is switched off. Verified existing test suite code coverage equivalence between lazy and eager.
lagergren
parents: 24881
diff changeset
   437
     *
25240
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   438
     * @param name    source name
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   439
     * @param content contents as string
24993
b707d46bae40 8046898: Make sure that lazy compilation is the default, remove redundant "enable lazy compilation" flags, added warning message if compile logging is enabled and lazy is switched off. Verified existing test suite code coverage equivalence between lazy and eager.
lagergren
parents: 24881
diff changeset
   440
     * @return source instance
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   441
     */
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   442
    public static Source sourceFor(final String name, final String content) {
25240
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   443
        return sourceFor(name, content, false);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   444
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   445
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   446
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   447
     * Constructor
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   448
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   449
     * @param name  source name
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   450
     * @param url   url from which source can be loaded
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   451
     *
24993
b707d46bae40 8046898: Make sure that lazy compilation is the default, remove redundant "enable lazy compilation" flags, added warning message if compile logging is enabled and lazy is switched off. Verified existing test suite code coverage equivalence between lazy and eager.
lagergren
parents: 24881
diff changeset
   452
     * @return source instance
b707d46bae40 8046898: Make sure that lazy compilation is the default, remove redundant "enable lazy compilation" flags, added warning message if compile logging is enabled and lazy is switched off. Verified existing test suite code coverage equivalence between lazy and eager.
lagergren
parents: 24881
diff changeset
   453
     *
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   454
     * @throws IOException if source cannot be loaded
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   455
     */
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   456
    public static Source sourceFor(final String name, final URL url) throws IOException {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   457
        return sourceFor(name, url, null);
18337
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   458
    }
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   459
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   460
    /**
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   461
     * Constructor
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   462
     *
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   463
     * @param name  source name
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   464
     * @param url   url from which source can be loaded
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   465
     * @param cs    Charset used to convert bytes to chars
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   466
     *
24993
b707d46bae40 8046898: Make sure that lazy compilation is the default, remove redundant "enable lazy compilation" flags, added warning message if compile logging is enabled and lazy is switched off. Verified existing test suite code coverage equivalence between lazy and eager.
lagergren
parents: 24881
diff changeset
   467
     * @return source instance
b707d46bae40 8046898: Make sure that lazy compilation is the default, remove redundant "enable lazy compilation" flags, added warning message if compile logging is enabled and lazy is switched off. Verified existing test suite code coverage equivalence between lazy and eager.
lagergren
parents: 24881
diff changeset
   468
     *
18337
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   469
     * @throws IOException if source cannot be loaded
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   470
     */
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   471
    public static Source sourceFor(final String name, final URL url, final Charset cs) throws IOException {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   472
        return sourceFor(name, baseURL(url), new URLData(url, cs));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   473
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   474
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   475
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   476
     * Constructor
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   477
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   478
     * @param name  source name
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   479
     * @param file  file from which source can be loaded
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   480
     *
24993
b707d46bae40 8046898: Make sure that lazy compilation is the default, remove redundant "enable lazy compilation" flags, added warning message if compile logging is enabled and lazy is switched off. Verified existing test suite code coverage equivalence between lazy and eager.
lagergren
parents: 24881
diff changeset
   481
     * @return source instance
b707d46bae40 8046898: Make sure that lazy compilation is the default, remove redundant "enable lazy compilation" flags, added warning message if compile logging is enabled and lazy is switched off. Verified existing test suite code coverage equivalence between lazy and eager.
lagergren
parents: 24881
diff changeset
   482
     *
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   483
     * @throws IOException if source cannot be loaded
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   484
     */
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   485
    public static Source sourceFor(final String name, final File file) throws IOException {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   486
        return sourceFor(name, file, null);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   487
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   488
18337
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   489
    /**
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   490
     * Constructor
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   491
     *
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   492
     * @param name  source name
29407
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 26249
diff changeset
   493
     * @param path  path from which source can be loaded
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 26249
diff changeset
   494
     *
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 26249
diff changeset
   495
     * @return source instance
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 26249
diff changeset
   496
     *
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 26249
diff changeset
   497
     * @throws IOException if source cannot be loaded
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 26249
diff changeset
   498
     */
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 26249
diff changeset
   499
    public static Source sourceFor(final String name, final Path path) throws IOException {
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 26249
diff changeset
   500
        File file = null;
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 26249
diff changeset
   501
        try {
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 26249
diff changeset
   502
            file = path.toFile();
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 26249
diff changeset
   503
        } catch (final UnsupportedOperationException uoe) {
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 26249
diff changeset
   504
        }
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 26249
diff changeset
   505
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 26249
diff changeset
   506
        if (file != null) {
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 26249
diff changeset
   507
            return sourceFor(name, file);
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 26249
diff changeset
   508
        } else {
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 26249
diff changeset
   509
            return sourceFor(name, Files.newBufferedReader(path));
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 26249
diff changeset
   510
        }
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 26249
diff changeset
   511
    }
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 26249
diff changeset
   512
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 26249
diff changeset
   513
    /**
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 26249
diff changeset
   514
     * Constructor
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 26249
diff changeset
   515
     *
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 26249
diff changeset
   516
     * @param name  source name
18337
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   517
     * @param file  file from which source can be loaded
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   518
     * @param cs    Charset used to convert bytes to chars
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   519
     *
24993
b707d46bae40 8046898: Make sure that lazy compilation is the default, remove redundant "enable lazy compilation" flags, added warning message if compile logging is enabled and lazy is switched off. Verified existing test suite code coverage equivalence between lazy and eager.
lagergren
parents: 24881
diff changeset
   520
     * @return source instance
b707d46bae40 8046898: Make sure that lazy compilation is the default, remove redundant "enable lazy compilation" flags, added warning message if compile logging is enabled and lazy is switched off. Verified existing test suite code coverage equivalence between lazy and eager.
lagergren
parents: 24881
diff changeset
   521
     *
18337
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   522
     * @throws IOException if source cannot be loaded
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   523
     */
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   524
    public static Source sourceFor(final String name, final File file, final Charset cs) throws IOException {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   525
        final File absFile = file.getAbsoluteFile();
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   526
        return sourceFor(name, dirName(absFile, null), new FileData(file, cs));
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   527
    }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   528
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   529
    /**
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   530
     * Returns an instance
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   531
     *
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   532
     * @param name source name
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   533
     * @param reader reader from which source can be loaded
24993
b707d46bae40 8046898: Make sure that lazy compilation is the default, remove redundant "enable lazy compilation" flags, added warning message if compile logging is enabled and lazy is switched off. Verified existing test suite code coverage equivalence between lazy and eager.
lagergren
parents: 24881
diff changeset
   534
     *
b707d46bae40 8046898: Make sure that lazy compilation is the default, remove redundant "enable lazy compilation" flags, added warning message if compile logging is enabled and lazy is switched off. Verified existing test suite code coverage equivalence between lazy and eager.
lagergren
parents: 24881
diff changeset
   535
     * @return source instance
b707d46bae40 8046898: Make sure that lazy compilation is the default, remove redundant "enable lazy compilation" flags, added warning message if compile logging is enabled and lazy is switched off. Verified existing test suite code coverage equivalence between lazy and eager.
lagergren
parents: 24881
diff changeset
   536
     *
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   537
     * @throws IOException if source cannot be loaded
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   538
     */
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   539
    public static Source sourceFor(final String name, final Reader reader) throws IOException {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   540
        // Extract URL from URLReader to defer loading and reuse cached data if available.
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   541
        if (reader instanceof URLReader) {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   542
            final URLReader urlReader = (URLReader) reader;
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   543
            return sourceFor(name, urlReader.getURL(), urlReader.getCharset());
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   544
        }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   545
        return new Source(name, baseName(name), new RawData(reader));
18337
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   546
    }
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   547
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   548
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   549
    public boolean equals(final Object obj) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   550
        if (this == obj) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   551
            return true;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   552
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   553
        if (!(obj instanceof Source)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   554
            return false;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   555
        }
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   556
        final Source other = (Source) obj;
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   557
        return Objects.equals(name, other.name) && data.equals(other.data);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   558
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   559
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   560
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   561
    public int hashCode() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   562
        int h = hash;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   563
        if (h == 0) {
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   564
            h = hash = data.hashCode() ^ Objects.hashCode(name);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   565
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   566
        return h;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   567
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   568
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   569
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   570
     * Fetch source content.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   571
     * @return Source content.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   572
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   573
    public String getString() {
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   574
        return data.toString();
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   575
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   576
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   577
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   578
     * Get the user supplied name of this script.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   579
     * @return User supplied source name.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   580
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   581
    public String getName() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   582
        return name;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   583
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   584
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   585
    /**
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   586
     * Get the last modified time of this script.
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   587
     * @return Last modified time.
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   588
     */
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   589
    public long getLastModified() {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   590
        return data.lastModified();
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   591
    }
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   592
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   593
    /**
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   594
     * Get the "directory" part of the file or "base" of the URL.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   595
     * @return base of file or URL.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   596
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   597
    public String getBase() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   598
        return base;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   599
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   600
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   601
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   602
     * Fetch a portion of source content.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   603
     * @param start start index in source
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   604
     * @param len length of portion
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   605
     * @return Source content portion.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   606
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   607
    public String getString(final int start, final int len) {
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   608
        return new String(data(), start, len);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   609
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   610
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   611
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   612
     * Fetch a portion of source content associated with a token.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   613
     * @param token Token descriptor.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   614
     * @return Source content portion.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   615
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   616
    public String getString(final long token) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   617
        final int start = Token.descPosition(token);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   618
        final int len = Token.descLength(token);
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   619
        return new String(data(), start, len);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   620
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   621
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   622
    /**
16230
c38c724d82e7 8008103: Source object should maintain URL of the script source as a private field
sundar
parents: 16151
diff changeset
   623
     * Returns the source URL of this script Source. Can be null if Source
c38c724d82e7 8008103: Source object should maintain URL of the script source as a private field
sundar
parents: 16151
diff changeset
   624
     * was created from a String or a char[].
c38c724d82e7 8008103: Source object should maintain URL of the script source as a private field
sundar
parents: 16151
diff changeset
   625
     *
c38c724d82e7 8008103: Source object should maintain URL of the script source as a private field
sundar
parents: 16151
diff changeset
   626
     * @return URL source or null
c38c724d82e7 8008103: Source object should maintain URL of the script source as a private field
sundar
parents: 16151
diff changeset
   627
     */
c38c724d82e7 8008103: Source object should maintain URL of the script source as a private field
sundar
parents: 16151
diff changeset
   628
    public URL getURL() {
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   629
        return data.url();
16230
c38c724d82e7 8008103: Source object should maintain URL of the script source as a private field
sundar
parents: 16151
diff changeset
   630
    }
c38c724d82e7 8008103: Source object should maintain URL of the script source as a private field
sundar
parents: 16151
diff changeset
   631
c38c724d82e7 8008103: Source object should maintain URL of the script source as a private field
sundar
parents: 16151
diff changeset
   632
    /**
26055
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 25255
diff changeset
   633
     * Get explicit source URL.
29407
3fd4ede1581e 8074671: Nashorn Parser API
sundar
parents: 26249
diff changeset
   634
     * @return URL set via sourceURL directive
26055
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 25255
diff changeset
   635
     */
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 25255
diff changeset
   636
    public String getExplicitURL() {
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 25255
diff changeset
   637
        return explicitURL;
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 25255
diff changeset
   638
    }
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 25255
diff changeset
   639
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 25255
diff changeset
   640
    /**
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 25255
diff changeset
   641
     * Set explicit source URL.
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 25255
diff changeset
   642
     * @param explicitURL URL set via sourceURL directive
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 25255
diff changeset
   643
     */
26067
b32ccc3a76c9 8055199: Tidy up Nashorn codebase for code standards (August 2014)
attila
parents: 26055
diff changeset
   644
    public void setExplicitURL(final String explicitURL) {
26055
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 25255
diff changeset
   645
        this.explicitURL = explicitURL;
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 25255
diff changeset
   646
    }
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 25255
diff changeset
   647
fe8be844ba50 8043956: Make code caching work with optimistic typing and lazy compilation
hannesw
parents: 25255
diff changeset
   648
    /**
25240
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   649
     * Returns whether this source was submitted via 'eval' call or not.
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   650
     *
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   651
     * @return true if this source represents code submitted via 'eval'
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   652
     */
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   653
    public boolean isEvalCode() {
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   654
        return data.isEvalCode();
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   655
    }
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   656
f92c14b1ca11 8047959: bindings created for declarations in eval code are not mutable
sundar
parents: 24993
diff changeset
   657
    /**
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   658
     * Find the beginning of the line containing position.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   659
     * @param position Index to offending token.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   660
     * @return Index of first character of line.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   661
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   662
    private int findBOLN(final int position) {
24993
b707d46bae40 8046898: Make sure that lazy compilation is the default, remove redundant "enable lazy compilation" flags, added warning message if compile logging is enabled and lazy is switched off. Verified existing test suite code coverage equivalence between lazy and eager.
lagergren
parents: 24881
diff changeset
   663
        final char[] d = data();
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   664
        for (int i = position - 1; i > 0; i--) {
24993
b707d46bae40 8046898: Make sure that lazy compilation is the default, remove redundant "enable lazy compilation" flags, added warning message if compile logging is enabled and lazy is switched off. Verified existing test suite code coverage equivalence between lazy and eager.
lagergren
parents: 24881
diff changeset
   665
            final char ch = d[i];
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   666
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   667
            if (ch == '\n' || ch == '\r') {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   668
                return i + 1;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   669
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   670
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   671
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   672
        return 0;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   673
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   674
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   675
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   676
     * Find the end of the line containing position.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   677
     * @param position Index to offending token.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   678
     * @return Index of last character of line.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   679
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   680
    private int findEOLN(final int position) {
24993
b707d46bae40 8046898: Make sure that lazy compilation is the default, remove redundant "enable lazy compilation" flags, added warning message if compile logging is enabled and lazy is switched off. Verified existing test suite code coverage equivalence between lazy and eager.
lagergren
parents: 24881
diff changeset
   681
        final char[] d = data();
b707d46bae40 8046898: Make sure that lazy compilation is the default, remove redundant "enable lazy compilation" flags, added warning message if compile logging is enabled and lazy is switched off. Verified existing test suite code coverage equivalence between lazy and eager.
lagergren
parents: 24881
diff changeset
   682
        final int length = d.length;
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   683
        for (int i = position; i < length; i++) {
24993
b707d46bae40 8046898: Make sure that lazy compilation is the default, remove redundant "enable lazy compilation" flags, added warning message if compile logging is enabled and lazy is switched off. Verified existing test suite code coverage equivalence between lazy and eager.
lagergren
parents: 24881
diff changeset
   684
            final char ch = d[i];
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   685
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   686
            if (ch == '\n' || ch == '\r') {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   687
                return i - 1;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   688
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   689
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   690
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   691
        return length - 1;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   692
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   693
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   694
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   695
     * Return line number of character position.
20559
9244eb6d195b 8025515: Performance issues with Source.getLine()
hannesw
parents: 20210
diff changeset
   696
     *
9244eb6d195b 8025515: Performance issues with Source.getLine()
hannesw
parents: 20210
diff changeset
   697
     * <p>This method can be expensive for large sources as it iterates through
9244eb6d195b 8025515: Performance issues with Source.getLine()
hannesw
parents: 20210
diff changeset
   698
     * all characters up to {@code position}.</p>
9244eb6d195b 8025515: Performance issues with Source.getLine()
hannesw
parents: 20210
diff changeset
   699
     *
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   700
     * @param position Position of character in source content.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   701
     * @return Line number.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   702
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   703
    public int getLine(final int position) {
24993
b707d46bae40 8046898: Make sure that lazy compilation is the default, remove redundant "enable lazy compilation" flags, added warning message if compile logging is enabled and lazy is switched off. Verified existing test suite code coverage equivalence between lazy and eager.
lagergren
parents: 24881
diff changeset
   704
        final char[] d = data();
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   705
        // Line count starts at 1.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   706
        int line = 1;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   707
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   708
        for (int i = 0; i < position; i++) {
24993
b707d46bae40 8046898: Make sure that lazy compilation is the default, remove redundant "enable lazy compilation" flags, added warning message if compile logging is enabled and lazy is switched off. Verified existing test suite code coverage equivalence between lazy and eager.
lagergren
parents: 24881
diff changeset
   709
            final char ch = d[i];
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   710
            // Works for both \n and \r\n.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   711
            if (ch == '\n') {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   712
                line++;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   713
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   714
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   715
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   716
        return line;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   717
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   718
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   719
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   720
     * Return column number of character position.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   721
     * @param position Position of character in source content.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   722
     * @return Column number.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   723
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   724
    public int getColumn(final int position) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   725
        // TODO - column needs to account for tabs.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   726
        return position - findBOLN(position);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   727
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   728
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   729
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   730
     * Return line text including character position.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   731
     * @param position Position of character in source content.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   732
     * @return Line text.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   733
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   734
    public String getSourceLine(final int position) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   735
        // Find end of previous line.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   736
        final int first = findBOLN(position);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   737
        // Find end of this line.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   738
        final int last = findEOLN(position);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   739
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   740
        return new String(data(), first, last - first + 1);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   741
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   742
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   743
    /**
26249
5fbbd38ebc5b 8056052: Source.getContent() does excess Object.clone()
attila
parents: 26068
diff changeset
   744
     * Get the content of this source as a char array. Note that the underlying array is returned instead of a
5fbbd38ebc5b 8056052: Source.getContent() does excess Object.clone()
attila
parents: 26068
diff changeset
   745
     * clone; modifying the char array will cause modification to the source; this should not be done. While
5fbbd38ebc5b 8056052: Source.getContent() does excess Object.clone()
attila
parents: 26068
diff changeset
   746
     * there is an apparent danger that we allow unfettered access to an underlying mutable array, the
5fbbd38ebc5b 8056052: Source.getContent() does excess Object.clone()
attila
parents: 26068
diff changeset
   747
     * {@code Source} class is in a restricted {@code jdk.nashorn.internal.*} package and as such it is
5fbbd38ebc5b 8056052: Source.getContent() does excess Object.clone()
attila
parents: 26068
diff changeset
   748
     * inaccessible by external actors in an environment with a security manager. Returning a clone would be
5fbbd38ebc5b 8056052: Source.getContent() does excess Object.clone()
attila
parents: 26068
diff changeset
   749
     * detrimental to performance.
5fbbd38ebc5b 8056052: Source.getContent() does excess Object.clone()
attila
parents: 26068
diff changeset
   750
     * @return content the content of this source as a char array
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   751
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   752
    public char[] getContent() {
26249
5fbbd38ebc5b 8056052: Source.getContent() does excess Object.clone()
attila
parents: 26068
diff changeset
   753
        return data();
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   754
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   755
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   756
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   757
     * Get the length in chars for this source
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   758
     * @return length
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   759
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   760
    public int getLength() {
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   761
        return data.length();
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   762
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   763
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   764
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   765
     * Read all of the source until end of file. Return it as char array
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   766
     *
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   767
     * @param reader reader opened to source stream
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   768
     * @return source as content
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   769
     * @throws IOException if source could not be read
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   770
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   771
    public static char[] readFully(final Reader reader) throws IOException {
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   772
        final char[]        arr = new char[BUF_SIZE];
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   773
        final StringBuilder sb  = new StringBuilder();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   774
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   775
        try {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   776
            int numChars;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   777
            while ((numChars = reader.read(arr, 0, arr.length)) > 0) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   778
                sb.append(arr, 0, numChars);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   779
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   780
        } finally {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   781
            reader.close();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   782
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   783
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   784
        return sb.toString().toCharArray();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   785
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   786
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   787
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   788
     * Read all of the source until end of file. Return it as char array
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   789
     *
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   790
     * @param file source file
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   791
     * @return source as content
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   792
     * @throws IOException if source could not be read
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   793
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   794
    public static char[] readFully(final File file) throws IOException {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   795
        if (!file.isFile()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   796
            throw new IOException(file + " is not a file"); //TODO localize?
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   797
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   798
        return byteToCharArray(Files.readAllBytes(file.toPath()));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   799
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   800
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   801
    /**
18337
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   802
     * Read all of the source until end of file. Return it as char array
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   803
     *
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   804
     * @param file source file
18337
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   805
     * @param cs Charset used to convert bytes to chars
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   806
     * @return source as content
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   807
     * @throws IOException if source could not be read
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   808
     */
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   809
    public static char[] readFully(final File file, final Charset cs) throws IOException {
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   810
        if (!file.isFile()) {
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   811
            throw new IOException(file + " is not a file"); //TODO localize?
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   812
        }
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   813
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   814
        final byte[] buf = Files.readAllBytes(file.toPath());
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   815
        return (cs != null) ? new String(buf, cs).toCharArray() : byteToCharArray(buf);
18337
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   816
    }
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   817
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   818
    /**
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   819
     * Read all of the source until end of stream from the given URL. Return it as char array
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   820
     *
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   821
     * @param url URL to read content from
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   822
     * @return source as content
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   823
     * @throws IOException if source could not be read
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   824
     */
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   825
    public static char[] readFully(final URL url) throws IOException {
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   826
        return readFully(url.openStream());
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   827
    }
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   828
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   829
    /**
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   830
     * Read all of the source until end of file. Return it as char array
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   831
     *
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   832
     * @param url URL to read content from
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   833
     * @param cs Charset used to convert bytes to chars
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   834
     * @return source as content
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   835
     * @throws IOException if source could not be read
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   836
     */
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   837
    public static char[] readFully(final URL url, final Charset cs) throws IOException {
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   838
        return readFully(url.openStream(), cs);
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   839
    }
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   840
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   841
    /**
25255
cf56cdc2c663 8049225: Source class exposes public mutable array
attila
parents: 25250
diff changeset
   842
     * Get a Base64-encoded SHA1 digest for this source.
23767
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 20559
diff changeset
   843
     *
25255
cf56cdc2c663 8049225: Source class exposes public mutable array
attila
parents: 25250
diff changeset
   844
     * @return a Base64-encoded SHA1 digest for this source
23767
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 20559
diff changeset
   845
     */
25255
cf56cdc2c663 8049225: Source class exposes public mutable array
attila
parents: 25250
diff changeset
   846
    public String getDigest() {
cf56cdc2c663 8049225: Source class exposes public mutable array
attila
parents: 25250
diff changeset
   847
        return new String(getDigestBytes(), StandardCharsets.US_ASCII);
cf56cdc2c663 8049225: Source class exposes public mutable array
attila
parents: 25250
diff changeset
   848
    }
cf56cdc2c663 8049225: Source class exposes public mutable array
attila
parents: 25250
diff changeset
   849
cf56cdc2c663 8049225: Source class exposes public mutable array
attila
parents: 25250
diff changeset
   850
    private byte[] getDigestBytes() {
cf56cdc2c663 8049225: Source class exposes public mutable array
attila
parents: 25250
diff changeset
   851
        byte[] ldigest = digest;
cf56cdc2c663 8049225: Source class exposes public mutable array
attila
parents: 25250
diff changeset
   852
        if (ldigest == null) {
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   853
            final char[] content = data();
23767
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 20559
diff changeset
   854
            final byte[] bytes = new byte[content.length * 2];
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 20559
diff changeset
   855
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 20559
diff changeset
   856
            for (int i = 0; i < content.length; i++) {
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 20559
diff changeset
   857
                bytes[i * 2]     = (byte)  (content[i] & 0x00ff);
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 20559
diff changeset
   858
                bytes[i * 2 + 1] = (byte) ((content[i] & 0xff00) >> 8);
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 20559
diff changeset
   859
            }
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 20559
diff changeset
   860
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 20559
diff changeset
   861
            try {
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 20559
diff changeset
   862
                final MessageDigest md = MessageDigest.getInstance("SHA-1");
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 20559
diff changeset
   863
                if (name != null) {
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 20559
diff changeset
   864
                    md.update(name.getBytes(StandardCharsets.UTF_8));
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 20559
diff changeset
   865
                }
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 20559
diff changeset
   866
                if (base != null) {
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 20559
diff changeset
   867
                    md.update(base.getBytes(StandardCharsets.UTF_8));
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 20559
diff changeset
   868
                }
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   869
                if (getURL() != null) {
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   870
                    md.update(getURL().toString().getBytes(StandardCharsets.UTF_8));
23767
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 20559
diff changeset
   871
                }
25255
cf56cdc2c663 8049225: Source class exposes public mutable array
attila
parents: 25250
diff changeset
   872
                digest = ldigest = BASE64.encode(md.digest(bytes));
24778
2ff5d7041566 8044638: Tidy up Nashorn codebase for code standards
attila
parents: 24769
diff changeset
   873
            } catch (final NoSuchAlgorithmException e) {
23767
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 20559
diff changeset
   874
                throw new RuntimeException(e);
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 20559
diff changeset
   875
            }
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 20559
diff changeset
   876
        }
25255
cf56cdc2c663 8049225: Source class exposes public mutable array
attila
parents: 25250
diff changeset
   877
        return ldigest;
23767
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 20559
diff changeset
   878
    }
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 20559
diff changeset
   879
7c0614b75e23 8038638: Persistent store for compiled scripts
hannesw
parents: 20559
diff changeset
   880
    /**
39351
a049c96353ae 8160435: Source.baseURL is slow for URLs with unregistered protocol
hannesw
parents: 36517
diff changeset
   881
     * Returns the base directory or URL for the given URL. Used to implement __DIR__.
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   882
     * @param url a URL
39351
a049c96353ae 8160435: Source.baseURL is slow for URLs with unregistered protocol
hannesw
parents: 36517
diff changeset
   883
     * @return base path or URL, or null if argument is not a hierarchical URL
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   884
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   885
    public static String baseURL(final URL url) {
39351
a049c96353ae 8160435: Source.baseURL is slow for URLs with unregistered protocol
hannesw
parents: 36517
diff changeset
   886
        try {
a049c96353ae 8160435: Source.baseURL is slow for URLs with unregistered protocol
hannesw
parents: 36517
diff changeset
   887
            final URI uri = url.toURI();
a049c96353ae 8160435: Source.baseURL is slow for URLs with unregistered protocol
hannesw
parents: 36517
diff changeset
   888
a049c96353ae 8160435: Source.baseURL is slow for URLs with unregistered protocol
hannesw
parents: 36517
diff changeset
   889
            if (uri.getScheme().equals("file")) {
a049c96353ae 8160435: Source.baseURL is slow for URLs with unregistered protocol
hannesw
parents: 36517
diff changeset
   890
                final Path path = Paths.get(uri);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   891
                final Path parent = path.getParent();
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   892
                return (parent != null) ? (parent + File.separator) : null;
39351
a049c96353ae 8160435: Source.baseURL is slow for URLs with unregistered protocol
hannesw
parents: 36517
diff changeset
   893
            }
a049c96353ae 8160435: Source.baseURL is slow for URLs with unregistered protocol
hannesw
parents: 36517
diff changeset
   894
            if (uri.isOpaque() || uri.getPath() == null || uri.getPath().isEmpty()) {
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   895
                return null;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   896
            }
39351
a049c96353ae 8160435: Source.baseURL is slow for URLs with unregistered protocol
hannesw
parents: 36517
diff changeset
   897
            return uri.resolve("").toString();
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   898
39351
a049c96353ae 8160435: Source.baseURL is slow for URLs with unregistered protocol
hannesw
parents: 36517
diff changeset
   899
        } catch (final SecurityException | URISyntaxException | IOError e) {
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   900
            return null;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   901
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   902
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   903
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   904
    private static String dirName(final File file, final String DEFAULT_BASE_NAME) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   905
        final String res = file.getParent();
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   906
        return (res != null) ? (res + File.separator) : DEFAULT_BASE_NAME;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   907
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   908
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   909
    // fake directory like name
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   910
    private static String baseName(final String name) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   911
        int idx = name.lastIndexOf('/');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   912
        if (idx == -1) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   913
            idx = name.lastIndexOf('\\');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   914
        }
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   915
        return (idx != -1) ? name.substring(0, idx + 1) : null;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   916
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   917
18337
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   918
    private static char[] readFully(final InputStream is, final Charset cs) throws IOException {
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   919
        return (cs != null) ? new String(readBytes(is), cs).toCharArray() : readFully(is);
18337
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   920
    }
effcb00fcf58 8008915: URLReader constructor should allow specifying encoding
sundar
parents: 16241
diff changeset
   921
36517
41a1c20eb619 8142968: Module System implementation
alanb
parents: 31549
diff changeset
   922
    public static char[] readFully(final InputStream is) throws IOException {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   923
        return byteToCharArray(readBytes(is));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   924
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   925
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   926
    private static char[] byteToCharArray(final byte[] bytes) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   927
        Charset cs = StandardCharsets.UTF_8;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   928
        int start = 0;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   929
        // BOM detection.
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   930
        if (bytes.length > 1 && bytes[0] == (byte) 0xFE && bytes[1] == (byte) 0xFF) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   931
            start = 2;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   932
            cs = StandardCharsets.UTF_16BE;
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   933
        } else if (bytes.length > 1 && bytes[0] == (byte) 0xFF && bytes[1] == (byte) 0xFE) {
30974
b7c26088b58c 8066218: UTF-32LE mistakenly detected as UTF-16LE
attila
parents: 30513
diff changeset
   934
            if (bytes.length > 3 && bytes[2] == 0 && bytes[3] == 0) {
b7c26088b58c 8066218: UTF-32LE mistakenly detected as UTF-16LE
attila
parents: 30513
diff changeset
   935
                start = 4;
b7c26088b58c 8066218: UTF-32LE mistakenly detected as UTF-16LE
attila
parents: 30513
diff changeset
   936
                cs = Charset.forName("UTF-32LE");
b7c26088b58c 8066218: UTF-32LE mistakenly detected as UTF-16LE
attila
parents: 30513
diff changeset
   937
            } else {
b7c26088b58c 8066218: UTF-32LE mistakenly detected as UTF-16LE
attila
parents: 30513
diff changeset
   938
                start = 2;
b7c26088b58c 8066218: UTF-32LE mistakenly detected as UTF-16LE
attila
parents: 30513
diff changeset
   939
                cs = StandardCharsets.UTF_16LE;
b7c26088b58c 8066218: UTF-32LE mistakenly detected as UTF-16LE
attila
parents: 30513
diff changeset
   940
            }
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   941
        } else if (bytes.length > 2 && bytes[0] == (byte) 0xEF && bytes[1] == (byte) 0xBB && bytes[2] == (byte) 0xBF) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   942
            start = 3;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   943
            cs = StandardCharsets.UTF_8;
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   944
        } else if (bytes.length > 3 && bytes[0] == 0 && bytes[1] == 0 && bytes[2] == (byte) 0xFE && bytes[3] == (byte) 0xFF) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   945
            start = 4;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   946
            cs = Charset.forName("UTF-32BE");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   947
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   948
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   949
        return new String(bytes, start, bytes.length - start, cs).toCharArray();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   950
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   951
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   952
    static byte[] readBytes(final InputStream is) throws IOException {
24206
40c6d45af73f 8040078: Avoid repeated reading of source for cached loads
hannesw
parents: 23767
diff changeset
   953
        final byte[] arr = new byte[BUF_SIZE];
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   954
        try {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   955
            try (ByteArrayOutputStream buf = new ByteArrayOutputStream()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   956
                int numBytes;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   957
                while ((numBytes = is.read(arr, 0, arr.length)) > 0) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   958
                    buf.write(arr, 0, numBytes);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   959
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   960
                return buf.toByteArray();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   961
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   962
        } finally {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   963
            is.close();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   964
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   965
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   966
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   967
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   968
    public String toString() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   969
        return getName();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   970
    }
16230
c38c724d82e7 8008103: Source object should maintain URL of the script source as a private field
sundar
parents: 16151
diff changeset
   971
c38c724d82e7 8008103: Source object should maintain URL of the script source as a private field
sundar
parents: 16151
diff changeset
   972
    private static URL getURLFromFile(final File file) {
c38c724d82e7 8008103: Source object should maintain URL of the script source as a private field
sundar
parents: 16151
diff changeset
   973
        try {
c38c724d82e7 8008103: Source object should maintain URL of the script source as a private field
sundar
parents: 16151
diff changeset
   974
            return file.toURI().toURL();
c38c724d82e7 8008103: Source object should maintain URL of the script source as a private field
sundar
parents: 16151
diff changeset
   975
        } catch (final SecurityException | MalformedURLException ignored) {
c38c724d82e7 8008103: Source object should maintain URL of the script source as a private field
sundar
parents: 16151
diff changeset
   976
            return null;
c38c724d82e7 8008103: Source object should maintain URL of the script source as a private field
sundar
parents: 16151
diff changeset
   977
        }
c38c724d82e7 8008103: Source object should maintain URL of the script source as a private field
sundar
parents: 16151
diff changeset
   978
    }
24769
attila
parents: 24206
diff changeset
   979
attila
parents: 24206
diff changeset
   980
    private static DebugLogger getLoggerStatic() {
attila
parents: 24206
diff changeset
   981
        final Context context = Context.getContextTrustedOrNull();
attila
parents: 24206
diff changeset
   982
        return context == null ? null : context.getLogger(Source.class);
attila
parents: 24206
diff changeset
   983
    }
attila
parents: 24206
diff changeset
   984
attila
parents: 24206
diff changeset
   985
    @Override
24778
2ff5d7041566 8044638: Tidy up Nashorn codebase for code standards
attila
parents: 24769
diff changeset
   986
    public DebugLogger initLogger(final Context context) {
24769
attila
parents: 24206
diff changeset
   987
        return context.getLogger(this.getClass());
attila
parents: 24206
diff changeset
   988
    }
attila
parents: 24206
diff changeset
   989
attila
parents: 24206
diff changeset
   990
    @Override
attila
parents: 24206
diff changeset
   991
    public DebugLogger getLogger() {
attila
parents: 24206
diff changeset
   992
        return initLogger(Context.getContextTrusted());
attila
parents: 24206
diff changeset
   993
    }
30513
14cefab8350f 8080090: -d option should dump script source as well
sundar
parents: 29407
diff changeset
   994
31546
c1ae3f297a28 8130424: if directory specified with --dest-dir does not exist, only .class files are dumped and .js files are not
sundar
parents: 30974
diff changeset
   995
    private File dumpFile(final File dirFile) {
30513
14cefab8350f 8080090: -d option should dump script source as well
sundar
parents: 29407
diff changeset
   996
        final URL u = getURL();
14cefab8350f 8080090: -d option should dump script source as well
sundar
parents: 29407
diff changeset
   997
        final StringBuilder buf = new StringBuilder();
14cefab8350f 8080090: -d option should dump script source as well
sundar
parents: 29407
diff changeset
   998
        // make it unique by prefixing current date & time
14cefab8350f 8080090: -d option should dump script source as well
sundar
parents: 29407
diff changeset
   999
        buf.append(LocalDateTime.now().toString());
14cefab8350f 8080090: -d option should dump script source as well
sundar
parents: 29407
diff changeset
  1000
        buf.append('_');
14cefab8350f 8080090: -d option should dump script source as well
sundar
parents: 29407
diff changeset
  1001
        if (u != null) {
14cefab8350f 8080090: -d option should dump script source as well
sundar
parents: 29407
diff changeset
  1002
            // make it a safe file name
14cefab8350f 8080090: -d option should dump script source as well
sundar
parents: 29407
diff changeset
  1003
            buf.append(u.toString()
14cefab8350f 8080090: -d option should dump script source as well
sundar
parents: 29407
diff changeset
  1004
                    .replace('/', '_')
14cefab8350f 8080090: -d option should dump script source as well
sundar
parents: 29407
diff changeset
  1005
                    .replace('\\', '_'));
14cefab8350f 8080090: -d option should dump script source as well
sundar
parents: 29407
diff changeset
  1006
        } else {
14cefab8350f 8080090: -d option should dump script source as well
sundar
parents: 29407
diff changeset
  1007
            buf.append(getName());
14cefab8350f 8080090: -d option should dump script source as well
sundar
parents: 29407
diff changeset
  1008
        }
14cefab8350f 8080090: -d option should dump script source as well
sundar
parents: 29407
diff changeset
  1009
31546
c1ae3f297a28 8130424: if directory specified with --dest-dir does not exist, only .class files are dumped and .js files are not
sundar
parents: 30974
diff changeset
  1010
        return new File(dirFile, buf.toString());
30513
14cefab8350f 8080090: -d option should dump script source as well
sundar
parents: 29407
diff changeset
  1011
    }
14cefab8350f 8080090: -d option should dump script source as well
sundar
parents: 29407
diff changeset
  1012
14cefab8350f 8080090: -d option should dump script source as well
sundar
parents: 29407
diff changeset
  1013
    void dump(final String dir) {
31546
c1ae3f297a28 8130424: if directory specified with --dest-dir does not exist, only .class files are dumped and .js files are not
sundar
parents: 30974
diff changeset
  1014
        final File dirFile = new File(dir);
c1ae3f297a28 8130424: if directory specified with --dest-dir does not exist, only .class files are dumped and .js files are not
sundar
parents: 30974
diff changeset
  1015
        final File file = dumpFile(dirFile);
c1ae3f297a28 8130424: if directory specified with --dest-dir does not exist, only .class files are dumped and .js files are not
sundar
parents: 30974
diff changeset
  1016
        if (!dirFile.exists() && !dirFile.mkdirs()) {
c1ae3f297a28 8130424: if directory specified with --dest-dir does not exist, only .class files are dumped and .js files are not
sundar
parents: 30974
diff changeset
  1017
            debug("Skipping source dump for " + name);
c1ae3f297a28 8130424: if directory specified with --dest-dir does not exist, only .class files are dumped and .js files are not
sundar
parents: 30974
diff changeset
  1018
            return;
c1ae3f297a28 8130424: if directory specified with --dest-dir does not exist, only .class files are dumped and .js files are not
sundar
parents: 30974
diff changeset
  1019
        }
c1ae3f297a28 8130424: if directory specified with --dest-dir does not exist, only .class files are dumped and .js files are not
sundar
parents: 30974
diff changeset
  1020
30513
14cefab8350f 8080090: -d option should dump script source as well
sundar
parents: 29407
diff changeset
  1021
        try (final FileOutputStream fos = new FileOutputStream(file)) {
14cefab8350f 8080090: -d option should dump script source as well
sundar
parents: 29407
diff changeset
  1022
            final PrintWriter pw = new PrintWriter(fos);
14cefab8350f 8080090: -d option should dump script source as well
sundar
parents: 29407
diff changeset
  1023
            pw.print(data.toString());
14cefab8350f 8080090: -d option should dump script source as well
sundar
parents: 29407
diff changeset
  1024
            pw.flush();
14cefab8350f 8080090: -d option should dump script source as well
sundar
parents: 29407
diff changeset
  1025
        } catch (final IOException ioExp) {
14cefab8350f 8080090: -d option should dump script source as well
sundar
parents: 29407
diff changeset
  1026
            debug("Skipping source dump for " +
14cefab8350f 8080090: -d option should dump script source as well
sundar
parents: 29407
diff changeset
  1027
                    name +
14cefab8350f 8080090: -d option should dump script source as well
sundar
parents: 29407
diff changeset
  1028
                    ": " +
14cefab8350f 8080090: -d option should dump script source as well
sundar
parents: 29407
diff changeset
  1029
                    ECMAErrors.getMessage(
14cefab8350f 8080090: -d option should dump script source as well
sundar
parents: 29407
diff changeset
  1030
                        "io.error.cant.write",
31549
b627094c5649 8130734: Apply transformations found by netbeans Refactor->Inspect and transform menu
sundar
parents: 31546
diff changeset
  1031
                        dir +
30513
14cefab8350f 8080090: -d option should dump script source as well
sundar
parents: 29407
diff changeset
  1032
                        " : " + ioExp.toString()));
14cefab8350f 8080090: -d option should dump script source as well
sundar
parents: 29407
diff changeset
  1033
        }
14cefab8350f 8080090: -d option should dump script source as well
sundar
parents: 29407
diff changeset
  1034
    }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1035
}