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