Skip to content

Commit a0dd7fa

Browse files
authored
Move callstack to exception rather than tracking in ctx (#621)
1 parent d2d2e78 commit a0dd7fa

File tree

2 files changed

+21
-74
lines changed

2 files changed

+21
-74
lines changed

src/sci/impl/interpreter.cljc

Lines changed: 10 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -24,41 +24,6 @@
2424
(prn (zipmap (keys @stats)
2525
(map #(/ (double %) 1000000.0) (vals @stats)))))
2626

27-
#_(defn eval-form-stats [ctx form]
28-
(if (seq? form)
29-
(if (= 'do (first form))
30-
(loop [exprs (rest form)
31-
ret nil]
32-
(if (seq exprs)
33-
(recur
34-
(rest exprs)
35-
(eval-form-stats ctx (first exprs)))
36-
ret))
37-
(when (or (not (:uberscript ctx))
38-
(= 'ns (first form))
39-
(= 'require (first form)))
40-
(let [#?@(:clj [a0 (System/nanoTime)])
41-
analyzed (ana/analyze ctx form true)
42-
#?@(:clj [a1 (System/nanoTime)
43-
_ (update-stats ctx :analysis (- a1 a0))])
44-
ret (if (instance? sci.impl.types.EvalForm analyzed)
45-
(eval-form-stats ctx (t/getVal analyzed))
46-
(let [#?@(:clj [e0 (System/nanoTime)])
47-
ret (eval/eval ctx analyzed)
48-
#?@(:clj [e1 (System/nanoTime)
49-
_ (update-stats ctx :eval (- e1 e0))])]
50-
ret))]
51-
ret)))
52-
(let [#?@(:clj [t0 (System/nanoTime)])
53-
analyzed (ana/analyze ctx form)
54-
#?@(:clj [t1 (System/nanoTime)
55-
_ (update-stats ctx :analysis (- t1 t0))])
56-
#?@(:clj [t0 (System/nanoTime)])
57-
ret (eval/eval ctx analyzed)
58-
#?@(:clj [t1 (System/nanoTime)
59-
_ (update-stats ctx :eval (- t1 t0))])]
60-
ret)))
61-
6227
(defn eval-form [ctx form]
6328
(if (seq? form)
6429
(if (= 'do (first form))
@@ -74,7 +39,8 @@
7439
(= 'require (first form)))
7540
(let [analyzed (ana/analyze ctx form true)
7641
bindings (:bindings ctx)
77-
ret (if (instance? sci.impl.types.EvalForm analyzed)
42+
ret (if (instance? #?(:clj sci.impl.types.EvalForm
43+
:cljs sci.impl.types/EvalForm) analyzed)
7844
(eval-form ctx (t/getVal analyzed))
7945
(eval/eval ctx bindings analyzed))]
8046
ret)))
@@ -83,43 +49,17 @@
8349
ret (eval/eval ctx bindings analyzed)]
8450
ret)))
8551

86-
;; #?(:clj
87-
;; (when (System/getenv "SCI_STATS")
88-
;; (alter-var-root #'eval-form (constantly eval-form-stats))))
89-
9052
(vreset! utils/eval-form-state eval-form)
9153

92-
;; with stats
93-
(defn eval-string-stats [ctx s]
94-
(let [ctx (assoc ctx :id (or (:id ctx) (gensym)))]
95-
(vars/with-bindings {vars/current-ns @vars/current-ns}
96-
(let [reader (r/indexing-push-back-reader (r/string-push-back-reader s))]
97-
(loop [ret nil]
98-
(let [#?@(:clj [t0 (System/nanoTime)])
99-
expr (p/parse-next ctx reader)
100-
#?@(:clj [t1 (System/nanoTime)
101-
_ (update-stats ctx :parse (- t1 t0))])]
102-
(if (utils/kw-identical? p/eof expr)
103-
(do
104-
(print-stats)
105-
ret)
106-
(let [ret (eval-form ctx expr)]
107-
(recur ret)))))))))
108-
10954
(defn eval-string* [ctx s]
110-
(let [ctx (assoc ctx :id (or (:id ctx) (gensym)))]
111-
(vars/with-bindings {vars/current-ns @vars/current-ns}
112-
(let [reader (r/indexing-push-back-reader (r/string-push-back-reader s))]
113-
(loop [ret nil]
114-
(let [expr (p/parse-next ctx reader)]
115-
(if (utils/kw-identical? p/eof expr)
116-
ret
117-
(let [ret (eval-form ctx expr)]
118-
(recur ret)))))))))
119-
120-
#?(:clj
121-
(when (System/getenv "SCI_STATS")
122-
(alter-var-root #'eval-string* (constantly eval-string-stats))))
55+
(vars/with-bindings {vars/current-ns @vars/current-ns}
56+
(let [reader (r/indexing-push-back-reader (r/string-push-back-reader s))]
57+
(loop [ret nil]
58+
(let [expr (p/parse-next ctx reader)]
59+
(if (utils/kw-identical? p/eof expr)
60+
ret
61+
(let [ret (eval-form ctx expr)]
62+
(recur ret))))))))
12363

12464
(vreset! utils/eval-string* eval-string*)
12565

src/sci/impl/utils.cljc

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,16 +48,22 @@
4848
fm (or (:sci.impl/f-meta stack)
4949
(some-> f meta))
5050
env (:env ctx)
51-
id (:id ctx)]
51+
id (:id ctx)
52+
d (ex-data e)
53+
st (or (when-let [st (:sci.impl/callstack d)]
54+
st)
55+
(volatile! '()))]
5256
(when stack
5357
(when-not (:special stack)
54-
(swap! env update-in [:sci.impl/callstack id]
58+
#_(swap! env update-in [:sci.impl/callstack id]
5559
(fn [vt]
5660
(if vt
5761
(do (vswap! vt conj stack)
5862
vt)
59-
(volatile! (list stack)))))))
63+
(volatile! (list stack)))))
64+
(vswap! st conj stack)))
6065
(let [d (ex-data e)
66+
;; st (:sci.impl/callstack d)
6167
wrapping-sci-error? (isa? (:type d) :sci/error)]
6268
(if wrapping-sci-error?
6369
(throw e)
@@ -80,7 +86,8 @@
8086
:column column
8187
:message ex-msg
8288
:sci.impl/callstack
83-
(delay (when-let
89+
st
90+
#_(delay (when-let
8491
[v (get-in @(:env ctx) [:sci.impl/callstack (:id ctx)])]
8592
@v))
8693
:file file

0 commit comments

Comments
 (0)