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);
}
}