; Symbol interning/name access is entirely inside the emitted module. (def wasm-text-runtime () '("(global $symbols (mut i32) (i32.const 0)) (global $next-symbol (mut i32) (i32.const 33)) (func $check-text (param $xs i32) (result i32) (local $p i32) (local $c i32) (local $n i32) (local.set $p (local.get $xs)) (block $done (loop $scan (br_if $done (i32.eqz (local.get $p))) (local.set $n (i32.add (local.get $n) (i32.const 1))) (if (i32.gt_u (local.get $n) (i32.const 4096)) (then unreachable)) (local.set $c (call $car (local.get $p))) (if (i32.ne (i32.and (local.get $c) (i32.const 7)) (i32.const 2)) (then unreachable)) (local.set $c (i32.shr_u (local.get $c) (i32.const 3))) (if (i32.or (i32.gt_u (local.get $c) (i32.const 1114111)) (i32.and (i32.ge_u (local.get $c) (i32.const 55296)) (i32.le_u (local.get $c) (i32.const 57343)))) (then unreachable)) (local.set $p (call $cdr (local.get $p))) (br $scan))) (local.get $xs)) (func $copy-text (param $xs i32) (result i32) (local $p i32) (local $rev i32) (local $out i32) (local.set $p (local.get $xs)) (block $first-done (loop $first (br_if $first-done (i32.eqz (local.get $p))) (local.set $rev (call $join (call $car (local.get $p)) (local.get $rev))) (local.set $p (call $cdr (local.get $p))) (br $first))) (block $done (loop $second (br_if $done (i32.eqz (local.get $rev))) (local.set $out (call $join (call $car (local.get $rev)) (local.get $out))) (local.set $rev (call $cdr (local.get $rev))) (br $second))) (local.get $out)) (func $same-text (param $a i32) (param $b i32) (result i32) (block $done (loop $scan (br_if $done (i32.or (i32.eqz (local.get $a)) (i32.eqz (local.get $b)))) (if (i32.ne (call $car (local.get $a)) (call $car (local.get $b))) (then (return (i32.const 0)))) (local.set $a (call $cdr (local.get $a))) (local.set $b (call $cdr (local.get $b))) (br $scan))) (i32.eq (local.get $a) (local.get $b))) (func $register (param $symbol i32) (param $name i32) (result i32) (global.set $symbols (call $join (call $join (local.get $symbol) (local.get $name)) (global.get $symbols))) (local.get $symbol)) (func $intern (export \"intern\") (param $name i32) (result i32) (local $p i32) (local $entry i32) (local $symbol i32) (drop (call $check-text (local.get $name))) (local.set $p (global.get $symbols)) (block $new (loop $scan (br_if $new (i32.eqz (local.get $p))) (local.set $entry (call $car (local.get $p))) (if (call $same-text (local.get $name) (call $cdr (local.get $entry))) (then (return (call $car (local.get $entry))))) (local.set $p (call $cdr (local.get $p))) (br $scan))) (local.set $symbol (global.get $next-symbol)) (drop (call $register (local.get $symbol) (call $copy-text (local.get $name)))) (global.set $next-symbol (i32.add (local.get $symbol) (i32.const 8))) (local.get $symbol)) (func $nom (param $symbol i32) (result i32) (local $p i32) (local $entry i32) (local.set $p (global.get $symbols)) (block $missing (loop $scan (br_if $missing (i32.eqz (local.get $p))) (local.set $entry (call $car (local.get $p))) (if (i32.eq (local.get $symbol) (call $car (local.get $entry))) (then (return (call $copy-text (call $cdr (local.get $entry)))))) (local.set $p (call $cdr (local.get $p))) (br $scan))) unreachable) (func $err (param i32) (result i32) unreachable)"))