@@ -220,19 +220,19 @@ AND call SWIG_fail at the same time, because it will result in a double free.
220220}
221221
222222// Disable default type checking for this method to avoid SWIG dispatch issues.
223- //
223+ //
224224// Problem: SBThread::GetStopDescription has two overloads:
225- // 1. GetStopDescription(char* dst_or_null, size_t dst_len)
225+ // 1. GetStopDescription(char* dst_or_null, size_t dst_len)
226226// 2. GetStopDescription(lldb::SBStream& stream)
227227//
228228// SWIG generates a dispatch function to select the correct overload based on argument types.
229229// see https://www.swig.org/Doc4.0/SWIGDocumentation.html#Typemaps_overloading.
230230// However, this dispatcher doesn't consider typemaps that transform function signatures.
231231//
232232// In Python, our typemap converts GetStopDescription(char*, size_t) to GetStopDescription(int).
233- // The dispatcher still checks against the original (char*, size_t) signature instead of
233+ // The dispatcher still checks against the original (char*, size_t) signature instead of
234234// the transformed (int) signature, causing type matching to fail.
235- // This only affects SBThread::GetStopDescription since the type check also matches
235+ // This only affects SBThread::GetStopDescription since the type check also matches
236236// the argument name, which is unique to this function.
237237%typemap(typecheck, precedence=SWIG_TYPECHECK_POINTER) (char *dst_or_null, size_t dst_len) " "
238238
@@ -628,61 +628,34 @@ template <> bool SetNumberFromPyObject<double>(double &number, PyObject *obj) {
628628 }
629629}
630630
631- // These two pybuffer macros are copied out of swig/Lib/python/pybuffer.i,
632- // and fixed so they will not crash if PyObject_GetBuffer fails.
633- // https://github.com/swig/swig/issues/1640
634- //
635- // I've also moved the call to PyBuffer_Release to the end of the SWIG wrapper,
636- // doing it right away is not legal according to the python buffer protocol.
637- %inline %{
638- struct Py_buffer_RAII {
639- Py_buffer buffer = {};
640- Py_buffer_RAII (){};
641- Py_buffer &operator =(const Py_buffer_RAII &) = delete ;
642- Py_buffer_RAII (const Py_buffer_RAII &) = delete ;
643- ~Py_buffer_RAII () {
644- if (buffer.obj )
645- PyBuffer_Release (&buffer);
646- }
647- };
648- %}
649631
650- %define %pybuffer_mutable_binary(TYPEMAP, SIZE)
651- %typemap(in) (TYPEMAP, SIZE) (Py_buffer_RAII view) {
652- int res;
653- Py_ssize_t size = 0 ;
654- void *buf = 0 ;
655- res = PyObject_GetBuffer ($input, &view.buffer , PyBUF_WRITABLE);
656- if (res < 0 ) {
657- PyErr_Clear ();
658- %argument_fail (res, " (TYPEMAP, SIZE)" , $symname, $argnum);
659- }
660- size = view.buffer .len ;
661- buf = view.buffer .buf ;
662- $1 = ($1_ltype)buf;
663- $2 = ($2_ltype)(size / sizeof ($*1_type));
664- }
665- %enddef
666-
667- %define %pybuffer_binary(TYPEMAP, SIZE)
668- %typemap(in) (TYPEMAP, SIZE) (Py_buffer_RAII view) {
669- int res;
670- Py_ssize_t size = 0 ;
671- const void *buf = 0 ;
672- res = PyObject_GetBuffer ($input, &view.buffer , PyBUF_CONTIG_RO);
673- if (res < 0 ) {
674- PyErr_Clear ();
675- %argument_fail (res, " (TYPEMAP, SIZE)" , $symname, $argnum);
632+ // Typemap for SBFile::Write.
633+ %typemap(in) (const uint8_t *buf, size_t num_bytes) {
634+ if (PythonByteArray::Check ($input)) {
635+ PythonByteArray bytearray (PyRefType::Borrowed, $input);
636+ $1 = (uint8_t *)bytearray.GetBytes ().data ();
637+ $2 = bytearray.GetSize ();
638+ } else if (PythonBytes::Check ($input)) {
639+ PythonBytes bytes (PyRefType::Borrowed, $input);
640+ $1 = (uint8_t *)bytes.GetBytes ().data ();
641+ $2 = bytes.GetSize ();
642+ } else {
643+ PyErr_SetString (PyExc_ValueError, " Expecting a bytes or bytearray object" );
644+ SWIG_fail;
676645 }
677- size = view.buffer .len ;
678- buf = view.buffer .buf ;
679- $1 = ($1_ltype)buf;
680- $2 = ($2_ltype)(size / sizeof ($*1_type));
681646}
682- %enddef
683647
684- %pybuffer_binary(const uint8_t *buf, size_t num_bytes);
685- %pybuffer_mutable_binary(uint8_t *buf, size_t num_bytes);
648+ // Typemap for SBFile::Read.
649+ %typemap(in) (uint8_t *buf, size_t num_bytes) {
650+ if (PythonByteArray::Check ($input)) {
651+ PythonByteArray bytearray (PyRefType::Borrowed, $input);
652+ $1 = (uint8_t *)bytearray.GetBytes ().data ();
653+ $2 = bytearray.GetSize ();
654+ } else {
655+ PyErr_SetString (PyExc_ValueError, " Expecting a bytearray" );
656+ SWIG_fail;
657+ }
658+ }
686659
687660%typemap(in) (const char **symbol_name, uint32_t num_names) {
688661 using namespace lldb_private ;
0 commit comments