(module (import "gyehoek" "write" (func $gh-write (param (ref eq)))) (import "gyehoek" "truthy?" (func $gh-truthy? (param (ref eq)) (result i32))) (type $heap-object (sub (struct (field $hash (mut i32))))) (type $cont-type (func (param i32))) (type $cont-stack-type (array (mut (ref null $cont-type)))) (type $closure (sub $heap-object (struct (field $hash (mut i32)) (field $code (ref $cont-type))))) (global $cont-stack-top (mut i32) (i32.const 0)) (global $cont-stack (ref $cont-stack-type) (array.new_default $cont-stack-type (i32.const 128))) (type $arg-array-type (array (mut (ref null eq)))) (global $arg-array (ref $arg-array-type) (array.new_default $arg-array-type (i32.const 32))) (global $result (mut (ref null eq)) (ref.null eq)) (func $halt (param i32) (@gyehoek "pop argument") (global.get $arg-array) (i32.const 0) (array.get $arg-array-type) ref.as_non_null (global.set $result)) (func (param i32) (@gyehoek :origin "(κ (x5) (continue λ-tail1 x5))") (local (ref eq) (ref eq) (ref eq) (ref eq) (ref eq)) (@gyehoek "pop argument") (global.get $arg-array) (i32.const 0) (array.get $arg-array-type) ref.as_non_null (local.set 1) (@gyehoek :origin "(continue λ-tail1 x5)") (@gyehoek "push args") (@gyehoek "push argument") (global.get $arg-array) (i32.const 0) (local.get 4) (array.set $arg-array-type) (@gyehoek "nargs") (i32.const 1) (@gyehoek "pop cont stack") (global.get $cont-stack-top) (i32.const 1) i32.sub (global.set $cont-stack-top) (global.get $cont-stack) (global.get $cont-stack-top) (array.get $cont-stack-type) ref.as_non_null (return_call_ref $cont-type)) (elem declare funcref (ref.func 3)) (func (param i32) (@gyehoek :origin "(κ (x3) (letrec ((r4 (κ (x5) (continue λ-tail1 x5)))) (f x3 r4)))") (local (ref eq) (ref eq) (ref eq) (ref eq) (ref eq)) (@gyehoek "pop argument") (global.get $arg-array) (i32.const 0) (array.get $arg-array-type) ref.as_non_null (local.set 1) (@gyehoek :origin "(f x3 r4)") (@gyehoek "push cont" :idx 3) (array.set $cont-stack-type (global.get $cont-stack) (global.get $cont-stack-top) (ref.func 3)) (global.set $cont-stack-top (i32.add (global.get $cont-stack-top) (i32.const 1))) (@gyehoek :origin "(f x3 r4)") (@gyehoek "load args") (@gyehoek "push argument") (global.get $arg-array) (i32.const 0) (local.get 3) (array.set $arg-array-type) (i32.const 1) (local.get 1) (ref.cast (ref $closure)) (struct.get $closure $code) (return_call_ref $cont-type)) (elem declare funcref (ref.func 4)) (func (param i32) (@gyehoek :origin "(λ (f x λ-tail1) (letrec ((r2 (κ (x3) (letrec ((r4 (κ (x5) (continue λ-tail1 x5)))) (f x3 r4))))) (f x r2)))") (local (ref eq) (ref eq) (ref eq) (ref eq) (ref eq)) (@gyehoek "pop argument") (global.get $arg-array) (i32.const 0) (array.get $arg-array-type) ref.as_non_null (local.set 1) (@gyehoek "pop argument") (global.get $arg-array) (i32.const 1) (array.get $arg-array-type) ref.as_non_null (local.set 2) (@gyehoek :origin "(f x r2)") (@gyehoek "push cont" :idx 4) (array.set $cont-stack-type (global.get $cont-stack) (global.get $cont-stack-top) (ref.func 4)) (global.set $cont-stack-top (i32.add (global.get $cont-stack-top) (i32.const 1))) (@gyehoek :origin "(f x r2)") (@gyehoek "load args") (@gyehoek "push argument") (global.get $arg-array) (i32.const 0) (local.get 2) (array.set $arg-array-type) (i32.const 1) (local.get 1) (ref.cast (ref $closure)) (struct.get $closure $code) (return_call_ref $cont-type)) (elem declare funcref (ref.func 5)) (func (param i32) (@gyehoek :origin "(λ (x λ-tail7) (prim (+ x 4) (κ (r8) (continue λ-tail7 r8))))") (local (ref eq) (ref eq) (ref eq) (ref eq) (ref eq)) (@gyehoek "pop argument") (global.get $arg-array) (i32.const 0) (array.get $arg-array-type) ref.as_non_null (local.set 1) (@gyehoek :origin "(prim (+ x 4) (κ (r8) (continue λ-tail7 r8)))") (local.get 1) (i31.get_s (ref.cast (ref i31))) (i32.const 1) i32.shr_u (i32.const 4) (@gyehoek "construct small fixnum") (i32.const 1) i32.shl ref.i31 (i31.get_s (ref.cast (ref i31))) (i32.const 1) i32.shr_u i32.add (@gyehoek "construct small fixnum") (i32.const 1) i32.shl ref.i31 (local.set 2) (@gyehoek :origin "(continue λ-tail7 r8)") (@gyehoek "push args") (@gyehoek "push argument") (global.get $arg-array) (i32.const 0) (local.get 2) (array.set $arg-array-type) (@gyehoek "nargs") (i32.const 1) (@gyehoek "pop cont stack") (global.get $cont-stack-top) (i32.const 1) i32.sub (global.set $cont-stack-top) (global.get $cont-stack) (global.get $cont-stack-top) (array.get $cont-stack-type) ref.as_non_null (return_call_ref $cont-type)) (elem declare funcref (ref.func 6)) (func (param i32) (@gyehoek :origin "(κ (x10) (continue halt x10))") (local (ref eq) (ref eq) (ref eq) (ref eq) (ref eq)) (@gyehoek "pop argument") (global.get $arg-array) (i32.const 0) (array.get $arg-array-type) ref.as_non_null (local.set 1) (@gyehoek "push argument") (global.get $arg-array) (i32.const 0) (local.get 3) (array.set $arg-array-type) (return_call $halt (i32.const 1))) (elem declare funcref (ref.func 7)) (func $scm-entry (param i32) (@gyehoek :origin "(letrec ((λ-body0 (λ (f x λ-tail1) (letrec ((r2 (κ (x3) (letrec ((r4 (κ (x5) (continue λ-tail1 x5)))) (f x3 r4))))) (f x r2))))) (letrec ((λ-body6 (λ (x λ-tail7) (prim (+ x 4) (κ (r8) (continue λ-tail7 r8)))))) (letrec ((r9 (κ (x10) (continue halt x10)))) (λ-body0 λ-body6 9 r9))))") (local (ref eq) (ref eq) (ref eq) (ref eq) (ref eq)) (i32.const 0) (ref.func 5) (struct.new $closure) (local.set 1) (i32.const 0) (ref.func 6) (struct.new $closure) (local.set 2) (@gyehoek :origin "(λ-body0 λ-body6 9 r9)") (@gyehoek "push cont" :idx 7) (array.set $cont-stack-type (global.get $cont-stack) (global.get $cont-stack-top) (ref.func 7)) (global.set $cont-stack-top (i32.add (global.get $cont-stack-top) (i32.const 1))) (@gyehoek :origin "(λ-body0 λ-body6 9 r9)") (@gyehoek "load args") (@gyehoek "push argument") (global.get $arg-array) (i32.const 0) (local.get 2) (array.set $arg-array-type) (@gyehoek "push argument") (global.get $arg-array) (i32.const 1) (i32.const 9) (@gyehoek "construct small fixnum") (i32.const 1) i32.shl ref.i31 (array.set $arg-array-type) (i32.const 1) (local.get 1) (ref.cast (ref $closure)) (struct.get $closure $code) (return_call_ref $cont-type)) (func (export "main") (call $scm-entry (i32.const 0)) (call $gh-write (ref.as_non_null (global.get $result)))))