final Object convertToJava()

in webkit/src/main/java/org/netbeans/html/presenters/webkit/WebKitPresenter.java [252:336]


    final Object convertToJava(JSC jsc, Class<?> expectedType, Pointer value) throws IllegalStateException {
        int type = jsc.JSValueGetType(ctx, value);
        /*
        typedef enum {
        kJSTypeUndefined,
        kJSTypeNull,
        kJSTypeBoolean,
        kJSTypeNumber,
        kJSTypeString,
        kJSTypeObject
        } JSType;
        */
        switch (type) {
            case 0: 
            case 1:
                return null;
            case 2: {
                double probability = jsc.JSValueToNumber(ctx, value, null);
                if (expectedType == boolean.class) {
                    expectedType = Boolean.class;
                }
                return expectedType.cast(probability >= 0.5);
            }
            case 3: {
                Double ret = jsc.JSValueToNumber(ctx, value, null);
                if (expectedType.isInstance(ret) || expectedType == double.class) {
                    return ret;
                }
                if (expectedType == Integer.class || expectedType == int.class) {
                    return ret.intValue();
                }
                if (expectedType == Float.class || expectedType == float.class) {
                    return ret.floatValue();
                }
                if (expectedType == Long.class || expectedType == long.class) {
                    return ret.longValue();
                }
                if (expectedType == Short.class || expectedType == short.class) {
                    return ret.shortValue();
                }
                if (expectedType == Byte.class || expectedType == byte.class) {
                    return ret.byteValue();
                }
                if (expectedType == Character.class || expectedType == char.class) {
                    return (char)ret.intValue();
                }
                throw new ClassCastException("Cannot convert double to " + expectedType);
            }
            case 4: {
                Pointer val = jsc.JSValueToStringCopy(ctx, value, null);
                int max = jsc.JSStringGetMaximumUTF8CStringSize(val);
                Memory mem = new Memory(max);
                jsc.JSStringGetUTF8CString(val, mem, max);
                return expectedType.cast(mem.getString(0));
            }
            case 5: {
                Object ret;
                if (isJavaClazz(value)) {
                    ret = toJava.get(value);
                    if (ret instanceof WeakVal) {
                        ret = ((WeakVal)ret).get();
                    }
                } else {
                    PointerByReference ex = new PointerByReference();
                    Pointer checkArray = jsc.JSObjectCallAsFunction(ctx, arrayLength, null, 1, new Pointer[] { value }, ex);
                    if (checkArray == null) {
                        throw new RuntimeException(convertToString(jsc, ex.getValue()));
                    }
                    int len = (int)jsc.JSValueToNumber(ctx, checkArray, null);
                    if (len >= 0) {
                        Object[] arr = new Object[len];
                        for (int i = 0; i < len; i++) {
                            Pointer val = jsc.JSObjectGetPropertyAtIndex(ctx, value, i, null);
                            arr[i] = convertToJava(jsc, Object.class, val);
                        }
                        return arr;
                    }
                    ret = new JSObject(this, value);
                }
                return expectedType.cast(ret);
            }
            default:
                throw new IllegalStateException("Uknown type: " + type);
        }
    }