Skip to content

Commit cc6d675

Browse files
committed
PyObject_CallMethodNoArgs(), PyObject_CallMethodOneArg() on python3.9
1 parent b5017f9 commit cc6d675

2 files changed

Lines changed: 37 additions & 22 deletions

File tree

src/serialize/datetime.rs

Lines changed: 4 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -147,36 +147,18 @@ impl DateTime {
147147
let tzinfo = ffi!(PyDateTime_DATE_GET_TZINFO(self.ptr));
148148
if ffi!(PyObject_HasAttr(tzinfo, CONVERT_METHOD_STR)) == 1 {
149149
// pendulum
150-
let offset = ffi!(PyObject_CallMethodObjArgs(
151-
self.ptr,
152-
UTCOFFSET_METHOD_STR,
153-
std::ptr::null_mut() as *mut pyo3::ffi::PyObject
154-
));
150+
let offset = call_method!(self.ptr, UTCOFFSET_METHOD_STR);
155151
offset_second = ffi!(PyDateTime_DELTA_GET_SECONDS(offset)) as i32;
156152
offset_day = ffi!(PyDateTime_DELTA_GET_DAYS(offset));
157153
} else if ffi!(PyObject_HasAttr(tzinfo, NORMALIZE_METHOD_STR)) == 1 {
158154
// pytz
159-
let method_ptr = ffi!(PyObject_CallMethodObjArgs(
160-
tzinfo,
161-
NORMALIZE_METHOD_STR,
162-
self.ptr,
163-
std::ptr::null_mut() as *mut pyo3::ffi::PyObject
164-
));
165-
let offset = ffi!(PyObject_CallMethodObjArgs(
166-
method_ptr,
167-
UTCOFFSET_METHOD_STR,
168-
std::ptr::null_mut() as *mut pyo3::ffi::PyObject
169-
));
155+
let method_ptr = call_method!(tzinfo, NORMALIZE_METHOD_STR, self.ptr);
156+
let offset = call_method!(method_ptr, UTCOFFSET_METHOD_STR);
170157
offset_second = ffi!(PyDateTime_DELTA_GET_SECONDS(offset)) as i32;
171158
offset_day = ffi!(PyDateTime_DELTA_GET_DAYS(offset));
172159
} else if ffi!(PyObject_HasAttr(tzinfo, DST_STR)) == 1 {
173160
// dateutil/arrow, datetime.timezone.utc
174-
let offset = ffi!(PyObject_CallMethodObjArgs(
175-
tzinfo,
176-
UTCOFFSET_METHOD_STR,
177-
self.ptr,
178-
std::ptr::null_mut() as *mut pyo3::ffi::PyObject
179-
));
161+
let offset = call_method!(tzinfo, UTCOFFSET_METHOD_STR, self.ptr);
180162
offset_second = ffi!(PyDateTime_DELTA_GET_SECONDS(offset)) as i32;
181163
offset_day = ffi!(PyDateTime_DELTA_GET_DAYS(offset));
182164
} else {

src/util.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,3 +63,36 @@ macro_rules! ffi {
6363
unsafe { pyo3::ffi::$fn($obj1, $obj2, $obj3, $obj4) }
6464
};
6565
}
66+
67+
#[cfg(python39)]
68+
macro_rules! call_method {
69+
($obj1:expr, $obj2:expr) => {
70+
unsafe { pyo3::ffi::PyObject_CallMethodNoArgs($obj1, $obj2) }
71+
};
72+
($obj1:expr, $obj2:expr, $obj3:expr) => {
73+
unsafe { pyo3::ffi::PyObject_CallMethodOneArg($obj1, $obj2, $obj3) }
74+
};
75+
}
76+
77+
#[cfg(not(python39))]
78+
macro_rules! call_method {
79+
($obj1:expr, $obj2:expr) => {
80+
unsafe {
81+
pyo3::ffi::PyObject_CallMethodObjArgs(
82+
$obj1,
83+
$obj2,
84+
std::ptr::null_mut() as *mut pyo3::ffi::PyObject,
85+
)
86+
}
87+
};
88+
($obj1:expr, $obj2:expr, $obj3:expr) => {
89+
unsafe {
90+
pyo3::ffi::PyObject_CallMethodObjArgs(
91+
$obj1,
92+
$obj2,
93+
$obj3,
94+
std::ptr::null_mut() as *mut pyo3::ffi::PyObject,
95+
)
96+
}
97+
};
98+
}

0 commit comments

Comments
 (0)