From ada949790de368baa4c9ba69901aad329fb6a109 Mon Sep 17 00:00:00 2001 From: Nikita Prokopov Date: Mon, 10 Apr 2017 00:23:42 +0700 Subject: [PATCH] Optimize generated JS code by declaring fn arities (closes #197) --- CHANGELOG.md | 1 + src/datascript/btset.cljc | 23 +++++++++++++++++------ src/datascript/db.cljc | 27 +++++++++++++++++++++++---- src/datascript/impl/entity.cljc | 7 ++++++- src/datascript/js.cljs | 2 +- src/datascript/lru.cljc | 4 +++- src/datascript/parser.cljc | 9 +++++---- src/datascript/pull_parser.cljc | 3 ++- src/datascript/query.cljc | 8 ++++---- src/datascript/query_v3.cljc | 8 +++++++- 10 files changed, 69 insertions(+), 23 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index eebe784b..fbd9c25a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ - Fixed handling of false values in entity cache (PR #198, thx [Brandon Bloom](https://github.com/brandonbloom)) - Fixed issue when string values were interpreted as lookup refs (#214) - Speed up rschema calculation (#192, thx [Andre R.](https://github.com/rauhs)) +- Optimize generated JS code by declaring fn arities (#197) # 0.15.5 diff --git a/src/datascript/btset.cljc b/src/datascript/btset.cljc index cbd7331d..81cd8507 100644 --- a/src/datascript/btset.cljc +++ b/src/datascript/btset.cljc @@ -413,7 +413,11 @@ ;; BTSet -(declare btset-conj btset-disj btset-iter) +;; using defn instead of declare because of http://dev.clojure.org/jira/browse/CLJS-1871 +(defn ^:declared btset-conj [set key cmp]) +(defn ^:declared btset-disj [set key cmp]) +(defn ^:declared btset-iter [set]) + (def ^:const uninitialized-hash #?(:cljs nil :clj -1)) (deftype BTSet [root shift cnt comparator meta #?(:cljs ^:mutable __hash @@ -687,9 +691,18 @@ ^long [^BTSet set ^long path] (-prev-path (.-root set) path (.-shift set))) - - -(declare iter riter iter-first iter-next iter-chunk iter-chunked-next iter-rseq iter-reduce) +;; using defn instead of declare because of http://dev.clojure.org/jira/browse/CLJS-1871 +(defn ^:declared iter [set left right]) +(defn ^:declared iter-first [iter]) +(defn ^:declared iter-next [iter]) +(defn ^:declared iter-chunk [iter]) +(defn ^:declared iter-chunked-next [iter]) +(defn ^:declared iter-rseq [iter]) +(defn ^:declared iter-reduce ([iter f]) ([iter f start])) +(defn ^:declared riter [set left right]) +(defn ^:declared riter-first [riter]) +(defn ^:declared riter-next [ri]) +(defn ^:declared riter-rseq [riter]) (defn btset-iter "Iterator that represents whole set" @@ -837,8 +850,6 @@ ;; reverse iteration -(declare riter-first riter-next riter-rseq) - (deftype ReverseIter [set ^long left ^long right keys ^long idx] #?@(:cljs [ ISeqable diff --git a/src/datascript/db.cljc b/src/datascript/db.cljc index aa849c52..e7da095a 100644 --- a/src/datascript/db.cljc +++ b/src/datascript/db.cljc @@ -115,7 +115,13 @@ ;; ---------------------------------------------------------------------------- -(declare hash-datom equiv-datom seq-datom val-at-datom nth-datom assoc-datom) +;; using defn instead of declare because of http://dev.clojure.org/jira/browse/CLJS-1871 +(defn- ^:declared hash-datom [d]) +(defn- ^:declared equiv-datom [a b]) +(defn- ^:declared seq-datom [d]) +(defn- ^:declared nth-datom ([d i]) ([d i nf])) +(defn- ^:declared assoc-datom [d k v]) +(defn- ^:declared val-at-datom [d k nf]) (deftype Datom [e a v tx added] #?@(:cljs @@ -368,7 +374,16 @@ ;; ---------------------------------------------------------------------------- -(declare hash-db hash-fdb equiv-db empty-db pr-db resolve-datom validate-attr components->pattern indexing?) +;; using defn instead of declare because of http://dev.clojure.org/jira/browse/CLJS-1871 +(defn- ^:declared hash-db [db]) +(defn- ^:declared hash-fdb [db]) +(defn- ^:declared equiv-db [a b]) +(defn- ^:declared empty-db [db]) +#?(:cljs (defn ^:declared pr-db [db w opts])) +(defn- ^:declared resolve-datom [db e a v t]) +(defn- ^:declared validate-attr [attr at]) +(defn- ^:declared components->pattern [db index cs]) +(defn ^:declared indexing? [db attr]) (defrecord-updatable DB [schema eavt aevt avet max-eid max-tx rschema hash] #?@(:cljs @@ -681,7 +696,10 @@ ;; ---------------------------------------------------------------------------- -(declare entid-strict entid-some ref?) +;; using defn instead of declare because of http://dev.clojure.org/jira/browse/CLJS-1871 +(defn ^:declared entid-strict [db eid]) +(defn ^:declared entid-some [db eid]) +(defn ^:declared ref? [db attr]) (defn- resolve-datom [db e a v t] (when a (validate-attr a (list 'resolve-datom 'db e a v t))) @@ -985,7 +1003,8 @@ ~expr (cond-let ~@rest))))) -(declare transact-tx-data) +;; using defn instead of declare because of http://dev.clojure.org/jira/browse/CLJS-1871 +(defn ^:declared transact-tx-data [report es]) (defn retry-with-tempid [report es tempid upserted-eid] (if (contains? (:tempids report) tempid) diff --git a/src/datascript/impl/entity.cljc b/src/datascript/impl/entity.cljc index 7de87e5b..1c1ca33f 100644 --- a/src/datascript/impl/entity.cljc +++ b/src/datascript/impl/entity.cljc @@ -3,7 +3,12 @@ (:require [#?(:cljs cljs.core :clj clojure.core) :as c] [datascript.db :as db])) -(declare entity ->Entity equiv-entity lookup-entity touch) +;; using defn instead of declare because of http://dev.clojure.org/jira/browse/CLJS-1871 +(defn ^:declared entity [db eid]) +(defn ^:declared ->Entity [db eid touched cache]) +(defn- ^:declared equiv-entity [this that]) +(defn- ^:declared lookup-entity ([this attr]) ([this attr not-found])) +(defn ^:declared touch [e]) (defn- entid [db eid] (when (or (number? eid) diff --git a/src/datascript/js.cljs b/src/datascript/js.cljs index 9e8fa4c5..184ce413 100644 --- a/src/datascript/js.cljs +++ b/src/datascript/js.cljs @@ -17,7 +17,7 @@ (reduce-kv (fn [m k v] (assoc m k (walk/postwalk keywordize v))) {}))) -(declare entities->clj) +(defn- ^:declared entities->clj [entities]) (defn- entity->clj [e] (cond (map? e) diff --git a/src/datascript/lru.cljc b/src/datascript/lru.cljc index a290268b..ef670adb 100644 --- a/src/datascript/lru.cljc +++ b/src/datascript/lru.cljc @@ -1,6 +1,8 @@ (ns datascript.lru) -(declare assoc-lru cleanup-lru) +;; using defn instead of declare because of http://dev.clojure.org/jira/browse/CLJS-1871 +(defn ^:declared assoc-lru [lru k v]) +(defn ^:declared cleanup-lru [lru]) #?(:cljs (deftype LRU [key-value gen-key key-gen gen limit] diff --git a/src/datascript/parser.cljc b/src/datascript/parser.cljc index c0716041..ec99130b 100644 --- a/src/datascript/parser.cljc +++ b/src/datascript/parser.cljc @@ -7,7 +7,11 @@ ;; utils -(declare collect-vars-acc) +;; using defn instead of declare because of http://dev.clojure.org/jira/browse/CLJS-1871 +(defn- ^:declared collect-vars-acc [acc form]) +(defn ^:declared parse-clause [form]) +(defn ^:declared parse-clauses [clauses]) +(defn ^:declared parse-binding [form]) (defprotocol ITraversable (-collect [_ pred acc]) @@ -178,8 +182,6 @@ (deftrecord BindTuple [bindings]) (deftrecord BindColl [binding]) -(declare parse-binding) - (defn parse-bind-ignore [form] (when (= '_ form) (with-source (BindIgnore.) form))) @@ -406,7 +408,6 @@ (deftrecord Or [source rule-vars clauses]) (deftrecord And [clauses]) -(declare parse-clause parse-clauses) (defn parse-pattern-el [form] (or (parse-placeholder form) diff --git a/src/datascript/pull_parser.cljc b/src/datascript/pull_parser.cljc index 1cd6a373..295eaf74 100644 --- a/src/datascript/pull_parser.cljc +++ b/src/datascript/pull_parser.cljc @@ -55,7 +55,8 @@ spec (reduce aggregate-specs init specs)] [:subpattern (update spec :attrs persistent!)]))) -(declare parse-pattern) +;; using defn instead of declare because of http://dev.clojure.org/jira/browse/CLJS-1871 +(defn ^:declared parse-pattern [pattern]) (def ^:private wildcard? #{'* :* "*"}) diff --git a/src/datascript/query.cljc b/src/datascript/query.cljc index 74d7ffe8..39b3f3f5 100644 --- a/src/datascript/query.cljc +++ b/src/datascript/query.cljc @@ -19,7 +19,10 @@ ;; ---------------------------------------------------------------------------- (def ^:const lru-cache-size 100) -(declare built-ins) + +;; using defn instead of declare because of http://dev.clojure.org/jira/browse/CLJS-1871 +(defn ^:declared -collect ([context symbols]) ([acc rels symbols])) +(defn ^:declared -resolve-clause [context clause]) ;; Records @@ -494,9 +497,6 @@ (second clause) (first clause))))) -(declare -collect) -(declare -resolve-clause) - (def rule-seqid (atom 0)) (defn expand-rule [clause context used-args] diff --git a/src/datascript/query_v3.cljc b/src/datascript/query_v3.cljc index 88f7159c..468ea40d 100644 --- a/src/datascript/query_v3.cljc +++ b/src/datascript/query_v3.cljc @@ -21,7 +21,13 @@ [datascript.db Datom] [datascript.btset Iter]))) -(declare resolve-clauses collect-rel-xf collect-to) +;; using defn instead of declare because of http://dev.clojure.org/jira/browse/CLJS-1871 +(defn ^:declared resolve-clauses [context clauses]) +(defn ^:declared collect-rel-xf [syms-indexed rel]) +(defn ^:declared collect-to + ([context syms acc]) + ([context syms acc xfs]) + ([context syms acc xfs specimen])) (def ^:const lru-cache-size 100)