xref: /llvm-project/lldb/source/Interpreter/embedded_interpreter.py (revision b1823404c3360a8fc7fd74e89ec0566737650919)
1import readline
2import code
3import sys
4import traceback
5
6class SimpleREPL(code.InteractiveConsole):
7   def __init__(self, prompt, dict):
8       code.InteractiveConsole.__init__(self,dict)
9       self.prompt = prompt
10       self.loop_exit = False
11       self.dict = dict
12
13   def interact(self):
14       try:
15           sys.ps1
16       except AttributeError:
17           sys.ps1 = ">>> "
18       try:
19           sys.ps2
20       except AttributeError:
21           sys.ps2 = "... "
22
23       while not self.loop_exit:
24           try:
25               self.read_py_command()
26           except (SystemExit, EOFError):
27               # EOF while in Python just breaks out to top level.
28               self.write('\n')
29               self.loop_exit = True
30               break
31           except KeyboardInterrupt:
32               self.write("\nKeyboardInterrupt\n")
33               self.resetbuffer()
34               more = 0
35           except:
36               traceback.print_exc()
37
38   def process_input (self, in_str):
39      # Canonicalize the format of the input string
40      temp_str = in_str
41      temp_str.strip(' \t')
42      words = temp_str.split()
43      temp_str = ('').join(words)
44
45      # Check the input string to see if it was the quit
46      # command.  If so, intercept it, so that it doesn't
47      # close stdin on us!
48      if (temp_str.lower() == "quit()" or temp_str.lower() == "exit()"):
49         self.loop_exit = True
50         in_str = "raise SystemExit "
51      return in_str
52
53   def my_raw_input (self, prompt):
54      stream = sys.stdout
55      stream.write (prompt)
56      stream.flush ()
57      try:
58         line = sys.stdin.readline()
59      except KeyboardInterrupt:
60         line = " \n"
61      except (SystemExit, EOFError):
62         line = "quit()\n"
63      if not line:
64         raise EOFError
65      if line[-1] == '\n':
66         line = line[:-1]
67      return line
68
69   def read_py_command(self):
70       # Read off a complete Python command.
71       more = 0
72       while 1:
73           if more:
74               prompt = sys.ps2
75           else:
76               prompt = sys.ps1
77           line = self.my_raw_input(prompt)
78           # Can be None if sys.stdin was redefined
79           encoding = getattr(sys.stdin, "encoding", None)
80           if encoding and not isinstance(line, unicode):
81               line = line.decode(encoding)
82           line = self.process_input (line)
83           more = self.push(line)
84           if not more:
85               break
86
87def run_python_interpreter (dict):
88   # Pass in the dictionary, for continuity from one session to the next.
89   repl = SimpleREPL('>>> ', dict)
90   repl.interact()
91