@@ -590,10 +590,14 @@ Py_DEPRECATED(3.3) PyAPI_FUNC(Py_UNICODE *) PyUnicode_AsUnicodeAndSize(
590590/* Fast access macros */
591591
592592Py_DEPRECATED (3.3 )
593- static inline Py_ssize_t PyUnicode_WSTR_LENGTH(PyObject *op) {
594- return PyUnicode_IS_COMPACT_ASCII (op) ?
595- _PyASCIIObject_CAST (op)->length :
596- _PyCompactUnicodeObject_CAST (op)->wstr_length ;
593+ static inline Py_ssize_t PyUnicode_WSTR_LENGTH(PyObject *op)
594+ {
595+ if (PyUnicode_IS_COMPACT_ASCII (op)) {
596+ return _PyASCIIObject_CAST (op)->length ;
597+ }
598+ else {
599+ return _PyCompactUnicodeObject_CAST (op)->wstr_length ;
600+ }
597601}
598602#define PyUnicode_WSTR_LENGTH (op ) PyUnicode_WSTR_LENGTH(_PyObject_CAST(op))
599603
@@ -603,30 +607,52 @@ static inline Py_ssize_t PyUnicode_WSTR_LENGTH(PyObject *op) {
603607 on request. Use PyUnicode_GET_LENGTH() for the length in code points. */
604608
605609/* Py_DEPRECATED(3.3) */
606- #define PyUnicode_GET_SIZE (op ) \
607- (_PyASCIIObject_CAST(op)->wstr ? \
608- PyUnicode_WSTR_LENGTH (op) : \
609- ((void )PyUnicode_AsUnicode(_PyObject_CAST(op)),\
610- assert(_PyASCIIObject_CAST(op)->wstr), \
611- PyUnicode_WSTR_LENGTH(op)))
610+ static inline Py_ssize_t PyUnicode_GET_SIZE (PyObject *op)
611+ {
612+ _Py_COMP_DIAG_PUSH
613+ _Py_COMP_DIAG_IGNORE_DEPR_DECLS
614+ if (_PyASCIIObject_CAST (op)->wstr == NULL ) {
615+ (void )PyUnicode_AsUnicode (op);
616+ assert (_PyASCIIObject_CAST (op)->wstr != NULL );
617+ }
618+ return PyUnicode_WSTR_LENGTH (op);
619+ _Py_COMP_DIAG_POP
620+ }
621+ #define PyUnicode_GET_SIZE (op ) PyUnicode_GET_SIZE(_PyObject_CAST(op))
612622
613- /* Py_DEPRECATED(3.3) */
614- #define PyUnicode_GET_DATA_SIZE (op ) \
615- (PyUnicode_GET_SIZE(op) * Py_UNICODE_SIZE)
623+ /* Py_DEPRECATED(3.3) */
624+ static inline Py_ssize_t PyUnicode_GET_DATA_SIZE (PyObject *op)
625+ {
626+ return PyUnicode_GET_SIZE (op) * Py_UNICODE_SIZE;
627+ }
628+ #define PyUnicode_GET_DATA_SIZE (op ) PyUnicode_GET_DATA_SIZE(_PyObject_CAST(op))
616629
617630/* Alias for PyUnicode_AsUnicode(). This will create a wchar_t/Py_UNICODE
618631 representation on demand. Using this macro is very inefficient now,
619632 try to port your code to use the new PyUnicode_*BYTE_DATA() macros or
620633 use PyUnicode_WRITE() and PyUnicode_READ(). */
621634
622635/* Py_DEPRECATED(3.3) */
623- #define PyUnicode_AS_UNICODE (op ) \
624- (_PyASCIIObject_CAST(op)->wstr ? _PyASCIIObject_CAST(op)->wstr : \
625- PyUnicode_AsUnicode (_PyObject_CAST(op)))
636+ static inline Py_UNICODE* PyUnicode_AS_UNICODE (PyObject *op)
637+ {
638+ wchar_t *wstr = _PyASCIIObject_CAST (op)->wstr ;
639+ if (wstr != NULL ) {
640+ return wstr;
641+ }
642+
643+ _Py_COMP_DIAG_PUSH
644+ _Py_COMP_DIAG_IGNORE_DEPR_DECLS
645+ return PyUnicode_AsUnicode (op);
646+ _Py_COMP_DIAG_POP
647+ }
648+ #define PyUnicode_AS_UNICODE (op ) PyUnicode_AS_UNICODE(_PyObject_CAST(op))
626649
627650/* Py_DEPRECATED(3.3) */
628- #define PyUnicode_AS_DATA (op ) \
629- ((const char *)(PyUnicode_AS_UNICODE(op)))
651+ static inline const char * PyUnicode_AS_DATA (PyObject *op)
652+ {
653+ return (const char *)PyUnicode_AS_UNICODE (op);
654+ }
655+ #define PyUnicode_AS_DATA (op ) PyUnicode_AS_DATA(_PyObject_CAST(op))
630656
631657
632658/* --- _PyUnicodeWriter API ----------------------------------------------- */
0 commit comments