Skip to content

Commit b869bc9

Browse files
committed
add support for "evaluate" requests (enabling you to use the REPL)
1 parent 790273b commit b869bc9

File tree

3 files changed

+90
-16
lines changed

3 files changed

+90
-16
lines changed

src/mobdap/debug_server.clj

Lines changed: 62 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
(def ^:private response-pattern-202 #"^202 Paused\s+(.+)\s+([0-9]+)\s*$")
1515
(def ^:private response-pattern-203 #"^203 Paused\s+(.+)\s+([0-9]+)\s+([0-9]+)\s*$")
1616
(def ^:private response-pattern-204 #"^204 Output (\w+) (\d+)$")
17-
(def ^:private response-pattern-401 #"^401 Error in Execution (\d+)\s*$")
17+
(def ^:private response-pattern-401 #"^401 Error in (\w+) (\d+)\s*$")
1818

1919
(defn- send-line! [server ^String line]
2020
(let [^PrintWriter writer (get-in server [:client :writer])]
@@ -30,7 +30,16 @@
3030
(log/debug "Debuggee -> Debug Server:" message)
3131
(string/trim message))))
3232

33-
(defn- send-command! [server command]
33+
(defn- read-response-with-length! [server len]
34+
(let [^BufferedReader reader (get-in server [:client :reader])
35+
len (Integer/parseInt len)
36+
buffer (char-array len)]
37+
(.read reader buffer 0 len)
38+
(let [res (String/new buffer)]
39+
(log/debug (format "Debuggee -> Debug Server (%s): %s" len res))
40+
res)))
41+
42+
(defn- send-blocking-command! [server command]
3443
(let [^Socket socket (get-in server [:client :socket])
3544
command (string/upper-case command)]
3645
(send-line! server command)
@@ -61,16 +70,16 @@
6170
(do (log/info "Paused at file:" file "line:" line "( watch expression:" watch-index ")")
6271
nil)
6372
(recur))
64-
"204" (if-let [[_ text size] (re-find response-pattern-204 breakpoint)]
65-
(let [size (parse-long size)
66-
message (if (pos? size) (read-response! server) "")]
73+
"204" (if-let [[_ text len] (re-find response-pattern-204 breakpoint)]
74+
(let [size (parse-long len)
75+
message (if (pos? size) (read-response-with-length! server size) "")]
6776
(log/debug "OUT1:" text)
6877
(log/debug "OUT2:" message)
6978
(recur))
7079
(recur))
71-
"401" (if-let [[_ _size] (re-find response-pattern-401 breakpoint)]
72-
(let [message (read-response! server)]
73-
(log/error "Error in remote application:" message)
80+
"401" (if-let [[_ error-type size] (re-find response-pattern-401 breakpoint)]
81+
(let [message (read-response-with-length! server size)]
82+
(log/error "Error in remote application:" error-type message)
7483
nil)
7584
(recur))
7685
(do (log/error "Unknown Error:" breakpoint)
@@ -88,6 +97,42 @@
8897
(lua/extract-table stack-code)
8998
nil))
9099

100+
(defn- convert-to-safe-whitespace [s]
101+
(string/replace s #"\r?\n" "\012"))
102+
103+
(defn- send-eval-command! [server expression]
104+
(try
105+
(send-line!
106+
server
107+
(format
108+
(if (lua/expression? expression)
109+
"EXEC return %s"
110+
"EXEC %s")
111+
(convert-to-safe-whitespace expression)))
112+
(let [res (read-response! server)
113+
[_ status] (re-find #"^(\d+)" res)]
114+
(case status
115+
"200" (when-let [[_ len] (re-find response-pattern-200 res)]
116+
(let [res (read-response-with-length! server len)]
117+
(first (lua/extract-table res))))
118+
119+
"204" (when-let [[_ text len] (re-find response-pattern-204 res)]
120+
(let [size (parse-long len)
121+
message (if (pos? size) (read-response-with-length! server size) "")]
122+
(log/debug "OUT1:" text)
123+
(log/debug "OUT2:" message)
124+
nil))
125+
126+
"401" (when-let [[_ error-type len] (re-find response-pattern-401 res)]
127+
(let [res (read-response-with-length! server len)]
128+
(log/error (format "Eval Error in %s: %s" error-type res))
129+
res))
130+
131+
(do (log/error "Unknown Error:" res)
132+
nil)))
133+
(catch Throwable t
134+
(log/error "Eval: Something went wrong:" (pr-str (parse-exception t))))))
135+
91136
(defn- is-connected? [^Socket socket]
92137
(and (not (.isClosed socket))
93138
(.isConnected socket)
@@ -111,14 +156,14 @@
111156
:to-debug-server to-debug-server}}]
112157

113158
; send step command
114-
(send-command! server-handle "step")
159+
(send-blocking-command! server-handle "step")
115160
(>!! to-adapter {:cmd :setup-done})
116161

117162
(go-loop []
118163
(when-let [command (<!! to-debug-server)]
119164
(log/debug "Handler -> Debug Server:" command)
120165
(case (:cmd command)
121-
:run (go (send-command! server-handle "run"))
166+
:run (go (send-blocking-command! server-handle "run"))
122167

123168
:set-breakpoints (do
124169
; this command only gets called before executing a command so we
@@ -129,17 +174,20 @@
129174
{:keys [line]} breakpoints]
130175
(send-command-setb! server-handle filename line)))
131176

132-
:step-in (go (send-command! server-handle "step"))
177+
:step-in (go (send-blocking-command! server-handle "step"))
133178

134-
:step-out (go (send-command! server-handle "out"))
179+
:step-out (go (send-blocking-command! server-handle "out"))
135180

136-
:over (go (send-command! server-handle "over"))
181+
:over (go (send-blocking-command! server-handle "over"))
137182

138183
:stacktrace (let [stack (send-command-stack! server-handle)]
139184
(>!! to-adapter {:cmd :stacktrace :stack stack :seq (:seq command)}))
140185

186+
:eval (let [result (send-eval-command! server-handle (:expression command))]
187+
(>!! to-adapter {:cmd :eval :result result :seq (:seq command)}))
188+
141189
:exit (do
142-
(send-command! server-handle "exit")
190+
(send-blocking-command! server-handle "exit")
143191
(.close client)
144192
(System/exit 0))
145193

src/mobdap/handler.clj

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -294,8 +294,20 @@
294294
stack (transform-stack-trace handler stack)]
295295
(log/debug "Stacktrace:" stack)
296296
(reset! (:stackframes handler) stack)
297-
(adapter/send-message! (:adapter handler) (success seq "stackTrace" {:stackFrames (map #(dissoc % :extras) stack)
298-
:totalFrames (count stack)})))
297+
(adapter/send-message!
298+
(:adapter handler)
299+
(success seq "stackTrace" {:stackFrames (map #(dissoc % :extras) stack)
300+
:totalFrames (count stack)})))
301+
302+
:eval (let [res (:result command)
303+
seq (:seq command)]
304+
(log/debug "Eval Result:" res)
305+
(when res ; only send response when we actually got something to send
306+
(adapter/send-message!
307+
(:adapter handler)
308+
(success seq "evaluate" {:result res
309+
; TODO: check if this is a variablesReference
310+
:variablesReference 0}))))
299311

300312
(log/error "Unknown server command:" (:cmd command))))
301313

@@ -566,6 +578,12 @@
566578
(adapter/send-message! (:adapter handler) (success (:seq message) "next" nil))
567579
handler)
568580

581+
(defn handle-evaluate [handler message]
582+
(let [expression (get-in message [:arguments :expression])]
583+
(log/debug "Eval:" expression)
584+
(send-command-to-debug-server handler {:cmd :eval :expression expression :seq (:seq message)} false)
585+
handler))
586+
569587
(defn handle-terminate [handler message]
570588
(send-command-to-debug-server handler {:cmd :exit})
571589
(adapter/send-message! (:adapter handler) (success (:seq message) "terminate" nil))
@@ -589,6 +607,7 @@
589607
"stepIn" (handle-step-in handler message)
590608
"stepOut" (handle-step-out handler message)
591609
"next" (handle-next handler message)
610+
"evaluate" (handle-evaluate handler message)
592611
"disconnect" (handle-terminate handler message)
593612
"terminate" (handle-terminate handler message)
594613

src/mobdap/lua.clj

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,10 @@
5050
(log/error "Lua Bridge:" (pst-str (parse-exception t)))
5151
[])))
5252

53+
(defn expression? [^String lua-code]
54+
(let [^Globals globals (JsePlatform/standardGlobals)
55+
lua-code (format "return %s" lua-code)]
56+
(try
57+
(.load globals lua-code)
58+
true
59+
(catch Throwable _ false))))

0 commit comments

Comments
 (0)