This is an automated email from the ASF dual-hosted git repository.

tqchen pushed a commit to branch refactor-s1
in repository https://gitbox.apache.org/repos/asf/tvm.git

commit 18779fe16a74cd2f69952933df2e67317833eb19
Author: tqchen <[email protected]>
AuthorDate: Sun Apr 13 15:23:27 2025 -0400

    Always return str in ffi
---
 include/tvm/runtime/packed_func.h | 22 ++--------------------
 src/runtime/c_runtime_api.cc      |  7 ++++++-
 2 files changed, 8 insertions(+), 21 deletions(-)

diff --git a/include/tvm/runtime/packed_func.h 
b/include/tvm/runtime/packed_func.h
index 020ed4883d..435c278815 100644
--- a/include/tvm/runtime/packed_func.h
+++ b/include/tvm/runtime/packed_func.h
@@ -44,6 +44,8 @@ using ffi::AnyView;
  */
 inline TVMFFIAny LegacyTVMArgValueToFFIAny(TVMValue value, int type_code) {
   TVMFFIAny res;
+  // clear first to ensure consistent hash
+  res.v_uint64 = 0;
   switch (type_code) {
     case kTVMArgInt: {
       res.type_index = ffi::TypeIndex::kTVMFFIInt;
@@ -62,12 +64,10 @@ inline TVMFFIAny LegacyTVMArgValueToFFIAny(TVMValue value, 
int type_code) {
     }
     case kTVMNullptr: {
       res.type_index = ffi::TypeIndex::kTVMFFINone;
-      res.v_int64 = 0;
       return res;
     }
     case kTVMDataType: {
       res.type_index = ffi::TypeIndex::kTVMFFIDataType;
-      res.v_int64 = 0;
       res.v_dtype = value.v_type;
       return res;
     }
@@ -245,24 +245,6 @@ inline void MoveAnyToLegacyTVMValue(Any&& src, TVMValue* 
value, int* type_code)
   AnyViewToLegacyTVMArgValue(val, value, type_code);
 }
 
-/*!
- * \brief Legacy TVM args kept for backward compact
- */
-class LegacyTVMArgs {
- public:
-  const TVMValue* values;
-  const int* type_codes;
-  int num_args;
-  /*!
-   * \brief constructor
-   * \param values The argument values
-   * \param type_codes The argument type codes
-   * \param num_args number of arguments.
-   */
-  LegacyTVMArgs(const TVMValue* values, const int* type_codes, int num_args)
-      : values(values), type_codes(type_codes), num_args(num_args) {}
-};
-
 /*!
  * \brief Translate legacy TVMArgs to PackedArgs
  * \param value The TVMValue array
diff --git a/src/runtime/c_runtime_api.cc b/src/runtime/c_runtime_api.cc
index 4e17c2abec..cd9be5e5c0 100644
--- a/src/runtime/c_runtime_api.cc
+++ b/src/runtime/c_runtime_api.cc
@@ -582,7 +582,8 @@ int TVMFuncCall(TVMFunctionHandle func, TVMValue* args, 
int* arg_type_codes, int
   LegacyCallPacked(ffi_func, args, arg_type_codes, num_args, &rv);
   // special handle of certain return types.
   if (rv.type_index() == tvm::ffi::TypeIndex::kTVMFFIDataType ||
-      rv.type_index() == tvm::ffi::TypeIndex::kTVMFFIBytes) {
+      rv.type_index() == tvm::ffi::TypeIndex::kTVMFFIBytes ||
+      rv.type_index() == tvm::ffi::TypeIndex::kTVMFFIStr) {
     // TODO(tvm-team): handle bytes return type here
     TVMRuntimeEntry* e = TVMAPIRuntimeStore::Get();
     if (rv.type_index() == tvm::ffi::TypeIndex::kTVMFFIDataType) {
@@ -595,6 +596,10 @@ int TVMFuncCall(TVMFunctionHandle func, TVMValue* args, 
int* arg_type_codes, int
       e->ret_bytes.size = e->ret_str.length();
       *ret_type_code = kTVMBytes;
       ret_val->v_handle = &(e->ret_bytes);
+    } else if (rv.type_index() == tvm::ffi::TypeIndex::kTVMFFIStr) {
+      e->ret_str = rv.operator std::string();
+      *ret_type_code = kTVMStr;
+      ret_val->v_str = e->ret_str.c_str();
     }
   } else {
     MoveAnyToLegacyTVMValue(std::move(rv), ret_val, ret_type_code);

Reply via email to