From abc5c5293603229b447b8b5dfa7f3275571ad982 Mon Sep 17 00:00:00 2001 From: Eduardo Julian Date: Tue, 15 Dec 2020 22:05:05 -0400 Subject: Compiling "lux syntax char case!" with TABLESWITCH instead of LOOKUPSWITCH. --- .../src/lux/compiler/jvm/proc/common.clj | 35 +++++++++++++--------- 1 file changed, 21 insertions(+), 14 deletions(-) (limited to 'lux-bootstrapper') diff --git a/lux-bootstrapper/src/lux/compiler/jvm/proc/common.clj b/lux-bootstrapper/src/lux/compiler/jvm/proc/common.clj index 526e9d491..f16d89e2a 100644 --- a/lux-bootstrapper/src/lux/compiler/jvm/proc/common.clj +++ b/lux-bootstrapper/src/lux/compiler/jvm/proc/common.clj @@ -349,24 +349,31 @@ (|do [:let [(&/$Cons ?input (&/$Cons ?else ?matches)) ?values] ^MethodVisitor *writer* &/get-writer :let [pattern-labels (&/|map (fn [_] (new Label)) ?patterns) - matched-patterns (->> (&/zip2 ?patterns pattern-labels) - (&/flat-map (fn [?chars+?label] - (|let [[?chars ?label] ?chars+?label] - (&/|map (fn [?char] - (&/T [?char ?label])) - ?chars)))) - &/->seq - (sort-by &/|first <) - &/->list) + matched-patterns (&/fold (fn [matches chars+label] + (|let [[chars label] chars+label] + (&/fold (fn [matches char] + (assoc matches char label)) + matches + chars))) + {} + (&/zip2 ?patterns pattern-labels)) end-label (new Label) - else-label (new Label)] + else-label (new Label) + match-keys (keys matched-patterns) + min (apply min match-keys) + max (apply max match-keys) + capacity (inc (- max min)) + switch (map-indexed (fn [index label] + (get matched-patterns (+ min index) else-label)) + (repeat capacity else-label))] _ (compile ?input) :let [_ (doto *writer* &&/unwrap-long (.visitInsn Opcodes/L2I) - (.visitLookupSwitchInsn else-label - (int-array (&/->seq (&/|map &/|first matched-patterns))) - (into-array (&/->seq (&/|map &/|second matched-patterns)))))] + (.visitTableSwitchInsn (int min) + (int max) + else-label + (into-array switch)))] _ (&/map% (fn [?label+?match] (|let [[?label ?match] ?label+?match] (|do [:let [_ (doto *writer* @@ -389,7 +396,7 @@ (case proc "is" (compile-lux-is compile ?values special-args) "try" (compile-lux-try compile ?values special-args) - ;; Special extensions for performance reasons + ;; TODO: Special extensions for performance reasons ;; Will be replaced by custom extensions in the future. "syntax char case!" (compile-syntax-char-case! compile ?values special-args)) -- cgit v1.2.3