mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-05-15 02:16:40 +00:00

It is now possible to use 'command alias --python' to define a command name that actually triggers execution of a Python function (e.g. command alias --python foo foo_impl makes a command named 'foo' that runs Python function 'foo_impl') The Python function foo_impl should have as signature: def foo_impl(debugger, args, stream, dict): where debugger is an object wrapping an LLDB SBDebugger args is the command line arguments, as an unparsed Python string stream is an SBStream that represents the standard output dict is an internal utility parameter and should be left untouched The function should return None on no error, or an error string to describe any problems llvm-svn: 137722
123 lines
4.1 KiB
C++
123 lines
4.1 KiB
C++
//===-- ScriptInterpreter.cpp -----------------------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "lldb/Interpreter/ScriptInterpreter.h"
|
|
|
|
#include <string>
|
|
#include <stdlib.h>
|
|
#include <stdio.h>
|
|
|
|
#include "lldb/Core/Error.h"
|
|
#include "lldb/Core/Stream.h"
|
|
#include "lldb/Core/StringList.h"
|
|
#include "lldb/Interpreter/CommandReturnObject.h"
|
|
#include "lldb/Interpreter/ScriptInterpreterPython.h"
|
|
#include "lldb/Utility/PseudoTerminal.h"
|
|
|
|
using namespace lldb;
|
|
using namespace lldb_private;
|
|
|
|
ScriptInterpreter::ScriptInterpreter (CommandInterpreter &interpreter, lldb::ScriptLanguage script_lang) :
|
|
m_interpreter (interpreter),
|
|
m_script_lang (script_lang),
|
|
m_interpreter_pty (),
|
|
m_pty_slave_name ()
|
|
{
|
|
if (m_interpreter_pty.OpenFirstAvailableMaster (O_RDWR|O_NOCTTY, NULL, 0))
|
|
{
|
|
const char *slave_name = m_interpreter_pty.GetSlaveName(NULL, 0);
|
|
if (slave_name)
|
|
m_pty_slave_name.assign(slave_name);
|
|
}
|
|
}
|
|
|
|
ScriptInterpreter::~ScriptInterpreter ()
|
|
{
|
|
m_interpreter_pty.CloseMasterFileDescriptor();
|
|
}
|
|
|
|
CommandInterpreter &
|
|
ScriptInterpreter::GetCommandInterpreter ()
|
|
{
|
|
return m_interpreter;
|
|
}
|
|
|
|
const char *
|
|
ScriptInterpreter::GetScriptInterpreterPtyName ()
|
|
{
|
|
return m_pty_slave_name.c_str();
|
|
}
|
|
|
|
int
|
|
ScriptInterpreter::GetMasterFileDescriptor ()
|
|
{
|
|
return m_interpreter_pty.GetMasterFileDescriptor();
|
|
}
|
|
|
|
void
|
|
ScriptInterpreter::CollectDataForBreakpointCommandCallback
|
|
(
|
|
BreakpointOptions *bp_options,
|
|
CommandReturnObject &result
|
|
)
|
|
{
|
|
result.SetStatus (eReturnStatusFailed);
|
|
result.AppendError ("ScriptInterpreter::GetScriptCommands(StringList &) is not implemented.");
|
|
}
|
|
|
|
std::string
|
|
ScriptInterpreter::LanguageToString (lldb::ScriptLanguage language)
|
|
{
|
|
std::string return_value;
|
|
|
|
switch (language)
|
|
{
|
|
case eScriptLanguageNone:
|
|
return_value = "None";
|
|
break;
|
|
case eScriptLanguagePython:
|
|
return_value = "Python";
|
|
break;
|
|
|
|
}
|
|
|
|
return return_value;
|
|
}
|
|
|
|
void
|
|
ScriptInterpreter::InitializeInterpreter (SWIGInitCallback python_swig_init_callback,
|
|
SWIGBreakpointCallbackFunction python_swig_breakpoint_callback,
|
|
SWIGPythonTypeScriptCallbackFunction python_swig_typescript_callback,
|
|
SWIGPythonCreateSyntheticProvider python_swig_synthetic_script,
|
|
SWIGPythonCalculateNumChildren python_swig_calc_children,
|
|
SWIGPythonGetChildAtIndex python_swig_get_child_index,
|
|
SWIGPythonGetIndexOfChildWithName python_swig_get_index_child,
|
|
SWIGPythonCastPyObjectToSBValue python_swig_cast_to_sbvalue,
|
|
SWIGPythonUpdateSynthProviderInstance python_swig_update_provider,
|
|
SWIGPythonCallCommand python_swig_call_command)
|
|
{
|
|
ScriptInterpreterPython::InitializeInterpreter (python_swig_init_callback,
|
|
python_swig_breakpoint_callback,
|
|
python_swig_typescript_callback,
|
|
python_swig_synthetic_script,
|
|
python_swig_calc_children,
|
|
python_swig_get_child_index,
|
|
python_swig_get_index_child,
|
|
python_swig_cast_to_sbvalue,
|
|
python_swig_update_provider,
|
|
python_swig_call_command);
|
|
}
|
|
|
|
void
|
|
ScriptInterpreter::TerminateInterpreter ()
|
|
{
|
|
ScriptInterpreterPython::TerminateInterpreter ();
|
|
}
|
|
|