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