{"record":{"id":"2c42a16dc5145845","repo":"NationalSecurityAgency/ghidra","slug":"cannot-convert-value-r","errorCode":null,"errorMessage":"Cannot convert: {value:r}","messagePattern":"Cannot convert: (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"Ghidra/Debug/Debugger-rmi-trace/src/main/py/src/ghidratrace/client.py","lineNumber":472,"sourceCode":"\n        if isinstance(path_or_id, str):\n            fut_id: Future[int] = Future()\n\n            def _done(fut_d_obj: Future[DetachedObject]) -> None:\n                fut_id.set_result(fut_d_obj.result().id)\n\n            fut_or_d_obj.add_done_callback(_done)\n            return TraceObject(self, fut_id, path_or_id)\n\n    def _fix_value(self, value: Any, schema: sch.Schema) -> Any:\n        if schema != sch.OBJECT:\n            return value\n        elif isinstance(value, DetachedObject):\n            return TraceObject(self, value.id, value.path)\n        elif isinstance(value, TraceObject):\n            return value\n        else:\n            raise ValueError(f\"Cannot convert: {value:r}\")\n\n    def _make_values(self, values: Iterable[Tuple[\n            DetachedObject, Lifespan, str, Tuple[Any, sch.Schema]\n    ]]) -> List[TraceObjectValue]:\n        return [\n            TraceObjectValue(TraceObject(self, d_obj.id, d_obj.path),\n                             span, key, self._fix_value(value, schema), schema)\n            for d_obj, span, key, (value, schema) in values\n        ]\n\n    def _convert_values(self, results: Union[\n        List[Tuple[DetachedObject, Lifespan, str, Tuple[Any, sch.Schema]]],\n        Future[List[\n            Tuple[DetachedObject, Lifespan, str, Tuple[Any, sch.Schema]]]]]):\n        if isinstance(results, List):\n            return self._make_values(results)\n\n        fut_values: Future[List[TraceObjectValue]] = Future()","sourceCodeStart":454,"sourceCodeEnd":490,"githubUrl":"https://github.com/NationalSecurityAgency/ghidra/blob/d5f144c24d6bc53c9cbf4448c6d11143e7696206/Ghidra/Debug/Debugger-rmi-trace/src/main/py/src/ghidratrace/client.py#L454-L490","documentation":"Raised by Trace._fix_value() when a value tagged with schema OBJECT is neither a DetachedObject nor a TraceObject. _fix_value() coerces wire objects into TraceObject handles; only those two types are acceptable for an OBJECT schema, so any other type is an internal contract violation. End users normally should not see this — it implies the schema/value pairing is inconsistent.","triggerScenarios":"An OBJECT-typed method return or element arriving as a raw dict, int, or str; a custom schema or method registration that declared sch.OBJECT but returned an incompatible Python object; mismatched ghidratrace versions between client and server.","commonSituations":"Version skew between the Python trace client and the Ghidra backend; a plugin that hand-constructs values instead of using proxy_object; corruption/partial deserialization.","solutions":["Ensure OBJECT-typed values are always produced via trace.proxy_object()/from_id/from_path so they are TraceObject instances.","Verify the client and server run compatible ghidratrace versions (see negotiate/version).","If writing custom method glue, double-check the declared schema matches the actual returned type."],"exampleFix":"// before (server-side method returning a raw id for an OBJECT schema)\nreturn raw_id\n// after\nreturn trace.proxy_object(id=raw_id)","handlingStrategy":"type-guard","validationCode":"from ghidratrace.client import TraceObject, DetachedObject\nif schema == sch.OBJECT and not isinstance(value, (TraceObject, DetachedObject)):\n    raise TypeError('OBJECT value must be a TraceObject/DetachedObject')","typeGuard":"def is_object_value(v) -> bool:\n    from ghidratrace.client import TraceObject, DetachedObject\n    return isinstance(v, (TraceObject, DetachedObject))","tryCatchPattern":null,"preventionTips":["Produce OBJECT values only via proxy_object/from_id/from_path.","Keep client and server on the same ghidratrace version."],"tags":["internal","trace-rmi","schema","type-coercion"],"backgroundTag":null,"analyzedSha":"d5f144c24d6bc53c9cbf4448c6d11143e7696206","analyzedAt":"2026-08-14T01:00:57.564Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}