Skip to content

Commit 2b51200

Browse files
committed
Socket: replaced nested :eval :forms with top-level :code and :idx
1 parent 2e7438b commit 2b51200

File tree

6 files changed

+105
-98
lines changed

6 files changed

+105
-98
lines changed

cs_common.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
package = None
88

99
class Form:
10-
def __init__(self, id, code, ns = 'user', line = None, column = None, file = None):
10+
def __init__(self, id = None, code = None, ns = 'user', line = None, column = None, file = None):
1111
self.id = id
1212
self.code = code
1313
self.ns = ns

cs_conn_nrepl_raw.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ def handle_exception(self, msg):
106106
if (id := msg.get('id')):
107107
error = msg.get('root-ex') or msg.get('ex')
108108
if error:
109-
self.eval_impl(cs_common.Form(f'{id}.e', '*e'))
109+
self.eval_impl(cs_common.Form(id = f'{id}.e', code = '*e'))
110110
if not error:
111111
if 'namespace-not-found' in msg.get('status', []):
112112
error = 'Namespace not found: ' + msg.get('ns', '')

cs_conn_socket_repl.py

Lines changed: 49 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -64,44 +64,40 @@ def send(self, msg):
6464
self.socket.sendall(msg.encode())
6565

6666
def eval(self, view, sel):
67-
regions = []
6867
for region in sel:
68+
# find regions to eval
6969
if region.empty():
7070
region = cs_parser.topmost_form(view, region.begin())
71-
regions.append(region)
72-
else:
73-
start = region.begin()
74-
parsed = cs_parser.parse(view.substr(region))
75-
regions += [sublime.Region(start + child.start, start + child.end) for child in parsed.children]
76-
77-
forms = []
78-
batch_id = cs_eval.Eval.next_id()
79-
for region in regions:
80-
eval = cs_eval.Eval(view, region, batch_id = batch_id)
71+
72+
start = region.begin()
73+
parsed = cs_parser.parse(view.substr(region))
74+
forms = [ \
75+
sublime.Region(start + child.start, start + child.end) \
76+
for child in parsed.children \
77+
if child.name not in {'comment', 'discard'} \
78+
]
79+
80+
# create evals
81+
batch_id = cs_eval.Eval.next_id()
82+
for idx, form in enumerate(forms):
83+
eval = cs_eval.Eval(view, form, id = f'{batch_id}.{idx}', batch_id = batch_id)
84+
85+
# send msg
8186
(line, column) = view.rowcol_utf16(region.begin())
8287
line = line + 1
83-
form = cs_common.Form(
84-
id = eval.id,
85-
code = view.substr(region),
86-
ns = cs_parser.namespace(view, region.begin()) or 'user',
87-
line = line,
88-
column = column,
89-
file = view.file_name())
90-
forms.append(form)
91-
92-
msg = f'{{:id {batch_id}, :op :eval, :forms ['
93-
for form in forms:
94-
code = form.code.replace('\\', '\\\\').replace('"', '\\"')
95-
msg += f'{{:id {form.id}, :code "{code}", :ns {form.ns}'
96-
if (line := form.line) is not None:
97-
msg += f', :line {line}'
98-
if (column := form.column) is not None:
99-
msg += f', :column {column}'
100-
if (file := form.file) is not None:
101-
msg += f', :file "{file}"'
102-
msg += f'}}, '
103-
msg += f"]}}"
104-
self.send(msg)
88+
code = view.substr(region).replace('\\', '\\\\').replace('"', '\\"')
89+
ns = cs_parser.namespace(view, region.begin()) or 'user'
90+
file = view.file_name()
91+
msg = ('{' +
92+
f':id {batch_id}, ' +
93+
f':op :eval, ' +
94+
f':code "{code}", ' +
95+
f':ns "{ns}", ' +
96+
f':file "{file}", ' +
97+
f':line {line}, ' +
98+
f':column {column}' +
99+
'}')
100+
self.send(msg)
105101

106102
def load_file(self, view):
107103
self.eval(view, [sublime.Region(0, view.size())])
@@ -115,27 +111,40 @@ def interrupt_impl(self, batch_id, id):
115111
self.send(msg)
116112

