From 64b3a4ae6a07c74299eca0c45474698fa33a019e Mon Sep 17 00:00:00 2001 From: dzaima Date: Thu, 22 Jul 2021 19:46:50 +0300 Subject: [PATCH] clean up cc.bqn, specialize small arrays --- cc.bqn | 33 ++++++++++++++++++++------------- src/load.c | 12 ++++++++++++ 2 files changed, 32 insertions(+), 13 deletions(-) diff --git a/cc.bqn b/cc.bqn index f80b80dc..d72d68ce 100755 --- a/cc.bqn +++ b/cc.bqn @@ -7,9 +7,12 @@ return ← 1≡⊑args args↓˜↩ return path←(⊑args)∾"/src/" args↓˜↩1 -L0 ← (0<≠)◶⟨"",1↓·∾","⊸∾¨⟩ -L ← {"m_caB(" ∾(•Repr≠𝕩)∾",(B[]){" ∾(L0𝕩)∾"})"} -LI ← {"m_cai32("∾(•Repr≠𝕩)∾",(i32[]){"∾(L0𝕩)∾"})"} +Import ← {𝕨•Import path∾𝕩} +FChars ← {𝕨•FChars path∾𝕩} +FLines ← {𝕨•FLines path∾𝕩} + + +F ← •Repr # Format number # Escape the special characters that appear in BQN sources. Esc←{ in ← (@+0‿9‿10‿13)∾"'""" # Null, Tab, LF, CR, and quotes @@ -18,23 +21,27 @@ Esc←{ 𝕩 ↩ i ⊏⟜out⌾((i<≠out)⊸/) 𝕩 # Replace ∾(i<≠in) /⟜"\"⊸∾¨ 𝕩 # Insert \ } -Str ← "m_str32(U"""∾Esc∾""")"˙ # A BQN string -Char ← {"m_c32(U'"∾(Esc⥊𝕩)∾"')"} # A BQN character -Num ← {s←"-"/˜𝕩<0 ⋄ ∞⊸=∘|◶⟨"m_f64("∾")"∾˜s∾•Repr∘| ⋄ "m_f64("∾s∾"1.0/0.0)"⟩𝕩} # Format number -F ← •Repr # Format number +OStr ← "m_str32(U"""∾Esc∾""")"˙ # A BQN string +OChr ← {"m_c32(U'"∾(Esc⥊𝕩)∾"')"} # A BQN character +ONum ← {s←"-"/˜𝕩<0 ⋄ ∞⊸=∘|◶⟨"m_f64("∾")"∾˜s∾F∘| ⋄ "m_f64("∾s∾"1.0/0.0)"⟩𝕩} # Format number +OAny ← ≡◶⟨@⊸≤◶ONum‿OChr, OStr, ⊑⟩ + +List ← (0<≠)◶⟨"",1↓·∾","⊸∾¨⟩ +ShortList ← {"m_lv"∾𝕨∾"_"∾(F≠𝕩)∾"("∾(List𝕩)∾")"} +LongList ← {"m_ca"∾𝕨∾"("∾(F≠𝕩)∾",("∾𝕨∾"[]){"∾(List𝕩)∾"})"} +MakeList ← (≠∘⊢>4˙)◶ShortList‿LongList +Li ← {"i32" MakeList F¨𝕩} +_Lo ← {"B" MakeList 𝔽¨𝕩} -Import ← {𝕨•Import path∾𝕩} -FChars ← {𝕨•FChars path∾𝕩} -FLines ← {𝕨•FLines path∾𝕩} glyphs ← Import "glyphs.bqn" _getComp ← { (4+2×useInd)↑ <∘⊢∾˜ 5↑ (𝕗 Import "c.bqn"){𝔽} } useInd ← "-i"≡⊑args ⋄ args↓˜↩useInd -Comp ← ((<"inc(runtime["∾•Repr∾"])"˙)¨↕62) glyphs _getComp ⊢ +Comp ← ((<"inc(runtime["∾F∾"])"˙)¨↕62) glyphs _getComp ⊢ J ← ∾∾⟜(@+10)¨ -Fconst ← ≡◶⟨@⊸≤◶Num‿Char, Str, ⊑⟩ -Fout ← {((≠𝕩)↑⟨LI F¨ ⋄ L Fconst¨ ⋄ L (L =◶⟨Num,L(LI F¨)¨⟩¨)¨ ⋄ L (LI ·F¨ 2⊸↑)¨ ⋄ L (LI F¨)¨ ⋄ Str⟩) {𝕎𝕩}¨ 𝕩} + +Fout ← {((≠𝕩)↑⟨Li ⋄ OAny _Lo ⋄ =◶⟨ONum,Li _Lo⟩ _Lo _Lo ⋄ (Li 2⊸↑) _Lo ⋄ Li _Lo ⋄ OStr⟩) {𝕎𝕩}¨ 𝕩} Frun ← 1⊸Fout Long ← {¯2↓∾𝕩∾¨<","∾@+10} LFC ← Long∘Fout∘Comp diff --git a/src/load.c b/src/load.c index b9303e1f..d3d2b850 100644 --- a/src/load.c +++ b/src/load.c @@ -186,6 +186,18 @@ void bqn_setComp(B comp) { // consumes; doesn't unload old comp, but whatever gc_add(load_comp); } + +static NOINLINE B m_lvB_0( ) { return emptyHVec(); } +static NOINLINE B m_lvB_1(B a ) { return m_v1(a); } +static NOINLINE B m_lvB_2(B a, B b ) { return m_v2(a,b); } +static NOINLINE B m_lvB_3(B a, B b, B c ) { return m_v3(a,b,c); } +static NOINLINE B m_lvB_4(B a, B b, B c, B d) { return m_v4(a,b,c,d); } +static NOINLINE B m_lvi32_0( ) { return emptyIVec(); } +static NOINLINE B m_lvi32_1(i32 a ) { i32* rp; B r = m_i32arrv(&rp,1); rp[0]=a; return r; } +static NOINLINE B m_lvi32_2(i32 a, i32 b ) { i32* rp; B r = m_i32arrv(&rp,2); rp[0]=a; rp[1]=b; return r; } +static NOINLINE B m_lvi32_3(i32 a, i32 b, i32 c ) { i32* rp; B r = m_i32arrv(&rp,3); rp[0]=a; rp[1]=b; rp[2]=c; return r; } +static NOINLINE B m_lvi32_4(i32 a, i32 b, i32 c, i32 d) { i32* rp; B r = m_i32arrv(&rp,4); rp[0]=a; rp[1]=b; rp[2]=c; rp[3]=d; return r; } + void load_init() { // very last init function comp_currPath = bi_N; comp_currArgs = bi_N;