aboutsummaryrefslogtreecommitdiffstats
path: root/registry.moon
diff options
context:
space:
mode:
authors-ol <s-ol@users.noreply.github.com>2020-02-02 18:34:18 +0000
committers-ol <s-ol@users.noreply.github.com>2020-02-02 18:35:58 +0000
commit1fb8e4b2e621128e043ae4091f3e25d56b9d7cc2 (patch)
tree9b95ff4e17784aaee4c14372741f2a65d76d02fb /registry.moon
parentadd logger (diff)
downloadalive-1fb8e4b2e621128e043ae4091f3e25d56b9d7cc2.tar.gz
alive-1fb8e4b2e621128e043ae4091f3e25d56b9d7cc2.zip
clean out old patching implementation
Diffstat (limited to 'registry.moon')
-rw-r--r--registry.moon91
1 files changed, 26 insertions, 65 deletions
diff --git a/registry.moon b/registry.moon
index 7268f6d..bb33916 100644
--- a/registry.moon
+++ b/registry.moon
@@ -8,87 +8,48 @@ class Registry
@map = {}
- add_module: (name) =>
- @globals\set_raw name, require "lib.#{name}"
-
--
gentag: => #@map + 1
- patch: (sexpr) =>
- old = @map[sexpr.tag]
- @map[sexpr.tag] = sexpr
-
- if not old
- @spawn_expr sexpr
- else
- @patch_expr sexpr, old
- sexpr.tag
-
- patch_root: (@root) =>
- seen = {}
- to_tag = {}
-
+ retag: (@root) =>
scope = Scope @root, @globals
+
+ -- first pass (outin):
+ -- * expand macros (mutate scopes)
+ -- * resolve symbols
for child in *@root
child\expand scope
- for typ, node in @root\walk 'inout', false
- node\link!
-
+ -- second pass (inout):
+ -- * tag untagged exprs
+ -- * destroy orphaned exprs
+ seen = {}
+ to_tag = for typ, node in @root\walk 'inout', false
continue unless typ == 'Xpr'
- sexpr = node
- if not sexpr.tag
- @spawn_expr sexpr
- table.insert to_tag, sexpr
- else
- tag = @patch sexpr
- seen[tag] = true
+ if node.tag
+ seen[node.tag] = true
+ continue
- for sexpr in *to_tag
- tag = @gentag!
- sexpr.tag = tag
- @map[tag] = sexpr
- seen[tag] = true
+ node
for tag, expr in pairs @map
if not seen[tag]
- @destroy_expr expr
+ expr.value\destroy! if expr.value
@map[tag] = nil
- spawn_expr: (sexpr) =>
- head = sexpr\head!
- return if head.type == 'macro'
-
- def = head\getc!
- if sexpr.tag
- print "respawning [#{sexpr.tag}]: '#{def}'"
- else
- print "spawning '#{def}'"
-
- sexpr.value = def sexpr
-
- patch_expr: (new, old) =>
- head = new\head!
-
- if head\getc! == old\head!\getc!
- -- same function, can be patched
- return if head.type == 'macro'
-
- print "patching [#{new.tag}]"
- new.value = old.value
- new.value\patch new
- else
- -- different function
- @spawn_expr new
-
- destroy_expr: (sexpr) =>
- head = sexpr\head!
- return if head.type == 'macro'
+ for sexpr in *to_tag
+ tag = @gentag!
+ sexpr.tag = tag
+ @map[tag] = sexpr
- sexpr.value\destroy!
- print "destroying [#{sexpr.tag}]"
+ link: =>
+ -- third pass (inout):
+ -- * patch expressions (spawn/patch)
+ for typ, node in @root\walk 'inout', false
+ L\trace "patching #{node}"
+ node\patch @map[node.tag]
--
@@ -103,6 +64,6 @@ class Registry
ok, err = xpcall sexpr.value.update, tb, sexpr.value, dt
if not ok
- print "@#{sexpr}: #{err}"
+ L\error "while updating #{sexpr}: #{err}"
:Registry