117113
def handle_value(self, msg):
118-
if ':ret' == msg[':tag'] and (id := msg.get(':id')):
119-
cs_eval.on_success(id, msg.get(':val'), time = msg.get(':time'))
114+
if ':ret' == msg[':tag']:
115+
id = msg.get(':id')
116+
idx = msg.get(':idx')
117+
val = msg.get(':val')
118+
time = msg.get('time')
119+
cs_eval.on_success(f'{id}.{idx}', val, time = time)
120120
return True
121121

122122
def handle_exception(self, msg):
123-
if ':ex' == msg[':tag'] and (id := msg.get(':id')):
124-
cs_eval.on_exception(id, msg.get(':val'), line = msg.get(':line'), column = msg.get(':column'), trace = msg.get(':trace'))
123+
if ':ex' == msg[':tag']:
124+
id = msg.get(':id')
125+
idx = msg.get(':idx')
126+
val = msg.get(':val')
127+
line = msg.get(':line')
128+
column = msg.get(':column')
129+
trace = msg.get(':trace')
130+
cs_eval.on_exception(f'{id}.{idx}', val, line = line, column = column, trace = trace)
125131
return True
126132

127133
def handle_done(self, msg):
128-
if ':done' == msg[':tag'] and (batch_id := msg.get(':id')):
134+
if ':done' == msg[':tag']:
135+
batch_id = msg.get(':id')
129136
cs_eval.on_done(batch_id)
137+
return True
130138

131139
def handle_lookup(self, msg):
132-
if ':lookup' == msg[':tag'] and (id := msg.get(':id')):
140+
if ':lookup' == msg[':tag']:
141+
id = msg.get(':id')
133142
val = cs_parser.parse_as_dict(msg[':val'])
134143
cs_eval.on_lookup(id, val)
135144
return True
136145

137146
def handle_msg(self, msg):
138-
cs_common.debug('MSG {}', msg)
147+
# cs_common.debug('MSG {}', msg)
139148
self.handle_value(msg) \
140149
or self.handle_exception(msg) \
141150
or self.handle_done(msg) \

cs_eval.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,11 @@ def next_id():
2828
Eval.last_id += 1
2929
return Eval.last_id
3030

31-
def __init__(self, view, region, batch_id = None):
31+
def __init__(self, view, region, id = None, batch_id = None):
3232
extended_region = view.line(region)
3333
erase_evals(lambda eval: eval.region() and eval.region().intersects(extended_region), view)
3434

35-
id = Eval.next_id()
35+
id = id or Eval.next_id()
3636
self.id = id
3737
self.batch_id = batch_id or id
3838
self.view = view

src_clojure/clojure_sublimed/socket_repl.clj

Lines changed: 47 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,12 @@
4343
(str " " (core/bounded-pr-str data)))
4444
trace (core/trace-str root {:location? false})]
4545
(*out-fn*
46-
(merge
47-
{:tag :ex
48-
:val val
49-
:trace trace
50-
:source source
51-
:line line
52-
:column column}
53-
@*context*))))
46+
{:tag :ex
47+
:val val
48+
:trace trace
49+
:source source
50+
:line line
51+
:column column})))
5452

5553
(defn reader ^LineNumberingPushbackReader [code line column]
5654
(let [reader (LineNumberingPushbackReader. (StringReader. code))]
@@ -71,10 +69,9 @@
7169
(.unread reader ch)))))
7270

