aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMarshall Lochbaum <mwlochbaum@gmail.com>2021-05-20 21:37:01 -0400
committerMarshall Lochbaum <mwlochbaum@gmail.com>2021-05-20 21:49:55 -0400
commit660d333d70310b1df6edfcdcc9c1cd99bfbbf3b9 (patch)
tree531da38b7efe791d2f3aaed082b5386cddf18769 /src
parentb446c6efa3db640fc5eeeefb67212c611fa54375 (diff)
Leave identifier instructions in lexical-scope ordering
Diffstat (limited to 'src')
-rw-r--r--src/c.bqn17
1 files changed, 9 insertions, 8 deletions
diff --git a/src/c.bqn b/src/c.bqn
index e513127d..a0446e39 100644
--- a/src/c.bqn
+++ b/src/c.bqn
@@ -198,21 +198,22 @@ Parse ← {r‿vn‿i‿e←𝕨⋄nv←≠vn
# Lexical resolution (independent of parsing part 2 below)
di←/dm←»dc # Dots aren't scoped
id←/idm←(gi⊏«aa∧a)<dm<(0⊸≤∧<⟜nv)xv
- ip←id⊏ac⋄d←id⊏dd←ac M 2‿2⋄xm←ip M 1‿2 # Assignment classes; which are definitions, exports
+ d←id⊏dd←ac M 2‿2 # Which accesses are definitions
"Can't define special name"_err_(SP) sp⊏dd
idn←(idg←(d/idf←id⊏fi)∾≠fsc)⊔d/idv←id⊏xv # Numbers for each identifier, per-block
# Order every referenced identifier, and an undeclaration for each declaration
- ixf←(((1=ip)+⊏⟜(¯1∾b/gf))∾d⊸/⊏((≠𝕩)∾c⊏gf)˙)idf # First order by block index, open for real and closed for virtual
+ ixf←(((1=id⊏ac)+⊏⟜(¯1∾b/gf))∾d⊸/⊏((≠𝕩)∾c⊏gf)˙)idf # First order by block index, open for real and closed for virtual
ig←(⍋⊏⟜(ixx←∾⟜(d⊸/)idv))⊸⊏⍋ixf # Then order by name
{"Redefinition"_err_(𝕩⊏·∾⟜(d⊸/)ID) ¬ixx∨○(»⊸≠𝕩⊸⊏)ixf} (≠d)⊸≤⊸/ig
ig↩<⟜(≠d)⊸/(⍋+`∘⊏⟜(d∾-/˜d))⊸⊏ig # Last order by declaration depth
- d⊏˜↩ig
- ("Undefined identifier"Pl/)_err_(ig⊏ID) d<¯1⊸»⊸≠ig⊏idv
- idx←idg⊔(dig←⍋d/ig)⊏d(/≥1↓PN)ig⊏xm # Exported identifier mask
- idd←(⊢-(IT d)⊸⊏)⌾(ig⊸⊏)id⊏fd # Identifier frame depth
+ d⊏˜↩ig⋄id⊏˜↩ig
+ ip←id⊏ac⋄xm←ip M 1‿2 # Assignment class; which are exports
+ ("Undefined identifier"Pl/)_err_(ID) d<¯1⊸»⊸≠ig⊏idv
+ idd←(⊢-(IT d)⊸⊏)id⊏fd # Identifier frame depth
"Can't export from surrounding scope"_err_(ID) xm∧0<idd
- idi←ig⍋⊸⊏(¯1+`d)⊏dig⍋⊸⊏(⊏⟜fsc+⊒)¯1↓idg # Slot within frame
- uu←ip(((1«d)∧0=⊣)∧d(⊣+`⊸⊏PN)0<⊢)⌾(ig⊸⊏)idd# Unused marker
+ idx←idg⊔(dig←⍋d/ig)⊏d(/≥1↓PN)xm # Exported identifier mask
+ idi←(¯1+`d)⊏dig⍋⊸⊏(⊏⟜fsc+⊒)¯1↓idg # Slot within frame
+ uu←((1«d)∧0=ip)∧d(⊣+`⊸⊏PN)0<idd # Unused marker
spi←((spf←sp⊏fi)⊏3×fx)+0⊸≤⊸+2+sp⊏xv # Special name index
uu∾↩∊⌾⌽spi+6×spf # and unused marker
idor←∾2‿3/⟨di,id∾sp⟩ # Identifier bytecode ordering