nashorn/src/jdk/nashorn/internal/objects/Global.java
author hannesw
Fri, 22 Feb 2013 16:31:10 +0100
changeset 16258 0e25f785df4d
parent 16256 f2d9a0c49914
child 16262 75513555e603
permissions -rw-r--r--
8008093: Make RegExp engine pluggable Reviewed-by: lagergren, attila
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     1
/*
16151
97c1e756ae1e 8005663: Update copyright year to 2013
jlaskey
parents: 16147
diff changeset
     2
 * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     4
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     7
 * published by the Free Software Foundation.  Oracle designates this
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     8
 * particular file as subject to the "Classpath" exception as provided
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
     9
 * by Oracle in the LICENSE file that accompanied this code.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    10
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    11
 * This code is distributed in the hope that it will be useful, but WITHOUT
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    12
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    13
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    14
 * version 2 for more details (a copy is included in the LICENSE file that
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    15
 * accompanied this code).
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    16
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License version
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    18
 * 2 along with this work; if not, write to the Free Software Foundation,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    19
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    20
 *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    21
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    22
 * or visit www.oracle.com if you need additional information or have any
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    23
 * questions.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    24
 */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    25
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    26
package jdk.nashorn.internal.objects;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    27
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    28
import static jdk.nashorn.internal.runtime.ECMAErrors.typeError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    29
import static jdk.nashorn.internal.runtime.ScriptRuntime.UNDEFINED;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    30
import static jdk.nashorn.internal.runtime.linker.Lookup.MH;
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;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    36
import java.lang.ref.SoftReference;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    37
import java.util.LinkedHashMap;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    38
import java.util.List;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    39
import java.util.Map;
16234
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents: 16233
diff changeset
    40
import jdk.internal.dynalink.linker.GuardedInvocation;
86cb162cec6c 8008085: Integrate Dynalink source code into Nashorn codebase
attila
parents: 16233
diff changeset
    41
import jdk.internal.dynalink.linker.LinkRequest;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    42
import jdk.nashorn.internal.objects.annotations.Attribute;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    43
import jdk.nashorn.internal.objects.annotations.Property;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    44
import jdk.nashorn.internal.objects.annotations.ScriptClass;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    45
import jdk.nashorn.internal.runtime.ConsString;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    46
import jdk.nashorn.internal.runtime.Context;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    47
import jdk.nashorn.internal.runtime.GlobalFunctions;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    48
import jdk.nashorn.internal.runtime.GlobalObject;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    49
import jdk.nashorn.internal.runtime.JSType;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    50
import jdk.nashorn.internal.runtime.NativeJavaPackage;
16185
893aabe8c800 8006635: Reduce access levels as much as possible
sundar
parents: 16181
diff changeset
    51
import jdk.nashorn.internal.runtime.OptionsObject;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    52
import jdk.nashorn.internal.runtime.PropertyDescriptor;
16258
0e25f785df4d 8008093: Make RegExp engine pluggable
hannesw
parents: 16256
diff changeset
    53
import jdk.nashorn.internal.runtime.regexp.RegExpResult;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    54
import jdk.nashorn.internal.runtime.Scope;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    55
import jdk.nashorn.internal.runtime.ScriptFunction;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    56
import jdk.nashorn.internal.runtime.ScriptObject;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    57
import jdk.nashorn.internal.runtime.ScriptRuntime;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    58
import jdk.nashorn.internal.runtime.ScriptingFunctions;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    59
import jdk.nashorn.internal.runtime.Source;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    60
import jdk.nashorn.internal.runtime.linker.InvokeByName;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    61
import jdk.nashorn.internal.scripts.JO$;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    62
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    63
/**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    64
 * Representation of global scope.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    65
 */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    66
