src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/objects/Global.java

Print this page




  37 import java.lang.invoke.MethodHandles;
  38 import java.lang.invoke.MethodType;
  39 import java.lang.invoke.SwitchPoint;
  40 import java.lang.reflect.Field;
  41 import java.util.ArrayList;
  42 import java.util.Arrays;
  43 import java.util.List;
  44 import java.util.Map;
  45 import java.util.Objects;
  46 import java.util.concurrent.Callable;
  47 import java.util.concurrent.ConcurrentHashMap;
  48 import javax.script.ScriptContext;
  49 import javax.script.ScriptEngine;
  50 import jdk.internal.dynalink.CallSiteDescriptor;
  51 import jdk.internal.dynalink.linker.GuardedInvocation;
  52 import jdk.internal.dynalink.linker.LinkRequest;
  53 import jdk.nashorn.api.scripting.ClassFilter;
  54 import jdk.nashorn.api.scripting.ScriptObjectMirror;
  55 import jdk.nashorn.internal.lookup.Lookup;
  56 import jdk.nashorn.internal.objects.annotations.Attribute;

  57 import jdk.nashorn.internal.objects.annotations.Property;
  58 import jdk.nashorn.internal.objects.annotations.ScriptClass;

  59 import jdk.nashorn.internal.runtime.Context;
  60 import jdk.nashorn.internal.runtime.ECMAErrors;
  61 import jdk.nashorn.internal.runtime.GlobalConstants;
  62 import jdk.nashorn.internal.runtime.GlobalFunctions;
  63 import jdk.nashorn.internal.runtime.JSType;
  64 import jdk.nashorn.internal.runtime.NativeJavaPackage;
  65 import jdk.nashorn.internal.runtime.PropertyDescriptor;
  66 import jdk.nashorn.internal.runtime.PropertyMap;
  67 import jdk.nashorn.internal.runtime.Scope;
  68 import jdk.nashorn.internal.runtime.ScriptEnvironment;
  69 import jdk.nashorn.internal.runtime.ScriptFunction;
  70 import jdk.nashorn.internal.runtime.ScriptObject;
  71 import jdk.nashorn.internal.runtime.ScriptRuntime;
  72 import jdk.nashorn.internal.runtime.ScriptingFunctions;
  73 import jdk.nashorn.internal.runtime.Specialization;
  74 import jdk.nashorn.internal.runtime.arrays.ArrayData;
  75 import jdk.nashorn.internal.runtime.linker.Bootstrap;
  76 import jdk.nashorn.internal.runtime.linker.InvokeByName;
  77 import jdk.nashorn.internal.runtime.linker.NashornCallSiteDescriptor;
  78 import jdk.nashorn.internal.runtime.regexp.RegExpResult;
  79 import jdk.nashorn.internal.scripts.JO;
  80 import jdk.nashorn.tools.ShellFunctions;
  81 
  82 /**
  83  * Representation of global scope.
  84  */
  85 @ScriptClass("Global")
  86 public final class Global extends ScriptObject implements Scope {
  87     // Placeholder value used in place of a location property (__FILE__, __DIR__, __LINE__)
  88     private static final Object LOCATION_PROPERTY_PLACEHOLDER = new Object();
  89     private final InvokeByName TO_STRING = new InvokeByName("toString", ScriptObject.class);
  90     private final InvokeByName VALUE_OF  = new InvokeByName("valueOf",  ScriptObject.class);
  91 



  92     /**
  93      * Optimistic builtin names that require switchpoint invalidation
  94      * upon assignment. Overly conservative, but works for now, to avoid
  95      * any complicated scope checks and especially heavy weight guards
  96      * like
  97      *
  98      * <pre>
  99      *     public boolean setterGuard(final Object receiver) {
 100      *         final Global          global = Global.instance();
 101      *         final ScriptObject    sobj   = global.getFunctionPrototype();
 102      *         final Object          apply  = sobj.get("apply");
 103      *         return apply == receiver;
 104      *     }
 105      * </pre>
 106      *
 107      * Naturally, checking for builtin classes like NativeFunction is cheaper,
 108      * it's when you start adding property checks for said builtins you have
 109      * problems with guard speed.
 110      */
 111 


 197     @Property(name = "Function", attributes = Attribute.NOT_ENUMERABLE)
 198     public volatile Object function;
 199 
 200     /** ECMA 15.1.4.3 Array constructor. */
 201     @Property(name = "Array", attributes = Attribute.NOT_ENUMERABLE)
 202     public volatile Object array;
 203 
 204     /** ECMA 15.1.4.4 String constructor */
 205     @Property(name = "String", attributes = Attribute.NOT_ENUMERABLE)
 206     public volatile Object string;
 207 
 208     /** ECMA 15.1.4.5 Boolean constructor */
 209     @Property(name = "Boolean", attributes = Attribute.NOT_ENUMERABLE)
 210     public volatile Object _boolean;
 211 
 212     /** ECMA 15.1.4.6 - Number constructor */
 213     @Property(name = "Number", attributes = Attribute.NOT_ENUMERABLE)
 214     public volatile Object number;
 215 
 216     /** ECMA 15.1.4.7 Date constructor */
 217     @Property(name = "Date", attributes = Attribute.NOT_ENUMERABLE)
 218     public volatile Object date;














 219 
 220     /** ECMA 15.1.4.8 RegExp constructor */
 221     @Property(name = "RegExp", attributes = Attribute.NOT_ENUMERABLE)
 222     public volatile Object regexp;














 223 
 224     /** ECMA 15.12 - The JSON object */
 225     @Property(name = "JSON", attributes = Attribute.NOT_ENUMERABLE)
 226     public volatile Object json;














 227 
 228     /** Nashorn extension: global.JSAdapter */
 229     @Property(name = "JSAdapter", attributes = Attribute.NOT_ENUMERABLE)
 230     public volatile Object jsadapter;














 231 
 232     /** ECMA 15.8 - The Math object */
 233     @Property(name = "Math", attributes = Attribute.NOT_ENUMERABLE)
 234     public volatile Object math;














 235 
 236     /** Error object */
 237     @Property(name = "Error", attributes = Attribute.NOT_ENUMERABLE)
 238     public volatile Object error;
 239 
 240     /** EvalError object */
 241     @Property(name = "EvalError", attributes = Attribute.NOT_ENUMERABLE)
 242     public volatile Object evalError;














 243 
 244     /** RangeError object */
 245     @Property(name = "RangeError", attributes = Attribute.NOT_ENUMERABLE)
 246     public volatile Object rangeError;














 247 
 248     /** ReferenceError object */
 249     @Property(name = "ReferenceError", attributes = Attribute.NOT_ENUMERABLE)
 250     public volatile Object referenceError;
 251 
 252     /** SyntaxError object */
 253     @Property(name = "SyntaxError", attributes = Attribute.NOT_ENUMERABLE)
 254     public volatile Object syntaxError;
 255 
 256     /** TypeError object */
 257     @Property(name = "TypeError", attributes = Attribute.NOT_ENUMERABLE)
 258     public volatile Object typeError;
 259 
 260     /** URIError object */
 261     @Property(name = "URIError", attributes = Attribute.NOT_ENUMERABLE)
 262     public volatile Object uriError;














 263 
 264     /** ArrayBuffer object */
 265     @Property(name = "ArrayBuffer", attributes = Attribute.NOT_ENUMERABLE)
 266     public volatile Object arrayBuffer;














 267 
 268     /** DataView object */
 269     @Property(name = "DataView", attributes = Attribute.NOT_ENUMERABLE)
 270     public volatile Object dataView;














 271 
 272     /** TypedArray (int8) */
 273     @Property(name = "Int8Array", attributes = Attribute.NOT_ENUMERABLE)
 274     public volatile Object int8Array;














 275 
 276     /** TypedArray (uint8) */
 277     @Property(name = "Uint8Array", attributes = Attribute.NOT_ENUMERABLE)
 278     public volatile Object uint8Array;














 279 
 280     /** TypedArray (uint8) - Clamped */
 281     @Property(name = "Uint8ClampedArray", attributes = Attribute.NOT_ENUMERABLE)
 282     public volatile Object uint8ClampedArray;














 283 
 284     /** TypedArray (int16) */
 285     @Property(name = "Int16Array", attributes = Attribute.NOT_ENUMERABLE)
 286     public volatile Object int16Array;














 287 
 288     /** TypedArray (uint16) */
 289     @Property(name = "Uint16Array", attributes = Attribute.NOT_ENUMERABLE)
 290     public volatile Object uint16Array;














 291 
 292     /** TypedArray (int32) */
 293     @Property(name = "Int32Array", attributes = Attribute.NOT_ENUMERABLE)
 294     public volatile Object int32Array;














 295 
 296     /** TypedArray (uint32) */
 297     @Property(name = "Uint32Array", attributes = Attribute.NOT_ENUMERABLE)
 298     public volatile Object uint32Array;














 299 
 300     /** TypedArray (float32) */
 301     @Property(name = "Float32Array", attributes = Attribute.NOT_ENUMERABLE)
 302     public volatile Object float32Array;














 303 
 304     /** TypedArray (float64) */
 305     @Property(name = "Float64Array", attributes = Attribute.NOT_ENUMERABLE)
 306     public volatile Object float64Array;














 307 
 308     /** Nashorn extension: Java access - global.Packages */
 309     @Property(name = "Packages", attributes = Attribute.NOT_ENUMERABLE)
 310     public volatile Object packages;
 311 
 312     /** Nashorn extension: Java access - global.com */
 313     @Property(attributes = Attribute.NOT_ENUMERABLE)
 314     public volatile Object com;
 315 
 316     /** Nashorn extension: Java access - global.edu */
 317     @Property(attributes = Attribute.NOT_ENUMERABLE)
 318     public volatile Object edu;
 319 
 320     /** Nashorn extension: Java access - global.java */
 321     @Property(attributes = Attribute.NOT_ENUMERABLE)
 322     public volatile Object java;
 323 
 324     /** Nashorn extension: Java access - global.javafx */
 325     @Property(attributes = Attribute.NOT_ENUMERABLE)
 326     public volatile Object javafx;
 327 
 328     /** Nashorn extension: Java access - global.javax */
 329     @Property(attributes = Attribute.NOT_ENUMERABLE)
 330     public volatile Object javax;
 331 
 332     /** Nashorn extension: Java access - global.org */
 333     @Property(attributes = Attribute.NOT_ENUMERABLE)
 334     public volatile Object org;
 335 
 336     /** Nashorn extension: Java access - global.javaImporter */
 337     @Property(name = "JavaImporter", attributes = Attribute.NOT_ENUMERABLE)
 338     public volatile Object javaImporter;














 339 
 340     /** Nashorn extension: global.Java Object constructor. */
 341     @Property(name = "Java", attributes = Attribute.NOT_ENUMERABLE)
 342     public volatile Object javaApi;














 343 
 344     /** Nashorn extension: current script's file name */
 345     @Property(name = "__FILE__", attributes = Attribute.NON_ENUMERABLE_CONSTANT)
 346     public final Object __FILE__ = LOCATION_PROPERTY_PLACEHOLDER;
 347 
 348     /** Nashorn extension: current script's directory */
 349     @Property(name = "__DIR__", attributes = Attribute.NON_ENUMERABLE_CONSTANT)
 350     public final Object __DIR__ = LOCATION_PROPERTY_PLACEHOLDER;
 351 
 352     /** Nashorn extension: current source line number being executed */
 353     @Property(name = "__LINE__", attributes = Attribute.NON_ENUMERABLE_CONSTANT)
 354     public final Object __LINE__ = LOCATION_PROPERTY_PLACEHOLDER;
 355 


 356     /** Used as Date.prototype's default value */
 357     public NativeDate   DEFAULT_DATE;




 358 
 359     /** Used as RegExp.prototype's default value */
 360     public NativeRegExp DEFAULT_REGEXP;


 361 
 362     /*
 363      * Built-in constructor objects: Even if user changes dynamic values of
 364      * "Object", "Array" etc., we still want to keep original values of these
 365      * constructors here. For example, we need to be able to create array,
 366      * regexp literals even after user overwrites global "Array" or "RegExp"
 367      * constructor - see also ECMA 262 spec. Annex D.
 368      */
 369     private ScriptFunction builtinFunction;
 370     private ScriptFunction builtinObject;
 371     private ScriptFunction builtinArray;
 372     private ScriptFunction builtinBoolean;
 373     private ScriptFunction builtinDate;
 374     private ScriptObject   builtinJSON;
 375     private ScriptFunction builtinJSAdapter;
 376     private ScriptObject   builtinMath;
 377     private ScriptFunction builtinNumber;
 378     private ScriptFunction builtinRegExp;
 379     private ScriptFunction builtinString;
 380     private ScriptFunction builtinError;


1040         return ScriptFunction.getPrototype(builtinObject);
1041     }
1042 
1043     ScriptObject getFunctionPrototype() {
1044         return ScriptFunction.getPrototype(builtinFunction);
1045     }
1046 
1047     ScriptObject getArrayPrototype() {
1048         return ScriptFunction.getPrototype(builtinArray);
1049     }
1050 
1051     ScriptObject getBooleanPrototype() {
1052         return ScriptFunction.getPrototype(builtinBoolean);
1053     }
1054 
1055     ScriptObject getNumberPrototype() {
1056         return ScriptFunction.getPrototype(builtinNumber);
1057     }
1058 
1059     ScriptObject getDatePrototype() {
1060         return ScriptFunction.getPrototype(builtinDate);
1061     }
1062 
1063     ScriptObject getRegExpPrototype() {
1064         return ScriptFunction.getPrototype(builtinRegExp);
1065     }
1066 
1067     ScriptObject getStringPrototype() {
1068         return ScriptFunction.getPrototype(builtinString);
1069     }
1070 
1071     ScriptObject getErrorPrototype() {
1072         return ScriptFunction.getPrototype(builtinError);
1073     }
1074 
1075     ScriptObject getEvalErrorPrototype() {
1076         return ScriptFunction.getPrototype(builtinEvalError);
1077     }
1078 
1079     ScriptObject getRangeErrorPrototype() {
1080         return ScriptFunction.getPrototype(builtinRangeError);
1081     }
1082 
1083     ScriptObject getReferenceErrorPrototype() {
1084         return ScriptFunction.getPrototype(builtinReferenceError);
1085     }
1086 
1087     ScriptObject getSyntaxErrorPrototype() {
1088         return ScriptFunction.getPrototype(builtinSyntaxError);
1089     }
1090 
1091     ScriptObject getTypeErrorPrototype() {
1092         return ScriptFunction.getPrototype(builtinTypeError);
1093     }
1094 
1095     ScriptObject getURIErrorPrototype() {
1096         return ScriptFunction.getPrototype(builtinURIError);
1097     }
1098 
1099     ScriptObject getJavaImporterPrototype() {
1100         return ScriptFunction.getPrototype(builtinJavaImporter);
1101     }
1102 
1103     ScriptObject getJSAdapterPrototype() {
1104         return ScriptFunction.getPrototype(builtinJSAdapter);







1105     }
1106 
1107     ScriptObject getArrayBufferPrototype() {
1108         return ScriptFunction.getPrototype(builtinArrayBuffer);







1109     }
1110 
1111     ScriptObject getDataViewPrototype() {
1112         return ScriptFunction.getPrototype(builtinDataView);







1113     }
1114 
1115     ScriptObject getInt8ArrayPrototype() {
1116         return ScriptFunction.getPrototype(builtinInt8Array);







1117     }
1118 
1119     ScriptObject getUint8ArrayPrototype() {
1120         return ScriptFunction.getPrototype(builtinUint8Array);







1121     }
1122 
1123     ScriptObject getUint8ClampedArrayPrototype() {
1124         return ScriptFunction.getPrototype(builtinUint8ClampedArray);







1125     }
1126 
1127     ScriptObject getInt16ArrayPrototype() {
1128         return ScriptFunction.getPrototype(builtinInt16Array);







1129     }
1130 
1131     ScriptObject getUint16ArrayPrototype() {
1132         return ScriptFunction.getPrototype(builtinUint16Array);







1133     }
1134 
1135     ScriptObject getInt32ArrayPrototype() {
1136         return ScriptFunction.getPrototype(builtinInt32Array);







1137     }
1138 
1139     ScriptObject getUint32ArrayPrototype() {
1140         return ScriptFunction.getPrototype(builtinUint32Array);







1141     }
1142 
1143     ScriptObject getFloat32ArrayPrototype() {
1144         return ScriptFunction.getPrototype(builtinFloat32Array);







1145     }
1146 
1147     ScriptObject getFloat64ArrayPrototype() {
1148         return ScriptFunction.getPrototype(builtinFloat64Array);
1149     }
1150 
1151     private ScriptFunction getBuiltinArray() {
1152         return builtinArray;
1153     }
1154 
1155     ScriptFunction getTypeErrorThrower() {
1156         return typeErrorThrower;
1157     }
1158 
1159     /**
1160      * Called from compiled script code to test if builtin has been overridden
1161      *
1162      * @return true if builtin array has not been overridden
1163      */
1164     public static boolean isBuiltinArray() {
1165         final Global instance = Global.instance();
1166         return instance.array == instance.getBuiltinArray();
1167     }
1168 
1169     private ScriptFunction getBuiltinBoolean() {
1170         return builtinBoolean;
1171     }
1172 
1173     /**
1174      * Called from compiled script code to test if builtin has been overridden
1175      *
1176      * @return true if builtin boolean has not been overridden
1177      */
1178     public static boolean isBuiltinBoolean() {
1179         final Global instance = Global.instance();
1180         return instance._boolean == instance.getBuiltinBoolean();
1181     }
1182 
1183     private ScriptFunction getBuiltinDate() {
1184         return builtinDate;






1185     }
1186 
1187     /**
1188      * Called from compiled script code to test if builtin has been overridden
1189      *
1190      * @return true if builtin date has not been overridden
1191      */
1192     public static boolean isBuiltinDate() {
1193         final Global instance = Global.instance();
1194         return instance.date == instance.getBuiltinDate();
1195     }
1196 
1197     private ScriptFunction getBuiltinError() {
1198         return builtinError;
1199     }
1200 
1201     /**
1202      * Called from compiled script code to test if builtin has been overridden
1203      *
1204      * @return true if builtin error has not been overridden
1205      */
1206     public static boolean isBuiltinError() {
1207         final Global instance = Global.instance();
1208         return instance.error == instance.getBuiltinError();
1209     }
1210 
1211     private ScriptFunction getBuiltinEvalError() {
1212         return builtinEvalError;



1213     }
1214 
1215     /**
1216      * Called from compiled script code to test if builtin has been overridden
1217      *
1218      * @return true if builtin eval error has not been overridden
1219      */
1220     public static boolean isBuiltinEvalError() {
1221         final Global instance = Global.instance();
1222         return instance.evalError == instance.getBuiltinEvalError();
1223     }
1224 
1225     private ScriptFunction getBuiltinFunction() {
1226         return builtinFunction;
1227     }
1228 
1229     /**
1230      * Called from compiled script code to test if builtin has been overridden
1231      *
1232      * @return true if builtin function has not been overridden
1233      */
1234     public static boolean isBuiltinFunction() {
1235         final Global instance = Global.instance();
1236         return instance.function == instance.getBuiltinFunction();
1237     }
1238 
1239     /**
1240      * Get the switchpoint used to check property changes for Function.prototype.apply
1241      * @return the switchpoint guarding apply (same as guarding call, and everything else in function)
1242      */


