143 lines
4.2 KiB
WebAssembly Text Format
143 lines
4.2 KiB
WebAssembly Text Format
(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)))
|
|
(global $arg0 (mut (ref null eq)) (ref.null eq))
|
|
(global $arg1 (mut (ref null eq)) (ref.null eq))
|
|
(global $arg2 (mut (ref null eq)) (ref.null eq))
|
|
(global $arg3 (mut (ref null eq)) (ref.null eq))
|
|
(global $arg4 (mut (ref null eq)) (ref.null eq))
|
|
(global $arg5 (mut (ref null eq)) (ref.null eq))
|
|
(global $arg6 (mut (ref null eq)) (ref.null eq))
|
|
(global $arg7 (mut (ref null eq)) (ref.null eq))
|
|
(global $arg8 (mut (ref null eq)) (ref.null eq))
|
|
(global $arg9 (mut (ref null eq)) (ref.null eq))
|
|
(global $arg10 (mut (ref null eq)) (ref.null eq))
|
|
(global $arg11 (mut (ref null eq)) (ref.null eq))
|
|
(global $arg12 (mut (ref null eq)) (ref.null eq))
|
|
(global $arg13 (mut (ref null eq)) (ref.null eq))
|
|
(global $arg14 (mut (ref null eq)) (ref.null eq))
|
|
(global $arg15 (mut (ref null eq)) (ref.null eq))
|
|
(global $result (mut (ref null eq)) (ref.null eq))
|
|
(func
|
|
$halt
|
|
(param i32)
|
|
(@gyehoek begin popArg)
|
|
(global.get $arg0)
|
|
ref.as_non_null
|
|
(@gyehoek end popArg)
|
|
(global.set $result))
|
|
(func
|
|
(param i32)
|
|
(@gyehoek
|
|
:origin
|
|
"(λ (x λ-tail1) (prim (* x x) (κ (r2) (continue λ-tail1 r2))))")
|
|
(local (ref eq) (ref eq) (ref eq) (ref eq) (ref eq))
|
|
(@gyehoek
|
|
:origin
|
|
"(prim (* x x) (κ (r2) (continue λ-tail1 r2)))")
|
|
(global.get $arg1)
|
|
(i31.get_s (ref.cast (ref i31)))
|
|
(i32.const 1)
|
|
i32.shr_u
|
|
(global.get $arg1)
|
|
(i31.get_s (ref.cast (ref i31)))
|
|
(i32.const 1)
|
|
i32.shr_u
|
|
i32.mul
|
|
(@gyehoek "construct small fixnum")
|
|
(i32.const 1)
|
|
i32.shl
|
|
ref.i31
|
|
(global.set $arg2)
|
|
(@gyehoek :origin "(continue λ-tail1 r2)")
|
|
(@gyehoek "push args")
|
|
(@gyehoek begin pushArg)
|
|
(global.get $arg2)
|
|
(global.set $arg0)
|
|
(@gyehoek end pushArg)
|
|
(@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 "(κ (x4) (continue halt x4))")
|
|
(local (ref eq) (ref eq) (ref eq) (ref eq) (ref eq))
|
|
(@gyehoek begin pushArg)
|
|
(global.get $arg2)
|
|
(global.set $arg0)
|
|
(@gyehoek end pushArg)
|
|
(return_call $halt (i32.const 1)))
|
|
(elem declare funcref (ref.func 4))
|
|
(func
|
|
$scm-entry
|
|
(param i32)
|
|
(@gyehoek
|
|
:origin
|
|
"(letrec ((λ-body0 (λ (x λ-tail1) (prim (* x x) (κ (r2) (continue λ-tail1 r2)))))) (letrec ((r3 (κ (x4) (continue halt x4)))) (λ-body0 5 r3)))")
|
|
(local (ref eq) (ref eq) (ref eq) (ref eq) (ref eq))
|
|
(i32.const 0)
|
|
(ref.func 3)
|
|
(struct.new $closure)
|
|
(global.set $arg1)
|
|
(@gyehoek :origin "(λ-body0 5 r3)")
|
|
(@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 "(λ-body0 5 r3)")
|
|
(@gyehoek "load args")
|
|
(@gyehoek begin pushArg)
|
|
(i32.const 5)
|
|
(@gyehoek "construct small fixnum")
|
|
(i32.const 1)
|
|
i32.shl
|
|
ref.i31
|
|
(global.set $arg0)
|
|
(@gyehoek end pushArg)
|
|
(i32.const 1)
|
|
(global.get $arg1)
|
|
(ref.cast (ref $closure))
|
|
(struct.get $closure $code)
|
|
(return_call_ref $cont-type)
|
|
(@gyehoek todo (f' (global.get $arg1)) (ktail 1)))
|
|
(func
|
|
(export "main")
|
|
(call $scm-entry (i32.const 0))
|
|
(call $gh-write (ref.as_non_null (global.get $result)))))
|