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