1253         final boolean isBuiltinFunction = instance.function == builtinFunction;
1254         return isBuiltinFunction && ScriptFunction.getPrototype(builtinFunction).getProperty(name).isBuiltin();
1255     }
1256 
1257     /**
1258      * Check if the Function.prototype.apply has not been replaced
1259      * @return true if Function.prototype.apply has been replaced
1260      */
1261     public static boolean isBuiltinFunctionPrototypeApply() {
1262         return isBuiltinFunctionProperty("apply");
1263     }
1264 
1265     /**
1266      * Check if the Function.prototype.apply has not been replaced
1267      * @return true if Function.prototype.call has been replaced
1268      */
1269     public static boolean isBuiltinFunctionPrototypeCall() {
1270         return isBuiltinFunctionProperty("call");
1271     }
1272 
1273     private ScriptFunction getBuiltinJSAdapter() {



1274         return builtinJSAdapter;
1275     }
1276 
1277     /**
1278      * Called from compiled script code to test if builtin has been overridden
1279      *
1280      * @return true if builtin JSAdapter has not been overridden
1281      */
1282     public static boolean isBuiltinJSAdapter() {
1283         final Global instance = Global.instance();
1284         return instance.jsadapter == instance.getBuiltinJSAdapter();
1285     }
1286 
1287     private ScriptObject getBuiltinJSON() {
1288         return builtinJSON;



1289     }
1290 
1291     /**
1292      * Called from compiled script code to test if builtin has been overridden
1293      *
1294      * @return true if builtin JSON has has not been overridden
1295      */
1296     public static boolean isBuiltinJSON() {
1297         final Global instance = Global.instance();
1298         return instance.json == instance.getBuiltinJSON();
1299     }
1300 
1301     private ScriptObject getBuiltinJava() {
1302         return builtinJava;
1303     }
1304 
1305     /**
1306      * Called from compiled script code to test if builtin has been overridden
1307      *
1308      * @return true if builtin Java has not been overridden
1309      */
1310     public static boolean isBuiltinJava() {
1311         final Global instance = Global.instance();
1312         return instance.java == instance.getBuiltinJava();
1313     }
1314 
1315     private ScriptObject getBuiltinJavax() {
1316         return builtinJavax;
1317     }
1318 
1319     /**
1320      * Called from compiled script code to test if builtin has been overridden
1321      *
1322      * @return true if builtin Javax has not been overridden
1323      */
1324     public static boolean isBuiltinJavax() {
1325         final Global instance = Global.instance();
1326         return instance.javax == instance.getBuiltinJavax();
1327     }
1328 
1329     private ScriptObject getBuiltinJavaImporter() {
1330         return builtinJavaImporter;










1331     }
1332 
1333     /**
1334      * Called from compiled script code to test if builtin has been overridden
1335      *
1336      * @return true if builtin Java importer has not been overridden
1337      */
1338     public static boolean isBuiltinJavaImporter() {
1339         final Global instance = Global.instance();
1340         return instance.javaImporter == instance.getBuiltinJavaImporter();
1341     }
1342 
1343     private ScriptObject getBuiltinMath() {
1344         return builtinMath;



1345     }
1346 
1347     /**
1348      * Called from compiled script code to test if builtin has been overridden
1349      *
1350      * @return true if builtin math has not been overridden
1351      */
1352     public static boolean isBuiltinMath() {
1353         final Global instance = Global.instance();
1354         return instance.math == instance.getBuiltinMath();
1355     }
1356 
1357     private ScriptFunction getBuiltinNumber() {
1358         return builtinNumber;
1359     }
1360 
1361     /**
1362      * Called from compiled script code to test if builtin has been overridden
1363      *
1364      * @return true if builtin number has not been overridden
1365      */
1366     public static boolean isBuiltinNumber() {
1367         final Global instance = Global.instance();
1368         return instance.number == instance.getBuiltinNumber();
1369     }
1370 
1371     private ScriptFunction getBuiltinObject() {
1372         return builtinObject;
1373     }
1374 


1379      */
1380     public static boolean isBuiltinObject() {
1381         final Global instance = Global.instance();
1382         return instance.object == instance.getBuiltinObject();
1383     }
1384 
1385     private ScriptObject getBuiltinPackages() {
1386         return builtinPackages;
1387     }
1388 
1389     /**
1390      * Called from compiled script code to test if builtin has been overridden
1391      *
1392      * @return true if builtin package has not been overridden
1393      */
1394     public static boolean isBuiltinPackages() {
1395         final Global instance = Global.instance();
1396         return instance.packages == instance.getBuiltinPackages();
1397     }
1398 
1399     private ScriptFunction getBuiltinRangeError() {



1400         return builtinRangeError;
1401     }
1402 
1403     /**
1404      * Called from compiled script code to test if builtin has been overridden
1405      *
1406      * @return true if builtin range error has not been overridden
1407      */
1408     public static boolean isBuiltinRangeError() {
1409         final Global instance = Global.instance();
1410         return instance.rangeError == instance.getBuiltinRangeError();
1411     }
1412 
1413     private ScriptFunction getBuiltinReferenceError() {
1414         return builtinReferenceError;
1415     }
1416 
1417     /**
1418      * Called from compiled script code to test if builtin has been overridden
1419      *
1420      * @return true if builtin reference error has not been overridden
1421      */
1422     public static boolean isBuiltinReferenceError() {
1423         final Global instance = Global.instance();
1424         return instance.referenceError == instance.getBuiltinReferenceError();
1425     }
1426 
1427     private ScriptFunction getBuiltinRegExp() {









1428         return builtinRegExp;
1429     }
1430 
1431     /**
1432      * Called from compiled script code to test if builtin has been overridden
1433      *
1434      * @return true if builtin regexp has not been overridden
1435      */
1436     public static boolean isBuiltinRegExp() {
1437         final Global instance = Global.instance();
1438         return instance.regexp == instance.getBuiltinRegExp();
1439     }
1440 
1441     private ScriptFunction getBuiltinString() {
1442         return builtinString;
1443     }
1444 
1445     /**
1446      * Called from compiled script code to test if builtin has been overridden
1447      *
1448      * @return true if builtin Java has not been overridden
1449      */
1450     public static boolean isBuiltinString() {
1451         final Global instance = Global.instance();
1452         return instance.string == instance.getBuiltinString();
1453     }
1454 
1455     private ScriptFunction getBuiltinSyntaxError() {
1456         return builtinSyntaxError;
1457     }
1458 


