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