• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1%header %{
2
3template <typename T>
4PyObject *
5SBTypeToSWIGWrapper (T* item);
6
7class PyErr_Cleaner
8{
9public:
10    PyErr_Cleaner(bool print=false) :
11    m_print(print)
12    {
13    }
14
15    ~PyErr_Cleaner()
16    {
17        if (PyErr_Occurred())
18        {
19            if(m_print)
20                PyErr_Print();
21            PyErr_Clear();
22        }
23    }
24
25private:
26    bool m_print;
27};
28
29static PyObject*
30ResolvePythonName(const char* name,
31                  PyObject* pmodule)
32{
33    if (!name)
34        return pmodule;
35
36    PyErr_Cleaner pyerr_cleanup(true);  // show Python errors
37
38    PyObject* main_dict;
39
40    if (!pmodule)
41    {
42        pmodule = PyImport_AddModule ("__main__");
43        if (!pmodule)
44            return NULL;
45    }
46
47    if (PyType_Check(pmodule))
48    {
49        main_dict = ((PyTypeObject*)pmodule)->tp_dict;
50        if (!main_dict)
51            return NULL;
52    }
53    else if (!PyDict_Check(pmodule))
54    {
55        main_dict = PyModule_GetDict (pmodule);
56        if (!main_dict)
57            return NULL;
58    }
59    else
60        main_dict = pmodule;
61
62    const char* dot_pos = ::strchr(name, '.');
63
64    PyObject *dest_object;
65    PyObject *key, *value;
66    Py_ssize_t pos = 0;
67
68    if (!dot_pos)
69    {
70        dest_object = NULL;
71        while (PyDict_Next (main_dict, &pos, &key, &value))
72        {
73            // We have stolen references to the key and value objects in the dictionary; we need to increment
74            // them now so that Python's garbage collector doesn't collect them out from under us.
75            Py_INCREF (key);
76            Py_INCREF (value);
77            if (strcmp (PyString_AsString (key), name) == 0)
78            {
79                dest_object = value;
80                break;
81            }
82        }
83        if (!dest_object || dest_object == Py_None)
84            return NULL;
85        return dest_object;
86    }
87    else
88    {
89        size_t len = dot_pos - name;
90        std::string piece(name,len);
91        pmodule = ResolvePythonName(piece.c_str(), main_dict);
92        if (!pmodule)
93            return NULL;
94        name = dot_pos+1;
95        return ResolvePythonName(dot_pos+1,pmodule); // tail recursion.. should be optimized by the compiler
96    }
97}
98
99static PyObject*
100FindSessionDictionary(const char *session_dictionary_name)
101{
102    return ResolvePythonName(session_dictionary_name, NULL);
103}
104
105class PyCallable
106{
107public:
108
109    operator
110    bool ()
111    {
112        return m_callable != NULL;
113    }
114
115    template<typename ...Args>
116    PyObject*
117    operator () (Args... args)
118    {
119        return (*this)({SBTypeToSWIGWrapper(args)...});
120    }
121
122    PyObject*
123    operator () (std::initializer_list<PyObject*> args)
124    {
125        PyObject* retval = NULL;
126        PyObject* pargs = PyTuple_New (args.size());
127        if (pargs == NULL)
128        {
129            if (PyErr_Occurred())
130                PyErr_Clear();
131            return retval;
132        }
133        size_t idx = 0;
134        for (auto arg : args)
135        {
136            if (!arg)
137                return retval;
138            PyTuple_SetItem(pargs,idx,arg);
139            idx++;
140        }
141        retval = PyObject_CallObject (m_callable, pargs);
142        Py_XDECREF (pargs);
143        return retval;
144    }
145
146    static PyCallable
147    FindWithPythonObject (PyObject* pfunc)
148    {
149        return PyCallable(pfunc);
150    }
151
152    static PyCallable
153    FindWithFunctionName (const char *python_function_name,
154                          const char *session_dictionary_name)
155    {
156        if (!python_function_name || !session_dictionary_name)
157            return PyCallable();
158        if ( (python_function_name[0] == 0) || (session_dictionary_name[0] == 0) )
159            return PyCallable();
160        return FindWithFunctionName(python_function_name,FindSessionDictionary (session_dictionary_name));
161    }
162
163    static PyCallable
164    FindWithFunctionName (const char *python_function_name,
165                          PyObject *session_dict)
166    {
167        if (!python_function_name || !session_dict)
168            return PyCallable();
169        if ( (python_function_name[0] == 0))
170            return PyCallable();
171        return PyCallable(ResolvePythonName (python_function_name, session_dict));
172    }
173
174    static PyCallable
175    FindWithMemberFunction (PyObject *self,
176                            const char *python_function_name)
177    {
178        if (self == NULL || self == Py_None)
179            return PyCallable();
180        if (!python_function_name || (python_function_name[0] == 0))
181            return PyCallable();
182        return PyCallable(PyObject_GetAttrString(self, python_function_name));
183    }
184
185private:
186    PyObject* m_callable;
187
188    PyCallable (PyObject *callable = NULL) :
189    m_callable(callable)
190    {
191        if (m_callable && PyCallable_Check(m_callable) == false)
192            m_callable = NULL;
193    }
194};
195
196%}
197
198%wrapper %{
199
200// resolve a dotted Python name in the form
201// foo.bar.baz.Foobar to an actual Python object
202// if pmodule is NULL, the __main__ module will be used
203// as the starting point for the search
204
205
206// This function is called by lldb_private::ScriptInterpreterPython::BreakpointCallbackFunction(...)
207// and is used when a script command is attached to a breakpoint for execution.
208
209SWIGEXPORT bool
210LLDBSwigPythonBreakpointCallbackFunction
211(
212    const char *python_function_name,
213    const char *session_dictionary_name,
214    const lldb::StackFrameSP& frame_sp,
215    const lldb::BreakpointLocationSP& bp_loc_sp
216)
217{
218    lldb::SBFrame sb_frame (frame_sp);
219    lldb::SBBreakpointLocation sb_bp_loc(bp_loc_sp);
220
221    bool stop_at_breakpoint = true;
222
223    {
224        PyErr_Cleaner py_err_cleaner(true);
225
226        PyCallable pfunc = PyCallable::FindWithFunctionName(python_function_name,session_dictionary_name);
227
228        if (!pfunc)
229            return stop_at_breakpoint;
230
231        PyObject* session_dict = NULL;
232        PyObject* pvalue = NULL;
233        pvalue = pfunc(sb_frame, sb_bp_loc, session_dict = FindSessionDictionary(session_dictionary_name));
234
235        Py_XINCREF (session_dict);
236
237        if (pvalue == Py_False)
238            stop_at_breakpoint = false;
239
240        Py_XDECREF (pvalue);
241    }
242
243    return stop_at_breakpoint;
244}
245
246// This function is called by lldb_private::ScriptInterpreterPython::WatchpointCallbackFunction(...)
247// and is used when a script command is attached to a watchpoint for execution.
248
249SWIGEXPORT bool
250LLDBSwigPythonWatchpointCallbackFunction
251(
252    const char *python_function_name,
253    const char *session_dictionary_name,
254    const lldb::StackFrameSP& frame_sp,
255    const lldb::WatchpointSP& wp_sp
256)
257{
258    lldb::SBFrame sb_frame (frame_sp);
259    lldb::SBWatchpoint sb_wp(wp_sp);
260
261    bool stop_at_watchpoint = true;
262
263    {
264        PyErr_Cleaner py_err_cleaner(true);
265
266        PyCallable pfunc = PyCallable::FindWithFunctionName(python_function_name,session_dictionary_name);
267
268        if (!pfunc)
269            return stop_at_watchpoint;
270
271        PyObject* session_dict = NULL;
272        PyObject* pvalue = NULL;
273        pvalue = pfunc(sb_frame, sb_wp, session_dict = FindSessionDictionary(session_dictionary_name));
274
275        Py_XINCREF (session_dict);
276
277        if (pvalue == Py_False)
278            stop_at_watchpoint = false;
279
280        Py_XDECREF (pvalue);
281    }
282
283    return stop_at_watchpoint;
284}
285
286bool
287PyObjectToString (PyObject* object,
288                  std::string& retval)
289{
290    retval.clear();
291    bool was_ok = false;
292    if (object != NULL && object != Py_None)
293    {
294        if (PyString_Check(object))
295        {
296            retval.assign(PyString_AsString(object));
297            was_ok = true;
298        }
299        else
300        {
301            PyObject* value_as_string = PyObject_Str(object);
302            if (value_as_string && value_as_string != Py_None && PyString_Check(value_as_string))
303            {
304                retval.assign(PyString_AsString(value_as_string));
305                was_ok = true;
306            }
307            Py_XDECREF(value_as_string);
308        }
309    }
310    return was_ok;
311}
312
313SWIGEXPORT bool
314LLDBSwigPythonCallTypeScript
315(
316    const char *python_function_name,
317    const void *session_dictionary,
318    const lldb::ValueObjectSP& valobj_sp,
319    void** pyfunct_wrapper,
320    std::string& retval
321)
322{
323    lldb::SBValue sb_value (valobj_sp);
324
325    retval.clear();
326
327    if (!python_function_name || !session_dictionary)
328        return false;
329
330    PyObject *session_dict = (PyObject*)session_dictionary, *pfunc_impl = NULL, *pvalue = NULL;
331
332    if (pyfunct_wrapper && *pyfunct_wrapper && PyFunction_Check (*pyfunct_wrapper))
333    {
334        pfunc_impl = (PyObject*)(*pyfunct_wrapper);
335        if (pfunc_impl->ob_refcnt == 1)
336        {
337            Py_XDECREF(pfunc_impl);
338            pfunc_impl = NULL;
339        }
340    }
341
342    if (PyDict_Check(session_dict))
343    {
344        PyErr_Cleaner pyerr_cleanup(true);  // show Python errors
345
346        if (!pfunc_impl)
347        {
348            pfunc_impl = ResolvePythonName (python_function_name, session_dict);
349            if (!pfunc_impl || !PyCallable_Check (pfunc_impl))
350                return false;
351            else
352            {
353                if (pyfunct_wrapper)
354                    *pyfunct_wrapper = pfunc_impl;
355            }
356        }
357        /*else
358            printf("caching works!!!!\n");*/
359
360        PyCallable pfunc = PyCallable::FindWithPythonObject(pfunc_impl);
361
362        if (!pfunc)
363            return false;
364
365        pvalue = pfunc(sb_value,session_dict);
366
367        Py_INCREF (session_dict);
368
369        PyObjectToString(pvalue,retval);
370
371        Py_XDECREF (pvalue);
372    }
373    return true;
374}
375
376SWIGEXPORT void*
377LLDBSwigPythonCreateSyntheticProvider
378(
379    const char *python_class_name,
380    const char *session_dictionary_name,
381    const lldb::ValueObjectSP& valobj_sp
382)
383{
384    PyObject* retval = NULL;
385
386    if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name)
387        Py_RETURN_NONE;
388
389    // I do not want the SBValue to be deallocated when going out of scope because python
390    // has ownership of it and will manage memory for this object by itself
391    lldb::SBValue *sb_value = new lldb::SBValue(valobj_sp);
392    sb_value->SetPreferSyntheticValue(false);
393    PyObject *ValObj_PyObj = SBTypeToSWIGWrapper(sb_value);
394
395    if (ValObj_PyObj == NULL)
396        Py_RETURN_NONE;
397
398    {
399        PyErr_Cleaner py_err_cleaner(true);
400
401        PyCallable pfunc = PyCallable::FindWithFunctionName(python_class_name,session_dictionary_name);
402
403        if (!pfunc)
404            return retval;
405
406        Py_INCREF(ValObj_PyObj);
407
408        PyObject* session_dict = NULL;
409        session_dict = FindSessionDictionary(session_dictionary_name);
410        retval = pfunc(sb_value, session_dict);
411
412        Py_XINCREF (session_dict);
413
414        Py_XINCREF(retval);
415    }
416
417    if (retval)
418        return retval;
419    else
420        Py_RETURN_NONE;
421}
422
423// wrapper that calls an optional instance member of an object taking no arguments
424static PyObject*
425LLDBSwigPython_CallOptionalMember
426(
427    PyObject* self,
428    char* callee_name,
429    PyObject* ret_if_not_found = Py_None,
430    bool* was_found = NULL
431)
432{
433    PyErr_Cleaner py_err_cleaner(false);
434
435    PyCallable pfunc = PyCallable::FindWithMemberFunction(self,callee_name);
436
437    if (!pfunc)
438    {
439        if (was_found)
440            *was_found = false;
441        Py_XINCREF(ret_if_not_found);
442        return ret_if_not_found;
443    }
444
445    if (was_found)
446        *was_found = true;
447
448    PyObject* py_return = pfunc();
449    return py_return;
450}
451
452SWIGEXPORT uint32_t
453LLDBSwigPython_CalculateNumChildren
454(
455    PyObject *implementor
456)
457{
458    uint32_t ret_val = UINT32_MAX;
459
460    static char callee_name[] = "num_children";
461
462    PyObject* py_return = LLDBSwigPython_CallOptionalMember(implementor,callee_name, NULL);
463
464    if (!py_return)
465        return ret_val;
466
467    if (PyInt_Check(py_return))
468        ret_val = PyInt_AsLong(py_return);
469
470    Py_XDECREF(py_return);
471
472    if (PyErr_Occurred())
473    {
474        PyErr_Print();
475        PyErr_Clear();
476    }
477
478    return ret_val;
479}
480
481SWIGEXPORT PyObject*
482LLDBSwigPython_GetChildAtIndex
483(
484    PyObject *implementor,
485    uint32_t idx
486)
487{
488    PyErr_Cleaner py_err_cleaner(true);
489
490    PyCallable pfunc = PyCallable::FindWithMemberFunction(implementor,"get_child_at_index");
491
492    if (!pfunc)
493        return NULL;
494
495    PyObject *py_return = NULL;
496    py_return = pfunc(idx);
497
498    if (py_return == NULL || py_return == Py_None)
499    {
500        Py_XDECREF(py_return);
501        return NULL;
502    }
503
504    lldb::SBValue* sbvalue_ptr = NULL;
505
506    if (SWIG_ConvertPtr(py_return, (void**)&sbvalue_ptr, SWIGTYPE_p_lldb__SBValue, 0) == -1)
507    {
508        Py_XDECREF(py_return);
509        return NULL;
510    }
511
512    if (sbvalue_ptr == NULL)
513        return NULL;
514
515    return py_return;
516}
517
518SWIGEXPORT int
519LLDBSwigPython_GetIndexOfChildWithName
520(
521    PyObject *implementor,
522    const char* child_name
523)
524{
525    PyErr_Cleaner py_err_cleaner(true);
526
527    PyCallable pfunc = PyCallable::FindWithMemberFunction(implementor,"get_child_index");
528
529    if (!pfunc)
530        return UINT32_MAX;
531
532    PyObject *py_return = NULL;
533    py_return = pfunc(child_name);
534
535    if (py_return == NULL || py_return == Py_None)
536    {
537        Py_XDECREF(py_return);
538        return UINT32_MAX;
539    }
540
541    long retval = PyInt_AsLong(py_return);
542    Py_XDECREF(py_return);
543
544    if (retval >= 0)
545        return (uint32_t)retval;
546
547    return UINT32_MAX;
548}
549
550SWIGEXPORT bool
551LLDBSwigPython_UpdateSynthProviderInstance
552(
553    PyObject *implementor
554)
555{
556    bool ret_val = false;
557
558    static char callee_name[] = "update";
559
560    PyObject* py_return = LLDBSwigPython_CallOptionalMember(implementor,callee_name);
561
562    if (py_return == Py_True)
563        ret_val = true;
564
565    Py_XDECREF(py_return);
566
567    return ret_val;
568}
569
570SWIGEXPORT bool
571LLDBSwigPython_MightHaveChildrenSynthProviderInstance
572(
573    PyObject *implementor
574)
575{
576    bool ret_val = false;
577
578    static char callee_name[] = "has_children";
579
580    PyObject* py_return = LLDBSwigPython_CallOptionalMember(implementor,callee_name, Py_True);
581
582    if (py_return == Py_True)
583        ret_val = true;
584
585    Py_XDECREF(py_return);
586
587    return ret_val;
588}
589
590SWIGEXPORT void*
591LLDBSWIGPython_CastPyObjectToSBValue
592(
593    PyObject* data
594)
595{
596    lldb::SBValue* sb_ptr = NULL;
597
598    int valid_cast = SWIG_ConvertPtr(data, (void**)&sb_ptr, SWIGTYPE_p_lldb__SBValue, 0);
599
600    if (valid_cast == -1)
601        return NULL;
602
603    return sb_ptr;
604}
605
606// Currently, SBCommandReturnObjectReleaser wraps a unique pointer to an
607// lldb_private::CommandReturnObject. This means that the destructor for the
608// SB object will deallocate its contained CommandReturnObject. Because that
609// object is used as the real return object for Python-based commands, we want
610// it to stay around. Thus, we release the unique pointer before returning from
611// LLDBSwigPythonCallCommand, and to guarantee that the release will occur no
612// matter how we exit from the function, we have a releaser object whose
613// destructor does the right thing for us
614class SBCommandReturnObjectReleaser
615{
616public:
617    SBCommandReturnObjectReleaser (lldb::SBCommandReturnObject &obj) :
618        m_command_return_object_ref (obj)
619    {
620    }
621
622    ~SBCommandReturnObjectReleaser ()
623    {
624        m_command_return_object_ref.Release();
625    }
626private:
627    lldb::SBCommandReturnObject &m_command_return_object_ref;
628};
629
630SWIGEXPORT bool
631LLDBSwigPythonCallCommand
632(
633    const char *python_function_name,
634    const char *session_dictionary_name,
635    lldb::DebuggerSP& debugger,
636    const char* args,
637    lldb_private::CommandReturnObject& cmd_retobj
638)
639{
640
641    lldb::SBCommandReturnObject cmd_retobj_sb(&cmd_retobj);
642    SBCommandReturnObjectReleaser cmd_retobj_sb_releaser(cmd_retobj_sb);
643    lldb::SBDebugger debugger_sb(debugger);
644
645    bool retval = false;
646
647    {
648        PyErr_Cleaner py_err_cleaner(true);
649        PyCallable pfunc = PyCallable::FindWithFunctionName(python_function_name,session_dictionary_name);
650
651        if (!pfunc)
652            return retval;
653
654        PyObject* session_dict = NULL;
655        // pass the pointer-to cmd_retobj_sb or watch the underlying object disappear from under you
656        // see comment above for SBCommandReturnObjectReleaser for further details
657        PyObject* pvalue = NULL;
658        pvalue = pfunc(debugger_sb, args, &cmd_retobj_sb, session_dict = FindSessionDictionary(session_dictionary_name));
659
660        Py_XINCREF (session_dict);
661        Py_XDECREF (pvalue);
662
663        retval = true;
664    }
665
666    return retval;
667}
668
669SWIGEXPORT void*
670LLDBSWIGPythonCreateOSPlugin
671(
672    const char *python_class_name,
673    const char *session_dictionary_name,
674    const lldb::ProcessSP& process_sp
675)
676{
677    PyObject* retval = NULL;
678
679    if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name)
680        Py_RETURN_NONE;
681
682    // I do not want the SBProcess to be deallocated when going out of scope because python
683    // has ownership of it and will manage memory for this object by itself
684    lldb::SBProcess *process_sb = new lldb::SBProcess(process_sp);
685
686    PyObject *SBProc_PyObj = SBTypeToSWIGWrapper(process_sb);
687
688    if (SBProc_PyObj == NULL)
689        Py_RETURN_NONE;
690
691    {
692        PyErr_Cleaner py_err_cleaner(true);
693
694        PyCallable pfunc = PyCallable::FindWithFunctionName(python_class_name,session_dictionary_name);
695
696        if (!pfunc)
697            return retval;
698
699        Py_INCREF(SBProc_PyObj);
700
701        PyObject* session_dict = NULL;
702        session_dict = session_dict = FindSessionDictionary(session_dictionary_name);
703        retval = pfunc(SBProc_PyObj);
704
705        Py_XINCREF (session_dict);
706
707        Py_XINCREF(retval);
708    }
709
710    if (retval)
711        return retval;
712    else
713        Py_RETURN_NONE;
714}
715
716SWIGEXPORT bool
717LLDBSWIGPythonRunScriptKeywordProcess
718(const char* python_function_name,
719const char* session_dictionary_name,
720lldb::ProcessSP& process,
721std::string& output)
722
723{
724    bool retval = false;
725
726    if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name)
727        return retval;
728
729    lldb::SBProcess process_sb(process);
730
731    {
732        PyErr_Cleaner py_err_cleaner(true);
733
734        PyCallable pfunc = PyCallable::FindWithFunctionName(python_function_name,session_dictionary_name);
735
736        if (!pfunc)
737            return retval;
738
739        PyObject* session_dict = NULL;
740        PyObject* pvalue = NULL;
741        pvalue = pfunc(process_sb, session_dict = FindSessionDictionary(session_dictionary_name));
742
743        Py_XINCREF (session_dict);
744
745        if (PyObjectToString(pvalue,output))
746            retval = true;
747
748        Py_XDECREF(pvalue);
749    }
750
751    return retval;
752}
753
754SWIGEXPORT bool
755LLDBSWIGPythonRunScriptKeywordThread
756(const char* python_function_name,
757const char* session_dictionary_name,
758lldb::ThreadSP& thread,
759std::string& output)
760
761{
762    bool retval = false;
763
764    if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name)
765        return retval;
766
767    lldb::SBThread thread_sb(thread);
768
769    {
770        PyErr_Cleaner py_err_cleaner(true);
771
772        PyCallable pfunc = PyCallable::FindWithFunctionName(python_function_name,session_dictionary_name);
773
774        if (!pfunc)
775            return retval;
776
777        PyObject* session_dict = NULL;
778        PyObject* pvalue = NULL;
779        pvalue = pfunc(thread_sb, session_dict = FindSessionDictionary(session_dictionary_name));
780
781        Py_XINCREF (session_dict);
782
783        if (PyObjectToString(pvalue,output))
784            retval = true;
785
786        Py_XDECREF(pvalue);
787    }
788
789    return retval;
790}
791
792SWIGEXPORT bool
793LLDBSWIGPythonRunScriptKeywordTarget
794(const char* python_function_name,
795const char* session_dictionary_name,
796lldb::TargetSP& target,
797std::string& output)
798
799{
800    bool retval = false;
801
802    if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name)
803        return retval;
804
805    lldb::SBTarget target_sb(target);
806
807    {
808        PyErr_Cleaner py_err_cleaner(true);
809
810        PyCallable pfunc = PyCallable::FindWithFunctionName(python_function_name,session_dictionary_name);
811
812        if (!pfunc)
813            return retval;
814
815        PyObject* session_dict = NULL;
816        PyObject* pvalue = NULL;
817        pvalue = pfunc(target_sb, session_dict = FindSessionDictionary(session_dictionary_name));
818
819        Py_XINCREF (session_dict);
820
821        if (PyObjectToString(pvalue,output))
822            retval = true;
823
824        Py_XDECREF(pvalue);
825    }
826
827    return retval;
828}
829
830SWIGEXPORT bool
831LLDBSWIGPythonRunScriptKeywordFrame
832(const char* python_function_name,
833const char* session_dictionary_name,
834lldb::StackFrameSP& frame,
835std::string& output)
836
837{
838    bool retval = false;
839
840    if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name)
841        return retval;
842
843    lldb::SBFrame frame_sb(frame);
844
845    {
846        PyErr_Cleaner py_err_cleaner(true);
847
848        PyCallable pfunc = PyCallable::FindWithFunctionName(python_function_name,session_dictionary_name);
849
850        if (!pfunc)
851            return retval;
852
853        PyObject* session_dict = NULL;
854        PyObject* pvalue = NULL;
855        pvalue = pfunc(frame_sb, session_dict = FindSessionDictionary(session_dictionary_name));
856
857        Py_XINCREF (session_dict);
858
859        if (PyObjectToString(pvalue,output))
860            retval = true;
861
862        Py_XDECREF(pvalue);
863    }
864
865    return retval;
866}
867
868SWIGEXPORT bool
869LLDBSwigPythonCallModuleInit
870(
871    const char *python_module_name,
872    const char *session_dictionary_name,
873    lldb::DebuggerSP& debugger
874)
875{
876    bool retval = false;
877
878    lldb::SBDebugger debugger_sb(debugger);
879
880    std::string python_function_name_string = python_module_name;
881    python_function_name_string += ".__lldb_init_module";
882    const char* python_function_name = python_function_name_string.c_str();
883
884    {
885        PyErr_Cleaner py_err_cleaner(true);
886
887        PyCallable pfunc = PyCallable::FindWithFunctionName(python_function_name,session_dictionary_name);
888
889        if (!pfunc)
890            return true;
891
892        PyObject* session_dict = NULL;
893        PyObject* pvalue = NULL;
894        pvalue = pfunc(debugger_sb, session_dict = FindSessionDictionary(session_dictionary_name));
895
896        Py_XINCREF (session_dict);
897
898        retval = true;
899
900        Py_XDECREF(pvalue);
901    }
902
903    return retval;
904}
905%}
906
907
908%runtime %{
909// Forward declaration to be inserted at the start of LLDBWrapPython.h
910// I used runtime as a hack to make SWIG place it where it's needed.
911// This is needed to use LLDBSwigPythonCallSBInputReaderCallback in the
912// typemaps and in the extensions (SBInputReader.__del__()).
913#include "lldb/API/SBInputReader.h"
914#include "lldb/API/SBDebugger.h"
915
916#ifdef __cplusplus
917extern "C" {
918#endif
919
920size_t
921LLDBSwigPythonCallSBInputReaderCallback(void *baton,
922                                        lldb::SBInputReader *reader,
923                                        lldb::InputReaderAction notification,
924                                        const char*bytes,
925                                        size_t bytes_len);
926
927void LLDBSwigPythonCallPythonLogOutputCallback(const char *str, void *baton);
928
929#ifdef __cplusplus
930}
931#endif
932%}
933
934%wrapper %{
935// For the InputReader Callback functions
936SWIGEXPORT size_t
937LLDBSwigPythonCallSBInputReaderCallback(void *baton,
938                                        lldb::SBInputReader *reader,
939                                        lldb::InputReaderAction notification,
940                                        const char*bytes,
941                                        size_t bytes_len) {
942    if (baton != Py_None) {
943        SWIG_PYTHON_THREAD_BEGIN_BLOCK;
944
945        PyObject *py_InputReader = SBTypeToSWIGWrapper(reader);
946        PyObject *py_Notification = PyInt_FromLong(notification);
947        PyObject *py_Bytes = PyBytes_FromStringAndSize(bytes, bytes_len);
948
949        PyObject *tuple = PyTuple_Pack(3, py_InputReader, py_Notification, py_Bytes);
950        PyObject *res = PyObject_Call(reinterpret_cast<PyObject*>(baton), tuple, NULL);
951        Py_XDECREF(tuple);
952        Py_XDECREF(py_InputReader);
953        Py_XDECREF(py_Notification);
954        Py_XDECREF(py_Bytes);
955
956        if (res == NULL) {
957          PyObject *exc = PyErr_Occurred();
958          if (exc) {
959            ::puts("\nErroring out at LLDBSwigPythonCallSBInputReaderCallback");
960            PyErr_Print();
961          }
962          return 0;
963        }
964
965        size_t result = 0;
966        // If the callback misbehaves and returns Py_None, assume it returned 0
967        if (res != Py_None)
968          result = static_cast<size_t>(PyInt_AsSsize_t(res));
969
970        Py_XDECREF(res);
971        SWIG_PYTHON_THREAD_END_BLOCK;
972        return result;
973    }
974    return 0;
975}
976
977// For the LogOutputCallback functions
978void LLDBSwigPythonCallPythonLogOutputCallback(const char *str, void *baton) {
979    if (baton != Py_None) {
980      SWIG_PYTHON_THREAD_BEGIN_BLOCK;
981      PyObject_CallFunction(reinterpret_cast<PyObject*>(baton), const_cast<char*>("s"), str);
982      SWIG_PYTHON_THREAD_END_BLOCK;
983    }
984}
985%}
986