{"record":{"id":"6e27cc11af08468b","repo":"oracle/graal","slug":"element-should-be-an-object-got","errorCode":null,"errorMessage":"Element {} should be an object, got {}","messagePattern":"Element (.+?) should be an object, got (.+?)","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"compiler/src/jdk.graal.compiler.hostvmaccess/src/jdk/graal/compiler/hostvmaccess/HostVMAccess.java","lineNumber":350,"sourceCode":"            throw new IllegalArgumentException(\"Expected an array constant for src, got \" + src);\n        }\n        Object destArray = providers.getSnippetReflection().asObject(Object.class, dest);\n        if (destArray == null || !destArray.getClass().isArray()) {\n            throw new IllegalArgumentException(\"Expected an array constant for dest, got \" + dest);\n        }\n        System.arraycopy(srcArray, srcPos, destArray, destPos, length);\n    }\n\n    private void doWriteArrayElement(Object array, ResolvedJavaType componentType, int index, JavaConstant element) {\n        Object unwrappedValue;\n        if (componentType.isPrimitive()) {\n            if (componentType.getJavaKind() != element.getJavaKind()) {\n                throw new IllegalArgumentException(\"Element \" + element + \" should be a \" + componentType.getJavaKind() + \", got \" + element.getJavaKind());\n            }\n            unwrappedValue = element.asBoxedPrimitive();\n        } else {\n            if (!element.getJavaKind().isObject()) {\n                throw new IllegalArgumentException(\"Element \" + element + \" should be an object, got \" + componentType);\n            }\n            unwrappedValue = providers.getSnippetReflection().asObject(Object.class, element);\n        }\n        Array.set(array, index, unwrappedValue);\n    }\n\n    @Override\n    public void writeArrayElement(JavaConstant array, int index, JavaConstant element) {\n        ResolvedJavaType arrayType = getProviders().getMetaAccess().lookupJavaType(array);\n        if (arrayType == null || !arrayType.isArray()) {\n            throw new IllegalArgumentException(\"Expected an array constant, got \" + array);\n        }\n        Object asObject = providers.getSnippetReflection().asObject(Object.class, array);\n        if (asObject == null) {\n            throw new IllegalArgumentException(\"Could not unwrap array: \" + array);\n        }\n        doWriteArrayElement(asObject, arrayType.getComponentType(), index, element);\n    }","sourceCodeStart":332,"sourceCodeEnd":368,"githubUrl":"https://github.com/oracle/graal/blob/a66e9ccd1d7bf2552883939aa0788dfd0e294aab/compiler/src/jdk.graal.compiler.hostvmaccess/src/jdk/graal/compiler/hostvmaccess/HostVMAccess.java#L332-L368","documentation":"Thrown by HostVMAccess.writeArrayElement when the target array has a reference (object) component type but the JavaConstant element is not an object kind. The object branch unboxes the element via snippetReflection.asObject(Object.class, element), which only works for object constants; primitive constants such as JavaKind.Int or JavaKind.Long cannot be stored into an Object[]/String[] slot.","triggerScenarios":"Calling VMAccess.writeArrayElement with an array whose componentType.isPrimitive() is false (e.g. String[], Object[]) while passing a constant whose element.getJavaKind().isObject() is false — for example JavaConstant.forInt(1) or a primitive box handled as a primitive kind.","commonSituations":"Auto-boxing assumptions: code that stores a primitive constant into an Object[] expecting boxing; forwarding fields/constants from IR where the declared type is Object but the constant was materialized as a raw primitive kind.","solutions":["Wrap primitives before storing: for a boxable value use snippetReflection/forObject(Integer.valueOf(v)) instead of JavaConstant.forInt(v)","Check element.getJavaKind().isObject() before the call and convert primitives to object constants for Object[] targets","Fix the producer so reference-typed array slots only ever receive object constants"],"exampleFix":"// before\nvmAccess.writeArrayElement(objectArrayConst, 0, JavaConstant.forInt(7));\n\n// after\nJavaConstant boxed = providers.getSnippetReflection().forObject(Integer.valueOf(7));\nvmAccess.writeArrayElement(objectArrayConst, 0, boxed);","handlingStrategy":"type-guard","validationCode":"ResolvedJavaType comp = providers.getMetaAccess().lookupJavaType(arrayConst).getComponentType();\nif (!comp.isPrimitive() && !elementConst.getJavaKind().isObject()) {\n    throw new IllegalArgumentException(\"Primitive constant \" + elementConst + \" cannot go into reference array of \" + comp);\n}","typeGuard":"boolean storableInRefArray(JavaConstant element) {\n    return element.getJavaKind().isObject();\n}","tryCatchPattern":null,"preventionTips":["Box primitives with snippetReflection.forObject before storing into Object[]/interface arrays","Keep a single conversion point where primitive values become object constants","Log element kind and component type whenever a generic write path handles mixed arrays"],"tags":["graalvm","vmaccess","array","boxing","type-mismatch"],"backgroundTag":null,"analyzedSha":"a66e9ccd1d7bf2552883939aa0788dfd0e294aab","analyzedAt":"2026-08-14T13:58:47.161Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}