Add support for custom commands to set flags on themselves

This works for Python commands defined via a class (implement get_flags on your class) and C++ plugin commands (which can call SBCommand::GetFlags()/SetFlags())

Flags allow features such as not letting the command run if there's no target, or if the process is not stopped, ...
Commands could always check for these things themselves, but having these accessible via flags makes custom commands more consistent with built-in ones

llvm-svn: 238286
This commit is contained in:
Enrico Granata
2015-05-27 05:04:35 +00:00
parent 3273930d9a
commit e87764f247
26 changed files with 360 additions and 246 deletions

View File

@@ -2878,6 +2878,78 @@ ScriptInterpreterPython::GetShortHelpForCommandObject (StructuredData::GenericSP
return got_string;
}
uint32_t
ScriptInterpreterPython::GetFlagsForCommandObject (StructuredData::GenericSP cmd_obj_sp)
{
uint32_t result = 0;
Locker py_lock (this,
Locker::AcquireLock | Locker::NoSTDIN,
Locker::FreeLock);
static char callee_name[] = "get_flags";
if (!cmd_obj_sp)
return result;
PyObject* implementor = (PyObject*)cmd_obj_sp->GetValue();
if (implementor == nullptr || implementor == Py_None)
return result;
PyObject* pmeth = PyObject_GetAttrString(implementor, callee_name);
if (PyErr_Occurred())
{
PyErr_Clear();
}
if (pmeth == nullptr || pmeth == Py_None)
{
Py_XDECREF(pmeth);
return result;
}
if (PyCallable_Check(pmeth) == 0)
{
if (PyErr_Occurred())
{
PyErr_Clear();
}
Py_XDECREF(pmeth);
return result;
}
if (PyErr_Occurred())
{
PyErr_Clear();
}
Py_XDECREF(pmeth);
// right now we know this function exists and is callable..
PyObject* py_return = PyObject_CallMethod(implementor, callee_name, nullptr);
// if it fails, print the error but otherwise go on
if (PyErr_Occurred())
{
PyErr_Print();
PyErr_Clear();
}
if (py_return != nullptr && py_return != Py_None)
{
if (PyInt_Check(py_return))
result = (uint32_t)PyInt_AsLong(py_return);
else if (PyLong_Check(py_return))
result = (uint32_t)PyLong_AsLong(py_return);
}
Py_XDECREF(py_return);
return result;
}
bool
ScriptInterpreterPython::GetLongHelpForCommandObject (StructuredData::GenericSP cmd_obj_sp,
std::string& dest)