src/jdk/nashorn/internal/objects/Global.java

Fri, 17 Jan 2014 20:09:47 +0530

author
sundar
date
Fri, 17 Jan 2014 20:09:47 +0530
changeset 760
aef781b882c0
parent 690
752554d45a07
child 766
06ee95f094b4
permissions
-rw-r--r--

8032060: PropertyMap of Error objects is not stable
Reviewed-by: jlaskey, hannesw

jlaskey@3 1 /*
jlaskey@7 2 * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved.
jlaskey@3 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
jlaskey@3 4 *
jlaskey@3 5 * This code is free software; you can redistribute it and/or modify it
jlaskey@3 6 * under the terms of the GNU General Public License version 2 only, as
jlaskey@3 7 * published by the Free Software Foundation. Oracle designates this
jlaskey@3 8 * particular file as subject to the "Classpath" exception as provided
jlaskey@3 9 * by Oracle in the LICENSE file that accompanied this code.
jlaskey@3 10 *
jlaskey@3 11 * This code is distributed in the hope that it will be useful, but WITHOUT
jlaskey@3 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
jlaskey@3 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
jlaskey@3 14 * version 2 for more details (a copy is included in the LICENSE file that
jlaskey@3 15 * accompanied this code).
jlaskey@3 16 *
jlaskey@3 17 * You should have received a copy of the GNU General Public License version
jlaskey@3 18 * 2 along with this work; if not, write to the Free Software Foundation,
jlaskey@3 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
jlaskey@3 20 *
jlaskey@3 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
jlaskey@3 22 * or visit www.oracle.com if you need additional information or have any
jlaskey@3 23 * questions.
jlaskey@3 24 */
jlaskey@3 25
jlaskey@3 26 package jdk.nashorn.internal.objects;
jlaskey@3 27
sundar@372 28 import static jdk.nashorn.internal.lookup.Lookup.MH;
jlaskey@3 29 import static jdk.nashorn.internal.runtime.ECMAErrors.typeError;
jlaskey@3 30 import static jdk.nashorn.internal.runtime.ScriptRuntime.UNDEFINED;
jlaskey@3 31
jlaskey@3 32 import java.io.IOException;
jlaskey@3 33 import java.io.PrintWriter;
jlaskey@3 34 import java.lang.invoke.MethodHandle;
jlaskey@3 35 import java.lang.invoke.MethodHandles;
hannesw@566 36 import java.lang.ref.ReferenceQueue;
jlaskey@3 37 import java.lang.ref.SoftReference;
sundar@136 38 import java.lang.reflect.Field;
jlaskey@342 39 import java.util.Arrays;
jlaskey@3 40 import java.util.LinkedHashMap;
jlaskey@3 41 import java.util.List;
jlaskey@3 42 import java.util.Map;
sundar@489 43 import java.util.concurrent.Callable;
sundar@489 44 import java.util.concurrent.ConcurrentHashMap;
attila@90 45 import jdk.internal.dynalink.linker.GuardedInvocation;
attila@90 46 import jdk.internal.dynalink.linker.LinkRequest;
sundar@690 47 import jdk.nashorn.internal.lookup.Lookup;
jlaskey@3 48 import jdk.nashorn.internal.objects.annotations.Attribute;
jlaskey@3 49 import jdk.nashorn.internal.objects.annotations.Property;
jlaskey@3 50 import jdk.nashorn.internal.objects.annotations.ScriptClass;
jlaskey@3 51 import jdk.nashorn.internal.runtime.ConsString;
jlaskey@3 52 import jdk.nashorn.internal.runtime.Context;
jlaskey@3 53 import jdk.nashorn.internal.runtime.GlobalFunctions;
jlaskey@3 54 import jdk.nashorn.internal.runtime.GlobalObject;
jlaskey@3 55 import jdk.nashorn.internal.runtime.JSType;
jlaskey@3 56 import jdk.nashorn.internal.runtime.NativeJavaPackage;
attila@663 57 import jdk.nashorn.internal.runtime.PropertyDescriptor;
hannesw@380 58 import jdk.nashorn.internal.runtime.PropertyMap;
attila@663 59 import jdk.nashorn.internal.runtime.Scope;
sundar@118 60 import jdk.nashorn.internal.runtime.ScriptEnvironment;
jlaskey@3 61 import jdk.nashorn.internal.runtime.ScriptFunction;
jlaskey@3 62 import jdk.nashorn.internal.runtime.ScriptObject;
jlaskey@3 63 import jdk.nashorn.internal.runtime.ScriptRuntime;
jlaskey@3 64 import jdk.nashorn.internal.runtime.ScriptingFunctions;
jlaskey@3 65 import jdk.nashorn.internal.runtime.Source;
attila@663 66 import jdk.nashorn.internal.runtime.arrays.ArrayData;
sundar@459 67 import jdk.nashorn.internal.runtime.linker.Bootstrap;
jlaskey@3 68 import jdk.nashorn.internal.runtime.linker.InvokeByName;
attila@663 69 import jdk.nashorn.internal.runtime.regexp.RegExpResult;
jlaskey@131 70 import jdk.nashorn.internal.scripts.JO;
jlaskey@3 71
jlaskey@3 72 /**
jlaskey@3 73 * Representation of global scope.
jlaskey@3 74 */
jlaskey@3 75 @ScriptClass("Global")
jlaskey@3 76 public final class Global extends ScriptObject implements GlobalObject, Scope {
sundar@489 77 private final InvokeByName TO_STRING = new InvokeByName("toString", ScriptObject.class);
sundar@489 78 private final InvokeByName VALUE_OF = new InvokeByName("valueOf", ScriptObject.class);
jlaskey@3 79
jlaskey@3 80 /** ECMA 15.1.2.2 parseInt (string , radix) */
jlaskey@3 81 @Property(attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 82 public Object parseInt;
jlaskey@3 83
jlaskey@3 84 /** ECMA 15.1.2.3 parseFloat (string) */
jlaskey@3 85 @Property(attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 86 public Object parseFloat;
jlaskey@3 87
jlaskey@3 88 /** ECMA 15.1.2.4 isNaN (number) */
jlaskey@3 89 @Property(attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 90 public Object isNaN;
jlaskey@3 91
jlaskey@3 92 /** ECMA 15.1.2.5 isFinite (number) */
jlaskey@3 93 @Property(attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 94 public Object isFinite;
jlaskey@3 95
jlaskey@3 96 /** ECMA 15.1.3.3 encodeURI */
jlaskey@3 97 @Property(attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 98 public Object encodeURI;
jlaskey@3 99
jlaskey@3 100 /** ECMA 15.1.3.4 encodeURIComponent */
jlaskey@3 101 @Property(attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 102 public Object encodeURIComponent;
jlaskey@3 103
jlaskey@3 104 /** ECMA 15.1.3.1 decodeURI */
jlaskey@3 105 @Property(attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 106 public Object decodeURI;
jlaskey@3 107
jlaskey@3 108 /** ECMA 15.1.3.2 decodeURIComponent */
jlaskey@3 109 @Property(attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 110 public Object decodeURIComponent;
jlaskey@3 111
jlaskey@3 112 /** ECMA B.2.1 escape (string) */
jlaskey@3 113 @Property(attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 114 public Object escape;
jlaskey@3 115
jlaskey@3 116 /** ECMA B.2.2 unescape (string) */
jlaskey@3 117 @Property(attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 118 public Object unescape;
jlaskey@3 119
jlaskey@3 120 /** Nashorn extension: global.print */
jlaskey@3 121 @Property(attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 122 public Object print;
jlaskey@3 123
jlaskey@3 124 /** Nashorn extension: global.load */
jlaskey@3 125 @Property(attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 126 public Object load;
jlaskey@3 127
jlaskey@317 128 /** Nashorn extension: global.loadWithNewGlobal */
jlaskey@317 129 @Property(attributes = Attribute.NOT_ENUMERABLE)
jlaskey@317 130 public Object loadWithNewGlobal;
jlaskey@317 131
jlaskey@75 132 /** Nashorn extension: global.exit */
jlaskey@75 133 @Property(attributes = Attribute.NOT_ENUMERABLE)
jlaskey@75 134 public Object exit;
jlaskey@75 135
jlaskey@75 136 /** Nashorn extension: global.quit */
jlaskey@75 137 @Property(attributes = Attribute.NOT_ENUMERABLE)
jlaskey@75 138 public Object quit;
jlaskey@75 139
jlaskey@3 140 /** Value property NaN of the Global Object - ECMA 15.1.1.1 NaN */
jlaskey@3 141 @Property(attributes = Attribute.NON_ENUMERABLE_CONSTANT)
jlaskey@3 142 public final Object NaN = Double.NaN;
jlaskey@3 143
jlaskey@3 144 /** Value property Infinity of the Global Object - ECMA 15.1.1.2 Infinity */
jlaskey@3 145 @Property(attributes = Attribute.NON_ENUMERABLE_CONSTANT)
jlaskey@3 146 public final Object Infinity = Double.POSITIVE_INFINITY;
jlaskey@3 147
jlaskey@3 148 /** Value property Undefined of the Global Object - ECMA 15.1.1.3 Undefined */
jlaskey@3 149 @Property(attributes = Attribute.NON_ENUMERABLE_CONSTANT)
jlaskey@3 150 public final Object undefined = UNDEFINED;
jlaskey@3 151
jlaskey@3 152 /** ECMA 15.1.2.1 eval(x) */
jlaskey@3 153 @Property(attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 154 public Object eval;
jlaskey@3 155
jlaskey@3 156 /** ECMA 15.1.4.1 Object constructor. */
jlaskey@3 157 @Property(name = "Object", attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 158 public volatile Object object;
jlaskey@3 159
jlaskey@3 160 /** ECMA 15.1.4.2 Function constructor. */
jlaskey@3 161 @Property(name = "Function", attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 162 public volatile Object function;
jlaskey@3 163
jlaskey@3 164 /** ECMA 15.1.4.3 Array constructor. */
jlaskey@3 165 @Property(name = "Array", attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 166 public volatile Object array;
jlaskey@3 167
jlaskey@3 168 /** ECMA 15.1.4.4 String constructor */
jlaskey@3 169 @Property(name = "String", attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 170 public volatile Object string;
jlaskey@3 171
jlaskey@3 172 /** ECMA 15.1.4.5 Boolean constructor */
jlaskey@3 173 @Property(name = "Boolean", attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 174 public volatile Object _boolean;
jlaskey@3 175
jlaskey@3 176 /** ECMA 15.1.4.6 - Number constructor */
jlaskey@3 177 @Property(name = "Number", attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 178 public volatile Object number;
jlaskey@3 179
jlaskey@3 180 /** ECMA 15.1.4.7 Date constructor */
jlaskey@3 181 @Property(name = "Date", attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 182 public volatile Object date;
jlaskey@3 183
jlaskey@3 184 /** ECMA 15.1.4.8 RegExp constructor */
jlaskey@3 185 @Property(name = "RegExp", attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 186 public volatile Object regexp;
jlaskey@3 187
jlaskey@3 188 /** ECMA 15.12 - The JSON object */
jlaskey@3 189 @Property(name = "JSON", attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 190 public volatile Object json;
jlaskey@3 191
jlaskey@3 192 /** Nashorn extension: global.JSAdapter */
jlaskey@3 193 @Property(name = "JSAdapter", attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 194 public volatile Object jsadapter;
jlaskey@3 195
jlaskey@3 196 /** ECMA 15.8 - The Math object */
jlaskey@3 197 @Property(name = "Math", attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 198 public volatile Object math;
jlaskey@3 199
jlaskey@3 200 /** Error object */
jlaskey@3 201 @Property(name = "Error", attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 202 public volatile Object error;
jlaskey@3 203
jlaskey@3 204 /** EvalError object */
jlaskey@3 205 @Property(name = "EvalError", attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 206 public volatile Object evalError;
jlaskey@3 207
jlaskey@3 208 /** RangeError object */
jlaskey@3 209 @Property(name = "RangeError", attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 210 public volatile Object rangeError;
jlaskey@3 211
jlaskey@3 212 /** ReferenceError object */
jlaskey@3 213 @Property(name = "ReferenceError", attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 214 public volatile Object referenceError;
jlaskey@3 215
jlaskey@3 216 /** SyntaxError object */
jlaskey@3 217 @Property(name = "SyntaxError", attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 218 public volatile Object syntaxError;
jlaskey@3 219
jlaskey@3 220 /** TypeError object */
jlaskey@3 221 @Property(name = "TypeError", attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 222 public volatile Object typeError;
jlaskey@3 223
jlaskey@3 224 /** URIError object */
jlaskey@3 225 @Property(name = "URIError", attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 226 public volatile Object uriError;
jlaskey@3 227
jlaskey@3 228 /** ArrayBuffer object */
jlaskey@3 229 @Property(name = "ArrayBuffer", attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 230 public volatile Object arrayBuffer;
jlaskey@3 231
jlaskey@3 232 /** TypedArray (int8) */
jlaskey@3 233 @Property(name = "Int8Array", attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 234 public volatile Object int8Array;
jlaskey@3 235
jlaskey@3 236 /** TypedArray (uint8) */
jlaskey@3 237 @Property(name = "Uint8Array", attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 238 public volatile Object uint8Array;
jlaskey@3 239
jlaskey@3 240 /** TypedArray (uint8) - Clamped */
jlaskey@3 241 @Property(name = "Uint8ClampedArray", attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 242 public volatile Object uint8ClampedArray;
jlaskey@3 243
jlaskey@3 244 /** TypedArray (int16) */
jlaskey@3 245 @Property(name = "Int16Array", attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 246 public volatile Object int16Array;
jlaskey@3 247
jlaskey@3 248 /** TypedArray (uint16) */
jlaskey@3 249 @Property(name = "Uint16Array", attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 250 public volatile Object uint16Array;
jlaskey@3 251
jlaskey@3 252 /** TypedArray (int32) */
jlaskey@3 253 @Property(name = "Int32Array", attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 254 public volatile Object int32Array;
jlaskey@3 255
jlaskey@3 256 /** TypedArray (uint32) */
jlaskey@3 257 @Property(name = "Uint32Array", attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 258 public volatile Object uint32Array;
jlaskey@3 259
jlaskey@3 260 /** TypedArray (float32) */
jlaskey@3 261 @Property(name = "Float32Array", attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 262 public volatile Object float32Array;
jlaskey@3 263
jlaskey@3 264 /** TypedArray (float64) */
jlaskey@3 265 @Property(name = "Float64Array", attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 266 public volatile Object float64Array;
jlaskey@3 267
jlaskey@3 268 /** Nashorn extension: Java access - global.Packages */
jlaskey@3 269 @Property(name = "Packages", attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 270 public volatile Object packages;
jlaskey@3 271
sundar@146 272 /** Nashorn extension: Java access - global.com */
sundar@146 273 @Property(attributes = Attribute.NOT_ENUMERABLE)
sundar@146 274 public volatile Object com;
sundar@146 275
sundar@146 276 /** Nashorn extension: Java access - global.edu */
sundar@146 277 @Property(attributes = Attribute.NOT_ENUMERABLE)
sundar@146 278 public volatile Object edu;
sundar@146 279
jlaskey@3 280 /** Nashorn extension: Java access - global.java */
jlaskey@3 281 @Property(attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 282 public volatile Object java;
jlaskey@3 283
sundar@146 284 /** Nashorn extension: Java access - global.javafx */
sundar@146 285 @Property(attributes = Attribute.NOT_ENUMERABLE)
sundar@146 286 public volatile Object javafx;
sundar@146 287
jlaskey@3 288 /** Nashorn extension: Java access - global.javax */
jlaskey@3 289 @Property(attributes = Attribute.NOT_ENUMERABLE)
sundar@146 290 public volatile Object javax;
sundar@146 291
sundar@146 292 /** Nashorn extension: Java access - global.org */
sundar@146 293 @Property(attributes = Attribute.NOT_ENUMERABLE)
sundar@146 294 public volatile Object org;
jlaskey@3 295
jlaskey@3 296 /** Nashorn extension: Java access - global.javaImporter */
jlaskey@3 297 @Property(name = "JavaImporter", attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 298 public volatile Object javaImporter;
jlaskey@3 299
jlaskey@3 300 /** Nashorn extension: global.Java Object constructor. */
jlaskey@3 301 @Property(name = "Java", attributes = Attribute.NOT_ENUMERABLE)
jlaskey@3 302 public volatile Object javaApi;
jlaskey@3 303
jlaskey@3 304 /** Nashorn extension: current script's file name */
jlaskey@3 305 @Property(name = "__FILE__", attributes = Attribute.NON_ENUMERABLE_CONSTANT)
jlaskey@3 306 public Object __FILE__;
jlaskey@3 307
jlaskey@3 308 /** Nashorn extension: current script's directory */
jlaskey@3 309 @Property(name = "__DIR__", attributes = Attribute.NON_ENUMERABLE_CONSTANT)
jlaskey@3 310 public Object __DIR__;
jlaskey@3 311
jlaskey@3 312 /** Nashorn extension: current source line number being executed */
jlaskey@3 313 @Property(name = "__LINE__", attributes = Attribute.NON_ENUMERABLE_CONSTANT)
jlaskey@3 314 public Object __LINE__;
jlaskey@3 315
jlaskey@3 316 /** Used as Date.prototype's default value */
jlaskey@3 317 public NativeDate DEFAULT_DATE;
jlaskey@3 318
jlaskey@3 319 /** Used as RegExp.prototype's default value */
jlaskey@3 320 public NativeRegExp DEFAULT_REGEXP;
jlaskey@3 321
jlaskey@3 322 /*
jlaskey@3 323 * Built-in constructor objects: Even if user changes dynamic values of
jlaskey@3 324 * "Object", "Array" etc., we still want to keep original values of these
jlaskey@3 325 * constructors here. For example, we need to be able to create array,
jlaskey@3 326 * regexp literals even after user overwrites global "Array" or "RegExp"
jlaskey@3 327 * constructor - see also ECMA 262 spec. Annex D.
jlaskey@3 328 */
jlaskey@3 329 private ScriptFunction builtinFunction;
jlaskey@3 330 private ScriptFunction builtinObject;
jlaskey@3 331 private ScriptFunction builtinArray;
jlaskey@3 332 private ScriptFunction builtinBoolean;
jlaskey@3 333 private ScriptFunction builtinDate;
jlaskey@3 334 private ScriptObject builtinJSON;
jlaskey@3 335 private ScriptFunction builtinJSAdapter;
jlaskey@3 336 private ScriptObject builtinMath;
jlaskey@3 337 private ScriptFunction builtinNumber;
jlaskey@3 338 private ScriptFunction builtinRegExp;
jlaskey@3 339 private ScriptFunction builtinString;
jlaskey@3 340 private ScriptFunction builtinError;
jlaskey@3 341 private ScriptFunction builtinEval;
jlaskey@3 342 private ScriptFunction builtinEvalError;
jlaskey@3 343 private ScriptFunction builtinRangeError;
jlaskey@3 344 private ScriptFunction builtinReferenceError;
jlaskey@3 345 private ScriptFunction builtinSyntaxError;
jlaskey@3 346 private ScriptFunction builtinTypeError;
jlaskey@3 347 private ScriptFunction builtinURIError;
jlaskey@3 348 private ScriptObject builtinPackages;
sundar@146 349 private ScriptObject builtinCom;
sundar@146 350 private ScriptObject builtinEdu;
jlaskey@3 351 private ScriptObject builtinJava;
sundar@146 352 private ScriptObject builtinJavafx;
jlaskey@3 353 private ScriptObject builtinJavax;
sundar@146 354 private ScriptObject builtinOrg;
jlaskey@3 355 private ScriptObject builtinJavaImporter;
jlaskey@3 356 private ScriptObject builtinJavaApi;
jlaskey@3 357 private ScriptObject builtinArrayBuffer;
jlaskey@3 358 private ScriptObject builtinInt8Array;
jlaskey@3 359 private ScriptObject builtinUint8Array;
jlaskey@3 360 private ScriptObject builtinUint8ClampedArray;
jlaskey@3 361 private ScriptObject builtinInt16Array;
jlaskey@3 362 private ScriptObject builtinUint16Array;
jlaskey@3 363 private ScriptObject builtinInt32Array;
jlaskey@3 364 private ScriptObject builtinUint32Array;
jlaskey@3 365 private ScriptObject builtinFloat32Array;
jlaskey@3 366 private ScriptObject builtinFloat64Array;
jlaskey@3 367
sundar@690 368 /*
sundar@690 369 * ECMA section 13.2.3 The [[ThrowTypeError]] Function Object
sundar@690 370 */
sundar@690 371 private ScriptFunction typeErrorThrower;
sundar@690 372
sundar@414 373 private PropertyMap accessorPropertyDescriptorMap;
sundar@414 374 private PropertyMap arrayBufferViewMap;
sundar@414 375 private PropertyMap dataPropertyDescriptorMap;
sundar@414 376 private PropertyMap genericPropertyDescriptorMap;
sundar@414 377 private PropertyMap nativeArgumentsMap;
sundar@414 378 private PropertyMap nativeArrayMap;
sundar@414 379 private PropertyMap nativeArrayBufferMap;
sundar@414 380 private PropertyMap nativeBooleanMap;
sundar@414 381 private PropertyMap nativeDateMap;
sundar@414 382 private PropertyMap nativeErrorMap;
sundar@414 383 private PropertyMap nativeEvalErrorMap;
sundar@414 384 private PropertyMap nativeJSAdapterMap;
sundar@414 385 private PropertyMap nativeJavaImporterMap;
sundar@414 386 private PropertyMap nativeNumberMap;
sundar@414 387 private PropertyMap nativeRangeErrorMap;
sundar@414 388 private PropertyMap nativeReferenceErrorMap;
sundar@414 389 private PropertyMap nativeRegExpMap;
sundar@414 390 private PropertyMap nativeRegExpExecResultMap;
sundar@414 391 private PropertyMap nativeStrictArgumentsMap;
sundar@414 392 private PropertyMap nativeStringMap;
sundar@414 393 private PropertyMap nativeSyntaxErrorMap;
sundar@414 394 private PropertyMap nativeTypeErrorMap;
sundar@414 395 private PropertyMap nativeURIErrorMap;
sundar@414 396 private PropertyMap prototypeObjectMap;
sundar@414 397 private PropertyMap objectMap;
sundar@414 398 private PropertyMap functionMap;
sundar@418 399 private PropertyMap anonymousFunctionMap;
sundar@414 400 private PropertyMap strictFunctionMap;
sundar@414 401 private PropertyMap boundFunctionMap;
sundar@414 402
jlaskey@3 403 // Flag to indicate that a split method issued a return statement
jlaskey@3 404 private int splitState = -1;
jlaskey@3 405
jlaskey@3 406 // class cache
jlaskey@3 407 private ClassCache classCache;
jlaskey@3 408
hannesw@79 409 // Used to store the last RegExp result to support deprecated RegExp constructor properties
hannesw@114 410 private RegExpResult lastRegExpResult;
hannesw@79 411
jlaskey@317 412 private static final MethodHandle EVAL = findOwnMH("eval", Object.class, Object.class, Object.class);
jlaskey@317 413 private static final MethodHandle PRINT = findOwnMH("print", Object.class, Object.class, Object[].class);
jlaskey@317 414 private static final MethodHandle PRINTLN = findOwnMH("println", Object.class, Object.class, Object[].class);
jlaskey@317 415 private static final MethodHandle LOAD = findOwnMH("load", Object.class, Object.class, Object.class);
jlaskey@342 416 private static final MethodHandle LOADWITHNEWGLOBAL = findOwnMH("loadWithNewGlobal", Object.class, Object.class, Object[].class);
jlaskey@317 417 private static final MethodHandle EXIT = findOwnMH("exit", Object.class, Object.class, Object.class);
jlaskey@3 418
hannesw@380 419 // initialized by nasgen
hannesw@380 420 private static PropertyMap $nasgenmap$;
hannesw@380 421
sundar@541 422 // context to which this global belongs to
sundar@541 423 private final Context context;
sundar@541 424
sundar@541 425 @Override
sundar@541 426 protected Context getContext() {
sundar@541 427 return context;
sundar@541 428 }
sundar@541 429
sundar@456 430 // performs initialization checks for Global constructor and returns the
sundar@456 431 // PropertyMap, if everything is fine.
sundar@456 432 private static PropertyMap checkAndGetMap(final Context context) {
sundar@456 433 // security check first
sundar@456 434 final SecurityManager sm = System.getSecurityManager();
sundar@456 435 if (sm != null) {
sundar@492 436 sm.checkPermission(new RuntimePermission(Context.NASHORN_CREATE_GLOBAL));
sundar@456 437 }
sundar@456 438
sundar@456 439 // null check on context
sundar@456 440 context.getClass();
sundar@456 441
sundar@456 442 /*
sundar@456 443 * Duplicate global's map and use it. This way the initial Map filled
sundar@456 444 * by nasgen (referenced from static field in this class) is retained
sundar@456 445 * 'as is' (as that one is process wide singleton.
sundar@456 446 */
sundar@456 447 return $nasgenmap$.duplicate();
sundar@456 448 }
sundar@456 449
jlaskey@3 450 /**
jlaskey@3 451 * Constructor
lagergren@89 452 *
lagergren@89 453 * @param context the context
jlaskey@3 454 */
sundar@82 455 public Global(final Context context) {
sundar@456 456 super(checkAndGetMap(context));
sundar@541 457 this.context = context;
sundar@418 458 this.setIsScope();
jlaskey@3 459
sundar@118 460 final int cacheSize = context.getEnv()._class_cache_size;
jlaskey@3 461 if (cacheSize > 0) {
jlaskey@3 462 classCache = new ClassCache(cacheSize);
jlaskey@3 463 }
jlaskey@3 464 }
jlaskey@3 465
jlaskey@3 466 /**
sundar@82 467 * Script access to "current" Global instance
jlaskey@3 468 *
jlaskey@3 469 * @return the global singleton
jlaskey@3 470 */
jlaskey@3 471 public static Global instance() {
sundar@82 472 ScriptObject global = Context.getGlobal();
sundar@82 473 if (! (global instanceof Global)) {
sundar@82 474 throw new IllegalStateException("no current global instance");
sundar@82 475 }
sundar@82 476 return (Global)global;
jlaskey@3 477 }
jlaskey@3 478
jlaskey@3 479 /**
sundar@118 480 * Script access to {@link ScriptEnvironment}
sundar@118 481 *
sundar@118 482 * @return the script environment
sundar@118 483 */
sundar@118 484 static ScriptEnvironment getEnv() {
sundar@414 485 return instance().getContext().getEnv();
sundar@118 486 }
sundar@118 487
sundar@118 488 /**
jlaskey@3 489 * Script access to {@link Context}
jlaskey@3 490 *
jlaskey@3 491 * @return the context
jlaskey@3 492 */
sundar@41 493 static Context getThisContext() {
sundar@414 494 return instance().getContext();
jlaskey@3 495 }
jlaskey@3 496
jlaskey@3 497 // GlobalObject interface implementation
jlaskey@3 498
jlaskey@3 499 @Override
lagergren@610 500 public boolean isOfContext(final Context ctxt) {
lagergren@610 501 return this.context == ctxt;
sundar@541 502 }
sundar@541 503
sundar@541 504 @Override
sundar@541 505 public boolean isStrictContext() {
sundar@541 506 return context.getEnv()._strict;
sundar@541 507 }
sundar@541 508
sundar@541 509 @Override
jlaskey@3 510 public void initBuiltinObjects() {
jlaskey@3 511 if (this.builtinObject != null) {
jlaskey@3 512 // already initialized, just return
jlaskey@3 513 return;
jlaskey@3 514 }
jlaskey@3 515
sundar@41 516 init();
jlaskey@3 517 }
jlaskey@3 518
jlaskey@3 519 @Override
jlaskey@3 520 public ScriptFunction newScriptFunction(final String name, final MethodHandle handle, final ScriptObject scope, final boolean strict) {
attila@84 521 return new ScriptFunctionImpl(name, handle, scope, null, strict, false, true);
jlaskey@3 522 }
jlaskey@3 523
jlaskey@3 524 @Override
jlaskey@3 525 public Object wrapAsObject(final Object obj) {
jlaskey@3 526 if (obj instanceof Boolean) {
sundar@414 527 return new NativeBoolean((Boolean)obj, this);
jlaskey@3 528 } else if (obj instanceof Number) {
sundar@414 529 return new NativeNumber(((Number)obj).doubleValue(), this);
jlaskey@3 530 } else if (obj instanceof String || obj instanceof ConsString) {
sundar@414 531 return new NativeString((CharSequence)obj, this);
jlaskey@3 532 } else if (obj instanceof Object[]) { // extension
jlaskey@3 533 return new NativeArray((Object[])obj);
jlaskey@3 534 } else if (obj instanceof double[]) { // extension
jlaskey@3 535 return new NativeArray((double[])obj);
jlaskey@3 536 } else if (obj instanceof long[]) {
jlaskey@3 537 return new NativeArray((long[])obj);
jlaskey@3 538 } else if (obj instanceof int[]) {
jlaskey@3 539 return new NativeArray((int[])obj);
jlaskey@3 540 } else {
jlaskey@3 541 // FIXME: more special cases? Map? List?
jlaskey@3 542 return obj;
jlaskey@3 543 }
jlaskey@3 544 }
jlaskey@3 545
jlaskey@3 546 @Override
hannesw@51 547 public GuardedInvocation primitiveLookup(final LinkRequest request, final Object self) {
hannesw@51 548 if (self instanceof String || self instanceof ConsString) {
hannesw@51 549 return NativeString.lookupPrimitive(request, self);
hannesw@51 550 } else if (self instanceof Number) {
hannesw@51 551 return NativeNumber.lookupPrimitive(request, self);
hannesw@51 552 } else if (self instanceof Boolean) {
hannesw@51 553 return NativeBoolean.lookupPrimitive(request, self);
hannesw@51 554 }
hannesw@51 555 throw new IllegalArgumentException("Unsupported primitive: " + self);
jlaskey@3 556 }
jlaskey@3 557
jlaskey@3 558 @Override
jlaskey@3 559 public ScriptObject newObject() {
sundar@414 560 return new JO(getObjectPrototype(), getObjectMap());
jlaskey@3 561 }
jlaskey@3 562
jlaskey@3 563 @Override
jlaskey@3 564 public Object getDefaultValue(final ScriptObject sobj, final Class<?> typeHint) {
jlaskey@3 565 // When the [[DefaultValue]] internal method of O is called with no hint,
jlaskey@3 566 // then it behaves as if the hint were Number, unless O is a Date object
jlaskey@3 567 // in which case it behaves as if the hint were String.
jlaskey@3 568 Class<?> hint = typeHint;
jlaskey@3 569 if (hint == null) {
jlaskey@3 570 hint = Number.class;
jlaskey@3 571 }
jlaskey@3 572
jlaskey@3 573 try {
jlaskey@3 574 if (hint == String.class) {
jlaskey@3 575
jlaskey@3 576 final Object toString = TO_STRING.getGetter().invokeExact(sobj);
sundar@459 577
sundar@459 578 if (Bootstrap.isCallable(toString)) {
jlaskey@3 579 final Object value = TO_STRING.getInvoker().invokeExact(toString, sobj);
jlaskey@3 580 if (JSType.isPrimitive(value)) {
jlaskey@3 581 return value;
jlaskey@3 582 }
jlaskey@3 583 }
jlaskey@3 584
jlaskey@3 585 final Object valueOf = VALUE_OF.getGetter().invokeExact(sobj);
sundar@459 586 if (Bootstrap.isCallable(valueOf)) {
jlaskey@3 587 final Object value = VALUE_OF.getInvoker().invokeExact(valueOf, sobj);
jlaskey@3 588 if (JSType.isPrimitive(value)) {
jlaskey@3 589 return value;
jlaskey@3 590 }
jlaskey@3 591 }
lagergren@112 592 throw typeError(this, "cannot.get.default.string");
jlaskey@3 593 }
jlaskey@3 594
jlaskey@3 595 if (hint == Number.class) {
jlaskey@3 596 final Object valueOf = VALUE_OF.getGetter().invokeExact(sobj);
sundar@459 597 if (Bootstrap.isCallable(valueOf)) {
jlaskey@3 598 final Object value = VALUE_OF.getInvoker().invokeExact(valueOf, sobj);
jlaskey@3 599 if (JSType.isPrimitive(value)) {
jlaskey@3 600 return value;
jlaskey@3 601 }
jlaskey@3 602 }
jlaskey@3 603
jlaskey@3 604 final Object toString = TO_STRING.getGetter().invokeExact(sobj);
sundar@459 605 if (Bootstrap.isCallable(toString)) {
jlaskey@3 606 final Object value = TO_STRING.getInvoker().invokeExact(toString, sobj);
jlaskey@3 607 if (JSType.isPrimitive(value)) {
jlaskey@3 608 return value;
jlaskey@3 609 }
jlaskey@3 610 }
jlaskey@3 611
lagergren@112 612 throw typeError(this, "cannot.get.default.number");
jlaskey@3 613 }
jlaskey@3 614 } catch (final RuntimeException | Error e) {
jlaskey@3 615 throw e;
jlaskey@3 616 } catch (final Throwable t) {
jlaskey@3 617 throw new RuntimeException(t);
jlaskey@3 618 }
jlaskey@3 619
jlaskey@3 620 return UNDEFINED;
jlaskey@3 621 }
jlaskey@3 622
jlaskey@3 623 @Override
jlaskey@3 624 public boolean isError(final ScriptObject sobj) {
jlaskey@3 625 final ScriptObject errorProto = getErrorPrototype();
jlaskey@3 626 ScriptObject proto = sobj.getProto();
jlaskey@3 627 while (proto != null) {
jlaskey@3 628 if (proto == errorProto) {
jlaskey@3 629 return true;
jlaskey@3 630 }
jlaskey@3 631 proto = proto.getProto();
jlaskey@3 632 }
jlaskey@3 633 return false;
jlaskey@3 634 }
jlaskey@3 635
jlaskey@3 636 @Override
jlaskey@3 637 public ScriptObject newError(final String msg) {
sundar@414 638 return new NativeError(msg, this);
jlaskey@3 639 }
jlaskey@3 640
jlaskey@3 641 @Override
jlaskey@3 642 public ScriptObject newEvalError(final String msg) {
sundar@414 643 return new NativeEvalError(msg, this);
jlaskey@3 644 }
jlaskey@3 645
jlaskey@3 646 @Override
jlaskey@3 647 public ScriptObject newRangeError(final String msg) {
sundar@414 648 return new NativeRangeError(msg, this);
jlaskey@3 649 }
jlaskey@3 650
jlaskey@3 651 @Override
jlaskey@3 652 public ScriptObject newReferenceError(final String msg) {
sundar@414 653 return new NativeReferenceError(msg, this);
jlaskey@3 654 }
jlaskey@3 655
jlaskey@3 656 @Override
jlaskey@3 657 public ScriptObject newSyntaxError(final String msg) {
sundar@414 658 return new NativeSyntaxError(msg, this);
jlaskey@3 659 }
jlaskey@3 660
jlaskey@3 661 @Override
jlaskey@3 662 public ScriptObject newTypeError(final String msg) {
sundar@414 663 return new NativeTypeError(msg, this);
jlaskey@3 664 }
jlaskey@3 665
jlaskey@3 666 @Override
jlaskey@3 667 public ScriptObject newURIError(final String msg) {
sundar@414 668 return new NativeURIError(msg, this);
jlaskey@3 669 }
jlaskey@3 670
jlaskey@3 671 @Override
jlaskey@3 672 public PropertyDescriptor newGenericDescriptor(final boolean configurable, final boolean enumerable) {
sundar@414 673 return new GenericPropertyDescriptor(configurable, enumerable, this);
jlaskey@3 674 }
jlaskey@3 675
jlaskey@3 676 @Override
jlaskey@3 677 public PropertyDescriptor newDataDescriptor(final Object value, final boolean configurable, final boolean enumerable, final boolean writable) {
sundar@414 678 return new DataPropertyDescriptor(configurable, enumerable, writable, value, this);
jlaskey@3 679 }
jlaskey@3 680
jlaskey@3 681 @Override
jlaskey@3 682 public PropertyDescriptor newAccessorDescriptor(final Object get, final Object set, final boolean configurable, final boolean enumerable) {
sundar@414 683 final AccessorPropertyDescriptor desc = new AccessorPropertyDescriptor(configurable, enumerable, get == null ? UNDEFINED : get, set == null ? UNDEFINED : set, this);
jlaskey@3 684
jlaskey@3 685 if (get == null) {
sundar@344 686 desc.delete(PropertyDescriptor.GET, false);
jlaskey@3 687 }
jlaskey@3 688
jlaskey@3 689 if (set == null) {
sundar@344 690 desc.delete(PropertyDescriptor.SET, false);
jlaskey@3 691 }
jlaskey@3 692
jlaskey@3 693 return desc;
jlaskey@3 694 }
jlaskey@3 695
jlaskey@3 696
jlaskey@3 697 /**
jlaskey@3 698 * Cache for compiled script classes.
jlaskey@3 699 */
jlaskey@3 700 @SuppressWarnings("serial")
hannesw@566 701 private static class ClassCache extends LinkedHashMap<Source, ClassReference> {
jlaskey@3 702 private final int size;
hannesw@566 703 private final ReferenceQueue<Class<?>> queue;
jlaskey@3 704
jlaskey@3 705 ClassCache(int size) {
jlaskey@3 706 super(size, 0.75f, true);
jlaskey@3 707 this.size = size;
hannesw@566 708 this.queue = new ReferenceQueue<>();
hannesw@566 709 }
hannesw@566 710
hannesw@566 711 void cache(final Source source, final Class<?> clazz) {
hannesw@566 712 put(source, new ClassReference(clazz, queue, source));
jlaskey@3 713 }
jlaskey@3 714
jlaskey@3 715 @Override
hannesw@566 716 protected boolean removeEldestEntry(final Map.Entry<Source, ClassReference> eldest) {
hannesw@566 717 return size() > size;
hannesw@566 718 }
hannesw@566 719
hannesw@566 720 @Override
hannesw@566 721 public ClassReference get(Object key) {
hannesw@566 722 for (ClassReference ref; (ref = (ClassReference)queue.poll()) != null; ) {
hannesw@566 723 remove(ref.source);
hannesw@566 724 }
hannesw@566 725 return super.get(key);
hannesw@566 726 }
hannesw@566 727
hannesw@566 728 }
hannesw@566 729
hannesw@566 730 private static class ClassReference extends SoftReference<Class<?>> {
hannesw@566 731 private final Source source;
hannesw@566 732
hannesw@566 733 ClassReference(final Class<?> clazz, final ReferenceQueue<Class<?>> queue, final Source source) {
hannesw@566 734 super(clazz, queue);
hannesw@566 735 this.source = source;
jlaskey@3 736 }
jlaskey@3 737 }
jlaskey@3 738
jlaskey@3 739 // Class cache management
jlaskey@3 740 @Override
jlaskey@3 741 public Class<?> findCachedClass(final Source source) {
jlaskey@3 742 assert classCache != null : "Class cache used without being initialized";
hannesw@566 743 ClassReference ref = classCache.get(source);
hannesw@566 744 return ref != null ? ref.get() : null;
jlaskey@3 745 }
jlaskey@3 746
jlaskey@3 747 @Override
jlaskey@3 748 public void cacheClass(final Source source, final Class<?> clazz) {
jlaskey@3 749 assert classCache != null : "Class cache used without being initialized";
hannesw@566 750 classCache.cache(source, clazz);
jlaskey@3 751 }
jlaskey@3 752
sundar@489 753 private static <T> T getLazilyCreatedValue(final Object key, final Callable<T> creator, final Map<Object, T> map) {
sundar@489 754 final T obj = map.get(key);
sundar@489 755 if (obj != null) {
sundar@489 756 return obj;
sundar@489 757 }
sundar@489 758
sundar@489 759 try {
sundar@489 760 final T newObj = creator.call();
sundar@489 761 final T existingObj = map.putIfAbsent(key, newObj);
sundar@489 762 return existingObj != null ? existingObj : newObj;
sundar@489 763 } catch (final Exception exp) {
sundar@489 764 throw new RuntimeException(exp);
sundar@489 765 }
sundar@489 766 }
sundar@489 767
sundar@489 768 private final Map<Object, InvokeByName> namedInvokers = new ConcurrentHashMap<>();
sundar@489 769
sundar@489 770 @Override
sundar@489 771 public InvokeByName getInvokeByName(final Object key, final Callable<InvokeByName> creator) {
sundar@489 772 return getLazilyCreatedValue(key, creator, namedInvokers);
sundar@489 773 }
sundar@489 774
sundar@489 775 private final Map<Object, MethodHandle> dynamicInvokers = new ConcurrentHashMap<>();
sundar@489 776
sundar@489 777 @Override
sundar@489 778 public MethodHandle getDynamicInvoker(final Object key, final Callable<MethodHandle> creator) {
sundar@489 779 return getLazilyCreatedValue(key, creator, dynamicInvokers);
sundar@489 780 }
sundar@489 781
jlaskey@3 782 /**
jlaskey@3 783 * This is the eval used when 'indirect' eval call is made.
jlaskey@3 784 *
jlaskey@3 785 * var global = this;
jlaskey@3 786 * global.eval("print('hello')");
jlaskey@3 787 *
jlaskey@3 788 * @param self eval scope
jlaskey@3 789 * @param str eval string
jlaskey@3 790 *
jlaskey@3 791 * @return the result of eval
jlaskey@3 792 */
jlaskey@3 793 public static Object eval(final Object self, final Object str) {
jlaskey@3 794 return directEval(self, str, UNDEFINED, UNDEFINED, UNDEFINED);
jlaskey@3 795 }
jlaskey@3 796
jlaskey@3 797 /**
jlaskey@3 798 * Direct eval
jlaskey@3 799 *
jlaskey@3 800 * @param self The scope of eval passed as 'self'
jlaskey@3 801 * @param str Evaluated code
jlaskey@3 802 * @param callThis "this" to be passed to the evaluated code
jlaskey@3 803 * @param location location of the eval call
jlaskey@3 804 * @param strict is eval called a strict mode code?
jlaskey@3 805 *
jlaskey@3 806 * @return the return value of the eval
jlaskey@3 807 *
jlaskey@3 808 * This is directly invoked from generated when eval(code) is called in user code
jlaskey@3 809 */
jlaskey@3 810 public static Object directEval(final Object self, final Object str, final Object callThis, final Object location, final Object strict) {
jlaskey@3 811 if (!(str instanceof String || str instanceof ConsString)) {
jlaskey@3 812 return str;
jlaskey@3 813 }
sundar@41 814 final Global global = Global.instance();
sundar@41 815 final ScriptObject scope = (self instanceof ScriptObject) ? (ScriptObject)self : global;
jlaskey@3 816
sundar@414 817 return global.getContext().eval(scope, str.toString(), callThis, location, Boolean.TRUE.equals(strict));
jlaskey@3 818 }
jlaskey@3 819
jlaskey@3 820 /**
jlaskey@3 821 * Global print implementation - Nashorn extension
jlaskey@3 822 *
jlaskey@3 823 * @param self scope
jlaskey@3 824 * @param objects arguments to print
jlaskey@3 825 *
jlaskey@3 826 * @return result of print (undefined)
jlaskey@3 827 */
jlaskey@3 828 public static Object print(final Object self, final Object... objects) {
jlaskey@3 829 return printImpl(false, objects);
jlaskey@3 830 }
jlaskey@3 831
jlaskey@3 832 /**
jlaskey@3 833 * Global println implementation - Nashorn extension
jlaskey@3 834 *
jlaskey@3 835 * @param self scope
jlaskey@3 836 * @param objects arguments to print
jlaskey@3 837 *
jlaskey@3 838 * @return result of println (undefined)
jlaskey@3 839 */
jlaskey@3 840 public static Object println(final Object self, final Object... objects) {
jlaskey@3 841 return printImpl(true, objects);
jlaskey@3 842 }
jlaskey@3 843
jlaskey@3 844 /**
jlaskey@3 845 * Global load implementation - Nashorn extension
jlaskey@3 846 *
jlaskey@3 847 * @param self scope
jlaskey@3 848 * @param source source to load
jlaskey@3 849 *
jlaskey@3 850 * @return result of load (undefined)
jlaskey@3 851 *
jlaskey@3 852 * @throws IOException if source could not be read
jlaskey@3 853 */
jlaskey@3 854 public static Object load(final Object self, final Object source) throws IOException {
sundar@41 855 final Global global = Global.instance();
sundar@41 856 final ScriptObject scope = (self instanceof ScriptObject) ? (ScriptObject)self : global;
sundar@414 857 return global.getContext().load(scope, source);
jlaskey@3 858 }
jlaskey@3 859
jlaskey@75 860 /**
jlaskey@317 861 * Global loadWithNewGlobal implementation - Nashorn extension
jlaskey@317 862 *
jlaskey@342 863 * @param self scope
jlaskey@342 864 * @param args from plus (optional) arguments to be passed to the loaded script
jlaskey@317 865 *
jlaskey@342 866 * @return result of load (may be undefined)
jlaskey@317 867 *
jlaskey@317 868 * @throws IOException if source could not be read
jlaskey@317 869 */
jlaskey@342 870 public static Object loadWithNewGlobal(final Object self, final Object...args) throws IOException {
jlaskey@317 871 final Global global = Global.instance();
jlaskey@342 872 final int length = args.length;
jlaskey@342 873 final boolean hasArgs = 0 < length;
jlaskey@342 874 final Object from = hasArgs ? args[0] : UNDEFINED;
jlaskey@342 875 final Object[] arguments = hasArgs ? Arrays.copyOfRange(args, 1, length) : args;
jlaskey@342 876
sundar@414 877 return global.getContext().loadWithNewGlobal(from, arguments);
jlaskey@317 878 }
jlaskey@317 879
jlaskey@317 880 /**
jlaskey@75 881 * Global exit and quit implementation - Nashorn extension: perform a {@code System.exit} call from the script
jlaskey@75 882 *
jlaskey@75 883 * @param self self reference
jlaskey@75 884 * @param code exit code
jlaskey@75 885 *
jlaskey@75 886 * @return undefined (will never be reacheD)
jlaskey@75 887 */
jlaskey@75 888 public static Object exit(final Object self, final Object code) {
jlaskey@75 889 System.exit(JSType.toInt32(code));
jlaskey@75 890 return UNDEFINED;
jlaskey@75 891 }
jlaskey@75 892
sundar@414 893 // builtin prototype accessors
jlaskey@3 894 ScriptObject getFunctionPrototype() {
jlaskey@3 895 return ScriptFunction.getPrototype(builtinFunction);
jlaskey@3 896 }
jlaskey@3 897
jlaskey@3 898 ScriptObject getObjectPrototype() {
jlaskey@3 899 return ScriptFunction.getPrototype(builtinObject);
jlaskey@3 900 }
jlaskey@3 901
jlaskey@3 902 ScriptObject getArrayPrototype() {
jlaskey@3 903 return ScriptFunction.getPrototype(builtinArray);
jlaskey@3 904 }
jlaskey@3 905
jlaskey@3 906 ScriptObject getBooleanPrototype() {
jlaskey@3 907 return ScriptFunction.getPrototype(builtinBoolean);
jlaskey@3 908 }
jlaskey@3 909
jlaskey@3 910 ScriptObject getNumberPrototype() {
jlaskey@3 911 return ScriptFunction.getPrototype(builtinNumber);
jlaskey@3 912 }
jlaskey@3 913
jlaskey@3 914 ScriptObject getDatePrototype() {
jlaskey@3 915 return ScriptFunction.getPrototype(builtinDate);
jlaskey@3 916 }
jlaskey@3 917
jlaskey@3 918 ScriptObject getRegExpPrototype() {
jlaskey@3 919 return ScriptFunction.getPrototype(builtinRegExp);
jlaskey@3 920 }
jlaskey@3 921
jlaskey@3 922 ScriptObject getStringPrototype() {
jlaskey@3 923 return ScriptFunction.getPrototype(builtinString);
jlaskey@3 924 }
jlaskey@3 925
jlaskey@3 926 ScriptObject getErrorPrototype() {
jlaskey@3 927 return ScriptFunction.getPrototype(builtinError);
jlaskey@3 928 }
jlaskey@3 929
jlaskey@3 930 ScriptObject getEvalErrorPrototype() {
jlaskey@3 931 return ScriptFunction.getPrototype(builtinEvalError);
jlaskey@3 932 }
jlaskey@3 933
jlaskey@3 934 ScriptObject getRangeErrorPrototype() {
jlaskey@3 935 return ScriptFunction.getPrototype(builtinRangeError);
jlaskey@3 936 }
jlaskey@3 937
jlaskey@3 938 ScriptObject getReferenceErrorPrototype() {
jlaskey@3 939 return ScriptFunction.getPrototype(builtinReferenceError);
jlaskey@3 940 }
jlaskey@3 941
jlaskey@3 942 ScriptObject getSyntaxErrorPrototype() {
jlaskey@3 943 return ScriptFunction.getPrototype(builtinSyntaxError);
jlaskey@3 944 }
jlaskey@3 945
jlaskey@3 946 ScriptObject getTypeErrorPrototype() {
jlaskey@3 947 return ScriptFunction.getPrototype(builtinTypeError);
jlaskey@3 948 }
jlaskey@3 949
jlaskey@3 950 ScriptObject getURIErrorPrototype() {
jlaskey@3 951 return ScriptFunction.getPrototype(builtinURIError);
jlaskey@3 952 }
jlaskey@3 953
jlaskey@3 954 ScriptObject getJavaImporterPrototype() {
jlaskey@3 955 return ScriptFunction.getPrototype(builtinJavaImporter);
jlaskey@3 956 }
jlaskey@3 957
jlaskey@3 958 ScriptObject getJSAdapterPrototype() {
jlaskey@3 959 return ScriptFunction.getPrototype(builtinJSAdapter);
jlaskey@3 960 }
jlaskey@3 961
jlaskey@3 962 ScriptObject getArrayBufferPrototype() {
jlaskey@3 963 return ScriptFunction.getPrototype(builtinArrayBuffer);
jlaskey@3 964 }
jlaskey@3 965
jlaskey@3 966 ScriptObject getInt8ArrayPrototype() {
jlaskey@3 967 return ScriptFunction.getPrototype(builtinInt8Array);
jlaskey@3 968 }
jlaskey@3 969
jlaskey@3 970 ScriptObject getUint8ArrayPrototype() {
jlaskey@3 971 return ScriptFunction.getPrototype(builtinUint8Array);
jlaskey@3 972 }
jlaskey@3 973
jlaskey@3 974 ScriptObject getUint8ClampedArrayPrototype() {
jlaskey@3 975 return ScriptFunction.getPrototype(builtinUint8ClampedArray);
jlaskey@3 976 }
jlaskey@3 977
jlaskey@3 978 ScriptObject getInt16ArrayPrototype() {
jlaskey@3 979 return ScriptFunction.getPrototype(builtinInt16Array);
jlaskey@3 980 }
jlaskey@3 981
jlaskey@3 982 ScriptObject getUint16ArrayPrototype() {
jlaskey@3 983 return ScriptFunction.getPrototype(builtinUint16Array);
jlaskey@3 984 }
jlaskey@3 985
jlaskey@3 986 ScriptObject getInt32ArrayPrototype() {
jlaskey@3 987 return ScriptFunction.getPrototype(builtinInt32Array);
jlaskey@3 988 }
jlaskey@3 989
jlaskey@3 990 ScriptObject getUint32ArrayPrototype() {
jlaskey@3 991 return ScriptFunction.getPrototype(builtinUint32Array);
jlaskey@3 992 }
jlaskey@3 993
jlaskey@3 994 ScriptObject getFloat32ArrayPrototype() {
jlaskey@3 995 return ScriptFunction.getPrototype(builtinFloat32Array);
jlaskey@3 996 }
jlaskey@3 997
jlaskey@3 998 ScriptObject getFloat64ArrayPrototype() {
jlaskey@3 999 return ScriptFunction.getPrototype(builtinFloat64Array);
jlaskey@3 1000 }
jlaskey@3 1001
sundar@414 1002 // Builtin PropertyMap accessors
sundar@414 1003 PropertyMap getAccessorPropertyDescriptorMap() {
sundar@414 1004 return accessorPropertyDescriptorMap;
sundar@414 1005 }
sundar@414 1006
sundar@414 1007 PropertyMap getArrayBufferViewMap() {
sundar@414 1008 return arrayBufferViewMap;
sundar@414 1009 }
sundar@414 1010
sundar@414 1011 PropertyMap getDataPropertyDescriptorMap() {
sundar@414 1012 return dataPropertyDescriptorMap;
sundar@414 1013 }
sundar@414 1014
sundar@414 1015 PropertyMap getGenericPropertyDescriptorMap() {
sundar@414 1016 return genericPropertyDescriptorMap;
sundar@414 1017 }
sundar@414 1018
sundar@414 1019 PropertyMap getArgumentsMap() {
sundar@414 1020 return nativeArgumentsMap;
sundar@414 1021 }
sundar@414 1022
sundar@414 1023 PropertyMap getArrayMap() {
sundar@414 1024 return nativeArrayMap;
sundar@414 1025 }
sundar@414 1026
sundar@414 1027 PropertyMap getArrayBufferMap() {
sundar@414 1028 return nativeArrayBufferMap;
sundar@414 1029 }
sundar@414 1030
sundar@414 1031 PropertyMap getBooleanMap() {
sundar@414 1032 return nativeBooleanMap;
sundar@414 1033 }
sundar@414 1034
sundar@414 1035 PropertyMap getDateMap() {
sundar@414 1036 return nativeDateMap;
sundar@414 1037 }
sundar@414 1038
sundar@414 1039 PropertyMap getErrorMap() {
sundar@414 1040 return nativeErrorMap;
sundar@414 1041 }
sundar@414 1042
sundar@414 1043 PropertyMap getEvalErrorMap() {
sundar@414 1044 return nativeEvalErrorMap;
sundar@414 1045 }
sundar@414 1046
sundar@414 1047 PropertyMap getJSAdapterMap() {
sundar@414 1048 return nativeJSAdapterMap;
sundar@414 1049 }
sundar@414 1050
sundar@414 1051 PropertyMap getJavaImporterMap() {
sundar@414 1052 return nativeJavaImporterMap;
sundar@414 1053 }
sundar@414 1054
sundar@414 1055 PropertyMap getNumberMap() {
sundar@414 1056 return nativeNumberMap;
sundar@414 1057 }
sundar@414 1058
sundar@414 1059 PropertyMap getRangeErrorMap() {
sundar@414 1060 return nativeRangeErrorMap;
sundar@414 1061 }
sundar@414 1062
sundar@414 1063 PropertyMap getReferenceErrorMap() {
sundar@414 1064 return nativeReferenceErrorMap;
sundar@414 1065 }
sundar@414 1066
sundar@414 1067 PropertyMap getRegExpMap() {
sundar@414 1068 return nativeRegExpMap;
sundar@414 1069 }
sundar@414 1070
sundar@414 1071 PropertyMap getRegExpExecResultMap() {
sundar@414 1072 return nativeRegExpExecResultMap;
sundar@414 1073 }
sundar@414 1074
sundar@414 1075 PropertyMap getStrictArgumentsMap() {
sundar@414 1076 return nativeStrictArgumentsMap;
sundar@414 1077 }
sundar@414 1078
sundar@414 1079 PropertyMap getStringMap() {
sundar@414 1080 return nativeStringMap;
sundar@414 1081 }
sundar@414 1082
sundar@414 1083 PropertyMap getSyntaxErrorMap() {
sundar@414 1084 return nativeSyntaxErrorMap;
sundar@414 1085 }
sundar@414 1086
sundar@414 1087 PropertyMap getTypeErrorMap() {
sundar@414 1088 return nativeTypeErrorMap;
sundar@414 1089 }
sundar@414 1090
sundar@414 1091 PropertyMap getURIErrorMap() {
sundar@414 1092 return nativeURIErrorMap;
sundar@414 1093 }
sundar@414 1094
sundar@414 1095 PropertyMap getPrototypeObjectMap() {
sundar@414 1096 return prototypeObjectMap;
sundar@414 1097 }
sundar@414 1098
sundar@414 1099 PropertyMap getObjectMap() {
sundar@414 1100 return objectMap;
sundar@414 1101 }
sundar@414 1102
sundar@414 1103 PropertyMap getFunctionMap() {
sundar@414 1104 return functionMap;
sundar@414 1105 }
sundar@414 1106
sundar@418 1107 PropertyMap getAnonymousFunctionMap() {
sundar@418 1108 return anonymousFunctionMap;
sundar@418 1109 }
sundar@418 1110
sundar@414 1111 PropertyMap getStrictFunctionMap() {
sundar@414 1112 return strictFunctionMap;
sundar@414 1113 }
sundar@414 1114
sundar@414 1115 PropertyMap getBoundFunctionMap() {
sundar@414 1116 return boundFunctionMap;
sundar@414 1117 }
sundar@414 1118
jlaskey@3 1119 private ScriptFunction getBuiltinArray() {
jlaskey@3 1120 return builtinArray;
jlaskey@3 1121 }
jlaskey@3 1122
sundar@690 1123 ScriptFunction getTypeErrorThrower() {
sundar@690 1124 return typeErrorThrower;
sundar@690 1125 }
sundar@690 1126
jlaskey@3 1127 /**
jlaskey@3 1128 * Called from compiled script code to test if builtin has been overridden
jlaskey@3 1129 *
jlaskey@3 1130 * @return true if builtin array has not been overridden
jlaskey@3 1131 */
jlaskey@3 1132 public static boolean isBuiltinArray() {
jlaskey@3 1133 final Global instance = Global.instance();
jlaskey@3 1134 return instance.array == instance.getBuiltinArray();
jlaskey@3 1135 }
jlaskey@3 1136
jlaskey@3 1137 private ScriptFunction getBuiltinBoolean() {
jlaskey@3 1138 return builtinBoolean;
jlaskey@3 1139 }
jlaskey@3 1140
jlaskey@3 1141 /**
jlaskey@3 1142 * Called from compiled script code to test if builtin has been overridden
jlaskey@3 1143 *
jlaskey@3 1144 * @return true if builtin boolean has not been overridden
jlaskey@3 1145 */
jlaskey@3 1146 public static boolean isBuiltinBoolean() {
jlaskey@3 1147 final Global instance = Global.instance();
jlaskey@3 1148 return instance._boolean == instance.getBuiltinBoolean();
jlaskey@3 1149 }
jlaskey@3 1150
jlaskey@3 1151 private ScriptFunction getBuiltinDate() {
jlaskey@3 1152 return builtinDate;
jlaskey@3 1153 }
jlaskey@3 1154
jlaskey@3 1155 /**
jlaskey@3 1156 * Called from compiled script code to test if builtin has been overridden
jlaskey@3 1157 *
jlaskey@3 1158 * @return true if builtin date has not been overridden
jlaskey@3 1159 */
jlaskey@3 1160 public static boolean isBuiltinDate() {
jlaskey@3 1161 final Global instance = Global.instance();
jlaskey@3 1162 return instance.date == instance.getBuiltinDate();
jlaskey@3 1163 }
jlaskey@3 1164
jlaskey@3 1165 private ScriptFunction getBuiltinError() {
jlaskey@3 1166 return builtinError;
jlaskey@3 1167 }
jlaskey@3 1168
jlaskey@3 1169 /**
jlaskey@3 1170 * Called from compiled script code to test if builtin has been overridden
jlaskey@3 1171 *
jlaskey@3 1172 * @return true if builtin error has not been overridden
jlaskey@3 1173 */
jlaskey@3 1174 public static boolean isBuiltinError() {
jlaskey@3 1175 final Global instance = Global.instance();
jlaskey@3 1176 return instance.error == instance.getBuiltinError();
jlaskey@3 1177 }
jlaskey@3 1178
jlaskey@3 1179 private ScriptFunction getBuiltinEvalError() {
jlaskey@3 1180 return builtinEvalError;
jlaskey@3 1181 }
jlaskey@3 1182
jlaskey@3 1183 /**
jlaskey@3 1184 * Called from compiled script code to test if builtin has been overridden
jlaskey@3 1185 *
jlaskey@3 1186 * @return true if builtin eval error has not been overridden
jlaskey@3 1187 */
jlaskey@3 1188 public static boolean isBuiltinEvalError() {
jlaskey@3 1189 final Global instance = Global.instance();
jlaskey@3 1190 return instance.evalError == instance.getBuiltinEvalError();
jlaskey@3 1191 }
jlaskey@3 1192
jlaskey@3 1193 private ScriptFunction getBuiltinFunction() {
jlaskey@3 1194 return builtinFunction;
jlaskey@3 1195 }
jlaskey@3 1196
jlaskey@3 1197 /**
jlaskey@3 1198 * Called from compiled script code to test if builtin has been overridden
jlaskey@3 1199 *
jlaskey@3 1200 * @return true if builtin function has not been overridden
jlaskey@3 1201 */
jlaskey@3 1202 public static boolean isBuiltinFunction() {
jlaskey@3 1203 final Global instance = Global.instance();
jlaskey@3 1204 return instance.function == instance.getBuiltinFunction();
jlaskey@3 1205 }
jlaskey@3 1206
jlaskey@3 1207 private ScriptFunction getBuiltinJSAdapter() {
jlaskey@3 1208 return builtinJSAdapter;
jlaskey@3 1209 }
jlaskey@3 1210
jlaskey@3 1211 /**
jlaskey@3 1212 * Called from compiled script code to test if builtin has been overridden
jlaskey@3 1213 *
jlaskey@3 1214 * @return true if builtin JSAdapter has not been overridden
jlaskey@3 1215 */
jlaskey@3 1216 public static boolean isBuiltinJSAdapter() {
jlaskey@3 1217 final Global instance = Global.instance();
jlaskey@3 1218 return instance.jsadapter == instance.getBuiltinJSAdapter();
jlaskey@3 1219 }
jlaskey@3 1220
jlaskey@3 1221 private ScriptObject getBuiltinJSON() {
jlaskey@3 1222 return builtinJSON;
jlaskey@3 1223 }
jlaskey@3 1224
jlaskey@3 1225 /**
jlaskey@3 1226 * Called from compiled script code to test if builtin has been overridden
jlaskey@3 1227 *
jlaskey@3 1228 * @return true if builtin JSON has has not been overridden
jlaskey@3 1229 */
jlaskey@3 1230 public static boolean isBuiltinJSON() {
jlaskey@3 1231 final Global instance = Global.instance();
jlaskey@3 1232 return instance.json == instance.getBuiltinJSON();
jlaskey@3 1233 }
jlaskey@3 1234
jlaskey@3 1235 private ScriptObject getBuiltinJava() {
jlaskey@3 1236 return builtinJava;
jlaskey@3 1237 }
jlaskey@3 1238
jlaskey@3 1239 /**
jlaskey@3 1240 * Called from compiled script code to test if builtin has been overridden
jlaskey@3 1241 *
jlaskey@3 1242 * @return true if builtin Java has not been overridden
jlaskey@3 1243 */
jlaskey@3 1244 public static boolean isBuiltinJava() {
jlaskey@3 1245 final Global instance = Global.instance();
jlaskey@3 1246 return instance.java == instance.getBuiltinJava();
jlaskey@3 1247 }
jlaskey@3 1248
jlaskey@3 1249 private ScriptObject getBuiltinJavax() {
jlaskey@3 1250 return builtinJavax;
jlaskey@3 1251 }
jlaskey@3 1252
jlaskey@3 1253 /**
jlaskey@3 1254 * Called from compiled script code to test if builtin has been overridden
jlaskey@3 1255 *
jlaskey@3 1256 * @return true if builtin Javax has not been overridden
jlaskey@3 1257 */
jlaskey@3 1258 public static boolean isBuiltinJavax() {
jlaskey@3 1259 final Global instance = Global.instance();
jlaskey@3 1260 return instance.javax == instance.getBuiltinJavax();
jlaskey@3 1261 }
jlaskey@3 1262
jlaskey@3 1263 private ScriptObject getBuiltinJavaImporter() {
jlaskey@3 1264 return builtinJavaImporter;
jlaskey@3 1265 }
jlaskey@3 1266
jlaskey@3 1267 /**
jlaskey@3 1268 * Called from compiled script code to test if builtin has been overridden
jlaskey@3 1269 *
jlaskey@3 1270 * @return true if builtin Java importer has not been overridden
jlaskey@3 1271 */
jlaskey@3 1272 public static boolean isBuiltinJavaImporter() {
jlaskey@3 1273 final Global instance = Global.instance();
jlaskey@3 1274 return instance.javaImporter == instance.getBuiltinJavaImporter();
jlaskey@3 1275 }
jlaskey@3 1276
jlaskey@3 1277 private ScriptObject getBuiltinMath() {
jlaskey@3 1278 return builtinMath;
jlaskey@3 1279 }
jlaskey@3 1280
jlaskey@3 1281 /**
jlaskey@3 1282 * Called from compiled script code to test if builtin has been overridden
jlaskey@3 1283 *
jlaskey@3 1284 * @return true if builtin math has not been overridden
jlaskey@3 1285 */
jlaskey@3 1286 public static boolean isBuiltinMath() {
jlaskey@3 1287 final Global instance = Global.instance();
jlaskey@3 1288 return instance.math == instance.getBuiltinMath();
jlaskey@3 1289 }
jlaskey@3 1290
jlaskey@3 1291 private ScriptFunction getBuiltinNumber() {
jlaskey@3 1292 return builtinNumber;
jlaskey@3 1293 }
jlaskey@3 1294
jlaskey@3 1295 /**
jlaskey@3 1296 * Called from compiled script code to test if builtin has been overridden
jlaskey@3 1297 *
jlaskey@3 1298 * @return true if builtin number has not been overridden
jlaskey@3 1299 */
jlaskey@3 1300 public static boolean isBuiltinNumber() {
jlaskey@3 1301 final Global instance = Global.instance();
jlaskey@3 1302 return instance.number == instance.getBuiltinNumber();
jlaskey@3 1303 }
jlaskey@3 1304
jlaskey@3 1305 private ScriptFunction getBuiltinObject() {
jlaskey@3 1306 return builtinObject;
jlaskey@3 1307 }
jlaskey@3 1308
jlaskey@3 1309 /**
jlaskey@3 1310 * Called from compiled script code to test if builtin has been overridden
jlaskey@3 1311 *
jlaskey@3 1312 * @return true if builtin object has not been overridden
jlaskey@3 1313 */
jlaskey@3 1314 public static boolean isBuiltinObject() {
jlaskey@3 1315 final Global instance = Global.instance();
jlaskey@3 1316 return instance.object == instance.getBuiltinObject();
jlaskey@3 1317 }
jlaskey@3 1318
jlaskey@3 1319 private ScriptObject getBuiltinPackages() {
jlaskey@3 1320 return builtinPackages;
jlaskey@3 1321 }
jlaskey@3 1322
jlaskey@3 1323 /**
jlaskey@3 1324 * Called from compiled script code to test if builtin has been overridden
jlaskey@3 1325 *
jlaskey@3 1326 * @return true if builtin package has not been overridden
jlaskey@3 1327 */
jlaskey@3 1328 public static boolean isBuiltinPackages() {
jlaskey@3 1329 final Global instance = Global.instance();
jlaskey@3 1330 return instance.packages == instance.getBuiltinPackages();
jlaskey@3 1331 }
jlaskey@3 1332
jlaskey@3 1333 private ScriptFunction getBuiltinRangeError() {
jlaskey@3 1334 return builtinRangeError;
jlaskey@3 1335 }
jlaskey@3 1336
jlaskey@3 1337 /**
jlaskey@3 1338 * Called from compiled script code to test if builtin has been overridden
jlaskey@3 1339 *
jlaskey@3 1340 * @return true if builtin range error has not been overridden
jlaskey@3 1341 */
jlaskey@3 1342 public static boolean isBuiltinRangeError() {
jlaskey@3 1343 final Global instance = Global.instance();
jlaskey@3 1344 return instance.rangeError == instance.getBuiltinRangeError();
jlaskey@3 1345 }
jlaskey@3 1346
jlaskey@3 1347 private ScriptFunction getBuiltinReferenceError() {
jlaskey@3 1348 return builtinReferenceError;
jlaskey@3 1349 }
jlaskey@3 1350
jlaskey@3 1351 /**
jlaskey@3 1352 * Called from compiled script code to test if builtin has been overridden
jlaskey@3 1353 *
jlaskey@3 1354 * @return true if builtin reference error has not been overridden
jlaskey@3 1355 */
jlaskey@3 1356 public static boolean isBuiltinReferenceError() {
jlaskey@3 1357 final Global instance = Global.instance();
jlaskey@3 1358 return instance.referenceError == instance.getBuiltinReferenceError();
jlaskey@3 1359 }
jlaskey@3 1360
jlaskey@3 1361 private ScriptFunction getBuiltinRegExp() {
jlaskey@3 1362 return builtinRegExp;
jlaskey@3 1363 }
jlaskey@3 1364
jlaskey@3 1365 /**
jlaskey@3 1366 * Called from compiled script code to test if builtin has been overridden
jlaskey@3 1367 *
jlaskey@3 1368 * @return true if builtin regexp has not been overridden
jlaskey@3 1369 */
jlaskey@3 1370 public static boolean isBuiltinRegExp() {
jlaskey@3 1371 final Global instance = Global.instance();
jlaskey@3 1372 return instance.regexp == instance.getBuiltinRegExp();
jlaskey@3 1373 }
jlaskey@3 1374
jlaskey@3 1375 private ScriptFunction getBuiltinString() {
jlaskey@3 1376 return builtinString;
jlaskey@3 1377 }
jlaskey@3 1378
jlaskey@3 1379 /**
jlaskey@3 1380 * Called from compiled script code to test if builtin has been overridden
jlaskey@3 1381 *
jlaskey@3 1382 * @return true if builtin Java has not been overridden
jlaskey@3 1383 */
jlaskey@3 1384 public static boolean isBuiltinString() {
jlaskey@3 1385 final Global instance = Global.instance();
jlaskey@3 1386 return instance.string == instance.getBuiltinString();
jlaskey@3 1387 }
jlaskey@3 1388
jlaskey@3 1389 private ScriptFunction getBuiltinSyntaxError() {
jlaskey@3 1390 return builtinSyntaxError;
jlaskey@3 1391 }
jlaskey@3 1392
jlaskey@3 1393 /**
jlaskey@3 1394 * Called from compiled script code to test if builtin has been overridden
jlaskey@3 1395 *
jlaskey@3 1396 * @return true if builtin syntax error has not been overridden
jlaskey@3 1397 */
jlaskey@3 1398 public static boolean isBuiltinSyntaxError() {
jlaskey@3 1399 final Global instance = Global.instance();
jlaskey@3 1400 return instance.syntaxError == instance.getBuiltinSyntaxError();
jlaskey@3 1401 }
jlaskey@3 1402
jlaskey@3 1403 private ScriptFunction getBuiltinTypeError() {
jlaskey@3 1404 return builtinTypeError;
jlaskey@3 1405 }
jlaskey@3 1406
jlaskey@3 1407 /**
jlaskey@3 1408 * Called from compiled script code to test if builtin has been overridden
jlaskey@3 1409 *
jlaskey@3 1410 * @return true if builtin type error has not been overridden
jlaskey@3 1411 */
jlaskey@3 1412 public static boolean isBuiltinTypeError() {
jlaskey@3 1413 final Global instance = Global.instance();
jlaskey@3 1414 return instance.typeError == instance.getBuiltinTypeError();
jlaskey@3 1415 }
jlaskey@3 1416
jlaskey@3 1417 private ScriptFunction getBuiltinURIError() {
jlaskey@3 1418 return builtinURIError;
jlaskey@3 1419 }
jlaskey@3 1420
jlaskey@3 1421 /**
jlaskey@3 1422 * Called from compiled script code to test if builtin has been overridden
jlaskey@3 1423 *
jlaskey@3 1424 * @return true if builtin URI error has not been overridden
jlaskey@3 1425 */
jlaskey@3 1426 public static boolean isBuiltinURIError() {
jlaskey@3 1427 final Global instance = Global.instance();
jlaskey@3 1428 return instance.uriError == instance.getBuiltinURIError();
jlaskey@3 1429 }
jlaskey@3 1430
jlaskey@3 1431 @Override
jlaskey@3 1432 public String getClassName() {
jlaskey@3 1433 return "global";
jlaskey@3 1434 }
jlaskey@3 1435
jlaskey@3 1436 /**
jlaskey@3 1437 * Copy function used to clone NativeRegExp objects.
jlaskey@3 1438 *
jlaskey@3 1439 * @param regexp a NativeRegExp to clone
jlaskey@3 1440 *
jlaskey@3 1441 * @return copy of the given regexp object
jlaskey@3 1442 */
jlaskey@3 1443 public static Object regExpCopy(final Object regexp) {
jlaskey@3 1444 return new NativeRegExp((NativeRegExp)regexp);
jlaskey@3 1445 }
jlaskey@3 1446
jlaskey@3 1447 /**
jlaskey@3 1448 * Convert given object to NativeRegExp type.
jlaskey@3 1449 *
jlaskey@3 1450 * @param obj object to be converted
jlaskey@3 1451 * @return NativeRegExp instance
jlaskey@3 1452 */
jlaskey@3 1453 public static NativeRegExp toRegExp(final Object obj) {
jlaskey@3 1454 if (obj instanceof NativeRegExp) {
jlaskey@3 1455 return (NativeRegExp)obj;
jlaskey@3 1456 }
jlaskey@3 1457 return new NativeRegExp(JSType.toString(obj));
jlaskey@3 1458 }
jlaskey@3 1459
jlaskey@3 1460 /**
jlaskey@3 1461 * ECMA 9.9 ToObject implementation
jlaskey@3 1462 *
jlaskey@3 1463 * @param obj an item for which to run ToObject
jlaskey@3 1464 * @return ToObject version of given item
jlaskey@3 1465 */
jlaskey@3 1466 public static Object toObject(final Object obj) {
jlaskey@3 1467 if (obj == null || obj == UNDEFINED) {
lagergren@112 1468 throw typeError("not.an.object", ScriptRuntime.safeToString(obj));
jlaskey@3 1469 }
jlaskey@3 1470
jlaskey@3 1471 if (obj instanceof ScriptObject) {
jlaskey@3 1472 return obj;
jlaskey@3 1473 }
jlaskey@3 1474
jlaskey@3 1475 return instance().wrapAsObject(obj);
jlaskey@3 1476 }
jlaskey@3 1477
jlaskey@3 1478 /**
jlaskey@3 1479 * Allocate a new object array.
jlaskey@3 1480 *
jlaskey@3 1481 * @param initial object values.
jlaskey@3 1482 * @return the new array
jlaskey@3 1483 */
lagergren@66 1484 public static NativeArray allocate(final Object[] initial) {
hannesw@380 1485 ArrayData arrayData = ArrayData.allocate(initial);
hannesw@380 1486
hannesw@380 1487 for (int index = 0; index < initial.length; index++) {
hannesw@380 1488 final Object value = initial[index];
hannesw@380 1489
hannesw@380 1490 if (value == ScriptRuntime.EMPTY) {
hannesw@380 1491 arrayData = arrayData.delete(index);
hannesw@380 1492 }
hannesw@380 1493 }
hannesw@380 1494
hannesw@380 1495 return new NativeArray(arrayData);
jlaskey@3 1496 }
jlaskey@3 1497
jlaskey@3 1498 /**
jlaskey@3 1499 * Allocate a new number array.
jlaskey@3 1500 *
jlaskey@3 1501 * @param initial number values.
jlaskey@3 1502 * @return the new array
jlaskey@3 1503 */
lagergren@66 1504 public static NativeArray allocate(final double[] initial) {
hannesw@380 1505 return new NativeArray(ArrayData.allocate(initial));
jlaskey@3 1506 }
jlaskey@3 1507
jlaskey@3 1508 /**
jlaskey@3 1509 * Allocate a new long array.
jlaskey@3 1510 *
jlaskey@3 1511 * @param initial number values.
jlaskey@3 1512 * @return the new array
jlaskey@3 1513 */
lagergren@66 1514 public static NativeArray allocate(final long[] initial) {
hannesw@380 1515 return new NativeArray(ArrayData.allocate(initial));
jlaskey@3 1516 }
jlaskey@3 1517
jlaskey@3 1518 /**
jlaskey@3 1519 * Allocate a new integer array.
jlaskey@3 1520 *
jlaskey@3 1521 * @param initial number values.
jlaskey@3 1522 * @return the new array
jlaskey@3 1523 */
lagergren@66 1524 public static NativeArray allocate(final int[] initial) {
hannesw@380 1525 return new NativeArray(ArrayData.allocate(initial));
jlaskey@3 1526 }
jlaskey@3 1527
jlaskey@3 1528 /**
jlaskey@3 1529 * Allocate a new object array for arguments.
jlaskey@3 1530 *
jlaskey@3 1531 * @param arguments initial arguments passed.
jlaskey@3 1532 * @param callee reference to the function that uses arguments object
jlaskey@3 1533 * @param numParams actual number of declared parameters
jlaskey@3 1534 *
jlaskey@3 1535 * @return the new array
jlaskey@3 1536 */
attila@62 1537 public static ScriptObject allocateArguments(final Object[] arguments, final Object callee, final int numParams) {
jlaskey@3 1538 return NativeArguments.allocate(arguments, (ScriptFunction)callee, numParams);
jlaskey@3 1539 }
jlaskey@3 1540
jlaskey@3 1541 /**
jlaskey@3 1542 * Called from generated to check if given function is the builtin 'eval'. If
jlaskey@3 1543 * eval is used in a script, a lot of optimizations and assumptions cannot be done.
jlaskey@3 1544 *
jlaskey@3 1545 * @param fn function object that is checked
jlaskey@3 1546 * @return true if fn is the builtin eval
jlaskey@3 1547 */
jlaskey@3 1548 public static boolean isEval(final Object fn) {
jlaskey@3 1549 return fn == Global.instance().builtinEval;
jlaskey@3 1550 }
jlaskey@3 1551
jlaskey@3 1552 /**
jlaskey@3 1553 * Create a new RegExp object.
jlaskey@3 1554 *
jlaskey@3 1555 * @param expression Regular expression.
jlaskey@3 1556 * @param options Search options.
jlaskey@3 1557 *
jlaskey@3 1558 * @return New RegExp object.
jlaskey@3 1559 */
jlaskey@3 1560 public static Object newRegExp(final String expression, final String options) {
jlaskey@3 1561 if (options == null) {
jlaskey@3 1562 return new NativeRegExp(expression);
jlaskey@3 1563 }
jlaskey@3 1564 return new NativeRegExp(expression, options);
jlaskey@3 1565 }
jlaskey@3 1566
jlaskey@3 1567 /**
jlaskey@3 1568 * Get the object prototype
jlaskey@3 1569 *
jlaskey@3 1570 * @return the object prototype
jlaskey@3 1571 */
jlaskey@3 1572 public static ScriptObject objectPrototype() {
jlaskey@3 1573 return Global.instance().getObjectPrototype();
jlaskey@3 1574 }
jlaskey@3 1575
jlaskey@3 1576 /**
jlaskey@3 1577 * Create a new empty object instance.
jlaskey@3 1578 *
jlaskey@3 1579 * @return New empty object.
jlaskey@3 1580 */
jlaskey@3 1581 public static ScriptObject newEmptyInstance() {
hannesw@380 1582 return Global.instance().newObject();
jlaskey@3 1583 }
jlaskey@3 1584
jlaskey@3 1585 /**
jlaskey@3 1586 * Check if a given object is a ScriptObject, raises an exception if this is
jlaskey@3 1587 * not the case
jlaskey@3 1588 *
jlaskey@3 1589 * @param obj and object to check
jlaskey@3 1590 */
jlaskey@3 1591 public static void checkObject(final Object obj) {
jlaskey@3 1592 if (!(obj instanceof ScriptObject)) {
lagergren@112 1593 throw typeError("not.an.object", ScriptRuntime.safeToString(obj));
jlaskey@3 1594 }
jlaskey@3 1595 }
jlaskey@3 1596
jlaskey@3 1597 /**
jlaskey@3 1598 * ECMA 9.10 - implementation of CheckObjectCoercible, i.e. raise an exception
jlaskey@3 1599 * if this object is null or undefined.
jlaskey@3 1600 *
jlaskey@3 1601 * @param obj an object to check
jlaskey@3 1602 */
jlaskey@3 1603 public static void checkObjectCoercible(final Object obj) {
jlaskey@3 1604 if (obj == null || obj == UNDEFINED) {
lagergren@112 1605 throw typeError("not.an.object", ScriptRuntime.safeToString(obj));
jlaskey@3 1606 }
jlaskey@3 1607 }
jlaskey@3 1608
jlaskey@3 1609 /**
jlaskey@3 1610 * Get the current split state.
jlaskey@3 1611 *
jlaskey@3 1612 * @return current split state
jlaskey@3 1613 */
jlaskey@3 1614 @Override
jlaskey@3 1615 public int getSplitState() {
jlaskey@3 1616 return splitState;
jlaskey@3 1617 }
jlaskey@3 1618
jlaskey@3 1619 /**
jlaskey@3 1620 * Set the current split state.
jlaskey@3 1621 *
jlaskey@3 1622 * @param state current split state
jlaskey@3 1623 */
jlaskey@3 1624 @Override
jlaskey@3 1625 public void setSplitState(final int state) {
jlaskey@3 1626 splitState = state;
jlaskey@3 1627 }
jlaskey@3 1628
jlaskey@3 1629 private void init() {
sundar@41 1630 assert Context.getGlobal() == this : "this global is not set as current";
sundar@41 1631
sundar@414 1632 final ScriptEnvironment env = getContext().getEnv();
sundar@414 1633
sundar@414 1634 // duplicate PropertyMaps of Native* classes
sundar@418 1635 copyInitialMaps(env);
sundar@414 1636
jlaskey@3 1637 // initialize Function and Object constructor
jlaskey@3 1638 initFunctionAndObject();
jlaskey@3 1639
jlaskey@3 1640 // Now fix Global's own proto.
jlaskey@3 1641 this.setProto(getObjectPrototype());
jlaskey@3 1642
jlaskey@3 1643 // initialize global function properties
jlaskey@3 1644 this.eval = this.builtinEval = ScriptFunctionImpl.makeFunction("eval", EVAL);
jlaskey@3 1645
jlaskey@3 1646 this.parseInt = ScriptFunctionImpl.makeFunction("parseInt", GlobalFunctions.PARSEINT);
jlaskey@3 1647 this.parseFloat = ScriptFunctionImpl.makeFunction("parseFloat", GlobalFunctions.PARSEFLOAT);
jlaskey@3 1648 this.isNaN = ScriptFunctionImpl.makeFunction("isNaN", GlobalFunctions.IS_NAN);
jlaskey@3 1649 this.isFinite = ScriptFunctionImpl.makeFunction("isFinite", GlobalFunctions.IS_FINITE);
jlaskey@3 1650 this.encodeURI = ScriptFunctionImpl.makeFunction("encodeURI", GlobalFunctions.ENCODE_URI);
jlaskey@3 1651 this.encodeURIComponent = ScriptFunctionImpl.makeFunction("encodeURIComponent", GlobalFunctions.ENCODE_URICOMPONENT);
jlaskey@3 1652 this.decodeURI = ScriptFunctionImpl.makeFunction("decodeURI", GlobalFunctions.DECODE_URI);
jlaskey@3 1653 this.decodeURIComponent = ScriptFunctionImpl.makeFunction("decodeURIComponent", GlobalFunctions.DECODE_URICOMPONENT);
jlaskey@3 1654 this.escape = ScriptFunctionImpl.makeFunction("escape", GlobalFunctions.ESCAPE);
jlaskey@3 1655 this.unescape = ScriptFunctionImpl.makeFunction("unescape", GlobalFunctions.UNESCAPE);
sundar@118 1656 this.print = ScriptFunctionImpl.makeFunction("print", env._print_no_newline ? PRINT : PRINTLN);
jlaskey@3 1657 this.load = ScriptFunctionImpl.makeFunction("load", LOAD);
jlaskey@317 1658 this.loadWithNewGlobal = ScriptFunctionImpl.makeFunction("loadWithNewGlobal", LOADWITHNEWGLOBAL);
jlaskey@75 1659 this.exit = ScriptFunctionImpl.makeFunction("exit", EXIT);
jlaskey@75 1660 this.quit = ScriptFunctionImpl.makeFunction("quit", EXIT);
jlaskey@3 1661
jlaskey@3 1662 // built-in constructors
jlaskey@3 1663 this.builtinArray = (ScriptFunction)initConstructor("Array");
jlaskey@3 1664 this.builtinBoolean = (ScriptFunction)initConstructor("Boolean");
jlaskey@3 1665 this.builtinDate = (ScriptFunction)initConstructor("Date");
jlaskey@3 1666 this.builtinJSON = initConstructor("JSON");
jlaskey@3 1667 this.builtinJSAdapter = (ScriptFunction)initConstructor("JSAdapter");
jlaskey@3 1668 this.builtinMath = initConstructor("Math");
jlaskey@3 1669 this.builtinNumber = (ScriptFunction)initConstructor("Number");
jlaskey@3 1670 this.builtinRegExp = (ScriptFunction)initConstructor("RegExp");
jlaskey@3 1671 this.builtinString = (ScriptFunction)initConstructor("String");
jlaskey@3 1672
jlaskey@3 1673 // initialize String.prototype.length to 0
jlaskey@3 1674 // add String.prototype.length
jlaskey@3 1675 final ScriptObject stringPrototype = getStringPrototype();
jlaskey@3 1676 stringPrototype.addOwnProperty("length", Attribute.NON_ENUMERABLE_CONSTANT, 0.0);
jlaskey@3 1677
hannesw@634 1678 // set isArray flag on Array.prototype
jlaskey@3 1679 final ScriptObject arrayPrototype = getArrayPrototype();
hannesw@634 1680 arrayPrototype.setIsArray();
jlaskey@3 1681
sundar@414 1682 this.DEFAULT_DATE = new NativeDate(Double.NaN, this);
jlaskey@3 1683
jlaskey@3 1684 // initialize default regexp object
sundar@414 1685 this.DEFAULT_REGEXP = new NativeRegExp("(?:)", this);
jlaskey@3 1686
jlaskey@3 1687 // RegExp.prototype should behave like a RegExp object. So copy the
jlaskey@3 1688 // properties.
jlaskey@3 1689 final ScriptObject regExpProto = getRegExpPrototype();
jlaskey@3 1690 regExpProto.addBoundProperties(DEFAULT_REGEXP);
jlaskey@3 1691
jlaskey@3 1692 // Error stuff
jlaskey@3 1693 initErrorObjects();
jlaskey@3 1694
jlaskey@3 1695 // java access
sundar@418 1696 if (! env._no_java) {
sundar@418 1697 initJavaAccess();
sundar@418 1698 }
jlaskey@3 1699
sundar@418 1700 if (! env._no_typed_arrays) {
sundar@418 1701 initTypedArray();
sundar@418 1702 }
jlaskey@3 1703
sundar@118 1704 if (env._scripting) {
sundar@418 1705 initScripting(env);
jlaskey@3 1706 }
jlaskey@3 1707
sundar@760 1708 if (Context.DEBUG) {
sundar@760 1709 boolean debugOkay;
sundar@760 1710 final SecurityManager sm = System.getSecurityManager();
sundar@760 1711 if (sm != null) {
sundar@760 1712 try {
sundar@760 1713 sm.checkPermission(new RuntimePermission(Context.NASHORN_DEBUG_MODE));
sundar@760 1714 debugOkay = true;
sundar@760 1715 } catch (final SecurityException ignored) {
sundar@760 1716 // if no permission, don't initialize Debug object
sundar@760 1717 debugOkay = false;
sundar@760 1718 }
sundar@760 1719
sundar@760 1720 } else {
sundar@760 1721 debugOkay = true;
sundar@760 1722 }
sundar@760 1723
sundar@760 1724 if (debugOkay) {
sundar@760 1725 initDebug();
sundar@760 1726 }
jlaskey@3 1727 }
jlaskey@3 1728
jlaskey@3 1729 copyBuiltins();
jlaskey@3 1730
jlaskey@3 1731 // initialized with strings so that typeof will work as expected.
jlaskey@3 1732 this.__FILE__ = "";
jlaskey@3 1733 this.__DIR__ = "";
jlaskey@3 1734 this.__LINE__ = 0.0;
jlaskey@3 1735
jlaskey@3 1736 // expose script (command line) arguments as "arguments" property of global
sundar@118 1737 final List<String> arguments = env.getArguments();
jlaskey@3 1738 final Object argsObj = wrapAsObject(arguments.toArray());
jlaskey@3 1739
jlaskey@3 1740 addOwnProperty("arguments", Attribute.NOT_ENUMERABLE, argsObj);
sundar@118 1741 if (env._scripting) {
jlaskey@3 1742 // synonym for "arguments" in scripting mode
jlaskey@3 1743 addOwnProperty("$ARG", Attribute.NOT_ENUMERABLE, argsObj);
jlaskey@3 1744 }
jlaskey@3 1745 }
jlaskey@3 1746
jlaskey@3 1747 private void initErrorObjects() {
jlaskey@3 1748 // Error objects
jlaskey@3 1749 this.builtinError = (ScriptFunction)initConstructor("Error");
jlaskey@3 1750 final ScriptObject errorProto = getErrorPrototype();
jlaskey@3 1751
jlaskey@3 1752 // Nashorn specific accessors on Error.prototype - stack, lineNumber, columnNumber and fileName
jlaskey@3 1753 final ScriptFunction getStack = ScriptFunctionImpl.makeFunction("getStack", NativeError.GET_STACK);
jlaskey@3 1754 final ScriptFunction setStack = ScriptFunctionImpl.makeFunction("setStack", NativeError.SET_STACK);
jlaskey@3 1755 errorProto.addOwnProperty("stack", Attribute.NOT_ENUMERABLE, getStack, setStack);
jlaskey@3 1756 final ScriptFunction getLineNumber = ScriptFunctionImpl.makeFunction("getLineNumber", NativeError.GET_LINENUMBER);
jlaskey@3 1757 final ScriptFunction setLineNumber = ScriptFunctionImpl.makeFunction("setLineNumber", NativeError.SET_LINENUMBER);
jlaskey@3 1758 errorProto.addOwnProperty("lineNumber", Attribute.NOT_ENUMERABLE, getLineNumber, setLineNumber);
jlaskey@3 1759 final ScriptFunction getColumnNumber = ScriptFunctionImpl.makeFunction("getColumnNumber", NativeError.GET_COLUMNNUMBER);
jlaskey@3 1760 final ScriptFunction setColumnNumber = ScriptFunctionImpl.makeFunction("setColumnNumber", NativeError.SET_COLUMNNUMBER);
jlaskey@3 1761 errorProto.addOwnProperty("columnNumber", Attribute.NOT_ENUMERABLE, getColumnNumber, setColumnNumber);
jlaskey@3 1762 final ScriptFunction getFileName = ScriptFunctionImpl.makeFunction("getFileName", NativeError.GET_FILENAME);
jlaskey@3 1763 final ScriptFunction setFileName = ScriptFunctionImpl.makeFunction("setFileName", NativeError.SET_FILENAME);
jlaskey@3 1764 errorProto.addOwnProperty("fileName", Attribute.NOT_ENUMERABLE, getFileName, setFileName);
jlaskey@3 1765
jlaskey@3 1766 // ECMA 15.11.4.2 Error.prototype.name
jlaskey@3 1767 // Error.prototype.name = "Error";
sundar@344 1768 errorProto.set(NativeError.NAME, "Error", false);
jlaskey@3 1769 // ECMA 15.11.4.3 Error.prototype.message
jlaskey@3 1770 // Error.prototype.message = "";
sundar@344 1771 errorProto.set(NativeError.MESSAGE, "", false);
jlaskey@3 1772
jlaskey@3 1773 this.builtinEvalError = initErrorSubtype("EvalError", errorProto);
jlaskey@3 1774 this.builtinRangeError = initErrorSubtype("RangeError", errorProto);
jlaskey@3 1775 this.builtinReferenceError = initErrorSubtype("ReferenceError", errorProto);
jlaskey@3 1776 this.builtinSyntaxError = initErrorSubtype("SyntaxError", errorProto);
jlaskey@3 1777 this.builtinTypeError = initErrorSubtype("TypeError", errorProto);
jlaskey@3 1778 this.builtinURIError = initErrorSubtype("URIError", errorProto);
jlaskey@3 1779 }
jlaskey@3 1780
jlaskey@3 1781 private ScriptFunction initErrorSubtype(final String name, final ScriptObject errorProto) {
jlaskey@3 1782 final ScriptObject cons = initConstructor(name);
jlaskey@3 1783 final ScriptObject prototype = ScriptFunction.getPrototype(cons);
sundar@344 1784 prototype.set(NativeError.NAME, name, false);
sundar@344 1785 prototype.set(NativeError.MESSAGE, "", false);
jlaskey@3 1786 prototype.setProto(errorProto);
jlaskey@3 1787 return (ScriptFunction)cons;
jlaskey@3 1788 }
jlaskey@3 1789
jlaskey@3 1790 private void initJavaAccess() {
jlaskey@3 1791 final ScriptObject objectProto = getObjectPrototype();
jlaskey@3 1792 this.builtinPackages = new NativeJavaPackage("", objectProto);
sundar@146 1793 this.builtinCom = new NativeJavaPackage("com", objectProto);
sundar@146 1794 this.builtinEdu = new NativeJavaPackage("edu", objectProto);
jlaskey@3 1795 this.builtinJava = new NativeJavaPackage("java", objectProto);
sundar@146 1796 this.builtinJavafx = new NativeJavaPackage("javafx", objectProto);
jlaskey@3 1797 this.builtinJavax = new NativeJavaPackage("javax", objectProto);
sundar@146 1798 this.builtinOrg = new NativeJavaPackage("org", objectProto);
jlaskey@3 1799 this.builtinJavaImporter = initConstructor("JavaImporter");
jlaskey@3 1800 this.builtinJavaApi = initConstructor("Java");
jlaskey@3 1801 }
jlaskey@3 1802
sundar@418 1803 private void initScripting(final ScriptEnvironment scriptEnv) {
jlaskey@3 1804 Object value;
jlaskey@3 1805 value = ScriptFunctionImpl.makeFunction("readLine", ScriptingFunctions.READLINE);
jlaskey@3 1806 addOwnProperty("readLine", Attribute.NOT_ENUMERABLE, value);
jlaskey@3 1807
sundar@52 1808 value = ScriptFunctionImpl.makeFunction("readFully", ScriptingFunctions.READFULLY);
sundar@52 1809 addOwnProperty("readFully", Attribute.NOT_ENUMERABLE, value);
jlaskey@3 1810
jlaskey@67 1811 final String execName = ScriptingFunctions.EXEC_NAME;
jlaskey@67 1812 value = ScriptFunctionImpl.makeFunction(execName, ScriptingFunctions.EXEC);
jlaskey@67 1813 addOwnProperty(execName, Attribute.NOT_ENUMERABLE, value);
jlaskey@67 1814
jlaskey@3 1815 // Nashorn extension: global.echo (scripting-mode-only)
jlaskey@3 1816 // alias for "print"
jlaskey@3 1817 value = get("print");
jlaskey@3 1818 addOwnProperty("echo", Attribute.NOT_ENUMERABLE, value);
jlaskey@3 1819
jlaskey@3 1820 // Nashorn extension: global.$OPTIONS (scripting-mode-only)
hannesw@380 1821 final ScriptObject options = newObject();
sundar@136 1822 copyOptions(options, scriptEnv);
sundar@136 1823 addOwnProperty("$OPTIONS", Attribute.NOT_ENUMERABLE, options);
jlaskey@67 1824
jlaskey@67 1825 // Nashorn extension: global.$ENV (scripting-mode-only)
sundar@69 1826 if (System.getSecurityManager() == null) {
sundar@69 1827 // do not fill $ENV if we have a security manager around
sundar@69 1828 // Retrieve current state of ENV variables.
hannesw@380 1829 final ScriptObject env = newObject();
sundar@541 1830 env.putAll(System.getenv(), scriptEnv._strict);
sundar@69 1831 addOwnProperty(ScriptingFunctions.ENV_NAME, Attribute.NOT_ENUMERABLE, env);
sundar@69 1832 } else {
sundar@69 1833 addOwnProperty(ScriptingFunctions.ENV_NAME, Attribute.NOT_ENUMERABLE, UNDEFINED);
sundar@69 1834 }
sundar@69 1835
sundar@69 1836 // add other special properties for exec support
sundar@69 1837 addOwnProperty(ScriptingFunctions.OUT_NAME, Attribute.NOT_ENUMERABLE, UNDEFINED);
sundar@69 1838 addOwnProperty(ScriptingFunctions.ERR_NAME, Attribute.NOT_ENUMERABLE, UNDEFINED);
sundar@69 1839 addOwnProperty(ScriptingFunctions.EXIT_NAME, Attribute.NOT_ENUMERABLE, UNDEFINED);
jlaskey@3 1840 }
jlaskey@3 1841
lagergren@139 1842 private static void copyOptions(final ScriptObject options, final ScriptEnvironment scriptEnv) {
sundar@492 1843 for (Field f : scriptEnv.getClass().getFields()) {
sundar@492 1844 try {
sundar@492 1845 options.set(f.getName(), f.get(scriptEnv), false);
sundar@492 1846 } catch (final IllegalArgumentException | IllegalAccessException exp) {
sundar@492 1847 throw new RuntimeException(exp);
sundar@136 1848 }
sundar@492 1849 }
sundar@136 1850 }
sundar@136 1851
jlaskey@3 1852 private void initTypedArray() {
jlaskey@3 1853 this.builtinArrayBuffer = initConstructor("ArrayBuffer");
jlaskey@3 1854 this.builtinInt8Array = initConstructor("Int8Array");
jlaskey@3 1855 this.builtinUint8Array = initConstructor("Uint8Array");
jlaskey@3 1856 this.builtinUint8ClampedArray = initConstructor("Uint8ClampedArray");
jlaskey@3 1857 this.builtinInt16Array = initConstructor("Int16Array");
jlaskey@3 1858 this.builtinUint16Array = initConstructor("Uint16Array");
jlaskey@3 1859 this.builtinInt32Array = initConstructor("Int32Array");
jlaskey@3 1860 this.builtinUint32Array = initConstructor("Uint32Array");
jlaskey@3 1861 this.builtinFloat32Array = initConstructor("Float32Array");
jlaskey@3 1862 this.builtinFloat64Array = initConstructor("Float64Array");
jlaskey@3 1863 }
jlaskey@3 1864
jlaskey@3 1865 private void copyBuiltins() {
jlaskey@3 1866 this.array = this.builtinArray;
jlaskey@3 1867 this._boolean = this.builtinBoolean;
jlaskey@3 1868 this.date = this.builtinDate;
jlaskey@3 1869 this.error = this.builtinError;
jlaskey@3 1870 this.evalError = this.builtinEvalError;
jlaskey@3 1871 this.function = this.builtinFunction;
jlaskey@3 1872 this.jsadapter = this.builtinJSAdapter;
jlaskey@3 1873 this.json = this.builtinJSON;
sundar@146 1874 this.com = this.builtinCom;
sundar@146 1875 this.edu = this.builtinEdu;
jlaskey@3 1876 this.java = this.builtinJava;
sundar@146 1877 this.javafx = this.builtinJavafx;
jlaskey@3 1878 this.javax = this.builtinJavax;
sundar@146 1879 this.org = this.builtinOrg;
jlaskey@3 1880 this.javaImporter = this.builtinJavaImporter;
jlaskey@3 1881 this.javaApi = this.builtinJavaApi;
jlaskey@3 1882 this.math = this.builtinMath;
jlaskey@3 1883 this.number = this.builtinNumber;
jlaskey@3 1884 this.object = this.builtinObject;
jlaskey@3 1885 this.packages = this.builtinPackages;
jlaskey@3 1886 this.rangeError = this.builtinRangeError;
jlaskey@3 1887 this.referenceError = this.builtinReferenceError;
jlaskey@3 1888 this.regexp = this.builtinRegExp;
jlaskey@3 1889 this.string = this.builtinString;
jlaskey@3 1890 this.syntaxError = this.builtinSyntaxError;
jlaskey@3 1891 this.typeError = this.builtinTypeError;
jlaskey@3 1892 this.uriError = this.builtinURIError;
jlaskey@3 1893 this.arrayBuffer = this.builtinArrayBuffer;
jlaskey@3 1894 this.int8Array = this.builtinInt8Array;
jlaskey@3 1895 this.uint8Array = this.builtinUint8Array;
jlaskey@3 1896 this.uint8ClampedArray = this.builtinUint8ClampedArray;
jlaskey@3 1897 this.int16Array = this.builtinInt16Array;
jlaskey@3 1898 this.uint16Array = this.builtinUint16Array;
jlaskey@3 1899 this.int32Array = this.builtinInt32Array;
jlaskey@3 1900 this.uint32Array = this.builtinUint32Array;
jlaskey@3 1901 this.float32Array = this.builtinFloat32Array;
jlaskey@3 1902 this.float64Array = this.builtinFloat64Array;
jlaskey@3 1903 }
jlaskey@3 1904
jlaskey@3 1905 private void initDebug() {
jlaskey@3 1906 this.addOwnProperty("Debug", Attribute.NOT_ENUMERABLE, initConstructor("Debug"));
jlaskey@3 1907 }
jlaskey@3 1908
lagergren@253 1909 @SuppressWarnings("resource")
jlaskey@3 1910 private static Object printImpl(final boolean newLine, final Object... objects) {
sundar@118 1911 final PrintWriter out = Global.getEnv().getOut();
jlaskey@315 1912 final StringBuilder sb = new StringBuilder();
jlaskey@3 1913
jlaskey@3 1914 for (final Object object : objects) {
jlaskey@315 1915 if (sb.length() != 0) {
jlaskey@315 1916 sb.append(' ');
jlaskey@3 1917 }
jlaskey@3 1918
jlaskey@315 1919 sb.append(JSType.toString(object));
jlaskey@3 1920 }
jlaskey@3 1921
jlaskey@315 1922 // Print all at once to ensure thread friendly result.
jlaskey@3 1923 if (newLine) {
jlaskey@315 1924 out.println(sb.toString());
jlaskey@315 1925 } else {
jlaskey@315 1926 out.print(sb.toString());
jlaskey@3 1927 }
jlaskey@3 1928
jlaskey@3 1929 out.flush();
jlaskey@3 1930
jlaskey@3 1931 return UNDEFINED;
jlaskey@3 1932 }
jlaskey@3 1933
jlaskey@3 1934 /**
jlaskey@3 1935 * These classes are generated by nasgen tool and so we have to use
jlaskey@3 1936 * reflection to load and create new instance of these classes.
jlaskey@3 1937 */
jlaskey@3 1938 private ScriptObject initConstructor(final String name) {
jlaskey@3 1939 try {
jlaskey@3 1940 // Assuming class name pattern for built-in JS constructors.
jlaskey@3 1941 final StringBuilder sb = new StringBuilder("jdk.nashorn.internal.objects.");
jlaskey@3 1942
jlaskey@3 1943 sb.append("Native");
jlaskey@3 1944 sb.append(name);
jlaskey@3 1945 sb.append("$Constructor");
jlaskey@3 1946
jlaskey@3 1947 final Class<?> funcClass = Class.forName(sb.toString());
jlaskey@3 1948 final ScriptObject res = (ScriptObject)funcClass.newInstance();
jlaskey@3 1949
jlaskey@3 1950 if (res instanceof ScriptFunction) {
jlaskey@3 1951 // All global constructor prototypes are not-writable,
jlaskey@3 1952 // not-enumerable and not-configurable.
jlaskey@3 1953 final ScriptFunction func = (ScriptFunction)res;
jlaskey@3 1954 func.modifyOwnProperty(func.getProperty("prototype"), Attribute.NON_ENUMERABLE_CONSTANT);
jlaskey@3 1955 }
jlaskey@3 1956
jlaskey@3 1957 if (res.getProto() == null) {
jlaskey@3 1958 res.setProto(getObjectPrototype());
jlaskey@3 1959 }
jlaskey@3 1960
jlaskey@3 1961 return res;
jlaskey@3 1962
jlaskey@3 1963 } catch (final ClassNotFoundException | InstantiationException | IllegalAccessException e) {
jlaskey@3 1964 throw new RuntimeException(e);
jlaskey@3 1965 }
jlaskey@3 1966 }
jlaskey@3 1967
sundar@418 1968 private void copyInitialMaps(final ScriptEnvironment env) {
sundar@414 1969 this.accessorPropertyDescriptorMap = AccessorPropertyDescriptor.getInitialMap().duplicate();
sundar@414 1970 this.dataPropertyDescriptorMap = DataPropertyDescriptor.getInitialMap().duplicate();
sundar@414 1971 this.genericPropertyDescriptorMap = GenericPropertyDescriptor.getInitialMap().duplicate();
sundar@414 1972 this.nativeArgumentsMap = NativeArguments.getInitialMap().duplicate();
sundar@414 1973 this.nativeArrayMap = NativeArray.getInitialMap().duplicate();
sundar@414 1974 this.nativeBooleanMap = NativeBoolean.getInitialMap().duplicate();
sundar@414 1975 this.nativeDateMap = NativeDate.getInitialMap().duplicate();
sundar@414 1976 this.nativeErrorMap = NativeError.getInitialMap().duplicate();
sundar@414 1977 this.nativeEvalErrorMap = NativeEvalError.getInitialMap().duplicate();
sundar@414 1978 this.nativeJSAdapterMap = NativeJSAdapter.getInitialMap().duplicate();
sundar@414 1979 this.nativeNumberMap = NativeNumber.getInitialMap().duplicate();
sundar@414 1980 this.nativeRangeErrorMap = NativeRangeError.getInitialMap().duplicate();
sundar@414 1981 this.nativeReferenceErrorMap = NativeReferenceError.getInitialMap().duplicate();
sundar@414 1982 this.nativeRegExpMap = NativeRegExp.getInitialMap().duplicate();
sundar@414 1983 this.nativeRegExpExecResultMap = NativeRegExpExecResult.getInitialMap().duplicate();
sundar@414 1984 this.nativeStrictArgumentsMap = NativeStrictArguments.getInitialMap().duplicate();
sundar@414 1985 this.nativeStringMap = NativeString.getInitialMap().duplicate();
sundar@414 1986 this.nativeSyntaxErrorMap = NativeSyntaxError.getInitialMap().duplicate();
sundar@414 1987 this.nativeTypeErrorMap = NativeTypeError.getInitialMap().duplicate();
sundar@414 1988 this.nativeURIErrorMap = NativeURIError.getInitialMap().duplicate();
sundar@414 1989 this.prototypeObjectMap = PrototypeObject.getInitialMap().duplicate();
sundar@414 1990 this.objectMap = JO.getInitialMap().duplicate();
sundar@418 1991 this.functionMap = ScriptFunctionImpl.getInitialMap().duplicate();
sundar@418 1992 this.anonymousFunctionMap = ScriptFunctionImpl.getInitialAnonymousMap().duplicate();
sundar@414 1993 this.strictFunctionMap = ScriptFunctionImpl.getInitialStrictMap().duplicate();
sundar@414 1994 this.boundFunctionMap = ScriptFunctionImpl.getInitialBoundMap().duplicate();
sundar@418 1995
sundar@418 1996 // java
sundar@418 1997 if (! env._no_java) {
sundar@418 1998 this.nativeJavaImporterMap = NativeJavaImporter.getInitialMap().duplicate();
sundar@418 1999 }
sundar@418 2000
sundar@418 2001 // typed arrays
sundar@418 2002 if (! env._no_typed_arrays) {
sundar@418 2003 this.arrayBufferViewMap = ArrayBufferView.getInitialMap().duplicate();
sundar@418 2004 this.nativeArrayBufferMap = NativeArrayBuffer.getInitialMap().duplicate();
sundar@418 2005 }
sundar@414 2006 }
sundar@414 2007
jlaskey@3 2008 // Function and Object constructors are inter-dependent. Also,
jlaskey@3 2009 // Function.prototype
jlaskey@3 2010 // functions are not properly initialized. We fix the references here.
jlaskey@3 2011 // NOTE: be careful if you want to re-order the operations here. You may
jlaskey@3 2012 // have
jlaskey@3 2013 // to play with object references carefully!!
jlaskey@3 2014 private void initFunctionAndObject() {
jlaskey@3 2015 // First-n-foremost is Function
jlaskey@3 2016 this.builtinFunction = (ScriptFunction)initConstructor("Function");
jlaskey@3 2017
jlaskey@3 2018 // create global anonymous function
sundar@418 2019 final ScriptFunction anon = ScriptFunctionImpl.newAnonymousFunction(this);
jlaskey@3 2020 // need to copy over members of Function.prototype to anon function
jlaskey@3 2021 anon.addBoundProperties(getFunctionPrototype());
jlaskey@3 2022
jlaskey@3 2023 // Function.prototype === Object.getPrototypeOf(Function) ===
jlaskey@3 2024 // <anon-function>
jlaskey@3 2025 builtinFunction.setProto(anon);
jlaskey@3 2026 builtinFunction.setPrototype(anon);
sundar@344 2027 anon.set("constructor", builtinFunction, false);
jlaskey@3 2028 anon.deleteOwnProperty(anon.getMap().findProperty("prototype"));
jlaskey@3 2029
sundar@690 2030 // use "getter" so that [[ThrowTypeError]] function's arity is 0 - as specified in step 10 of section 13.2.3
sundar@690 2031 this.typeErrorThrower = new ScriptFunctionImpl("TypeErrorThrower", Lookup.TYPE_ERROR_THROWER_GETTER, null, null, false, false, false);
sundar@690 2032 typeErrorThrower.setPrototype(UNDEFINED);
sundar@690 2033 // Non-constructor built-in functions do not have "prototype" property
sundar@690 2034 typeErrorThrower.deleteOwnProperty(typeErrorThrower.getMap().findProperty("prototype"));
sundar@690 2035 typeErrorThrower.preventExtensions();
sundar@690 2036
jlaskey@3 2037 // now initialize Object
jlaskey@3 2038 this.builtinObject = (ScriptFunction)initConstructor("Object");
jlaskey@3 2039 final ScriptObject ObjectPrototype = getObjectPrototype();
jlaskey@3 2040 // Object.getPrototypeOf(Function.prototype) === Object.prototype
jlaskey@3 2041 anon.setProto(ObjectPrototype);
jlaskey@3 2042
jlaskey@3 2043 // Function valued properties of Function.prototype were not properly
jlaskey@3 2044 // initialized. Because, these were created before global.function and
jlaskey@3 2045 // global.object were not initialized.
jlaskey@3 2046 jdk.nashorn.internal.runtime.Property[] properties = getFunctionPrototype().getMap().getProperties();
jlaskey@3 2047 for (final jdk.nashorn.internal.runtime.Property property : properties) {
jlaskey@3 2048 final Object key = property.getKey();
jlaskey@3 2049 final Object value = builtinFunction.get(key);
jlaskey@3 2050
jlaskey@3 2051 if (value instanceof ScriptFunction && value != anon) {
jlaskey@3 2052 final ScriptFunction func = (ScriptFunction)value;
jlaskey@3 2053 func.setProto(getFunctionPrototype());
jlaskey@3 2054 final ScriptObject prototype = ScriptFunction.getPrototype(func);
jlaskey@3 2055 if (prototype != null) {
jlaskey@3 2056 prototype.setProto(ObjectPrototype);
jlaskey@3 2057 }
jlaskey@3 2058 }
jlaskey@3 2059 }
jlaskey@3 2060
jlaskey@3 2061 // For function valued properties of Object and Object.prototype, make
jlaskey@3 2062 // sure prototype's proto chain ends with Object.prototype
jlaskey@3 2063 for (final jdk.nashorn.internal.runtime.Property property : builtinObject.getMap().getProperties()) {
jlaskey@3 2064 final Object key = property.getKey();
jlaskey@3 2065 final Object value = builtinObject.get(key);
jlaskey@3 2066
jlaskey@3 2067 if (value instanceof ScriptFunction) {
jlaskey@3 2068 final ScriptFunction func = (ScriptFunction)value;
jlaskey@3 2069 final ScriptObject prototype = ScriptFunction.getPrototype(func);
jlaskey@3 2070 if (prototype != null) {
jlaskey@3 2071 prototype.setProto(ObjectPrototype);
jlaskey@3 2072 }
jlaskey@3 2073 }
jlaskey@3 2074 }
jlaskey@3 2075
jlaskey@3 2076 properties = getObjectPrototype().getMap().getProperties();
jlaskey@3 2077 for (final jdk.nashorn.internal.runtime.Property property : properties) {
jlaskey@3 2078 final Object key = property.getKey();
jlaskey@3 2079 final Object value = ObjectPrototype.get(key);
jlaskey@3 2080
jlaskey@3 2081 if (key.equals("constructor")) {
jlaskey@3 2082 continue;
jlaskey@3 2083 }
jlaskey@3 2084
jlaskey@3 2085 if (value instanceof ScriptFunction) {
jlaskey@3 2086 final ScriptFunction func = (ScriptFunction)value;
jlaskey@3 2087 final ScriptObject prototype = ScriptFunction.getPrototype(func);
jlaskey@3 2088 if (prototype != null) {
jlaskey@3 2089 prototype.setProto(ObjectPrototype);
jlaskey@3 2090 }
jlaskey@3 2091 }
jlaskey@3 2092 }
jlaskey@3 2093 }
jlaskey@3 2094
jlaskey@3 2095 private static MethodHandle findOwnMH(final String name, final Class<?> rtype, final Class<?>... types) {
sundar@414 2096 return MH.findStatic(MethodHandles.lookup(), Global.class, name, MH.type(rtype, types));
jlaskey@3 2097 }
hannesw@79 2098
hannesw@114 2099 RegExpResult getLastRegExpResult() {
hannesw@114 2100 return lastRegExpResult;
hannesw@79 2101 }
hannesw@79 2102
hannesw@114 2103 void setLastRegExpResult(final RegExpResult regExpResult) {
hannesw@114 2104 this.lastRegExpResult = regExpResult;
hannesw@79 2105 }
hannesw@79 2106
jlaskey@3 2107 }

mercurial