Lunderberg commented on code in PR #16183:
URL: https://github.com/apache/tvm/pull/16183#discussion_r1410812537
##########
include/tvm/runtime/packed_func.h:
##########
@@ -2035,46 +2167,100 @@ inline TObjectRef TVMPODValue_::AsObjectRef() const {
ICHECK(!checked_type.defined()) << "Expected " <<
ObjectTypeChecker<TObjectRef>::TypeName()
<< ", but got " << checked_type.value();
return TObjectRef(GetObjectPtr<Object>(ptr));
- } else if (std::is_base_of<ContainerType, NDArray::ContainerType>::value &&
- type_code_ == kTVMNDArrayHandle) {
- // Casting to a base class that NDArray can sub-class
- ObjectPtr<Object> data =
-
NDArray::FFIDataFromHandle(static_cast<TVMArrayHandle>(value_.v_handle));
- return TObjectRef(data);
- } else if (std::is_base_of<ContainerType, Module::ContainerType>::value &&
- type_code_ == kTVMModuleHandle) {
- // Casting to a base class that Module can sub-class
- return
TObjectRef(GetObjectPtr<Object>(static_cast<Object*>(value_.v_handle)));
- } else if (std::is_base_of<ContainerType, PackedFunc::ContainerType>::value
&&
- type_code_ == kTVMPackedFuncHandle) {
- // Casting to a base class that PackedFunc can sub-class
- return
TObjectRef(GetObjectPtr<Object>(static_cast<Object*>(value_.v_handle)));
- } else {
- TVM_CHECK_TYPE_CODE(type_code_, kTVMObjectHandle);
- return TObjectRef(ObjectPtr<Object>(nullptr));
}
+
+ if constexpr (std::is_base_of_v<ContainerType, NDArray::ContainerType>) {
+ if (type_code_ == kTVMNDArrayHandle) {
+ // Casting to a base class that NDArray can sub-class
+ ObjectPtr<Object> data =
+
NDArray::FFIDataFromHandle(static_cast<TVMArrayHandle>(value_.v_handle));
+ return TObjectRef(data);
+ }
+ }
+
+ if constexpr (std::is_base_of_v<ContainerType, Module::ContainerType>) {
+ if (type_code_ == kTVMModuleHandle) {
+ // Casting to a base class that Module can sub-class
+ return
TObjectRef(GetObjectPtr<Object>(static_cast<Object*>(value_.v_handle)));
+ }
+ }
+
+ if constexpr (std::is_base_of_v<ContainerType, PackedFunc::ContainerType>) {
+ if (type_code_ == kTVMPackedFuncHandle) {
+ // Casting to a base class that PackedFunc can sub-class
+ return
TObjectRef(GetObjectPtr<Object>(static_cast<Object*>(value_.v_handle)));
+ }
+ }
+
+ if constexpr (std::is_base_of_v<TObjectRef, BoxInt>) {
+ if (type_code_ == kTVMArgInt) {
+ return BoxInt(value_.v_int64);
+ }
+ }
+
+ if constexpr (std::is_base_of_v<TObjectRef, BoxFloat>) {
+ if (type_code_ == kTVMArgFloat) {
+ return BoxFloat(value_.v_float64);
+ }
+ }
+
+ if constexpr (std::is_base_of_v<TObjectRef, String>) {
+ if (type_code_ == kTVMStr) {
+ return String(value_.v_str);
+ }
+ }
+
+ TVM_CHECK_TYPE_CODE(type_code_, kTVMObjectHandle);
+ return TObjectRef(ObjectPtr<Object>(nullptr));
}
template <typename TObjectRef, typename>
inline TVMRetValue& TVMRetValue::operator=(TObjectRef other) {
using ContainerType = typename TObjectRef::ContainerType;
const Object* ptr = other.get();
- if (ptr != nullptr) {
- if (std::is_base_of<NDArray::ContainerType, ContainerType>::value ||
- (std::is_base_of<ContainerType, NDArray::ContainerType>::value &&
- ptr->IsInstance<NDArray::ContainerType>())) {
+
+ if constexpr (std::is_base_of_v<ContainerType, NDArray::ContainerType> ||
+ std::is_base_of_v<NDArray::ContainerType, ContainerType>) {
+ if (ptr && (std::is_base_of_v<NDArray::ContainerType, ContainerType> ||
Review Comment:
Can do, and updated. I mostly pulled it out to avoid having too many levels
of nesting for ease of readability.
I also realized that the checks may not be intuitive to future maintainers,
and added a comment describing which cases are handled at C++ compile-time and
which are handled at runtime.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]