16498aff2SJonas Devlieghere%header %{
26498aff2SJonas Devlieghere
36498aff2SJonas Devlieghereclass PyErr_Cleaner
46498aff2SJonas Devlieghere{
56498aff2SJonas Devliegherepublic:
66498aff2SJonas Devlieghere    PyErr_Cleaner(bool print=false) :
76498aff2SJonas Devlieghere    m_print(print)
86498aff2SJonas Devlieghere    {
96498aff2SJonas Devlieghere    }
106498aff2SJonas Devlieghere
116498aff2SJonas Devlieghere    ~PyErr_Cleaner()
126498aff2SJonas Devlieghere    {
136498aff2SJonas Devlieghere        if (PyErr_Occurred())
146498aff2SJonas Devlieghere        {
156498aff2SJonas Devlieghere            if(m_print && !PyErr_ExceptionMatches(PyExc_SystemExit))
166498aff2SJonas Devlieghere                PyErr_Print();
176498aff2SJonas Devlieghere            PyErr_Clear();
186498aff2SJonas Devlieghere        }
196498aff2SJonas Devlieghere    }
206498aff2SJonas Devlieghere
216498aff2SJonas Devlieghereprivate:
226498aff2SJonas Devlieghere    bool m_print;
236498aff2SJonas Devlieghere};
246498aff2SJonas Devlieghere
25*9a14adeaSPavel Labathllvm::Expected<bool>
26*9a14adeaSPavel Labathlldb_private::LLDBSwigPythonBreakpointCallbackFunction
276498aff2SJonas Devlieghere(
286498aff2SJonas Devlieghere    const char *python_function_name,
296498aff2SJonas Devlieghere    const char *session_dictionary_name,
306498aff2SJonas Devlieghere    const lldb::StackFrameSP& frame_sp,
316498aff2SJonas Devlieghere    const lldb::BreakpointLocationSP& bp_loc_sp,
326498aff2SJonas Devlieghere    lldb_private::StructuredDataImpl *args_impl
336498aff2SJonas Devlieghere)
346498aff2SJonas Devlieghere{
356498aff2SJonas Devlieghere    using namespace llvm;
366498aff2SJonas Devlieghere
376498aff2SJonas Devlieghere    lldb::SBFrame sb_frame (frame_sp);
386498aff2SJonas Devlieghere    lldb::SBBreakpointLocation sb_bp_loc(bp_loc_sp);
396498aff2SJonas Devlieghere
406498aff2SJonas Devlieghere    PyErr_Cleaner py_err_cleaner(true);
416498aff2SJonas Devlieghere    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name);
426498aff2SJonas Devlieghere    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict);
436498aff2SJonas Devlieghere
446498aff2SJonas Devlieghere    unsigned max_positional_args;
456498aff2SJonas Devlieghere    if (auto arg_info = pfunc.GetArgInfo())
466498aff2SJonas Devlieghere        max_positional_args = arg_info.get().max_positional_args;
476498aff2SJonas Devlieghere    else
486498aff2SJonas Devlieghere        return arg_info.takeError();
496498aff2SJonas Devlieghere
506498aff2SJonas Devlieghere    PythonObject frame_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_frame));
516498aff2SJonas Devlieghere    PythonObject bp_loc_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_bp_loc));
526498aff2SJonas Devlieghere
536498aff2SJonas Devlieghere    auto result = [&] () -> Expected<PythonObject> {
546498aff2SJonas Devlieghere        // If the called function doesn't take extra_args, drop them here:
556498aff2SJonas Devlieghere        if (max_positional_args < 4) {
566498aff2SJonas Devlieghere            return pfunc.Call(frame_arg, bp_loc_arg, dict);
576498aff2SJonas Devlieghere        } else {
58f1127914SPavel Labath            // FIXME: SBStructuredData leaked here
596498aff2SJonas Devlieghere            lldb::SBStructuredData *args_value = new lldb::SBStructuredData(args_impl);
60f1127914SPavel Labath            PythonObject args_arg(PyRefType::Owned, SBTypeToSWIGWrapper(*args_value));
616498aff2SJonas Devlieghere            return pfunc.Call(frame_arg, bp_loc_arg, args_arg, dict);
626498aff2SJonas Devlieghere        }
636498aff2SJonas Devlieghere    } ();
646498aff2SJonas Devlieghere
656498aff2SJonas Devlieghere    if (!result)
666498aff2SJonas Devlieghere        return result.takeError();
676498aff2SJonas Devlieghere
686498aff2SJonas Devlieghere    // Only False counts as false!
696498aff2SJonas Devlieghere    return result.get().get() != Py_False;
706498aff2SJonas Devlieghere}
716498aff2SJonas Devlieghere
72*9a14adeaSPavel Labath// resolve a dotted Python name in the form
73*9a14adeaSPavel Labath// foo.bar.baz.Foobar to an actual Python object
74*9a14adeaSPavel Labath// if pmodule is NULL, the __main__ module will be used
75*9a14adeaSPavel Labath// as the starting point for the search
76daf36998SDave Lee
77*9a14adeaSPavel Labath
78*9a14adeaSPavel Labath// This function is called by lldb_private::ScriptInterpreterPython::BreakpointCallbackFunction(...)
79*9a14adeaSPavel Labath// and is used when a script command is attached to a breakpoint for execution.
80daf36998SDave Lee
816498aff2SJonas Devlieghere// This function is called by lldb_private::ScriptInterpreterPython::WatchpointCallbackFunction(...)
826498aff2SJonas Devlieghere// and is used when a script command is attached to a watchpoint for execution.
836498aff2SJonas Devlieghere
84*9a14adeaSPavel Labathbool
85*9a14adeaSPavel Labathlldb_private::LLDBSwigPythonWatchpointCallbackFunction
866498aff2SJonas Devlieghere(
876498aff2SJonas Devlieghere    const char *python_function_name,
886498aff2SJonas Devlieghere    const char *session_dictionary_name,
896498aff2SJonas Devlieghere    const lldb::StackFrameSP& frame_sp,
906498aff2SJonas Devlieghere    const lldb::WatchpointSP& wp_sp
916498aff2SJonas Devlieghere)
926498aff2SJonas Devlieghere{
936498aff2SJonas Devlieghere    lldb::SBFrame sb_frame (frame_sp);
946498aff2SJonas Devlieghere    lldb::SBWatchpoint sb_wp(wp_sp);
956498aff2SJonas Devlieghere
966498aff2SJonas Devlieghere    bool stop_at_watchpoint = true;
976498aff2SJonas Devlieghere
986498aff2SJonas Devlieghere    PyErr_Cleaner py_err_cleaner(true);
996498aff2SJonas Devlieghere
1006498aff2SJonas Devlieghere    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name);
1016498aff2SJonas Devlieghere    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict);
1026498aff2SJonas Devlieghere
1036498aff2SJonas Devlieghere    if (!pfunc.IsAllocated())
1046498aff2SJonas Devlieghere        return stop_at_watchpoint;
1056498aff2SJonas Devlieghere
1066498aff2SJonas Devlieghere    PythonObject frame_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_frame));
1076498aff2SJonas Devlieghere    PythonObject wp_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_wp));
1086498aff2SJonas Devlieghere    PythonObject result = pfunc(frame_arg, wp_arg, dict);
1096498aff2SJonas Devlieghere
1106498aff2SJonas Devlieghere    if (result.get() == Py_False)
1116498aff2SJonas Devlieghere        stop_at_watchpoint = false;
1126498aff2SJonas Devlieghere
1136498aff2SJonas Devlieghere    return stop_at_watchpoint;
1146498aff2SJonas Devlieghere}
1156498aff2SJonas Devlieghere
116*9a14adeaSPavel Labathbool
117*9a14adeaSPavel Labathlldb_private::LLDBSwigPythonCallTypeScript
1186498aff2SJonas Devlieghere(
1196498aff2SJonas Devlieghere    const char *python_function_name,
1206498aff2SJonas Devlieghere    const void *session_dictionary,
1216498aff2SJonas Devlieghere    const lldb::ValueObjectSP& valobj_sp,
1226498aff2SJonas Devlieghere    void** pyfunct_wrapper,
1236498aff2SJonas Devlieghere    const lldb::TypeSummaryOptionsSP& options_sp,
1246498aff2SJonas Devlieghere    std::string& retval
1256498aff2SJonas Devlieghere)
1266498aff2SJonas Devlieghere{
1276498aff2SJonas Devlieghere    lldb::SBTypeSummaryOptions sb_options(options_sp.get());
1286498aff2SJonas Devlieghere
1296498aff2SJonas Devlieghere    retval.clear();
1306498aff2SJonas Devlieghere
1316498aff2SJonas Devlieghere    if (!python_function_name || !session_dictionary)
1326498aff2SJonas Devlieghere        return false;
1336498aff2SJonas Devlieghere
1346498aff2SJonas Devlieghere    PyObject *pfunc_impl = nullptr;
1356498aff2SJonas Devlieghere
1366498aff2SJonas Devlieghere    if (pyfunct_wrapper && *pyfunct_wrapper && PyFunction_Check (*pyfunct_wrapper))
1376498aff2SJonas Devlieghere    {
1386498aff2SJonas Devlieghere        pfunc_impl = (PyObject*)(*pyfunct_wrapper);
1396498aff2SJonas Devlieghere        if (pfunc_impl->ob_refcnt == 1)
1406498aff2SJonas Devlieghere        {
1416498aff2SJonas Devlieghere            Py_XDECREF(pfunc_impl);
1426498aff2SJonas Devlieghere            pfunc_impl = NULL;
1436498aff2SJonas Devlieghere        }
1446498aff2SJonas Devlieghere    }
1456498aff2SJonas Devlieghere
1466498aff2SJonas Devlieghere    PyObject *py_dict = (PyObject*)session_dictionary;
1476498aff2SJonas Devlieghere    if (!PythonDictionary::Check(py_dict))
1486498aff2SJonas Devlieghere        return true;
1496498aff2SJonas Devlieghere
1506498aff2SJonas Devlieghere    PythonDictionary dict(PyRefType::Borrowed, py_dict);
1516498aff2SJonas Devlieghere
1526498aff2SJonas Devlieghere    PyErr_Cleaner pyerr_cleanup(true);  // show Python errors
1536498aff2SJonas Devlieghere
1546498aff2SJonas Devlieghere    PythonCallable pfunc(PyRefType::Borrowed, pfunc_impl);
1556498aff2SJonas Devlieghere
1566498aff2SJonas Devlieghere    if (!pfunc.IsAllocated())
1576498aff2SJonas Devlieghere    {
1586498aff2SJonas Devlieghere        pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict);
1596498aff2SJonas Devlieghere        if (!pfunc.IsAllocated())
1606498aff2SJonas Devlieghere            return false;
1616498aff2SJonas Devlieghere
1626498aff2SJonas Devlieghere        if (pyfunct_wrapper)
1636498aff2SJonas Devlieghere        {
1646498aff2SJonas Devlieghere            *pyfunct_wrapper = pfunc.get();
1656498aff2SJonas Devlieghere            Py_XINCREF(pfunc.get());
1666498aff2SJonas Devlieghere        }
1676498aff2SJonas Devlieghere    }
1686498aff2SJonas Devlieghere
1696498aff2SJonas Devlieghere    PythonObject result;
1706498aff2SJonas Devlieghere    auto argc = pfunc.GetArgInfo();
1716498aff2SJonas Devlieghere    if (!argc) {
1726498aff2SJonas Devlieghere        llvm::consumeError(argc.takeError());
1736498aff2SJonas Devlieghere        return false;
1746498aff2SJonas Devlieghere    }
1756498aff2SJonas Devlieghere
1767f09ab08SPavel Labath    PythonObject value_arg = ToSWIGWrapper(valobj_sp);
1776498aff2SJonas Devlieghere    PythonObject options_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_options));
1786498aff2SJonas Devlieghere
1796498aff2SJonas Devlieghere    if (argc.get().max_positional_args < 3)
1806498aff2SJonas Devlieghere        result = pfunc(value_arg,dict);
1816498aff2SJonas Devlieghere    else
1826498aff2SJonas Devlieghere        result = pfunc(value_arg,dict,options_arg);
1836498aff2SJonas Devlieghere
1846498aff2SJonas Devlieghere    retval = result.Str().GetString().str();
1856498aff2SJonas Devlieghere
1866498aff2SJonas Devlieghere    return true;
1876498aff2SJonas Devlieghere}
1886498aff2SJonas Devlieghere
189*9a14adeaSPavel Labathvoid*
190*9a14adeaSPavel Labathlldb_private::LLDBSwigPythonCreateSyntheticProvider
1916498aff2SJonas Devlieghere(
1926498aff2SJonas Devlieghere    const char *python_class_name,
1936498aff2SJonas Devlieghere    const char *session_dictionary_name,
1946498aff2SJonas Devlieghere    const lldb::ValueObjectSP& valobj_sp
1956498aff2SJonas Devlieghere)
1966498aff2SJonas Devlieghere{
1976498aff2SJonas Devlieghere    if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name)
1986498aff2SJonas Devlieghere        Py_RETURN_NONE;
1996498aff2SJonas Devlieghere
2006498aff2SJonas Devlieghere    PyErr_Cleaner py_err_cleaner(true);
2016498aff2SJonas Devlieghere
2026498aff2SJonas Devlieghere    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name);
2036498aff2SJonas Devlieghere    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_class_name,dict);
2046498aff2SJonas Devlieghere
2056498aff2SJonas Devlieghere    if (!pfunc.IsAllocated())
2066498aff2SJonas Devlieghere        Py_RETURN_NONE;
2076498aff2SJonas Devlieghere
2087f09ab08SPavel Labath    auto sb_value = std::make_unique<lldb::SBValue>(valobj_sp);
2096498aff2SJonas Devlieghere    sb_value->SetPreferSyntheticValue(false);
2106498aff2SJonas Devlieghere
2117f09ab08SPavel Labath    PythonObject val_arg = ToSWIGWrapper(std::move(sb_value));
2126498aff2SJonas Devlieghere    if (!val_arg.IsAllocated())
2136498aff2SJonas Devlieghere        Py_RETURN_NONE;
2146498aff2SJonas Devlieghere
2156498aff2SJonas Devlieghere    PythonObject result = pfunc(val_arg, dict);
2166498aff2SJonas Devlieghere
2176498aff2SJonas Devlieghere    if (result.IsAllocated())
2186498aff2SJonas Devlieghere        return result.release();
2196498aff2SJonas Devlieghere
2206498aff2SJonas Devlieghere    Py_RETURN_NONE;
2216498aff2SJonas Devlieghere}
2226498aff2SJonas Devlieghere
223*9a14adeaSPavel Labathvoid*
224*9a14adeaSPavel Labathlldb_private::LLDBSwigPythonCreateCommandObject
2256498aff2SJonas Devlieghere(
2266498aff2SJonas Devlieghere    const char *python_class_name,
2276498aff2SJonas Devlieghere    const char *session_dictionary_name,
2286498aff2SJonas Devlieghere    const lldb::DebuggerSP debugger_sp
2296498aff2SJonas Devlieghere)
2306498aff2SJonas Devlieghere{
2316498aff2SJonas Devlieghere    if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name)
2326498aff2SJonas Devlieghere        Py_RETURN_NONE;
2336498aff2SJonas Devlieghere
2346498aff2SJonas Devlieghere    PyErr_Cleaner py_err_cleaner(true);
2356498aff2SJonas Devlieghere    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name);
2366498aff2SJonas Devlieghere    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_class_name, dict);
2376498aff2SJonas Devlieghere
2386498aff2SJonas Devlieghere    if (!pfunc.IsAllocated())
2396498aff2SJonas Devlieghere        return nullptr;
2406498aff2SJonas Devlieghere
2416498aff2SJonas Devlieghere    lldb::SBDebugger debugger_sb(debugger_sp);
2426498aff2SJonas Devlieghere    PythonObject debugger_arg(PyRefType::Owned, SBTypeToSWIGWrapper(debugger_sb));
2436498aff2SJonas Devlieghere    PythonObject result = pfunc(debugger_arg, dict);
2446498aff2SJonas Devlieghere
2456498aff2SJonas Devlieghere    if (result.IsAllocated())
2466498aff2SJonas Devlieghere        return result.release();
2476498aff2SJonas Devlieghere
2486498aff2SJonas Devlieghere    Py_RETURN_NONE;
2496498aff2SJonas Devlieghere}
2506498aff2SJonas Devlieghere
251*9a14adeaSPavel Labathvoid*
252*9a14adeaSPavel Labathlldb_private::LLDBSwigPythonCreateScriptedProcess
2531f6a57c1SMed Ismail Bennani(
2541f6a57c1SMed Ismail Bennani    const char *python_class_name,
2551f6a57c1SMed Ismail Bennani    const char *session_dictionary_name,
2561f6a57c1SMed Ismail Bennani    const lldb::TargetSP& target_sp,
2571f6a57c1SMed Ismail Bennani    lldb_private::StructuredDataImpl *args_impl,
2581f6a57c1SMed Ismail Bennani    std::string &error_string
2591f6a57c1SMed Ismail Bennani)
2601f6a57c1SMed Ismail Bennani{
2611f6a57c1SMed Ismail Bennani    if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name)
2621f6a57c1SMed Ismail Bennani        Py_RETURN_NONE;
2631f6a57c1SMed Ismail Bennani
2641f6a57c1SMed Ismail Bennani    PyErr_Cleaner py_err_cleaner(true);
2651f6a57c1SMed Ismail Bennani
2661f6a57c1SMed Ismail Bennani    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name);
2671f6a57c1SMed Ismail Bennani    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_class_name, dict);
2681f6a57c1SMed Ismail Bennani
2691f6a57c1SMed Ismail Bennani    if (!pfunc.IsAllocated()) {
2701f6a57c1SMed Ismail Bennani        error_string.append("could not find script class: ");
2711f6a57c1SMed Ismail Bennani        error_string.append(python_class_name);
2721f6a57c1SMed Ismail Bennani        return nullptr;
2731f6a57c1SMed Ismail Bennani    }
2741f6a57c1SMed Ismail Bennani
2757f09ab08SPavel Labath    PythonObject target_arg = ToSWIGWrapper(target_sp);
2761f6a57c1SMed Ismail Bennani
2771f6a57c1SMed Ismail Bennani    llvm::Expected<PythonCallable::ArgInfo> arg_info = pfunc.GetArgInfo();
2781f6a57c1SMed Ismail Bennani    if (!arg_info) {
2791f6a57c1SMed Ismail Bennani        llvm::handleAllErrors(
2801f6a57c1SMed Ismail Bennani            arg_info.takeError(),
2811f6a57c1SMed Ismail Bennani            [&](PythonException &E) {
2821f6a57c1SMed Ismail Bennani                error_string.append(E.ReadBacktrace());
2831f6a57c1SMed Ismail Bennani            },
2841f6a57c1SMed Ismail Bennani            [&](const llvm::ErrorInfoBase &E) {
2851f6a57c1SMed Ismail Bennani                error_string.append(E.message());
2861f6a57c1SMed Ismail Bennani            });
2871f6a57c1SMed Ismail Bennani        Py_RETURN_NONE;
2881f6a57c1SMed Ismail Bennani    }
2891f6a57c1SMed Ismail Bennani
2901f6a57c1SMed Ismail Bennani    PythonObject result = {};
2911f6a57c1SMed Ismail Bennani    if (arg_info.get().max_positional_args == 2) {
292f1127914SPavel Labath        // FIXME: SBStructuredData leaked here
293f1127914SPavel Labath        PythonObject args_arg(PyRefType::Owned, SBTypeToSWIGWrapper(*new lldb::SBStructuredData(args_impl)));
294738621d0SMed Ismail Bennani        result = pfunc(target_arg, args_arg);
2951f6a57c1SMed Ismail Bennani    } else {
296738621d0SMed Ismail Bennani        error_string.assign("wrong number of arguments in __init__, should be 2 (not including self)");
2971f6a57c1SMed Ismail Bennani        Py_RETURN_NONE;
2981f6a57c1SMed Ismail Bennani    }
2991f6a57c1SMed Ismail Bennani
3001f6a57c1SMed Ismail Bennani    if (result.IsAllocated())
3011f6a57c1SMed Ismail Bennani        return result.release();
3021f6a57c1SMed Ismail Bennani    Py_RETURN_NONE;
3031f6a57c1SMed Ismail Bennani}
3041f6a57c1SMed Ismail Bennani
305*9a14adeaSPavel Labathvoid*
306*9a14adeaSPavel Labathlldb_private::LLDBSwigPythonCreateScriptedThread
30759d8dd79SMed Ismail Bennani(
30859d8dd79SMed Ismail Bennani    const char *python_class_name,
30959d8dd79SMed Ismail Bennani    const char *session_dictionary_name,
310738621d0SMed Ismail Bennani    const lldb::ProcessSP& process_sp,
311738621d0SMed Ismail Bennani    lldb_private::StructuredDataImpl *args_impl,
31259d8dd79SMed Ismail Bennani    std::string &error_string
31359d8dd79SMed Ismail Bennani)
31459d8dd79SMed Ismail Bennani{
31559d8dd79SMed Ismail Bennani    if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name)
31659d8dd79SMed Ismail Bennani        Py_RETURN_NONE;
31759d8dd79SMed Ismail Bennani
31859d8dd79SMed Ismail Bennani    PyErr_Cleaner py_err_cleaner(true);
31959d8dd79SMed Ismail Bennani
32059d8dd79SMed Ismail Bennani    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name);
32159d8dd79SMed Ismail Bennani    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_class_name, dict);
32259d8dd79SMed Ismail Bennani
32359d8dd79SMed Ismail Bennani    if (!pfunc.IsAllocated()) {
32459d8dd79SMed Ismail Bennani        error_string.append("could not find script class: ");
32559d8dd79SMed Ismail Bennani        error_string.append(python_class_name);
32659d8dd79SMed Ismail Bennani        return nullptr;
32759d8dd79SMed Ismail Bennani    }
32859d8dd79SMed Ismail Bennani
32959d8dd79SMed Ismail Bennani    llvm::Expected<PythonCallable::ArgInfo> arg_info = pfunc.GetArgInfo();
33059d8dd79SMed Ismail Bennani    if (!arg_info) {
33159d8dd79SMed Ismail Bennani        llvm::handleAllErrors(
33259d8dd79SMed Ismail Bennani            arg_info.takeError(),
33359d8dd79SMed Ismail Bennani            [&](PythonException &E) {
33459d8dd79SMed Ismail Bennani                error_string.append(E.ReadBacktrace());
33559d8dd79SMed Ismail Bennani            },
33659d8dd79SMed Ismail Bennani            [&](const llvm::ErrorInfoBase &E) {
33759d8dd79SMed Ismail Bennani                error_string.append(E.message());
33859d8dd79SMed Ismail Bennani            });
33959d8dd79SMed Ismail Bennani        Py_RETURN_NONE;
34059d8dd79SMed Ismail Bennani    }
34159d8dd79SMed Ismail Bennani
34259d8dd79SMed Ismail Bennani    PythonObject result = {};
343738621d0SMed Ismail Bennani    if (arg_info.get().max_positional_args == 2) {
344f1127914SPavel Labath        // FIXME: SBStructuredData leaked here
345f1127914SPavel Labath        PythonObject args_arg(PyRefType::Owned, SBTypeToSWIGWrapper(*new lldb::SBStructuredData(args_impl)));
3467f09ab08SPavel Labath        result = pfunc(ToSWIGWrapper(process_sp), args_arg);
34759d8dd79SMed Ismail Bennani    } else {
348738621d0SMed Ismail Bennani        error_string.assign("wrong number of arguments in __init__, should be 2 (not including self)");
34959d8dd79SMed Ismail Bennani        Py_RETURN_NONE;
35059d8dd79SMed Ismail Bennani    }
35159d8dd79SMed Ismail Bennani
35259d8dd79SMed Ismail Bennani    if (result.IsAllocated())
35359d8dd79SMed Ismail Bennani        return result.release();
35459d8dd79SMed Ismail Bennani    Py_RETURN_NONE;
35559d8dd79SMed Ismail Bennani}
35659d8dd79SMed Ismail Bennani
357*9a14adeaSPavel Labathvoid*
358*9a14adeaSPavel Labathlldb_private::LLDBSwigPythonCreateScriptedThreadPlan
3596498aff2SJonas Devlieghere(
3606498aff2SJonas Devlieghere    const char *python_class_name,
3616498aff2SJonas Devlieghere    const char *session_dictionary_name,
3626498aff2SJonas Devlieghere    lldb_private::StructuredDataImpl *args_impl,
3636498aff2SJonas Devlieghere    std::string &error_string,
3646498aff2SJonas Devlieghere    const lldb::ThreadPlanSP& thread_plan_sp
3656498aff2SJonas Devlieghere)
3666498aff2SJonas Devlieghere{
3676498aff2SJonas Devlieghere    if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name)
3686498aff2SJonas Devlieghere        Py_RETURN_NONE;
3696498aff2SJonas Devlieghere
3706498aff2SJonas Devlieghere
3716498aff2SJonas Devlieghere    PyErr_Cleaner py_err_cleaner(true);
3726498aff2SJonas Devlieghere
3736498aff2SJonas Devlieghere    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name);
3746498aff2SJonas Devlieghere    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_class_name, dict);
3756498aff2SJonas Devlieghere
3766498aff2SJonas Devlieghere    if (!pfunc.IsAllocated()) {
3776498aff2SJonas Devlieghere        error_string.append("could not find script class: ");
3786498aff2SJonas Devlieghere        error_string.append(python_class_name);
3796498aff2SJonas Devlieghere        return nullptr;
3806498aff2SJonas Devlieghere    }
3816498aff2SJonas Devlieghere
3827f09ab08SPavel Labath    PythonObject tp_arg = ToSWIGWrapper(thread_plan_sp);
3836498aff2SJonas Devlieghere
3846498aff2SJonas Devlieghere    llvm::Expected<PythonCallable::ArgInfo> arg_info = pfunc.GetArgInfo();
3856498aff2SJonas Devlieghere    if (!arg_info) {
3866498aff2SJonas Devlieghere        llvm::handleAllErrors(
3876498aff2SJonas Devlieghere            arg_info.takeError(),
3886498aff2SJonas Devlieghere            [&](PythonException &E) {
3896498aff2SJonas Devlieghere                error_string.append(E.ReadBacktrace());
3906498aff2SJonas Devlieghere            },
3916498aff2SJonas Devlieghere            [&](const llvm::ErrorInfoBase &E) {
3926498aff2SJonas Devlieghere                error_string.append(E.message());
3936498aff2SJonas Devlieghere            });
3946498aff2SJonas Devlieghere        Py_RETURN_NONE;
3956498aff2SJonas Devlieghere    }
3966498aff2SJonas Devlieghere
3976498aff2SJonas Devlieghere    PythonObject result = {};
3986498aff2SJonas Devlieghere    if (arg_info.get().max_positional_args == 2) {
3996498aff2SJonas Devlieghere        if (args_impl != nullptr) {
4006498aff2SJonas Devlieghere           error_string.assign("args passed, but __init__ does not take an args dictionary");
4016498aff2SJonas Devlieghere           Py_RETURN_NONE;
4026498aff2SJonas Devlieghere        }
4036498aff2SJonas Devlieghere        result = pfunc(tp_arg, dict);
4046498aff2SJonas Devlieghere    } else if (arg_info.get().max_positional_args >= 3) {
405f1127914SPavel Labath        // FIXME: SBStructuredData leaked here
406f1127914SPavel Labath        PythonObject args_arg(PyRefType::Owned, SBTypeToSWIGWrapper(*new lldb::SBStructuredData(args_impl)));
4076498aff2SJonas Devlieghere        result = pfunc(tp_arg, args_arg, dict);
4086498aff2SJonas Devlieghere    } else {
4096498aff2SJonas Devlieghere        error_string.assign("wrong number of arguments in __init__, should be 2 or 3 (not including self)");
4106498aff2SJonas Devlieghere        Py_RETURN_NONE;
4116498aff2SJonas Devlieghere    }
4126498aff2SJonas Devlieghere
4136498aff2SJonas Devlieghere    // FIXME: At this point we should check that the class we found supports all the methods
4146498aff2SJonas Devlieghere    // that we need.
4156498aff2SJonas Devlieghere
4166498aff2SJonas Devlieghere    if (result.IsAllocated())
4176498aff2SJonas Devlieghere        return result.release();
4186498aff2SJonas Devlieghere    Py_RETURN_NONE;
4196498aff2SJonas Devlieghere}
4206498aff2SJonas Devlieghere
421*9a14adeaSPavel Labathbool
422*9a14adeaSPavel Labathlldb_private::LLDBSWIGPythonCallThreadPlan
4236498aff2SJonas Devlieghere(
4246498aff2SJonas Devlieghere    void *implementor,
4256498aff2SJonas Devlieghere    const char *method_name,
4266498aff2SJonas Devlieghere    lldb_private::Event *event,
4276498aff2SJonas Devlieghere    bool &got_error
4286498aff2SJonas Devlieghere)
4296498aff2SJonas Devlieghere{
4306498aff2SJonas Devlieghere    got_error = false;
4316498aff2SJonas Devlieghere
4326498aff2SJonas Devlieghere    PyErr_Cleaner py_err_cleaner(false);
4336498aff2SJonas Devlieghere    PythonObject self(PyRefType::Borrowed, static_cast<PyObject*>(implementor));
4346498aff2SJonas Devlieghere    auto pfunc = self.ResolveName<PythonCallable>(method_name);
4356498aff2SJonas Devlieghere
4366498aff2SJonas Devlieghere    if (!pfunc.IsAllocated())
4376498aff2SJonas Devlieghere        return false;
4386498aff2SJonas Devlieghere
4396498aff2SJonas Devlieghere    PythonObject result;
4406498aff2SJonas Devlieghere    if (event != nullptr)
4416498aff2SJonas Devlieghere    {
4426498aff2SJonas Devlieghere        lldb::SBEvent sb_event(event);
4436498aff2SJonas Devlieghere        PythonObject event_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_event));
4446498aff2SJonas Devlieghere        result = pfunc(event_arg);
4456498aff2SJonas Devlieghere    }
4466498aff2SJonas Devlieghere    else
4476498aff2SJonas Devlieghere        result = pfunc();
4486498aff2SJonas Devlieghere
4496498aff2SJonas Devlieghere    if (PyErr_Occurred())
4506498aff2SJonas Devlieghere    {
4516498aff2SJonas Devlieghere        got_error = true;
4526498aff2SJonas Devlieghere        printf ("Return value was neither false nor true for call to %s.\n", method_name);
4536498aff2SJonas Devlieghere        PyErr_Print();
4546498aff2SJonas Devlieghere        return false;
4556498aff2SJonas Devlieghere    }
4566498aff2SJonas Devlieghere
4576498aff2SJonas Devlieghere    if (result.get() == Py_True)
4586498aff2SJonas Devlieghere        return true;
4596498aff2SJonas Devlieghere    else if (result.get() == Py_False)
4606498aff2SJonas Devlieghere        return false;
4616498aff2SJonas Devlieghere
4626498aff2SJonas Devlieghere    // Somebody returned the wrong thing...
4636498aff2SJonas Devlieghere    got_error = true;
4646498aff2SJonas Devlieghere    printf ("Wrong return value type for call to %s.\n", method_name);
4656498aff2SJonas Devlieghere    return false;
4666498aff2SJonas Devlieghere}
4676498aff2SJonas Devlieghere
468*9a14adeaSPavel Labathvoid *lldb_private::LLDBSwigPythonCreateScriptedBreakpointResolver(
4697f09ab08SPavel Labath    const char *python_class_name, const char *session_dictionary_name,
4706498aff2SJonas Devlieghere    lldb_private::StructuredDataImpl *args_impl,
4717f09ab08SPavel Labath    const lldb::BreakpointSP &breakpoint_sp) {
4727f09ab08SPavel Labath
4736498aff2SJonas Devlieghere    if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name)
4746498aff2SJonas Devlieghere        Py_RETURN_NONE;
4756498aff2SJonas Devlieghere
4766498aff2SJonas Devlieghere    PyErr_Cleaner py_err_cleaner(true);
4776498aff2SJonas Devlieghere
4786498aff2SJonas Devlieghere    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name);
4796498aff2SJonas Devlieghere    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_class_name, dict);
4806498aff2SJonas Devlieghere
4816498aff2SJonas Devlieghere    if (!pfunc.IsAllocated())
4826498aff2SJonas Devlieghere        return nullptr;
4836498aff2SJonas Devlieghere
484f1127914SPavel Labath    // FIXME: SBStructuredData leaked here
4856498aff2SJonas Devlieghere    lldb::SBStructuredData *args_value = new lldb::SBStructuredData(args_impl);
486f1127914SPavel Labath    PythonObject args_arg(PyRefType::Owned, SBTypeToSWIGWrapper(*args_value));
4876498aff2SJonas Devlieghere
4887f09ab08SPavel Labath    PythonObject result = pfunc(ToSWIGWrapper(breakpoint_sp), args_arg, dict);
4896498aff2SJonas Devlieghere    // FIXME: At this point we should check that the class we found supports all the methods
4906498aff2SJonas Devlieghere    // that we need.
4916498aff2SJonas Devlieghere
4926498aff2SJonas Devlieghere    if (result.IsAllocated())
4936498aff2SJonas Devlieghere    {
4946498aff2SJonas Devlieghere        // Check that __callback__ is defined:
4956498aff2SJonas Devlieghere        auto callback_func = result.ResolveName<PythonCallable>("__callback__");
4966498aff2SJonas Devlieghere        if (callback_func.IsAllocated())
4976498aff2SJonas Devlieghere            return result.release();
4986498aff2SJonas Devlieghere        else
4996498aff2SJonas Devlieghere            result.release();
5006498aff2SJonas Devlieghere    }
5016498aff2SJonas Devlieghere    Py_RETURN_NONE;
5026498aff2SJonas Devlieghere}
5036498aff2SJonas Devlieghere
504*9a14adeaSPavel Labathunsigned int
505*9a14adeaSPavel Labathlldb_private::LLDBSwigPythonCallBreakpointResolver
5066498aff2SJonas Devlieghere(
5076498aff2SJonas Devlieghere    void *implementor,
5086498aff2SJonas Devlieghere    const char *method_name,
5096498aff2SJonas Devlieghere    lldb_private::SymbolContext *sym_ctx
5106498aff2SJonas Devlieghere)
5116498aff2SJonas Devlieghere{
5126498aff2SJonas Devlieghere    PyErr_Cleaner py_err_cleaner(false);
5136498aff2SJonas Devlieghere    PythonObject self(PyRefType::Borrowed, static_cast<PyObject*>(implementor));
5146498aff2SJonas Devlieghere    auto pfunc = self.ResolveName<PythonCallable>(method_name);
5156498aff2SJonas Devlieghere
5166498aff2SJonas Devlieghere    if (!pfunc.IsAllocated())
5176498aff2SJonas Devlieghere        return 0;
5186498aff2SJonas Devlieghere
5196498aff2SJonas Devlieghere    PythonObject result;
5206498aff2SJonas Devlieghere    if (sym_ctx != nullptr) {
5216498aff2SJonas Devlieghere      lldb::SBSymbolContext sb_sym_ctx(sym_ctx);
5226498aff2SJonas Devlieghere      PythonObject sym_ctx_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_sym_ctx));
5236498aff2SJonas Devlieghere      result = pfunc(sym_ctx_arg);
5246498aff2SJonas Devlieghere    } else
5256498aff2SJonas Devlieghere      result = pfunc();
5266498aff2SJonas Devlieghere
5276498aff2SJonas Devlieghere    if (PyErr_Occurred())
5286498aff2SJonas Devlieghere    {
5296498aff2SJonas Devlieghere        PyErr_Print();
53052712d3fSLawrence D'Anna        PyErr_Clear();
5316498aff2SJonas Devlieghere        return 0;
5326498aff2SJonas Devlieghere    }
5336498aff2SJonas Devlieghere
5346498aff2SJonas Devlieghere    // The callback will return a bool, but we're need to also return ints
5356498aff2SJonas Devlieghere    // so we're squirrelling the bool through as an int...  And if you return
5366498aff2SJonas Devlieghere    // nothing, we'll continue.
5376498aff2SJonas Devlieghere    if (strcmp(method_name, "__callback__") == 0) {
5386498aff2SJonas Devlieghere        if (result.get() == Py_False)
5396498aff2SJonas Devlieghere          return 0;
5406498aff2SJonas Devlieghere        else
5416498aff2SJonas Devlieghere          return 1;
5426498aff2SJonas Devlieghere    }
5436498aff2SJonas Devlieghere
54452712d3fSLawrence D'Anna    long long ret_val = unwrapOrSetPythonException(As<long long>(result));
545478619cfSMuhammad Omair Javaid
54652712d3fSLawrence D'Anna    if (PyErr_Occurred()) {
54752712d3fSLawrence D'Anna        PyErr_Print();
54852712d3fSLawrence D'Anna        PyErr_Clear();
54952712d3fSLawrence D'Anna        return 0;
55052712d3fSLawrence D'Anna    }
5516498aff2SJonas Devlieghere
5526498aff2SJonas Devlieghere    return ret_val;
5536498aff2SJonas Devlieghere}
5546498aff2SJonas Devlieghere
555*9a14adeaSPavel Labathvoid *
556*9a14adeaSPavel Labathlldb_private::LLDBSwigPythonCreateScriptedStopHook
5571b1d9815SJim Ingham(
5581b1d9815SJim Ingham    lldb::TargetSP target_sp,
5591b1d9815SJim Ingham    const char *python_class_name,
5601b1d9815SJim Ingham    const char *session_dictionary_name,
5611b1d9815SJim Ingham    lldb_private::StructuredDataImpl *args_impl,
5621b1d9815SJim Ingham    Status &error
5631b1d9815SJim Ingham)
5641b1d9815SJim Ingham{
5651b1d9815SJim Ingham    if (python_class_name == NULL || python_class_name[0] == '\0') {
5661b1d9815SJim Ingham        error.SetErrorString("Empty class name.");
5671b1d9815SJim Ingham        Py_RETURN_NONE;
5681b1d9815SJim Ingham    }
5691b1d9815SJim Ingham    if (!session_dictionary_name) {
5701b1d9815SJim Ingham      error.SetErrorString("No session dictionary");
5711b1d9815SJim Ingham      Py_RETURN_NONE;
5721b1d9815SJim Ingham    }
5731b1d9815SJim Ingham
5741b1d9815SJim Ingham    PyErr_Cleaner py_err_cleaner(true);
5751b1d9815SJim Ingham
5761b1d9815SJim Ingham    auto dict =
5771b1d9815SJim Ingham        PythonModule::MainModule().ResolveName<PythonDictionary>(
5781b1d9815SJim Ingham            session_dictionary_name);
5791b1d9815SJim Ingham    auto pfunc =
5801b1d9815SJim Ingham        PythonObject::ResolveNameWithDictionary<PythonCallable>(
5811b1d9815SJim Ingham            python_class_name, dict);
5821b1d9815SJim Ingham
5831b1d9815SJim Ingham    if (!pfunc.IsAllocated()) {
5841b1d9815SJim Ingham        error.SetErrorStringWithFormat("Could not find class: %s.",
5851b1d9815SJim Ingham                                       python_class_name);
5861b1d9815SJim Ingham        return nullptr;
5871b1d9815SJim Ingham    }
5881b1d9815SJim Ingham
589f1127914SPavel Labath    // FIXME: SBStructuredData leaked here
5901b1d9815SJim Ingham    lldb::SBStructuredData *args_value = new lldb::SBStructuredData(args_impl);
591f1127914SPavel Labath    PythonObject args_arg(PyRefType::Owned, SBTypeToSWIGWrapper(*args_value));
5921b1d9815SJim Ingham
5937f09ab08SPavel Labath    PythonObject result = pfunc(ToSWIGWrapper(target_sp), args_arg, dict);
5941b1d9815SJim Ingham
5951b1d9815SJim Ingham    if (result.IsAllocated())
5961b1d9815SJim Ingham    {
5971b1d9815SJim Ingham        // Check that the handle_stop callback is defined:
5981b1d9815SJim Ingham        auto callback_func = result.ResolveName<PythonCallable>("handle_stop");
5991b1d9815SJim Ingham        if (callback_func.IsAllocated()) {
6001b1d9815SJim Ingham          if (auto args_info = callback_func.GetArgInfo()) {
6011b1d9815SJim Ingham            size_t num_args = (*args_info).max_positional_args;
6021b1d9815SJim Ingham            if (num_args != 2) {
6031b1d9815SJim Ingham              error.SetErrorStringWithFormat("Wrong number of args for "
6042f95c50aSRichard Smith              "handle_stop callback, should be 2 (excluding self), got: %zu",
6051b1d9815SJim Ingham              num_args);
6061b1d9815SJim Ingham              Py_RETURN_NONE;
6071b1d9815SJim Ingham            } else
6081b1d9815SJim Ingham              return result.release();
6091b1d9815SJim Ingham          } else {
6101b1d9815SJim Ingham            error.SetErrorString("Couldn't get num arguments for handle_stop "
6111b1d9815SJim Ingham                                 "callback.");
6121b1d9815SJim Ingham            Py_RETURN_NONE;
6131b1d9815SJim Ingham          }
6141b1d9815SJim Ingham          return result.release();
6151b1d9815SJim Ingham        }
6161b1d9815SJim Ingham        else {
6171b1d9815SJim Ingham          error.SetErrorStringWithFormat("Class \"%s\" is missing the required "
6181b1d9815SJim Ingham                                         "handle_stop callback.",
6191b1d9815SJim Ingham                                         python_class_name);
6201b1d9815SJim Ingham          result.release();
6211b1d9815SJim Ingham        }
6221b1d9815SJim Ingham    }
6231b1d9815SJim Ingham    Py_RETURN_NONE;
6241b1d9815SJim Ingham}
6251b1d9815SJim Ingham
626*9a14adeaSPavel Labathbool
627*9a14adeaSPavel Labathlldb_private::LLDBSwigPythonStopHookCallHandleStop
6281b1d9815SJim Ingham(
6291b1d9815SJim Ingham    void *implementor,
6301b1d9815SJim Ingham    lldb::ExecutionContextRefSP exc_ctx_sp,
6311b1d9815SJim Ingham    lldb::StreamSP stream
6321b1d9815SJim Ingham)
6331b1d9815SJim Ingham{
6341b1d9815SJim Ingham    // handle_stop will return a bool with the meaning "should_stop"...
6351b1d9815SJim Ingham    // If you return nothing we'll assume we are going to stop.
6361b1d9815SJim Ingham    // Also any errors should return true, since we should stop on error.
6371b1d9815SJim Ingham
6381b1d9815SJim Ingham    PyErr_Cleaner py_err_cleaner(false);
6391b1d9815SJim Ingham    PythonObject self(PyRefType::Borrowed, static_cast<PyObject*>(implementor));
6401b1d9815SJim Ingham    auto pfunc = self.ResolveName<PythonCallable>("handle_stop");
6411b1d9815SJim Ingham
6421b1d9815SJim Ingham    if (!pfunc.IsAllocated())
6431b1d9815SJim Ingham        return true;
6441b1d9815SJim Ingham
6451b1d9815SJim Ingham    PythonObject result;
6461b1d9815SJim Ingham    lldb::SBExecutionContext sb_exc_ctx(exc_ctx_sp);
6471b1d9815SJim Ingham    PythonObject exc_ctx_arg(PyRefType::Owned, SBTypeToSWIGWrapper(sb_exc_ctx));
6481b1d9815SJim Ingham    lldb::SBStream sb_stream;
6491b1d9815SJim Ingham    PythonObject sb_stream_arg(PyRefType::Owned,
6501b1d9815SJim Ingham                               SBTypeToSWIGWrapper(sb_stream));
6511b1d9815SJim Ingham    result = pfunc(exc_ctx_arg, sb_stream_arg);
6521b1d9815SJim Ingham
6531b1d9815SJim Ingham    if (PyErr_Occurred())
6541b1d9815SJim Ingham    {
6551b1d9815SJim Ingham        stream->PutCString("Python error occurred handling stop-hook.");
6561b1d9815SJim Ingham        PyErr_Print();
6571b1d9815SJim Ingham        PyErr_Clear();
6581b1d9815SJim Ingham        return true;
6591b1d9815SJim Ingham    }
6601b1d9815SJim Ingham
6611b1d9815SJim Ingham    // Now add the result to the output stream.  SBStream only
6621b1d9815SJim Ingham    // makes an internally help StreamString which I can't interpose, so I
6631b1d9815SJim Ingham    // have to copy it over here.
6641b1d9815SJim Ingham    stream->PutCString(sb_stream.GetData());
6651b1d9815SJim Ingham
6661b1d9815SJim Ingham    if (result.get() == Py_False)
6671b1d9815SJim Ingham      return false;
6681b1d9815SJim Ingham    else
6691b1d9815SJim Ingham      return true;
6701b1d9815SJim Ingham}
6711b1d9815SJim Ingham
6726498aff2SJonas Devlieghere// wrapper that calls an optional instance member of an object taking no arguments
6736498aff2SJonas Devliegherestatic PyObject*
6746498aff2SJonas DevlieghereLLDBSwigPython_CallOptionalMember
6756498aff2SJonas Devlieghere(
6766498aff2SJonas Devlieghere    PyObject* implementor,
6776498aff2SJonas Devlieghere    char* callee_name,
6786498aff2SJonas Devlieghere    PyObject* ret_if_not_found = Py_None,
6796498aff2SJonas Devlieghere    bool* was_found = NULL
6806498aff2SJonas Devlieghere)
6816498aff2SJonas Devlieghere{
6826498aff2SJonas Devlieghere    PyErr_Cleaner py_err_cleaner(false);
6836498aff2SJonas Devlieghere
6846498aff2SJonas Devlieghere    PythonObject self(PyRefType::Borrowed, static_cast<PyObject*>(implementor));
6856498aff2SJonas Devlieghere    auto pfunc = self.ResolveName<PythonCallable>(callee_name);
6866498aff2SJonas Devlieghere
6876498aff2SJonas Devlieghere    if (!pfunc.IsAllocated())
6886498aff2SJonas Devlieghere    {
6896498aff2SJonas Devlieghere        if (was_found)
6906498aff2SJonas Devlieghere            *was_found = false;
6916498aff2SJonas Devlieghere        Py_XINCREF(ret_if_not_found);
6926498aff2SJonas Devlieghere        return ret_if_not_found;
6936498aff2SJonas Devlieghere    }
6946498aff2SJonas Devlieghere
6956498aff2SJonas Devlieghere    if (was_found)
6966498aff2SJonas Devlieghere        *was_found = true;
6976498aff2SJonas Devlieghere
6986498aff2SJonas Devlieghere    PythonObject result = pfunc();
6996498aff2SJonas Devlieghere    return result.release();
7006498aff2SJonas Devlieghere}
7016498aff2SJonas Devlieghere
702*9a14adeaSPavel Labathsize_t
703*9a14adeaSPavel Labathlldb_private::LLDBSwigPython_CalculateNumChildren
7046498aff2SJonas Devlieghere(
7056498aff2SJonas Devlieghere    PyObject *implementor,
7066498aff2SJonas Devlieghere    uint32_t max
7076498aff2SJonas Devlieghere)
7086498aff2SJonas Devlieghere{
7096498aff2SJonas Devlieghere    PythonObject self(PyRefType::Borrowed, implementor);
7106498aff2SJonas Devlieghere    auto pfunc = self.ResolveName<PythonCallable>("num_children");
7116498aff2SJonas Devlieghere
7126498aff2SJonas Devlieghere    if (!pfunc.IsAllocated())
7136498aff2SJonas Devlieghere        return 0;
7146498aff2SJonas Devlieghere
7156498aff2SJonas Devlieghere    auto arg_info = pfunc.GetArgInfo();
7166498aff2SJonas Devlieghere    if (!arg_info) {
7176498aff2SJonas Devlieghere        llvm::consumeError(arg_info.takeError());
7186498aff2SJonas Devlieghere        return 0;
7196498aff2SJonas Devlieghere    }
7206498aff2SJonas Devlieghere
72152712d3fSLawrence D'Anna    size_t ret_val;
722478619cfSMuhammad Omair Javaid    if (arg_info.get().max_positional_args < 1)
72352712d3fSLawrence D'Anna        ret_val = unwrapOrSetPythonException(As<long long>(pfunc.Call()));
724478619cfSMuhammad Omair Javaid    else
72552712d3fSLawrence D'Anna        ret_val = unwrapOrSetPythonException(As<long long>(pfunc.Call(PythonInteger(max))));
726478619cfSMuhammad Omair Javaid
72752712d3fSLawrence D'Anna    if (PyErr_Occurred())
7286498aff2SJonas Devlieghere    {
7296498aff2SJonas Devlieghere        PyErr_Print();
7306498aff2SJonas Devlieghere        PyErr_Clear();
73152712d3fSLawrence D'Anna        return 0;
7326498aff2SJonas Devlieghere    }
7336498aff2SJonas Devlieghere
7346498aff2SJonas Devlieghere    if (arg_info.get().max_positional_args < 1)
7356498aff2SJonas Devlieghere        ret_val = std::min(ret_val, static_cast<size_t>(max));
7366498aff2SJonas Devlieghere
7376498aff2SJonas Devlieghere    return ret_val;
7386498aff2SJonas Devlieghere}
7396498aff2SJonas Devlieghere
740*9a14adeaSPavel LabathPyObject*
741*9a14adeaSPavel Labathlldb_private::LLDBSwigPython_GetChildAtIndex
7426498aff2SJonas Devlieghere(
7436498aff2SJonas Devlieghere    PyObject *implementor,
7446498aff2SJonas Devlieghere    uint32_t idx
7456498aff2SJonas Devlieghere)
7466498aff2SJonas Devlieghere{
7476498aff2SJonas Devlieghere    PyErr_Cleaner py_err_cleaner(true);
7486498aff2SJonas Devlieghere
7496498aff2SJonas Devlieghere    PythonObject self(PyRefType::Borrowed, implementor);
7506498aff2SJonas Devlieghere    auto pfunc = self.ResolveName<PythonCallable>("get_child_at_index");
7516498aff2SJonas Devlieghere
7526498aff2SJonas Devlieghere    if (!pfunc.IsAllocated())
7536498aff2SJonas Devlieghere        return nullptr;
7546498aff2SJonas Devlieghere
7556498aff2SJonas Devlieghere    PythonObject result = pfunc(PythonInteger(idx));
7566498aff2SJonas Devlieghere
7576498aff2SJonas Devlieghere    if (!result.IsAllocated())
7586498aff2SJonas Devlieghere        return nullptr;
7596498aff2SJonas Devlieghere
7606498aff2SJonas Devlieghere    lldb::SBValue* sbvalue_ptr = nullptr;
7616498aff2SJonas Devlieghere    if (SWIG_ConvertPtr(result.get(), (void**)&sbvalue_ptr, SWIGTYPE_p_lldb__SBValue, 0) == -1)
7626498aff2SJonas Devlieghere        return nullptr;
7636498aff2SJonas Devlieghere
7646498aff2SJonas Devlieghere    if (sbvalue_ptr == nullptr)
7656498aff2SJonas Devlieghere        return nullptr;
7666498aff2SJonas Devlieghere
7676498aff2SJonas Devlieghere    return result.release();
7686498aff2SJonas Devlieghere}
7696498aff2SJonas Devlieghere
770*9a14adeaSPavel Labathint
771*9a14adeaSPavel Labathlldb_private::LLDBSwigPython_GetIndexOfChildWithName
7726498aff2SJonas Devlieghere(
7736498aff2SJonas Devlieghere    PyObject *implementor,
7746498aff2SJonas Devlieghere    const char* child_name
7756498aff2SJonas Devlieghere)
7766498aff2SJonas Devlieghere{
7776498aff2SJonas Devlieghere    PyErr_Cleaner py_err_cleaner(true);
7786498aff2SJonas Devlieghere
7796498aff2SJonas Devlieghere    PythonObject self(PyRefType::Borrowed, implementor);
7806498aff2SJonas Devlieghere    auto pfunc = self.ResolveName<PythonCallable>("get_child_index");
7816498aff2SJonas Devlieghere
7826498aff2SJonas Devlieghere    if (!pfunc.IsAllocated())
7836498aff2SJonas Devlieghere        return UINT32_MAX;
7846498aff2SJonas Devlieghere
78552712d3fSLawrence D'Anna    llvm::Expected<PythonObject> result = pfunc.Call(PythonString(child_name));
7866498aff2SJonas Devlieghere
78752712d3fSLawrence D'Anna    long long retval = unwrapOrSetPythonException(As<long long>(std::move(result)));
78852712d3fSLawrence D'Anna
78952712d3fSLawrence D'Anna    if (PyErr_Occurred()) {
79052712d3fSLawrence D'Anna        PyErr_Clear(); // FIXME print this? do something else
7916498aff2SJonas Devlieghere        return UINT32_MAX;
79252712d3fSLawrence D'Anna    }
7936498aff2SJonas Devlieghere
7946498aff2SJonas Devlieghere    if (retval >= 0)
7956498aff2SJonas Devlieghere        return (uint32_t)retval;
7966498aff2SJonas Devlieghere
7976498aff2SJonas Devlieghere    return UINT32_MAX;
7986498aff2SJonas Devlieghere}
7996498aff2SJonas Devlieghere
800*9a14adeaSPavel Labathbool
801*9a14adeaSPavel Labathlldb_private::LLDBSwigPython_UpdateSynthProviderInstance
8026498aff2SJonas Devlieghere(
8036498aff2SJonas Devlieghere    PyObject *implementor
8046498aff2SJonas Devlieghere)
8056498aff2SJonas Devlieghere{
8066498aff2SJonas Devlieghere    bool ret_val = false;
8076498aff2SJonas Devlieghere
8086498aff2SJonas Devlieghere    static char callee_name[] = "update";
8096498aff2SJonas Devlieghere
8106498aff2SJonas Devlieghere    PyObject* py_return = LLDBSwigPython_CallOptionalMember(implementor,callee_name);
8116498aff2SJonas Devlieghere
8126498aff2SJonas Devlieghere    if (py_return == Py_True)
8136498aff2SJonas Devlieghere        ret_val = true;
8146498aff2SJonas Devlieghere
8156498aff2SJonas Devlieghere    Py_XDECREF(py_return);
8166498aff2SJonas Devlieghere
8176498aff2SJonas Devlieghere    return ret_val;
8186498aff2SJonas Devlieghere}
8196498aff2SJonas Devlieghere
820*9a14adeaSPavel Labathbool
821*9a14adeaSPavel Labathlldb_private::LLDBSwigPython_MightHaveChildrenSynthProviderInstance
8226498aff2SJonas Devlieghere(
8236498aff2SJonas Devlieghere    PyObject *implementor
8246498aff2SJonas Devlieghere)
8256498aff2SJonas Devlieghere{
8266498aff2SJonas Devlieghere    bool ret_val = false;
8276498aff2SJonas Devlieghere
8286498aff2SJonas Devlieghere    static char callee_name[] = "has_children";
8296498aff2SJonas Devlieghere
8306498aff2SJonas Devlieghere    PyObject* py_return = LLDBSwigPython_CallOptionalMember(implementor,callee_name, Py_True);
8316498aff2SJonas Devlieghere
8326498aff2SJonas Devlieghere    if (py_return == Py_True)
8336498aff2SJonas Devlieghere        ret_val = true;
8346498aff2SJonas Devlieghere
8356498aff2SJonas Devlieghere    Py_XDECREF(py_return);
8366498aff2SJonas Devlieghere
8376498aff2SJonas Devlieghere    return ret_val;
8386498aff2SJonas Devlieghere}
8396498aff2SJonas Devlieghere
840*9a14adeaSPavel LabathPyObject*
841*9a14adeaSPavel Labathlldb_private::LLDBSwigPython_GetValueSynthProviderInstance
8426498aff2SJonas Devlieghere(
8436498aff2SJonas Devlieghere    PyObject *implementor
8446498aff2SJonas Devlieghere)
8456498aff2SJonas Devlieghere{
8466498aff2SJonas Devlieghere    PyObject* ret_val = nullptr;
8476498aff2SJonas Devlieghere
8486498aff2SJonas Devlieghere    static char callee_name[] = "get_value";
8496498aff2SJonas Devlieghere
8506498aff2SJonas Devlieghere    PyObject* py_return = LLDBSwigPython_CallOptionalMember(implementor,callee_name, Py_None);
8516498aff2SJonas Devlieghere
8526498aff2SJonas Devlieghere    if (py_return == Py_None || py_return == nullptr)
8536498aff2SJonas Devlieghere        ret_val = nullptr;
8546498aff2SJonas Devlieghere
8556498aff2SJonas Devlieghere    lldb::SBValue* sbvalue_ptr = NULL;
8566498aff2SJonas Devlieghere
8576498aff2SJonas Devlieghere    if (SWIG_ConvertPtr(py_return, (void**)&sbvalue_ptr, SWIGTYPE_p_lldb__SBValue, 0) == -1)
8586498aff2SJonas Devlieghere        ret_val = nullptr;
8596498aff2SJonas Devlieghere    else if (sbvalue_ptr == NULL)
8606498aff2SJonas Devlieghere        ret_val = nullptr;
8616498aff2SJonas Devlieghere    else
8626498aff2SJonas Devlieghere        ret_val = py_return;
8636498aff2SJonas Devlieghere
8646498aff2SJonas Devlieghere    Py_XDECREF(py_return);
8656498aff2SJonas Devlieghere    return ret_val;
8666498aff2SJonas Devlieghere}
8676498aff2SJonas Devlieghere
868*9a14adeaSPavel Labathvoid*
869*9a14adeaSPavel Labathlldb_private::LLDBSWIGPython_CastPyObjectToSBData
8701f6a57c1SMed Ismail Bennani(
8711f6a57c1SMed Ismail Bennani    PyObject* data
8721f6a57c1SMed Ismail Bennani)
8731f6a57c1SMed Ismail Bennani{
8741f6a57c1SMed Ismail Bennani    lldb::SBData* sb_ptr = nullptr;
8751f6a57c1SMed Ismail Bennani
8761f6a57c1SMed Ismail Bennani    int valid_cast = SWIG_ConvertPtr(data, (void**)&sb_ptr, SWIGTYPE_p_lldb__SBData, 0);
8771f6a57c1SMed Ismail Bennani
8781f6a57c1SMed Ismail Bennani    if (valid_cast == -1)
8791f6a57c1SMed Ismail Bennani        return NULL;
8801f6a57c1SMed Ismail Bennani
8811f6a57c1SMed Ismail Bennani    return sb_ptr;
8821f6a57c1SMed Ismail Bennani}
8831f6a57c1SMed Ismail Bennani
8841f6a57c1SMed Ismail Bennani
885*9a14adeaSPavel Labathvoid*
886*9a14adeaSPavel Labathlldb_private::LLDBSWIGPython_CastPyObjectToSBError
8871f6a57c1SMed Ismail Bennani(
8881f6a57c1SMed Ismail Bennani    PyObject* data
8891f6a57c1SMed Ismail Bennani)
8901f6a57c1SMed Ismail Bennani{
8911f6a57c1SMed Ismail Bennani    lldb::SBError* sb_ptr = nullptr;
8921f6a57c1SMed Ismail Bennani
8931f6a57c1SMed Ismail Bennani    int valid_cast = SWIG_ConvertPtr(data, (void**)&sb_ptr, SWIGTYPE_p_lldb__SBError, 0);
8941f6a57c1SMed Ismail Bennani
8951f6a57c1SMed Ismail Bennani    if (valid_cast == -1)
8961f6a57c1SMed Ismail Bennani        return NULL;
8971f6a57c1SMed Ismail Bennani
8981f6a57c1SMed Ismail Bennani    return sb_ptr;
8991f6a57c1SMed Ismail Bennani}
9001f6a57c1SMed Ismail Bennani
9011f6a57c1SMed Ismail Bennani
902*9a14adeaSPavel Labathvoid*
903*9a14adeaSPavel Labathlldb_private::LLDBSWIGPython_CastPyObjectToSBValue
9046498aff2SJonas Devlieghere(
9056498aff2SJonas Devlieghere    PyObject* data
9066498aff2SJonas Devlieghere)
9076498aff2SJonas Devlieghere{
9086498aff2SJonas Devlieghere    lldb::SBValue* sb_ptr = NULL;
9096498aff2SJonas Devlieghere
9106498aff2SJonas Devlieghere    int valid_cast = SWIG_ConvertPtr(data, (void**)&sb_ptr, SWIGTYPE_p_lldb__SBValue, 0);
9116498aff2SJonas Devlieghere
9126498aff2SJonas Devlieghere    if (valid_cast == -1)
9136498aff2SJonas Devlieghere        return NULL;
9146498aff2SJonas Devlieghere
9156498aff2SJonas Devlieghere    return sb_ptr;
9166498aff2SJonas Devlieghere}
9176498aff2SJonas Devlieghere
918*9a14adeaSPavel Labathvoid*
919*9a14adeaSPavel Labathlldb_private::LLDBSWIGPython_CastPyObjectToSBMemoryRegionInfo
920a758c9f7SMed Ismail Bennani(
921a758c9f7SMed Ismail Bennani    PyObject* data
922a758c9f7SMed Ismail Bennani)
923a758c9f7SMed Ismail Bennani{
924a758c9f7SMed Ismail Bennani    lldb::SBMemoryRegionInfo* sb_ptr = NULL;
925a758c9f7SMed Ismail Bennani
926a758c9f7SMed Ismail Bennani    int valid_cast = SWIG_ConvertPtr(data, (void**)&sb_ptr, SWIGTYPE_p_lldb__SBMemoryRegionInfo, 0);
927a758c9f7SMed Ismail Bennani
928a758c9f7SMed Ismail Bennani    if (valid_cast == -1)
929a758c9f7SMed Ismail Bennani        return NULL;
930a758c9f7SMed Ismail Bennani
931a758c9f7SMed Ismail Bennani    return sb_ptr;
932a758c9f7SMed Ismail Bennani}
933a758c9f7SMed Ismail Bennani
934*9a14adeaSPavel Labathbool
935*9a14adeaSPavel Labathlldb_private::LLDBSwigPythonCallCommand
9366498aff2SJonas Devlieghere(
9376498aff2SJonas Devlieghere    const char *python_function_name,
9386498aff2SJonas Devlieghere    const char *session_dictionary_name,
9396498aff2SJonas Devlieghere    lldb::DebuggerSP& debugger,
9406498aff2SJonas Devlieghere    const char* args,
9416498aff2SJonas Devlieghere    lldb_private::CommandReturnObject& cmd_retobj,
9426498aff2SJonas Devlieghere    lldb::ExecutionContextRefSP exe_ctx_ref_sp
9436498aff2SJonas Devlieghere)
9446498aff2SJonas Devlieghere{
9456498aff2SJonas Devlieghere    lldb::SBCommandReturnObject cmd_retobj_sb(cmd_retobj);
9466498aff2SJonas Devlieghere    lldb::SBDebugger debugger_sb(debugger);
9476498aff2SJonas Devlieghere    lldb::SBExecutionContext exe_ctx_sb(exe_ctx_ref_sp);
9486498aff2SJonas Devlieghere
9496498aff2SJonas Devlieghere    PyErr_Cleaner py_err_cleaner(true);
9506498aff2SJonas Devlieghere    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name);
9516498aff2SJonas Devlieghere    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict);
9526498aff2SJonas Devlieghere
9536498aff2SJonas Devlieghere    if (!pfunc.IsAllocated())
9546498aff2SJonas Devlieghere        return false;
9556498aff2SJonas Devlieghere
9566498aff2SJonas Devlieghere    auto argc = pfunc.GetArgInfo();
9576498aff2SJonas Devlieghere    if (!argc) {
9586498aff2SJonas Devlieghere        llvm::consumeError(argc.takeError());
9596498aff2SJonas Devlieghere        return false;
9606498aff2SJonas Devlieghere    }
9616498aff2SJonas Devlieghere    PythonObject debugger_arg(PyRefType::Owned, SBTypeToSWIGWrapper(debugger_sb));
9626498aff2SJonas Devlieghere    PythonObject exe_ctx_arg(PyRefType::Owned, SBTypeToSWIGWrapper(exe_ctx_sb));
963f1127914SPavel Labath    PythonObject cmd_retobj_arg(PyRefType::Owned, SBTypeToSWIGWrapper(cmd_retobj_sb));
9646498aff2SJonas Devlieghere
9656498aff2SJonas Devlieghere    if (argc.get().max_positional_args < 5u)
9666498aff2SJonas Devlieghere        pfunc(debugger_arg, PythonString(args), cmd_retobj_arg, dict);
9676498aff2SJonas Devlieghere    else
9686498aff2SJonas Devlieghere        pfunc(debugger_arg, PythonString(args), exe_ctx_arg, cmd_retobj_arg, dict);
9696498aff2SJonas Devlieghere
9706498aff2SJonas Devlieghere    return true;
9716498aff2SJonas Devlieghere}
9726498aff2SJonas Devlieghere
973*9a14adeaSPavel Labathbool
974*9a14adeaSPavel Labathlldb_private::LLDBSwigPythonCallCommandObject
9756498aff2SJonas Devlieghere(
9766498aff2SJonas Devlieghere    PyObject *implementor,
9776498aff2SJonas Devlieghere    lldb::DebuggerSP& debugger,
9786498aff2SJonas Devlieghere    const char* args,
9796498aff2SJonas Devlieghere    lldb_private::CommandReturnObject& cmd_retobj,
9806498aff2SJonas Devlieghere    lldb::ExecutionContextRefSP exe_ctx_ref_sp
9816498aff2SJonas Devlieghere)
9826498aff2SJonas Devlieghere{
9836498aff2SJonas Devlieghere    lldb::SBCommandReturnObject cmd_retobj_sb(cmd_retobj);
9846498aff2SJonas Devlieghere    lldb::SBDebugger debugger_sb(debugger);
9856498aff2SJonas Devlieghere    lldb::SBExecutionContext exe_ctx_sb(exe_ctx_ref_sp);
9866498aff2SJonas Devlieghere
9876498aff2SJonas Devlieghere    PyErr_Cleaner py_err_cleaner(true);
9886498aff2SJonas Devlieghere
9896498aff2SJonas Devlieghere    PythonObject self(PyRefType::Borrowed, implementor);
9906498aff2SJonas Devlieghere    auto pfunc = self.ResolveName<PythonCallable>("__call__");
9916498aff2SJonas Devlieghere
9926498aff2SJonas Devlieghere    if (!pfunc.IsAllocated())
9936498aff2SJonas Devlieghere        return false;
9946498aff2SJonas Devlieghere
9956498aff2SJonas Devlieghere    PythonObject debugger_arg(PyRefType::Owned, SBTypeToSWIGWrapper(debugger_sb));
9966498aff2SJonas Devlieghere    PythonObject exe_ctx_arg(PyRefType::Owned, SBTypeToSWIGWrapper(exe_ctx_sb));
997f1127914SPavel Labath    PythonObject cmd_retobj_arg(PyRefType::Owned, SBTypeToSWIGWrapper(cmd_retobj_sb));
9986498aff2SJonas Devlieghere
9996498aff2SJonas Devlieghere    pfunc(debugger_arg, PythonString(args), exe_ctx_arg, cmd_retobj_arg);
10006498aff2SJonas Devlieghere
10016498aff2SJonas Devlieghere    return true;
10026498aff2SJonas Devlieghere}
10036498aff2SJonas Devlieghere
1004*9a14adeaSPavel Labathvoid*
1005*9a14adeaSPavel Labathlldb_private::LLDBSWIGPythonCreateOSPlugin
10066498aff2SJonas Devlieghere(
10076498aff2SJonas Devlieghere    const char *python_class_name,
10086498aff2SJonas Devlieghere    const char *session_dictionary_name,
10096498aff2SJonas Devlieghere    const lldb::ProcessSP& process_sp
10106498aff2SJonas Devlieghere)
10116498aff2SJonas Devlieghere{
10126498aff2SJonas Devlieghere    if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name)
10136498aff2SJonas Devlieghere        Py_RETURN_NONE;
10146498aff2SJonas Devlieghere
10156498aff2SJonas Devlieghere    PyErr_Cleaner py_err_cleaner(true);
10166498aff2SJonas Devlieghere
10176498aff2SJonas Devlieghere    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name);
10186498aff2SJonas Devlieghere    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_class_name, dict);
10196498aff2SJonas Devlieghere
10206498aff2SJonas Devlieghere    if (!pfunc.IsAllocated())
10216498aff2SJonas Devlieghere        Py_RETURN_NONE;
10226498aff2SJonas Devlieghere
10237f09ab08SPavel Labath    auto result = pfunc(ToSWIGWrapper(process_sp));
10246498aff2SJonas Devlieghere
10256498aff2SJonas Devlieghere    if (result.IsAllocated())
10266498aff2SJonas Devlieghere        return result.release();
10276498aff2SJonas Devlieghere
10286498aff2SJonas Devlieghere    Py_RETURN_NONE;
10296498aff2SJonas Devlieghere}
10306498aff2SJonas Devlieghere
1031*9a14adeaSPavel Labathvoid*
1032*9a14adeaSPavel Labathlldb_private::LLDBSWIGPython_CreateFrameRecognizer
10336498aff2SJonas Devlieghere(
10346498aff2SJonas Devlieghere    const char *python_class_name,
10356498aff2SJonas Devlieghere    const char *session_dictionary_name
10366498aff2SJonas Devlieghere)
10376498aff2SJonas Devlieghere{
10386498aff2SJonas Devlieghere    if (python_class_name == NULL || python_class_name[0] == '\0' || !session_dictionary_name)
10396498aff2SJonas Devlieghere        Py_RETURN_NONE;
10406498aff2SJonas Devlieghere
10416498aff2SJonas Devlieghere    PyErr_Cleaner py_err_cleaner(true);
10426498aff2SJonas Devlieghere
10436498aff2SJonas Devlieghere    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name);
10446498aff2SJonas Devlieghere    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_class_name, dict);
10456498aff2SJonas Devlieghere
10466498aff2SJonas Devlieghere    if (!pfunc.IsAllocated())
10476498aff2SJonas Devlieghere        Py_RETURN_NONE;
10486498aff2SJonas Devlieghere
10496498aff2SJonas Devlieghere    auto result = pfunc();
10506498aff2SJonas Devlieghere
10516498aff2SJonas Devlieghere    if (result.IsAllocated())
10526498aff2SJonas Devlieghere        return result.release();
10536498aff2SJonas Devlieghere
10546498aff2SJonas Devlieghere    Py_RETURN_NONE;
10556498aff2SJonas Devlieghere}
10566498aff2SJonas Devlieghere
1057*9a14adeaSPavel LabathPyObject*
1058*9a14adeaSPavel Labathlldb_private::LLDBSwigPython_GetRecognizedArguments
10596498aff2SJonas Devlieghere(
10606498aff2SJonas Devlieghere    PyObject *implementor,
10616498aff2SJonas Devlieghere    const lldb::StackFrameSP& frame_sp
10626498aff2SJonas Devlieghere)
10636498aff2SJonas Devlieghere{
10646498aff2SJonas Devlieghere    static char callee_name[] = "get_recognized_arguments";
10656498aff2SJonas Devlieghere
10666498aff2SJonas Devlieghere    lldb::SBFrame frame_sb(frame_sp);
10676498aff2SJonas Devlieghere    PyObject *arg = SBTypeToSWIGWrapper(frame_sb);
10686498aff2SJonas Devlieghere
10696498aff2SJonas Devlieghere    PythonString str(callee_name);
10706498aff2SJonas Devlieghere    PyObject* result = PyObject_CallMethodObjArgs(implementor, str.get(), arg,
10716498aff2SJonas Devlieghere                                                  NULL);
10726498aff2SJonas Devlieghere    return result;
10736498aff2SJonas Devlieghere}
10746498aff2SJonas Devlieghere
1075*9a14adeaSPavel Labathvoid*
1076*9a14adeaSPavel Labathlldb_private::LLDBSWIGPython_GetDynamicSetting (void* module, const char* setting, const lldb::TargetSP& target_sp)
10776498aff2SJonas Devlieghere{
10786498aff2SJonas Devlieghere    if (!module || !setting)
10796498aff2SJonas Devlieghere        Py_RETURN_NONE;
10806498aff2SJonas Devlieghere
10816498aff2SJonas Devlieghere    PyErr_Cleaner py_err_cleaner(true);
10826498aff2SJonas Devlieghere    PythonObject py_module(PyRefType::Borrowed, (PyObject *)module);
10836498aff2SJonas Devlieghere    auto pfunc = py_module.ResolveName<PythonCallable>("get_dynamic_setting");
10846498aff2SJonas Devlieghere
10856498aff2SJonas Devlieghere    if (!pfunc.IsAllocated())
10866498aff2SJonas Devlieghere        Py_RETURN_NONE;
10876498aff2SJonas Devlieghere
10887f09ab08SPavel Labath    auto result = pfunc(ToSWIGWrapper(target_sp), PythonString(setting));
10896498aff2SJonas Devlieghere
10906498aff2SJonas Devlieghere    return result.release();
10916498aff2SJonas Devlieghere}
10926498aff2SJonas Devlieghere
1093*9a14adeaSPavel Labathbool lldb_private::LLDBSWIGPythonRunScriptKeywordProcess(
10947f09ab08SPavel Labath    const char *python_function_name, const char *session_dictionary_name,
10957f09ab08SPavel Labath    const lldb::ProcessSP &process, std::string &output) {
10966498aff2SJonas Devlieghere
10976498aff2SJonas Devlieghere    if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name)
10986498aff2SJonas Devlieghere        return false;
10996498aff2SJonas Devlieghere
11006498aff2SJonas Devlieghere    PyErr_Cleaner py_err_cleaner(true);
11016498aff2SJonas Devlieghere
11026498aff2SJonas Devlieghere    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name);
11036498aff2SJonas Devlieghere    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict);
11046498aff2SJonas Devlieghere
11056498aff2SJonas Devlieghere    if (!pfunc.IsAllocated())
11066498aff2SJonas Devlieghere        return false;
11076498aff2SJonas Devlieghere
11087f09ab08SPavel Labath    auto result = pfunc(ToSWIGWrapper(process), dict);
11096498aff2SJonas Devlieghere
11106498aff2SJonas Devlieghere    output = result.Str().GetString().str();
11116498aff2SJonas Devlieghere
11126498aff2SJonas Devlieghere    return true;
11136498aff2SJonas Devlieghere}
11146498aff2SJonas Devlieghere
1115*9a14adeaSPavel Labathbool
1116*9a14adeaSPavel Labathlldb_private::LLDBSWIGPythonRunScriptKeywordThread
11176498aff2SJonas Devlieghere(const char* python_function_name,
11186498aff2SJonas Devlieghereconst char* session_dictionary_name,
11196498aff2SJonas Devliegherelldb::ThreadSP& thread,
11206498aff2SJonas Devliegherestd::string& output)
11216498aff2SJonas Devlieghere
11226498aff2SJonas Devlieghere{
11236498aff2SJonas Devlieghere    if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name)
11246498aff2SJonas Devlieghere        return false;
11256498aff2SJonas Devlieghere
11266498aff2SJonas Devlieghere    PyErr_Cleaner py_err_cleaner(true);
11276498aff2SJonas Devlieghere
11286498aff2SJonas Devlieghere    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name);
11296498aff2SJonas Devlieghere    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict);
11306498aff2SJonas Devlieghere
11316498aff2SJonas Devlieghere    if (!pfunc.IsAllocated())
11326498aff2SJonas Devlieghere        return false;
11336498aff2SJonas Devlieghere
11346498aff2SJonas Devlieghere    lldb::SBThread thread_sb(thread);
11356498aff2SJonas Devlieghere    PythonObject thread_arg(PyRefType::Owned, SBTypeToSWIGWrapper(thread_sb));
11366498aff2SJonas Devlieghere    auto result = pfunc(thread_arg, dict);
11376498aff2SJonas Devlieghere
11386498aff2SJonas Devlieghere    output = result.Str().GetString().str();
11396498aff2SJonas Devlieghere
11406498aff2SJonas Devlieghere    return true;
11416498aff2SJonas Devlieghere}
11426498aff2SJonas Devlieghere
1143*9a14adeaSPavel Labathbool lldb_private::LLDBSWIGPythonRunScriptKeywordTarget(
11447f09ab08SPavel Labath    const char *python_function_name, const char *session_dictionary_name,
11457f09ab08SPavel Labath    const lldb::TargetSP &target, std::string &output) {
11466498aff2SJonas Devlieghere
11476498aff2SJonas Devlieghere    if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name)
11486498aff2SJonas Devlieghere        return false;
11496498aff2SJonas Devlieghere
11506498aff2SJonas Devlieghere    PyErr_Cleaner py_err_cleaner(true);
11516498aff2SJonas Devlieghere
11526498aff2SJonas Devlieghere    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name);
11536498aff2SJonas Devlieghere    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name,dict);
11546498aff2SJonas Devlieghere
11556498aff2SJonas Devlieghere    if (!pfunc.IsAllocated())
11566498aff2SJonas Devlieghere        return false;
11576498aff2SJonas Devlieghere
11587f09ab08SPavel Labath    auto result = pfunc(ToSWIGWrapper(target), dict);
11596498aff2SJonas Devlieghere
11606498aff2SJonas Devlieghere    output = result.Str().GetString().str();
11616498aff2SJonas Devlieghere
11626498aff2SJonas Devlieghere    return true;
11636498aff2SJonas Devlieghere}
11646498aff2SJonas Devlieghere
1165*9a14adeaSPavel Labathbool
1166*9a14adeaSPavel Labathlldb_private::LLDBSWIGPythonRunScriptKeywordFrame
11676498aff2SJonas Devlieghere(const char* python_function_name,
11686498aff2SJonas Devlieghereconst char* session_dictionary_name,
11696498aff2SJonas Devliegherelldb::StackFrameSP& frame,
11706498aff2SJonas Devliegherestd::string& output)
11716498aff2SJonas Devlieghere
11726498aff2SJonas Devlieghere{
11736498aff2SJonas Devlieghere    if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name)
11746498aff2SJonas Devlieghere        return false;
11756498aff2SJonas Devlieghere
11766498aff2SJonas Devlieghere    PyErr_Cleaner py_err_cleaner(true);
11776498aff2SJonas Devlieghere
11786498aff2SJonas Devlieghere    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name);
11796498aff2SJonas Devlieghere    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name,dict);
11806498aff2SJonas Devlieghere
11816498aff2SJonas Devlieghere    if (!pfunc.IsAllocated())
11826498aff2SJonas Devlieghere        return false;
11836498aff2SJonas Devlieghere
11846498aff2SJonas Devlieghere    lldb::SBFrame frame_sb(frame);
11856498aff2SJonas Devlieghere    PythonObject frame_arg(PyRefType::Owned, SBTypeToSWIGWrapper(frame_sb));
11866498aff2SJonas Devlieghere    auto result = pfunc(frame_arg, dict);
11876498aff2SJonas Devlieghere
11886498aff2SJonas Devlieghere    output = result.Str().GetString().str();
11896498aff2SJonas Devlieghere
11906498aff2SJonas Devlieghere    return true;
11916498aff2SJonas Devlieghere}
11926498aff2SJonas Devlieghere
1193*9a14adeaSPavel Labathbool lldb_private::LLDBSWIGPythonRunScriptKeywordValue(
11947f09ab08SPavel Labath    const char *python_function_name, const char *session_dictionary_name,
11957f09ab08SPavel Labath    const lldb::ValueObjectSP &value, std::string &output) {
11966498aff2SJonas Devlieghere
11976498aff2SJonas Devlieghere    if (python_function_name == NULL || python_function_name[0] == '\0' || !session_dictionary_name)
11986498aff2SJonas Devlieghere        return false;
11996498aff2SJonas Devlieghere
12006498aff2SJonas Devlieghere    PyErr_Cleaner py_err_cleaner(true);
12016498aff2SJonas Devlieghere
12026498aff2SJonas Devlieghere    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name);
12036498aff2SJonas Devlieghere    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict);
12046498aff2SJonas Devlieghere
12056498aff2SJonas Devlieghere    if (!pfunc.IsAllocated())
12066498aff2SJonas Devlieghere        return false;
12076498aff2SJonas Devlieghere
12087f09ab08SPavel Labath    auto result = pfunc(ToSWIGWrapper(value), dict);
12096498aff2SJonas Devlieghere
12106498aff2SJonas Devlieghere    output = result.Str().GetString().str();
12116498aff2SJonas Devlieghere
12126498aff2SJonas Devlieghere    return true;
12136498aff2SJonas Devlieghere}
12146498aff2SJonas Devlieghere
1215*9a14adeaSPavel Labathbool
1216*9a14adeaSPavel Labathlldb_private::LLDBSwigPythonCallModuleInit
12176498aff2SJonas Devlieghere(
12186498aff2SJonas Devlieghere    const char *python_module_name,
12196498aff2SJonas Devlieghere    const char *session_dictionary_name,
12206498aff2SJonas Devlieghere    lldb::DebuggerSP& debugger
12216498aff2SJonas Devlieghere)
12226498aff2SJonas Devlieghere{
12236498aff2SJonas Devlieghere    std::string python_function_name_string = python_module_name;
12246498aff2SJonas Devlieghere    python_function_name_string += ".__lldb_init_module";
12256498aff2SJonas Devlieghere    const char* python_function_name = python_function_name_string.c_str();
12266498aff2SJonas Devlieghere
12276498aff2SJonas Devlieghere    PyErr_Cleaner py_err_cleaner(true);
12286498aff2SJonas Devlieghere
12296498aff2SJonas Devlieghere    auto dict = PythonModule::MainModule().ResolveName<PythonDictionary>(session_dictionary_name);
12306498aff2SJonas Devlieghere    auto pfunc = PythonObject::ResolveNameWithDictionary<PythonCallable>(python_function_name, dict);
12316498aff2SJonas Devlieghere
12326498aff2SJonas Devlieghere    // This method is optional and need not exist.  So if we don't find it,
12336498aff2SJonas Devlieghere    // it's actually a success, not a failure.
12346498aff2SJonas Devlieghere    if (!pfunc.IsAllocated())
12356498aff2SJonas Devlieghere        return true;
12366498aff2SJonas Devlieghere
12376498aff2SJonas Devlieghere    lldb::SBDebugger debugger_sb(debugger);
12386498aff2SJonas Devlieghere    PythonObject debugger_arg(PyRefType::Owned, SBTypeToSWIGWrapper(debugger_sb));
12396498aff2SJonas Devlieghere    pfunc(debugger_arg, dict);
12406498aff2SJonas Devlieghere
12416498aff2SJonas Devlieghere    return true;
12426498aff2SJonas Devlieghere}
12436498aff2SJonas Devlieghere
1244*9a14adeaSPavel Labathlldb::ValueObjectSP
1245*9a14adeaSPavel Labathlldb_private::LLDBSWIGPython_GetValueObjectSPFromSBValue (void* data)
12466498aff2SJonas Devlieghere{
12476498aff2SJonas Devlieghere    lldb::ValueObjectSP valobj_sp;
12486498aff2SJonas Devlieghere    if (data)
12496498aff2SJonas Devlieghere    {
12506498aff2SJonas Devlieghere        lldb::SBValue* sb_ptr = (lldb::SBValue *)data;
12516498aff2SJonas Devlieghere        valobj_sp = sb_ptr->GetSP();
12526498aff2SJonas Devlieghere    }
12536498aff2SJonas Devlieghere    return valobj_sp;
12546498aff2SJonas Devlieghere}
12556498aff2SJonas Devlieghere
12566498aff2SJonas Devlieghere// For the LogOutputCallback functions
1257*9a14adeaSPavel Labathstatic void LLDBSwigPythonCallPythonLogOutputCallback(const char *str, void *baton) {
12586498aff2SJonas Devlieghere    if (baton != Py_None) {
12596498aff2SJonas Devlieghere      SWIG_PYTHON_THREAD_BEGIN_BLOCK;
12606498aff2SJonas Devlieghere      PyObject *result = PyObject_CallFunction(reinterpret_cast<PyObject*>(baton), const_cast<char*>("s"), str);
12616498aff2SJonas Devlieghere	  Py_XDECREF(result);
12626498aff2SJonas Devlieghere      SWIG_PYTHON_THREAD_END_BLOCK;
12636498aff2SJonas Devlieghere    }
12646498aff2SJonas Devlieghere}
12656498aff2SJonas Devlieghere%}
1266