blob: 12c47bd7128163e9e46a2b4055c40ebbdcbcd3e7 [file] [log] [blame] [edit]
import sys
import builtins
import code
import lldb
import traceback
try:
import readline
import rlcompleter
except ImportError:
have_readline = False
except AttributeError:
# This exception gets hit by the rlcompleter when Linux is using
# the readline suppression import.
have_readline = False
else:
have_readline = True
def is_libedit():
if hasattr(readline, "backend"):
return readline.backend == "editline"
return "libedit" in getattr(readline, "__doc__", "")
if is_libedit():
readline.parse_and_bind("bind ^I rl_complete")
else:
readline.parse_and_bind("tab: complete")
# When running one line, we might place the string to run in this string
# in case it would be hard to correctly escape a string's contents
g_run_one_line_str = None
class LLDBExit(SystemExit):
pass
def strip_and_check_exit(line):
line = line.rstrip()
if line in ("exit", "quit"):
raise LLDBExit
return line
def readfunc(prompt):
line = input(prompt)
return strip_and_check_exit(line)
def readfunc_stdio(prompt):
sys.stdout.write(prompt)
sys.stdout.flush()
line = sys.stdin.readline()
# Readline always includes a trailing newline character unless the file
# ends with an incomplete line. An empty line indicates EOF.
if not line:
raise EOFError
return strip_and_check_exit(line)
def run_python_interpreter(local_dict):
# Pass in the dictionary, for continuity from one session to the next.
try:
banner = "Python Interactive Interpreter. To exit, type 'quit()', 'exit()'."
input_func = readfunc_stdio
is_atty = sys.stdin.isatty()
if is_atty:
banner = "Python Interactive Interpreter. To exit, type 'quit()', 'exit()' or Ctrl-D."
input_func = readfunc
code.interact(banner=banner, readfunc=input_func, local=local_dict)
except LLDBExit:
pass
except SystemExit as e:
if e.code:
print("Script exited with code %s" % e.code)
def run_one_line(local_dict, input_string):
global g_run_one_line_str
try:
input_string = strip_and_check_exit(input_string)
repl = code.InteractiveConsole(local_dict)
if input_string:
# A newline is appended to support one-line statements containing
# control flow. For example "if True: print(1)" silently does
# nothing, but works with a newline: "if True: print(1)\n".
input_string += "\n"
repl.runsource(input_string)
elif g_run_one_line_str:
repl.runsource(g_run_one_line_str)
except LLDBExit:
pass
except SystemExit as e:
if e.code:
print("Script exited with code %s" % e.code)