⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nativejavaobject.java

📁 這是一個javascript 的 interpreter是了解 web browser的好材料
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
                    return 4;                }            }            break;        case JSTYPE_JAVA_CLASS:            if (to == ScriptRuntime.ClassClass) {                return 1;            }            else if (to == ScriptRuntime.ObjectClass) {                return 3;            }            else if (to == ScriptRuntime.StringClass) {                return 4;            }            break;        case JSTYPE_JAVA_OBJECT:        case JSTYPE_JAVA_ARRAY:            Object javaObj = fromObj;            if (javaObj instanceof Wrapper) {                javaObj = ((Wrapper)javaObj).unwrap();            }            if (to.isInstance(javaObj)) {                return CONVERSION_NONTRIVIAL;            }            if (to == ScriptRuntime.StringClass) {                return 2;            }            else if (to.isPrimitive() && to != Boolean.TYPE) {                return (fromCode == JSTYPE_JAVA_ARRAY)                       ? CONVERSION_NONE : 2 + getSizeRank(to);            }            break;        case JSTYPE_OBJECT:            // Other objects takes #1-#3 spots            if (to == fromObj.getClass()) {                // No conversion required                return 1;            }            if (to.isArray()) {                if (fromObj instanceof NativeArray) {                    // This is a native array conversion to a java array                    // Array conversions are all equal, and preferable to object                    // and string conversion, per LC3.                    return 1;                }            }            else if (to == ScriptRuntime.ObjectClass) {                return 2;            }            else if (to == ScriptRuntime.StringClass) {                return 3;            }            else if (to == ScriptRuntime.DateClass) {                if (fromObj instanceof NativeDate) {                    // This is a native date to java date conversion                    return 1;                }            }            else if (to.isInterface()) {                if (fromObj instanceof Function) {                    // See comments in coerceType                    if (to.getMethods().length == 1) {                        return 1;                    }                }                return 11;            }            else if (to.isPrimitive() && to != Boolean.TYPE) {                return 3 + getSizeRank(to);            }            break;        }        return CONVERSION_NONE;    }    static int getSizeRank(Class aType) {        if (aType == Double.TYPE) {            return 1;        }        else if (aType == Float.TYPE) {            return 2;        }        else if (aType == Long.TYPE) {            return 3;        }        else if (aType == Integer.TYPE) {            return 4;        }        else if (aType == Short.TYPE) {            return 5;        }        else if (aType == Character.TYPE) {            return 6;        }        else if (aType == Byte.TYPE) {            return 7;        }        else if (aType == Boolean.TYPE) {            return CONVERSION_NONE;        }        else {            return 8;        }    }    private static int getJSTypeCode(Object value) {        if (value == null) {            return JSTYPE_NULL;        }        else if (value == Undefined.instance) {            return JSTYPE_UNDEFINED;        }        else if (value instanceof String) {            return JSTYPE_STRING;        }        else if (value instanceof Number) {            return JSTYPE_NUMBER;        }        else if (value instanceof Boolean) {            return JSTYPE_BOOLEAN;        }        else if (value instanceof Scriptable) {            if (value instanceof NativeJavaClass) {                return JSTYPE_JAVA_CLASS;            }            else if (value instanceof NativeJavaArray) {                return JSTYPE_JAVA_ARRAY;            }            else if (value instanceof Wrapper) {                return JSTYPE_JAVA_OBJECT;            }            else {                return JSTYPE_OBJECT;            }        }        else if (value instanceof Class) {            return JSTYPE_JAVA_CLASS;        }        else {            Class valueClass = value.getClass();            if (valueClass.isArray()) {                return JSTYPE_JAVA_ARRAY;            }            else {                return JSTYPE_JAVA_OBJECT;            }        }    }    /**     * Not intended for public use. Callers should use the     * public API Context.toType.     * @deprecated as of 1.5 Release 4     * @see org.mozilla.javascript.Context#jsToJava(Object, Class)     */    public static Object coerceType(Class type, Object value)    {        return coerceTypeImpl(type, value);    }    /**     * Type-munging for field setting and method invocation.     * Conforms to LC3 specification     */    static Object coerceTypeImpl(Class type, Object value)    {        if (value != null && value.getClass() == type) {            return value;        }        switch (getJSTypeCode(value)) {        case JSTYPE_NULL:            // raise error if type.isPrimitive()            if (type.isPrimitive()) {                reportConversionError(value, type);            }            return null;        case JSTYPE_UNDEFINED:            if (type == ScriptRuntime.StringClass ||                type == ScriptRuntime.ObjectClass) {                return "undefined";            }            else {                reportConversionError("undefined", type);            }            break;        case JSTYPE_BOOLEAN:            // Under LC3, only JS Booleans can be coerced into a Boolean value            if (type == Boolean.TYPE ||                type == ScriptRuntime.BooleanClass ||                type == ScriptRuntime.ObjectClass) {                return value;            }            else if (type == ScriptRuntime.StringClass) {                return value.toString();            }            else {                reportConversionError(value, type);            }            break;        case JSTYPE_NUMBER:            if (type == ScriptRuntime.StringClass) {                return ScriptRuntime.toString(value);            }            else if (type == ScriptRuntime.ObjectClass) {                return coerceToNumber(Double.TYPE, value);            }            else if ((type.isPrimitive() && type != Boolean.TYPE) ||                     ScriptRuntime.NumberClass.isAssignableFrom(type)) {                return coerceToNumber(type, value);            }            else {                reportConversionError(value, type);            }            break;        case JSTYPE_STRING:            if (type == ScriptRuntime.StringClass || type.isInstance(value)) {                return value;            }            else if (type == Character.TYPE                     || type == ScriptRuntime.CharacterClass)            {                // Special case for converting a single char string to a                // character                // Placed here because it applies *only* to JS strings,                // not other JS objects converted to strings                if (((String)value).length() == 1) {                    return new Character(((String)value).charAt(0));                }                else {                    return coerceToNumber(type, value);                }            }            else if ((type.isPrimitive() && type != Boolean.TYPE)                     || ScriptRuntime.NumberClass.isAssignableFrom(type))            {                return coerceToNumber(type, value);            }            else {                reportConversionError(value, type);            }            break;        case JSTYPE_JAVA_CLASS:            if (value instanceof Wrapper) {                value = ((Wrapper)value).unwrap();            }            if (type == ScriptRuntime.ClassClass ||                type == ScriptRuntime.ObjectClass) {                return value;            }            else if (type == ScriptRuntime.StringClass) {                return value.toString();            }            else {                reportConversionError(value, type);            }            break;        case JSTYPE_JAVA_OBJECT:        case JSTYPE_JAVA_ARRAY:                          if (value instanceof Wrapper) {              value = ((Wrapper)value).unwrap();            }            if (type.isPrimitive()) {                if (type == Boolean.TYPE) {                    reportConversionError(value, type);                }                return coerceToNumber(type, value);            }            else {               if (type == ScriptRuntime.StringClass) {                    return value.toString();                }                else {                    if (type.isInstance(value)) {                        return value;                    }                    else {                        reportConversionError(value, type);                    }                }            }            break;        case JSTYPE_OBJECT:            if (type == ScriptRuntime.StringClass) {                return ScriptRuntime.toString(value);            }            else if (type.isPrimitive()) {                if (type == Boolean.TYPE) {                    reportConversionError(value, type);                }                return coerceToNumber(type, value);            }            else if (type.isInstance(value)) {                return value;            }            else if (type == ScriptRuntime.DateClass                     && value instanceof NativeDate)            {                double time = ((NativeDate)value).getJSTimeValue();                // XXX: This will replace NaN by 0                return new Date((long)time);            }            else if (type.isArray() && value instanceof NativeArray) {                // Make a new java array, and coerce the JS array components                // to the target (component) type.                NativeArray array = (NativeArray) value;                long length = array.getLength();                Class arrayType = type.getComponentType();                Object Result = Array.newInstance(arrayType, (int)length);                for (int i = 0 ; i < length ; ++i) {                    try  {                        Array.set(Result, i, coerceType(arrayType,                                                        array.get(i, array)));                    }                    catch (EvaluatorException ee) {                        reportConversionError(value, type);                    }                }                return Result;            }            else if (value instanceof Wrapper) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -