This is an automated email from the ASF dual-hosted git repository.
junrushao pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tvm-ffi.git
The following commit(s) were added to refs/heads/main by this push:
new 668ce83 fix: handle empty metadata in get_global_func_metadata (#417)
668ce83 is described below
commit 668ce835939ff60a99c7d982266cf4bdc90ca35b
Author: Guan-Ming (Wesley) Chiu <[email protected]>
AuthorDate: Tue Jan 27 06:09:27 2026 +0800
fix: handle empty metadata in get_global_func_metadata (#417)
## Related Issue
Fixes #208
## Why
Python-registered global functions without metadata cause
JSONDecodeError when get_global_func_metadata() is called because the
FFI returns an empty string which json.loads() cannot parse.
## How
- Check for empty metadata string before JSON parsing
- Return empty dict for functions without metadata
- Add regression test for Python functions without metadata
---
python/tvm_ffi/registry.py | 3 ++-
tests/python/test_metadata.py | 12 +++++++++++-
2 files changed, 13 insertions(+), 2 deletions(-)
diff --git a/python/tvm_ffi/registry.py b/python/tvm_ffi/registry.py
index 5b484cd..9ea8e2c 100644
--- a/python/tvm_ffi/registry.py
+++ b/python/tvm_ffi/registry.py
@@ -275,7 +275,8 @@ def get_global_func_metadata(name: str) -> dict[str, Any]:
Register a Python callable as a global FFI function.
"""
- return json.loads(get_global_func("ffi.GetGlobalFuncMetadata")(name) or
"{}")
+ metadata_json = get_global_func("ffi.GetGlobalFuncMetadata")(name)
+ return json.loads(metadata_json) if metadata_json else {}
def init_ffi_api(namespace: str, target_module_name: str | None = None) ->
None:
diff --git a/tests/python/test_metadata.py b/tests/python/test_metadata.py
index 116afd3..4d91462 100644
--- a/tests/python/test_metadata.py
+++ b/tests/python/test_metadata.py
@@ -17,7 +17,7 @@
from typing import Any
import pytest
-from tvm_ffi import get_global_func_metadata
+from tvm_ffi import get_global_func_metadata, register_global_func,
remove_global_func
from tvm_ffi.core import TypeInfo, TypeSchema, _lookup_type_attr
from tvm_ffi.testing import _SchemaAllTypes
@@ -163,6 +163,16 @@ def test_metadata_global_func() -> None:
assert metadata["str_attr"] == "hello"
+def test_metadata_empty_for_python_func() -> None:
+ @register_global_func("test.python_func_no_metadata")
+ def simple_func(x: int) -> int:
+ return x + 1
+
+ metadata = get_global_func_metadata("test.python_func_no_metadata")
+ assert metadata == {}
+ remove_global_func("test.python_func_no_metadata")
+
+
def test_metadata_field() -> None:
type_info: TypeInfo = getattr(_SchemaAllTypes, "__tvm_ffi_type_info__")
for field in type_info.fields: