src/jdk/nashorn/api/scripting/ScriptObjectMirror.java
Print this page
*** 340,349 ****
--- 340,527 ----
return Collections.unmodifiableList(values);
}
});
}
+ // Support for ECMAScript Object API on mirrors
+
+ /**
+ * Return the __proto__ of this object.
+ * @return __proto__ object.
+ */
+ public Object getProto() {
+ return inGlobal(new Callable<Object>() {
+ @Override public Object call() {
+ return wrap(getScriptObject().getProto(), global);
+ }
+ });
+ }
+
+ /**
+ * ECMA 8.12.1 [[GetOwnProperty]] (P)
+ *
+ * @param key property key
+ *
+ * @return Returns the Property Descriptor of the named own property of this
+ * object, or undefined if absent.
+ */
+ public Object getOwnPropertyDescriptor(final String key) {
+ return inGlobal(new Callable<Object>() {
+ @Override public Object call() {
+ return wrap(getScriptObject().getOwnPropertyDescriptor(key), global);
+ }
+ });
+ }
+
+ /**
+ * return an array of own property keys associated with the object.
+ *
+ * @param all True if to include non-enumerable keys.
+ * @return Array of keys.
+ */
+ public String[] getOwnKeys(final boolean all) {
+ return inGlobal(new Callable<String[]>() {
+ @Override public String[] call() {
+ return getScriptObject().getOwnKeys(all);
+ }
+ });
+ }
+
+ /**
+ * Flag this script object as non extensible
+ *
+ * @return the object after being made non extensible
+ */
+ public ScriptObjectMirror preventExtensions() {
+ return inGlobal(new Callable<ScriptObjectMirror>() {
+ @Override public ScriptObjectMirror call() {
+ getScriptObject().preventExtensions();
+ return ScriptObjectMirror.this;
+ }
+ });
+ }
+
+ /**
+ * Check if this script object is extensible
+ * @return true if extensible
+ */
+ public boolean isExtensible() {
+ return inGlobal(new Callable<Boolean>() {
+ @Override public Boolean call() {
+ return getScriptObject().isExtensible();
+ }
+ });
+ }
+
+ /**
+ * ECMAScript 15.2.3.8 - seal implementation
+ * @return the sealed script object
+ */
+ public ScriptObjectMirror seal() {
+ return inGlobal(new Callable<ScriptObjectMirror>() {
+ @Override public ScriptObjectMirror call() {
+ getScriptObject().seal();
+ return ScriptObjectMirror.this;
+ }
+ });
+ }
+
+ /**
+ * Check whether this script object is sealed
+ * @return true if sealed
+ */
+ public boolean isSealed() {
+ return inGlobal(new Callable<Boolean>() {
+ @Override public Boolean call() {
+ return getScriptObject().isSealed();
+ }
+ });
+ }
+
+ /**
+ * ECMA 15.2.39 - freeze implementation. Freeze this script object
+ * @return the frozen script object
+ */
+ public ScriptObjectMirror freeze() {
+ return inGlobal(new Callable<ScriptObjectMirror>() {
+ @Override public ScriptObjectMirror call() {
+ getScriptObject().freeze();
+ return ScriptObjectMirror.this;
+ }
+ });
+ }
+
+ /**
+ * Check whether this script object is frozen
+ * @return true if frozen
+ */
+ public boolean isFrozen() {
+ return inGlobal(new Callable<Boolean>() {
+ @Override public Boolean call() {
+ return getScriptObject().isFrozen();
+ }
+ });
+ }
+
+ // ECMAScript instanceof check
+
+ /**
+ * Checking whether a script object is an instance of another by
+ * walking the proto chain
+ *
+ * @param instance instace to check
+ * @return true if 'instance' is an instance of this object
+ */
+ public boolean isInstance(final ScriptObjectMirror instance) {
+ // if not belongs to my global scope, return false
+ if (instance == null || global != instance.global) {
+ return false;
+ }
+
+ return inGlobal(new Callable<Boolean>() {
+ @Override public Boolean call() {
+ return getScriptObject().isInstance(instance.getScriptObject());
+ }
+ });
+ }
+
+ /**
+ * Utility to check if given object is ECMAScript undefined value
+ *
+ * @param obj object to check
+ * @return true if 'obj' is ECMAScript undefined value
+ */
+ public static boolean isUndefined(final Object obj) {
+ return obj == ScriptRuntime.UNDEFINED;
+ }
+
+ /**
+ * is this a function object?
+ *
+ * @return if this mirror wraps a ECMAScript function instance
+ */
+ public boolean isFunction() {
+ return getScriptObject() instanceof ScriptFunction;
+ }
+
+ /**
+ * is this a 'use strict' function object?
+ *
+ * @return true if this mirror represents a ECMAScript 'use strict' function
+ */
+ public boolean isStrictFunction() {
+ return isFunction() && ((ScriptFunction)getScriptObject()).isStrict();
+ }
+
+ /**
+ * is this an array object?
+ *
+ * @return if this mirror wraps a ECMAScript array object
+ */
+ public boolean isArray() {
+ return getScriptObject().isArray();
+ }
// These are public only so that Context can access these.
/**
* Make a script object mirror on given object if needed.