diff options
| author | s-ol <s-ol@users.noreply.github.com> | 2020-02-02 18:34:18 +0000 |
|---|---|---|
| committer | s-ol <s-ol@users.noreply.github.com> | 2020-02-02 18:35:58 +0000 |
| commit | 1fb8e4b2e621128e043ae4091f3e25d56b9d7cc2 (patch) | |
| tree | 9b95ff4e17784aaee4c14372741f2a65d76d02fb /registry.moon | |
| parent | add logger (diff) | |
| download | alive-1fb8e4b2e621128e043ae4091f3e25d56b9d7cc2.tar.gz alive-1fb8e4b2e621128e043ae4091f3e25d56b9d7cc2.zip | |
clean out old patching implementation
Diffstat (limited to 'registry.moon')
| -rw-r--r-- | registry.moon | 91 |
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 |
