nashorn/src/jdk/nashorn/internal/objects/Global.java
author sundar
Tue, 15 Jul 2014 16:54:01 +0530
changeset 25585 0968d8ab046a
parent 25423 ca63828cf996
child 25821 fbb51e67d2a7
permissions -rw-r--r--
8050432: javax.script.filename variable should not be enumerable with nashorn engine's ENGINE_SCOPE bindings Reviewed-by: jlaskey
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     1
/*
16151
97c1e756ae1e 8005663: Update copyright year to 2013
jlaskey
parents: 16147
diff changeset
     2
 * Copyright (c) 2010, 2013, 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.objects;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    27
24738
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
    28
import static jdk.nashorn.internal.codegen.CompilerConstants.staticCall;
18610
9a052996a7b7 8017260: adjust lookup code in objects.* classes
sundar
parents: 18328
diff changeset
    29
import static jdk.nashorn.internal.lookup.Lookup.MH;
25422
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
    30
import static jdk.nashorn.internal.runtime.ECMAErrors.referenceError;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    31
import static jdk.nashorn.internal.runtime.ECMAErrors.typeError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    32
import static jdk.nashorn.internal.runtime.ScriptRuntime.UNDEFINED;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    33
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    34
import java.io.IOException;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    35
import java.io.PrintWriter;
24738
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
    36
import java.lang.invoke.CallSite;
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
    37
import java.lang.invoke.ConstantCallSite;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    38
import java.lang.invoke.MethodHandle;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    39
import java.lang.invoke.MethodHandles;
24738
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
    40
import java.lang.invoke.MethodType;
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
    41
import java.lang.invoke.SwitchPoint;
16522
d643e3ee819c 8009757: Package access clean up and refactoring
sundar
parents: 16277
diff changeset
    42
import java.lang.reflect.Field;
18326
512bdf9535a6 8016453: loadWithNewGlobal does not allow apply operation
jlaskey
parents: 18321
diff changeset
    43
import java.util.Arrays;
24738
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
    44
import java.util.HashMap;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    45
import java.util.Map;
19456
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19088
diff changeset
    46
import java.util.concurrent.Callable;
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19088
diff changeset
    47
import java.util.concurrent.ConcurrentHashMap;
24745
3a6e1477362b 8041434: Add synchronization to the common global constants structure
lagergren
parents: 24744
diff changeset
    48
import java.util.concurrent.atomic.AtomicReference;
25422
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
    49
import javax.script.ScriptContext;
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
    50
import javax.script.ScriptEngine;
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents: 16233
diff changeset
    51
import jdk.internal.dynalink.linker.GuardedInvocation;
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents: 16233
diff changeset
    52
import jdk.internal.dynalink.linker.LinkRequest;
25422
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
    53
import jdk.nashorn.api.scripting.ScriptObjectMirror;
24738
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
    54
import jdk.nashorn.internal.codegen.ApplySpecialization;
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
    55
import jdk.nashorn.internal.codegen.CompilerConstants.Call;
22382
2abc7240ef59 8029612: the typeErrorThrower field in ScriptFunctionImpl cannot be static and common to all Globals
sundar
parents: 21686
diff changeset
    56
import jdk.nashorn.internal.lookup.Lookup;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    57
import jdk.nashorn.internal.objects.annotations.Attribute;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    58
import jdk.nashorn.internal.objects.annotations.Property;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    59
import jdk.nashorn.internal.objects.annotations.ScriptClass;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    60
import jdk.nashorn.internal.runtime.ConsString;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    61
import jdk.nashorn.internal.runtime.Context;
24733
1e825be55fd1 8027043: Turn global accesses into MethodHandle.constant, with one chance of reassignment, e.g. x = value occuring once in the global scope is ok, twice is not.
lagergren
parents: 24731
diff changeset
    62
import jdk.nashorn.internal.runtime.GlobalConstants;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    63
import jdk.nashorn.internal.runtime.GlobalFunctions;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    64
import jdk.nashorn.internal.runtime.JSType;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    65
import jdk.nashorn.internal.runtime.NativeJavaPackage;
21686
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents: 21439
diff changeset
    66
import jdk.nashorn.internal.runtime.PropertyDescriptor;
18618
136279c4cbe6 8019157: Avoid calling ScriptObject.setProto() if possible
hannesw
parents: 18610
diff changeset
    67
import jdk.nashorn.internal.runtime.PropertyMap;
21686
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents: 21439
diff changeset
    68
import jdk.nashorn.internal.runtime.Scope;
16262
75513555e603 8008731: Separate configuration environment (options, error/output writer etc.) from Context
sundar
parents: 16258
diff changeset
    69
import jdk.nashorn.internal.runtime.ScriptEnvironment;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    70
import jdk.nashorn.internal.runtime.ScriptFunction;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    71
import jdk.nashorn.internal.runtime.ScriptObject;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    72
import jdk.nashorn.internal.runtime.ScriptRuntime;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    73
import jdk.nashorn.internal.runtime.ScriptingFunctions;
21686
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents: 21439
diff changeset
    74
import jdk.nashorn.internal.runtime.arrays.ArrayData;
19088
153f268bfa72 8021122: Not all callables are handled for toString and other function valued properties
sundar
parents: 19085
diff changeset
    75
import jdk.nashorn.internal.runtime.linker.Bootstrap;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    76
import jdk.nashorn.internal.runtime.linker.InvokeByName;
21686
5c6946f97d6f 8027236: Ensure ScriptObject and ConsString aren't visible to Java
attila
parents: 21439
diff changeset
    77
import jdk.nashorn.internal.runtime.regexp.RegExpResult;
16275
d5d430071b22 8009379: Remove $ from generated class names
jlaskey
parents: 16262
diff changeset
    78
import jdk.nashorn.internal.scripts.JO;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    79
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    80
/**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    81
 * Representation of global scope.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    82
 */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    83
@ScriptClass("Global")
23375
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
    84