1463      */
1464     public static boolean isBuiltinSyntaxError() {
1465         final Global instance = Global.instance();
1466         return instance.syntaxError == instance.getBuiltinSyntaxError();
1467     }
1468 
1469     private ScriptFunction getBuiltinTypeError() {
1470         return builtinTypeError;
1471     }
1472 
1473     /**
1474      * Called from compiled script code to test if builtin has been overridden
1475      *
1476      * @return true if builtin type error has not been overridden
1477      */
1478     public static boolean isBuiltinTypeError() {
1479         final Global instance = Global.instance();
1480         return instance.typeError == instance.getBuiltinTypeError();
1481     }
1482 
1483     private ScriptFunction getBuiltinURIError() {
1484         return builtinURIError;



1485     }
1486 
1487     /**
1488      * Called from compiled script code to test if builtin has been overridden
1489      *
1490      * @return true if builtin URI error has not been overridden
1491      */
1492     public static boolean isBuiltinURIError() {
1493         final Global instance = Global.instance();
1494         return instance.uriError == instance.getBuiltinURIError();
1495     }
1496 
1497     @Override
1498     public String getClassName() {
1499         return "global";
1500     }
1501 
1502     /**
1503      * Copy function used to clone NativeRegExp objects.
1504      *
1505      * @param regexp a NativeRegExp to clone
1506      *
1507      * @return copy of the given regexp object
1508      */
1509     public static Object regExpCopy(final Object regexp) {
1510         return new NativeRegExp((NativeRegExp)regexp);
1511     }
1512 
1513     /**
1514      * Convert given object to NativeRegExp type.


1886                         new Specialization(GlobalFunctions.IS_NAN_J),
1887                         new Specialization(GlobalFunctions.IS_NAN_D) });
1888         this.parseFloat         = ScriptFunctionImpl.makeFunction("parseFloat", GlobalFunctions.PARSEFLOAT);
1889         this.isNaN              = ScriptFunctionImpl.makeFunction("isNaN",      GlobalFunctions.IS_NAN);
1890         this.isFinite           = ScriptFunctionImpl.makeFunction("isFinite",   GlobalFunctions.IS_FINITE);
1891         this.encodeURI          = ScriptFunctionImpl.makeFunction("encodeURI",  GlobalFunctions.ENCODE_URI);
1892         this.encodeURIComponent = ScriptFunctionImpl.makeFunction("encodeURIComponent", GlobalFunctions.ENCODE_URICOMPONENT);
1893         this.decodeURI          = ScriptFunctionImpl.makeFunction("decodeURI",  GlobalFunctions.DECODE_URI);
1894         this.decodeURIComponent = ScriptFunctionImpl.makeFunction("decodeURIComponent", GlobalFunctions.DECODE_URICOMPONENT);
1895         this.escape             = ScriptFunctionImpl.makeFunction("escape",     GlobalFunctions.ESCAPE);
1896         this.unescape           = ScriptFunctionImpl.makeFunction("unescape",   GlobalFunctions.UNESCAPE);
1897         this.print              = ScriptFunctionImpl.makeFunction("print",      env._print_no_newline ? PRINT : PRINTLN);
1898         this.load               = ScriptFunctionImpl.makeFunction("load",       LOAD);
1899         this.loadWithNewGlobal  = ScriptFunctionImpl.makeFunction("loadWithNewGlobal", LOAD_WITH_NEW_GLOBAL);
1900         this.exit               = ScriptFunctionImpl.makeFunction("exit",       EXIT);
1901         this.quit               = ScriptFunctionImpl.makeFunction("quit",       EXIT);
1902 
1903         // built-in constructors
1904         this.builtinArray     = initConstructorAndSwitchPoint("Array", ScriptFunction.class);
1905         this.builtinBoolean   = initConstructorAndSwitchPoint("Boolean", ScriptFunction.class);
1906         this.builtinDate      = initConstructorAndSwitchPoint("Date", ScriptFunction.class);
1907         this.builtinJSON      = initConstructorAndSwitchPoint("JSON", ScriptObject.class);
1908         this.builtinJSAdapter = initConstructorAndSwitchPoint("JSAdapter", ScriptFunction.class);
1909         this.builtinMath      = initConstructorAndSwitchPoint("Math", ScriptObject.class);
1910         this.builtinNumber    = initConstructorAndSwitchPoint("Number", ScriptFunction.class);
1911         this.builtinRegExp    = initConstructorAndSwitchPoint("RegExp", ScriptFunction.class);
1912         this.builtinString    = initConstructorAndSwitchPoint("String", ScriptFunction.class);
1913 
1914         // initialize String.prototype.length to 0
1915         // add String.prototype.length
1916         final ScriptObject stringPrototype = getStringPrototype();
1917         stringPrototype.addOwnProperty("length", Attribute.NON_ENUMERABLE_CONSTANT, 0.0);
1918 
1919         // set isArray flag on Array.prototype
1920         final ScriptObject arrayPrototype = getArrayPrototype();
1921         arrayPrototype.setIsArray();
1922 
1923         this.DEFAULT_DATE = new NativeDate(Double.NaN, this);
1924 
1925         // initialize default regexp object
1926         this.DEFAULT_REGEXP = new NativeRegExp("(?:)", this);
1927 
1928         // RegExp.prototype should behave like a RegExp object. So copy the
1929         // properties.
1930         final ScriptObject regExpProto = getRegExpPrototype();
1931         regExpProto.addBoundProperties(DEFAULT_REGEXP);
1932 
1933         // Error stuff
1934         initErrorObjects();
1935 
1936         // java access
1937         if (! env._no_java) {


1938             initJavaAccess();
1939         }
1940 
1941         if (! env._no_typed_arrays) {
1942             initTypedArray();










1943         }
1944 
1945         if (env._scripting) {
1946             initScripting(env);
1947         }
1948 
1949         if (Context.DEBUG) {
1950             boolean debugOkay;
1951             final SecurityManager sm = System.getSecurityManager();
1952             if (sm != null) {
1953                 try {
1954                     sm.checkPermission(new RuntimePermission(Context.NASHORN_DEBUG_MODE));
1955                     debugOkay = true;
1956                 } catch (final SecurityException ignored) {
1957                     // if no permission, don't initialize Debug object
1958                     debugOkay = false;
1959                 }
1960 
1961             } else {
1962                 debugOkay = true;


1996         errorProto.addOwnProperty("stack", Attribute.NOT_ENUMERABLE, getStack, setStack);
1997         final ScriptFunction getLineNumber = ScriptFunctionImpl.makeFunction("getLineNumber", NativeError.GET_LINENUMBER);
1998         final ScriptFunction setLineNumber = ScriptFunctionImpl.makeFunction("setLineNumber", NativeError.SET_LINENUMBER);
1999         errorProto.addOwnProperty("lineNumber", Attribute.NOT_ENUMERABLE, getLineNumber, setLineNumber);
2000         final ScriptFunction getColumnNumber = ScriptFunctionImpl.makeFunction("getColumnNumber", NativeError.GET_COLUMNNUMBER);
2001         final ScriptFunction setColumnNumber = ScriptFunctionImpl.makeFunction("setColumnNumber", NativeError.SET_COLUMNNUMBER);
2002         errorProto.addOwnProperty("columnNumber", Attribute.NOT_ENUMERABLE, getColumnNumber, setColumnNumber);
2003         final ScriptFunction getFileName = ScriptFunctionImpl.makeFunction("getFileName", NativeError.GET_FILENAME);
2004         final ScriptFunction setFileName = ScriptFunctionImpl.makeFunction("setFileName", NativeError.SET_FILENAME);
2005         errorProto.addOwnProperty("fileName", Attribute.NOT_ENUMERABLE, getFileName, setFileName);
2006 
2007         // ECMA 15.11.4.2 Error.prototype.name
2008         // Error.prototype.name = "Error";
2009         errorProto.set(NativeError.NAME, "Error", 0);
2010         // ECMA 15.11.4.3 Error.prototype.message
2011         // Error.prototype.message = "";
2012         errorProto.set(NativeError.MESSAGE, "", 0);
2013 
2014         tagBuiltinProperties("Error", builtinError);
2015 
2016         this.builtinEvalError = initErrorSubtype("EvalError", errorProto);
2017         this.builtinRangeError = initErrorSubtype("RangeError", errorProto);
2018         this.builtinReferenceError = initErrorSubtype("ReferenceError", errorProto);
2019         this.builtinSyntaxError = initErrorSubtype("SyntaxError", errorProto);
2020         this.builtinTypeError = initErrorSubtype("TypeError", errorProto);
2021         this.builtinURIError = initErrorSubtype("URIError", errorProto);
2022     }
2023 
2024     private ScriptFunction initErrorSubtype(final String name, final ScriptObject errorProto) {
2025         final ScriptFunction cons = initConstructor(name, ScriptFunction.class);
2026         final ScriptObject prototype = ScriptFunction.getPrototype(cons);
2027         prototype.set(NativeError.NAME, name, 0);
2028         prototype.set(NativeError.MESSAGE, "", 0);
2029         prototype.setInitialProto(errorProto);
2030         tagBuiltinProperties(name, cons);
2031         return cons;
2032     }
2033 
2034     private void initJavaAccess() {
2035         final ScriptObject objectProto = getObjectPrototype();
2036         this.builtinPackages = new NativeJavaPackage("", objectProto);
2037         this.builtinCom = new NativeJavaPackage("com", objectProto);
2038         this.builtinEdu = new NativeJavaPackage("edu", objectProto);
2039         this.builtinJava = new NativeJavaPackage("java", objectProto);
2040         this.builtinJavafx = new NativeJavaPackage("javafx", objectProto);
2041         this.builtinJavax = new NativeJavaPackage("javax", objectProto);
2042         this.builtinOrg = new NativeJavaPackage("org", objectProto);
2043         this.builtinJavaImporter = initConstructor("JavaImporter", ScriptFunction.class);
2044         this.builtinJavaApi = initConstructor("Java", ScriptObject.class);
2045     }
2046 
2047     private void initScripting(final ScriptEnvironment scriptEnv) {
2048         Object value;
2049         value = ScriptFunctionImpl.makeFunction("readLine", ScriptingFunctions.READLINE);
2050         addOwnProperty("readLine", Attribute.NOT_ENUMERABLE, value);
2051 
2052         value = ScriptFunctionImpl.makeFunction("readFully", ScriptingFunctions.READFULLY);
2053         addOwnProperty("readFully", Attribute.NOT_ENUMERABLE, value);
2054 
2055         final String execName = ScriptingFunctions.EXEC_NAME;
2056         value = ScriptFunctionImpl.makeFunction(execName, ScriptingFunctions.EXEC);
2057         addOwnProperty(execName, Attribute.NOT_ENUMERABLE, value);
2058 
2059         // Nashorn extension: global.echo (scripting-mode-only)
2060         // alias for "print"
2061         value = get("print");
2062         addOwnProperty("echo", Attribute.NOT_ENUMERABLE, value);
2063 
2064         // Nashorn extension: global.$OPTIONS (scripting-mode-only)


2076         } else {
2077             addOwnProperty(ScriptingFunctions.ENV_NAME, Attribute.NOT_ENUMERABLE, UNDEFINED);
2078         }
2079 
2080         // add other special properties for exec support
2081         addOwnProperty(ScriptingFunctions.OUT_NAME, Attribute.NOT_ENUMERABLE, UNDEFINED);
2082         addOwnProperty(ScriptingFunctions.ERR_NAME, Attribute.NOT_ENUMERABLE, UNDEFINED);
2083         addOwnProperty(ScriptingFunctions.EXIT_NAME, Attribute.NOT_ENUMERABLE, UNDEFINED);
2084     }
2085 
2086     private static void copyOptions(final ScriptObject options, final ScriptEnvironment scriptEnv) {
2087         for (final Field f : scriptEnv.getClass().getFields()) {
2088             try {
2089                 options.set(f.getName(), f.get(scriptEnv), 0);
2090             } catch (final IllegalArgumentException | IllegalAccessException exp) {
2091                 throw new RuntimeException(exp);
2092             }
2093         }
2094     }
2095 
2096     private void initTypedArray() {
2097         this.builtinArrayBuffer       = initConstructorAndSwitchPoint("ArrayBuffer", ScriptFunction.class);
2098         this.builtinDataView          = initConstructorAndSwitchPoint("DataView", ScriptFunction.class);
2099         this.builtinInt8Array         = initConstructorAndSwitchPoint("Int8Array", ScriptFunction.class);
2100         this.builtinUint8Array        = initConstructorAndSwitchPoint("Uint8Array", ScriptFunction.class);
2101         this.builtinUint8ClampedArray = initConstructorAndSwitchPoint("Uint8ClampedArray", ScriptFunction.class);
2102         this.builtinInt16Array        = initConstructorAndSwitchPoint("Int16Array", ScriptFunction.class);
2103         this.builtinUint16Array       = initConstructorAndSwitchPoint("Uint16Array", ScriptFunction.class);
2104         this.builtinInt32Array        = initConstructorAndSwitchPoint("Int32Array", ScriptFunction.class);
2105         this.builtinUint32Array       = initConstructorAndSwitchPoint("Uint32Array", ScriptFunction.class);
2106         this.builtinFloat32Array      = initConstructorAndSwitchPoint("Float32Array", ScriptFunction.class);
2107         this.builtinFloat64Array      = initConstructorAndSwitchPoint("Float64Array", ScriptFunction.class);
2108 
2109     }
2110 
2111     private void copyBuiltins() {
2112         this.array             = this.builtinArray;
2113         this._boolean          = this.builtinBoolean;
2114         this.date              = this.builtinDate;
2115         this.error             = this.builtinError;
2116         this.evalError         = this.builtinEvalError;
2117         this.function          = this.builtinFunction;
2118         this.jsadapter         = this.builtinJSAdapter;
2119         this.json              = this.builtinJSON;
2120         this.com               = this.builtinCom;
2121         this.edu               = this.builtinEdu;
2122         this.java              = this.builtinJava;
2123         this.javafx            = this.builtinJavafx;
2124         this.javax             = this.builtinJavax;
2125         this.org               = this.builtinOrg;
2126         this.javaImporter      = this.builtinJavaImporter;
2127         this.javaApi           = this.builtinJavaApi;
2128         this.math              = this.builtinMath;
2129         this.number            = this.builtinNumber;
2130         this.object            = this.builtinObject;
2131         this.packages          = this.builtinPackages;
2132         this.rangeError        = this.builtinRangeError;
2133         this.referenceError    = this.builtinReferenceError;
2134         this.regexp            = this.builtinRegExp;
2135         this.string            = this.builtinString;
2136         this.syntaxError       = this.builtinSyntaxError;
2137         this.typeError         = this.builtinTypeError;
2138         this.uriError          = this.builtinURIError;
2139         this.arrayBuffer       = this.builtinArrayBuffer;
2140         this.dataView          = this.builtinDataView;
2141         this.int8Array         = this.builtinInt8Array;
2142         this.uint8Array        = this.builtinUint8Array;
2143         this.uint8ClampedArray = this.builtinUint8ClampedArray;
2144         this.int16Array        = this.builtinInt16Array;
2145         this.uint16Array       = this.builtinUint16Array;
2146         this.int32Array        = this.builtinInt32Array;
2147         this.uint32Array       = this.builtinUint32Array;
2148         this.float32Array      = this.builtinFloat32Array;
2149         this.float64Array      = this.builtinFloat64Array;
2150     }
2151 
2152     private void initDebug() {
2153         this.addOwnProperty("Debug", Attribute.NOT_ENUMERABLE, initConstructor("Debug", ScriptObject.class));
2154     }
2155 
2156     private Object printImpl(final boolean newLine, final Object... objects) {
2157         @SuppressWarnings("resource")
2158         final PrintWriter out = scontext != null? new PrintWriter(scontext.getWriter()) : getContext().getEnv().getOut();
2159         final StringBuilder sb = new StringBuilder();
2160 
2161         for (final Object obj : objects) {
2162             if (sb.length() != 0) {
2163                 sb.append(' ');
2164             }
2165 
2166             sb.append(JSType.toString(obj));
2167         }
2168 
2169         // Print all at once to ensure thread friendly result.




  37 import java.lang.invoke.MethodHandles;
  38 import java.lang.invoke.MethodType;
  39 import java.lang.invoke.SwitchPoint;
  40 import java.lang.reflect.Field;
  41 import java.util.ArrayList;
  42 import java.util.Arrays;
  43 import java.util.List;
  44 import java.util.Map;
  45 import java.util.Objects;
  46 import java.util.concurrent.Callable;
  47 import java.util.concurrent.ConcurrentHashMap;
  48 import javax.script.ScriptContext;
  49 import javax.script.ScriptEngine;
  50 import jdk.internal.dynalink.CallSiteDescriptor;
  51 import jdk.internal.dynalink.linker.GuardedInvocation;
  52 import jdk.internal.dynalink.linker.LinkRequest;
  53 import jdk.nashorn.api.scripting.ClassFilter;
  54 import jdk.nashorn.api.scripting.ScriptObjectMirror;
  55 import jdk.nashorn.internal.lookup.Lookup;
  56 import jdk.nashorn.internal.objects.annotations.Attribute;
  57 import jdk.nashorn.internal.objects.annotations.Getter;
  58 import jdk.nashorn.internal.objects.annotations.Property;
  59 import jdk.nashorn.internal.objects.annotations.ScriptClass;
  60 import jdk.nashorn.internal.objects.annotations.Setter;
  61 import jdk.nashorn.internal.runtime.Context;
  62 import jdk.nashorn.internal.runtime.ECMAErrors;
  63 import jdk.nashorn.internal.runtime.GlobalConstants;
  64 import jdk.nashorn.internal.runtime.GlobalFunctions;
  65 import jdk.nashorn.internal.runtime.JSType;
  66 import jdk.nashorn.internal.runtime.NativeJavaPackage;
  67 import jdk.nashorn.internal.runtime.PropertyDescriptor;
  68 import jdk.nashorn.internal.runtime.PropertyMap;
  69 import jdk.nashorn.internal.runtime.Scope;
  70 import jdk.nashorn.internal.runtime.ScriptEnvironment;
  71 import jdk.nashorn.internal.runtime.ScriptFunction;
  72 import jdk.nashorn.internal.runtime.ScriptObject;
  73 import jdk.nashorn.internal.runtime.ScriptRuntime;
  74 import jdk.nashorn.internal.runtime.ScriptingFunctions;
  75 import jdk.nashorn.internal.runtime.Specialization;
  76 import jdk.nashorn.internal.runtime.arrays.ArrayData;
  77 import jdk.nashorn.internal.runtime.linker.Bootstrap;
  78 import jdk.nashorn.internal.runtime.linker.InvokeByName;
  79 import jdk.nashorn.internal.runtime.linker.NashornCallSiteDescriptor;
  80 import jdk.nashorn.internal.runtime.regexp.RegExpResult;
  81 import jdk.nashorn.internal.scripts.JO;
  82 import jdk.nashorn.tools.ShellFunctions;
  83 
  84 /**
  85  * Representation of global scope.
  86  */
  87 @ScriptClass("Global")
  88 public final class Global extends ScriptObject implements Scope {
  89     // Placeholder value used in place of a location property (__FILE__, __DIR__, __LINE__)
  90     private static final Object LOCATION_PROPERTY_PLACEHOLDER = new Object();
  91     private final InvokeByName TO_STRING = new InvokeByName("toString", ScriptObject.class);
  92     private final InvokeByName VALUE_OF  = new InvokeByName("valueOf",  ScriptObject.class);
  93 
  94     // placeholder value for lazily initialized global objects
  95     private static final Object LAZY_SENTINEL = new Object();
  96 
  97     /**
  98      * Optimistic builtin names that require switchpoint invalidation
  99      * upon assignment. Overly conservative, but works for now, to avoid
 100      * any complicated scope checks and especially heavy weight guards
 101      * like
 102      *
 103      * <pre>
 104      *     public boolean setterGuard(final Object receiver) {
 105      *         final Global          global = Global.instance();
 106      *         final ScriptObject    sobj   = global.getFunctionPrototype();
 107      *         final Object          apply  = sobj.get("apply");
 108      *         return apply == receiver;
 109      *     }
 110      * </pre>
 111      *
 112      * Naturally, checking for builtin classes like NativeFunction is cheaper,
 113      * it's when you start adding property checks for said builtins you have
 114      * problems with guard speed.
 115      */
 116 


 202     @Property(name = "Function", attributes = Attribute.NOT_ENUMERABLE)
 203     public volatile Object function;
 204 
 205     /** ECMA 15.1.4.3 Array constructor. */
 206     @Property(name = "Array", attributes = Attribute.NOT_ENUMERABLE)
 207     public volatile Object array;
 208 
 209     /** ECMA 15.1.4.4 String constructor */
 210     @Property(name = "String", attributes = Attribute.NOT_ENUMERABLE)
 211     public volatile Object string;
 212 
 213     /** ECMA 15.1.4.5 Boolean constructor */
 214     @Property(name = "Boolean", attributes = Attribute.NOT_ENUMERABLE)
 215     public volatile Object _boolean;
 216 
 217     /** ECMA 15.1.4.6 - Number constructor */
 218     @Property(name = "Number", attributes = Attribute.NOT_ENUMERABLE)
 219     public volatile Object number;
 220 
 221     /** ECMA 15.1.4.7 Date constructor */
 222     @Getter(name = "Date", attributes = Attribute.NOT_ENUMERABLE)
 223     public static Object getDate(final Object self) {
 224         final Global global = Global.instanceFrom(self);
 225         if (global.date == LAZY_SENTINEL) {
 226             global.date = global.getBuiltinDate();
 227         }
 228         return global.date;
 229     }
 230 
 231     @Setter(name = "Date", attributes = Attribute.NOT_ENUMERABLE)
 232     public static void setDate(final Object self, final Object value) {
 233         final Global global = Global.instanceFrom(self);
 234         global.date = value;
 235     }
 236 
 237     private volatile Object date = LAZY_SENTINEL;
 238 
 239     /** ECMA 15.1.4.8 RegExp constructor */
 240     @Getter(name = "RegExp", attributes = Attribute.NOT_ENUMERABLE)
 241     public static Object getRegExp(final Object self) {
 242         final Global global = Global.instanceFrom(self);
 243         if (global.regexp == LAZY_SENTINEL) {
 244             global.regexp = global.getBuiltinRegExp();
 245         }
 246         return global.regexp;
 247     }
 248 
 249     @Setter(name = "RegExp", attributes = Attribute.NOT_ENUMERABLE)
 250     public static void setRegExp(final Object self, final Object value) {
 251         final Global global = Global.instanceFrom(self);
 252         global.regexp = value;
 253     }
 254 
 255     private volatile Object regexp = LAZY_SENTINEL;
 256 
 257     /** ECMA 15.12 - The JSON object */
 258     @Getter(name = "JSON", attributes = Attribute.NOT_ENUMERABLE)
 259     public static Object getJSON(final Object self) {
 260         final Global global = Global.instanceFrom(self);
 261         if (global.json == LAZY_SENTINEL) {
 262             global.json = global.getBuiltinJSON();
 263         }
 264         return global.json;
 265     }
 266 
 267     @Setter(name = "JSON", attributes = Attribute.NOT_ENUMERABLE)
 268     public static void setJSON(final Object self, final Object value) {
 269         final Global global = Global.instanceFrom(self);
 270         global.json = value;
 271     }
 272 
 273     private volatile Object json = LAZY_SENTINEL;
 274 
 275     /** Nashorn extension: global.JSAdapter */
 276     @Getter(name = "JSAdapter", attributes = Attribute.NOT_ENUMERABLE)
 277     public static Object getJSAdapter(final Object self) {
 278         final Global global = Global.instanceFrom(self);
 279         if (global.jsadapter == LAZY_SENTINEL) {
 280             global.jsadapter = global.getBuiltinJSAdapter();
 281         }
 282         return global.jsadapter;
 283     }
 284 
 285     @Setter(name = "JSAdapter", attributes = Attribute.NOT_ENUMERABLE)
 286     public static void setJSAdapter(final Object self, final Object value) {
 287         final Global global = Global.instanceFrom(self);
 288         global.jsadapter = value;
 289     }
 290 
 291     private volatile Object jsadapter = LAZY_SENTINEL;
 292 
 293     /** ECMA 15.8 - The Math object */
 294     @Getter(name = "Math", attributes = Attribute.NOT_ENUMERABLE)
 295     public static Object getMath(final Object self) {
 296         final Global global = Global.instanceFrom(self);
 297         if (global.math == LAZY_SENTINEL) {
 298             global.math = global.getBuiltinMath();
 299         }
 300         return global.math;
 301     }
 302 
 303     @Setter(name = "Math", attributes = Attribute.NOT_ENUMERABLE)
 304     public static void setMath(final Object self, final Object value) {
 305         final Global global = Global.instanceFrom(self);
 306         global.math = value;
 307     }
 308 
 309     private volatile Object math = LAZY_SENTINEL;
 310 
 311     /** Error object */
 312     @Property(name = "Error", attributes = Attribute.NOT_ENUMERABLE)
 313     public volatile Object error;
 314 
 315     /** EvalError object */
 316     @Getter(name = "EvalError", attributes = Attribute.NOT_ENUMERABLE)
 317     public static Object getEvalError(final Object self) {
 318         final Global global = Global.instanceFrom(self);
 319         if (global.evalError == LAZY_SENTINEL) {
 320             global.evalError = global.getBuiltinEvalError();
 321         }
 322         return global.evalError;
 323     }
 324 
 325     @Setter(name = "EvalError", attributes = Attribute.NOT_ENUMERABLE)
 326     public static void setEvalError(final Object self, final Object value) {
 327         final Global global = Global.instanceFrom(self);
 328         global.evalError = value;
 329     }
 330 
 331     private volatile Object evalError = LAZY_SENTINEL;
 332 
 333     /** RangeError object */
 334     @Getter(name = "RangeError", attributes = Attribute.NOT_ENUMERABLE)
 335     public static Object getRangeError(final Object self) {
 336         final Global global = Global.instanceFrom(self);
 337         if (global.rangeError == LAZY_SENTINEL) {
 338             global.rangeError = global.getBuiltinRangeError();
 339         }
 340         return global.rangeError;
 341     }
 342 
 343     @Setter(name = "RangeError", attributes = Attribute.NOT_ENUMERABLE)
 344     public static void setRangeError(final Object self, final Object value) {
 345         final Global global = Global.instanceFrom(self);
 346         global.rangeError = value;
 347     }
 348 
 349     private volatile Object rangeError = LAZY_SENTINEL;
 350 
 351     /** ReferenceError object */
 352     @Property(name = "ReferenceError", attributes = Attribute.NOT_ENUMERABLE)
 353     public volatile Object referenceError;
 354 
 355     /** SyntaxError object */
 356     @Property(name = "SyntaxError", attributes = Attribute.NOT_ENUMERABLE)
 357     public volatile Object syntaxError;
 358 
 359     /** TypeError object */
 360     @Property(name = "TypeError", attributes = Attribute.NOT_ENUMERABLE)
 361     public volatile Object typeError;
 362 
 363     /** URIError object */
 364     @Getter(name = "URIError", attributes = Attribute.NOT_ENUMERABLE)
 365     public static Object getURIError(final Object self) {
 366         final Global global = Global.instanceFrom(self);
 367         if (global.uriError == LAZY_SENTINEL) {
 368             global.uriError = global.getBuiltinURIError();
 369         }
 370         return global.uriError;
 371     }
 372 
 373     @Setter(name = "URIError", attributes = Attribute.NOT_ENUMERABLE)
 374     public static void setURIError(final Object self, final Object value) {
 375         final Global global = Global.instanceFrom(self);
 376         global.uriError = value;
 377     }
 378 
 379     private volatile Object uriError = LAZY_SENTINEL;
 380 
 381     /** ArrayBuffer object */
 382     @Getter(name = "ArrayBuffer", attributes = Attribute.NOT_ENUMERABLE)
 383     public static Object getArrayBuffer(final Object self) {
 384         final Global global = Global.instanceFrom(self);
 385         if (global.arrayBuffer == LAZY_SENTINEL) {
 386             global.arrayBuffer = global.getBuiltinArrayBuffer();
 387         }
 388         return global.arrayBuffer;
 389     }
 390 
 391     @Setter(name = "ArrayBuffer", attributes = Attribute.NOT_ENUMERABLE)
 392     public static void setArrayBuffer(final Object self, final Object value) {
 393         final Global global = Global.instanceFrom(self);
 394         global.arrayBuffer = value;
 395     }
 396 
 397     private volatile Object arrayBuffer;
 398 
 399     /** DataView object */
 400     @Getter(name = "DataView", attributes = Attribute.NOT_ENUMERABLE)
 401     public static Object getDataView(final Object self) {
 402         final Global global = Global.instanceFrom(self);
 403         if (global.dataView == LAZY_SENTINEL) {
 404             global.dataView = global.getBuiltinDataView();
 405         }
 406         return global.dataView;
 407     }
 408 
 409     @Setter(name = "DataView", attributes = Attribute.NOT_ENUMERABLE)
 410     public static void setDataView(final Object self, final Object value) {
 411         final Global global = Global.instanceFrom(self);
 412         global.dataView = value;
 413     }
 414 
 415     private volatile Object dataView;
 416 
 417     /** TypedArray (int8) */
 418     @Getter(name = "Int8Array", attributes = Attribute.NOT_ENUMERABLE)
 419     public static Object getInt8Array(final Object self) {
 420         final Global global = Global.instanceFrom(self);
 421         if (global.int8Array == LAZY_SENTINEL) {
 422             global.int8Array = global.getBuiltinInt8Array();
 423         }
 424         return global.int8Array;
 425     }
 426 
 427     @Setter(name = "Int8Array", attributes = Attribute.NOT_ENUMERABLE)
 428     public static void setInt8Array(final Object self, final Object value) {
 429         final Global global = Global.instanceFrom(self);
 430         global.int8Array = value;
 431     }
 432 
 433     private volatile Object int8Array;
 434 
 435     /** TypedArray (uint8) */
 436     @Getter(name = "Uint8Array", attributes = Attribute.NOT_ENUMERABLE)
 437     public static Object getUint8Array(final Object self) {
 438         final Global global = Global.instanceFrom(self);
 439         if (global.uint8Array == LAZY_SENTINEL) {
 440             global.uint8Array = global.getBuiltinUint8Array();
 441         }
 442         return global.uint8Array;
 443     }
 444 
 445     @Setter(name = "Uint8Array", attributes = Attribute.NOT_ENUMERABLE)
 446     public static void setUint8Array(final Object self, final Object value) {
 447         final Global global = Global.instanceFrom(self);
 448         global.uint8Array = value;
 449     }
 450 
 451     private volatile Object uint8Array;
 452 
 453     /** TypedArray (uint8) - Clamped */
 454     @Getter(name = "Uint8ClampedArray", attributes = Attribute.NOT_ENUMERABLE)
 455     public static Object getUint8ClampedArray(final Object self) {
 456         final Global global = Global.instanceFrom(self);
 457         if (global.uint8ClampedArray == LAZY_SENTINEL) {
 458             global.uint8ClampedArray = global.getBuiltinUint8ClampedArray();
 459         }
 460         return global.uint8ClampedArray;
 461     }
 462 
 463     @Setter(name = "Uint8ClampedArray", attributes = Attribute.NOT_ENUMERABLE)
 464     public static void setUint8ClampedArray(final Object self, final Object value) {
 465         final Global global = Global.instanceFrom(self);
 466         global.uint8ClampedArray = value;
 467     }
 468 
 469     private volatile Object uint8ClampedArray;
 470 
 471     /** TypedArray (int16) */
 472     @Getter(name = "Int16Array", attributes = Attribute.NOT_ENUMERABLE)
 473     public static Object getInt16Array(final Object self) {
 474         final Global global = Global.instanceFrom(self);
 475         if (global.int16Array == LAZY_SENTINEL) {
 476             global.int16Array = global.getBuiltinInt16Array();
 477         }
 478         return global.int16Array;
 479     }
 480 
 481     @Setter(name = "Int16Array", attributes = Attribute.NOT_ENUMERABLE)
 482     public static void setInt16Array(final Object self, final Object value) {
 483         final Global global = Global.instanceFrom(self);
 484         global.int16Array = value;
 485     }
 486 
 487     private volatile Object int16Array;
 488 
 489     /** TypedArray (uint16) */
 490     @Getter(name = "Uint16Array", attributes = Attribute.NOT_ENUMERABLE)
 491     public static Object getUint16Array(final Object self) {
 492         final Global global = Global.instanceFrom(self);
 493         if (global.uint16Array == LAZY_SENTINEL) {
 494             global.uint16Array = global.getBuiltinUint16Array();
 495         }
 496         return global.uint16Array;
 497     }
 498 
 499     @Setter(name = "Uint16Array", attributes = Attribute.NOT_ENUMERABLE)
 500     public static void setUint16Array(final Object self, final Object value) {
 501         final Global global = Global.instanceFrom(self);
 502         global.uint16Array = value;
 503     }
 504 
 505     private volatile Object uint16Array;
 506 
 507     /** TypedArray (int32) */
 508     @Getter(name = "Int32Array", attributes = Attribute.NOT_ENUMERABLE)
 509     public static Object getInt32Array(final Object self) {
 510         final Global global = Global.instanceFrom(self);
 511         if (global.int32Array == LAZY_SENTINEL) {
 512             global.int32Array = global.getBuiltinInt32Array();
 513         }
 514         return global.int32Array;
 515     }
 516 
 517     @Setter(name = "Int32Array", attributes = Attribute.NOT_ENUMERABLE)
 518     public static void setInt32Array(final Object self, final Object value) {
 519         final Global global = Global.instanceFrom(self);
 520         global.int32Array = value;
 521     }
 522 
 523     private volatile Object int32Array;
 524 
 525     /** TypedArray (uint32) */
 526     @Getter(name = "Uint32Array", attributes = Attribute.NOT_ENUMERABLE)
 527     public static Object getUint32Array(final Object self) {
 528         final Global global = Global.instanceFrom(self);
 529         if (global.uint32Array == LAZY_SENTINEL) {
 530             global.uint32Array = global.getBuiltinUint32Array();
 531         }
 532         return global.uint32Array;
 533     }
 534 
 535     @Setter(name = "Uint32Array", attributes = Attribute.NOT_ENUMERABLE)
 536     public static void setUint32Array(final Object self, final Object value) {
 537         final Global global = Global.instanceFrom(self);
 538         global.uint32Array = value;
 539     }
 540 
 541     private volatile Object uint32Array;
 542 
 543     /** TypedArray (float32) */
 544     @Getter(name = "Float32Array", attributes = Attribute.NOT_ENUMERABLE)
 545     public static Object getFloat32Array(final Object self) {
 546         final Global global = Global.instanceFrom(self);
 547         if (global.float32Array == LAZY_SENTINEL) {
 548             global.float32Array = global.getBuiltinFloat32Array();
 549         }
 550         return global.float32Array;
 551     }
 552 
 553     @Setter(name = "Float32Array", attributes = Attribute.NOT_ENUMERABLE)
 554     public static void setFloat32Array(final Object self, final Object value) {
 555         final Global global = Global.instanceFrom(self);
 556         global.float32Array = value;
 557     }
 558 
 559     private volatile Object float32Array;
 560 
 561     /** TypedArray (float64) */
 562     @Getter(name = "Float64Array", attributes = Attribute.NOT_ENUMERABLE)
 563     public static Object getFloat64Array(final Object self) {
 564         final Global global = Global.instanceFrom(self);
 565         if (global.float64Array == LAZY_SENTINEL) {
 566             global.float64Array = global.getBuiltinFloat64Array();
 567         }
 568         return global.float64Array;
 569     }
 570 
 571     @Setter(name = "Float64Array", attributes = Attribute.NOT_ENUMERABLE)
 572     public static void setFloat64Array(final Object self, final Object value) {
 573         final Global global = Global.instanceFrom(self);
 574         global.float64Array = value;
 575     }
 576 
 577     private volatile Object float64Array;
 578 
 579     /** Nashorn extension: Java access - global.Packages */
 580     @Property(name = "Packages", attributes = Attribute.NOT_ENUMERABLE)
 581     public volatile Object packages;
 582 
 583     /** Nashorn extension: Java access - global.com */
 584     @Property(attributes = Attribute.NOT_ENUMERABLE)
 585     public volatile Object com;
 586 
 587     /** Nashorn extension: Java access - global.edu */
 588     @Property(attributes = Attribute.NOT_ENUMERABLE)
 589     public volatile Object edu;
 590 
 591     /** Nashorn extension: Java access - global.java */
 592     @Property(attributes = Attribute.NOT_ENUMERABLE)
 593     public volatile Object java;
 594 
 595     /** Nashorn extension: Java access - global.javafx */
 596     @Property(attributes = Attribute.NOT_ENUMERABLE)
 597     public volatile Object javafx;
 598 
 599     /** Nashorn extension: Java access - global.javax */
 600     @Property(attributes = Attribute.NOT_ENUMERABLE)
 601     public volatile Object javax;
 602 
 603     /** Nashorn extension: Java access - global.org */
 604     @Property(attributes = Attribute.NOT_ENUMERABLE)
 605     public volatile Object org;
 606 
 607     /** Nashorn extension: Java access - global.javaImporter */
 608     @Getter(name = "JavaImporter", attributes = Attribute.NOT_ENUMERABLE)
 609     public static Object getJavaImporter(final Object self) {
 610         final Global global = Global.instanceFrom(self);
 611         if (global.javaImporter == LAZY_SENTINEL) {
 612             global.javaImporter = global.getBuiltinJavaImporter();
 613         }
 614         return global.javaImporter;
 615     }
 616 
 617     @Setter(name = "JavaImporter", attributes = Attribute.NOT_ENUMERABLE)
 618     public static void setJavaImporter(final Object self, final Object value) {
 619         final Global global = Global.instanceFrom(self);
 620         global.javaImporter = value;
 621     }
 622 
 623     private volatile Object javaImporter;
 624 
 625     /** Nashorn extension: global.Java Object constructor. */
 626     @Getter(name = "Java", attributes = Attribute.NOT_ENUMERABLE)
 627     public static Object getJavaApi(final Object self) {
 628         final Global global = Global.instanceFrom(self);
 629         if (global.javaApi == LAZY_SENTINEL) {
 630             global.javaApi = global.getBuiltinJavaApi();
 631         }
 632         return global.javaApi;
 633     }
 634 
 635     @Setter(name = "Java", attributes = Attribute.NOT_ENUMERABLE)
 636     public static void setJavaApi(final Object self, final Object value) {
 637         final Global global = Global.instanceFrom(self);
 638         global.javaApi = value;
 639     }
 640 
 641     private volatile Object javaApi;
 642 
 643     /** Nashorn extension: current script's file name */
 644     @Property(name = "__FILE__", attributes = Attribute.NON_ENUMERABLE_CONSTANT)
 645     public final Object __FILE__ = LOCATION_PROPERTY_PLACEHOLDER;
 646 
 647     /** Nashorn extension: current script's directory */
 648     @Property(name = "__DIR__", attributes = Attribute.NON_ENUMERABLE_CONSTANT)
 649     public final Object __DIR__ = LOCATION_PROPERTY_PLACEHOLDER;
 650 
 651     /** Nashorn extension: current source line number being executed */
 652     @Property(name = "__LINE__", attributes = Attribute.NON_ENUMERABLE_CONSTANT)
 653     public final Object __LINE__ = LOCATION_PROPERTY_PLACEHOLDER;
 654 
 655     private volatile NativeDate DEFAULT_DATE;
 656 
 657     /** Used as Date.prototype's default value */
 658     NativeDate getDefaultDate() {
 659         return DEFAULT_DATE;
 660     }
 661 
 662     private volatile NativeRegExp DEFAULT_REGEXP;
 663 
 664     /** Used as RegExp.prototype's default value */
 665     NativeRegExp getDefaultRegExp() {
 666         return DEFAULT_REGEXP;
 667     }
 668 
 669     /*
 670      * Built-in constructor objects: Even if user changes dynamic values of
 671      * "Object", "Array" etc., we still want to keep original values of these
 672      * constructors here. For example, we need to be able to create array,
 673      * regexp literals even after user overwrites global "Array" or "RegExp"
 674      * constructor - see also ECMA 262 spec. Annex D.
 675      */
 676     private ScriptFunction builtinFunction;
 677     private ScriptFunction builtinObject;
 678     private ScriptFunction builtinArray;
 679     private ScriptFunction builtinBoolean;
 680     private ScriptFunction builtinDate;
 681     private ScriptObject   builtinJSON;
 682     private ScriptFunction builtinJSAdapter;
 683     private ScriptObject   builtinMath;
 684     private ScriptFunction builtinNumber;
 685     private ScriptFunction builtinRegExp;
 686     private ScriptFunction builtinString;
 687     private ScriptFunction builtinError;


1347         return ScriptFunction.getPrototype(builtinObject);
1348     }
1349 
1350     ScriptObject getFunctionPrototype() {
1351         return ScriptFunction.getPrototype(builtinFunction);
1352     }
1353 
1354     ScriptObject getArrayPrototype() {
1355         return ScriptFunction.getPrototype(builtinArray);
1356     }
1357 
1358     ScriptObject getBooleanPrototype() {
1359         return ScriptFunction.getPrototype(builtinBoolean);
1360     }
1361 
1362     ScriptObject getNumberPrototype() {
1363         return ScriptFunction.getPrototype(builtinNumber);
1364     }
1365 
1366     ScriptObject getDatePrototype() {
1367         return ScriptFunction.getPrototype(getBuiltinDate());
1368     }
1369 
1370     ScriptObject getRegExpPrototype() {
1371         return ScriptFunction.getPrototype(getBuiltinRegExp());
1372     }
1373 
1374     ScriptObject getStringPrototype() {
1375         return ScriptFunction.getPrototype(builtinString);
1376     }
1377 
1378     ScriptObject getErrorPrototype() {
1379         return ScriptFunction.getPrototype(builtinError);
1380     }
1381 
1382     ScriptObject getEvalErrorPrototype() {
1383         return ScriptFunction.getPrototype(getBuiltinEvalError());
1384     }
1385 
1386     ScriptObject getRangeErrorPrototype() {
1387         return ScriptFunction.getPrototype(getBuiltinRangeError());
1388     }
1389 
1390     ScriptObject getReferenceErrorPrototype() {
1391         return ScriptFunction.getPrototype(builtinReferenceError);
1392     }
1393 
1394     ScriptObject getSyntaxErrorPrototype() {
1395         return ScriptFunction.getPrototype(builtinSyntaxError);
1396     }
1397 
1398     ScriptObject getTypeErrorPrototype() {
1399         return ScriptFunction.getPrototype(builtinTypeError);
1400     }
1401 
1402     ScriptObject getURIErrorPrototype() {
1403         return ScriptFunction.getPrototype(getBuiltinURIError());
1404     }
1405 
1406     ScriptObject getJavaImporterPrototype() {
1407         return ScriptFunction.getPrototype(getBuiltinJavaImporter());
1408     }
1409 
1410     ScriptObject getJSAdapterPrototype() {
1411         return ScriptFunction.getPrototype(getBuiltinJSAdapter());
1412     }
1413 
1414     private synchronized ScriptFunction getBuiltinArrayBuffer() {
1415         if (this.builtinArrayBuffer == null) {
1416             this.builtinArrayBuffer = initConstructorAndSwitchPoint("ArrayBuffer", ScriptFunction.class);
1417         }
1418         return this.builtinArrayBuffer;
1419     }
1420 
1421     ScriptObject getArrayBufferPrototype() {
1422         return ScriptFunction.getPrototype(getBuiltinArrayBuffer());
1423     }
1424 
1425     private synchronized ScriptFunction getBuiltinDataView() {
1426         if (this.builtinDataView == null) {
1427             this.builtinDataView = initConstructorAndSwitchPoint("DataView", ScriptFunction.class);
1428         }
1429         return this.builtinDataView;
1430     }
1431 
1432     ScriptObject getDataViewPrototype() {
1433         return ScriptFunction.getPrototype(getBuiltinDataView());
1434     }
1435 
1436     private synchronized ScriptFunction getBuiltinInt8Array() {
1437         if (this.builtinInt8Array == null) {
1438             this.builtinInt8Array = initConstructorAndSwitchPoint("Int8Array", ScriptFunction.class);
1439         }
1440         return this.builtinInt8Array;
1441     }
1442 
1443     ScriptObject getInt8ArrayPrototype() {
1444         return ScriptFunction.getPrototype(getBuiltinInt8Array());
1445     }
1446 
1447     private synchronized ScriptFunction getBuiltinUint8Array() {
1448         if (this.builtinUint8Array == null) {
1449             this.builtinUint8Array = initConstructorAndSwitchPoint("Uint8Array", ScriptFunction.class);
1450         }
1451         return this.builtinUint8Array;
1452     }
1453 
1454     ScriptObject getUint8ArrayPrototype() {
1455         return ScriptFunction.getPrototype(getBuiltinUint8Array());
1456     }
1457 
1458     private synchronized ScriptFunction getBuiltinUint8ClampedArray() {
1459         if (this.builtinUint8ClampedArray == null) {
1460             this.builtinUint8ClampedArray = initConstructorAndSwitchPoint("Uint8ClampedArray", ScriptFunction.class);
1461         }
1462         return this.builtinUint8ClampedArray;
1463     }
1464 
1465     ScriptObject getUint8ClampedArrayPrototype() {
1466         return ScriptFunction.getPrototype(getBuiltinUint8ClampedArray());
1467     }
1468 
1469     private synchronized ScriptFunction getBuiltinInt16Array() {
1470         if (this.builtinInt16Array == null) {
1471             this.builtinInt16Array = initConstructorAndSwitchPoint("Int16Array", ScriptFunction.class);
1472         }
1473         return this.builtinInt16Array;
1474     }
1475 
1476     ScriptObject getInt16ArrayPrototype() {
1477         return ScriptFunction.getPrototype(getBuiltinInt16Array());
1478     }
1479 
1480     private synchronized ScriptFunction getBuiltinUint16Array() {
1481         if (this.builtinUint16Array == null) {
1482             this.builtinUint16Array = initConstructorAndSwitchPoint("Uint16Array", ScriptFunction.class);
1483         }
1484         return this.builtinUint16Array;
1485     }
1486 
1487     ScriptObject getUint16ArrayPrototype() {
1488         return ScriptFunction.getPrototype(getBuiltinUint16Array());
1489     }
1490 
1491     private synchronized ScriptFunction getBuiltinInt32Array() {
1492         if (this.builtinInt32Array == null) {
1493             this.builtinInt32Array = initConstructorAndSwitchPoint("Int32Array", ScriptFunction.class);
1494         }
1495         return this.builtinInt32Array;
1496     }
1497 
1498     ScriptObject getInt32ArrayPrototype() {
1499         return ScriptFunction.getPrototype(getBuiltinInt32Array());
1500     }
1501 
1502     private synchronized ScriptFunction getBuiltinUint32Array() {
1503         if (this.builtinUint32Array == null) {
1504             this.builtinUint32Array = initConstructorAndSwitchPoint("Uint32Array", ScriptFunction.class);
1505         }
1506         return this.builtinUint32Array;
1507     }
1508 
1509     ScriptObject getUint32ArrayPrototype() {
1510         return ScriptFunction.getPrototype(getBuiltinUint32Array());
1511     }
1512 
1513     private synchronized ScriptFunction getBuiltinFloat32Array() {
1514         if (this.builtinFloat32Array == null) {
1515             this.builtinFloat32Array = initConstructorAndSwitchPoint("Float32Array", ScriptFunction.class);
1516         }
1517         return this.builtinFloat32Array;
1518     }
1519 
1520     ScriptObject getFloat32ArrayPrototype() {
1521         return ScriptFunction.getPrototype(getBuiltinFloat32Array());
1522     }
1523 
1524     private synchronized ScriptFunction getBuiltinFloat64Array() {
1525         if (this.builtinFloat64Array == null) {
1526             this.builtinFloat64Array = initConstructorAndSwitchPoint("Float64Array", ScriptFunction.class);
1527         }
1528         return this.builtinFloat64Array;
1529     }
1530 
1531     ScriptObject getFloat64ArrayPrototype() {
1532         return ScriptFunction.getPrototype(getBuiltinFloat64Array());
1533     }
1534 
1535     private ScriptFunction getBuiltinArray() {
1536         return builtinArray;
1537     }
1538 
1539     ScriptFunction getTypeErrorThrower() {
1540         return typeErrorThrower;
1541     }
1542 
1543     /**
1544      * Called from compiled script code to test if builtin has been overridden
1545      *
1546      * @return true if builtin array has not been overridden
1547      */
1548     public static boolean isBuiltinArray() {
1549         final Global instance = Global.instance();
1550         return instance.array == instance.getBuiltinArray();
1551     }
1552 
1553     private ScriptFunction getBuiltinBoolean() {
1554         return builtinBoolean;
1555     }
1556 
1557     /**
1558      * Called from compiled script code to test if builtin has been overridden
1559      *
1560      * @return true if builtin boolean has not been overridden
1561      */
1562     public static boolean isBuiltinBoolean() {
1563         final Global instance = Global.instance();
1564         return instance._boolean == instance.getBuiltinBoolean();
1565     }
1566 
1567     private synchronized ScriptFunction getBuiltinDate() {
1568         if (this.builtinDate == null) {
1569             this.builtinDate = initConstructorAndSwitchPoint("Date", ScriptFunction.class);
1570             final ScriptObject dateProto = ScriptFunction.getPrototype(builtinDate);
1571             // initialize default date
1572             this.DEFAULT_DATE = new NativeDate(NaN, dateProto);
1573         }
1574         return this.builtinDate;
1575     }
1576 
1577     /**
1578      * Called from compiled script code to test if builtin has been overridden
1579      *
1580      * @return true if builtin date has not been overridden
1581      */
1582     public static boolean isBuiltinDate() {
1583         final Global instance = Global.instance();
1584         return instance.date == LAZY_SENTINEL || instance.date == instance.getBuiltinDate();
1585     }
1586 
1587     private ScriptFunction getBuiltinError() {
1588         return builtinError;
1589     }
1590 
1591     /**
1592      * Called from compiled script code to test if builtin has been overridden
1593      *
1594      * @return true if builtin error has not been overridden
1595      */
1596     public static boolean isBuiltinError() {
1597         final Global instance = Global.instance();
1598         return instance.error == instance.getBuiltinError();
1599     }
1600 
1601     private synchronized ScriptFunction getBuiltinEvalError() {
1602         if (this.builtinEvalError == null) {
1603             this.builtinEvalError = initErrorSubtype("EvalError", getErrorPrototype());
1604         }
1605         return this.builtinEvalError;
1606     }
1607 
1608     /**
1609      * Called from compiled script code to test if builtin has been overridden
1610      *
1611      * @return true if builtin eval error has not been overridden
1612      */
1613     public static boolean isBuiltinEvalError() {
1614         final Global instance = Global.instance();
1615         return instance.evalError == LAZY_SENTINEL || instance.evalError == instance.getBuiltinEvalError();
1616     }
1617 
1618     private ScriptFunction getBuiltinFunction() {
1619         return builtinFunction;
1620     }
1621 
1622     /**
1623      * Called from compiled script code to test if builtin has been overridden
1624      *
1625      * @return true if builtin function has not been overridden
1626      */
1627     public static boolean isBuiltinFunction() {
1628         final Global instance = Global.instance();
1629         return instance.function == instance.getBuiltinFunction();
1630     }
1631 
1632     /**
1633      * Get the switchpoint used to check property changes for Function.prototype.apply
1634      * @return the switchpoint guarding apply (same as guarding call, and everything else in function)
1635      */