@ScriptClass("Global")
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    67
public final class Global extends ScriptObject implements GlobalObject, Scope {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    68
    private static final InvokeByName TO_STRING = new InvokeByName("toString", ScriptObject.class);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    69
    private static final InvokeByName VALUE_OF  = new InvokeByName("valueOf",  ScriptObject.class);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    70
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    71
    /** ECMA 15.1.2.2 parseInt (string , radix) */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    72
    @Property(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    73
    public Object parseInt;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    74
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    75
    /** ECMA 15.1.2.3 parseFloat (string) */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    76
    @Property(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    77
    public Object parseFloat;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    78
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    79
    /** ECMA 15.1.2.4 isNaN (number) */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    80
    @Property(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    81
    public Object isNaN;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    82
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    83
    /** ECMA 15.1.2.5 isFinite (number) */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    84
    @Property(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    85
    public Object isFinite;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    86
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    87
    /** ECMA 15.1.3.3 encodeURI */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    88
    @Property(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    89
    public Object encodeURI;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    90
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    91
    /** ECMA 15.1.3.4 encodeURIComponent */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    92
    @Property(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    93
    public Object encodeURIComponent;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    94
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    95
    /** ECMA 15.1.3.1 decodeURI */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    96
    @Property(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    97
    public Object decodeURI;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    98
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
    99
    /** ECMA 15.1.3.2 decodeURIComponent */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   100
    @Property(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   101
    public Object decodeURIComponent;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   102
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   103
    /** ECMA B.2.1 escape (string) */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   104
    @Property(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   105
    public Object escape;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   106
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   107
    /** ECMA B.2.2 unescape (string) */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   108
    @Property(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   109
    public Object unescape;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   110
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   111
    /** Nashorn extension: global.print */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   112
    @Property(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   113
    public Object print;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   114
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   115
    /** Nashorn extension: global.load */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   116
    @Property(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   117
    public Object load;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   118
16219
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
   119
    /** Nashorn extension: global.exit */
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
   120
    @Property(attributes = Attribute.NOT_ENUMERABLE)
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
   121
    public Object exit;
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
   122
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
   123
    /** Nashorn extension: global.quit */
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
   124
    @Property(attributes = Attribute.NOT_ENUMERABLE)
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
   125
    public Object quit;
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
   126
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   127
    /** Value property NaN of the Global Object - ECMA 15.1.1.1 NaN */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   128
    @Property(attributes = Attribute.NON_ENUMERABLE_CONSTANT)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   129
    public final Object NaN = Double.NaN;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   130
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   131
    /** Value property Infinity of the Global Object - ECMA 15.1.1.2 Infinity */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   132
    @Property(attributes = Attribute.NON_ENUMERABLE_CONSTANT)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   133
    public final Object Infinity = Double.POSITIVE_INFINITY;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   134
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   135
    /** Value property Undefined of the Global Object - ECMA 15.1.1.3 Undefined */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   136
    @Property(attributes = Attribute.NON_ENUMERABLE_CONSTANT)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   137
    public final Object undefined = UNDEFINED;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   138
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   139
    /** ECMA 15.1.2.1 eval(x) */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   140
    @Property(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   141
    public Object eval;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   142
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   143
    /** ECMA 15.1.4.1 Object constructor. */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   144
    @Property(name = "Object", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   145
    public volatile Object object;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   146
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   147
    /** ECMA 15.1.4.2 Function constructor. */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   148
    @Property(name = "Function", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   149
    public volatile Object function;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   150
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   151
    /** ECMA 15.1.4.3 Array constructor. */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   152
    @Property(name = "Array", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   153
    public volatile Object array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   154
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   155
    /** ECMA 15.1.4.4 String constructor */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   156
    @Property(name = "String", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   157
    public volatile Object string;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   158
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   159
    /** ECMA 15.1.4.5 Boolean constructor */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   160
    @Property(name = "Boolean", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   161
    public volatile Object _boolean;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   162
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   163
    /** ECMA 15.1.4.6 - Number constructor */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   164
    @Property(name = "Number", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   165
    public volatile Object number;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   166
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   167
    /** ECMA 15.1.4.7 Date constructor */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   168
    @Property(name = "Date", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   169
    public volatile Object date;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   170
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   171
    /** ECMA 15.1.4.8 RegExp constructor */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   172
    @Property(name = "RegExp", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   173
    public volatile Object regexp;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   174
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   175
    /** ECMA 15.12 - The JSON object */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   176
    @Property(name = "JSON", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   177
    public volatile Object json;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   178
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   179
    /** Nashorn extension: global.JSAdapter */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   180
    @Property(name = "JSAdapter", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   181
    public volatile Object jsadapter;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   182
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   183
    /** ECMA 15.8 - The Math object */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   184
    @Property(name = "Math", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   185
    public volatile Object math;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   186
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   187
    /** Error object */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   188
    @Property(name = "Error", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   189
    public volatile Object error;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   190
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   191
    /** EvalError object */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   192
    @Property(name = "EvalError", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   193
    public volatile Object evalError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   194
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   195
    /** RangeError object */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   196
    @Property(name = "RangeError", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   197
    public volatile Object rangeError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   198
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   199
    /** ReferenceError object */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   200
    @Property(name = "ReferenceError", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   201
    public volatile Object referenceError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   202
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   203
    /** SyntaxError object */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   204
    @Property(name = "SyntaxError", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   205
    public volatile Object syntaxError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   206
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   207
    /** TypeError object */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   208
    @Property(name = "TypeError", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   209
    public volatile Object typeError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   210
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   211
    /** URIError object */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   212
    @Property(name = "URIError", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   213
    public volatile Object uriError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   214
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   215
    /** ArrayBuffer object */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   216
    @Property(name = "ArrayBuffer", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   217
    public volatile Object arrayBuffer;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   218
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   219
    /** TypedArray (int8) */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   220
    @Property(name = "Int8Array", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   221
    public volatile Object int8Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   222
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   223
    /** TypedArray (uint8) */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   224
    @Property(name = "Uint8Array", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   225
    public volatile Object uint8Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   226
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   227
    /** TypedArray (uint8) - Clamped */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   228
    @Property(name = "Uint8ClampedArray", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   229
    public volatile Object uint8ClampedArray;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   230
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   231
    /** TypedArray (int16) */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   232
    @Property(name = "Int16Array", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   233
    public volatile Object int16Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   234
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   235
    /** TypedArray (uint16) */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   236
    @Property(name = "Uint16Array", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   237
    public volatile Object uint16Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   238
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   239
    /** TypedArray (int32) */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   240
    @Property(name = "Int32Array", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   241
    public volatile Object int32Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   242
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   243
    /** TypedArray (uint32) */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   244
    @Property(name = "Uint32Array", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   245
    public volatile Object uint32Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   246
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   247
    /** TypedArray (float32) */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   248
    @Property(name = "Float32Array", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   249
    public volatile Object float32Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   250
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   251
    /** TypedArray (float64) */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   252
    @Property(name = "Float64Array", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   253
    public volatile Object float64Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   254
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   255
    /** Nashorn extension: Java access - global.Packages */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   256
    @Property(name = "Packages", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   257
    public volatile Object packages;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   258
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   259
    /** Nashorn extension: Java access - global.java */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   260
    @Property(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   261
    public volatile Object java;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   262
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   263
    /** Nashorn extension: Java access - global.javax */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   264
    @Property(attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   265
    public Object javax;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   266
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   267
    /** Nashorn extension: Java access - global.javaImporter */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   268
    @Property(name = "JavaImporter", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   269
    public volatile Object javaImporter;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   270
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   271
    /** Nashorn extension: global.Java Object constructor. */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   272
    @Property(name = "Java", attributes = Attribute.NOT_ENUMERABLE)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   273
    public volatile Object javaApi;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   274
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   275
    /** Nashorn extension: current script's file name */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   276
    @Property(name = "__FILE__", attributes = Attribute.NON_ENUMERABLE_CONSTANT)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   277
    public Object __FILE__;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   278
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   279
    /** Nashorn extension: current script's directory */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   280
    @Property(name = "__DIR__", attributes = Attribute.NON_ENUMERABLE_CONSTANT)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   281
    public Object __DIR__;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   282
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   283
    /** Nashorn extension: current source line number being executed */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   284
    @Property(name = "__LINE__", attributes = Attribute.NON_ENUMERABLE_CONSTANT)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   285
    public Object __LINE__;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   286
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   287
    /** Used as Date.prototype's default value */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   288
    public NativeDate   DEFAULT_DATE;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   289
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   290
    /** Used as RegExp.prototype's default value */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   291
    public NativeRegExp DEFAULT_REGEXP;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   292
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   293
    /*
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   294
     * Built-in constructor objects: Even if user changes dynamic values of
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   295
     * "Object", "Array" etc., we still want to keep original values of these
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   296
     * constructors here. For example, we need to be able to create array,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   297
     * regexp literals even after user overwrites global "Array" or "RegExp"
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   298
     * constructor - see also ECMA 262 spec. Annex D.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   299
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   300
    private ScriptFunction builtinFunction;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   301
    private ScriptFunction builtinObject;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   302
    private ScriptFunction builtinArray;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   303
    private ScriptFunction builtinBoolean;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   304
    private ScriptFunction builtinDate;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   305
    private ScriptObject   builtinJSON;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   306
    private ScriptFunction builtinJSAdapter;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   307
    private ScriptObject   builtinMath;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   308
    private ScriptFunction builtinNumber;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   309
    private ScriptFunction builtinRegExp;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   310
    private ScriptFunction builtinString;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   311
    private ScriptFunction builtinError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   312
    private ScriptFunction builtinEval;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   313
    private ScriptFunction builtinEvalError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   314
    private ScriptFunction builtinRangeError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   315
    private ScriptFunction builtinReferenceError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   316
    private ScriptFunction builtinSyntaxError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   317
    private ScriptFunction builtinTypeError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   318
    private ScriptFunction builtinURIError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   319
    private ScriptObject   builtinPackages;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   320
    private ScriptObject   builtinJava;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   321
    private ScriptObject   builtinJavax;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   322
    private ScriptObject   builtinJavaImporter;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   323
    private ScriptObject   builtinJavaApi;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   324
    private ScriptObject   builtinArrayBuffer;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   325
    private ScriptObject   builtinInt8Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   326
    private ScriptObject   builtinUint8Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   327
    private ScriptObject   builtinUint8ClampedArray;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   328
    private ScriptObject   builtinInt16Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   329
    private ScriptObject   builtinUint16Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   330
    private ScriptObject   builtinInt32Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   331
    private ScriptObject   builtinUint32Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   332
    private ScriptObject   builtinFloat32Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   333
    private ScriptObject   builtinFloat64Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   334
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   335
    // Flag to indicate that a split method issued a return statement
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   336
    private int splitState = -1;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   337
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   338
    // class cache
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   339
    private ClassCache classCache;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   340
16223
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16219
diff changeset
   341
    // 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
   342
    private RegExpResult lastRegExpResult;
16223
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16219
diff changeset
   343
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   344
    private static final MethodHandle EVAL    = findOwnMH("eval",    Object.class, Object.class, Object.class);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   345
    private static final MethodHandle PRINT   = findOwnMH("print",   Object.class, Object.class, Object[].class);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   346
    private static final MethodHandle PRINTLN = findOwnMH("println", Object.class, Object.class, Object[].class);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   347
    private static final MethodHandle LOAD    = findOwnMH("load",    Object.class, Object.class, Object.class);
16219
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
   348
    private static final MethodHandle EXIT    = findOwnMH("exit",    Object.class, Object.class, Object.class);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   349
16226
0e4f37e6cc40 8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents: 16223
diff changeset
   350
    private final Context context;
0e4f37e6cc40 8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents: 16223
diff changeset
   351
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   352
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   353
     * Constructor
16233
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16228
diff changeset
   354
     *
95d3e01c04c3 8008199: Lazy compilation and trampoline implementation
lagergren
parents: 16228
diff changeset
   355
     * @param context the context
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   356
     */
16226
0e4f37e6cc40 8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents: 16223
diff changeset
   357
    public Global(final Context context) {
0e4f37e6cc40 8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents: 16223
diff changeset
   358
        this.context = context;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   359
        this.setIsScope();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   360
        /*
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   361
         * Duplicate global's map and use it. This way the initial Map filled
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   362
         * by nasgen (referenced from static field in this class) is retained
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   363
         * 'as is'. This allows multiple globals to be used within a context.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   364
         */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   365
        this.setMap(getMap().duplicate());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   366
16226
0e4f37e6cc40 8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents: 16223
diff changeset
   367
        final int cacheSize = context._class_cache_size;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   368
        if (cacheSize > 0) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   369
            classCache = new ClassCache(cacheSize);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   370
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   371
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   372
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   373
    /**
16226
0e4f37e6cc40 8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents: 16223
diff changeset
   374
     * Script access to "current" Global instance
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   375
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   376
     * @return the global singleton
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   377
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   378
    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
   379
        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
   380
        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
   381
            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
   382
        }
0e4f37e6cc40 8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents: 16223
diff changeset
   383
        return (Global)global;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   384
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   385
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   386
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   387
     * Script access to {@link Context}
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   388
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   389
     * @return the context
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   390
     */
16185
893aabe8c800 8006635: Reduce access levels as much as possible
sundar
parents: 16181
diff changeset
   391
    static Context getThisContext() {
16226
0e4f37e6cc40 8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents: 16223
diff changeset
   392
        return instance().context;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   393
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   394
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   395
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   396
     * Script access check for strict mode
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   397
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   398
     * @return true if strict mode enabled in {@link Global#getThisContext()}
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   399
     */
16185
893aabe8c800 8006635: Reduce access levels as much as possible
sundar
parents: 16181
diff changeset
   400
    static boolean isStrict() {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   401
        return getThisContext()._strict;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   402
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   403
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   404
    // GlobalObject interface implementation
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   405
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   406
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   407
    public void initBuiltinObjects() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   408
        if (this.builtinObject != null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   409
            // already initialized, just return
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   410
            return;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   411
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   412
16185
893aabe8c800 8006635: Reduce access levels as much as possible
sundar
parents: 16181
diff changeset
   413
        init();
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   414
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   415
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   416
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   417
    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
   418
        return new ScriptFunctionImpl(name, handle, scope, null, strict, false, true);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   419
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   420
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   421
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   422
    public Object wrapAsObject(final Object obj) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   423
        if (obj instanceof Boolean) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   424
            return new NativeBoolean((Boolean)obj);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   425
        } else if (obj instanceof Number) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   426
            return new NativeNumber(((Number)obj).doubleValue());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   427
        } else if (obj instanceof String || obj instanceof ConsString) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   428
            return new NativeString((CharSequence)obj);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   429
        } else if (obj instanceof Object[]) { // extension
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   430
            return new NativeArray((Object[])obj);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   431
        } else if (obj instanceof double[]) { // extension
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   432
            return new NativeArray((double[])obj);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   433
        } else if (obj instanceof long[]) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   434
            return new NativeArray((long[])obj);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   435
        } else if (obj instanceof int[]) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   436
            return new NativeArray((int[])obj);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   437
        } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   438
            // FIXME: more special cases? Map? List?
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   439
            return obj;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   440
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   441
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   442
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   443
    @Override
16195
3f6c0ab2597a 8006766: Array-like access to characters of a string is slow
hannesw
parents: 16188
diff changeset
   444
    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
   445
        if (self instanceof String || self instanceof ConsString) {
3f6c0ab2597a 8006766: Array-like access to characters of a string is slow
hannesw
parents: 16188
diff changeset
   446
            return NativeString.lookupPrimitive(request, self);
3f6c0ab2597a 8006766: Array-like access to characters of a string is slow
hannesw
parents: 16188
diff changeset
   447
        } else if (self instanceof Number) {
3f6c0ab2597a 8006766: Array-like access to characters of a string is slow
hannesw
parents: 16188
diff changeset
   448
            return NativeNumber.lookupPrimitive(request, self);
3f6c0ab2597a 8006766: Array-like access to characters of a string is slow
hannesw
parents: 16188
diff changeset
   449
        } else if (self instanceof Boolean) {
3f6c0ab2597a 8006766: Array-like access to characters of a string is slow
hannesw
parents: 16188
diff changeset
   450
            return NativeBoolean.lookupPrimitive(request, self);
3f6c0ab2597a 8006766: Array-like access to characters of a string is slow
hannesw
parents: 16188
diff changeset
   451
        }
3f6c0ab2597a 8006766: Array-like access to characters of a string is slow
hannesw
parents: 16188
diff changeset
   452
        throw new IllegalArgumentException("Unsupported primitive: " + self);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   453
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   454
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   455
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   456
    public ScriptObject newObject() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   457
        return newEmptyInstance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   458
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   459
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   460
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   461
    public Object getDefaultValue(final ScriptObject sobj, final Class<?> typeHint) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   462
        // When the [[DefaultValue]] internal method of O is called with no hint,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   463
        // then it behaves as if the hint were Number, unless O is a Date object
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   464
        // in which case it behaves as if the hint were String.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   465
        Class<?> hint = typeHint;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   466
        if (hint == null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   467
            hint = Number.class;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   468
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   469
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   470
        try {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   471
            if (hint == String.class) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   472
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   473
                final Object toString = TO_STRING.getGetter().invokeExact(sobj);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   474
                if (toString instanceof ScriptFunction) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   475
                    final Object value = TO_STRING.getInvoker().invokeExact(toString, sobj);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   476
                    if (JSType.isPrimitive(value)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   477
                        return value;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   478
                    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   479
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   480
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   481
                final Object valueOf = VALUE_OF.getGetter().invokeExact(sobj);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   482
                if (valueOf instanceof ScriptFunction) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   483
                    final Object value = VALUE_OF.getInvoker().invokeExact(valueOf, sobj);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   484
                    if (JSType.isPrimitive(value)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   485
                        return value;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   486
                    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   487
                }
16256
f2d9a0c49914 8007002: Replace implicit exception throwing methods with explicit throws - simplify control flow and remove useless code
lagergren
parents: 16234
diff changeset
   488
                throw typeError(this, "cannot.get.default.string");
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   489
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   490
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   491
            if (hint == Number.class) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   492
                final Object valueOf = VALUE_OF.getGetter().invokeExact(sobj);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   493
                if (valueOf instanceof ScriptFunction) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   494
                    final Object value = VALUE_OF.getInvoker().invokeExact(valueOf, sobj);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   495
                    if (JSType.isPrimitive(value)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   496
                        return value;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   497
                    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   498
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   499
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   500
                final Object toString = TO_STRING.getGetter().invokeExact(sobj);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   501
                if (toString instanceof ScriptFunction) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   502
                    final Object value = TO_STRING.getInvoker().invokeExact(toString, sobj);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   503
                    if (JSType.isPrimitive(value)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   504
                        return value;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   505
                    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   506
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   507
16256
f2d9a0c49914 8007002: Replace implicit exception throwing methods with explicit throws - simplify control flow and remove useless code
lagergren
parents: 16234
diff changeset
   508
                throw typeError(this, "cannot.get.default.number");
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   509
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   510
        } catch (final RuntimeException | Error e) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   511
            throw e;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   512
        } catch (final Throwable t) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   513
            throw new RuntimeException(t);
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
        return UNDEFINED;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   517
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   518
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   519
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   520
    public boolean isError(final ScriptObject sobj) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   521
        final ScriptObject errorProto = getErrorPrototype();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   522
        ScriptObject proto = sobj.getProto();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   523
        while (proto != null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   524
            if (proto == errorProto) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   525
                return true;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   526
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   527
            proto = proto.getProto();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   528
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   529
        return false;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   530
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   531
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   532
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   533
    public ScriptObject newError(final String msg) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   534
        return new NativeError(msg);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   535
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   536
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   537
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   538
    public ScriptObject newEvalError(final String msg) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   539
        return new NativeEvalError(msg);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   540
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   541
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   542
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   543
    public ScriptObject newRangeError(final String msg) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   544
        return new NativeRangeError(msg);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   545
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   546
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   547
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   548
    public ScriptObject newReferenceError(final String msg) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   549
        return new NativeReferenceError(msg);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   550
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   551
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   552
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   553
    public ScriptObject newSyntaxError(final String msg) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   554
        return new NativeSyntaxError(msg);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   555
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   556
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   557
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   558
    public ScriptObject newTypeError(final String msg) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   559
        return new NativeTypeError(msg);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   560
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   561
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   562
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   563
    public ScriptObject newURIError(final String msg) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   564
        return new NativeURIError(msg);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   565
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   566
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   567
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   568
    public PropertyDescriptor newGenericDescriptor(final boolean configurable, final boolean enumerable) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   569
        return new GenericPropertyDescriptor(configurable, enumerable);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   570
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   571
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   572
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   573
    public PropertyDescriptor newDataDescriptor(final Object value, final boolean configurable, final boolean enumerable, final boolean writable) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   574
        return new DataPropertyDescriptor(configurable, enumerable, writable, value);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   575
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   576
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   577
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   578
    public PropertyDescriptor newAccessorDescriptor(final Object get, final Object set, final boolean configurable, final boolean enumerable) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   579
        final AccessorPropertyDescriptor desc = new AccessorPropertyDescriptor(configurable, enumerable, get == null ? UNDEFINED : get, set == null ? UNDEFINED : set);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   580
16226
0e4f37e6cc40 8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents: 16223
diff changeset
   581
        final boolean strict = context._strict;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   582
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   583
        if (get == null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   584
            desc.delete(PropertyDescriptor.GET, strict);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   585
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   586
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   587
        if (set == null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   588
            desc.delete(PropertyDescriptor.SET, strict);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   589
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   590
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   591
        return desc;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   592
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   593
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   594
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   595
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   596
     * Cache for compiled script classes.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   597
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   598
    @SuppressWarnings("serial")
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   599
    private static class ClassCache extends LinkedHashMap<Source, SoftReference<Class<?>>> {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   600
        private final int size;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   601
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   602
        ClassCache(int size) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   603
            super(size, 0.75f, true);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   604
            this.size = size;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   605
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   606
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   607
        @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   608
        protected boolean removeEldestEntry(final Map.Entry<Source, SoftReference<Class<?>>> eldest) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   609
            return size() >= size;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   610
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   611
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   612
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   613
    // Class cache management
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   614
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   615
    public Class<?> findCachedClass(final Source source) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   616
        assert classCache != null : "Class cache used without being initialized";
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   617
        SoftReference<Class<?>> ref = classCache.get(source);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   618
        if (ref != null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   619
            final Class<?> clazz = ref.get();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   620
            if (clazz == null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   621
                classCache.remove(source);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   622
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   623
            return clazz;
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
        return null;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   627
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   628
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   629
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   630
    public void cacheClass(final Source source, final Class<?> clazz) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   631
        assert classCache != null : "Class cache used without being initialized";
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   632
        classCache.put(source, new SoftReference<Class<?>>(clazz));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   633
    }
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
     * This is the eval used when 'indirect' eval call is made.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   637
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   638
     * var global = this;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   639
     * global.eval("print('hello')");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   640
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   641
     * @param self  eval scope
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   642
     * @param str   eval string
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   643
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   644
     * @return the result of eval
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   645
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   646
    public static Object eval(final Object self, final Object str) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   647
        return directEval(self, str, UNDEFINED, UNDEFINED, UNDEFINED);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   648
    }
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
     * Direct eval
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   652
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   653
     * @param self     The scope of eval passed as 'self'
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   654
     * @param str      Evaluated code
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   655
     * @param callThis "this" to be passed to the evaluated code
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   656
     * @param location location of the eval call
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   657
     * @param strict   is eval called a strict mode code?
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   658
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   659
     * @return the return value of the eval
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   660
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   661
     * This is directly invoked from generated when eval(code) is called in user code
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   662
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   663
    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
   664
        if (!(str instanceof String || str instanceof ConsString)) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   665
            return str;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   666
        }
16185
893aabe8c800 8006635: Reduce access levels as much as possible
sundar
parents: 16181
diff changeset
   667
        final Global global = Global.instance();
893aabe8c800 8006635: Reduce access levels as much as possible
sundar
parents: 16181
diff changeset
   668
        final ScriptObject scope = (self instanceof ScriptObject) ? (ScriptObject)self : global;
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   669
16226
0e4f37e6cc40 8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents: 16223
diff changeset
   670
        return global.context.eval(scope, str.toString(), callThis, location, Boolean.TRUE.equals(strict));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   671
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   672
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   673
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   674
     * Global print implementation - Nashorn extension
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   675
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   676
     * @param self    scope
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   677
     * @param objects arguments to print
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   678
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   679
     * @return result of print (undefined)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   680
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   681
    public static Object print(final Object self, final Object... objects) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   682
        return printImpl(false, objects);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   683
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   684
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   685
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   686
     * Global println implementation - Nashorn extension
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   687
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   688
     * @param self    scope
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   689
     * @param objects arguments to print
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   690
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   691
     * @return result of println (undefined)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   692
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   693
    public static Object println(final Object self, final Object... objects) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   694
        return printImpl(true, objects);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   695
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   696
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   697
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   698
     * Global load implementation - Nashorn extension
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   699
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   700
     * @param self    scope
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   701
     * @param source  source to load
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   702
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   703
     * @return result of load (undefined)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   704
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   705
     * @throws IOException if source could not be read
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   706
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   707
    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
   708
        final Global global = Global.instance();
893aabe8c800 8006635: Reduce access levels as much as possible
sundar
parents: 16181
diff changeset
   709
        final ScriptObject scope = (self instanceof ScriptObject) ? (ScriptObject)self : global;
16226
0e4f37e6cc40 8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents: 16223
diff changeset
   710
        return global.context.load(scope, source);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   711
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   712
16219
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
   713
    /**
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
   714
     * 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
   715
     *
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
   716
     * @param self  self reference
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
   717
     * @param code  exit code
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
   718
     *
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
   719
     * @return undefined (will never be reacheD)
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
   720
     */
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
   721
    public static Object exit(final Object self, final Object code) {
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
   722
        System.exit(JSType.toInt32(code));
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
   723
        return UNDEFINED;
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
   724
    }
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
   725
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   726
    ScriptObject getFunctionPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   727
        return ScriptFunction.getPrototype(builtinFunction);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   728
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   729
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   730
    ScriptObject getObjectPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   731
        return ScriptFunction.getPrototype(builtinObject);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   732
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   733
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   734
    ScriptObject getArrayPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   735
        return ScriptFunction.getPrototype(builtinArray);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   736
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   737
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   738
    ScriptObject getBooleanPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   739
        return ScriptFunction.getPrototype(builtinBoolean);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   740
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   741
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   742
    ScriptObject getNumberPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   743
        return ScriptFunction.getPrototype(builtinNumber);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   744
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   745
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   746
    ScriptObject getDatePrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   747
        return ScriptFunction.getPrototype(builtinDate);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   748
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   749
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   750
    ScriptObject getRegExpPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   751
        return ScriptFunction.getPrototype(builtinRegExp);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   752
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   753
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   754
    ScriptObject getStringPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   755
        return ScriptFunction.getPrototype(builtinString);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   756
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   757
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   758
    ScriptObject getErrorPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   759
        return ScriptFunction.getPrototype(builtinError);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   760
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   761
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   762
    ScriptObject getEvalErrorPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   763
        return ScriptFunction.getPrototype(builtinEvalError);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   764
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   765
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   766
    ScriptObject getRangeErrorPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   767
        return ScriptFunction.getPrototype(builtinRangeError);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   768
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   769
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   770
    ScriptObject getReferenceErrorPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   771
        return ScriptFunction.getPrototype(builtinReferenceError);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   772
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   773
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   774
    ScriptObject getSyntaxErrorPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   775
        return ScriptFunction.getPrototype(builtinSyntaxError);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   776
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   777
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   778
    ScriptObject getTypeErrorPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   779
        return ScriptFunction.getPrototype(builtinTypeError);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   780
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   781
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   782
    ScriptObject getURIErrorPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   783
        return ScriptFunction.getPrototype(builtinURIError);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   784
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   785
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   786
    ScriptObject getJavaImporterPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   787
        return ScriptFunction.getPrototype(builtinJavaImporter);
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
    ScriptObject getJSAdapterPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   791
        return ScriptFunction.getPrototype(builtinJSAdapter);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   792
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   793
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   794
    ScriptObject getArrayBufferPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   795
        return ScriptFunction.getPrototype(builtinArrayBuffer);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   796
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   797
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   798
    ScriptObject getInt8ArrayPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   799
        return ScriptFunction.getPrototype(builtinInt8Array);
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
    ScriptObject getUint8ArrayPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   803
        return ScriptFunction.getPrototype(builtinUint8Array);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   804
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   805
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   806
    ScriptObject getUint8ClampedArrayPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   807
        return ScriptFunction.getPrototype(builtinUint8ClampedArray);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   808
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   809
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   810
    ScriptObject getInt16ArrayPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   811
        return ScriptFunction.getPrototype(builtinInt16Array);
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
    ScriptObject getUint16ArrayPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   815
        return ScriptFunction.getPrototype(builtinUint16Array);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   816
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   817
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   818
    ScriptObject getInt32ArrayPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   819
        return ScriptFunction.getPrototype(builtinInt32Array);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   820
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   821
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   822
    ScriptObject getUint32ArrayPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   823
        return ScriptFunction.getPrototype(builtinUint32Array);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   824
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   825
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   826
    ScriptObject getFloat32ArrayPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   827
        return ScriptFunction.getPrototype(builtinFloat32Array);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   828
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   829
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   830
    ScriptObject getFloat64ArrayPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   831
        return ScriptFunction.getPrototype(builtinFloat64Array);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   832
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   833
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   834
    private ScriptFunction getBuiltinArray() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   835
        return builtinArray;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   836
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   837
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   838
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   839
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   840
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   841
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   842
     * @return true if builtin array has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   843
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   844
    public static boolean isBuiltinArray() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   845
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   846
        return instance.array == instance.getBuiltinArray();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   847
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   848
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   849
    private ScriptFunction getBuiltinBoolean() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   850
        return builtinBoolean;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   851
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   852
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   853
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   854
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   855
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   856
     * @return true if builtin boolean has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   857
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   858
    public static boolean isBuiltinBoolean() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   859
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   860
        return instance._boolean == instance.getBuiltinBoolean();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   861
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   862
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   863
    private ScriptFunction getBuiltinDate() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   864
        return builtinDate;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   865
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   866
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   867
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   868
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   869
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   870
     * @return true if builtin date has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   871
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   872
    public static boolean isBuiltinDate() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   873
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   874
        return instance.date == instance.getBuiltinDate();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   875
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   876
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   877
    private ScriptFunction getBuiltinError() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   878
        return builtinError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   879
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   880
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   881
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   882
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   883
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   884
     * @return true if builtin error has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   885
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   886
    public static boolean isBuiltinError() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   887
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   888
        return instance.error == instance.getBuiltinError();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   889
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   890
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   891
    private ScriptFunction getBuiltinEvalError() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   892
        return builtinEvalError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   893
    }
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
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   897
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   898
     * @return true if builtin eval error has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   899
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   900
    public static boolean isBuiltinEvalError() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   901
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   902
        return instance.evalError == instance.getBuiltinEvalError();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   903
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   904
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   905
    private ScriptFunction getBuiltinFunction() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   906
        return builtinFunction;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   907
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   908
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   909
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   910
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   911
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   912
     * @return true if builtin function has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   913
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   914
    public static boolean isBuiltinFunction() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   915
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   916
        return instance.function == instance.getBuiltinFunction();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   917
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   918
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   919
    private ScriptFunction getBuiltinJSAdapter() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   920
        return builtinJSAdapter;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   921
    }
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
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   925
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   926
     * @return true if builtin JSAdapter has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   927
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   928
    public static boolean isBuiltinJSAdapter() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   929
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   930
        return instance.jsadapter == instance.getBuiltinJSAdapter();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   931
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   932
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   933
    private ScriptObject getBuiltinJSON() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   934
        return builtinJSON;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   935
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   936
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   937
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   938
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   939
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   940
     * @return true if builtin JSON has has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   941
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   942
    public static boolean isBuiltinJSON() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   943
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   944
        return instance.json == instance.getBuiltinJSON();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   945
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   946
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   947
    private ScriptObject getBuiltinJava() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   948
        return builtinJava;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   949
    }
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
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   953
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   954
     * @return true if builtin Java has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   955
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   956
    public static boolean isBuiltinJava() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   957
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   958
        return instance.java == instance.getBuiltinJava();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   959
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   960
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   961
    private ScriptObject getBuiltinJavax() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   962
        return builtinJavax;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   963
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   964
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   965
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   966
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   967
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   968
     * @return true if builtin Javax has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   969
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   970
    public static boolean isBuiltinJavax() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   971
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   972
        return instance.javax == instance.getBuiltinJavax();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   973
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   974
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   975
    private ScriptObject getBuiltinJavaImporter() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   976
        return builtinJavaImporter;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   977
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   978
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   979
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   980
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   981
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   982
     * @return true if builtin Java importer has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   983
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   984
    public static boolean isBuiltinJavaImporter() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   985
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   986
        return instance.javaImporter == instance.getBuiltinJavaImporter();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   987
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   988
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   989
    private ScriptObject getBuiltinMath() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   990
        return builtinMath;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   991
    }
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
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   995
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   996
     * @return true if builtin math has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   997
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   998
    public static boolean isBuiltinMath() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
   999
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1000
        return instance.math == instance.getBuiltinMath();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1001
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1002
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1003
    private ScriptFunction getBuiltinNumber() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1004
        return builtinNumber;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1005
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1006
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1007
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1008
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1009
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1010
     * @return true if builtin number has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1011
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1012
    public static boolean isBuiltinNumber() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1013
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1014
        return instance.number == instance.getBuiltinNumber();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1015
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1016
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1017
    private ScriptFunction getBuiltinObject() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1018
        return builtinObject;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1019
    }
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
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1023
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1024
     * @return true if builtin object has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1025
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1026
    public static boolean isBuiltinObject() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1027
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1028
        return instance.object == instance.getBuiltinObject();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1029
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1030
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1031
    private ScriptObject getBuiltinPackages() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1032
        return builtinPackages;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1033
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1034
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1035
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1036
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1037
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1038
     * @return true if builtin package has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1039
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1040
    public static boolean isBuiltinPackages() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1041
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1042
        return instance.packages == instance.getBuiltinPackages();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1043
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1044
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1045
    private ScriptFunction getBuiltinRangeError() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1046
        return builtinRangeError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1047
    }
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
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1051
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1052
     * @return true if builtin range error has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1053
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1054
    public static boolean isBuiltinRangeError() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1055
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1056
        return instance.rangeError == instance.getBuiltinRangeError();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1057
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1058
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1059
    private ScriptFunction getBuiltinReferenceError() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1060
        return builtinReferenceError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1061
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1062
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1063
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1064
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1065
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1066
     * @return true if builtin reference error has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1067
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1068
    public static boolean isBuiltinReferenceError() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1069
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1070
        return instance.referenceError == instance.getBuiltinReferenceError();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1071
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1072
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1073
    private ScriptFunction getBuiltinRegExp() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1074
        return builtinRegExp;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1075
    }
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
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1079
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1080
     * @return true if builtin regexp has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1081
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1082
    public static boolean isBuiltinRegExp() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1083
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1084
        return instance.regexp == instance.getBuiltinRegExp();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1085
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1086
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1087
    private ScriptFunction getBuiltinString() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1088
        return builtinString;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1089
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1090
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1091
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1092
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1093
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1094
     * @return true if builtin Java has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1095
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1096
    public static boolean isBuiltinString() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1097
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1098
        return instance.string == instance.getBuiltinString();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1099
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1100
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1101
    private ScriptFunction getBuiltinSyntaxError() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1102
        return builtinSyntaxError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1103
    }
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
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1107
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1108
     * @return true if builtin syntax error has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1109
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1110
    public static boolean isBuiltinSyntaxError() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1111
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1112
        return instance.syntaxError == instance.getBuiltinSyntaxError();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1113
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1114
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1115
    private ScriptFunction getBuiltinTypeError() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1116
        return builtinTypeError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1117
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1118
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1119
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1120
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1121
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1122
     * @return true if builtin type error has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1123
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1124
    public static boolean isBuiltinTypeError() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1125
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1126
        return instance.typeError == instance.getBuiltinTypeError();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1127
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1128
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1129
    private ScriptFunction getBuiltinURIError() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1130
        return builtinURIError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1131
    }
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
     * Called from compiled script code to test if builtin has been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1135
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1136
     * @return true if builtin URI error has not been overridden
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1137
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1138
    public static boolean isBuiltinURIError() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1139
        final Global instance = Global.instance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1140
        return instance.uriError == instance.getBuiltinURIError();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1141
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1142
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1143
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1144
    public String getClassName() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1145
        return "global";
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
     * Copy function used to clone NativeRegExp objects.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1150
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1151
     * @param regexp a NativeRegExp to clone
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1152
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1153
     * @return copy of the given regexp object
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1154
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1155
    public static Object regExpCopy(final Object regexp) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1156
        return new NativeRegExp((NativeRegExp)regexp);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1157
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1158
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1159
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1160
     * Convert given object to NativeRegExp type.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1161
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1162
     * @param obj object to be converted
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1163
     * @return NativeRegExp instance
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1164
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1165
    public static NativeRegExp toRegExp(final Object obj) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1166
        if (obj instanceof NativeRegExp) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1167
            return (NativeRegExp)obj;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1168
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1169
        return new NativeRegExp(JSType.toString(obj));
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
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1173
     * ECMA 9.9 ToObject implementation
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1174
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1175
     * @param obj  an item for which to run ToObject
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1176
     * @return ToObject version of given item
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1177
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1178
    public static Object toObject(final Object obj) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1179
        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
  1180
            throw typeError("not.an.object", ScriptRuntime.safeToString(obj));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1181
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1182
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1183
        if (obj instanceof ScriptObject) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1184
            return obj;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1185
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1186
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1187
        return instance().wrapAsObject(obj);
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
     * Allocate a new object array.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1192
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1193
     * @param initial object values.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1194
     * @return the new array
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1195
     */
16210
8ad1381b69d0 8007215: Varargs broken for the case of passing more than the arg limit arguments.
lagergren
parents: 16207
diff changeset
  1196
    public static NativeArray allocate(final Object[] initial) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1197
        return new NativeArray(initial);
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
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1201
     * Allocate a new number array.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1202
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1203
     * @param initial number values.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1204
     * @return the new array
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1205
     */
16210
8ad1381b69d0 8007215: Varargs broken for the case of passing more than the arg limit arguments.
lagergren
parents: 16207
diff changeset
  1206
    public static NativeArray allocate(final double[] initial) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1207
        return new NativeArray(initial);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1208
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1209
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1210
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1211
     * Allocate a new long array.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1212
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1213
     * @param initial number values.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1214
     * @return the new array
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1215
     */
16210
8ad1381b69d0 8007215: Varargs broken for the case of passing more than the arg limit arguments.
lagergren
parents: 16207
diff changeset
  1216
    public static NativeArray allocate(final long[] initial) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1217
        return new NativeArray(initial);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1218
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1219
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1220
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1221
     * Allocate a new integer array.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1222
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1223
     * @param initial number values.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1224
     * @return the new array
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1225
     */
16210
8ad1381b69d0 8007215: Varargs broken for the case of passing more than the arg limit arguments.
lagergren
parents: 16207
diff changeset
  1226
    public static NativeArray allocate(final int[] initial) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1227
        return new NativeArray(initial);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1228
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1229
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1230
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1231
     * Allocate a new object array for arguments.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1232
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1233
     * @param arguments initial arguments passed.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1234
     * @param callee reference to the function that uses arguments object
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1235
     * @param numParams actual number of declared parameters
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1236
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1237
     * @return the new array
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1238
     */
16206
83069fa0935b 8006529: Methods always get callee - it should be conditional
attila
parents: 16196
diff changeset
  1239
    public static ScriptObject allocateArguments(final Object[] arguments, final Object callee, final int numParams) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1240
        return NativeArguments.allocate(arguments, (ScriptFunction)callee, numParams);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1241
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1242
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1243
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1244
     * Called from generated to check if given function is the builtin 'eval'. If
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1245
     * eval is used in a script, a lot of optimizations and assumptions cannot be done.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1246
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1247
     * @param  fn function object that is checked
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1248
     * @return true if fn is the builtin eval
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1249
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1250
    public static boolean isEval(final Object fn) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1251
        return fn == Global.instance().builtinEval;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1252
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1253
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1254
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1255
     * Create a new RegExp object.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1256
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1257
     * @param expression Regular expression.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1258
     * @param options    Search options.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1259
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1260
     * @return New RegExp object.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1261
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1262
    public static Object newRegExp(final String expression, final String options) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1263
        if (options == null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1264
            return new NativeRegExp(expression);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1265
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1266
        return new NativeRegExp(expression, options);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1267
    }
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
     * Get the object prototype
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1271
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1272
     * @return the object prototype
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1273
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1274
    public static ScriptObject objectPrototype() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1275
        return Global.instance().getObjectPrototype();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1276
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1277
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1278
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1279
     * Create a new empty object instance.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1280
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1281
     * @return New empty object.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1282
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1283
    public static ScriptObject newEmptyInstance() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1284
        final ScriptObject sobj = new JO$();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1285
        sobj.setProto(objectPrototype());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1286
        return sobj;
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
     * Check if a given object is a ScriptObject, raises an exception if this is
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1291
     * not the case
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1292
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1293
     * @param obj and object to check
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1294
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1295
    public static void checkObject(final Object obj) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1296
        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
  1297
            throw typeError("not.an.object", ScriptRuntime.safeToString(obj));
16147
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
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1302
     * ECMA 9.10 - implementation of CheckObjectCoercible, i.e. raise an exception
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1303
     * if this object is null or undefined.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1304
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1305
     * @param obj an object to check
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1306
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1307
    public static void checkObjectCoercible(final Object obj) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1308
        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
  1309
            throw typeError("not.an.object", ScriptRuntime.safeToString(obj));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1310
        }
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
     * Get the current split state.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1315
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1316
     * @return current split state
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1317
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1318
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1319
    public int getSplitState() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1320
        return splitState;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1321
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1322
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1323
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1324
     * Set the current split state.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1325
     *
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1326
     * @param state current split state
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1327
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1328
    @Override
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1329
    public void setSplitState(final int state) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1330
        splitState = state;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1331
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1332
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1333
    private void init() {
16185
893aabe8c800 8006635: Reduce access levels as much as possible
sundar
parents: 16181
diff changeset
  1334
        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
  1335
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1336
        // initialize Function and Object constructor
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1337
        initFunctionAndObject();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1338
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1339
        // Now fix Global's own proto.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1340
        this.setProto(getObjectPrototype());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1341
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1342
        // initialize global function properties
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1343
        this.eval = this.builtinEval = ScriptFunctionImpl.makeFunction("eval", EVAL);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1344
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1345
        this.parseInt           = ScriptFunctionImpl.makeFunction("parseInt",   GlobalFunctions.PARSEINT);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1346
        this.parseFloat         = ScriptFunctionImpl.makeFunction("parseFloat", GlobalFunctions.PARSEFLOAT);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1347
        this.isNaN              = ScriptFunctionImpl.makeFunction("isNaN",      GlobalFunctions.IS_NAN);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1348
        this.isFinite           = ScriptFunctionImpl.makeFunction("isFinite",   GlobalFunctions.IS_FINITE);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1349
        this.encodeURI          = ScriptFunctionImpl.makeFunction("encodeURI",  GlobalFunctions.ENCODE_URI);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1350
        this.encodeURIComponent = ScriptFunctionImpl.makeFunction("encodeURIComponent", GlobalFunctions.ENCODE_URICOMPONENT);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1351
        this.decodeURI          = ScriptFunctionImpl.makeFunction("decodeURI",  GlobalFunctions.DECODE_URI);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1352
        this.decodeURIComponent = ScriptFunctionImpl.makeFunction("decodeURIComponent", GlobalFunctions.DECODE_URICOMPONENT);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1353
        this.escape             = ScriptFunctionImpl.makeFunction("escape",     GlobalFunctions.ESCAPE);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1354
        this.unescape           = ScriptFunctionImpl.makeFunction("unescape",   GlobalFunctions.UNESCAPE);
16226
0e4f37e6cc40 8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents: 16223
diff changeset
  1355
        this.print              = ScriptFunctionImpl.makeFunction("print",      context._print_no_newline ? PRINT : PRINTLN);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1356
        this.load               = ScriptFunctionImpl.makeFunction("load",       LOAD);
16219
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
  1357
        this.exit               = ScriptFunctionImpl.makeFunction("exit",       EXIT);
ccf1c34f26d9 8007629: Remove extraneous quit from shell.js
jlaskey
parents: 16217
diff changeset
  1358
        this.quit               = ScriptFunctionImpl.makeFunction("quit",       EXIT);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1359
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1360
        // built-in constructors
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1361
        this.builtinArray     = (ScriptFunction)initConstructor("Array");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1362
        this.builtinBoolean   = (ScriptFunction)initConstructor("Boolean");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1363
        this.builtinDate      = (ScriptFunction)initConstructor("Date");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1364
        this.builtinJSON      = initConstructor("JSON");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1365
        this.builtinJSAdapter = (ScriptFunction)initConstructor("JSAdapter");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1366
        this.builtinMath      = initConstructor("Math");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1367
        this.builtinNumber    = (ScriptFunction)initConstructor("Number");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1368
        this.builtinRegExp    = (ScriptFunction)initConstructor("RegExp");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1369
        this.builtinString    = (ScriptFunction)initConstructor("String");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1370
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1371
        // initialize String.prototype.length to 0
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1372
        // add String.prototype.length
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1373
        final ScriptObject stringPrototype = getStringPrototype();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1374
        stringPrototype.addOwnProperty("length", Attribute.NON_ENUMERABLE_CONSTANT, 0.0);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1375
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1376
        // add Array.prototype.length
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1377
        final ScriptObject arrayPrototype = getArrayPrototype();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1378
        arrayPrototype.addOwnProperty("length", Attribute.NON_ENUMERABLE_CONSTANT, 0.0);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1379
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1380
        this.DEFAULT_DATE = new NativeDate(Double.NaN);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1381
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1382
        // initialize default regexp object
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1383
        this.DEFAULT_REGEXP = new NativeRegExp("(?:)");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1384
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1385
        // RegExp.prototype should behave like a RegExp object. So copy the
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1386
        // properties.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1387
        final ScriptObject regExpProto = getRegExpPrototype();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1388
        regExpProto.addBoundProperties(DEFAULT_REGEXP);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1389
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1390
        // Error stuff
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1391
        initErrorObjects();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1392
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1393
        // java access
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1394
        initJavaAccess();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1395
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1396
        initTypedArray();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1397
16226
0e4f37e6cc40 8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents: 16223
diff changeset
  1398
        if (context._scripting) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1399
            initScripting();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1400
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1401
16185
893aabe8c800 8006635: Reduce access levels as much as possible
sundar
parents: 16181
diff changeset
  1402
        if (Context.DEBUG && System.getSecurityManager() == null) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1403
            initDebug();
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
        copyBuiltins();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1407
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1408
        // initialized with strings so that typeof will work as expected.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1409
        this.__FILE__ = "";
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1410
        this.__DIR__  = "";
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1411
        this.__LINE__ = 0.0;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1412
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1413
        // expose script (command line) arguments as "arguments" property of global
16226
0e4f37e6cc40 8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents: 16223
diff changeset
  1414
        final List<String> arguments = context.getOptions().getArguments();
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1415
        final Object argsObj = wrapAsObject(arguments.toArray());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1416
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1417
        addOwnProperty("arguments", Attribute.NOT_ENUMERABLE, argsObj);
16226
0e4f37e6cc40 8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents: 16223
diff changeset
  1418
        if (context._scripting) {
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1419
            // synonym for "arguments" in scripting mode
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1420
            addOwnProperty("$ARG", Attribute.NOT_ENUMERABLE, argsObj);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1421
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1422
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1423
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1424
    private void initErrorObjects() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1425
        // Error objects
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1426
        this.builtinError = (ScriptFunction)initConstructor("Error");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1427
        final ScriptObject errorProto = getErrorPrototype();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1428
        final boolean strict = Global.isStrict();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1429
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1430
        // Nashorn specific accessors on Error.prototype - stack, lineNumber, columnNumber and fileName
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1431
        final ScriptFunction getStack = ScriptFunctionImpl.makeFunction("getStack", NativeError.GET_STACK);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1432
        final ScriptFunction setStack = ScriptFunctionImpl.makeFunction("setStack", NativeError.SET_STACK);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1433
        errorProto.addOwnProperty("stack", Attribute.NOT_ENUMERABLE, getStack, setStack);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1434
        final ScriptFunction getLineNumber = ScriptFunctionImpl.makeFunction("getLineNumber", NativeError.GET_LINENUMBER);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1435
        final ScriptFunction setLineNumber = ScriptFunctionImpl.makeFunction("setLineNumber", NativeError.SET_LINENUMBER);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1436
        errorProto.addOwnProperty("lineNumber", Attribute.NOT_ENUMERABLE, getLineNumber, setLineNumber);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1437
        final ScriptFunction getColumnNumber = ScriptFunctionImpl.makeFunction("getColumnNumber", NativeError.GET_COLUMNNUMBER);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1438
        final ScriptFunction setColumnNumber = ScriptFunctionImpl.makeFunction("setColumnNumber", NativeError.SET_COLUMNNUMBER);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1439
        errorProto.addOwnProperty("columnNumber", Attribute.NOT_ENUMERABLE, getColumnNumber, setColumnNumber);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1440
        final ScriptFunction getFileName = ScriptFunctionImpl.makeFunction("getFileName", NativeError.GET_FILENAME);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1441
        final ScriptFunction setFileName = ScriptFunctionImpl.makeFunction("setFileName", NativeError.SET_FILENAME);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1442
        errorProto.addOwnProperty("fileName", Attribute.NOT_ENUMERABLE, getFileName, setFileName);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1443
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1444
        // ECMA 15.11.4.2 Error.prototype.name
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1445
        // Error.prototype.name = "Error";
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1446
        errorProto.set(NativeError.NAME, "Error", strict);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1447
        // ECMA 15.11.4.3 Error.prototype.message
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1448
        // Error.prototype.message = "";
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1449
        errorProto.set(NativeError.MESSAGE, "", strict);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1450
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1451
        this.builtinEvalError = initErrorSubtype("EvalError", errorProto);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1452
        this.builtinRangeError = initErrorSubtype("RangeError", errorProto);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1453
        this.builtinReferenceError = initErrorSubtype("ReferenceError", errorProto);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1454
        this.builtinSyntaxError = initErrorSubtype("SyntaxError", errorProto);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1455
        this.builtinTypeError = initErrorSubtype("TypeError", errorProto);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1456
        this.builtinURIError = initErrorSubtype("URIError", errorProto);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1457
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1458
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1459
    private ScriptFunction initErrorSubtype(final String name, final ScriptObject errorProto) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1460
        final ScriptObject cons = initConstructor(name);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1461
        final ScriptObject prototype = ScriptFunction.getPrototype(cons);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1462
        final boolean strict = Global.isStrict();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1463
        prototype.set(NativeError.NAME, name, strict);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1464
        prototype.set(NativeError.MESSAGE, "", strict);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1465
        prototype.setProto(errorProto);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1466
        return (ScriptFunction)cons;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1467
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1468
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1469
    private void initJavaAccess() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1470
        final ScriptObject objectProto = getObjectPrototype();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1471
        this.builtinPackages = new NativeJavaPackage("", objectProto);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1472
        this.builtinJava = new NativeJavaPackage("java", objectProto);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1473
        this.builtinJavax = new NativeJavaPackage("javax", objectProto);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1474
        this.builtinJavaImporter = initConstructor("JavaImporter");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1475
        this.builtinJavaApi = initConstructor("Java");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1476
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1477
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1478
    private void initScripting() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1479
        Object value;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1480
        value = ScriptFunctionImpl.makeFunction("readLine", ScriptingFunctions.READLINE);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1481
        addOwnProperty("readLine", Attribute.NOT_ENUMERABLE, value);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1482
16196
58f6f046bb5e 8006983: Introduce a command line option to switch off syntactic extensions of nashorn
sundar
parents: 16195
diff changeset
  1483
        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
  1484
        addOwnProperty("readFully", Attribute.NOT_ENUMERABLE, value);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1485
16211
41e031a45186 8006191: `cmd` -> exec("cmd") in script mode
jlaskey
parents: 16210
diff changeset
  1486
        final String execName = ScriptingFunctions.EXEC_NAME;
41e031a45186 8006191: `cmd` -> exec("cmd") in script mode
jlaskey
parents: 16210
diff changeset
  1487
        value = ScriptFunctionImpl.makeFunction(execName, ScriptingFunctions.EXEC);
41e031a45186 8006191: `cmd` -> exec("cmd") in script mode
jlaskey
parents: 16210
diff changeset
  1488
        addOwnProperty(execName, Attribute.NOT_ENUMERABLE, value);
41e031a45186 8006191: `cmd` -> exec("cmd") in script mode
jlaskey
parents: 16210
diff changeset
  1489
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1490
        // Nashorn extension: global.echo (scripting-mode-only)
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1491
        // alias for "print"
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1492
        value = get("print");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1493
        addOwnProperty("echo", Attribute.NOT_ENUMERABLE, value);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1494
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1495
        // Nashorn extension: global.$OPTIONS (scripting-mode-only)
16226
0e4f37e6cc40 8007915: Nashorn IR, codegen, parser packages and Context instance should be inaccessible to user code
sundar
parents: 16223
diff changeset
  1496
        value = new OptionsObject(context);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1497
        addOwnProperty("$OPTIONS", Attribute.NOT_ENUMERABLE, value);
16211
41e031a45186 8006191: `cmd` -> exec("cmd") in script mode
jlaskey
parents: 16210
diff changeset
  1498
41e031a45186 8006191: `cmd` -> exec("cmd") in script mode
jlaskey
parents: 16210
diff changeset
  1499
        // Nashorn extension: global.$ENV (scripting-mode-only)
16213
66cb726a76d5 8007521: $ENV should be undefined when security manager is present
sundar
parents: 16211
diff changeset
  1500
        if (System.getSecurityManager() == null) {
66cb726a76d5 8007521: $ENV should be undefined when security manager is present
sundar
parents: 16211
diff changeset
  1501
            // 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
  1502
            // Retrieve current state of ENV variables.
66cb726a76d5 8007521: $ENV should be undefined when security manager is present
sundar
parents: 16211
diff changeset
  1503
            final ScriptObject env = newEmptyInstance();
66cb726a76d5 8007521: $ENV should be undefined when security manager is present
sundar
parents: 16211
diff changeset
  1504
            env.putAll(System.getenv());
66cb726a76d5 8007521: $ENV should be undefined when security manager is present
sundar
parents: 16211
diff changeset
  1505
            addOwnProperty(ScriptingFunctions.ENV_NAME, Attribute.NOT_ENUMERABLE, env);
66cb726a76d5 8007521: $ENV should be undefined when security manager is present
sundar
parents: 16211
diff changeset
  1506
        } else {
66cb726a76d5 8007521: $ENV should be undefined when security manager is present
sundar
parents: 16211
diff changeset
  1507
            addOwnProperty(ScriptingFunctions.ENV_NAME, Attribute.NOT_ENUMERABLE, UNDEFINED);
66cb726a76d5 8007521: $ENV should be undefined when security manager is present
sundar
parents: 16211
diff changeset
  1508
        }
66cb726a76d5 8007521: $ENV should be undefined when security manager is present
sundar
parents: 16211
diff changeset
  1509
66cb726a76d5 8007521: $ENV should be undefined when security manager is present
sundar
parents: 16211
diff changeset
  1510
        // add other special properties for exec support
66cb726a76d5 8007521: $ENV should be undefined when security manager is present
sundar
parents: 16211
diff changeset
  1511
        addOwnProperty(ScriptingFunctions.OUT_NAME, Attribute.NOT_ENUMERABLE, UNDEFINED);
66cb726a76d5 8007521: $ENV should be undefined when security manager is present
sundar
parents: 16211
diff changeset
  1512
        addOwnProperty(ScriptingFunctions.ERR_NAME, Attribute.NOT_ENUMERABLE, UNDEFINED);
66cb726a76d5 8007521: $ENV should be undefined when security manager is present
sundar
parents: 16211
diff changeset
  1513
        addOwnProperty(ScriptingFunctions.EXIT_NAME, Attribute.NOT_ENUMERABLE, UNDEFINED);
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1514
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1515
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1516
    private void initTypedArray() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1517
        this.builtinArrayBuffer       = initConstructor("ArrayBuffer");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1518
        this.builtinInt8Array         = initConstructor("Int8Array");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1519
        this.builtinUint8Array        = initConstructor("Uint8Array");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1520
        this.builtinUint8ClampedArray = initConstructor("Uint8ClampedArray");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1521
        this.builtinInt16Array        = initConstructor("Int16Array");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1522
        this.builtinUint16Array       = initConstructor("Uint16Array");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1523
        this.builtinInt32Array        = initConstructor("Int32Array");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1524
        this.builtinUint32Array       = initConstructor("Uint32Array");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1525
        this.builtinFloat32Array      = initConstructor("Float32Array");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1526
        this.builtinFloat64Array      = initConstructor("Float64Array");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1527
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1528
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1529
    private void copyBuiltins() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1530
        this.array             = this.builtinArray;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1531
        this._boolean          = this.builtinBoolean;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1532
        this.date              = this.builtinDate;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1533
        this.error             = this.builtinError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1534
        this.evalError         = this.builtinEvalError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1535
        this.function          = this.builtinFunction;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1536
        this.jsadapter         = this.builtinJSAdapter;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1537
        this.json              = this.builtinJSON;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1538
        this.java              = this.builtinJava;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1539
        this.javax             = this.builtinJavax;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1540
        this.javaImporter      = this.builtinJavaImporter;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1541
        this.javaApi           = this.builtinJavaApi;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1542
        this.math              = this.builtinMath;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1543
        this.number            = this.builtinNumber;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1544
        this.object            = this.builtinObject;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1545
        this.packages          = this.builtinPackages;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1546
        this.rangeError        = this.builtinRangeError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1547
        this.referenceError    = this.builtinReferenceError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1548
        this.regexp            = this.builtinRegExp;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1549
        this.string            = this.builtinString;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1550
        this.syntaxError       = this.builtinSyntaxError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1551
        this.typeError         = this.builtinTypeError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1552
        this.uriError          = this.builtinURIError;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1553
        this.arrayBuffer       = this.builtinArrayBuffer;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1554
        this.int8Array         = this.builtinInt8Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1555
        this.uint8Array        = this.builtinUint8Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1556
        this.uint8ClampedArray = this.builtinUint8ClampedArray;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1557
        this.int16Array        = this.builtinInt16Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1558
        this.uint16Array       = this.builtinUint16Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1559
        this.int32Array        = this.builtinInt32Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1560
        this.uint32Array       = this.builtinUint32Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1561
        this.float32Array      = this.builtinFloat32Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1562
        this.float64Array      = this.builtinFloat64Array;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1563
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1564
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1565
    private void initDebug() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1566
        this.addOwnProperty("Debug", Attribute.NOT_ENUMERABLE, initConstructor("Debug"));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1567
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1568
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1569
    @SuppressWarnings("resource")
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1570
    private static Object printImpl(final boolean newLine, final Object... objects) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1571
        final PrintWriter out = Global.getThisContext().getOut();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1572
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1573
        boolean first = true;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1574
        for (final Object object : objects) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1575
            if (first) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1576
                first = false;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1577
            } else {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1578
                out.print(' ');
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1579
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1580
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1581
            out.print(JSType.toString(object));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1582
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1583
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1584
        if (newLine) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1585
            out.println();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1586
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1587
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1588
        out.flush();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1589
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1590
        return UNDEFINED;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1591
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1592
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1593
    /**
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1594
     * These classes are generated by nasgen tool and so we have to use
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1595
     * reflection to load and create new instance of these classes.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1596
     */
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1597
    private ScriptObject initConstructor(final String name) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1598
        try {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1599
            // Assuming class name pattern for built-in JS constructors.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1600
            final StringBuilder sb = new StringBuilder("jdk.nashorn.internal.objects.");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1601
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1602
            sb.append("Native");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1603
            sb.append(name);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1604
            sb.append("$Constructor");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1605
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1606
            final Class<?>     funcClass = Class.forName(sb.toString());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1607
            final ScriptObject res       = (ScriptObject)funcClass.newInstance();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1608
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1609
            if (res instanceof ScriptFunction) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1610
                // All global constructor prototypes are not-writable,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1611
                // not-enumerable and not-configurable.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1612
                final ScriptFunction func = (ScriptFunction)res;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1613
                func.modifyOwnProperty(func.getProperty("prototype"), Attribute.NON_ENUMERABLE_CONSTANT);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1614
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1615
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1616
            if (res.getProto() == null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1617
                res.setProto(getObjectPrototype());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1618
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1619
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1620
            return res;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1621
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1622
        } catch (final ClassNotFoundException | InstantiationException | IllegalAccessException e) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1623
            throw new RuntimeException(e);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1624
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1625
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1626
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1627
    // Function and Object constructors are inter-dependent. Also,
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1628
    // Function.prototype
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1629
    // functions are not properly initialized. We fix the references here.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1630
    // NOTE: be careful if you want to re-order the operations here. You may
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1631
    // have
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1632
    // to play with object references carefully!!
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1633
    private void initFunctionAndObject() {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1634
        // First-n-foremost is Function
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1635
        this.builtinFunction = (ScriptFunction)initConstructor("Function");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1636
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1637
        // create global anonymous function
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1638
        final ScriptFunction anon = ScriptFunctionImpl.newAnonymousFunction();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1639
        // need to copy over members of Function.prototype to anon function
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1640
        anon.addBoundProperties(getFunctionPrototype());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1641
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1642
        // Function.prototype === Object.getPrototypeOf(Function) ===
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1643
        // <anon-function>
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1644
        builtinFunction.setProto(anon);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1645
        builtinFunction.setPrototype(anon);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1646
        anon.set("constructor", builtinFunction, anon.isStrict());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1647
        anon.deleteOwnProperty(anon.getMap().findProperty("prototype"));
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1648
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1649
        // now initialize Object
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1650
        this.builtinObject = (ScriptFunction)initConstructor("Object");
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1651
        final ScriptObject ObjectPrototype = getObjectPrototype();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1652
        // Object.getPrototypeOf(Function.prototype) === Object.prototype
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1653
        anon.setProto(ObjectPrototype);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1654
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1655
        // Function valued properties of Function.prototype were not properly
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1656
        // initialized. Because, these were created before global.function and
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1657
        // global.object were not initialized.
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1658
        jdk.nashorn.internal.runtime.Property[] properties = getFunctionPrototype().getMap().getProperties();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1659
        for (final jdk.nashorn.internal.runtime.Property property : properties) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1660
            final Object key = property.getKey();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1661
            final Object value = builtinFunction.get(key);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1662
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1663
            if (value instanceof ScriptFunction && value != anon) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1664
                final ScriptFunction func = (ScriptFunction)value;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1665
                func.setProto(getFunctionPrototype());
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1666
                final ScriptObject prototype = ScriptFunction.getPrototype(func);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1667
                if (prototype != null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1668
                    prototype.setProto(ObjectPrototype);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1669
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1670
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1671
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1672
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1673
        // For function valued properties of Object and Object.prototype, make
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1674
        // sure prototype's proto chain ends with Object.prototype
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1675
        for (final jdk.nashorn.internal.runtime.Property property : builtinObject.getMap().getProperties()) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1676
            final Object key = property.getKey();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1677
            final Object value = builtinObject.get(key);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1678
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1679
            if (value instanceof ScriptFunction) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1680
                final ScriptFunction func = (ScriptFunction)value;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1681
                final ScriptObject prototype = ScriptFunction.getPrototype(func);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1682
                if (prototype != null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1683
                    prototype.setProto(ObjectPrototype);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1684
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1685
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1686
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1687
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1688
        properties = getObjectPrototype().getMap().getProperties();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1689
        for (final jdk.nashorn.internal.runtime.Property property : properties) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1690
            final Object key   = property.getKey();
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1691
            final Object value = ObjectPrototype.get(key);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1692
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1693
            if (key.equals("constructor")) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1694
                continue;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1695
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1696
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1697
            if (value instanceof ScriptFunction) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1698
                final ScriptFunction func = (ScriptFunction)value;
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1699
                final ScriptObject prototype = ScriptFunction.getPrototype(func);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1700
                if (prototype != null) {
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1701
                    prototype.setProto(ObjectPrototype);
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1702
                }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1703
            }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1704
        }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1705
    }
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1706
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1707
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1708
    private static MethodHandle findOwnMH(final String name, final Class<?> rtype, final Class<?>... types) {
16181
f6a125580f62 8006562: findOwnMH in nashorn "objects" package should be cleaned up
sundar
parents: 16151
diff changeset
  1709
        return MH.findStatic(MethodHandles.publicLookup(), Global.class, name, MH.type(rtype, types));
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1710
    }
16223
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16219
diff changeset
  1711
16258
0e25f785df4d 8008093: Make RegExp engine pluggable
hannesw
parents: 16256
diff changeset
  1712
    RegExpResult getLastRegExpResult() {
0e25f785df4d 8008093: Make RegExp engine pluggable
hannesw
parents: 16256
diff changeset
  1713
        return lastRegExpResult;
16223
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16219
diff changeset
  1714
    }
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16219
diff changeset
  1715
16258
0e25f785df4d 8008093: Make RegExp engine pluggable
hannesw
parents: 16256
diff changeset
  1716
    void setLastRegExpResult(final RegExpResult regExpResult) {
0e25f785df4d 8008093: Make RegExp engine pluggable
hannesw
parents: 16256
diff changeset
  1717
        this.lastRegExpResult = regExpResult;
16223
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16219
diff changeset
  1718
    }
dff592a332a4 8007718: Make static RegExp properties fully compatible to other engines
hannesw
parents: 16219
diff changeset
  1719
16147
e63b63819133 8005403: Open-source Nashorn
jlaskey
parents:
diff changeset
  1720
}