public final class Global extends ScriptObject implements Scope {
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 22389
diff changeset
    85
    // Placeholder value used in place of a location property (__FILE__, __DIR__, __LINE__)
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 22389
diff changeset
    86
    private static final Object LOCATION_PROPERTY_PLACEHOLDER = new Object();
19456
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19088
diff changeset
    87
    private final InvokeByName TO_STRING = new InvokeByName("toString", ScriptObject.class);
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19088
diff changeset
    88
    private final InvokeByName VALUE_OF  = new InvokeByName("valueOf",  ScriptObject.class);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    89
24738
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
    90
    /**
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
    91
     * Optimistic builtin names that require switchpoint invalidation
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
    92
     * upon assignment. Overly conservative, but works for now, to avoid
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
    93
     * any complicated scope checks and especially heavy weight guards
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
    94
     * like
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
    95
     *
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
    96
     * <pre>
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
    97
     *     public boolean setterGuard(final Object receiver) {
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
    98
     *         final Global          global = Global.instance();
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
    99
     *         final ScriptObject    sobj   = global.getFunctionPrototype();
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
   100
     *         final Object          apply  = sobj.get("apply");
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
   101
     *         return apply == receiver;
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
   102
     *     }
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
   103
     * </pre>
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
   104
     *
24751
ccbd9cd3f720 8042118: Separate types from symbols
attila
parents: 24745
diff changeset
   105
     * Naturally, checking for builtin classes like NativeFunction is cheaper,
24738
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
   106
     * it's when you start adding property checks for said builtins you have
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
   107
     * problems with guard speed.
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
   108
     */
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
   109
    public final Map<String, SwitchPoint> optimisticFunctionMap;
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
   110
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
   111
    /** Name invalidator for things like call/apply */
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
   112
    public static final Call BOOTSTRAP = staticCall(MethodHandles.lookup(), Global.class, "invalidateNameBootstrap", CallSite.class, MethodHandles.Lookup.class, String.class, MethodType.class);
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
   113
25422
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   114
    /** Nashorn extension: arguments array */
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   115
    @Property(attributes = Attribute.NOT_ENUMERABLE | Attribute.NOT_CONFIGURABLE)
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   116
    public Object arguments;
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   117
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   118
    /** ECMA 15.1.2.2 parseInt (string , radix) */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   119
    @Property(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   120
    public Object parseInt;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   121
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   122
    /** ECMA 15.1.2.3 parseFloat (string) */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   123
    @Property(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   124
    public Object parseFloat;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   125
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   126
    /** ECMA 15.1.2.4 isNaN (number) */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   127
    @Property(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   128
    public Object isNaN;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   129
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   130
    /** ECMA 15.1.2.5 isFinite (number) */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   131
    @Property(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   132
    public Object isFinite;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   133
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   134
    /** ECMA 15.1.3.3 encodeURI */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   135
    @Property(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   136
    public Object encodeURI;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   137
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   138
    /** ECMA 15.1.3.4 encodeURIComponent */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   139
    @Property(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   140
    public Object encodeURIComponent;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   141
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   142
    /** ECMA 15.1.3.1 decodeURI */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   143
    @Property(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   144
    public Object decodeURI;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   145
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   146
    /** ECMA 15.1.3.2 decodeURIComponent */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   147
    @Property(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   148
    public Object decodeURIComponent;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   149
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   150
    /** ECMA B.2.1 escape (string) */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   151
    @Property(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   152
    public Object escape;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   153
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   154
    /** ECMA B.2.2 unescape (string) */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   155
    @Property(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   156
    public Object unescape;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   157
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   158
    /** Nashorn extension: global.print */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   159
    @Property(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   160
    public Object print;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   161
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   162
    /** Nashorn extension: global.load */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   163
    @Property(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   164
    public Object load;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   165
17974
a2818f17324e 8015741: Need a global.load function that starts with a new global scope.
jlaskey
parents: 17972
diff changeset
   166
    /** Nashorn extension: global.loadWithNewGlobal */
a2818f17324e 8015741: Need a global.load function that starts with a new global scope.
jlaskey
parents: 17972
diff changeset
   167
    @Property(attributes = Attribute.NOT_ENUMERABLE)
a2818f17324e 8015741: Need a global.load function that starts with a new global scope.
jlaskey
parents: 17972
diff changeset
   168
    public Object loadWithNewGlobal;
a2818f17324e 8015741: Need a global.load function that starts with a new global scope.
jlaskey
parents: 17972
diff changeset
   169
16219
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
   170
    /** Nashorn extension: global.exit */
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
   171
    @Property(attributes = Attribute.NOT_ENUMERABLE)
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
   172
    public Object exit;
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
   173
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
   174
    /** Nashorn extension: global.quit */
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
   175
    @Property(attributes = Attribute.NOT_ENUMERABLE)
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
   176
    public Object quit;
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
   177
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   178
    /** Value property NaN of the Global Object - ECMA 15.1.1.1 NaN */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   179
    @Property(attributes = Attribute.NON_ENUMERABLE_CONSTANT)
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 22389
diff changeset
   180
    public final double NaN = Double.NaN;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   181
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   182
    /** Value property Infinity of the Global Object - ECMA 15.1.1.2 Infinity */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   183
    @Property(attributes = Attribute.NON_ENUMERABLE_CONSTANT)
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 22389
diff changeset
   184
    public final double Infinity = Double.POSITIVE_INFINITY;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   185
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   186
    /** Value property Undefined of the Global Object - ECMA 15.1.1.3 Undefined */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   187
    @Property(attributes = Attribute.NON_ENUMERABLE_CONSTANT)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   188
    public final Object undefined = UNDEFINED;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   189
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   190
    /** ECMA 15.1.2.1 eval(x) */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   191
    @Property(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   192
    public Object eval;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   193
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   194
    /** ECMA 15.1.4.1 Object constructor. */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   195
    @Property(name = "Object", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   196
    public volatile Object object;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   197
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   198
    /** ECMA 15.1.4.2 Function constructor. */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   199
    @Property(name = "Function", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   200
    public volatile Object function;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   201
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   202
    /** ECMA 15.1.4.3 Array constructor. */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   203
    @Property(name = "Array", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   204
    public volatile Object array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   205
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   206
    /** ECMA 15.1.4.4 String constructor */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   207
    @Property(name = "String", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   208
    public volatile Object string;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   209
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   210
    /** ECMA 15.1.4.5 Boolean constructor */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   211
    @Property(name = "Boolean", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   212
    public volatile Object _boolean;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   213
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   214
    /** ECMA 15.1.4.6 - Number constructor */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   215
    @Property(name = "Number", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   216
    public volatile Object number;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   217
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   218
    /** ECMA 15.1.4.7 Date constructor */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   219
    @Property(name = "Date", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   220
    public volatile Object date;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   221
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   222
    /** ECMA 15.1.4.8 RegExp constructor */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   223
    @Property(name = "RegExp", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   224
    public volatile Object regexp;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   225
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   226
    /** ECMA 15.12 - The JSON object */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   227
    @Property(name = "JSON", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   228
    public volatile Object json;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   229
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   230
    /** Nashorn extension: global.JSAdapter */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   231
    @Property(name = "JSAdapter", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   232
    public volatile Object jsadapter;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   233
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   234
    /** ECMA 15.8 - The Math object */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   235
    @Property(name = "Math", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   236
    public volatile Object math;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   237
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   238
    /** Error object */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   239
    @Property(name = "Error", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   240
    public volatile Object error;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   241
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   242
    /** EvalError object */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   243
    @Property(name = "EvalError", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   244
    public volatile Object evalError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   245
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   246
    /** RangeError object */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   247
    @Property(name = "RangeError", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   248
    public volatile Object rangeError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   249
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   250
    /** ReferenceError object */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   251
    @Property(name = "ReferenceError", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   252
    public volatile Object referenceError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   253
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   254
    /** SyntaxError object */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   255
    @Property(name = "SyntaxError", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   256
    public volatile Object syntaxError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   257
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   258
    /** TypeError object */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   259
    @Property(name = "TypeError", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   260
    public volatile Object typeError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   261
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   262
    /** URIError object */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   263
    @Property(name = "URIError", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   264
    public volatile Object uriError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   265
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   266
    /** ArrayBuffer object */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   267
    @Property(name = "ArrayBuffer", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   268
    public volatile Object arrayBuffer;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   269
23374
f470afc89c6c 8015958: DataView constructor is not defined
sundar
parents: 23372
diff changeset
   270
    /** DataView object */
f470afc89c6c 8015958: DataView constructor is not defined
sundar
parents: 23372
diff changeset
   271
    @Property(name = "DataView", attributes = Attribute.NOT_ENUMERABLE)
f470afc89c6c 8015958: DataView constructor is not defined
sundar
parents: 23372
diff changeset
   272
    public volatile Object dataView;
f470afc89c6c 8015958: DataView constructor is not defined
sundar
parents: 23372
diff changeset
   273
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   274
    /** TypedArray (int8) */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   275
    @Property(name = "Int8Array", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   276
    public volatile Object int8Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   277
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   278
    /** TypedArray (uint8) */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   279
    @Property(name = "Uint8Array", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   280
    public volatile Object uint8Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   281
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   282
    /** TypedArray (uint8) - Clamped */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   283
    @Property(name = "Uint8ClampedArray", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   284
    public volatile Object uint8ClampedArray;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   285
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   286
    /** TypedArray (int16) */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   287
    @Property(name = "Int16Array", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   288
    public volatile Object int16Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   289
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   290
    /** TypedArray (uint16) */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   291
    @Property(name = "Uint16Array", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   292
    public volatile Object uint16Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   293
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   294
    /** TypedArray (int32) */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   295
    @Property(name = "Int32Array", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   296
    public volatile Object int32Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   297
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   298
    /** TypedArray (uint32) */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   299
    @Property(name = "Uint32Array", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   300
    public volatile Object uint32Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   301
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   302
    /** TypedArray (float32) */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   303
    @Property(name = "Float32Array", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   304
    public volatile Object float32Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   305
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   306
    /** TypedArray (float64) */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   307
    @Property(name = "Float64Array", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   308
    public volatile Object float64Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   309
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   310
    /** Nashorn extension: Java access - global.Packages */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   311
    @Property(name = "Packages", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   312
    public volatile Object packages;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   313
16532
fe016e9cae59 8010709: org on the top level doesn't resolve
sundar
parents: 16525
diff changeset
   314
    /** Nashorn extension: Java access - global.com */
fe016e9cae59 8010709: org on the top level doesn't resolve
sundar
parents: 16525
diff changeset
   315
    @Property(attributes = Attribute.NOT_ENUMERABLE)
fe016e9cae59 8010709: org on the top level doesn't resolve
sundar
parents: 16525
diff changeset
   316
    public volatile Object com;
fe016e9cae59 8010709: org on the top level doesn't resolve
sundar
parents: 16525
diff changeset
   317
fe016e9cae59 8010709: org on the top level doesn't resolve
sundar
parents: 16525
diff changeset
   318
    /** Nashorn extension: Java access - global.edu */
fe016e9cae59 8010709: org on the top level doesn't resolve
sundar
parents: 16525
diff changeset
   319
    @Property(attributes = Attribute.NOT_ENUMERABLE)
fe016e9cae59 8010709: org on the top level doesn't resolve
sundar
parents: 16525
diff changeset
   320
    public volatile Object edu;
fe016e9cae59 8010709: org on the top level doesn't resolve
sundar
parents: 16525
diff changeset
   321
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   322
    /** Nashorn extension: Java access - global.java */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   323
    @Property(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   324
    public volatile Object java;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   325
16532
fe016e9cae59 8010709: org on the top level doesn't resolve
sundar
parents: 16525
diff changeset
   326
    /** Nashorn extension: Java access - global.javafx */
fe016e9cae59 8010709: org on the top level doesn't resolve
sundar
parents: 16525
diff changeset
   327
    @Property(attributes = Attribute.NOT_ENUMERABLE)
fe016e9cae59 8010709: org on the top level doesn't resolve
sundar
parents: 16525
diff changeset
   328
    public volatile Object javafx;
fe016e9cae59 8010709: org on the top level doesn't resolve
sundar
parents: 16525
diff changeset
   329
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   330
    /** Nashorn extension: Java access - global.javax */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   331
    @Property(attributes = Attribute.NOT_ENUMERABLE)
16532
fe016e9cae59 8010709: org on the top level doesn't resolve
sundar
parents: 16525
diff changeset
   332
    public volatile Object javax;
fe016e9cae59 8010709: org on the top level doesn't resolve
sundar
parents: 16525
diff changeset
   333
fe016e9cae59 8010709: org on the top level doesn't resolve
sundar
parents: 16525
diff changeset
   334
    /** Nashorn extension: Java access - global.org */
fe016e9cae59 8010709: org on the top level doesn't resolve
sundar
parents: 16525
diff changeset
   335
    @Property(attributes = Attribute.NOT_ENUMERABLE)
fe016e9cae59 8010709: org on the top level doesn't resolve
sundar
parents: 16525
diff changeset
   336
    public volatile Object org;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   337
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   338
    /** Nashorn extension: Java access - global.javaImporter */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   339
    @Property(name = "JavaImporter", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   340
    public volatile Object javaImporter;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   341
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   342
    /** Nashorn extension: global.Java Object constructor. */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   343
    @Property(name = "Java", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   344
    public volatile Object javaApi;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   345
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   346
    /** Nashorn extension: current script's file name */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   347
    @Property(name = "__FILE__", attributes = Attribute.NON_ENUMERABLE_CONSTANT)
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 22389
diff changeset
   348
    public final Object __FILE__ = LOCATION_PROPERTY_PLACEHOLDER;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   349
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   350
    /** Nashorn extension: current script's directory */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   351
    @Property(name = "__DIR__", attributes = Attribute.NON_ENUMERABLE_CONSTANT)
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 22389
diff changeset
   352
    public final Object __DIR__ = LOCATION_PROPERTY_PLACEHOLDER;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   353
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   354
    /** Nashorn extension: current source line number being executed */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   355
    @Property(name = "__LINE__", attributes = Attribute.NON_ENUMERABLE_CONSTANT)
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 22389
diff changeset
   356
    public final Object __LINE__ = LOCATION_PROPERTY_PLACEHOLDER;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   357
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   358
    /** Used as Date.prototype's default value */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   359
    public NativeDate   DEFAULT_DATE;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   360
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   361
    /** Used as RegExp.prototype's default value */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   362
    public NativeRegExp DEFAULT_REGEXP;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   363
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   364
    /*
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   365
     * Built-in constructor objects: Even if user changes dynamic values of
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   366
     * "Object", "Array" etc., we still want to keep original values of these
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   367
     * constructors here. For example, we need to be able to create array,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   368
     * regexp literals even after user overwrites global "Array" or "RegExp"
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   369
     * constructor - see also ECMA 262 spec. Annex D.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   370
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   371
    private ScriptFunction builtinFunction;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   372
    private ScriptFunction builtinObject;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   373
    private ScriptFunction builtinArray;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   374
    private ScriptFunction builtinBoolean;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   375
    private ScriptFunction builtinDate;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   376
    private ScriptObject   builtinJSON;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   377
    private ScriptFunction builtinJSAdapter;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   378
    private ScriptObject   builtinMath;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   379
    private ScriptFunction builtinNumber;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   380
    private ScriptFunction builtinRegExp;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   381
    private ScriptFunction builtinString;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   382
    private ScriptFunction builtinError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   383
    private ScriptFunction builtinEval;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   384
    private ScriptFunction builtinEvalError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   385
    private ScriptFunction builtinRangeError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   386
    private ScriptFunction builtinReferenceError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   387
    private ScriptFunction builtinSyntaxError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   388
    private ScriptFunction builtinTypeError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   389
    private ScriptFunction builtinURIError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   390
    private ScriptObject   builtinPackages;
16532
fe016e9cae59 8010709: org on the top level doesn't resolve
sundar
parents: 16525
diff changeset
   391
    private ScriptObject   builtinCom;
fe016e9cae59 8010709: org on the top level doesn't resolve
sundar
parents: 16525
diff changeset
   392
    private ScriptObject   builtinEdu;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   393
    private ScriptObject   builtinJava;
16532
fe016e9cae59 8010709: org on the top level doesn't resolve
sundar
parents: 16525
diff changeset
   394
    private ScriptObject   builtinJavafx;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   395
    private ScriptObject   builtinJavax;
16532
fe016e9cae59 8010709: org on the top level doesn't resolve
sundar
parents: 16525
diff changeset
   396
    private ScriptObject   builtinOrg;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   397
    private ScriptObject   builtinJavaImporter;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   398
    private ScriptObject   builtinJavaApi;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   399
    private ScriptObject   builtinArrayBuffer;
23374
f470afc89c6c 8015958: DataView constructor is not defined
sundar
parents: 23372
diff changeset
   400
    private ScriptObject   builtinDataView;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   401
    private ScriptObject   builtinInt8Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   402
    private ScriptObject   builtinUint8Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   403
    private ScriptObject   builtinUint8ClampedArray;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   404
    private ScriptObject   builtinInt16Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   405
    private ScriptObject   builtinUint16Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   406
    private ScriptObject   builtinInt32Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   407
    private ScriptObject   builtinUint32Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   408
    private ScriptObject   builtinFloat32Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   409
    private ScriptObject   builtinFloat64Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   410
22382
2abc7240ef59 8029612: the typeErrorThrower field in ScriptFunctionImpl cannot be static and common to all Globals
sundar
parents: 21686
diff changeset
   411
    /*
2abc7240ef59 8029612: the typeErrorThrower field in ScriptFunctionImpl cannot be static and common to all Globals
sundar
parents: 21686
diff changeset
   412
     * ECMA section 13.2.3 The [[ThrowTypeError]] Function Object
2abc7240ef59 8029612: the typeErrorThrower field in ScriptFunctionImpl cannot be static and common to all Globals
sundar
parents: 21686
diff changeset
   413
     */
2abc7240ef59 8029612: the typeErrorThrower field in ScriptFunctionImpl cannot be static and common to all Globals
sundar
parents: 21686
diff changeset
   414
    private ScriptFunction typeErrorThrower;
2abc7240ef59 8029612: the typeErrorThrower field in ScriptFunctionImpl cannot be static and common to all Globals
sundar
parents: 21686
diff changeset
   415
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   416
    // Flag to indicate that a split method issued a return statement
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   417
    private int splitState = -1;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   418
16223
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16219
diff changeset
   419
    // Used to store the last RegExp result to support deprecated RegExp constructor properties
16258
0e25f785df4d 8008093: Make RegExp engine pluggable
hannesw
parents: 16256
diff changeset
   420
    private RegExpResult lastRegExpResult;
16223
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16219
diff changeset
   421
25422
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   422
    private static final MethodHandle EVAL              = findOwnMH_S("eval",                Object.class, Object.class, Object.class);
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   423
    private static final MethodHandle NO_SUCH_PROPERTY  = findOwnMH_S(NO_SUCH_PROPERTY_NAME, Object.class, Object.class, Object.class);
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   424
    private static final MethodHandle PRINT             = findOwnMH_S("print",               Object.class, Object.class, Object[].class);
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   425
    private static final MethodHandle PRINTLN           = findOwnMH_S("println",             Object.class, Object.class, Object[].class);
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   426
    private static final MethodHandle LOAD              = findOwnMH_S("load",                Object.class, Object.class, Object.class);
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   427
    private static final MethodHandle LOADWITHNEWGLOBAL = findOwnMH_S("loadWithNewGlobal",   Object.class, Object.class, Object[].class);
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   428
    private static final MethodHandle EXIT              = findOwnMH_S("exit",                Object.class, Object.class, Object.class);
24738
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
   429
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
   430
    /** Invalidate a reserved name, such as "apply" or "call" if assigned */
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
   431
    public MethodHandle INVALIDATE_RESERVED_NAME = MH.bindTo(findOwnMH_V("invalidateReservedName", void.class, String.class), this);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   432
18618
136279c4cbe6 8019157: Avoid calling ScriptObject.setProto() if possible
hannesw
parents: 18610
diff changeset
   433
    // initialized by nasgen
136279c4cbe6 8019157: Avoid calling ScriptObject.setProto() if possible
hannesw
parents: 18610
diff changeset
   434
    private static PropertyMap $nasgenmap$;
136279c4cbe6 8019157: Avoid calling ScriptObject.setProto() if possible
hannesw
parents: 18610
diff changeset
   435
19884
1bacbaa1bfc7 8024180: Incorrect handling of expression and parent scope in 'with' statements
sundar
parents: 19459
diff changeset
   436
    // context to which this global belongs to
1bacbaa1bfc7 8024180: Incorrect handling of expression and parent scope in 'with' statements
sundar
parents: 19459
diff changeset
   437
    private final Context context;
1bacbaa1bfc7 8024180: Incorrect handling of expression and parent scope in 'with' statements
sundar
parents: 19459
diff changeset
   438
25422
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   439
    // current ScriptContext to use - can be null.
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   440
    private ScriptContext scontext;
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   441
    // associated Property object for "context" property.
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   442
    private jdk.nashorn.internal.runtime.Property scontextProperty;
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   443
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   444
    /**
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   445
     * Set the current script context
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   446
     * @param scontext script context
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   447
     */
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   448
    public void setScriptContext(final ScriptContext scontext) {
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   449
        this.scontext = scontext;
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   450
        scontextProperty.setValue(this, this, scontext, false);
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   451
    }
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   452
24745
3a6e1477362b 8041434: Add synchronization to the common global constants structure
lagergren
parents: 24744
diff changeset
   453
    // global constants for this global - they can be replaced with MethodHandle.constant until invalidated
3a6e1477362b 8041434: Add synchronization to the common global constants structure
lagergren
parents: 24744
diff changeset
   454
    private static AtomicReference<GlobalConstants> gcsInstance = new AtomicReference<>();
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24738
diff changeset
   455
19884
1bacbaa1bfc7 8024180: Incorrect handling of expression and parent scope in 'with' statements
sundar
parents: 19459
diff changeset
   456
    @Override
1bacbaa1bfc7 8024180: Incorrect handling of expression and parent scope in 'with' statements
sundar
parents: 19459
diff changeset
   457
    protected Context getContext() {
1bacbaa1bfc7 8024180: Incorrect handling of expression and parent scope in 'with' statements
sundar
parents: 19459
diff changeset
   458
        return context;
1bacbaa1bfc7 8024180: Incorrect handling of expression and parent scope in 'with' statements
sundar
parents: 19459
diff changeset
   459
    }
1bacbaa1bfc7 8024180: Incorrect handling of expression and parent scope in 'with' statements
sundar
parents: 19459
diff changeset
   460
19085
066c9e5afd79 8020731: Revisit checkPermission calls in Context class
sundar
parents: 18855
diff changeset
   461
    // performs initialization checks for Global constructor and returns the
066c9e5afd79 8020731: Revisit checkPermission calls in Context class
sundar
parents: 18855
diff changeset
   462
    // PropertyMap, if everything is fine.
066c9e5afd79 8020731: Revisit checkPermission calls in Context class
sundar
parents: 18855
diff changeset
   463
    private static PropertyMap checkAndGetMap(final Context context) {
066c9e5afd79 8020731: Revisit checkPermission calls in Context class
sundar
parents: 18855
diff changeset
   464
        // security check first
066c9e5afd79 8020731: Revisit checkPermission calls in Context class
sundar
parents: 18855
diff changeset
   465
        final SecurityManager sm = System.getSecurityManager();
066c9e5afd79 8020731: Revisit checkPermission calls in Context class
sundar
parents: 18855
diff changeset
   466
        if (sm != null) {
19459
79e75274df99 8022707: Revisit all doPrivileged blocks
sundar
parents: 19456
diff changeset
   467
            sm.checkPermission(new RuntimePermission(Context.NASHORN_CREATE_GLOBAL));
19085
066c9e5afd79 8020731: Revisit checkPermission calls in Context class
sundar
parents: 18855
diff changeset
   468
        }
066c9e5afd79 8020731: Revisit checkPermission calls in Context class
sundar
parents: 18855
diff changeset
   469
066c9e5afd79 8020731: Revisit checkPermission calls in Context class
sundar
parents: 18855
diff changeset
   470
        // null check on context
066c9e5afd79 8020731: Revisit checkPermission calls in Context class
sundar
parents: 18855
diff changeset
   471
        context.getClass();
066c9e5afd79 8020731: Revisit checkPermission calls in Context class
sundar
parents: 18855
diff changeset
   472
25421
a1df2de833a2 8044760: Avoid PropertyMap duplicate for global instances
sundar
parents: 25240
diff changeset
   473
        return $nasgenmap$;
19085
066c9e5afd79 8020731: Revisit checkPermission calls in Context class
sundar
parents: 18855
diff changeset
   474
    }
066c9e5afd79 8020731: Revisit checkPermission calls in Context class
sundar
parents: 18855
diff changeset
   475
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   476
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   477
     * Constructor
16233
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16228
diff changeset
   478
     *
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16228
diff changeset
   479
     * @param context the context
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   480
     */
16226
0e4f37e6cc40 8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents: 16223
diff changeset
   481
    public Global(final Context context) {
19085
066c9e5afd79 8020731: Revisit checkPermission calls in Context class
sundar
parents: 18855
diff changeset
   482
        super(checkAndGetMap(context));
19884
1bacbaa1bfc7 8024180: Incorrect handling of expression and parent scope in 'with' statements
sundar
parents: 19459
diff changeset
   483
        this.context = context;
18855
408663ef8f66 8020015: shared PropertyMaps should not be used without duplication
sundar
parents: 18851
diff changeset
   484
        this.setIsScope();
24738
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
   485
        this.optimisticFunctionMap = new HashMap<>();
24745
3a6e1477362b 8041434: Add synchronization to the common global constants structure
lagergren
parents: 24744
diff changeset
   486
        //we can only share one instance of Global constants between globals, or we consume way too much
3a6e1477362b 8041434: Add synchronization to the common global constants structure
lagergren
parents: 24744
diff changeset
   487
        //memory - this is good enough for most programs
3a6e1477362b 8041434: Add synchronization to the common global constants structure
lagergren
parents: 24744
diff changeset
   488
        while (gcsInstance.get() == null) {
3a6e1477362b 8041434: Add synchronization to the common global constants structure
lagergren
parents: 24744
diff changeset
   489
            gcsInstance.compareAndSet(null, new GlobalConstants(context.getLogger(GlobalConstants.class)));
3a6e1477362b 8041434: Add synchronization to the common global constants structure
lagergren
parents: 24744
diff changeset
   490
        }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   491
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   492
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   493
    /**
16226
0e4f37e6cc40 8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents: 16223
diff changeset
   494
     * Script access to "current" Global instance
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   495
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   496
     * @return the global singleton
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   497
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   498
    public static Global instance() {
24727
attila
parents: 24720 23375
diff changeset
   499
        final Global global = Context.getGlobal();
23375
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   500
        global.getClass(); // null check
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   501
        return global;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   502
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   503
25422
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   504
    private static Global instanceFrom(final Object self) {
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   505
        return self instanceof Global? (Global)self : instance();
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   506
    }
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   507
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   508
    /**
24745
3a6e1477362b 8041434: Add synchronization to the common global constants structure
lagergren
parents: 24744
diff changeset
   509
     * Return the global constants map for fields that
3a6e1477362b 8041434: Add synchronization to the common global constants structure
lagergren
parents: 24744
diff changeset
   510
     * can be accessed as MethodHandle.constant
3a6e1477362b 8041434: Add synchronization to the common global constants structure
lagergren
parents: 24744
diff changeset
   511
     * @return constant map
3a6e1477362b 8041434: Add synchronization to the common global constants structure
lagergren
parents: 24744
diff changeset
   512
     */
3a6e1477362b 8041434: Add synchronization to the common global constants structure
lagergren
parents: 24744
diff changeset
   513
    public static GlobalConstants getConstants() {
3a6e1477362b 8041434: Add synchronization to the common global constants structure
lagergren
parents: 24744
diff changeset
   514
        return gcsInstance.get();
3a6e1477362b 8041434: Add synchronization to the common global constants structure
lagergren
parents: 24744
diff changeset
   515
    }
3a6e1477362b 8041434: Add synchronization to the common global constants structure
lagergren
parents: 24744
diff changeset
   516
3a6e1477362b 8041434: Add synchronization to the common global constants structure
lagergren
parents: 24744
diff changeset
   517
    /**
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24738
diff changeset
   518
     * Check if we have a Global instance
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24738
diff changeset
   519
     * @return true if one exists
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24738
diff changeset
   520
     */
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24738
diff changeset
   521
    public static boolean hasInstance() {
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24738
diff changeset
   522
        return Context.getGlobal() != null;
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24738
diff changeset
   523
    }
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24738
diff changeset
   524
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24738
diff changeset
   525
    /**
16262
75513555e603 8008731: Separate configuration environment (options, error/output writer etc.) from Context
sundar
parents: 16258
diff changeset
   526
     * Script access to {@link ScriptEnvironment}
75513555e603 8008731: Separate configuration environment (options, error/output writer etc.) from Context
sundar
parents: 16258
diff changeset
   527
     *
75513555e603 8008731: Separate configuration environment (options, error/output writer etc.) from Context
sundar
parents: 16258
diff changeset
   528
     * @return the script environment
75513555e603 8008731: Separate configuration environment (options, error/output writer etc.) from Context
sundar
parents: 16258
diff changeset
   529
     */
75513555e603 8008731: Separate configuration environment (options, error/output writer etc.) from Context
sundar
parents: 16258
diff changeset
   530
    static ScriptEnvironment getEnv() {
18851
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18842
diff changeset
   531
        return instance().getContext().getEnv();
16262
75513555e603 8008731: Separate configuration environment (options, error/output writer etc.) from Context
sundar
parents: 16258
diff changeset
   532
    }
75513555e603 8008731: Separate configuration environment (options, error/output writer etc.) from Context
sundar
parents: 16258
diff changeset
   533
75513555e603 8008731: Separate configuration environment (options, error/output writer etc.) from Context
sundar
parents: 16258
diff changeset
   534
    /**
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   535
     * Script access to {@link Context}
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   536
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   537
     * @return the context
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   538
     */
16185
893aabe8c800 8006635: Reduce access levels as much as possible
sundar
parents: 16181
diff changeset
   539
    static Context getThisContext() {
18851
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18842
diff changeset
   540
        return instance().getContext();
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   541
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   542
23375
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   543
    // Runtime interface to Global
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   544
23375
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   545
    /**
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   546
     * Is this global of the given Context?
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   547
     * @param ctxt the context
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   548
     * @return true if this global belongs to the given Context
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   549
     */
20933
89748612fd1d 8026250: Logging nullpointer bugfix and javadoc warnings
lagergren
parents: 20216
diff changeset
   550
    public boolean isOfContext(final Context ctxt) {
89748612fd1d 8026250: Logging nullpointer bugfix and javadoc warnings
lagergren
parents: 20216
diff changeset
   551
        return this.context == ctxt;
19884
1bacbaa1bfc7 8024180: Incorrect handling of expression and parent scope in 'with' statements
sundar
parents: 19459
diff changeset
   552
    }
1bacbaa1bfc7 8024180: Incorrect handling of expression and parent scope in 'with' statements
sundar
parents: 19459
diff changeset
   553
23375
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   554
    /**
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   555
     * Does this global belong to a strict Context?
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   556
     * @return true if this global belongs to a strict Context
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   557
     */
19884
1bacbaa1bfc7 8024180: Incorrect handling of expression and parent scope in 'with' statements
sundar
parents: 19459
diff changeset
   558
    public boolean isStrictContext() {
1bacbaa1bfc7 8024180: Incorrect handling of expression and parent scope in 'with' statements
sundar
parents: 19459
diff changeset
   559
        return context.getEnv()._strict;
1bacbaa1bfc7 8024180: Incorrect handling of expression and parent scope in 'with' statements
sundar
parents: 19459
diff changeset
   560
    }
1bacbaa1bfc7 8024180: Incorrect handling of expression and parent scope in 'with' statements
sundar
parents: 19459
diff changeset
   561
23375
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   562
    /**
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   563
     * Initialize standard builtin objects like "Object", "Array", "Function" etc.
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   564
     * as well as our extension builtin objects like "Java", "JSAdapter" as properties
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   565
     * of the global scope object.
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   566
     */
25422
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   567
    public void initBuiltinObjects(final ScriptEngine engine) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   568
        if (this.builtinObject != null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   569
            // already initialized, just return
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   570
            return;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   571
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   572
25422
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   573
        init(engine);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   574
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   575
23375
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   576
    /**
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   577
     * Wrap a Java object as corresponding script object
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   578
     *
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   579
     * @param obj object to wrap
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   580
     * @return    wrapped object
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   581
     */
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   582
    public Object wrapAsObject(final Object obj) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   583
        if (obj instanceof Boolean) {
18851
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18842
diff changeset
   584
            return new NativeBoolean((Boolean)obj, this);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   585
        } else if (obj instanceof Number) {
18851
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18842
diff changeset
   586
            return new NativeNumber(((Number)obj).doubleValue(), this);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   587
        } else if (obj instanceof String || obj instanceof ConsString) {
18851
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18842
diff changeset
   588
            return new NativeString((CharSequence)obj, this);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   589
        } else if (obj instanceof Object[]) { // extension
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   590
            return new NativeArray((Object[])obj);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   591
        } else if (obj instanceof double[]) { // extension
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   592
            return new NativeArray((double[])obj);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   593
        } else if (obj instanceof long[]) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   594
            return new NativeArray((long[])obj);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   595
        } else if (obj instanceof int[]) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   596
            return new NativeArray((int[])obj);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   597
        } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   598
            // FIXME: more special cases? Map? List?
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   599
            return obj;
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
23375
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   603
    /**
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   604
     * Lookup helper for JS primitive types
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   605
     *
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   606
     * @param request the link request for the dynamic call site.
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   607
     * @param self     self reference
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   608
     *
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   609
     * @return guarded invocation
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   610
     */
24731
ab0c8fc915ae 8038406: Testability: as a first step of moving loggers away from the process global space, the Debug object now supports logging POJOs from log entries as an event queue, which can be introspected from test scripts. This is way better than screen scraping brittle and subject-to-change log output.
lagergren
parents: 24727
diff changeset
   611
    public static GuardedInvocation primitiveLookup(final LinkRequest request, final Object self) {
16195
3f6c0ab2597a 8006766: Array-like access to characters of a string is slow
hannesw
parents: 16188
diff changeset
   612
        if (self instanceof String || self instanceof ConsString) {
3f6c0ab2597a 8006766: Array-like access to characters of a string is slow
hannesw
parents: 16188
diff changeset
   613
            return NativeString.lookupPrimitive(request, self);
3f6c0ab2597a 8006766: Array-like access to characters of a string is slow
hannesw
parents: 16188
diff changeset
   614
        } else if (self instanceof Number) {
3f6c0ab2597a 8006766: Array-like access to characters of a string is slow
hannesw
parents: 16188
diff changeset
   615
            return NativeNumber.lookupPrimitive(request, self);
3f6c0ab2597a 8006766: Array-like access to characters of a string is slow
hannesw
parents: 16188
diff changeset
   616
        } else if (self instanceof Boolean) {
3f6c0ab2597a 8006766: Array-like access to characters of a string is slow
hannesw
parents: 16188
diff changeset
   617
            return NativeBoolean.lookupPrimitive(request, self);
3f6c0ab2597a 8006766: Array-like access to characters of a string is slow
hannesw
parents: 16188
diff changeset
   618
        }
3f6c0ab2597a 8006766: Array-like access to characters of a string is slow
hannesw
parents: 16188
diff changeset
   619
        throw new IllegalArgumentException("Unsupported primitive: " + self);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   620
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   621
23375
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   622
    /**
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   623
     * Create a new empty script object
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   624
     *
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   625
     * @return the new ScriptObject
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   626
     */
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   627
    public ScriptObject newObject() {
23084
6c5c02d1023a 8035948: Redesign property listeners for shared classes
hannesw
parents: 22389
diff changeset
   628
        return new JO(getObjectPrototype(), JO.getInitialMap());
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   629
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   630
23375
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   631
    /**
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   632
     * Default value of given type
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   633
     *
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   634
     * @param sobj     script object
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   635
     * @param typeHint type hint
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   636
     *
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   637
     * @return default value
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   638
     */
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   639
    public Object getDefaultValue(final ScriptObject sobj, final Class<?> typeHint) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   640
        // When the [[DefaultValue]] internal method of O is called with no hint,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   641
        // then it behaves as if the hint were Number, unless O is a Date object
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   642
        // in which case it behaves as if the hint were String.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   643
        Class<?> hint = typeHint;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   644
        if (hint == null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   645
            hint = Number.class;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   646
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   647
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   648
        try {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   649
            if (hint == String.class) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   650
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   651
                final Object toString = TO_STRING.getGetter().invokeExact(sobj);
19088
153f268bfa72 8021122: Not all callables are handled for toString and other function valued properties
sundar
parents: 19085
diff changeset
   652
153f268bfa72 8021122: Not all callables are handled for toString and other function valued properties
sundar
parents: 19085
diff changeset
   653
                if (Bootstrap.isCallable(toString)) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   654
                    final Object value = TO_STRING.getInvoker().invokeExact(toString, sobj);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   655
                    if (JSType.isPrimitive(value)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   656
                        return value;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   657
                    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   658
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   659
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   660
                final Object valueOf = VALUE_OF.getGetter().invokeExact(sobj);
19088
153f268bfa72 8021122: Not all callables are handled for toString and other function valued properties
sundar
parents: 19085
diff changeset
   661
                if (Bootstrap.isCallable(valueOf)) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   662
                    final Object value = VALUE_OF.getInvoker().invokeExact(valueOf, sobj);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   663
                    if (JSType.isPrimitive(value)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   664
                        return value;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   665
                    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   666
                }
16256
f2d9a0c49914 8007002: Replace implicit exception throwing methods with explicit throws - simplify control flow and remove useless code
lagergren
parents: 16234
diff changeset
   667
                throw typeError(this, "cannot.get.default.string");
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   668
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   669
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   670
            if (hint == Number.class) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   671
                final Object valueOf = VALUE_OF.getGetter().invokeExact(sobj);
19088
153f268bfa72 8021122: Not all callables are handled for toString and other function valued properties
sundar
parents: 19085
diff changeset
   672
                if (Bootstrap.isCallable(valueOf)) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   673
                    final Object value = VALUE_OF.getInvoker().invokeExact(valueOf, sobj);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   674
                    if (JSType.isPrimitive(value)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   675
                        return value;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   676
                    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   677
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   678
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   679
                final Object toString = TO_STRING.getGetter().invokeExact(sobj);
19088
153f268bfa72 8021122: Not all callables are handled for toString and other function valued properties
sundar
parents: 19085
diff changeset
   680
                if (Bootstrap.isCallable(toString)) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   681
                    final Object value = TO_STRING.getInvoker().invokeExact(toString, sobj);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   682
                    if (JSType.isPrimitive(value)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   683
                        return value;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   684
                    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   685
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   686
16256
f2d9a0c49914 8007002: Replace implicit exception throwing methods with explicit throws - simplify control flow and remove useless code
lagergren
parents: 16234
diff changeset
   687
                throw typeError(this, "cannot.get.default.number");
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   688
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   689
        } catch (final RuntimeException | Error e) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   690
            throw e;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   691
        } catch (final Throwable t) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   692
            throw new RuntimeException(t);
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 UNDEFINED;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   696
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   697
23375
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   698
    /**
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   699
     * Is the given ScriptObject an ECMAScript Error object?
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   700
     *
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   701
     * @param sobj the object being checked
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   702
     * @return true if sobj is an Error object
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   703
     */
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   704
    public boolean isError(final ScriptObject sobj) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   705
        final ScriptObject errorProto = getErrorPrototype();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   706
        ScriptObject proto = sobj.getProto();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   707
        while (proto != null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   708
            if (proto == errorProto) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   709
                return true;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   710
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   711
            proto = proto.getProto();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   712
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   713
        return false;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   714
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   715
23375
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   716
    /**
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   717
     * Create a new ECMAScript Error object.
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   718
     *
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   719
     * @param msg error message
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   720
     * @return newly created Error object
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   721
     */
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   722
    public ScriptObject newError(final String msg) {
18851
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18842
diff changeset
   723
        return new NativeError(msg, this);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   724
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   725
23375
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   726
    /**
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   727
     * Create a new ECMAScript EvalError object.
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   728
     *
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   729
     * @param msg error message
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   730
     * @return newly created EvalError object
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   731
     */
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   732
    public ScriptObject newEvalError(final String msg) {
18851
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18842
diff changeset
   733
        return new NativeEvalError(msg, this);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   734
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   735
23375
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   736
    /**
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   737
     * Create a new ECMAScript RangeError object.
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   738
     *
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   739
     * @param msg error message
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   740
     * @return newly created RangeError object
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   741
     */
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   742
    public ScriptObject newRangeError(final String msg) {
18851
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18842
diff changeset
   743
        return new NativeRangeError(msg, this);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   744
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   745
23375
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   746
    /**
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   747
     * Create a new ECMAScript ReferenceError object.
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   748
     *
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   749
     * @param msg error message
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   750
     * @return newly created ReferenceError object
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   751
     */
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   752
    public ScriptObject newReferenceError(final String msg) {
18851
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18842
diff changeset
   753
        return new NativeReferenceError(msg, this);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   754
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   755
23375
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   756
    /**
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   757
     * Create a new ECMAScript SyntaxError object.
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   758
     *
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   759
     * @param msg error message
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   760
     * @return newly created SyntaxError object
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   761
     */
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   762
    public ScriptObject newSyntaxError(final String msg) {
18851
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18842
diff changeset
   763
        return new NativeSyntaxError(msg, this);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   764
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   765
23375
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   766
    /**
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   767
     * Create a new ECMAScript TypeError object.
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   768
     *
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   769
     * @param msg error message
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   770
     * @return newly created TypeError object
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   771
     */
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   772
    public ScriptObject newTypeError(final String msg) {
18851
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18842
diff changeset
   773
        return new NativeTypeError(msg, this);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   774
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   775
23375
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   776
    /**
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   777
     * Create a new ECMAScript URIError object.
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   778
     *
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   779
     * @param msg error message
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   780
     * @return newly created URIError object
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   781
     */
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   782
    public ScriptObject newURIError(final String msg) {
18851
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18842
diff changeset
   783
        return new NativeURIError(msg, this);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   784
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   785
23375
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   786
    /**
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   787
     * Create a new ECMAScript GenericDescriptor object.
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   788
     *
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   789
     * @param configurable is the property configurable?
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   790
     * @param enumerable is the property enumerable?
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   791
     * @return newly created GenericDescriptor object
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   792
     */
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   793
    public PropertyDescriptor newGenericDescriptor(final boolean configurable, final boolean enumerable) {
18851
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18842
diff changeset
   794
        return new GenericPropertyDescriptor(configurable, enumerable, this);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   795
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   796
23375
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   797
    /**
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   798
     * Create a new ECMAScript DatePropertyDescriptor object.
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   799
     *
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   800
     * @param value of the data property
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   801
     * @param configurable is the property configurable?
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   802
     * @param enumerable is the property enumerable?
24731
ab0c8fc915ae 8038406: Testability: as a first step of moving loggers away from the process global space, the Debug object now supports logging POJOs from log entries as an event queue, which can be introspected from test scripts. This is way better than screen scraping brittle and subject-to-change log output.
lagergren
parents: 24727
diff changeset
   803
     * @param writable is the property writable?
23375
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   804
     * @return newly created DataPropertyDescriptor object
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   805
     */
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   806
    public PropertyDescriptor newDataDescriptor(final Object value, final boolean configurable, final boolean enumerable, final boolean writable) {
18851
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18842
diff changeset
   807
        return new DataPropertyDescriptor(configurable, enumerable, writable, value, this);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   808
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   809
23375
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   810
    /**
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   811
     * Create a new ECMAScript AccessorPropertyDescriptor object.
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   812
     *
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   813
     * @param get getter function of the user accessor property
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   814
     * @param set setter function of the user accessor property
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   815
     * @param configurable is the property configurable?
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   816
     * @param enumerable is the property enumerable?
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   817
     * @return newly created AccessorPropertyDescriptor object
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   818
     */
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   819
    public PropertyDescriptor newAccessorDescriptor(final Object get, final Object set, final boolean configurable, final boolean enumerable) {
18851
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18842
diff changeset
   820
        final AccessorPropertyDescriptor desc = new AccessorPropertyDescriptor(configurable, enumerable, get == null ? UNDEFINED : get, set == null ? UNDEFINED : set, this);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   821
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   822
        if (get == null) {
18328
ebd24057f163 8015355: Array.prototype functions don't honour non-writable length and / or index properties
sundar
parents: 18326
diff changeset
   823
            desc.delete(PropertyDescriptor.GET, false);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   824
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   825
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   826
        if (set == null) {
18328
ebd24057f163 8015355: Array.prototype functions don't honour non-writable length and / or index properties
sundar
parents: 18326
diff changeset
   827
            desc.delete(PropertyDescriptor.SET, false);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   828
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   829
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   830
        return desc;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   831
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   832
19456
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19088
diff changeset
   833
    private static <T> T getLazilyCreatedValue(final Object key, final Callable<T> creator, final Map<Object, T> map) {
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19088
diff changeset
   834
        final T obj = map.get(key);
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19088
diff changeset
   835
        if (obj != null) {
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19088
diff changeset
   836
            return obj;
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19088
diff changeset
   837
        }
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19088
diff changeset
   838
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19088
diff changeset
   839
        try {
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19088
diff changeset
   840
            final T newObj = creator.call();
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19088
diff changeset
   841
            final T existingObj = map.putIfAbsent(key, newObj);
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19088
diff changeset
   842
            return existingObj != null ? existingObj : newObj;
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19088
diff changeset
   843
        } catch (final Exception exp) {
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19088
diff changeset
   844
            throw new RuntimeException(exp);
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19088
diff changeset
   845
        }
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19088
diff changeset
   846
    }
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19088
diff changeset
   847
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19088
diff changeset
   848
    private final Map<Object, InvokeByName> namedInvokers = new ConcurrentHashMap<>();
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19088
diff changeset
   849
23375
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   850
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   851
    /**
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   852
     * Get cached InvokeByName object for the given key
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   853
     * @param key key to be associated with InvokeByName object
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   854
     * @param creator if InvokeByName is absent 'creator' is called to make one (lazy init)
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   855
     * @return InvokeByName object associated with the key.
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   856
     */
19456
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19088
diff changeset
   857
    public InvokeByName getInvokeByName(final Object key, final Callable<InvokeByName> creator) {
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19088
diff changeset
   858
        return getLazilyCreatedValue(key, creator, namedInvokers);
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19088
diff changeset
   859
    }
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19088
diff changeset
   860
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19088
diff changeset
   861
    private final Map<Object, MethodHandle> dynamicInvokers = new ConcurrentHashMap<>();
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19088
diff changeset
   862
23375
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   863
    /**
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   864
     * Get cached dynamic method handle for the given key
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   865
     * @param key key to be associated with dynamic method handle
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   866
     * @param creator if method handle is absent 'creator' is called to make one (lazy init)
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   867
     * @return dynamic method handle associated with the key.
a1110f2cbe75 8037400: Remove getInitialMap getters and GlobalObject interface
sundar
parents: 23374
diff changeset
   868
     */
19456
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19088
diff changeset
   869
    public MethodHandle getDynamicInvoker(final Object key, final Callable<MethodHandle> creator) {
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19088
diff changeset
   870
        return getLazilyCreatedValue(key, creator, dynamicInvokers);
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19088
diff changeset
   871
    }
8cc345d620c8 8022524: Memory leaks in nashorn sources and tests found by jhat analysis
sundar
parents: 19088
diff changeset
   872
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   873
    /**
25422
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   874
     * Hook to search missing variables in ScriptContext if available
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   875
     * @param self used to detect if scope call or not (this function is 'strict')
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   876
     * @param name name of the variable missing
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   877
     * @return value of the missing variable or undefined (or TypeError for scope search)
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   878
     */
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   879
    public static Object __noSuchProperty__(final Object self, final Object name) {
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   880
        final Global global = Global.instance();
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   881
        final ScriptContext sctxt = global.scontext;
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   882
        final String nameStr = name.toString();
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   883
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   884
        if (sctxt != null) {
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   885
            final int scope = sctxt.getAttributesScope(nameStr);
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   886
            if (scope != -1) {
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   887
                return ScriptObjectMirror.unwrap(sctxt.getAttribute(nameStr, scope), global);
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   888
            }
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   889
        }
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   890
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   891
        if (self == UNDEFINED) {
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   892
            // scope access and so throw ReferenceError
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   893
            throw referenceError(global, "not.defined", nameStr);
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   894
        }
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   895
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   896
        return UNDEFINED;
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   897
    }
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   898
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   899
    /**
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   900
     * This is the eval used when 'indirect' eval call is made.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   901
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   902
     * var global = this;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   903
     * global.eval("print('hello')");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   904
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   905
     * @param self  eval scope
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   906
     * @param str   eval string
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   907
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   908
     * @return the result of eval
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   909
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   910
    public static Object eval(final Object self, final Object str) {
25423
ca63828cf996 8047067: all eval arguments need to be copied in Lower
attila
parents: 25422
diff changeset
   911
        return directEval(self, str, UNDEFINED, UNDEFINED, false);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   912
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   913
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   914
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   915
     * Direct eval
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   916
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   917
     * @param self     The scope of eval passed as 'self'
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   918
     * @param str      Evaluated code
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   919
     * @param callThis "this" to be passed to the evaluated code
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   920
     * @param location location of the eval call
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   921
     * @param strict   is eval called a strict mode code?
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   922
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   923
     * @return the return value of the eval
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   924
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   925
     * This is directly invoked from generated when eval(code) is called in user code
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   926
     */
25423
ca63828cf996 8047067: all eval arguments need to be copied in Lower
attila
parents: 25422
diff changeset
   927
    public static Object directEval(final Object self, final Object str, final Object callThis, final Object location, final boolean strict) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   928
        if (!(str instanceof String || str instanceof ConsString)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   929
            return str;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   930
        }
25422
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   931
        final Global global = Global.instanceFrom(self);
24720
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 24719
diff changeset
   932
        final ScriptObject scope = self instanceof ScriptObject ? (ScriptObject)self : global;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   933
25423
ca63828cf996 8047067: all eval arguments need to be copied in Lower
attila
parents: 25422
diff changeset
   934
        return global.getContext().eval(scope, str.toString(), callThis, location, strict, true);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   935
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   936
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   937
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   938
     * Global print implementation - Nashorn extension
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   939
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   940
     * @param self    scope
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   941
     * @param objects arguments to print
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   942
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   943
     * @return result of print (undefined)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   944
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   945
    public static Object print(final Object self, final Object... objects) {
25422
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   946
        return Global.instanceFrom(self).printImpl(false, objects);
16147
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
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   950
     * Global println implementation - Nashorn extension
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   951
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   952
     * @param self    scope
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   953
     * @param objects arguments to print
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   954
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   955
     * @return result of println (undefined)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   956
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   957
    public static Object println(final Object self, final Object... objects) {
25422
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   958
        return Global.instanceFrom(self).printImpl(true, objects);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   959
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   960
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   961
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   962
     * Global load implementation - Nashorn extension
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   963
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   964
     * @param self    scope
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   965
     * @param source  source to load
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   966
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   967
     * @return result of load (undefined)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   968
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   969
     * @throws IOException if source could not be read
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   970
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   971
    public static Object load(final Object self, final Object source) throws IOException {
25422
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   972
        final Global global = Global.instanceFrom(self);
24720
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 24719
diff changeset
   973
        final ScriptObject scope = self instanceof ScriptObject ? (ScriptObject)self : global;
18851
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18842
diff changeset
   974
        return global.getContext().load(scope, source);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   975
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   976
16219
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
   977
    /**
17974
a2818f17324e 8015741: Need a global.load function that starts with a new global scope.
jlaskey
parents: 17972
diff changeset
   978
     * Global loadWithNewGlobal implementation - Nashorn extension
a2818f17324e 8015741: Need a global.load function that starts with a new global scope.
jlaskey
parents: 17972
diff changeset
   979
     *
18326
512bdf9535a6 8016453: loadWithNewGlobal does not allow apply operation
jlaskey
parents: 18321
diff changeset
   980
     * @param self scope
512bdf9535a6 8016453: loadWithNewGlobal does not allow apply operation
jlaskey
parents: 18321
diff changeset
   981
     * @param args from plus (optional) arguments to be passed to the loaded script
17974
a2818f17324e 8015741: Need a global.load function that starts with a new global scope.
jlaskey
parents: 17972
diff changeset
   982
     *
18326
512bdf9535a6 8016453: loadWithNewGlobal does not allow apply operation
jlaskey
parents: 18321
diff changeset
   983
     * @return result of load (may be undefined)
17974
a2818f17324e 8015741: Need a global.load function that starts with a new global scope.
jlaskey
parents: 17972
diff changeset
   984
     *
a2818f17324e 8015741: Need a global.load function that starts with a new global scope.
jlaskey
parents: 17972
diff changeset
   985
     * @throws IOException if source could not be read
a2818f17324e 8015741: Need a global.load function that starts with a new global scope.
jlaskey
parents: 17972
diff changeset
   986
     */
18326
512bdf9535a6 8016453: loadWithNewGlobal does not allow apply operation
jlaskey
parents: 18321
diff changeset
   987
    public static Object loadWithNewGlobal(final Object self, final Object...args) throws IOException {
25422
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
   988
        final Global global = Global.instanceFrom(self);
18326
512bdf9535a6 8016453: loadWithNewGlobal does not allow apply operation
jlaskey
parents: 18321
diff changeset
   989
        final int length = args.length;
512bdf9535a6 8016453: loadWithNewGlobal does not allow apply operation
jlaskey
parents: 18321
diff changeset
   990
        final boolean hasArgs = 0 < length;
512bdf9535a6 8016453: loadWithNewGlobal does not allow apply operation
jlaskey
parents: 18321
diff changeset
   991
        final Object from = hasArgs ? args[0] : UNDEFINED;
512bdf9535a6 8016453: loadWithNewGlobal does not allow apply operation
jlaskey
parents: 18321
diff changeset
   992
        final Object[] arguments = hasArgs ? Arrays.copyOfRange(args, 1, length) : args;
512bdf9535a6 8016453: loadWithNewGlobal does not allow apply operation
jlaskey
parents: 18321
diff changeset
   993
18851
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18842
diff changeset
   994
        return global.getContext().loadWithNewGlobal(from, arguments);
17974
a2818f17324e 8015741: Need a global.load function that starts with a new global scope.
jlaskey
parents: 17972
diff changeset
   995
    }
a2818f17324e 8015741: Need a global.load function that starts with a new global scope.
jlaskey
parents: 17972
diff changeset
   996
a2818f17324e 8015741: Need a global.load function that starts with a new global scope.
jlaskey
parents: 17972
diff changeset
   997
    /**
16219
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
   998
     * Global exit and quit implementation - Nashorn extension: perform a {@code System.exit} call from the script
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
   999
     *
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
  1000
     * @param self  self reference
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
  1001
     * @param code  exit code
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
  1002
     *
24733
1e825be55fd1 8027043: Turn global accesses into MethodHandle.constant, with one chance of reassignment, e.g. x = value occuring once in the global scope is ok, twice is not.
lagergren
parents: 24731
diff changeset
  1003
     * @return undefined (will never be reached)
16219
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
  1004
     */
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
  1005
    public static Object exit(final Object self, final Object code) {
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
  1006
        System.exit(JSType.toInt32(code));
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
  1007
        return UNDEFINED;
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
  1008
    }
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
  1009
18851
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18842
diff changeset
  1010
    // builtin prototype accessors
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1011
    ScriptObject getFunctionPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1012
        return ScriptFunction.getPrototype(builtinFunction);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1013
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1014
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1015
    ScriptObject getObjectPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1016
        return ScriptFunction.getPrototype(builtinObject);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1017
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1018
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1019
    ScriptObject getArrayPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1020
        return ScriptFunction.getPrototype(builtinArray);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1021
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1022
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1023
    ScriptObject getBooleanPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1024
        return ScriptFunction.getPrototype(builtinBoolean);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1025
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1026
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1027
    ScriptObject getNumberPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1028
        return ScriptFunction.getPrototype(builtinNumber);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1029
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1030
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1031
    ScriptObject getDatePrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1032
        return ScriptFunction.getPrototype(builtinDate);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1033
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1034
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1035
    ScriptObject getRegExpPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1036
        return ScriptFunction.getPrototype(builtinRegExp);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1037
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1038
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1039
    ScriptObject getStringPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1040
        return ScriptFunction.getPrototype(builtinString);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1041
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1042
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1043
    ScriptObject getErrorPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1044
        return ScriptFunction.getPrototype(builtinError);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1045
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1046
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1047
    ScriptObject getEvalErrorPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1048
        return ScriptFunction.getPrototype(builtinEvalError);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1049
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1050
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1051
    ScriptObject getRangeErrorPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1052
        return ScriptFunction.getPrototype(builtinRangeError);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1053
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1054
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1055
    ScriptObject getReferenceErrorPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1056
        return ScriptFunction.getPrototype(builtinReferenceError);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1057
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1058
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1059
    ScriptObject getSyntaxErrorPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1060
        return ScriptFunction.getPrototype(builtinSyntaxError);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1061
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1062
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1063
    ScriptObject getTypeErrorPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1064
        return ScriptFunction.getPrototype(builtinTypeError);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1065
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1066
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1067
    ScriptObject getURIErrorPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1068
        return ScriptFunction.getPrototype(builtinURIError);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1069
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1070
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1071
    ScriptObject getJavaImporterPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1072
        return ScriptFunction.getPrototype(builtinJavaImporter);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1073
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1074
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1075
    ScriptObject getJSAdapterPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1076
        return ScriptFunction.getPrototype(builtinJSAdapter);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1077
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1078
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1079
    ScriptObject getArrayBufferPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1080
        return ScriptFunction.getPrototype(builtinArrayBuffer);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1081
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1082
23374
f470afc89c6c 8015958: DataView constructor is not defined
sundar
parents: 23372
diff changeset
  1083
    ScriptObject getDataViewPrototype() {
f470afc89c6c 8015958: DataView constructor is not defined
sundar
parents: 23372
diff changeset
  1084
        return ScriptFunction.getPrototype(builtinDataView);
f470afc89c6c 8015958: DataView constructor is not defined
sundar
parents: 23372
diff changeset
  1085
    }
f470afc89c6c 8015958: DataView constructor is not defined
sundar
parents: 23372
diff changeset
  1086
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1087
    ScriptObject getInt8ArrayPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1088
        return ScriptFunction.getPrototype(builtinInt8Array);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1089
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1090
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1091
    ScriptObject getUint8ArrayPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1092
        return ScriptFunction.getPrototype(builtinUint8Array);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1093
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1094
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1095
    ScriptObject getUint8ClampedArrayPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1096
        return ScriptFunction.getPrototype(builtinUint8ClampedArray);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1097
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1098
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1099
    ScriptObject getInt16ArrayPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1100
        return ScriptFunction.getPrototype(builtinInt16Array);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1101
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1102
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1103
    ScriptObject getUint16ArrayPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1104
        return ScriptFunction.getPrototype(builtinUint16Array);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1105
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1106
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1107
    ScriptObject getInt32ArrayPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1108
        return ScriptFunction.getPrototype(builtinInt32Array);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1109
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1110
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1111
    ScriptObject getUint32ArrayPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1112
        return ScriptFunction.getPrototype(builtinUint32Array);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1113
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1114
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1115
    ScriptObject getFloat32ArrayPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1116
        return ScriptFunction.getPrototype(builtinFloat32Array);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1117
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1118
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1119
    ScriptObject getFloat64ArrayPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1120
        return ScriptFunction.getPrototype(builtinFloat64Array);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1121
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1122
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1123
    private ScriptFunction getBuiltinArray() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1124
        return builtinArray;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1125
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1126
22382
2abc7240ef59 8029612: the typeErrorThrower field in ScriptFunctionImpl cannot be static and common to all Globals
sundar
parents: 21686
diff changeset
  1127
    ScriptFunction getTypeErrorThrower() {
2abc7240ef59 8029612: the typeErrorThrower field in ScriptFunctionImpl cannot be static and common to all Globals
sundar
parents: 21686
diff changeset
  1128
        return typeErrorThrower;
2abc7240ef59 8029612: the typeErrorThrower field in ScriptFunctionImpl cannot be static and common to all Globals
sundar
parents: 21686
diff changeset
  1129
    }
2abc7240ef59 8029612: the typeErrorThrower field in ScriptFunctionImpl cannot be static and common to all Globals
sundar
parents: 21686
diff changeset
  1130
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1131
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1132
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1133
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1134
     * @return true if builtin array has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1135
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1136
    public static boolean isBuiltinArray() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1137
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1138
        return instance.array == instance.getBuiltinArray();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1139
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1140
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1141
    private ScriptFunction getBuiltinBoolean() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1142
        return builtinBoolean;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1143
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1144
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1145
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1146
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1147
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1148
     * @return true if builtin boolean has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1149
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1150
    public static boolean isBuiltinBoolean() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1151
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1152
        return instance._boolean == instance.getBuiltinBoolean();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1153
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1154
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1155
    private ScriptFunction getBuiltinDate() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1156
        return builtinDate;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1157
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1158
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1159
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1160
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1161
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1162
     * @return true if builtin date has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1163
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1164
    public static boolean isBuiltinDate() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1165
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1166
        return instance.date == instance.getBuiltinDate();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1167
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1168
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1169
    private ScriptFunction getBuiltinError() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1170
        return builtinError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1171
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1172
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1173
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1174
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1175
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1176
     * @return true if builtin error has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1177
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1178
    public static boolean isBuiltinError() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1179
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1180
        return instance.error == instance.getBuiltinError();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1181
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1182
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1183
    private ScriptFunction getBuiltinEvalError() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1184
        return builtinEvalError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1185
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1186
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1187
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1188
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1189
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1190
     * @return true if builtin eval error has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1191
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1192
    public static boolean isBuiltinEvalError() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1193
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1194
        return instance.evalError == instance.getBuiltinEvalError();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1195
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1196
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1197
    private ScriptFunction getBuiltinFunction() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1198
        return builtinFunction;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1199
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1200
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1201
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1202
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1203
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1204
     * @return true if builtin function has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1205
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1206
    public static boolean isBuiltinFunction() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1207
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1208
        return instance.function == instance.getBuiltinFunction();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1209
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1210
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1211
    private ScriptFunction getBuiltinJSAdapter() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1212
        return builtinJSAdapter;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1213
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1214
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1215
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1216
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1217
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1218
     * @return true if builtin JSAdapter has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1219
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1220
    public static boolean isBuiltinJSAdapter() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1221
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1222
        return instance.jsadapter == instance.getBuiltinJSAdapter();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1223
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1224
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1225
    private ScriptObject getBuiltinJSON() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1226
        return builtinJSON;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1227
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1228
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1229
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1230
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1231
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1232
     * @return true if builtin JSON has has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1233
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1234
    public static boolean isBuiltinJSON() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1235
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1236
        return instance.json == instance.getBuiltinJSON();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1237
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1238
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1239
    private ScriptObject getBuiltinJava() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1240
        return builtinJava;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1241
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1242
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1243
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1244
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1245
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1246
     * @return true if builtin Java has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1247
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1248
    public static boolean isBuiltinJava() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1249
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1250
        return instance.java == instance.getBuiltinJava();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1251
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1252
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1253
    private ScriptObject getBuiltinJavax() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1254
        return builtinJavax;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1255
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1256
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1257
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1258
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1259
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1260
     * @return true if builtin Javax has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1261
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1262
    public static boolean isBuiltinJavax() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1263
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1264
        return instance.javax == instance.getBuiltinJavax();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1265
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1266
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1267
    private ScriptObject getBuiltinJavaImporter() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1268
        return builtinJavaImporter;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1269
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1270
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1271
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1272
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1273
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1274
     * @return true if builtin Java importer has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1275
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1276
    public static boolean isBuiltinJavaImporter() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1277
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1278
        return instance.javaImporter == instance.getBuiltinJavaImporter();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1279
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1280
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1281
    private ScriptObject getBuiltinMath() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1282
        return builtinMath;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1283
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1284
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1285
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1286
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1287
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1288
     * @return true if builtin math has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1289
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1290
    public static boolean isBuiltinMath() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1291
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1292
        return instance.math == instance.getBuiltinMath();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1293
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1294
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1295
    private ScriptFunction getBuiltinNumber() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1296
        return builtinNumber;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1297
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1298
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1299
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1300
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1301
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1302
     * @return true if builtin number has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1303
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1304
    public static boolean isBuiltinNumber() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1305
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1306
        return instance.number == instance.getBuiltinNumber();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1307
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1308
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1309
    private ScriptFunction getBuiltinObject() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1310
        return builtinObject;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1311
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1312
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1313
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1314
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1315
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1316
     * @return true if builtin object has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1317
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1318
    public static boolean isBuiltinObject() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1319
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1320
        return instance.object == instance.getBuiltinObject();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1321
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1322
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1323
    private ScriptObject getBuiltinPackages() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1324
        return builtinPackages;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1325
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1326
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1327
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1328
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1329
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1330
     * @return true if builtin package has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1331
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1332
    public static boolean isBuiltinPackages() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1333
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1334
        return instance.packages == instance.getBuiltinPackages();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1335
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1336
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1337
    private ScriptFunction getBuiltinRangeError() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1338
        return builtinRangeError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1339
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1340
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1341
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1342
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1343
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1344
     * @return true if builtin range error has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1345
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1346
    public static boolean isBuiltinRangeError() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1347
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1348
        return instance.rangeError == instance.getBuiltinRangeError();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1349
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1350
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1351
    private ScriptFunction getBuiltinReferenceError() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1352
        return builtinReferenceError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1353
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1354
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1355
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1356
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1357
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1358
     * @return true if builtin reference error has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1359
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1360
    public static boolean isBuiltinReferenceError() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1361
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1362
        return instance.referenceError == instance.getBuiltinReferenceError();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1363
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1364
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1365
    private ScriptFunction getBuiltinRegExp() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1366
        return builtinRegExp;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1367
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1368
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1369
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1370
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1371
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1372
     * @return true if builtin regexp has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1373
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1374
    public static boolean isBuiltinRegExp() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1375
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1376
        return instance.regexp == instance.getBuiltinRegExp();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1377
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1378
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1379
    private ScriptFunction getBuiltinString() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1380
        return builtinString;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1381
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1382
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1383
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1384
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1385
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1386
     * @return true if builtin Java has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1387
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1388
    public static boolean isBuiltinString() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1389
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1390
        return instance.string == instance.getBuiltinString();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1391
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1392
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1393
    private ScriptFunction getBuiltinSyntaxError() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1394
        return builtinSyntaxError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1395
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1396
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1397
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1398
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1399
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1400
     * @return true if builtin syntax error has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1401
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1402
    public static boolean isBuiltinSyntaxError() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1403
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1404
        return instance.syntaxError == instance.getBuiltinSyntaxError();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1405
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1406
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1407
    private ScriptFunction getBuiltinTypeError() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1408
        return builtinTypeError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1409
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1410
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1411
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1412
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1413
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1414
     * @return true if builtin type error has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1415
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1416
    public static boolean isBuiltinTypeError() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1417
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1418
        return instance.typeError == instance.getBuiltinTypeError();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1419
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1420
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1421
    private ScriptFunction getBuiltinURIError() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1422
        return builtinURIError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1423
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1424
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1425
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1426
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1427
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1428
     * @return true if builtin URI error has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1429
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1430
    public static boolean isBuiltinURIError() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1431
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1432
        return instance.uriError == instance.getBuiltinURIError();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1433
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1434
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1435
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1436
    public String getClassName() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1437
        return "global";
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1438
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1439
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1440
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1441
     * Copy function used to clone NativeRegExp objects.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1442
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1443
     * @param regexp a NativeRegExp to clone
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1444
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1445
     * @return copy of the given regexp object
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1446
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1447
    public static Object regExpCopy(final Object regexp) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1448
        return new NativeRegExp((NativeRegExp)regexp);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1449
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1450
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1451
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1452
     * Convert given object to NativeRegExp type.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1453
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1454
     * @param obj object to be converted
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1455
     * @return NativeRegExp instance
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1456
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1457
    public static NativeRegExp toRegExp(final Object obj) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1458
        if (obj instanceof NativeRegExp) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1459
            return (NativeRegExp)obj;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1460
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1461
        return new NativeRegExp(JSType.toString(obj));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1462
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1463
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1464
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1465
     * ECMA 9.9 ToObject implementation
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1466
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1467
     * @param obj  an item for which to run ToObject
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1468
     * @return ToObject version of given item
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1469
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1470
    public static Object toObject(final Object obj) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1471
        if (obj == null || obj == UNDEFINED) {
16256
f2d9a0c49914 8007002: Replace implicit exception throwing methods with explicit throws - simplify control flow and remove useless code
lagergren
parents: 16234
diff changeset
  1472
            throw typeError("not.an.object", ScriptRuntime.safeToString(obj));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1473
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1474
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1475
        if (obj instanceof ScriptObject) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1476
            return obj;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1477
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1478
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1479
        return instance().wrapAsObject(obj);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1480
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1481
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1482
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1483
     * Allocate a new object array.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1484
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1485
     * @param initial object values.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1486
     * @return the new array
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1487
     */
16210
8ad1381b69d0 8007215: Varargs broken for the case of passing more than the arg limit arguments.
lagergren
parents: 16207
diff changeset
  1488
    public static NativeArray allocate(final Object[] initial) {
18618
136279c4cbe6 8019157: Avoid calling ScriptObject.setProto() if possible
hannesw
parents: 18610
diff changeset
  1489
        ArrayData arrayData = ArrayData.allocate(initial);
136279c4cbe6 8019157: Avoid calling ScriptObject.setProto() if possible
hannesw
parents: 18610
diff changeset
  1490
136279c4cbe6 8019157: Avoid calling ScriptObject.setProto() if possible
hannesw
parents: 18610
diff changeset
  1491
        for (int index = 0; index < initial.length; index++) {
136279c4cbe6 8019157: Avoid calling ScriptObject.setProto() if possible
hannesw
parents: 18610
diff changeset
  1492
            final Object value = initial[index];
136279c4cbe6 8019157: Avoid calling ScriptObject.setProto() if possible
hannesw
parents: 18610
diff changeset
  1493
136279c4cbe6 8019157: Avoid calling ScriptObject.setProto() if possible
hannesw
parents: 18610
diff changeset
  1494
            if (value == ScriptRuntime.EMPTY) {
136279c4cbe6 8019157: Avoid calling ScriptObject.setProto() if possible
hannesw
parents: 18610
diff changeset
  1495
                arrayData = arrayData.delete(index);
136279c4cbe6 8019157: Avoid calling ScriptObject.setProto() if possible
hannesw
parents: 18610
diff changeset
  1496
            }
136279c4cbe6 8019157: Avoid calling ScriptObject.setProto() if possible
hannesw
parents: 18610
diff changeset
  1497
        }
136279c4cbe6 8019157: Avoid calling ScriptObject.setProto() if possible
hannesw
parents: 18610
diff changeset
  1498
136279c4cbe6 8019157: Avoid calling ScriptObject.setProto() if possible
hannesw
parents: 18610
diff changeset
  1499
        return new NativeArray(arrayData);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1500
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1501
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1502
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1503
     * Allocate a new number array.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1504
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1505
     * @param initial number values.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1506
     * @return the new array
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1507
     */
16210
8ad1381b69d0 8007215: Varargs broken for the case of passing more than the arg limit arguments.
lagergren
parents: 16207
diff changeset
  1508
    public static NativeArray allocate(final double[] initial) {
18618
136279c4cbe6 8019157: Avoid calling ScriptObject.setProto() if possible
hannesw
parents: 18610
diff changeset
  1509
        return new NativeArray(ArrayData.allocate(initial));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1510
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1511
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1512
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1513
     * Allocate a new long array.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1514
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1515
     * @param initial number values.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1516
     * @return the new array
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1517
     */
16210
8ad1381b69d0 8007215: Varargs broken for the case of passing more than the arg limit arguments.
lagergren
parents: 16207
diff changeset
  1518
    public static NativeArray allocate(final long[] initial) {
18618
136279c4cbe6 8019157: Avoid calling ScriptObject.setProto() if possible
hannesw
parents: 18610
diff changeset
  1519
        return new NativeArray(ArrayData.allocate(initial));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1520
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1521
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1522
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1523
     * Allocate a new integer array.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1524
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1525
     * @param initial number values.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1526
     * @return the new array
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1527
     */
16210
8ad1381b69d0 8007215: Varargs broken for the case of passing more than the arg limit arguments.
lagergren
parents: 16207
diff changeset
  1528
    public static NativeArray allocate(final int[] initial) {
18618
136279c4cbe6 8019157: Avoid calling ScriptObject.setProto() if possible
hannesw
parents: 18610
diff changeset
  1529
        return new NativeArray(ArrayData.allocate(initial));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1530
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1531
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1532
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1533
     * Allocate a new object array for arguments.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1534
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1535
     * @param arguments initial arguments passed.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1536
     * @param callee reference to the function that uses arguments object
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1537
     * @param numParams actual number of declared parameters
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1538
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1539
     * @return the new array
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1540
     */
16206
83069fa0935b 8006529: Methods always get callee - it should be conditional
attila
parents: 16196
diff changeset
  1541
    public static ScriptObject allocateArguments(final Object[] arguments, final Object callee, final int numParams) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1542
        return NativeArguments.allocate(arguments, (ScriptFunction)callee, numParams);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1543
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1544
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1545
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1546
     * Called from generated to check if given function is the builtin 'eval'. If
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1547
     * eval is used in a script, a lot of optimizations and assumptions cannot be done.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1548
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1549
     * @param  fn function object that is checked
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1550
     * @return true if fn is the builtin eval
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1551
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1552
    public static boolean isEval(final Object fn) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1553
        return fn == Global.instance().builtinEval;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1554
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1555
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1556
    /**
24719
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 22389
diff changeset
  1557
     * Called from generated to replace a location property placeholder with the actual location property value.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 22389
diff changeset
  1558
     *
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 22389
diff changeset
  1559
     * @param  placeholder the value tested for being a placeholder for a location property
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 22389
diff changeset
  1560
     * @param  locationProperty the actual value for the location property
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 22389
diff changeset
  1561
     * @return locationProperty if placeholder is indeed a placeholder for a location property, the placeholder otherwise
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 22389
diff changeset
  1562
     */
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 22389
diff changeset
  1563
    public static Object replaceLocationPropertyPlaceholder(final Object placeholder, final Object locationProperty) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 22389
diff changeset
  1564
        return isLocationPropertyPlaceholder(placeholder) ? locationProperty : placeholder;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 22389
diff changeset
  1565
    }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 22389
diff changeset
  1566
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 22389
diff changeset
  1567
    /**
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 22389
diff changeset
  1568
     * Called from runtime internals to check if the passed value is a location property placeholder.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 22389
diff changeset
  1569
     * @param  placeholder the value tested for being a placeholder for a location property
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 22389
diff changeset
  1570
     * @return true if the value is a placeholder, false otherwise.
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 22389
diff changeset
  1571
     */
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 22389
diff changeset
  1572
    public static boolean isLocationPropertyPlaceholder(final Object placeholder) {
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 22389
diff changeset
  1573
        return placeholder == LOCATION_PROPERTY_PLACEHOLDER;
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 22389
diff changeset
  1574
    }
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 22389
diff changeset
  1575
f726e9d67629 8035820: Optimistic recompilation
attila
parents: 22389
diff changeset
  1576
    /**
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1577
     * Create a new RegExp object.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1578
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1579
     * @param expression Regular expression.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1580
     * @param options    Search options.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1581
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1582
     * @return New RegExp object.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1583
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1584
    public static Object newRegExp(final String expression, final String options) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1585
        if (options == null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1586
            return new NativeRegExp(expression);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1587
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1588
        return new NativeRegExp(expression, options);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1589
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1590
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1591
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1592
     * Get the object prototype
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1593
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1594
     * @return the object prototype
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1595
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1596
    public static ScriptObject objectPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1597
        return Global.instance().getObjectPrototype();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1598
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1599
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1600
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1601
     * Create a new empty object instance.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1602
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1603
     * @return New empty object.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1604
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1605
    public static ScriptObject newEmptyInstance() {
18618
136279c4cbe6 8019157: Avoid calling ScriptObject.setProto() if possible
hannesw
parents: 18610
diff changeset
  1606
        return Global.instance().newObject();
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1607
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1608
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1609
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1610
     * Check if a given object is a ScriptObject, raises an exception if this is
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1611
     * not the case
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1612
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1613
     * @param obj and object to check
24720
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 24719
diff changeset
  1614
     * @return the script object
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1615
     */
24720
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 24719
diff changeset
  1616
    public static ScriptObject checkObject(final Object obj) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1617
        if (!(obj instanceof ScriptObject)) {
16256
f2d9a0c49914 8007002: Replace implicit exception throwing methods with explicit throws - simplify control flow and remove useless code
lagergren
parents: 16234
diff changeset
  1618
            throw typeError("not.an.object", ScriptRuntime.safeToString(obj));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1619
        }
24720
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 24719
diff changeset
  1620
        return (ScriptObject)obj;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1621
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1622
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1623
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1624
     * ECMA 9.10 - implementation of CheckObjectCoercible, i.e. raise an exception
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1625
     * if this object is null or undefined.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1626
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1627
     * @param obj an object to check
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1628
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1629
    public static void checkObjectCoercible(final Object obj) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1630
        if (obj == null || obj == UNDEFINED) {
16256
f2d9a0c49914 8007002: Replace implicit exception throwing methods with explicit throws - simplify control flow and remove useless code
lagergren
parents: 16234
diff changeset
  1631
            throw typeError("not.an.object", ScriptRuntime.safeToString(obj));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1632
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1633
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1634
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1635
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1636
     * Get the current split state.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1637
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1638
     * @return current split state
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1639
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1640
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1641
    public int getSplitState() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1642
        return splitState;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1643
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1644
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1645
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1646
     * Set the current split state.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1647
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1648
     * @param state current split state
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1649
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1650
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1651
    public void setSplitState(final int state) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1652
        splitState = state;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1653
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1654
25422
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
  1655
    private void init(final ScriptEngine engine) {
16185
893aabe8c800 8006635: Reduce access levels as much as possible
sundar
parents: 16181
diff changeset
  1656
        assert Context.getGlobal() == this : "this global is not set as current";
893aabe8c800 8006635: Reduce access levels as much as possible
sundar
parents: 16181
diff changeset
  1657
18851
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18842
diff changeset
  1658
        final ScriptEnvironment env = getContext().getEnv();
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18842
diff changeset
  1659
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1660
        // initialize Function and Object constructor
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1661
        initFunctionAndObject();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1662
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1663
        // Now fix Global's own proto.
23084
6c5c02d1023a 8035948: Redesign property listeners for shared classes
hannesw
parents: 22389
diff changeset
  1664
        this.setInitialProto(getObjectPrototype());
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1665
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1666
        // initialize global function properties
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1667
        this.eval = this.builtinEval = ScriptFunctionImpl.makeFunction("eval", EVAL);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1668
24720
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 24719
diff changeset
  1669
        this.parseInt           = ScriptFunctionImpl.makeFunction("parseInt",   GlobalFunctions.PARSEINT,
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 24719
diff changeset
  1670
                new MethodHandle[] { GlobalFunctions.PARSEINT_OI, GlobalFunctions.PARSEINT_O });
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1671
        this.parseFloat         = ScriptFunctionImpl.makeFunction("parseFloat", GlobalFunctions.PARSEFLOAT);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1672
        this.isNaN              = ScriptFunctionImpl.makeFunction("isNaN",      GlobalFunctions.IS_NAN);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1673
        this.isFinite           = ScriptFunctionImpl.makeFunction("isFinite",   GlobalFunctions.IS_FINITE);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1674
        this.encodeURI          = ScriptFunctionImpl.makeFunction("encodeURI",  GlobalFunctions.ENCODE_URI);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1675
        this.encodeURIComponent = ScriptFunctionImpl.makeFunction("encodeURIComponent", GlobalFunctions.ENCODE_URICOMPONENT);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1676
        this.decodeURI          = ScriptFunctionImpl.makeFunction("decodeURI",  GlobalFunctions.DECODE_URI);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1677
        this.decodeURIComponent = ScriptFunctionImpl.makeFunction("decodeURIComponent", GlobalFunctions.DECODE_URICOMPONENT);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1678
        this.escape             = ScriptFunctionImpl.makeFunction("escape",     GlobalFunctions.ESCAPE);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1679
        this.unescape           = ScriptFunctionImpl.makeFunction("unescape",   GlobalFunctions.UNESCAPE);
16262
75513555e603 8008731: Separate configuration environment (options, error/output writer etc.) from Context
sundar
parents: 16258
diff changeset
  1680
        this.print              = ScriptFunctionImpl.makeFunction("print",      env._print_no_newline ? PRINT : PRINTLN);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1681
        this.load               = ScriptFunctionImpl.makeFunction("load",       LOAD);
17974
a2818f17324e 8015741: Need a global.load function that starts with a new global scope.
jlaskey
parents: 17972
diff changeset
  1682
        this.loadWithNewGlobal  = ScriptFunctionImpl.makeFunction("loadWithNewGlobal", LOADWITHNEWGLOBAL);
16219
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
  1683
        this.exit               = ScriptFunctionImpl.makeFunction("exit",       EXIT);
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
  1684
        this.quit               = ScriptFunctionImpl.makeFunction("quit",       EXIT);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1685
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1686
        // built-in constructors
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1687
        this.builtinArray     = (ScriptFunction)initConstructor("Array");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1688
        this.builtinBoolean   = (ScriptFunction)initConstructor("Boolean");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1689
        this.builtinDate      = (ScriptFunction)initConstructor("Date");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1690
        this.builtinJSON      = initConstructor("JSON");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1691
        this.builtinJSAdapter = (ScriptFunction)initConstructor("JSAdapter");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1692
        this.builtinMath      = initConstructor("Math");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1693
        this.builtinNumber    = (ScriptFunction)initConstructor("Number");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1694
        this.builtinRegExp    = (ScriptFunction)initConstructor("RegExp");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1695
        this.builtinString    = (ScriptFunction)initConstructor("String");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1696
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1697
        // initialize String.prototype.length to 0
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1698
        // add String.prototype.length
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1699
        final ScriptObject stringPrototype = getStringPrototype();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1700
        stringPrototype.addOwnProperty("length", Attribute.NON_ENUMERABLE_CONSTANT, 0.0);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1701
21439
31c57355a4a7 8026805: Array.prototype.length doesn't work as expected
hannesw
parents: 20933
diff changeset
  1702
        // set isArray flag on Array.prototype
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1703
        final ScriptObject arrayPrototype = getArrayPrototype();
21439
31c57355a4a7 8026805: Array.prototype.length doesn't work as expected
hannesw
parents: 20933
diff changeset
  1704
        arrayPrototype.setIsArray();
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1705
18851
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18842
diff changeset
  1706
        this.DEFAULT_DATE = new NativeDate(Double.NaN, this);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1707
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1708
        // initialize default regexp object
18851
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18842
diff changeset
  1709
        this.DEFAULT_REGEXP = new NativeRegExp("(?:)", this);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1710
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1711
        // RegExp.prototype should behave like a RegExp object. So copy the
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1712
        // properties.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1713
        final ScriptObject regExpProto = getRegExpPrototype();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1714
        regExpProto.addBoundProperties(DEFAULT_REGEXP);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1715
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1716
        // Error stuff
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1717
        initErrorObjects();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1718
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1719
        // java access
18855
408663ef8f66 8020015: shared PropertyMaps should not be used without duplication
sundar
parents: 18851
diff changeset
  1720
        if (! env._no_java) {
408663ef8f66 8020015: shared PropertyMaps should not be used without duplication
sundar
parents: 18851
diff changeset
  1721
            initJavaAccess();
408663ef8f66 8020015: shared PropertyMaps should not be used without duplication
sundar
parents: 18851
diff changeset
  1722
        }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1723
18855
408663ef8f66 8020015: shared PropertyMaps should not be used without duplication
sundar
parents: 18851
diff changeset
  1724
        if (! env._no_typed_arrays) {
408663ef8f66 8020015: shared PropertyMaps should not be used without duplication
sundar
parents: 18851
diff changeset
  1725
            initTypedArray();
408663ef8f66 8020015: shared PropertyMaps should not be used without duplication
sundar
parents: 18851
diff changeset
  1726
        }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1727
16262
75513555e603 8008731: Separate configuration environment (options, error/output writer etc.) from Context
sundar
parents: 16258
diff changeset
  1728
        if (env._scripting) {
18855
408663ef8f66 8020015: shared PropertyMaps should not be used without duplication
sundar
parents: 18851
diff changeset
  1729
            initScripting(env);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1730
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1731
22389
ea3dda90768c 8032060: PropertyMap of Error objects is not stable
sundar
parents: 22382
diff changeset
  1732
        if (Context.DEBUG) {
ea3dda90768c 8032060: PropertyMap of Error objects is not stable
sundar
parents: 22382
diff changeset
  1733
            boolean debugOkay;
ea3dda90768c 8032060: PropertyMap of Error objects is not stable
sundar
parents: 22382
diff changeset
  1734
            final SecurityManager sm = System.getSecurityManager();
ea3dda90768c 8032060: PropertyMap of Error objects is not stable
sundar
parents: 22382
diff changeset
  1735
            if (sm != null) {
ea3dda90768c 8032060: PropertyMap of Error objects is not stable
sundar
parents: 22382
diff changeset
  1736
                try {
ea3dda90768c 8032060: PropertyMap of Error objects is not stable
sundar
parents: 22382
diff changeset
  1737
                    sm.checkPermission(new RuntimePermission(Context.NASHORN_DEBUG_MODE));
ea3dda90768c 8032060: PropertyMap of Error objects is not stable
sundar
parents: 22382
diff changeset
  1738
                    debugOkay = true;
ea3dda90768c 8032060: PropertyMap of Error objects is not stable
sundar
parents: 22382
diff changeset
  1739
                } catch (final SecurityException ignored) {
ea3dda90768c 8032060: PropertyMap of Error objects is not stable
sundar
parents: 22382
diff changeset
  1740
                    // if no permission, don't initialize Debug object
ea3dda90768c 8032060: PropertyMap of Error objects is not stable
sundar
parents: 22382
diff changeset
  1741
                    debugOkay = false;
ea3dda90768c 8032060: PropertyMap of Error objects is not stable
sundar
parents: 22382
diff changeset
  1742
                }
ea3dda90768c 8032060: PropertyMap of Error objects is not stable
sundar
parents: 22382
diff changeset
  1743
ea3dda90768c 8032060: PropertyMap of Error objects is not stable
sundar
parents: 22382
diff changeset
  1744
            } else {
ea3dda90768c 8032060: PropertyMap of Error objects is not stable
sundar
parents: 22382
diff changeset
  1745
                debugOkay = true;
ea3dda90768c 8032060: PropertyMap of Error objects is not stable
sundar
parents: 22382
diff changeset
  1746
            }
ea3dda90768c 8032060: PropertyMap of Error objects is not stable
sundar
parents: 22382
diff changeset
  1747
ea3dda90768c 8032060: PropertyMap of Error objects is not stable
sundar
parents: 22382
diff changeset
  1748
            if (debugOkay) {
ea3dda90768c 8032060: PropertyMap of Error objects is not stable
sundar
parents: 22382
diff changeset
  1749
                initDebug();
ea3dda90768c 8032060: PropertyMap of Error objects is not stable
sundar
parents: 22382
diff changeset
  1750
            }
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1751
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1752
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1753
        copyBuiltins();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1754
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1755
        // expose script (command line) arguments as "arguments" property of global
25422
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
  1756
        arguments = wrapAsObject(env.getArguments().toArray());
16262
75513555e603 8008731: Separate configuration environment (options, error/output writer etc.) from Context
sundar
parents: 16258
diff changeset
  1757
        if (env._scripting) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1758
            // synonym for "arguments" in scripting mode
25422
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
  1759
            addOwnProperty("$ARG", Attribute.NOT_ENUMERABLE, arguments);
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
  1760
        }
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
  1761
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
  1762
        if (engine != null) {
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
  1763
            final int NOT_ENUMERABLE_NOT_CONFIG = Attribute.NOT_ENUMERABLE | Attribute.NOT_CONFIGURABLE;
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
  1764
            scontextProperty = addOwnProperty("context", NOT_ENUMERABLE_NOT_CONFIG, null);
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
  1765
            addOwnProperty("engine", NOT_ENUMERABLE_NOT_CONFIG, engine);
25585
0968d8ab046a 8050432: javax.script.filename variable should not be enumerable with nashorn engine's ENGINE_SCOPE bindings
sundar
parents: 25423
diff changeset
  1766
            // default file name
0968d8ab046a 8050432: javax.script.filename variable should not be enumerable with nashorn engine's ENGINE_SCOPE bindings
sundar
parents: 25423
diff changeset
  1767
            addOwnProperty(ScriptEngine.FILENAME, Attribute.NOT_ENUMERABLE, null);
25422
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
  1768
            // __noSuchProperty__ hook for ScriptContext search of missing variables
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
  1769
            final ScriptFunction noSuchProp = ScriptFunctionImpl.makeStrictFunction(NO_SUCH_PROPERTY_NAME, NO_SUCH_PROPERTY);
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
  1770
            addOwnProperty(NO_SUCH_PROPERTY_NAME, Attribute.NOT_ENUMERABLE, noSuchProp);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1771
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1772
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1773
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1774
    private void initErrorObjects() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1775
        // Error objects
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1776
        this.builtinError = (ScriptFunction)initConstructor("Error");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1777
        final ScriptObject errorProto = getErrorPrototype();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1778
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1779
        // Nashorn specific accessors on Error.prototype - stack, lineNumber, columnNumber and fileName
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1780
        final ScriptFunction getStack = ScriptFunctionImpl.makeFunction("getStack", NativeError.GET_STACK);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1781
        final ScriptFunction setStack = ScriptFunctionImpl.makeFunction("setStack", NativeError.SET_STACK);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1782
        errorProto.addOwnProperty("stack", Attribute.NOT_ENUMERABLE, getStack, setStack);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1783
        final ScriptFunction getLineNumber = ScriptFunctionImpl.makeFunction("getLineNumber", NativeError.GET_LINENUMBER);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1784
        final ScriptFunction setLineNumber = ScriptFunctionImpl.makeFunction("setLineNumber", NativeError.SET_LINENUMBER);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1785
        errorProto.addOwnProperty("lineNumber", Attribute.NOT_ENUMERABLE, getLineNumber, setLineNumber);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1786
        final ScriptFunction getColumnNumber = ScriptFunctionImpl.makeFunction("getColumnNumber", NativeError.GET_COLUMNNUMBER);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1787
        final ScriptFunction setColumnNumber = ScriptFunctionImpl.makeFunction("setColumnNumber", NativeError.SET_COLUMNNUMBER);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1788
        errorProto.addOwnProperty("columnNumber", Attribute.NOT_ENUMERABLE, getColumnNumber, setColumnNumber);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1789
        final ScriptFunction getFileName = ScriptFunctionImpl.makeFunction("getFileName", NativeError.GET_FILENAME);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1790
        final ScriptFunction setFileName = ScriptFunctionImpl.makeFunction("setFileName", NativeError.SET_FILENAME);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1791
        errorProto.addOwnProperty("fileName", Attribute.NOT_ENUMERABLE, getFileName, setFileName);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1792
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1793
        // ECMA 15.11.4.2 Error.prototype.name
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1794
        // Error.prototype.name = "Error";
18328
ebd24057f163 8015355: Array.prototype functions don't honour non-writable length and / or index properties
sundar
parents: 18326
diff changeset
  1795
        errorProto.set(NativeError.NAME, "Error", false);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1796
        // ECMA 15.11.4.3 Error.prototype.message
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1797
        // Error.prototype.message = "";
18328
ebd24057f163 8015355: Array.prototype functions don't honour non-writable length and / or index properties
sundar
parents: 18326
diff changeset
  1798
        errorProto.set(NativeError.MESSAGE, "", false);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1799
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1800
        this.builtinEvalError = initErrorSubtype("EvalError", errorProto);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1801
        this.builtinRangeError = initErrorSubtype("RangeError", errorProto);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1802
        this.builtinReferenceError = initErrorSubtype("ReferenceError", errorProto);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1803
        this.builtinSyntaxError = initErrorSubtype("SyntaxError", errorProto);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1804
        this.builtinTypeError = initErrorSubtype("TypeError", errorProto);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1805
        this.builtinURIError = initErrorSubtype("URIError", errorProto);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1806
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1807
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1808
    private ScriptFunction initErrorSubtype(final String name, final ScriptObject errorProto) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1809
        final ScriptObject cons = initConstructor(name);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1810
        final ScriptObject prototype = ScriptFunction.getPrototype(cons);
18328
ebd24057f163 8015355: Array.prototype functions don't honour non-writable length and / or index properties
sundar
parents: 18326
diff changeset
  1811
        prototype.set(NativeError.NAME, name, false);
ebd24057f163 8015355: Array.prototype functions don't honour non-writable length and / or index properties
sundar
parents: 18326
diff changeset
  1812
        prototype.set(NativeError.MESSAGE, "", false);
23084
6c5c02d1023a 8035948: Redesign property listeners for shared classes
hannesw
parents: 22389
diff changeset
  1813
        prototype.setInitialProto(errorProto);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1814
        return (ScriptFunction)cons;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1815
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1816
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1817
    private void initJavaAccess() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1818
        final ScriptObject objectProto = getObjectPrototype();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1819
        this.builtinPackages = new NativeJavaPackage("", objectProto);
16532
fe016e9cae59 8010709: org on the top level doesn't resolve
sundar
parents: 16525
diff changeset
  1820
        this.builtinCom = new NativeJavaPackage("com", objectProto);
fe016e9cae59 8010709: org on the top level doesn't resolve
sundar
parents: 16525
diff changeset
  1821
        this.builtinEdu = new NativeJavaPackage("edu", objectProto);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1822
        this.builtinJava = new NativeJavaPackage("java", objectProto);
16532
fe016e9cae59 8010709: org on the top level doesn't resolve
sundar
parents: 16525
diff changeset
  1823
        this.builtinJavafx = new NativeJavaPackage("javafx", objectProto);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1824
        this.builtinJavax = new NativeJavaPackage("javax", objectProto);
16532
fe016e9cae59 8010709: org on the top level doesn't resolve
sundar
parents: 16525
diff changeset
  1825
        this.builtinOrg = new NativeJavaPackage("org", objectProto);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1826
        this.builtinJavaImporter = initConstructor("JavaImporter");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1827
        this.builtinJavaApi = initConstructor("Java");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1828
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1829
18855
408663ef8f66 8020015: shared PropertyMaps should not be used without duplication
sundar
parents: 18851
diff changeset
  1830
    private void initScripting(final ScriptEnvironment scriptEnv) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1831
        Object value;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1832
        value = ScriptFunctionImpl.makeFunction("readLine", ScriptingFunctions.READLINE);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1833
        addOwnProperty("readLine", Attribute.NOT_ENUMERABLE, value);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1834
16196
58f6f046bb5e 8006983: Introduce a command line option to switch off syntactic extensions of nashorn
sundar
parents: 16195
diff changeset
  1835
        value = ScriptFunctionImpl.makeFunction("readFully", ScriptingFunctions.READFULLY);
58f6f046bb5e 8006983: Introduce a command line option to switch off syntactic extensions of nashorn
sundar
parents: 16195
diff changeset
  1836
        addOwnProperty("readFully", Attribute.NOT_ENUMERABLE, value);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1837
16211
41e031a45186 8006191: `cmd` -> exec("cmd") in script mode
jlaskey
parents: 16210
diff changeset
  1838
        final String execName = ScriptingFunctions.EXEC_NAME;
41e031a45186 8006191: `cmd` -> exec("cmd") in script mode
jlaskey
parents: 16210
diff changeset
  1839
        value = ScriptFunctionImpl.makeFunction(execName, ScriptingFunctions.EXEC);
41e031a45186 8006191: `cmd` -> exec("cmd") in script mode
jlaskey
parents: 16210
diff changeset
  1840
        addOwnProperty(execName, Attribute.NOT_ENUMERABLE, value);
41e031a45186 8006191: `cmd` -> exec("cmd") in script mode
jlaskey
parents: 16210
diff changeset
  1841
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1842
        // Nashorn extension: global.echo (scripting-mode-only)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1843
        // alias for "print"
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1844
        value = get("print");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1845
        addOwnProperty("echo", Attribute.NOT_ENUMERABLE, value);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1846
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1847
        // Nashorn extension: global.$OPTIONS (scripting-mode-only)
18618
136279c4cbe6 8019157: Avoid calling ScriptObject.setProto() if possible
hannesw
parents: 18610
diff changeset
  1848
        final ScriptObject options = newObject();
16522
d643e3ee819c 8009757: Package access clean up and refactoring
sundar
parents: 16277
diff changeset
  1849
        copyOptions(options, scriptEnv);
d643e3ee819c 8009757: Package access clean up and refactoring
sundar
parents: 16277
diff changeset
  1850
        addOwnProperty("$OPTIONS", Attribute.NOT_ENUMERABLE, options);
16211
41e031a45186 8006191: `cmd` -> exec("cmd") in script mode
jlaskey
parents: 16210
diff changeset
  1851
41e031a45186 8006191: `cmd` -> exec("cmd") in script mode
jlaskey
parents: 16210
diff changeset
  1852
        // Nashorn extension: global.$ENV (scripting-mode-only)
16213
66cb726a76d5 8007521: $ENV should be undefined when security manager is present
sundar
parents: 16211
diff changeset
  1853
        if (System.getSecurityManager() == null) {
66cb726a76d5 8007521: $ENV should be undefined when security manager is present
sundar
parents: 16211
diff changeset
  1854
            // do not fill $ENV if we have a security manager around
66cb726a76d5 8007521: $ENV should be undefined when security manager is present
sundar
parents: 16211
diff changeset
  1855
            // Retrieve current state of ENV variables.
18618
136279c4cbe6 8019157: Avoid calling ScriptObject.setProto() if possible
hannesw
parents: 18610
diff changeset
  1856
            final ScriptObject env = newObject();
19884
1bacbaa1bfc7 8024180: Incorrect handling of expression and parent scope in 'with' statements
sundar
parents: 19459
diff changeset
  1857
            env.putAll(System.getenv(), scriptEnv._strict);
16213
66cb726a76d5 8007521: $ENV should be undefined when security manager is present
sundar
parents: 16211
diff changeset
  1858
            addOwnProperty(ScriptingFunctions.ENV_NAME, Attribute.NOT_ENUMERABLE, env);
66cb726a76d5 8007521: $ENV should be undefined when security manager is present
sundar
parents: 16211
diff changeset
  1859
        } else {
66cb726a76d5 8007521: $ENV should be undefined when security manager is present
sundar
parents: 16211
diff changeset
  1860
            addOwnProperty(ScriptingFunctions.ENV_NAME, Attribute.NOT_ENUMERABLE, UNDEFINED);
66cb726a76d5 8007521: $ENV should be undefined when security manager is present
sundar
parents: 16211
diff changeset
  1861
        }
66cb726a76d5 8007521: $ENV should be undefined when security manager is present
sundar
parents: 16211
diff changeset
  1862
66cb726a76d5 8007521: $ENV should be undefined when security manager is present
sundar
parents: 16211
diff changeset
  1863
        // add other special properties for exec support
66cb726a76d5 8007521: $ENV should be undefined when security manager is present
sundar
parents: 16211
diff changeset
  1864
        addOwnProperty(ScriptingFunctions.OUT_NAME, Attribute.NOT_ENUMERABLE, UNDEFINED);
66cb726a76d5 8007521: $ENV should be undefined when security manager is present
sundar
parents: 16211
diff changeset
  1865
        addOwnProperty(ScriptingFunctions.ERR_NAME, Attribute.NOT_ENUMERABLE, UNDEFINED);
66cb726a76d5 8007521: $ENV should be undefined when security manager is present
sundar
parents: 16211
diff changeset
  1866
        addOwnProperty(ScriptingFunctions.EXIT_NAME, Attribute.NOT_ENUMERABLE, UNDEFINED);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1867
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1868
16525
1409942e618e 8009982: Lazy execution bugfix. Added lazy sunspider unit test. Added mandreel to compile-octane test. Fixed warnings
lagergren
parents: 16522
diff changeset
  1869
    private static void copyOptions(final ScriptObject options, final ScriptEnvironment scriptEnv) {
24720
75f8388b79df 8035836: Array performance improvements
lagergren
parents: 24719
diff changeset
  1870
        for (final Field f : scriptEnv.getClass().getFields()) {
19459
79e75274df99 8022707: Revisit all doPrivileged blocks
sundar
parents: 19456
diff changeset
  1871
            try {
79e75274df99 8022707: Revisit all doPrivileged blocks
sundar
parents: 19456
diff changeset
  1872
                options.set(f.getName(), f.get(scriptEnv), false);
79e75274df99 8022707: Revisit all doPrivileged blocks
sundar
parents: 19456
diff changeset
  1873
            } catch (final IllegalArgumentException | IllegalAccessException exp) {
79e75274df99 8022707: Revisit all doPrivileged blocks
sundar
parents: 19456
diff changeset
  1874
                throw new RuntimeException(exp);
16522
d643e3ee819c 8009757: Package access clean up and refactoring
sundar
parents: 16277
diff changeset
  1875
            }
19459
79e75274df99 8022707: Revisit all doPrivileged blocks
sundar
parents: 19456
diff changeset
  1876
        }
16522
d643e3ee819c 8009757: Package access clean up and refactoring
sundar
parents: 16277
diff changeset
  1877
    }
d643e3ee819c 8009757: Package access clean up and refactoring
sundar
parents: 16277
diff changeset
  1878
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1879
    private void initTypedArray() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1880
        this.builtinArrayBuffer       = initConstructor("ArrayBuffer");
23374
f470afc89c6c 8015958: DataView constructor is not defined
sundar
parents: 23372
diff changeset
  1881
        this.builtinDataView          = initConstructor("DataView");
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1882
        this.builtinInt8Array         = initConstructor("Int8Array");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1883
        this.builtinUint8Array        = initConstructor("Uint8Array");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1884
        this.builtinUint8ClampedArray = initConstructor("Uint8ClampedArray");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1885
        this.builtinInt16Array        = initConstructor("Int16Array");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1886
        this.builtinUint16Array       = initConstructor("Uint16Array");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1887
        this.builtinInt32Array        = initConstructor("Int32Array");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1888
        this.builtinUint32Array       = initConstructor("Uint32Array");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1889
        this.builtinFloat32Array      = initConstructor("Float32Array");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1890
        this.builtinFloat64Array      = initConstructor("Float64Array");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1891
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1892
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1893
    private void copyBuiltins() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1894
        this.array             = this.builtinArray;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1895
        this._boolean          = this.builtinBoolean;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1896
        this.date              = this.builtinDate;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1897
        this.error             = this.builtinError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1898
        this.evalError         = this.builtinEvalError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1899
        this.function          = this.builtinFunction;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1900
        this.jsadapter         = this.builtinJSAdapter;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1901
        this.json              = this.builtinJSON;
16532
fe016e9cae59 8010709: org on the top level doesn't resolve
sundar
parents: 16525
diff changeset
  1902
        this.com               = this.builtinCom;
fe016e9cae59 8010709: org on the top level doesn't resolve
sundar
parents: 16525
diff changeset
  1903
        this.edu               = this.builtinEdu;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1904
        this.java              = this.builtinJava;
16532
fe016e9cae59 8010709: org on the top level doesn't resolve
sundar
parents: 16525
diff changeset
  1905
        this.javafx            = this.builtinJavafx;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1906
        this.javax             = this.builtinJavax;
16532
fe016e9cae59 8010709: org on the top level doesn't resolve
sundar
parents: 16525
diff changeset
  1907
        this.org               = this.builtinOrg;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1908
        this.javaImporter      = this.builtinJavaImporter;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1909
        this.javaApi           = this.builtinJavaApi;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1910
        this.math              = this.builtinMath;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1911
        this.number            = this.builtinNumber;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1912
        this.object            = this.builtinObject;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1913
        this.packages          = this.builtinPackages;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1914
        this.rangeError        = this.builtinRangeError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1915
        this.referenceError    = this.builtinReferenceError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1916
        this.regexp            = this.builtinRegExp;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1917
        this.string            = this.builtinString;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1918
        this.syntaxError       = this.builtinSyntaxError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1919
        this.typeError         = this.builtinTypeError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1920
        this.uriError          = this.builtinURIError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1921
        this.arrayBuffer       = this.builtinArrayBuffer;
23374
f470afc89c6c 8015958: DataView constructor is not defined
sundar
parents: 23372
diff changeset
  1922
        this.dataView          = this.builtinDataView;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1923
        this.int8Array         = this.builtinInt8Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1924
        this.uint8Array        = this.builtinUint8Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1925
        this.uint8ClampedArray = this.builtinUint8ClampedArray;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1926
        this.int16Array        = this.builtinInt16Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1927
        this.uint16Array       = this.builtinUint16Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1928
        this.int32Array        = this.builtinInt32Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1929
        this.uint32Array       = this.builtinUint32Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1930
        this.float32Array      = this.builtinFloat32Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1931
        this.float64Array      = this.builtinFloat64Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1932
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1933
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1934
    private void initDebug() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1935
        this.addOwnProperty("Debug", Attribute.NOT_ENUMERABLE, initConstructor("Debug"));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1936
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1937
25422
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
  1938
    private Object printImpl(final boolean newLine, final Object... objects) {
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
  1939
        final PrintWriter out = scontext != null? new PrintWriter(scontext.getWriter()) : getContext().getEnv().getOut();
17972
2ed196cf0643 8015727: Thread safe print function
jlaskey
parents: 17524
diff changeset
  1940
        final StringBuilder sb = new StringBuilder();
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1941
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1942
        for (final Object object : objects) {
17972
2ed196cf0643 8015727: Thread safe print function
jlaskey
parents: 17524
diff changeset
  1943
            if (sb.length() != 0) {
2ed196cf0643 8015727: Thread safe print function
jlaskey
parents: 17524
diff changeset
  1944
                sb.append(' ');
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1945
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1946
17972
2ed196cf0643 8015727: Thread safe print function
jlaskey
parents: 17524
diff changeset
  1947
            sb.append(JSType.toString(object));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1948
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1949
17972
2ed196cf0643 8015727: Thread safe print function
jlaskey
parents: 17524
diff changeset
  1950
        // Print all at once to ensure thread friendly result.
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1951
        if (newLine) {
17972
2ed196cf0643 8015727: Thread safe print function
jlaskey
parents: 17524
diff changeset
  1952
            out.println(sb.toString());
2ed196cf0643 8015727: Thread safe print function
jlaskey
parents: 17524
diff changeset
  1953
        } else {
2ed196cf0643 8015727: Thread safe print function
jlaskey
parents: 17524
diff changeset
  1954
            out.print(sb.toString());
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1955
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1956
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1957
        out.flush();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1958
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1959
        return UNDEFINED;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1960
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1961
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1962
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1963
     * These classes are generated by nasgen tool and so we have to use
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1964
     * reflection to load and create new instance of these classes.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1965
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1966
    private ScriptObject initConstructor(final String name) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1967
        try {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1968
            // Assuming class name pattern for built-in JS constructors.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1969
            final StringBuilder sb = new StringBuilder("jdk.nashorn.internal.objects.");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1970
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1971
            sb.append("Native");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1972
            sb.append(name);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1973
            sb.append("$Constructor");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1974
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1975
            final Class<?>     funcClass = Class.forName(sb.toString());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1976
            final ScriptObject res       = (ScriptObject)funcClass.newInstance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1977
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1978
            if (res instanceof ScriptFunction) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1979
                // All global constructor prototypes are not-writable,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1980
                // not-enumerable and not-configurable.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1981
                final ScriptFunction func = (ScriptFunction)res;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1982
                func.modifyOwnProperty(func.getProperty("prototype"), Attribute.NON_ENUMERABLE_CONSTANT);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1983
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1984
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1985
            if (res.getProto() == null) {
23084
6c5c02d1023a 8035948: Redesign property listeners for shared classes
hannesw
parents: 22389
diff changeset
  1986
                res.setInitialProto(getObjectPrototype());
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1987
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1988
24733
1e825be55fd1 8027043: Turn global accesses into MethodHandle.constant, with one chance of reassignment, e.g. x = value occuring once in the global scope is ok, twice is not.
lagergren
parents: 24731
diff changeset
  1989
            res.setIsBuiltin();
1e825be55fd1 8027043: Turn global accesses into MethodHandle.constant, with one chance of reassignment, e.g. x = value occuring once in the global scope is ok, twice is not.
lagergren
parents: 24731
diff changeset
  1990
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1991
            return res;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1992
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1993
        } catch (final ClassNotFoundException | InstantiationException | IllegalAccessException e) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1994
            throw new RuntimeException(e);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1995
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1996
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1997
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1998
    // Function and Object constructors are inter-dependent. Also,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1999
    // Function.prototype
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2000
    // functions are not properly initialized. We fix the references here.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2001
    // NOTE: be careful if you want to re-order the operations here. You may
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2002
    // have
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2003
    // to play with object references carefully!!
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2004
    private void initFunctionAndObject() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2005
        // First-n-foremost is Function
24738
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2006
        this.builtinFunction      = (ScriptFunction)initConstructor("Function");
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2007
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2008
        // create global anonymous function
24751
ccbd9cd3f720 8042118: Separate types from symbols
attila
parents: 24745
diff changeset
  2009
        final ScriptFunction anon = ScriptFunctionImpl.newAnonymousFunction();
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2010
        // need to copy over members of Function.prototype to anon function
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2011
        anon.addBoundProperties(getFunctionPrototype());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2012
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2013
        // Function.prototype === Object.getPrototypeOf(Function) ===
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2014
        // <anon-function>
23084
6c5c02d1023a 8035948: Redesign property listeners for shared classes
hannesw
parents: 22389
diff changeset
  2015
        builtinFunction.setInitialProto(anon);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2016
        builtinFunction.setPrototype(anon);
18328
ebd24057f163 8015355: Array.prototype functions don't honour non-writable length and / or index properties
sundar
parents: 18326
diff changeset
  2017
        anon.set("constructor", builtinFunction, false);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2018
        anon.deleteOwnProperty(anon.getMap().findProperty("prototype"));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2019
22382
2abc7240ef59 8029612: the typeErrorThrower field in ScriptFunctionImpl cannot be static and common to all Globals
sundar
parents: 21686
diff changeset
  2020
        // use "getter" so that [[ThrowTypeError]] function's arity is 0 - as specified in step 10 of section 13.2.3
23372
09707b3e5fb0 8021350: Share script classes between threads/globals within context
hannesw
parents: 23084
diff changeset
  2021
        this.typeErrorThrower = new ScriptFunctionImpl("TypeErrorThrower", Lookup.TYPE_ERROR_THROWER_GETTER, null, null, 0);
22382
2abc7240ef59 8029612: the typeErrorThrower field in ScriptFunctionImpl cannot be static and common to all Globals
sundar
parents: 21686
diff changeset
  2022
        typeErrorThrower.setPrototype(UNDEFINED);
2abc7240ef59 8029612: the typeErrorThrower field in ScriptFunctionImpl cannot be static and common to all Globals
sundar
parents: 21686
diff changeset
  2023
        // Non-constructor built-in functions do not have "prototype" property
2abc7240ef59 8029612: the typeErrorThrower field in ScriptFunctionImpl cannot be static and common to all Globals
sundar
parents: 21686
diff changeset
  2024
        typeErrorThrower.deleteOwnProperty(typeErrorThrower.getMap().findProperty("prototype"));
2abc7240ef59 8029612: the typeErrorThrower field in ScriptFunctionImpl cannot be static and common to all Globals
sundar
parents: 21686
diff changeset
  2025
        typeErrorThrower.preventExtensions();
2abc7240ef59 8029612: the typeErrorThrower field in ScriptFunctionImpl cannot be static and common to all Globals
sundar
parents: 21686
diff changeset
  2026
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2027
        // now initialize Object
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2028
        this.builtinObject = (ScriptFunction)initConstructor("Object");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2029
        final ScriptObject ObjectPrototype = getObjectPrototype();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2030
        // Object.getPrototypeOf(Function.prototype) === Object.prototype
23084
6c5c02d1023a 8035948: Redesign property listeners for shared classes
hannesw
parents: 22389
diff changeset
  2031
        anon.setInitialProto(ObjectPrototype);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2032
24281
58ed42a1ebc6 8042364: Make __proto__ ES6 draft compliant
sundar
parents: 23375
diff changeset
  2033
        // ES6 draft compliant __proto__ property of Object.prototype
58ed42a1ebc6 8042364: Make __proto__ ES6 draft compliant
sundar
parents: 23375
diff changeset
  2034
        // accessors on Object.prototype for "__proto__"
24772
0fc1013a1785 8044520: Nashorn cannot execute node.js's express module
sundar
parents: 24769
diff changeset
  2035
        final ScriptFunction getProto = ScriptFunctionImpl.makeFunction("getProto", NativeObject.GET__PROTO__);
0fc1013a1785 8044520: Nashorn cannot execute node.js's express module
sundar
parents: 24769
diff changeset
  2036
        final ScriptFunction setProto = ScriptFunctionImpl.makeFunction("setProto", NativeObject.SET__PROTO__);
24281
58ed42a1ebc6 8042364: Make __proto__ ES6 draft compliant
sundar
parents: 23375
diff changeset
  2037
        ObjectPrototype.addOwnProperty("__proto__", Attribute.NOT_ENUMERABLE, getProto, setProto);
58ed42a1ebc6 8042364: Make __proto__ ES6 draft compliant
sundar
parents: 23375
diff changeset
  2038
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2039
        // Function valued properties of Function.prototype were not properly
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2040
        // initialized. Because, these were created before global.function and
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2041
        // global.object were not initialized.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2042
        jdk.nashorn.internal.runtime.Property[] properties = getFunctionPrototype().getMap().getProperties();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2043
        for (final jdk.nashorn.internal.runtime.Property property : properties) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2044
            final Object key = property.getKey();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2045
            final Object value = builtinFunction.get(key);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2046
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2047
            if (value instanceof ScriptFunction && value != anon) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2048
                final ScriptFunction func = (ScriptFunction)value;
23084
6c5c02d1023a 8035948: Redesign property listeners for shared classes
hannesw
parents: 22389
diff changeset
  2049
                func.setInitialProto(getFunctionPrototype());
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2050
                final ScriptObject prototype = ScriptFunction.getPrototype(func);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2051
                if (prototype != null) {
23084
6c5c02d1023a 8035948: Redesign property listeners for shared classes
hannesw
parents: 22389
diff changeset
  2052
                    prototype.setInitialProto(ObjectPrototype);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2053
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2054
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2055
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2056
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2057
        // For function valued properties of Object and Object.prototype, make
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2058
        // sure prototype's proto chain ends with Object.prototype
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2059
        for (final jdk.nashorn.internal.runtime.Property property : builtinObject.getMap().getProperties()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2060
            final Object key = property.getKey();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2061
            final Object value = builtinObject.get(key);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2062
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2063
            if (value instanceof ScriptFunction) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2064
                final ScriptFunction func = (ScriptFunction)value;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2065
                final ScriptObject prototype = ScriptFunction.getPrototype(func);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2066
                if (prototype != null) {
23084
6c5c02d1023a 8035948: Redesign property listeners for shared classes
hannesw
parents: 22389
diff changeset
  2067
                    prototype.setInitialProto(ObjectPrototype);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2068
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2069
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2070
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2071
24738
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2072
        //make sure apply and call have the same invalidation switchpoint
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2073
        final SwitchPoint sp = new SwitchPoint();
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2074
        optimisticFunctionMap.put("apply", sp);
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2075
        optimisticFunctionMap.put("call", sp);
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2076
        getFunctionPrototype().getProperty("apply").setChangeCallback(sp);
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2077
        getFunctionPrototype().getProperty("call").setChangeCallback(sp);
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2078
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2079
        properties = getObjectPrototype().getMap().getProperties();
24738
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2080
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2081
        for (final jdk.nashorn.internal.runtime.Property property : properties) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2082
            final Object key   = property.getKey();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2083
            if (key.equals("constructor")) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2084
                continue;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2085
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2086
25422
199a23bee487 8049524: Global object initialization via javax.script API should be minimal
sundar
parents: 25421
diff changeset
  2087
            final Object value = ObjectPrototype.get(key);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2088
            if (value instanceof ScriptFunction) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2089
                final ScriptFunction func = (ScriptFunction)value;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2090
                final ScriptObject prototype = ScriptFunction.getPrototype(func);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2091
                if (prototype != null) {
23084
6c5c02d1023a 8035948: Redesign property listeners for shared classes
hannesw
parents: 22389
diff changeset
  2092
                    prototype.setInitialProto(ObjectPrototype);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2093
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2094
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2095
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2096
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2097
24738
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2098
    private static MethodHandle findOwnMH_V(final String name, final Class<?> rtype, final Class<?>... types) {
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2099
        return MH.findVirtual(MethodHandles.lookup(), Global.class, name, MH.type(rtype, types));
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2100
    }
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2101
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2102
    private static MethodHandle findOwnMH_S(final String name, final Class<?> rtype, final Class<?>... types) {
18851
bdb92c95f886 8019947: inherited property invalidation does not work with two globals in same context
sundar
parents: 18842
diff changeset
  2103
        return MH.findStatic(MethodHandles.lookup(), Global.class, name, MH.type(rtype, types));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2104
    }
16223
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16219
diff changeset
  2105
16258
0e25f785df4d 8008093: Make RegExp engine pluggable
hannesw
parents: 16256
diff changeset
  2106
    RegExpResult getLastRegExpResult() {
0e25f785df4d 8008093: Make RegExp engine pluggable
hannesw
parents: 16256
diff changeset
  2107
        return lastRegExpResult;
16223
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16219
diff changeset
  2108
    }
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16219
diff changeset
  2109
16258
0e25f785df4d 8008093: Make RegExp engine pluggable
hannesw
parents: 16256
diff changeset
  2110
    void setLastRegExpResult(final RegExpResult regExpResult) {
0e25f785df4d 8008093: Make RegExp engine pluggable
hannesw
parents: 16256
diff changeset
  2111
        this.lastRegExpResult = regExpResult;
16223
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16219
diff changeset
  2112
    }
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16219
diff changeset
  2113
24733
1e825be55fd1 8027043: Turn global accesses into MethodHandle.constant, with one chance of reassignment, e.g. x = value occuring once in the global scope is ok, twice is not.
lagergren
parents: 24731
diff changeset
  2114
    @Override
1e825be55fd1 8027043: Turn global accesses into MethodHandle.constant, with one chance of reassignment, e.g. x = value occuring once in the global scope is ok, twice is not.
lagergren
parents: 24731
diff changeset
  2115
    protected boolean isGlobal() {
1e825be55fd1 8027043: Turn global accesses into MethodHandle.constant, with one chance of reassignment, e.g. x = value occuring once in the global scope is ok, twice is not.
lagergren
parents: 24731
diff changeset
  2116
        return true;
1e825be55fd1 8027043: Turn global accesses into MethodHandle.constant, with one chance of reassignment, e.g. x = value occuring once in the global scope is ok, twice is not.
lagergren
parents: 24731
diff changeset
  2117
    }
1e825be55fd1 8027043: Turn global accesses into MethodHandle.constant, with one chance of reassignment, e.g. x = value occuring once in the global scope is ok, twice is not.
lagergren
parents: 24731
diff changeset
  2118
24738
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2119
    /**
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2120
     * Check if there is a switchpoint for a reserved name. If there
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2121
     * is, it must be invalidated upon properties with this name
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2122
     * @param name property name
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2123
     * @return switchpoint for invalidating this property, or null if not registered
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2124
     */
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2125
    public SwitchPoint getChangeCallback(final String name) {
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2126
        return optimisticFunctionMap.get(name);
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2127
    }
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2128
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2129
    /**
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2130
     * Is this a special name, that might be subject to invalidation
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2131
     * on write, such as "apply" or "call"
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2132
     * @param name name to check
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2133
     * @return true if special name
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2134
     */
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2135
    public boolean isSpecialName(final String name) {
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2136
        return getChangeCallback(name) != null;
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2137
    }
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2138
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2139
    /**
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2140
     * Check if a reserved property name is invalidated
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2141
     * @param name property name
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2142
     * @return true if someone has written to it since Global was instantiated
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2143
     */
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2144
    public boolean isSpecialNameValid(final String name) {
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2145
        final SwitchPoint sp = getChangeCallback(name);
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2146
        return sp != null && !sp.hasBeenInvalidated();
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2147
    }
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2148
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2149
    /**
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2150
     * Tag a reserved name as invalidated - used when someone writes
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2151
     * to a property with this name - overly conservative, but link time
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2152
     * is too late to apply e.g. apply->call specialization
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2153
     * @param name property name
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2154
     */
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2155
    public void invalidateReservedName(final String name) {
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2156
        final SwitchPoint sp = getChangeCallback(name);
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2157
        if (sp != null) {
24745
3a6e1477362b 8041434: Add synchronization to the common global constants structure
lagergren
parents: 24744
diff changeset
  2158
            getContext().getLogger(ApplySpecialization.class).info("Overwrote special name '" + name +"' - invalidating switchpoint");
24738
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2159
            SwitchPoint.invalidateAll(new SwitchPoint[] { sp });
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2160
        }
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2161
    }
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2162
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2163
    /**
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2164
     * Bootstrapper for invalidating a builtin name
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2165
     * @param lookup lookup
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2166
     * @param name   name to invalidate
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2167
     * @param type   methodhandle type
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2168
     * @return callsite for invalidator
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2169
     */
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2170
    public static CallSite invalidateNameBootstrap(final MethodHandles.Lookup lookup, final String name, final MethodType type) {
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2171
        final MethodHandle target = MH.insertArguments(Global.instance().INVALIDATE_RESERVED_NAME, 0, name);
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2172
        return new ConstantCallSite(target);
be2026c9717c 8039746: Transform applies to calls wherever possible, for ScriptFunctions and JSObjects.
lagergren
parents: 24733
diff changeset
  2173
    }
24744
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24738
diff changeset
  2174
5290da85fc3d 8038426: Move all loggers from process wide scope into Global scope
lagergren
parents: 24738
diff changeset
  2175
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  2176
}