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

Print this page

        

*** 52,63 **** --- 52,65 ---- import jdk.internal.dynalink.linker.LinkRequest; import jdk.nashorn.api.scripting.ClassFilter; import jdk.nashorn.api.scripting.ScriptObjectMirror; import jdk.nashorn.internal.lookup.Lookup; import jdk.nashorn.internal.objects.annotations.Attribute; + import jdk.nashorn.internal.objects.annotations.Getter; import jdk.nashorn.internal.objects.annotations.Property; import jdk.nashorn.internal.objects.annotations.ScriptClass; + import jdk.nashorn.internal.objects.annotations.Setter; import jdk.nashorn.internal.runtime.Context; import jdk.nashorn.internal.runtime.ECMAErrors; import jdk.nashorn.internal.runtime.GlobalConstants; import jdk.nashorn.internal.runtime.GlobalFunctions; import jdk.nashorn.internal.runtime.JSType;
*** 87,96 **** --- 89,101 ---- // Placeholder value used in place of a location property (__FILE__, __DIR__, __LINE__) private static final Object LOCATION_PROPERTY_PLACEHOLDER = new Object(); private final InvokeByName TO_STRING = new InvokeByName("toString", ScriptObject.class); private final InvokeByName VALUE_OF = new InvokeByName("valueOf", ScriptObject.class); + // placeholder value for lazily initialized global objects + private static final Object LAZY_SENTINEL = new Object(); + /** * Optimistic builtin names that require switchpoint invalidation * upon assignment. Overly conservative, but works for now, to avoid * any complicated scope checks and especially heavy weight guards * like
*** 212,251 **** /** ECMA 15.1.4.6 - Number constructor */ @Property(name = "Number", attributes = Attribute.NOT_ENUMERABLE) public volatile Object number; /** ECMA 15.1.4.7 Date constructor */ ! @Property(name = "Date", attributes = Attribute.NOT_ENUMERABLE) ! public volatile Object date; /** ECMA 15.1.4.8 RegExp constructor */ ! @Property(name = "RegExp", attributes = Attribute.NOT_ENUMERABLE) ! public volatile Object regexp; /** ECMA 15.12 - The JSON object */ ! @Property(name = "JSON", attributes = Attribute.NOT_ENUMERABLE) ! public volatile Object json; /** Nashorn extension: global.JSAdapter */ ! @Property(name = "JSAdapter", attributes = Attribute.NOT_ENUMERABLE) ! public volatile Object jsadapter; /** ECMA 15.8 - The Math object */ @Property(name = "Math", attributes = Attribute.NOT_ENUMERABLE) public volatile Object math; /** Error object */ @Property(name = "Error", attributes = Attribute.NOT_ENUMERABLE) public volatile Object error; /** EvalError object */ ! @Property(name = "EvalError", attributes = Attribute.NOT_ENUMERABLE) ! public volatile Object evalError; /** RangeError object */ ! @Property(name = "RangeError", attributes = Attribute.NOT_ENUMERABLE) ! public volatile Object rangeError; /** ReferenceError object */ @Property(name = "ReferenceError", attributes = Attribute.NOT_ENUMERABLE) public volatile Object referenceError; --- 217,340 ---- /** ECMA 15.1.4.6 - Number constructor */ @Property(name = "Number", attributes = Attribute.NOT_ENUMERABLE) public volatile Object number; /** ECMA 15.1.4.7 Date constructor */ ! @Getter(name = "Date", attributes = Attribute.NOT_ENUMERABLE) ! public static Object getDate(final Object self) { ! final Global global = Global.instanceFrom(self); ! if (global.date == LAZY_SENTINEL) { ! global.date = global.getBuiltinDate(); ! } ! return global.date; ! } ! ! @Setter(name = "Date", attributes = Attribute.NOT_ENUMERABLE) ! public static void setDate(final Object self, final Object value) { ! final Global global = Global.instanceFrom(self); ! global.date = value; ! } ! ! private volatile Object date = LAZY_SENTINEL; /** ECMA 15.1.4.8 RegExp constructor */ ! @Getter(name = "RegExp", attributes = Attribute.NOT_ENUMERABLE) ! public static Object getRegExp(final Object self) { ! final Global global = Global.instanceFrom(self); ! if (global.regexp == LAZY_SENTINEL) { ! global.regexp = global.getBuiltinRegExp(); ! } ! return global.regexp; ! } ! ! @Setter(name = "RegExp", attributes = Attribute.NOT_ENUMERABLE) ! public static void setRegExp(final Object self, final Object value) { ! final Global global = Global.instanceFrom(self); ! global.regexp = value; ! } ! ! private volatile Object regexp = LAZY_SENTINEL; /** ECMA 15.12 - The JSON object */ ! @Getter(name = "JSON", attributes = Attribute.NOT_ENUMERABLE) ! public static Object getJSON(final Object self) { ! final Global global = Global.instanceFrom(self); ! if (global.json == LAZY_SENTINEL) { ! global.json = global.getBuiltinJSON(); ! } ! return global.json; ! } ! ! @Setter(name = "JSON", attributes = Attribute.NOT_ENUMERABLE) ! public static void setJSON(final Object self, final Object value) { ! final Global global = Global.instanceFrom(self); ! global.json = value; ! } ! ! private volatile Object json = LAZY_SENTINEL; /** Nashorn extension: global.JSAdapter */ ! @Getter(name = "JSAdapter", attributes = Attribute.NOT_ENUMERABLE) ! public static Object getJSAdapter(final Object self) { ! final Global global = Global.instanceFrom(self); ! if (global.jsadapter == LAZY_SENTINEL) { ! global.jsadapter = global.getBuiltinJSAdapter(); ! } ! return global.jsadapter; ! } ! ! @Setter(name = "JSAdapter", attributes = Attribute.NOT_ENUMERABLE) ! public static void setJSAdapter(final Object self, final Object value) { ! final Global global = Global.instanceFrom(self); ! global.jsadapter = value; ! } ! ! private volatile Object jsadapter = LAZY_SENTINEL; /** ECMA 15.8 - The Math object */ @Property(name = "Math", attributes = Attribute.NOT_ENUMERABLE) public volatile Object math; /** Error object */ @Property(name = "Error", attributes = Attribute.NOT_ENUMERABLE) public volatile Object error; /** EvalError object */ ! @Getter(name = "EvalError", attributes = Attribute.NOT_ENUMERABLE) ! public static Object getEvalError(final Object self) { ! final Global global = Global.instanceFrom(self); ! if (global.evalError == LAZY_SENTINEL) { ! global.evalError = global.getBuiltinEvalError(); ! } ! return global.evalError; ! } ! ! @Setter(name = "EvalError", attributes = Attribute.NOT_ENUMERABLE) ! public static void setEvalError(final Object self, final Object value) { ! final Global global = Global.instanceFrom(self); ! global.evalError = value; ! } ! ! private volatile Object evalError = LAZY_SENTINEL; /** RangeError object */ ! @Getter(name = "RangeError", attributes = Attribute.NOT_ENUMERABLE) ! public static Object getRangeError(final Object self) { ! final Global global = Global.instanceFrom(self); ! if (global.rangeError == LAZY_SENTINEL) { ! global.rangeError = global.getBuiltinRangeError(); ! } ! return global.rangeError; ! } ! ! @Setter(name = "RangeError", attributes = Attribute.NOT_ENUMERABLE) ! public static void setRangeError(final Object self, final Object value) { ! final Global global = Global.instanceFrom(self); ! global.rangeError = value; ! } ! ! private volatile Object rangeError = LAZY_SENTINEL; /** ReferenceError object */ @Property(name = "ReferenceError", attributes = Attribute.NOT_ENUMERABLE) public volatile Object referenceError;
*** 256,311 **** /** TypeError object */ @Property(name = "TypeError", attributes = Attribute.NOT_ENUMERABLE) public volatile Object typeError; /** URIError object */ ! @Property(name = "URIError", attributes = Attribute.NOT_ENUMERABLE) ! public volatile Object uriError; /** ArrayBuffer object */ ! @Property(name = "ArrayBuffer", attributes = Attribute.NOT_ENUMERABLE) ! public volatile Object arrayBuffer; /** DataView object */ ! @Property(name = "DataView", attributes = Attribute.NOT_ENUMERABLE) ! public volatile Object dataView; /** TypedArray (int8) */ ! @Property(name = "Int8Array", attributes = Attribute.NOT_ENUMERABLE) ! public volatile Object int8Array; /** TypedArray (uint8) */ ! @Property(name = "Uint8Array", attributes = Attribute.NOT_ENUMERABLE) ! public volatile Object uint8Array; /** TypedArray (uint8) - Clamped */ ! @Property(name = "Uint8ClampedArray", attributes = Attribute.NOT_ENUMERABLE) ! public volatile Object uint8ClampedArray; /** TypedArray (int16) */ ! @Property(name = "Int16Array", attributes = Attribute.NOT_ENUMERABLE) ! public volatile Object int16Array; /** TypedArray (uint16) */ ! @Property(name = "Uint16Array", attributes = Attribute.NOT_ENUMERABLE) ! public volatile Object uint16Array; /** TypedArray (int32) */ ! @Property(name = "Int32Array", attributes = Attribute.NOT_ENUMERABLE) ! public volatile Object int32Array; /** TypedArray (uint32) */ ! @Property(name = "Uint32Array", attributes = Attribute.NOT_ENUMERABLE) ! public volatile Object uint32Array; /** TypedArray (float32) */ ! @Property(name = "Float32Array", attributes = Attribute.NOT_ENUMERABLE) ! public volatile Object float32Array; /** TypedArray (float64) */ ! @Property(name = "Float64Array", attributes = Attribute.NOT_ENUMERABLE) ! public volatile Object float64Array; /** Nashorn extension: Java access - global.Packages */ @Property(name = "Packages", attributes = Attribute.NOT_ENUMERABLE) public volatile Object packages; --- 345,568 ---- /** TypeError object */ @Property(name = "TypeError", attributes = Attribute.NOT_ENUMERABLE) public volatile Object typeError; /** URIError object */ ! @Getter(name = "URIError", attributes = Attribute.NOT_ENUMERABLE) ! public static Object getURIError(final Object self) { ! final Global global = Global.instanceFrom(self); ! if (global.uriError == LAZY_SENTINEL) { ! global.uriError = global.getBuiltinURIError(); ! } ! return global.uriError; ! } ! ! @Setter(name = "URIError", attributes = Attribute.NOT_ENUMERABLE) ! public static void setURIError(final Object self, final Object value) { ! final Global global = Global.instanceFrom(self); ! global.uriError = value; ! } ! ! private volatile Object uriError = LAZY_SENTINEL; /** ArrayBuffer object */ ! @Getter(name = "ArrayBuffer", attributes = Attribute.NOT_ENUMERABLE) ! public static Object getArrayBuffer(final Object self) { ! final Global global = Global.instanceFrom(self); ! if (global.arrayBuffer == LAZY_SENTINEL) { ! global.arrayBuffer = global.getBuiltinArrayBuffer(); ! } ! return global.arrayBuffer; ! } ! ! @Setter(name = "ArrayBuffer", attributes = Attribute.NOT_ENUMERABLE) ! public static void setArrayBuffer(final Object self, final Object value) { ! final Global global = Global.instanceFrom(self); ! global.arrayBuffer = value; ! } ! ! private volatile Object arrayBuffer; /** DataView object */ ! @Getter(name = "DataView", attributes = Attribute.NOT_ENUMERABLE) ! public static Object getDataView(final Object self) { ! final Global global = Global.instanceFrom(self); ! if (global.dataView == LAZY_SENTINEL) { ! global.dataView = global.getBuiltinDataView(); ! } ! return global.dataView; ! } ! ! @Setter(name = "DataView", attributes = Attribute.NOT_ENUMERABLE) ! public static void setDataView(final Object self, final Object value) { ! final Global global = Global.instanceFrom(self); ! global.dataView = value; ! } ! ! private volatile Object dataView; /** TypedArray (int8) */ ! @Getter(name = "Int8Array", attributes = Attribute.NOT_ENUMERABLE) ! public static Object getInt8Array(final Object self) { ! final Global global = Global.instanceFrom(self); ! if (global.int8Array == LAZY_SENTINEL) { ! global.int8Array = global.getBuiltinInt8Array(); ! } ! return global.int8Array; ! } ! ! @Setter(name = "Int8Array", attributes = Attribute.NOT_ENUMERABLE) ! public static void setInt8Array(final Object self, final Object value) { ! final Global global = Global.instanceFrom(self); ! global.int8Array = value; ! } ! ! private volatile Object int8Array; /** TypedArray (uint8) */ ! @Getter(name = "Uint8Array", attributes = Attribute.NOT_ENUMERABLE) ! public static Object getUint8Array(final Object self) { ! final Global global = Global.instanceFrom(self); ! if (global.uint8Array == LAZY_SENTINEL) { ! global.uint8Array = global.getBuiltinUint8Array(); ! } ! return global.uint8Array; ! } ! ! @Setter(name = "Uint8Array", attributes = Attribute.NOT_ENUMERABLE) ! public static void setUint8Array(final Object self, final Object value) { ! final Global global = Global.instanceFrom(self); ! global.uint8Array = value; ! } ! ! private volatile Object uint8Array; /** TypedArray (uint8) - Clamped */ ! @Getter(name = "Uint8ClampedArray", attributes = Attribute.NOT_ENUMERABLE) ! public static Object getUint8ClampedArray(final Object self) { ! final Global global = Global.instanceFrom(self); ! if (global.uint8ClampedArray == LAZY_SENTINEL) { ! global.uint8ClampedArray = global.getBuiltinUint8ClampedArray(); ! } ! return global.uint8ClampedArray; ! } ! ! @Setter(name = "Uint8ClampedArray", attributes = Attribute.NOT_ENUMERABLE) ! public static void setUint8ClampedArray(final Object self, final Object value) { ! final Global global = Global.instanceFrom(self); ! global.uint8ClampedArray = value; ! } ! ! private volatile Object uint8ClampedArray; /** TypedArray (int16) */ ! @Getter(name = "Int16Array", attributes = Attribute.NOT_ENUMERABLE) ! public static Object getInt16Array(final Object self) { ! final Global global = Global.instanceFrom(self); ! if (global.int16Array == LAZY_SENTINEL) { ! global.int16Array = global.getBuiltinInt16Array(); ! } ! return global.int16Array; ! } ! ! @Setter(name = "Int16Array", attributes = Attribute.NOT_ENUMERABLE) ! public static void setInt16Array(final Object self, final Object value) { ! final Global global = Global.instanceFrom(self); ! global.int16Array = value; ! } ! ! private volatile Object int16Array; /** TypedArray (uint16) */ ! @Getter(name = "Uint16Array", attributes = Attribute.NOT_ENUMERABLE) ! public static Object getUint16Array(final Object self) { ! final Global global = Global.instanceFrom(self); ! if (global.uint16Array == LAZY_SENTINEL) { ! global.uint16Array = global.getBuiltinUint16Array(); ! } ! return global.uint16Array; ! } ! ! @Setter(name = "Uint16Array", attributes = Attribute.NOT_ENUMERABLE) ! public static void setUint16Array(final Object self, final Object value) { ! final Global global = Global.instanceFrom(self); ! global.uint16Array = value; ! } ! ! private volatile Object uint16Array; /** TypedArray (int32) */ ! @Getter(name = "Int32Array", attributes = Attribute.NOT_ENUMERABLE) ! public static Object getInt32Array(final Object self) { ! final Global global = Global.instanceFrom(self); ! if (global.int32Array == LAZY_SENTINEL) { ! global.int32Array = global.getBuiltinInt32Array(); ! } ! return global.int32Array; ! } ! ! @Setter(name = "Int32Array", attributes = Attribute.NOT_ENUMERABLE) ! public static void setInt32Array(final Object self, final Object value) { ! final Global global = Global.instanceFrom(self); ! global.int32Array = value; ! } ! ! private volatile Object int32Array; /** TypedArray (uint32) */ ! @Getter(name = "Uint32Array", attributes = Attribute.NOT_ENUMERABLE) ! public static Object getUint32Array(final Object self) { ! final Global global = Global.instanceFrom(self); ! if (global.uint32Array == LAZY_SENTINEL) { ! global.uint32Array = global.getBuiltinUint32Array(); ! } ! return global.uint32Array; ! } ! ! @Setter(name = "Uint32Array", attributes = Attribute.NOT_ENUMERABLE) ! public static void setUint32Array(final Object self, final Object value) { ! final Global global = Global.instanceFrom(self); ! global.uint32Array = value; ! } ! ! private volatile Object uint32Array; /** TypedArray (float32) */ ! @Getter(name = "Float32Array", attributes = Attribute.NOT_ENUMERABLE) ! public static Object getFloat32Array(final Object self) { ! final Global global = Global.instanceFrom(self); ! if (global.float32Array == LAZY_SENTINEL) { ! global.float32Array = global.getBuiltinFloat32Array(); ! } ! return global.float32Array; ! } ! ! @Setter(name = "Float32Array", attributes = Attribute.NOT_ENUMERABLE) ! public static void setFloat32Array(final Object self, final Object value) { ! final Global global = Global.instanceFrom(self); ! global.float32Array = value; ! } ! ! private volatile Object float32Array; /** TypedArray (float64) */ ! @Getter(name = "Float64Array", attributes = Attribute.NOT_ENUMERABLE) ! public static Object getFloat64Array(final Object self) { ! final Global global = Global.instanceFrom(self); ! if (global.float64Array == LAZY_SENTINEL) { ! global.float64Array = global.getBuiltinFloat64Array(); ! } ! return global.float64Array; ! } ! ! @Setter(name = "Float64Array", attributes = Attribute.NOT_ENUMERABLE) ! public static void setFloat64Array(final Object self, final Object value) { ! final Global global = Global.instanceFrom(self); ! global.float64Array = value; ! } ! ! private volatile Object float64Array; /** Nashorn extension: Java access - global.Packages */ @Property(name = "Packages", attributes = Attribute.NOT_ENUMERABLE) public volatile Object packages;
*** 332,347 **** /** Nashorn extension: Java access - global.org */ @Property(attributes = Attribute.NOT_ENUMERABLE) public volatile Object org; /** Nashorn extension: Java access - global.javaImporter */ ! @Property(name = "JavaImporter", attributes = Attribute.NOT_ENUMERABLE) ! public volatile Object javaImporter; /** Nashorn extension: global.Java Object constructor. */ ! @Property(name = "Java", attributes = Attribute.NOT_ENUMERABLE) ! public volatile Object javaApi; /** Nashorn extension: current script's file name */ @Property(name = "__FILE__", attributes = Attribute.NON_ENUMERABLE_CONSTANT) public final Object __FILE__ = LOCATION_PROPERTY_PLACEHOLDER; --- 589,632 ---- /** Nashorn extension: Java access - global.org */ @Property(attributes = Attribute.NOT_ENUMERABLE) public volatile Object org; /** Nashorn extension: Java access - global.javaImporter */ ! @Getter(name = "JavaImporter", attributes = Attribute.NOT_ENUMERABLE) ! public static Object getJavaImporter(final Object self) { ! final Global global = Global.instanceFrom(self); ! if (global.javaImporter == LAZY_SENTINEL) { ! global.javaImporter = global.getBuiltinJavaImporter(); ! } ! return global.javaImporter; ! } ! ! @Setter(name = "JavaImporter", attributes = Attribute.NOT_ENUMERABLE) ! public static void setJavaImporter(final Object self, final Object value) { ! final Global global = Global.instanceFrom(self); ! global.javaImporter = value; ! } ! ! private volatile Object javaImporter; /** Nashorn extension: global.Java Object constructor. */ ! @Getter(name = "Java", attributes = Attribute.NOT_ENUMERABLE) ! public static Object getJavaApi(final Object self) { ! final Global global = Global.instanceFrom(self); ! if (global.javaApi == LAZY_SENTINEL) { ! global.javaApi = global.getBuiltinJavaApi(); ! } ! return global.javaApi; ! } ! ! @Setter(name = "Java", attributes = Attribute.NOT_ENUMERABLE) ! public static void setJavaApi(final Object self, final Object value) { ! final Global global = Global.instanceFrom(self); ! global.javaApi = value; ! } ! ! private volatile Object javaApi; /** Nashorn extension: current script's file name */ @Property(name = "__FILE__", attributes = Attribute.NON_ENUMERABLE_CONSTANT) public final Object __FILE__ = LOCATION_PROPERTY_PLACEHOLDER;
*** 351,365 **** /** Nashorn extension: current source line number being executed */ @Property(name = "__LINE__", attributes = Attribute.NON_ENUMERABLE_CONSTANT) public final Object __LINE__ = LOCATION_PROPERTY_PLACEHOLDER; /** Used as Date.prototype's default value */ ! public NativeDate DEFAULT_DATE; /** Used as RegExp.prototype's default value */ ! public NativeRegExp DEFAULT_REGEXP; /* * Built-in constructor objects: Even if user changes dynamic values of * "Object", "Array" etc., we still want to keep original values of these * constructors here. For example, we need to be able to create array, --- 636,658 ---- /** Nashorn extension: current source line number being executed */ @Property(name = "__LINE__", attributes = Attribute.NON_ENUMERABLE_CONSTANT) public final Object __LINE__ = LOCATION_PROPERTY_PLACEHOLDER; + private volatile NativeDate DEFAULT_DATE; + /** Used as Date.prototype's default value */ ! NativeDate getDefaultDate() { ! return DEFAULT_DATE; ! } ! ! private volatile NativeRegExp DEFAULT_REGEXP; /** Used as RegExp.prototype's default value */ ! NativeRegExp getDefaultRegExp() { ! return DEFAULT_REGEXP; ! } /* * Built-in constructor objects: Even if user changes dynamic values of * "Object", "Array" etc., we still want to keep original values of these * constructors here. For example, we need to be able to create array,
*** 1055,1069 **** ScriptObject getNumberPrototype() { return ScriptFunction.getPrototype(builtinNumber); } ScriptObject getDatePrototype() { ! return ScriptFunction.getPrototype(builtinDate); } ScriptObject getRegExpPrototype() { ! return ScriptFunction.getPrototype(builtinRegExp); } ScriptObject getStringPrototype() { return ScriptFunction.getPrototype(builtinString); } --- 1348,1362 ---- ScriptObject getNumberPrototype() { return ScriptFunction.getPrototype(builtinNumber); } ScriptObject getDatePrototype() { ! return ScriptFunction.getPrototype(getBuiltinDate()); } ScriptObject getRegExpPrototype() { ! return ScriptFunction.getPrototype(getBuiltinRegExp()); } ScriptObject getStringPrototype() { return ScriptFunction.getPrototype(builtinString); }
*** 1071,1085 **** ScriptObject getErrorPrototype() { return ScriptFunction.getPrototype(builtinError); } ScriptObject getEvalErrorPrototype() { ! return ScriptFunction.getPrototype(builtinEvalError); } ScriptObject getRangeErrorPrototype() { ! return ScriptFunction.getPrototype(builtinRangeError); } ScriptObject getReferenceErrorPrototype() { return ScriptFunction.getPrototype(builtinReferenceError); } --- 1364,1378 ---- ScriptObject getErrorPrototype() { return ScriptFunction.getPrototype(builtinError); } ScriptObject getEvalErrorPrototype() { ! return ScriptFunction.getPrototype(getBuiltinEvalError()); } ScriptObject getRangeErrorPrototype() { ! return ScriptFunction.getPrototype(getBuiltinRangeError()); } ScriptObject getReferenceErrorPrototype() { return ScriptFunction.getPrototype(builtinReferenceError); }
*** 1091,1153 **** ScriptObject getTypeErrorPrototype() { return ScriptFunction.getPrototype(builtinTypeError); } ScriptObject getURIErrorPrototype() { ! return ScriptFunction.getPrototype(builtinURIError); } ScriptObject getJavaImporterPrototype() { ! return ScriptFunction.getPrototype(builtinJavaImporter); } ScriptObject getJSAdapterPrototype() { ! return ScriptFunction.getPrototype(builtinJSAdapter); } ScriptObject getArrayBufferPrototype() { ! return ScriptFunction.getPrototype(builtinArrayBuffer); } ScriptObject getDataViewPrototype() { ! return ScriptFunction.getPrototype(builtinDataView); } ScriptObject getInt8ArrayPrototype() { ! return ScriptFunction.getPrototype(builtinInt8Array); } ScriptObject getUint8ArrayPrototype() { ! return ScriptFunction.getPrototype(builtinUint8Array); } ScriptObject getUint8ClampedArrayPrototype() { ! return ScriptFunction.getPrototype(builtinUint8ClampedArray); } ScriptObject getInt16ArrayPrototype() { ! return ScriptFunction.getPrototype(builtinInt16Array); } ScriptObject getUint16ArrayPrototype() { ! return ScriptFunction.getPrototype(builtinUint16Array); } ScriptObject getInt32ArrayPrototype() { ! return ScriptFunction.getPrototype(builtinInt32Array); } ScriptObject getUint32ArrayPrototype() { ! return ScriptFunction.getPrototype(builtinUint32Array); } ScriptObject getFloat32ArrayPrototype() { ! return ScriptFunction.getPrototype(builtinFloat32Array); } ScriptObject getFloat64ArrayPrototype() { ! return ScriptFunction.getPrototype(builtinFloat64Array); } private ScriptFunction getBuiltinArray() { return builtinArray; } --- 1384,1523 ---- ScriptObject getTypeErrorPrototype() { return ScriptFunction.getPrototype(builtinTypeError); } ScriptObject getURIErrorPrototype() { ! return ScriptFunction.getPrototype(getBuiltinURIError()); } ScriptObject getJavaImporterPrototype() { ! return ScriptFunction.getPrototype(getBuiltinJavaImporter()); } ScriptObject getJSAdapterPrototype() { ! return ScriptFunction.getPrototype(getBuiltinJSAdapter()); ! } ! ! private synchronized ScriptFunction getBuiltinArrayBuffer() { ! if (this.builtinArrayBuffer == null) { ! this.builtinArrayBuffer = initConstructorAndSwitchPoint("ArrayBuffer", ScriptFunction.class); ! } ! return this.builtinArrayBuffer; } ScriptObject getArrayBufferPrototype() { ! return ScriptFunction.getPrototype(getBuiltinArrayBuffer()); ! } ! ! private synchronized ScriptFunction getBuiltinDataView() { ! if (this.builtinDataView == null) { ! this.builtinDataView = initConstructorAndSwitchPoint("DataView", ScriptFunction.class); ! } ! return this.builtinDataView; } ScriptObject getDataViewPrototype() { ! return ScriptFunction.getPrototype(getBuiltinDataView()); ! } ! ! private synchronized ScriptFunction getBuiltinInt8Array() { ! if (this.builtinInt8Array == null) { ! this.builtinInt8Array = initConstructorAndSwitchPoint("Int8Array", ScriptFunction.class); ! } ! return this.builtinInt8Array; } ScriptObject getInt8ArrayPrototype() { ! return ScriptFunction.getPrototype(getBuiltinInt8Array()); ! } ! ! private synchronized ScriptFunction getBuiltinUint8Array() { ! if (this.builtinUint8Array == null) { ! this.builtinUint8Array = initConstructorAndSwitchPoint("Uint8Array", ScriptFunction.class); ! } ! return this.builtinUint8Array; } ScriptObject getUint8ArrayPrototype() { ! return ScriptFunction.getPrototype(getBuiltinUint8Array()); ! } ! ! private synchronized ScriptFunction getBuiltinUint8ClampedArray() { ! if (this.builtinUint8ClampedArray == null) { ! this.builtinUint8ClampedArray = initConstructorAndSwitchPoint("Uint8ClampedArray", ScriptFunction.class); ! } ! return this.builtinUint8ClampedArray; } ScriptObject getUint8ClampedArrayPrototype() { ! return ScriptFunction.getPrototype(getBuiltinUint8ClampedArray()); ! } ! ! private synchronized ScriptFunction getBuiltinInt16Array() { ! if (this.builtinInt16Array == null) { ! this.builtinInt16Array = initConstructorAndSwitchPoint("Int16Array", ScriptFunction.class); ! } ! return this.builtinInt16Array; } ScriptObject getInt16ArrayPrototype() { ! return ScriptFunction.getPrototype(getBuiltinInt16Array()); ! } ! ! private synchronized ScriptFunction getBuiltinUint16Array() { ! if (this.builtinUint16Array == null) { ! this.builtinUint16Array = initConstructorAndSwitchPoint("Uint16Array", ScriptFunction.class); ! } ! return this.builtinUint16Array; } ScriptObject getUint16ArrayPrototype() { ! return ScriptFunction.getPrototype(getBuiltinUint16Array()); ! } ! ! private synchronized ScriptFunction getBuiltinInt32Array() { ! if (this.builtinInt32Array == null) { ! this.builtinInt32Array = initConstructorAndSwitchPoint("Int32Array", ScriptFunction.class); ! } ! return this.builtinInt32Array; } ScriptObject getInt32ArrayPrototype() { ! return ScriptFunction.getPrototype(getBuiltinInt32Array()); ! } ! ! private synchronized ScriptFunction getBuiltinUint32Array() { ! if (this.builtinUint32Array == null) { ! this.builtinUint32Array = initConstructorAndSwitchPoint("Uint32Array", ScriptFunction.class); ! } ! return this.builtinUint32Array; } ScriptObject getUint32ArrayPrototype() { ! return ScriptFunction.getPrototype(getBuiltinUint32Array()); ! } ! ! private synchronized ScriptFunction getBuiltinFloat32Array() { ! if (this.builtinFloat32Array == null) { ! this.builtinFloat32Array = initConstructorAndSwitchPoint("Float32Array", ScriptFunction.class); ! } ! return this.builtinFloat32Array; } ScriptObject getFloat32ArrayPrototype() { ! return ScriptFunction.getPrototype(getBuiltinFloat32Array()); ! } ! ! private synchronized ScriptFunction getBuiltinFloat64Array() { ! if (this.builtinFloat64Array == null) { ! this.builtinFloat64Array = initConstructorAndSwitchPoint("Float64Array", ScriptFunction.class); ! } ! return this.builtinFloat64Array; } ScriptObject getFloat64ArrayPrototype() { ! return ScriptFunction.getPrototype(getBuiltinFloat64Array()); } private ScriptFunction getBuiltinArray() { return builtinArray; }
*** 1178,1199 **** public static boolean isBuiltinBoolean() { final Global instance = Global.instance(); return instance._boolean == instance.getBuiltinBoolean(); } ! private ScriptFunction getBuiltinDate() { ! return builtinDate; } /** * Called from compiled script code to test if builtin has been overridden * * @return true if builtin date has not been overridden */ public static boolean isBuiltinDate() { final Global instance = Global.instance(); ! return instance.date == instance.getBuiltinDate(); } private ScriptFunction getBuiltinError() { return builtinError; } --- 1548,1575 ---- public static boolean isBuiltinBoolean() { final Global instance = Global.instance(); return instance._boolean == instance.getBuiltinBoolean(); } ! private synchronized ScriptFunction getBuiltinDate() { ! if (this.builtinDate == null) { ! this.builtinDate = initConstructorAndSwitchPoint("Date", ScriptFunction.class); ! final ScriptObject dateProto = ScriptFunction.getPrototype(builtinDate); ! // initialize default date ! this.DEFAULT_DATE = new NativeDate(NaN, dateProto); ! } ! return this.builtinDate; } /** * Called from compiled script code to test if builtin has been overridden * * @return true if builtin date has not been overridden */ public static boolean isBuiltinDate() { final Global instance = Global.instance(); ! return instance.date == LAZY_SENTINEL || instance.date == instance.getBuiltinDate(); } private ScriptFunction getBuiltinError() { return builtinError; }
*** 1206,1227 **** public static boolean isBuiltinError() { final Global instance = Global.instance(); return instance.error == instance.getBuiltinError(); } ! private ScriptFunction getBuiltinEvalError() { ! return builtinEvalError; } /** * Called from compiled script code to test if builtin has been overridden * * @return true if builtin eval error has not been overridden */ public static boolean isBuiltinEvalError() { final Global instance = Global.instance(); ! return instance.evalError == instance.getBuiltinEvalError(); } private ScriptFunction getBuiltinFunction() { return builtinFunction; } --- 1582,1606 ---- public static boolean isBuiltinError() { final Global instance = Global.instance(); return instance.error == instance.getBuiltinError(); } ! private synchronized ScriptFunction getBuiltinEvalError() { ! if (this.builtinEvalError == null) { ! this.builtinEvalError = initErrorSubtype("EvalError", getErrorPrototype()); ! } ! return this.builtinEvalError; } /** * Called from compiled script code to test if builtin has been overridden * * @return true if builtin eval error has not been overridden */ public static boolean isBuiltinEvalError() { final Global instance = Global.instance(); ! return instance.evalError == LAZY_SENTINEL || instance.evalError == instance.getBuiltinEvalError(); } private ScriptFunction getBuiltinFunction() { return builtinFunction; }
*** 1268,1303 **** */ public static boolean isBuiltinFunctionPrototypeCall() { return isBuiltinFunctionProperty("call"); } ! private ScriptFunction getBuiltinJSAdapter() { return builtinJSAdapter; } /** * Called from compiled script code to test if builtin has been overridden * * @return true if builtin JSAdapter has not been overridden */ public static boolean isBuiltinJSAdapter() { final Global instance = Global.instance(); ! return instance.jsadapter == instance.getBuiltinJSAdapter(); } ! private ScriptObject getBuiltinJSON() { ! return builtinJSON; } /** * Called from compiled script code to test if builtin has been overridden * * @return true if builtin JSON has has not been overridden */ public static boolean isBuiltinJSON() { final Global instance = Global.instance(); ! return instance.json == instance.getBuiltinJSON(); } private ScriptObject getBuiltinJava() { return builtinJava; } --- 1647,1688 ---- */ public static boolean isBuiltinFunctionPrototypeCall() { return isBuiltinFunctionProperty("call"); } ! private synchronized ScriptFunction getBuiltinJSAdapter() { ! if (this.builtinJSAdapter == null) { ! this.builtinJSAdapter = initConstructorAndSwitchPoint("JSAdapter", ScriptFunction.class); ! } return builtinJSAdapter; } /** * Called from compiled script code to test if builtin has been overridden * * @return true if builtin JSAdapter has not been overridden */ public static boolean isBuiltinJSAdapter() { final Global instance = Global.instance(); ! return instance.jsadapter == LAZY_SENTINEL || instance.jsadapter == instance.getBuiltinJSAdapter(); } ! private synchronized ScriptObject getBuiltinJSON() { ! if (this.builtinJSON == null) { ! this.builtinJSON = initConstructorAndSwitchPoint("JSON", ScriptObject.class); ! } ! return this.builtinJSON; } /** * Called from compiled script code to test if builtin has been overridden * * @return true if builtin JSON has has not been overridden */ public static boolean isBuiltinJSON() { final Global instance = Global.instance(); ! return instance.json == LAZY_SENTINEL || instance.json == instance.getBuiltinJSON(); } private ScriptObject getBuiltinJava() { return builtinJava; }
*** 1324,1359 **** public static boolean isBuiltinJavax() { final Global instance = Global.instance(); return instance.javax == instance.getBuiltinJavax(); } ! private ScriptObject getBuiltinJavaImporter() { ! return builtinJavaImporter; } /** * Called from compiled script code to test if builtin has been overridden * * @return true if builtin Java importer has not been overridden */ public static boolean isBuiltinJavaImporter() { final Global instance = Global.instance(); ! return instance.javaImporter == instance.getBuiltinJavaImporter(); ! } ! ! private ScriptObject getBuiltinMath() { ! return builtinMath; } /** * Called from compiled script code to test if builtin has been overridden * * @return true if builtin math has not been overridden */ public static boolean isBuiltinMath() { final Global instance = Global.instance(); ! return instance.math == instance.getBuiltinMath(); } private ScriptFunction getBuiltinNumber() { return builtinNumber; } --- 1709,1750 ---- public static boolean isBuiltinJavax() { final Global instance = Global.instance(); return instance.javax == instance.getBuiltinJavax(); } ! private synchronized ScriptFunction getBuiltinJavaImporter() { ! if (this.builtinJavaImporter == null) { ! this.builtinJavaImporter = initConstructor("JavaImporter", ScriptFunction.class); ! } ! return this.builtinJavaImporter; ! } ! ! private synchronized ScriptObject getBuiltinJavaApi() { ! if (this.builtinJavaApi == null) { ! this.builtinJavaApi = initConstructor("Java", ScriptObject.class); ! } ! return this.builtinJavaApi; } /** * Called from compiled script code to test if builtin has been overridden * * @return true if builtin Java importer has not been overridden */ public static boolean isBuiltinJavaImporter() { final Global instance = Global.instance(); ! return instance.javaImporter == LAZY_SENTINEL || instance.javaImporter == instance.getBuiltinJavaImporter(); } /** * Called from compiled script code to test if builtin has been overridden * * @return true if builtin math has not been overridden */ public static boolean isBuiltinMath() { final Global instance = Global.instance(); ! return instance.math == instance.builtinMath; } private ScriptFunction getBuiltinNumber() { return builtinNumber; }
*** 1394,1418 **** public static boolean isBuiltinPackages() { final Global instance = Global.instance(); return instance.packages == instance.getBuiltinPackages(); } ! private ScriptFunction getBuiltinRangeError() { return builtinRangeError; } /** * Called from compiled script code to test if builtin has been overridden * * @return true if builtin range error has not been overridden */ public static boolean isBuiltinRangeError() { final Global instance = Global.instance(); ! return instance.rangeError == instance.getBuiltinRangeError(); } ! private ScriptFunction getBuiltinReferenceError() { return builtinReferenceError; } /** * Called from compiled script code to test if builtin has been overridden --- 1785,1812 ---- public static boolean isBuiltinPackages() { final Global instance = Global.instance(); return instance.packages == instance.getBuiltinPackages(); } ! private synchronized ScriptFunction getBuiltinRangeError() { ! if (this.builtinRangeError == null) { ! this.builtinRangeError = initErrorSubtype("RangeError", getErrorPrototype()); ! } return builtinRangeError; } /** * Called from compiled script code to test if builtin has been overridden * * @return true if builtin range error has not been overridden */ public static boolean isBuiltinRangeError() { final Global instance = Global.instance(); ! return instance.rangeError == LAZY_SENTINEL || instance.rangeError == instance.getBuiltinRangeError(); } ! private synchronized ScriptFunction getBuiltinReferenceError() { return builtinReferenceError; } /** * Called from compiled script code to test if builtin has been overridden
*** 1422,1443 **** public static boolean isBuiltinReferenceError() { final Global instance = Global.instance(); return instance.referenceError == instance.getBuiltinReferenceError(); } ! private ScriptFunction getBuiltinRegExp() { return builtinRegExp; } /** * Called from compiled script code to test if builtin has been overridden * * @return true if builtin regexp has not been overridden */ public static boolean isBuiltinRegExp() { final Global instance = Global.instance(); ! return instance.regexp == instance.getBuiltinRegExp(); } private ScriptFunction getBuiltinString() { return builtinString; } --- 1816,1846 ---- public static boolean isBuiltinReferenceError() { final Global instance = Global.instance(); return instance.referenceError == instance.getBuiltinReferenceError(); } ! private synchronized ScriptFunction getBuiltinRegExp() { ! if (this.builtinRegExp == null) { ! this.builtinRegExp = initConstructorAndSwitchPoint("RegExp", ScriptFunction.class); ! final ScriptObject regExpProto = ScriptFunction.getPrototype(builtinRegExp); ! // initialize default regexp object ! this.DEFAULT_REGEXP = new NativeRegExp("(?:)", "", this, regExpProto); ! // RegExp.prototype should behave like a RegExp object. So copy the ! // properties. ! regExpProto.addBoundProperties(DEFAULT_REGEXP); ! } return builtinRegExp; } /** * Called from compiled script code to test if builtin has been overridden * * @return true if builtin regexp has not been overridden */ public static boolean isBuiltinRegExp() { final Global instance = Global.instance(); ! return instance.regexp == LAZY_SENTINEL || instance.regexp == instance.getBuiltinRegExp(); } private ScriptFunction getBuiltinString() { return builtinString; }
*** 1478,1499 **** public static boolean isBuiltinTypeError() { final Global instance = Global.instance(); return instance.typeError == instance.getBuiltinTypeError(); } ! private ScriptFunction getBuiltinURIError() { ! return builtinURIError; } /** * Called from compiled script code to test if builtin has been overridden * * @return true if builtin URI error has not been overridden */ public static boolean isBuiltinURIError() { final Global instance = Global.instance(); ! return instance.uriError == instance.getBuiltinURIError(); } @Override public String getClassName() { return "global"; --- 1881,1905 ---- public static boolean isBuiltinTypeError() { final Global instance = Global.instance(); return instance.typeError == instance.getBuiltinTypeError(); } ! private synchronized ScriptFunction getBuiltinURIError() { ! if (this.builtinURIError == null) { ! this.builtinURIError = initErrorSubtype("URIError", getErrorPrototype()); ! } ! return this.builtinURIError; } /** * Called from compiled script code to test if builtin has been overridden * * @return true if builtin URI error has not been overridden */ public static boolean isBuiltinURIError() { final Global instance = Global.instance(); ! return instance.uriError == LAZY_SENTINEL || instance.uriError == instance.getBuiltinURIError(); } @Override public String getClassName() { return "global";
*** 1901,1947 **** this.quit = ScriptFunctionImpl.makeFunction("quit", EXIT); // built-in constructors this.builtinArray = initConstructorAndSwitchPoint("Array", ScriptFunction.class); this.builtinBoolean = initConstructorAndSwitchPoint("Boolean", ScriptFunction.class); - this.builtinDate = initConstructorAndSwitchPoint("Date", ScriptFunction.class); - this.builtinJSON = initConstructorAndSwitchPoint("JSON", ScriptObject.class); - this.builtinJSAdapter = initConstructorAndSwitchPoint("JSAdapter", ScriptFunction.class); - this.builtinMath = initConstructorAndSwitchPoint("Math", ScriptObject.class); this.builtinNumber = initConstructorAndSwitchPoint("Number", ScriptFunction.class); - this.builtinRegExp = initConstructorAndSwitchPoint("RegExp", ScriptFunction.class); this.builtinString = initConstructorAndSwitchPoint("String", ScriptFunction.class); // initialize String.prototype.length to 0 // add String.prototype.length final ScriptObject stringPrototype = getStringPrototype(); stringPrototype.addOwnProperty("length", Attribute.NON_ENUMERABLE_CONSTANT, 0.0); // set isArray flag on Array.prototype final ScriptObject arrayPrototype = getArrayPrototype(); arrayPrototype.setIsArray(); - this.DEFAULT_DATE = new NativeDate(Double.NaN, this); - - // initialize default regexp object - this.DEFAULT_REGEXP = new NativeRegExp("(?:)", this); - - // RegExp.prototype should behave like a RegExp object. So copy the - // properties. - final ScriptObject regExpProto = getRegExpPrototype(); - regExpProto.addBoundProperties(DEFAULT_REGEXP); - // Error stuff initErrorObjects(); // java access if (! env._no_java) { initJavaAccess(); } if (! env._no_typed_arrays) { ! initTypedArray(); } if (env._scripting) { initScripting(env); } --- 2307,2351 ---- this.quit = ScriptFunctionImpl.makeFunction("quit", EXIT); // built-in constructors this.builtinArray = initConstructorAndSwitchPoint("Array", ScriptFunction.class); this.builtinBoolean = initConstructorAndSwitchPoint("Boolean", ScriptFunction.class); this.builtinNumber = initConstructorAndSwitchPoint("Number", ScriptFunction.class); this.builtinString = initConstructorAndSwitchPoint("String", ScriptFunction.class); + this.builtinMath = initConstructorAndSwitchPoint("Math", ScriptObject.class); // initialize String.prototype.length to 0 // add String.prototype.length final ScriptObject stringPrototype = getStringPrototype(); stringPrototype.addOwnProperty("length", Attribute.NON_ENUMERABLE_CONSTANT, 0.0); // set isArray flag on Array.prototype final ScriptObject arrayPrototype = getArrayPrototype(); arrayPrototype.setIsArray(); // Error stuff initErrorObjects(); // java access if (! env._no_java) { + this.javaApi = LAZY_SENTINEL; + this.javaImporter = LAZY_SENTINEL; initJavaAccess(); } if (! env._no_typed_arrays) { ! this.arrayBuffer = LAZY_SENTINEL; ! this.dataView = LAZY_SENTINEL; ! this.int8Array = LAZY_SENTINEL; ! this.uint8Array = LAZY_SENTINEL; ! this.uint8ClampedArray = LAZY_SENTINEL; ! this.int16Array = LAZY_SENTINEL; ! this.uint16Array = LAZY_SENTINEL; ! this.int32Array = LAZY_SENTINEL; ! this.uint32Array = LAZY_SENTINEL; ! this.float32Array = LAZY_SENTINEL; ! this.float64Array = LAZY_SENTINEL; } if (env._scripting) { initScripting(env); }
*** 2011,2026 **** // Error.prototype.message = ""; errorProto.set(NativeError.MESSAGE, "", 0); tagBuiltinProperties("Error", builtinError); - this.builtinEvalError = initErrorSubtype("EvalError", errorProto); - this.builtinRangeError = initErrorSubtype("RangeError", errorProto); this.builtinReferenceError = initErrorSubtype("ReferenceError", errorProto); this.builtinSyntaxError = initErrorSubtype("SyntaxError", errorProto); this.builtinTypeError = initErrorSubtype("TypeError", errorProto); - this.builtinURIError = initErrorSubtype("URIError", errorProto); } private ScriptFunction initErrorSubtype(final String name, final ScriptObject errorProto) { final ScriptFunction cons = initConstructor(name, ScriptFunction.class); final ScriptObject prototype = ScriptFunction.getPrototype(cons); --- 2415,2427 ----
*** 2038,2049 **** this.builtinEdu = new NativeJavaPackage("edu", objectProto); this.builtinJava = new NativeJavaPackage("java", objectProto); this.builtinJavafx = new NativeJavaPackage("javafx", objectProto); this.builtinJavax = new NativeJavaPackage("javax", objectProto); this.builtinOrg = new NativeJavaPackage("org", objectProto); - this.builtinJavaImporter = initConstructor("JavaImporter", ScriptFunction.class); - this.builtinJavaApi = initConstructor("Java", ScriptObject.class); } private void initScripting(final ScriptEnvironment scriptEnv) { Object value; value = ScriptFunctionImpl.makeFunction("readLine", ScriptingFunctions.READLINE); --- 2439,2448 ----
*** 2091,2154 **** throw new RuntimeException(exp); } } } - private void initTypedArray() { - this.builtinArrayBuffer = initConstructorAndSwitchPoint("ArrayBuffer", ScriptFunction.class); - this.builtinDataView = initConstructorAndSwitchPoint("DataView", ScriptFunction.class); - this.builtinInt8Array = initConstructorAndSwitchPoint("Int8Array", ScriptFunction.class); - this.builtinUint8Array = initConstructorAndSwitchPoint("Uint8Array", ScriptFunction.class); - this.builtinUint8ClampedArray = initConstructorAndSwitchPoint("Uint8ClampedArray", ScriptFunction.class); - this.builtinInt16Array = initConstructorAndSwitchPoint("Int16Array", ScriptFunction.class); - this.builtinUint16Array = initConstructorAndSwitchPoint("Uint16Array", ScriptFunction.class); - this.builtinInt32Array = initConstructorAndSwitchPoint("Int32Array", ScriptFunction.class); - this.builtinUint32Array = initConstructorAndSwitchPoint("Uint32Array", ScriptFunction.class); - this.builtinFloat32Array = initConstructorAndSwitchPoint("Float32Array", ScriptFunction.class); - this.builtinFloat64Array = initConstructorAndSwitchPoint("Float64Array", ScriptFunction.class); - - } - private void copyBuiltins() { this.array = this.builtinArray; this._boolean = this.builtinBoolean; - this.date = this.builtinDate; this.error = this.builtinError; - this.evalError = this.builtinEvalError; this.function = this.builtinFunction; - this.jsadapter = this.builtinJSAdapter; - this.json = this.builtinJSON; this.com = this.builtinCom; this.edu = this.builtinEdu; this.java = this.builtinJava; this.javafx = this.builtinJavafx; this.javax = this.builtinJavax; this.org = this.builtinOrg; - this.javaImporter = this.builtinJavaImporter; - this.javaApi = this.builtinJavaApi; this.math = this.builtinMath; this.number = this.builtinNumber; this.object = this.builtinObject; this.packages = this.builtinPackages; - this.rangeError = this.builtinRangeError; this.referenceError = this.builtinReferenceError; - this.regexp = this.builtinRegExp; this.string = this.builtinString; this.syntaxError = this.builtinSyntaxError; this.typeError = this.builtinTypeError; - this.uriError = this.builtinURIError; - this.arrayBuffer = this.builtinArrayBuffer; - this.dataView = this.builtinDataView; - this.int8Array = this.builtinInt8Array; - this.uint8Array = this.builtinUint8Array; - this.uint8ClampedArray = this.builtinUint8ClampedArray; - this.int16Array = this.builtinInt16Array; - this.uint16Array = this.builtinUint16Array; - this.int32Array = this.builtinInt32Array; - this.uint32Array = this.builtinUint32Array; - this.float32Array = this.builtinFloat32Array; - this.float64Array = this.builtinFloat64Array; } private void initDebug() { this.addOwnProperty("Debug", Attribute.NOT_ENUMERABLE, initConstructor("Debug", ScriptObject.class)); } --- 2490,2518 ----