@@ -611,6 +611,7 @@ PyObject *nb_type_put(const std::type_info *cpp_type, void *value,
611
611
}
612
612
} else {
613
613
memcpy (new_value, value, t->size );
614
+ memset (value, 0 , t->size );
614
615
}
615
616
} else {
616
617
if (t->flags & (uint32_t ) type_flags::is_copy_constructible) {
@@ -825,5 +826,25 @@ void nb_inst_copy(PyObject *dst, const PyObject *src) noexcept {
825
826
nbi->ready = nbi->destruct = true ;
826
827
}
827
828
829
+ void nb_inst_move (PyObject *dst, const PyObject *src) noexcept {
830
+ nb_type *nbt = (nb_type *) Py_TYPE (src);
831
+ if (Py_TYPE (src) != Py_TYPE (dst) ||
832
+ (nbt->t .flags & (uint32_t ) type_flags::is_move_constructible) == 0 )
833
+ fail (" nanobind::detail::nb_inst_move(): invalid arguments!" );
834
+
835
+ nb_inst *nbi = (nb_inst *) dst;
836
+ void *src_data = inst_ptr ((nb_inst *) src);
837
+ void *dst_data = inst_ptr (nbi);
838
+
839
+ if (nbt->t .flags & (uint32_t ) type_flags::has_move) {
840
+ nbt->t .move (dst_data, src_data);
841
+ } else {
842
+ memcpy (dst_data, src_data, nbt->t .size );
843
+ memset (src_data, 0 , nbt->t .size );
844
+ }
845
+
846
+ nbi->ready = nbi->destruct = true ;
847
+ }
848
+
828
849
NAMESPACE_END (detail)
829
850
NAMESPACE_END(NB_NAMESPACE)
0 commit comments