diff --git a/src/cljbin/eval.clj b/src/cljbin/eval.clj index 6ac6b18..3492b7f 100644 --- a/src/cljbin/eval.clj +++ b/src/cljbin/eval.clj @@ -1,16 +1,11 @@ (ns cljbin.eval (:use [clojail.testers :only [secure-tester-without-def]] [clojail.core :only [sandbox]] - [clojure.repl :only [doc] :rename {doc repl-doc}] [clojure.stacktrace :only [root-cause]]) (:require [clojure.string :as string :only [replace trim]]) (:import java.io.StringWriter java.util.concurrent.TimeoutException)) -(defn- safe-read [s] - (binding [*read-eval* false] - (read-string s))) - ; A gracious thank you to amalloy in #clojure for the following fn (defn- read-string-safely [s] (binding [*read-eval* false] @@ -26,16 +21,19 @@ (use 'clojure.repl 'clojure.set 'clojure.test) (require '[clojure.string :as string])))) -(defn run [code-string] +(defn- execute [sb writer expr] (try - (let [sb (make-sandbox)] - (for [expr (read-string-safely code-string) - :let [writer (StringWriter.) - res (sb expr {#'*out* writer}) - output (str writer)]] - (do - (.close writer) - (string/trim (str output res))))) + (sb expr {#'*out* writer}) (catch TimeoutException _ "Execution timed out!") (catch Exception e (-> e root-cause str)))) +(defn run [code-string] + (let [sb (make-sandbox)] + (for [expr (read-string-safely code-string) + :let [writer (StringWriter.) + res (execute sb writer expr) + output (str writer)]] + (do + (.close writer) + (string/trim (str output res)))))) +