1646         final boolean isBuiltinFunction = instance.function == builtinFunction;
1647         return isBuiltinFunction && ScriptFunction.getPrototype(builtinFunction).getProperty(name).isBuiltin();
1648     }
1649 
1650     /**
1651      * Check if the Function.prototype.apply has not been replaced
1652      * @return true if Function.prototype.apply has been replaced
1653      */
1654     public static boolean isBuiltinFunctionPrototypeApply() {
1655         return isBuiltinFunctionProperty("apply");
1656     }
1657 
1658     /**
1659      * Check if the Function.prototype.apply has not been replaced
1660      * @return true if Function.prototype.call has been replaced
1661      */
1662     public static boolean isBuiltinFunctionPrototypeCall() {
1663         return isBuiltinFunctionProperty("call");
1664     }
1665 
1666     private synchronized ScriptFunction getBuiltinJSAdapter() {
1667         if (this.builtinJSAdapter == null) {
1668             this.builtinJSAdapter = initConstructorAndSwitchPoint("JSAdapter", ScriptFunction.class);
1669         }
1670         return builtinJSAdapter;
1671     }
1672 
1673     /**
1674      * Called from compiled script code to test if builtin has been overridden
1675      *
1676      * @return true if builtin JSAdapter has not been overridden
1677      */
1678     public static boolean isBuiltinJSAdapter() {
1679         final Global instance = Global.instance();
1680         return instance.jsadapter == LAZY_SENTINEL || instance.jsadapter == instance.getBuiltinJSAdapter();
1681     }
1682 
1683     private synchronized ScriptObject getBuiltinJSON() {
1684         if (this.builtinJSON == null) {
1685             this.builtinJSON = initConstructorAndSwitchPoint("JSON", ScriptObject.class);
1686         }
1687         return this.builtinJSON;
1688     }
1689 
1690     /**
1691      * Called from compiled script code to test if builtin has been overridden
1692      *
1693      * @return true if builtin JSON has has not been overridden
1694      */
1695     public static boolean isBuiltinJSON() {
1696         final Global instance = Global.instance();
1697         return instance.json == LAZY_SENTINEL || instance.json == instance.getBuiltinJSON();
1698     }
1699 
1700     private ScriptObject getBuiltinJava() {
1701         return builtinJava;
1702     }
1703 
1704     /**
1705      * Called from compiled script code to test if builtin has been overridden
1706      *
1707      * @return true if builtin Java has not been overridden
1708      */
1709     public static boolean isBuiltinJava() {
1710         final Global instance = Global.instance();
1711         return instance.java == instance.getBuiltinJava();
1712     }
1713 
1714     private ScriptObject getBuiltinJavax() {
1715         return builtinJavax;
1716     }
1717 
1718     /**
1719      * Called from compiled script code to test if builtin has been overridden
1720      *
1721      * @return true if builtin Javax has not been overridden
1722      */
1723     public static boolean isBuiltinJavax() {
1724         final Global instance = Global.instance();
1725         return instance.javax == instance.getBuiltinJavax();
1726     }
1727 
1728     private synchronized ScriptFunction getBuiltinJavaImporter() {
1729         if (this.builtinJavaImporter == null) {
1730             this.builtinJavaImporter = initConstructor("JavaImporter", ScriptFunction.class);
1731         }
1732         return this.builtinJavaImporter;
1733     }
1734 
1735     private synchronized ScriptObject getBuiltinJavaApi() {
1736         if (this.builtinJavaApi == null) {
1737             this.builtinJavaApi = initConstructor("Java", ScriptObject.class);
1738         }
1739         return this.builtinJavaApi;
1740     }
1741 
1742     /**
1743      * Called from compiled script code to test if builtin has been overridden
1744      *
1745      * @return true if builtin Java importer has not been overridden
1746      */
1747     public static boolean isBuiltinJavaImporter() {
1748         final Global instance = Global.instance();
1749         return instance.javaImporter == LAZY_SENTINEL || instance.javaImporter == instance.getBuiltinJavaImporter();
1750     }
1751 
1752     private synchronized ScriptObject getBuiltinMath() {
1753         if (this.builtinMath == null) {
1754             this.builtinMath = initConstructorAndSwitchPoint("Math", ScriptObject.class);
1755         }
1756         return this.builtinMath;
1757     }
1758 
1759     /**
1760      * Called from compiled script code to test if builtin has been overridden
1761      *
1762      * @return true if builtin math has not been overridden
1763      */
1764     public static boolean isBuiltinMath() {
1765         final Global instance = Global.instance();
1766         return instance.math == LAZY_SENTINEL || instance.math == instance.getBuiltinMath();
1767     }
1768 
1769     private ScriptFunction getBuiltinNumber() {
1770         return builtinNumber;
1771     }
1772 
1773     /**
1774      * Called from compiled script code to test if builtin has been overridden
1775      *
1776      * @return true if builtin number has not been overridden
1777      */
1778     public static boolean isBuiltinNumber() {
1779         final Global instance = Global.instance();
1780         return instance.number == instance.getBuiltinNumber();
1781     }
1782 
1783     private ScriptFunction getBuiltinObject() {
1784         return builtinObject;
1785     }
1786 


