GitOrigin-RevId: edd49d0171
release-1.2
@@ -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 { | |||||
} // 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}, | |||||
{"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) { | 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) { | |||||
} | } | ||||
} | } | ||||
#undef MGE_PY_INTERFACE | |||||
} // namespace mgb | } // namespace mgb |
@@ -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) { | |||||
} | } | ||||
} | } | ||||
#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) { | |||||
.def("__call__", &TensorWeakRef::operator()); | .def("__call__", &TensorWeakRef::operator()); | ||||
static PyMethodDef method_defs[] = { | 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) { | 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) { | |||||
} | } | ||||
#undef MGE_PY_INTERFACE | |||||
} // namespace mgb::imperative::python | } // namespace mgb::imperative::python |