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

Mon, 25 Mar 2013 18:20:16 +0530

author
sundar
date
Mon, 25 Mar 2013 18:20:16 +0530
changeset 146
15dac7439921
parent 139
390d44ba90cf
child 248
829b06307fb2
permissions
-rw-r--r--

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

mercurial