7371
(defn eval-code [form]
74-
(let [{:keys [id code ns line column file]} form
75-
start (System/nanoTime)
72+
(let [{:keys [code ns line column file]} form
7673
name (or (some-> file (str/split #"[/\\]") last) "NO_SOURCE_FILE")
77-
ns (or ns 'user)
74+
ns (symbol (or ns "user"))
7875
ns-obj (or
7976
(find-ns ns)
8077
(do
@@ -102,18 +99,28 @@
10299
Compiler/LINE_AFTER (.getLineNumber reader)
103100
Compiler/COLUMN_AFTER (.getColumnNumber reader)})
104101
ret (try
105-
(loop [ret nil]
106-
(let [obj (read opts reader)]
107-
(if (identical? obj eof)
108-
ret
109-
(do
102+
(loop [idx 0]
103+
(vswap! *context* assoc :idx idx)
104+
(let [[obj obj-str] (read+string opts reader)]
105+
(when-not (identical? obj eof)
106+
(.set Compiler/LINE_AFTER (.getLineNumber reader))
107+
(.set Compiler/COLUMN_AFTER (.getColumnNumber reader))
108+
(vswap! *context* assoc
109+
:from_line (.get Compiler/LINE_BEFORE)
110+
:from_column (.get Compiler/COLUMN_BEFORE)
111+
:to_line (.get Compiler/LINE_AFTER)
112+
:to_column (.get Compiler/COLUMN_AFTER)
113+
:form obj-str)
114+
(let [start (System/nanoTime)
115+
ret (Compiler/eval obj false)]
116+
(*out-fn*
117+
{:tag :ret
118+
:val (core/bounded-pr-str ret)
119+
:time (-> (System/nanoTime) (- start) (quot 1000000))})
110120
(consume-ws reader)
111-
(.set Compiler/LINE_AFTER (.getLineNumber reader))
112-
(.set Compiler/COLUMN_AFTER (.getColumnNumber reader))
113-
(let [ret (Compiler/eval obj false)]
114-
(.set Compiler/LINE_BEFORE (.getLineNumber reader))
115-
(.set Compiler/COLUMN_BEFORE (.getColumnNumber reader))
116-
(recur ret))))))
121+
(.set Compiler/LINE_BEFORE (.getLineNumber reader))
122+
(.set Compiler/COLUMN_BEFORE (.getColumnNumber reader))
123+
(recur (inc idx))))))
117124
(catch LispReader$ReaderException e
118125
(throw (Compiler$CompilerException.
119126
file
@@ -133,33 +140,24 @@
133140
Compiler$CompilerException/PHASE_EXECUTION
134141
e))))
135142
(finally
136-
(pop-thread-bindings)))
137-
time (-> (System/nanoTime)
138-
(- start)
139-
(quot 1000000))]
140-
(*out-fn*
141-
{:tag :ret
142-
:id id
143-
:val (core/bounded-pr-str ret)
144-
:time time})))
143+
(pop-thread-bindings)))]))
145144

146-
(defn fork-eval [{:keys [id forms]}]
147-
(let [f (future
148-
(try
149-
(core/track-vars
150-
(doseq [form forms]
151-
(vswap! *context* assoc :id (:id form))
152-
(eval-code form)))
153-
(catch Throwable t
154-
(try
155-
(report-throwable t)
156-
(catch Throwable t
157-
:ignore))))
158-
(swap! *evals dissoc id)
159-
(vswap! *context* assoc :id id)
160-
(*out-fn*
161-
(merge @*context* {:tag :done})))]
162-
(swap! *evals assoc id f)))
145+
(defn fork-eval [{:keys [id] :as form}]
146+
(swap! *evals assoc id
147+
(future
148+
(try
149+
(core/track-vars
150+
(eval-code form))
151+
(catch Throwable t
152+
(try
153+
(report-throwable t)
154+
(catch Throwable t
155+
:ignore)))
156+
(finally
157+
(swap! *evals dissoc id)
158+
(vswap! *context* dissoc :idx :from_line :from_column :to_line :to_column :form)
159+
(*out-fn*
160+
{:tag :done}))))))
163161

164162
(defn interrupt [{:keys [id]}]
165163
(when-some [f (@*evals id)]
@@ -188,17 +186,15 @@
188186
nil
189187
meta)]
190188
{:tag :lookup
191-
:id id
192189
:val meta'})
193190
{:tag :ex
194-
:id id
195191
:val (str "Symbol '" symbol " not found in ns '" ns)}))))
196192

197193
(defn out-fn [out]
198194
(let [lock (Object.)]
199195
#(locking lock
200196
(binding [*out* out]
201-
(prn %)))))
197+
(prn (merge (some-> *context* deref) %))))))
202198

203199
(defn repl []
204200
(binding [*out-fn* (out-fn *out*)

test_repl/forms.clj

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1+
; skips
12

2-
(/ 1 0)
3-
3+
; (/ 1 0)
4+
#_(/ 2 0)
5+
#_#_(/ 3 0) (/ 4 0)
46

57
; simple expr
68
(+ 1 2)
7-
(+ 1 2)
9+
(+ 3 4)
810

911
*warn-on-reflection*
1012

0 commit comments

Comments
 (0)