PatLang control-flow graphs
Basic blocks and jump edges recovered from the self-hosted compiler's own IR, one section per program. Red curves are conditional (JumpIfFalse), blue are unconditional.
self_hosting/examples/fib_bench.patlang · self_hosting/examples/contracts_demo.patlang · self_hosting/lib/pos.patlang+self_hosting/examples/pos_demo.patlang · self_hosting/examples/feature_demo.patlang
self_hosting/examples/fib_bench.patlang
self_hosting/examples/fib_bench.patlang — 3 function(s)
fib
B@0
Load n
Const num 2
Bin <
JumpIfFalse 7
B@4
Load n
Return
Jump 17
B@7
Load n
Const num 1
Bin -
Call fib 1
Load n
Const num 2
Bin -
Call fib 1
Bin +
Return
B@17
Return
sum_to
B@0
Const num 0
Store total
Const num 1
Store i
B@4
Load i
Load n
Bin <=
JumpIfFalse 17
B@8
Load total
Load i
Bin +
Store total
Load i
Const num 1
Bin +
Store i
Jump 4
B@17
Load total
Return
Return
main
B@0
CallHost now_ms 0
Store t0
Const num 27
Call fib 1
Store f
CallHost now_ms 0
Store t1
Const str fib(27) =
Load f
Bin +
Const str [
Bin +
Load t1
Load t0
Bin -
Bin +
Const str ms]
Bin +
CallHost print 1
CallHost now_ms 0
Store t2
Const num 2000000
Call sum_to 1
Store s
CallHost now_ms 0
Store t3
Const str sum 1..2000000 =
Load s
Bin +
Const str [
Bin +
Load t3
Load t2
Bin -
Bin +
Const str ms]
Bin +
CallHost print 1
CallHost now_ms 0
Store t4
CallHost vec_new 0
Store xs
Const num 0
Store k
B@44
Load k
Const num 200000
Bin <
JumpIfFalse 58
B@48
Load xs
Load k
Const num 2
Bin *
CallHost vec_push 2
Load k
Const num 1
Bin +
Store k
Jump 44
B@58
CallHost now_ms 0
Store t5
Const str built vector of
Load xs
CallHost vec_len 1
Bin +
Const str [
Bin +
Load t5
Load t4
Bin -
Bin +
Const str ms]
Bin +
CallHost print 1
Const str total:
Load t5
Load t0
Bin -
Bin +
Const str ms
Bin +
CallHost print 1
Return
self_hosting/examples/contracts_demo.patlang
self_hosting/examples/contracts_demo.patlang — 4 function(s)
safe_divide
B@0
Const str safe_divide
Const str require
Const str (Var(b) != Num(0))
Load b
Const num 0
Bin !=
CallHost contract_check 4
Load a
Load b
Bin /
Store r
Const str safe_divide
Const str ensure
Const str ((Var(r) * Var(b)) == Var(a))
Load r
Load b
Bin *
Load a
Bin ==
CallHost contract_check 4
Load r
Return
Return
clamp
B@0
Const str clamp
Const str require
Const str (Var(lo) <= Var(hi))
Load lo
Load hi
Bin <=
CallHost contract_check 4
Load x
Load lo
Bin <
JumpIfFalse 14
B@11
Load lo
Store r
Jump 23
B@14
Load x
Load hi
Bin >
JumpIfFalse 21
B@18
Load hi
Store r
Jump 23
B@21
Load x
Store r
B@23
Const str clamp
Const str ensure
Const str ((Var(r) >= Var(lo)) and (Var(r) <= Var(hi)))
Load r
Load lo
Bin >=
Un not
JumpIfFalse 33
B@31
Const bool false
Jump 38
B@33
Load r
Load hi
Bin <=
Un not
Un not
B@38
CallHost contract_check 4
Load r
Return
Return
factorial
B@0
Const str factorial
Const str require
Const str (Var(n) >= Num(0))
Load n
Const num 0
Bin >=
CallHost contract_check 4
Load n
Const num 2
Bin <
JumpIfFalse 14
B@11
Const num 1
Store r
Jump 21
B@14
Load n
Load n
Const num 1
Bin -
Call factorial 1
Bin *
Store r
B@21
Const str factorial
Const str ensure
Const str (Var(r) >= Num(1))
Load r
Const num 1
Bin >=
CallHost contract_check 4
Load r
Return
Return
main
B@0
Const str safe_divide(10, 2) =
Const num 10
Const num 2
Call safe_divide 2
Bin +
CallHost print 1
Const str clamp(15, 0, 10) =
Const num 15
Const num 0
Const num 10
Call clamp 3
Bin +
CallHost print 1
Const str clamp(-5, 0, 10) =
Const num 5
Un -
Const num 0
Const num 10
Call clamp 3
Bin +
CallHost print 1
Const str factorial(6) =
Const num 6
Call factorial 1
Bin +
CallHost print 1
Const str main
Const str assert
Const str ((Num(1) + Num(1)) == Num(2))
Const num 1
Const num 1
Bin +
Const num 2
Bin ==
CallHost contract_check 4
Const str standalone assert passed
CallHost print 1
Const str --- now deliberately violating a precondition ---
CallHost print 1
Const str safe_divide(1, 0) =
Const num 1
Const num 0
Call safe_divide 2
Bin +
CallHost print 1
Const str (unreachable: the line above aborts the program)
CallHost print 1
Return
self_hosting/lib/pos.patlang+self_hosting/examples/pos_demo.patlang
self_hosting/lib/pos.patlang+self_hosting/examples/pos_demo.patlang — 7 function(s)
pos_setup
B@0
Const str Product
Const str apple
CallHost new 2
Const str apple
Const str set
Const str price
Const num 30
CallHost send 4
Const str Product
Const str banana
CallHost new 2
Const str banana
Const str set
Const str price
Const num 25
CallHost send 4
Const str Product
Const str milk
CallHost new 2
Const str milk
Const str set
Const str price
Const num 120
CallHost send 4
Const str dairy
Const str milk
Const str yes
CallHost fact 3
Const str dairy
Const str cheese
Const str yes
CallHost fact 3
Const str total
Const num 0
CallHost set_var 2
Const str items
Const num 0
CallHost set_var 2
Const str receipt
Const str
CallHost set_var 2
Const str serve_customer
Const str till-1
CallHost goal 2
Const bool true
Return
Return
pos_scan
B@0
Load item
Const str price
CallHost get 2
Store price
Load price
Un not
JumpIfFalse 14
B@7
Const str unknown item:
Load item
Bin +
CallHost print 1
Const num 0
Return
Jump 14
B@14
Const str dairy
Load item
Const num 0
CallHost query 3
Const num 0
Bin >
JumpIfFalse 28
B@21
Load price
Const num 9
Bin *
Const num 10
Bin /
Store price
Jump 28
B@28
Const str total
Const str __vars
Const str total
CallHost get 2
Load price
Bin +
CallHost set_var 2
Const str items
Const str __vars
Const str items
CallHost get 2
Const num 1
Bin +
CallHost set_var 2
Const str receipt
Const str __vars
Const str receipt
CallHost get 2
Const str
Bin +
Load item
Bin +
Const str
Bin +
Load price
Bin +
Const str p
Bin +
CallHost set_var 2
Load price
Return
Return
pos_total
B@0
Const str __vars
Const str total
CallHost get 2
Return
Return
pos_pay
B@0
Const str __vars
Const str total
CallHost get 2
Store total
Load tendered
Load total
Bin -
Store change
Const str --- RECEIPT ---
CallHost print 1
Const str __vars
Const str receipt
CallHost get 2
Const str items:
Bin +
Const str __vars
Const str items
CallHost get 2
Bin +
CallHost print 1
Const str total:
Load total
Bin +
Const str p, tendered:
Bin +
Load tendered
Bin +
Const str p, change:
Bin +
Load change
Bin +
Const str p
Bin +
CallHost print 1
Load change
Return
Return
__when_scan_1
B@0
Load event_data
Call pos_scan 1
Return
__when_pay_2
B@0
Load event_data
Call pos_pay 1
Return
main
B@0
Call pos_setup 0
Const str scanning...
CallHost print 1
Const str scan
Const str apple
CallHost emit 2
Const str scan
Const str apple
CallHost emit 2
Const str scan
Const str banana
CallHost emit 2
Const str scan
Const str milk
CallHost emit 2
Const str scan
Const str unobtainium
CallHost emit 2
Const str pay
Const num 500
CallHost emit 2
Const str till session complete
CallHost print 1
Return
self_hosting/examples/feature_demo.patlang
self_hosting/examples/feature_demo.patlang — 8 function(s)
fib
B@0
Load n
Const num 2
Bin <
JumpIfFalse 7
B@4
Load n
Return
Jump 17
B@7
Load n
Const num 1
Bin -
Call fib 1
Load n
Const num 2
Bin -
Call fib 1
Bin +
Return
B@17
Return
sum_list
B@0
Const num 0
Store total
Const num 0
Store i
B@4
Load i
Load xs
CallHost len 1
Bin <
JumpIfFalse 20
B@9
Load total
Load xs
Load i
CallHost list_get 2
Bin +
Store total
Load i
Const num 1
Bin +
Store i
Jump 4
B@20
Load total
Return
Return
__when_greeting_1
B@0
Const str event received:
Load event_data
Bin +
CallHost print 1
Return
double
B@0
Load x
Const num 2
Bin *
Return
Return
is_even
B@0
Load x
Const num 2
Bin %
Const num 0
Bin ==
Return
Return
map_list
B@0
BuildList 0
Store out
Const num 0
Store i
B@4
Load i
Load xs
CallHost len 1
Bin <
JumpIfFalse 22
B@9
Load out
Load fname
Load xs
Load i
CallHost list_get 2
CallHost apply 2
CallHost list_push 2
Store out
Load i
Const num 1
Bin +
Store i
Jump 4
B@22
Load out
Return
Return
filter_list
B@0
BuildList 0
Store out
Const num 0
Store i
B@4
Load i
Load xs
CallHost len 1
Bin <
JumpIfFalse 27
B@9
Load fname
Load xs
Load i
CallHost list_get 2
CallHost apply 2
JumpIfFalse 22
B@15
Load out
Load xs
Load i
CallHost list_get 2
CallHost list_push 2
Store out
Jump 22
B@22
Load i
Const num 1
Bin +
Store i
Jump 4
B@27
Load out
Return
Return
main
B@0
Const num 1
Const num 2
Const num 3
Const num 4
BuildList 4
Store nums
Const str fib(10) =
Const num 10
Call fib 1
Bin +
CallHost print 1
Const str sum =
Load nums
Call sum_list 1
Bin +
CallHost print 1
Load nums
Call sum_list 1
Const num 10
Bin ==
JumpIfFalse 24
B@21
Const str sum ok
CallHost print 1
Jump 26
B@24
Const str sum wrong
CallHost print 1
B@26
Const str greeting
Const str hello events
CallHost emit 2
Const str parent
Const str alice
Const str bob
CallHost fact 3
Const str parent
Const str alice
Const str carol
CallHost fact 3
Const str alice children:
Const str parent
Const str alice
Const num 0
CallHost query 3
Bin +
CallHost print 1
Const str Person
Const str kim
CallHost new 2
Const str kim
Const str set
Const str age
Const num 42
CallHost send 4
Const str kim age:
Const str kim
Const str age
CallHost get 2
Bin +
CallHost print 1
Const str doubled:
Load nums
Const str double
Call map_list 2
Bin +
CallHost print 1
Const str evens:
Load nums
Const str is_even
Call filter_list 2
Bin +
CallHost print 1
Return