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

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

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