boot2

Playing with the boostrap
git clone https://git.ryansepassi.com/git/boot2.git
Log | Files | Refs | README

029-land.scm (1278B)


      1 ;; tests/cc-cg/29-land.scm — `&&` short-circuits, leaves one i32 (§H.2).
      2 ;;
      3 ;; Models: int a = 5; int b = 0; return (a && b) ? 100 : 42;
      4 ;;          → exit 42 (since a && b is false because b == 0).
      5 ;; Also asserts the merged result is i32 0/1 — store it into an i32
      6 ;; slot and reload, confirming exit value when isolated.
      7 
      8 (let ((cg (cg-init)))
      9   (cg-fn-begin cg "main" '() %t-i32)
     10   (let* ((off-a (cg-alloc-slot cg 4 4))
     11          (sym-a (%sym "a" 'var 'auto %t-i32 off-a))
     12          (off-b (cg-alloc-slot cg 4 4))
     13          (sym-b (%sym "b" 'var 'auto %t-i32 off-b)))
     14     ;; a = 5; b = 0
     15     (cg-push-sym cg sym-a)
     16     (cg-push-imm cg %t-i32 5)
     17     (cg-assign cg) (cg-pop cg)
     18     (cg-push-sym cg sym-b)
     19     (cg-push-imm cg %t-i32 0)
     20     (cg-assign cg) (cg-pop cg)
     21     ;; (a && b) implemented via cg-ifelse-merge per parser pattern
     22     (cg-push-sym cg sym-a) (cg-load cg)
     23     (cg-ifelse-merge cg
     24       (lambda ()
     25         (cg-push-sym cg sym-b) (cg-load cg)
     26         (cg-cast cg %t-bool) (cg-cast cg %t-i32))
     27       (lambda () (cg-push-imm cg %t-i32 0)))
     28     ;; Outer: (cond) ? 100 : 42
     29     (cg-ifelse-merge cg
     30       (lambda () (cg-push-imm cg %t-i32 100))
     31       (lambda () (cg-push-imm cg %t-i32 42)))
     32     (cg-return cg))
     33   (cg-fn-end cg)
     34   (write-bv-fd 1 (cg-finish cg)))