{"record":{"id":"4bf5de31fd717a01","repo":"java-native-access/jna","slug":"type-not-supported-vartype","errorCode":null,"errorMessage":"Type not supported: <vartype>","messagePattern":"Type not supported: <vartype>","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"contrib/platform/src/com/sun/jna/platform/win32/OaIdlUtil.java","lineNumber":168,"sourceCode":"                    break;\n                case VT_R8:\n                case VT_DATE:\n                    sourceArray = dataPointer.getDoubleArray(0, elementCount);\n                    break;\n                case VT_BSTR:\n                    sourceArray = dataPointer.getPointerArray(0, elementCount);\n                    break;\n                case VT_VARIANT:\n                    VARIANT variant = new VARIANT(dataPointer);\n                    sourceArray = variant.toArray(elementCount);\n                    break;\n                case VT_UNKNOWN:\n                case VT_DISPATCH:\n                case VT_CY:\n                case VT_DECIMAL:\n                case VT_RECORD:\n                default:\n                    throw new IllegalStateException(\"Type not supported: \" + varType);\n            }\n\n            Object targetArray = Array.newInstance(Object.class, elements);\n            toPrimitiveArray(sourceArray, targetArray, elements, cumElements, varType, new int[0]);\n            return targetArray;\n        } finally {\n            sa.unaccessData();\n            if (destruct) {\n                sa.destroy();\n            }\n        }\n    }\n\n    private static void toPrimitiveArray(Object dataArray, Object targetArray, int[] elements, int[] cumElements, int varType, int[] currentIdx) {\n        int dimIdx = currentIdx.length;\n        int[] subIdx = new int[currentIdx.length + 1];\n        System.arraycopy(currentIdx, 0, subIdx, 0, dimIdx);\n        for (int i = 0; i < elements[dimIdx]; i++) {","sourceCodeStart":150,"sourceCodeEnd":186,"githubUrl":"https://github.com/java-native-access/jna/blob/d036ad9781adad4b66693e8fa7098e4ac665e0a3/contrib/platform/src/com/sun/jna/platform/win32/OaIdlUtil.java#L150-L186","documentation":"OaIdlUtil.toPrimitiveArray allocates the target primitive array with a switch over the requested VAREnum varType; VT_UNKNOWN, VT_DISPATCH, VT_CY, VT_DECIMAL, VT_RECORD and unknown types hit `default` and throw IllegalStateException 'Type not supported'.","triggerScenarios":"Calling toPrimitiveArray with varType set to VT_UNKNOWN, VT_DISPATCH, VT_CY, VT_DECIMAL, VT_RECORD, or any value with no case in the switch.","commonSituations":"Converting arrays of COM interface pointers or currency/decimal values; assuming the utility handles all VAREnum types; a COM server changed its return type after an upgrade.","solutions":["Only call toPrimitiveArray for supported varTypes (numeric, boolean, BSTR etc.) and special-case unsupported ones","Read VT_DECIMAL/VT_CY/VT_UNKNOWN elements manually via SAFEARRAY.getElement and Variant wrappers","Convert the SAFEARRAY server-side to a supported element type","Extend the switch in a fork to add the missing type"],"exampleFix":"// before\nObject[] r = OaIdlUtil.toPrimitiveArray(sa, VAREnum.VT_DECIMAL);\n// after\nif (sa.getVarType().intValue() == VAREnum.VT_DECIMAL) {\n    List<DECIMAL> r = readDecimalsManually(sa);\n} else {\n    Object[] r = OaIdlUtil.toPrimitiveArray(sa);\n}","handlingStrategy":"type-guard","validationCode":"int vt = varType;\nboolean supported = !(vt==VAREnum.VT_UNKNOWN||vt==VAREnum.VT_DISPATCH||vt==VAREnum.VT_CY||vt==VAREnum.VT_DECIMAL||vt==VAREnum.VT_RECORD);","typeGuard":"boolean toPrimitiveSupported(int vartype) {\n    return !(vartype == VAREnum.VT_UNKNOWN || vartype == VAREnum.VT_DISPATCH\n          || vartype == VAREnum.VT_CY || vartype == VAREnum.VT_DECIMAL\n          || vartype == VAREnum.VT_RECORD);\n}","tryCatchPattern":"try {\n    return OaIdlUtil.toPrimitiveArray(sa);\n} catch (IllegalStateException e) {\n    if (e.getMessage().startsWith(\"Type not supported\")) return readManually(sa);\n    throw e;\n}","preventionTips":["Whitelist supported vartypes before calling OaIdlUtil","Write custom readers for VT_CY/VT_DECIMAL/VT_UNKNOWN arrays","Keep COM return types stable and documented","Add unit tests covering each vartype your interop produces"],"tags":["com","safearray","vartype","unsupported-type"],"backgroundTag":"unsupported-enum-value","analyzedSha":"d036ad9781adad4b66693e8fa7098e4ac665e0a3","analyzedAt":"2026-09-12T06:50:59.239Z","contentChangedAt":"2026-09-12T06:50:59.239Z","schemaVersion":2},"datasetVersion":"2026-09-19T12:17:13.211Z"}