in src/accumulator.cc [643:686]
py::object deepCopy(const py::handle& v) {
if (v.ptr() == Py_True) {
return py::reinterpret_borrow<py::object>(v);
} else if (v.ptr() == Py_False) {
return py::reinterpret_borrow<py::object>(v);
} else if (v.ptr() == Py_None) {
return py::reinterpret_borrow<py::object>(v);
} else if (py::isinstance<py::float_>(v)) {
return py::reinterpret_borrow<py::object>(v);
} else if (py::isinstance<py::dict>(v)) {
const py::dict& olddict = py::reinterpret_borrow<py::dict>(v);
py::dict newdict;
for (auto& [key, value] : olddict) {
newdict[deepCopy(key)] = deepCopy(value);
}
return py::reinterpret_steal<py::object>(newdict.release());
} else if (py::isinstance<py::str>(v)) {
return py::reinterpret_borrow<py::object>(v);
} else if (py::isinstance<py::array>(v)) {
return py::reinterpret_borrow<py::object>(v);
} else if (py::isinstance<py::int_>(v)) {
return py::reinterpret_borrow<py::object>(v);
} else if (py::isinstance<py::list>(v)) {
const py::list& oldlist = py::reinterpret_borrow<py::list>(v);
size_t n = oldlist.size();
py::list newlist(n);
for (size_t i = 0; i != n; ++i) {
newlist[i] = deepCopy(oldlist[i]);
}
return py::reinterpret_steal<py::list>(newlist.release());
} else if (auto t = rpc::tryFromPython(v)) {
return rpc::toPython(t->to(rpc::kCPU, false, true));
} else if (py::isinstance<py::tuple>(v)) {
const py::tuple& oldtuple = py::reinterpret_borrow<py::tuple>(v);
size_t n = oldtuple.size();
py::tuple newtuple(n);
for (size_t i = 0; i != n; ++i) {
newtuple[i] = deepCopy(oldtuple[i]);
}
return py::reinterpret_steal<py::tuple>(newtuple.release());
} else {
return py::reinterpret_borrow<py::object>(v);
}
}