提交 97d12b3e 编写于 作者: M Megvii Engine Team

refactor(mge/imperative): fix compilation for Python 3.5

GitOrigin-RevId: edd49d01716a91231802afb601da1ffd3ce251a5
上级 87f4b46e
......@@ -117,6 +117,12 @@ struct _wrap {
}
}();
static PyObject* impl_py35(PyObject* self, PyObject* args) {
auto* arr = &PyTuple_GET_ITEM(args, 0);
auto size = PyTuple_GET_SIZE(args);
return impl(self, arr, size);
}
static PyObject* impl(PyObject* self, PyObject*const* args, size_t nargs) {
if (nargs != n_args) {
PyErr_Format(PyExc_ValueError, "expected %lu arguments", n_args);
......@@ -159,14 +165,21 @@ struct _wrap {
} // anonymous namespace
#ifdef METH_FASTCALL
#define MGE_PY_INTERFACE(NAME, FUN) \
{ #NAME, (PyCFunction)_wrap < &(FUN) > ::impl, METH_FASTCALL, nullptr }
#else
#define MGE_PY_INTERFACE(NAME, FUN) \
{ #NAME, (PyCFunction)_wrap < &(FUN) > ::impl_py35, METH_VARARGS, nullptr }
#endif
void init_dtypes(py::module m) {
static PyMethodDef method_defs[] = {
{"is_quantize", (PyCFunction)_wrap<&_is_quantize>::impl, METH_FASTCALL, nullptr},
{"get_scale", (PyCFunction)_wrap<&_get_scale>::impl, METH_FASTCALL, nullptr},
{"get_zero_point", (PyCFunction)_wrap<&_get_zero_point>::impl, METH_FASTCALL, nullptr},
{"is_dtype_equal", (PyCFunction)_wrap<&_is_dtype_equal>::impl, METH_FASTCALL, nullptr},
{nullptr, nullptr, 0, nullptr}
};
MGE_PY_INTERFACE(is_quantize, _is_quantize),
MGE_PY_INTERFACE(get_scale, _get_scale),
MGE_PY_INTERFACE(get_zero_point, _get_zero_point),
MGE_PY_INTERFACE(is_dtype_equal, _is_dtype_equal),
{nullptr, nullptr, 0, nullptr}};
for (auto&& def: method_defs) {
if (def.ml_meth != nullptr) {
auto* func = PyCFunction_NewEx(&def, nullptr, nullptr);
......@@ -176,4 +189,6 @@ void init_dtypes(py::module m) {
}
}
#undef MGE_PY_INTERFACE
} // namespace mgb
......@@ -404,8 +404,6 @@ void TensorWrapper::setscalar() {
}
PyMethodDef apply_def{"apply", (PyCFunction)py_apply, METH_FASTCALL, nullptr};
struct TensorWeakRef {
std::weak_ptr<Tensor> wptr;
......@@ -612,6 +610,24 @@ PyObject* get_device(PyObject* self, PyObject*const* args, size_t nargs) {
}
}
#ifdef METH_FASTCALL
#define MGE_PY_INTERFACE(NAME, FUNC) \
{ #NAME, (PyCFunction)FUNC, METH_FASTCALL, nullptr }
#else
#define WRAP_FUNC_PY35(FUNC) \
PyObject* py35_##FUNC(PyObject* self, PyObject* args) { \
auto* arr = &PyTuple_GET_ITEM(args, 0); \
auto size = PyTuple_GET_SIZE(args); \
return FUNC(self, arr, size); \
}
WRAP_FUNC_PY35(py_apply);
WRAP_FUNC_PY35(dtype_promotion);
WRAP_FUNC_PY35(get_device);
#undef WRAP_FUNC_PY35
#define MGE_PY_INTERFACE(NAME, FUNC) \
{ #NAME, (PyCFunction)py35_##FUNC, METH_VARARGS, nullptr }
#endif
void init_tensor(py::module m) {
interpreter_for_py = interpreter::Interpreter::inst().create_channel();
......@@ -643,11 +659,10 @@ void init_tensor(py::module m) {
.def("__call__", &TensorWeakRef::operator());
static PyMethodDef method_defs[] = {
{"apply", (PyCFunction)py_apply, METH_FASTCALL, nullptr},
{"dtype_promotion", (PyCFunction)dtype_promotion, METH_FASTCALL, nullptr},
{"get_device", (PyCFunction)get_device, METH_FASTCALL, nullptr},
{nullptr, nullptr, 0, nullptr}
};
MGE_PY_INTERFACE(apply, py_apply),
MGE_PY_INTERFACE(dtype_promotion, dtype_promotion),
MGE_PY_INTERFACE(get_device, get_device),
{nullptr, nullptr, 0, nullptr}};
for (auto&& def: method_defs) {
if (def.ml_meth != nullptr) {
auto* func = PyCFunction_NewEx(&def, nullptr, nullptr);
......@@ -698,4 +713,6 @@ void init_tensor(py::module m) {
}
#undef MGE_PY_INTERFACE
} // namespace mgb::imperative::python
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册