19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package jdk.nashorn.internal.runtime;
27
28 import static jdk.nashorn.internal.codegen.CompilerConstants.staticCall;
29 import static jdk.nashorn.internal.runtime.ECMAErrors.typeError;
30
31 import java.lang.invoke.MethodHandle;
32 import java.lang.invoke.MethodHandles;
33 import java.lang.reflect.Array;
34 import java.util.Deque;
35 import java.util.List;
36 import jdk.internal.dynalink.beans.StaticClass;
37 import jdk.nashorn.api.scripting.JSObject;
38 import jdk.nashorn.internal.codegen.CompilerConstants.Call;
39 import jdk.nashorn.internal.parser.Lexer;
40 import jdk.nashorn.internal.runtime.arrays.ArrayLikeIterator;
41 import jdk.nashorn.internal.runtime.linker.Bootstrap;
42
43 /**
44 * Representation for ECMAScript types - this maps directly to the ECMA script standard
45 */
46 public enum JSType {
47 /** The undefined type */
48 UNDEFINED("undefined"),
49
50 /** The null type */
51 NULL("object"),
52
53 /** The boolean type */
54 BOOLEAN("boolean"),
55
56 /** The number type */
57 NUMBER("number"),
58
835 /**
836 * Identity converter for objects.
837 *
838 * @param obj an object
839 * @return the boxed number
840 */
841 public static Object toObject(final Object obj) {
842 return obj;
843 }
844
845 /**
846 * Object conversion. This is used to convert objects and numbers to their corresponding
847 * NativeObject type
848 * See ECMA 9.9 ToObject
849 *
850 * @param obj the object to convert
851 *
852 * @return the wrapped object
853 */
854 public static Object toScriptObject(final Object obj) {
855 return toScriptObject(Context.getGlobalTrusted(), obj);
856 }
857
858 /**
859 * Object conversion. This is used to convert objects and numbers to their corresponding
860 * NativeObject type
861 * See ECMA 9.9 ToObject
862 *
863 * @param global the global object
864 * @param obj the object to convert
865 *
866 * @return the wrapped object
867 */
868 public static Object toScriptObject(final ScriptObject global, final Object obj) {
869 if (nullOrUndefined(obj)) {
870 throw typeError(global, "not.an.object", ScriptRuntime.safeToString(obj));
871 }
872
873 if (obj instanceof ScriptObject) {
874 return obj;
875 }
876
877 return ((GlobalObject)global).wrapAsObject(obj);
878 }
879
880 /**
881 * Script object to Java array conversion.
882 *
883 * @param obj script object to be converted to Java array
884 * @param componentType component type of the destination array required
885 * @return converted Java array
886 */
887 public static Object toJavaArray(final Object obj, final Class<?> componentType) {
888 if (obj instanceof ScriptObject) {
889 return ((ScriptObject)obj).getArray().asArrayOfType(componentType);
890 } else if (obj instanceof JSObject) {
891 final ArrayLikeIterator<?> itr = ArrayLikeIterator.arrayLikeIterator(obj);
892 final int len = (int) itr.getLength();
893 final Object[] res = new Object[len];
894 int idx = 0;
895 while (itr.hasNext()) {
896 res[idx++] = itr.next();
897 }
967 static String toStringImpl(final Object obj, final boolean safe) {
968 if (obj instanceof String) {
969 return (String)obj;
970 }
971
972 if (obj instanceof Number) {
973 return toString(((Number)obj).doubleValue());
974 }
975
976 if (obj == ScriptRuntime.UNDEFINED) {
977 return "undefined";
978 }
979
980 if (obj == null) {
981 return "null";
982 }
983
984 if (obj instanceof ScriptObject) {
985 if (safe) {
986 final ScriptObject sobj = (ScriptObject)obj;
987 final GlobalObject gobj = (GlobalObject)Context.getGlobalTrusted();
988 return gobj.isError(sobj) ?
989 ECMAException.safeToString(sobj) :
990 sobj.safeToString();
991 }
992
993 return toString(toPrimitive(obj, String.class));
994 }
995
996 if (obj instanceof StaticClass) {
997 return "[JavaClass " + ((StaticClass)obj).getRepresentedClass().getName() + "]";
998 }
999
1000 return obj.toString();
1001 }
1002
1003 // trim from left for JS whitespaces.
1004 static String trimLeft(final String str) {
1005 int start = 0;
1006
1007 while (start < str.length() && Lexer.isJSWhitespace(str.charAt(start))) {
|
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26 package jdk.nashorn.internal.runtime;
27
28 import static jdk.nashorn.internal.codegen.CompilerConstants.staticCall;
29 import static jdk.nashorn.internal.runtime.ECMAErrors.typeError;
30
31 import java.lang.invoke.MethodHandle;
32 import java.lang.invoke.MethodHandles;
33 import java.lang.reflect.Array;
34 import java.util.Deque;
35 import java.util.List;
36 import jdk.internal.dynalink.beans.StaticClass;
37 import jdk.nashorn.api.scripting.JSObject;
38 import jdk.nashorn.internal.codegen.CompilerConstants.Call;
39 import jdk.nashorn.internal.objects.Global;
40 import jdk.nashorn.internal.parser.Lexer;
41 import jdk.nashorn.internal.runtime.arrays.ArrayLikeIterator;
42 import jdk.nashorn.internal.runtime.linker.Bootstrap;
43
44 /**
45 * Representation for ECMAScript types - this maps directly to the ECMA script standard
46 */
47 public enum JSType {
48 /** The undefined type */
49 UNDEFINED("undefined"),
50
51 /** The null type */
52 NULL("object"),
53
54 /** The boolean type */
55 BOOLEAN("boolean"),
56
57 /** The number type */
58 NUMBER("number"),
59
836 /**
837 * Identity converter for objects.
838 *
839 * @param obj an object
840 * @return the boxed number
841 */
842 public static Object toObject(final Object obj) {
843 return obj;
844 }
845
846 /**
847 * Object conversion. This is used to convert objects and numbers to their corresponding
848 * NativeObject type
849 * See ECMA 9.9 ToObject
850 *
851 * @param obj the object to convert
852 *
853 * @return the wrapped object
854 */
855 public static Object toScriptObject(final Object obj) {
856 return toScriptObject(Context.getGlobal(), obj);
857 }
858
859 /**
860 * Object conversion. This is used to convert objects and numbers to their corresponding
861 * NativeObject type
862 * See ECMA 9.9 ToObject
863 *
864 * @param global the global object
865 * @param obj the object to convert
866 *
867 * @return the wrapped object
868 */
869 public static Object toScriptObject(final Global global, final Object obj) {
870 if (nullOrUndefined(obj)) {
871 throw typeError(global, "not.an.object", ScriptRuntime.safeToString(obj));
872 }
873
874 if (obj instanceof ScriptObject) {
875 return obj;
876 }
877
878 return global.wrapAsObject(obj);
879 }
880
881 /**
882 * Script object to Java array conversion.
883 *
884 * @param obj script object to be converted to Java array
885 * @param componentType component type of the destination array required
886 * @return converted Java array
887 */
888 public static Object toJavaArray(final Object obj, final Class<?> componentType) {
889 if (obj instanceof ScriptObject) {
890 return ((ScriptObject)obj).getArray().asArrayOfType(componentType);
891 } else if (obj instanceof JSObject) {
892 final ArrayLikeIterator<?> itr = ArrayLikeIterator.arrayLikeIterator(obj);
893 final int len = (int) itr.getLength();
894 final Object[] res = new Object[len];
895 int idx = 0;
896 while (itr.hasNext()) {
897 res[idx++] = itr.next();
898 }
968 static String toStringImpl(final Object obj, final boolean safe) {
969 if (obj instanceof String) {
970 return (String)obj;
971 }
972
973 if (obj instanceof Number) {
974 return toString(((Number)obj).doubleValue());
975 }
976
977 if (obj == ScriptRuntime.UNDEFINED) {
978 return "undefined";
979 }
980
981 if (obj == null) {
982 return "null";
983 }
984
985 if (obj instanceof ScriptObject) {
986 if (safe) {
987 final ScriptObject sobj = (ScriptObject)obj;
988 final Global gobj = Context.getGlobal();
989 return gobj.isError(sobj) ?
990 ECMAException.safeToString(sobj) :
991 sobj.safeToString();
992 }
993
994 return toString(toPrimitive(obj, String.class));
995 }
996
997 if (obj instanceof StaticClass) {
998 return "[JavaClass " + ((StaticClass)obj).getRepresentedClass().getName() + "]";
999 }
1000
1001 return obj.toString();
1002 }
1003
1004 // trim from left for JS whitespaces.
1005 static String trimLeft(final String str) {
1006 int start = 0;
1007
1008 while (start < str.length() && Lexer.isJSWhitespace(str.charAt(start))) {
|