1791      */
1792     public static boolean isBuiltinObject() {
1793         final Global instance = Global.instance();
1794         return instance.object == instance.getBuiltinObject();
1795     }
1796 
1797     private ScriptObject getBuiltinPackages() {
1798         return builtinPackages;
1799     }
1800 
1801     /**
1802      * Called from compiled script code to test if builtin has been overridden
1803      *
1804      * @return true if builtin package has not been overridden
1805      */
1806     public static boolean isBuiltinPackages() {
1807         final Global instance = Global.instance();
1808         return instance.packages == instance.getBuiltinPackages();
1809     }
1810 
1811     private synchronized ScriptFunction getBuiltinRangeError() {
1812         if (this.builtinRangeError == null) {
1813             this.builtinRangeError = initErrorSubtype("RangeError", getErrorPrototype());
1814         }
1815         return builtinRangeError;
1816     }
1817 
1818     /**
1819      * Called from compiled script code to test if builtin has been overridden
1820      *
1821      * @return true if builtin range error has not been overridden
1822      */
1823     public static boolean isBuiltinRangeError() {
1824         final Global instance = Global.instance();
1825         return instance.rangeError == LAZY_SENTINEL || instance.rangeError == instance.getBuiltinRangeError();
1826     }
1827 
1828     private synchronized ScriptFunction getBuiltinReferenceError() {
1829         return builtinReferenceError;
1830     }
1831 
1832     /**
1833      * Called from compiled script code to test if builtin has been overridden
1834      *
1835      * @return true if builtin reference error has not been overridden
1836      */
1837     public static boolean isBuiltinReferenceError() {
1838         final Global instance = Global.instance();
1839         return instance.referenceError == instance.getBuiltinReferenceError();
1840     }
1841 
1842     private synchronized ScriptFunction getBuiltinRegExp() {
1843         if (this.builtinRegExp == null) {
1844             this.builtinRegExp = initConstructorAndSwitchPoint("RegExp", ScriptFunction.class);
1845             final ScriptObject regExpProto = ScriptFunction.getPrototype(builtinRegExp);
1846             // initialize default regexp object
1847             this.DEFAULT_REGEXP = new NativeRegExp("(?:)", "", this, regExpProto);
1848             // RegExp.prototype should behave like a RegExp object. So copy the
1849             // properties.
1850             regExpProto.addBoundProperties(DEFAULT_REGEXP);
1851         }
1852         return builtinRegExp;
1853     }
1854 
1855     /**
1856      * Called from compiled script code to test if builtin has been overridden
1857      *
1858      * @return true if builtin regexp has not been overridden
1859      */
1860     public static boolean isBuiltinRegExp() {
1861         final Global instance = Global.instance();
1862         return instance.regexp == LAZY_SENTINEL || instance.regexp == instance.getBuiltinRegExp();
1863     }
1864 
1865     private ScriptFunction getBuiltinString() {
1866         return builtinString;
1867     }
1868 
1869     /**
1870      * Called from compiled script code to test if builtin has been overridden
1871      *
1872      * @return true if builtin Java has not been overridden
1873      */
1874     public static boolean isBuiltinString() {
1875         final Global instance = Global.instance();
1876         return instance.string == instance.getBuiltinString();
1877     }
1878 
1879     private ScriptFunction getBuiltinSyntaxError() {
1880         return builtinSyntaxError;
1881     }
1882 


1887      */
1888     public static boolean isBuiltinSyntaxError() {
1889         final Global instance = Global.instance();
1890         return instance.syntaxError == instance.getBuiltinSyntaxError();
1891     }
1892 
1893     private ScriptFunction getBuiltinTypeError() {
1894         return builtinTypeError;
1895     }
1896 
1897     /**
1898      * Called from compiled script code to test if builtin has been overridden
1899      *
1900      * @return true if builtin type error has not been overridden
1901      */
1902     public static boolean isBuiltinTypeError() {
1903         final Global instance = Global.instance();
1904         return instance.typeError == instance.getBuiltinTypeError();
1905     }
1906 
1907     private synchronized ScriptFunction getBuiltinURIError() {
1908         if (this.builtinURIError == null) {
1909             this.builtinURIError = initErrorSubtype("URIError", getErrorPrototype());
1910         }
1911         return this.builtinURIError;
1912     }
1913 
1914     /**
1915      * Called from compiled script code to test if builtin has been overridden
1916      *
1917      * @return true if builtin URI error has not been overridden
1918      */
1919     public static boolean isBuiltinURIError() {
1920         final Global instance = Global.instance();
1921         return instance.uriError == LAZY_SENTINEL || instance.uriError == instance.getBuiltinURIError();
1922     }
1923 
1924     @Override
1925     public String getClassName() {
1926         return "global";
1927     }
1928 
1929     /**
1930      * Copy function used to clone NativeRegExp objects.
1931      *
1932      * @param regexp a NativeRegExp to clone
1933      *
1934      * @return copy of the given regexp object
1935      */
1936     public static Object regExpCopy(final Object regexp) {
1937         return new NativeRegExp((NativeRegExp)regexp);
1938     }
1939 
1940     /**
1941      * Convert given object to NativeRegExp type.


2313                         new Specialization(GlobalFunctions.IS_NAN_J),
2314                         new Specialization(GlobalFunctions.IS_NAN_D) });
2315         this.parseFloat         = ScriptFunctionImpl.makeFunction("parseFloat", GlobalFunctions.PARSEFLOAT);
2316         this.isNaN              = ScriptFunctionImpl.makeFunction("isNaN",      GlobalFunctions.IS_NAN);
2317         this.isFinite           = ScriptFunctionImpl.makeFunction("isFinite",   GlobalFunctions.IS_FINITE);
2318         this.encodeURI          = ScriptFunctionImpl.makeFunction("encodeURI",  GlobalFunctions.ENCODE_URI);
2319         this.encodeURIComponent = ScriptFunctionImpl.makeFunction("encodeURIComponent", GlobalFunctions.ENCODE_URICOMPONENT);
2320         this.decodeURI          = ScriptFunctionImpl.makeFunction("decodeURI",  GlobalFunctions.DECODE_URI);
2321         this.decodeURIComponent = ScriptFunctionImpl.makeFunction("decodeURIComponent", GlobalFunctions.DECODE_URICOMPONENT);
2322         this.escape             = ScriptFunctionImpl.makeFunction("escape",     GlobalFunctions.ESCAPE);
2323         this.unescape           = ScriptFunctionImpl.makeFunction("unescape",   GlobalFunctions.UNESCAPE);
2324         this.print              = ScriptFunctionImpl.makeFunction("print",      env._print_no_newline ? PRINT : PRINTLN);
2325         this.load               = ScriptFunctionImpl.makeFunction("load",       LOAD);
2326         this.loadWithNewGlobal  = ScriptFunctionImpl.makeFunction("loadWithNewGlobal", LOAD_WITH_NEW_GLOBAL);
2327         this.exit               = ScriptFunctionImpl.makeFunction("exit",       EXIT);
2328         this.quit               = ScriptFunctionImpl.makeFunction("quit",       EXIT);
2329 
2330         // built-in constructors
2331         this.builtinArray     = initConstructorAndSwitchPoint("Array", ScriptFunction.class);
2332         this.builtinBoolean   = initConstructorAndSwitchPoint("Boolean", ScriptFunction.class);




2333         this.builtinNumber    = initConstructorAndSwitchPoint("Number", ScriptFunction.class);

2334         this.builtinString    = initConstructorAndSwitchPoint("String", ScriptFunction.class);
2335 
2336         // initialize String.prototype.length to 0
2337         // add String.prototype.length
2338         final ScriptObject stringPrototype = getStringPrototype();
2339         stringPrototype.addOwnProperty("length", Attribute.NON_ENUMERABLE_CONSTANT, 0.0);
2340 
2341         // set isArray flag on Array.prototype
2342         final ScriptObject arrayPrototype = getArrayPrototype();
2343         arrayPrototype.setIsArray();
2344 










2345         // Error stuff
2346         initErrorObjects();
2347 
2348         // java access
2349         if (! env._no_java) {
2350             this.javaApi = LAZY_SENTINEL;
2351             this.javaImporter = LAZY_SENTINEL;
2352             initJavaAccess();
2353         }
2354 
2355         if (! env._no_typed_arrays) {
2356             this.arrayBuffer       = LAZY_SENTINEL;
2357             this.dataView          = LAZY_SENTINEL;
2358             this.int8Array         = LAZY_SENTINEL;
2359             this.uint8Array        = LAZY_SENTINEL;
2360             this.uint8ClampedArray = LAZY_SENTINEL;
2361             this.int16Array        = LAZY_SENTINEL;
2362             this.uint16Array       = LAZY_SENTINEL;
2363             this.int32Array        = LAZY_SENTINEL;
2364             this.uint32Array       = LAZY_SENTINEL;
2365             this.float32Array      = LAZY_SENTINEL;
2366             this.float64Array      = LAZY_SENTINEL;
2367         }
2368 
2369         if (env._scripting) {
2370             initScripting(env);
2371         }
2372 
2373         if (Context.DEBUG) {
2374             boolean debugOkay;
2375             final SecurityManager sm = System.getSecurityManager();
2376             if (sm != null) {
2377                 try {
2378                     sm.checkPermission(new RuntimePermission(Context.NASHORN_DEBUG_MODE));
2379                     debugOkay = true;
2380                 } catch (final SecurityException ignored) {
2381                     // if no permission, don't initialize Debug object
2382                     debugOkay = false;
2383                 }
2384 
2385             } else {
2386                 debugOkay = true;


2420         errorProto.addOwnProperty("stack", Attribute.NOT_ENUMERABLE, getStack, setStack);
2421         final ScriptFunction getLineNumber = ScriptFunctionImpl.makeFunction("getLineNumber", NativeError.GET_LINENUMBER);
2422         final ScriptFunction setLineNumber = ScriptFunctionImpl.makeFunction("setLineNumber", NativeError.SET_LINENUMBER);
2423         errorProto.addOwnProperty("lineNumber", Attribute.NOT_ENUMERABLE, getLineNumber, setLineNumber);
2424         final ScriptFunction getColumnNumber = ScriptFunctionImpl.makeFunction("getColumnNumber", NativeError.GET_COLUMNNUMBER);
2425         final ScriptFunction setColumnNumber = ScriptFunctionImpl.makeFunction("setColumnNumber", NativeError.SET_COLUMNNUMBER);
2426         errorProto.addOwnProperty("columnNumber", Attribute.NOT_ENUMERABLE, getColumnNumber, setColumnNumber);
2427         final ScriptFunction getFileName = ScriptFunctionImpl.makeFunction("getFileName", NativeError.GET_FILENAME);
2428         final ScriptFunction setFileName = ScriptFunctionImpl.makeFunction("setFileName", NativeError.SET_FILENAME);
2429         errorProto.addOwnProperty("fileName", Attribute.NOT_ENUMERABLE, getFileName, setFileName);
2430 
2431         // ECMA 15.11.4.2 Error.prototype.name
2432         // Error.prototype.name = "Error";
2433         errorProto.set(NativeError.NAME, "Error", 0);
2434         // ECMA 15.11.4.3 Error.prototype.message
2435         // Error.prototype.message = "";
2436         errorProto.set(NativeError.MESSAGE, "", 0);
2437 
2438         tagBuiltinProperties("Error", builtinError);
2439 


2440         this.builtinReferenceError = initErrorSubtype("ReferenceError", errorProto);
2441         this.builtinSyntaxError = initErrorSubtype("SyntaxError", errorProto);
2442         this.builtinTypeError = initErrorSubtype("TypeError", errorProto);

2443     }
2444 
2445     private ScriptFunction initErrorSubtype(final String name, final ScriptObject errorProto) {
2446         final ScriptFunction cons = initConstructor(name, ScriptFunction.class);
2447         final ScriptObject prototype = ScriptFunction.getPrototype(cons);
2448         prototype.set(NativeError.NAME, name, 0);
2449         prototype.set(NativeError.MESSAGE, "", 0);
2450         prototype.setInitialProto(errorProto);
2451         tagBuiltinProperties(name, cons);
2452         return cons;
2453     }
2454 
2455     private void initJavaAccess() {
2456         final ScriptObject objectProto = getObjectPrototype();
2457         this.builtinPackages = new NativeJavaPackage("", objectProto);
2458         this.builtinCom = new NativeJavaPackage("com", objectProto);
2459         this.builtinEdu = new NativeJavaPackage("edu", objectProto);
2460         this.builtinJava = new NativeJavaPackage("java", objectProto);
2461         this.builtinJavafx = new NativeJavaPackage("javafx", objectProto);
2462         this.builtinJavax = new NativeJavaPackage("javax", objectProto);
2463         this.builtinOrg = new NativeJavaPackage("org", objectProto);


2464     }
2465 
2466     private void initScripting(final ScriptEnvironment scriptEnv) {
2467         Object value;
2468         value = ScriptFunctionImpl.makeFunction("readLine", ScriptingFunctions.READLINE);
2469         addOwnProperty("readLine", Attribute.NOT_ENUMERABLE, value);
2470 
2471         value = ScriptFunctionImpl.makeFunction("readFully", ScriptingFunctions.READFULLY);
2472         addOwnProperty("readFully", Attribute.NOT_ENUMERABLE, value);
2473 
2474         final String execName = ScriptingFunctions.EXEC_NAME;
2475         value = ScriptFunctionImpl.makeFunction(execName, ScriptingFunctions.EXEC);
2476         addOwnProperty(execName, Attribute.NOT_ENUMERABLE, value);
2477 
2478         // Nashorn extension: global.echo (scripting-mode-only)
2479         // alias for "print"
2480         value = get("print");
2481         addOwnProperty("echo", Attribute.NOT_ENUMERABLE, value);
2482 
2483         // Nashorn extension: global.$OPTIONS (scripting-mode-only)


2495         } else {
2496             addOwnProperty(ScriptingFunctions.ENV_NAME, Attribute.NOT_ENUMERABLE, UNDEFINED);
2497         }
2498 
2499         // add other special properties for exec support
2500         addOwnProperty(ScriptingFunctions.OUT_NAME, Attribute.NOT_ENUMERABLE, UNDEFINED);
2501         addOwnProperty(ScriptingFunctions.ERR_NAME, Attribute.NOT_ENUMERABLE, UNDEFINED);
2502         addOwnProperty(ScriptingFunctions.EXIT_NAME, Attribute.NOT_ENUMERABLE, UNDEFINED);
2503     }
2504 
2505     private static void copyOptions(final ScriptObject options, final ScriptEnvironment scriptEnv) {
2506         for (final Field f : scriptEnv.getClass().getFields()) {
2507             try {
2508                 options.set(f.getName(), f.get(scriptEnv), 0);
2509             } catch (final IllegalArgumentException | IllegalAccessException exp) {
2510                 throw new RuntimeException(exp);
2511             }
2512         }
2513     }
2514 















2515     private void copyBuiltins() {
2516         this.array             = this.builtinArray;
2517         this._boolean          = this.builtinBoolean;

2518         this.error             = this.builtinError;

2519         this.function          = this.builtinFunction;


2520         this.com               = this.builtinCom;
2521         this.edu               = this.builtinEdu;
2522         this.java              = this.builtinJava;
2523         this.javafx            = this.builtinJavafx;
2524         this.javax             = this.builtinJavax;
2525         this.org               = this.builtinOrg;



2526         this.number            = this.builtinNumber;
2527         this.object            = this.builtinObject;
2528         this.packages          = this.builtinPackages;

2529         this.referenceError    = this.builtinReferenceError;

2530         this.string            = this.builtinString;
2531         this.syntaxError       = this.builtinSyntaxError;
2532         this.typeError         = this.builtinTypeError;












2533     }
2534 
2535     private void initDebug() {
2536         this.addOwnProperty("Debug", Attribute.NOT_ENUMERABLE, initConstructor("Debug", ScriptObject.class));
2537     }
2538 
2539     private Object printImpl(final boolean newLine, final Object... objects) {
2540         @SuppressWarnings("resource")
2541         final PrintWriter out = scontext != null? new PrintWriter(scontext.getWriter()) : getContext().getEnv().getOut();
2542         final StringBuilder sb = new StringBuilder();
2543 
2544         for (final Object obj : objects) {
2545             if (sb.length() != 0) {
2546                 sb.append(' ');
2547             }
2548 
2549             sb.append(JSType.toString(obj));
2550         }
2551 
2552         // Print all at once to ensure thread friendly result.