28 - support 'continue'
We still haven't verified that the generated code is correct. Also, time to fix that bug in arc's continue.
This commit is contained in:
parent
6215fec225
commit
b794da7fe9
20
mu.arc
20
mu.arc
|
@ -127,6 +127,10 @@
|
||||||
(do
|
(do
|
||||||
;? (prn pc " " instr)
|
;? (prn pc " " instr)
|
||||||
(++ pc))
|
(++ pc))
|
||||||
|
; hack: racket replaces curlies with parens, so we need the
|
||||||
|
; keyword begin to delimit blocks.
|
||||||
|
; ultimately there'll be no nesting and curlies will just be in a
|
||||||
|
; line by themselves.
|
||||||
(do
|
(do
|
||||||
;? (prn `(open ,pc))
|
;? (prn `(open ,pc))
|
||||||
(push `(open ,pc) locs)
|
(push `(open ,pc) locs)
|
||||||
|
@ -153,10 +157,26 @@
|
||||||
(assert:is oarg nil)
|
(assert:is oarg nil)
|
||||||
(recur arg)
|
(recur arg)
|
||||||
(pop stack))
|
(pop stack))
|
||||||
|
break
|
||||||
|
(do
|
||||||
|
(assert:is oarg nil)
|
||||||
|
(assert:is arg nil)
|
||||||
|
(yield `(jmp (offset ,(close-offset pc locs)))))
|
||||||
breakif
|
breakif
|
||||||
(do
|
(do
|
||||||
;? (prn "breakif: " instr)
|
;? (prn "breakif: " instr)
|
||||||
|
(assert:is oarg nil)
|
||||||
(yield `(jif ,arg.0 (offset ,(close-offset pc locs)))))
|
(yield `(jif ,arg.0 (offset ,(close-offset pc locs)))))
|
||||||
|
continue
|
||||||
|
(do
|
||||||
|
(assert:is oarg nil)
|
||||||
|
(assert:is arg nil)
|
||||||
|
(yield `(jmp (offset ,(- stack.0 pc)))))
|
||||||
|
continueif
|
||||||
|
(do
|
||||||
|
;? (prn "continueif: " instr)
|
||||||
|
(assert:is oarg nil)
|
||||||
|
(yield `(jif ,arg.0 (offset ,(- stack.0 pc)))))
|
||||||
;else
|
;else
|
||||||
(yield instr))))
|
(yield instr))))
|
||||||
(++ pc)))))))
|
(++ pc)))))))
|
||||||
|
|
72
mu.arc.t
72
mu.arc.t
|
@ -279,6 +279,22 @@
|
||||||
(if (~iso memory* (obj 1 1 2 2 3 nil 4 3))
|
(if (~iso memory* (obj 1 1 2 2 3 nil 4 3))
|
||||||
(prn "F - if 'jif's first arg is false, it doesn't skip any instructions"))
|
(prn "F - if 'jif's first arg is false, it doesn't skip any instructions"))
|
||||||
|
|
||||||
|
(clear)
|
||||||
|
(add-fns
|
||||||
|
'((main
|
||||||
|
((integer 1) <- loadi 2)
|
||||||
|
((integer 2) <- loadi 1)
|
||||||
|
((integer 2) <- add (integer 2) (integer 2))
|
||||||
|
((boolean 3) <- eq (integer 1) (integer 2))
|
||||||
|
(jif (boolean 3) (offset -3))
|
||||||
|
((integer 4) <- loadi 3)
|
||||||
|
(reply)
|
||||||
|
((integer 3) <- loadi 34))))
|
||||||
|
(run function*!main)
|
||||||
|
;? (prn memory*)
|
||||||
|
(if (~iso memory* (obj 1 2 2 4 3 nil 4 3))
|
||||||
|
(prn "F - 'jif' can take a negative offset to make backward jumps"))
|
||||||
|
|
||||||
(clear)
|
(clear)
|
||||||
(add-fns
|
(add-fns
|
||||||
'((test1
|
'((test1
|
||||||
|
@ -382,4 +398,58 @@
|
||||||
(jif (boolean 4) (offset 1))
|
(jif (boolean 4) (offset 1))
|
||||||
((integer 5) <- loadi 34)
|
((integer 5) <- loadi 34)
|
||||||
(reply)))
|
(reply)))
|
||||||
(prn "F - convert braces"))
|
(prn "F - convert-braces replaces breakif with a jif to after the next close curly"))
|
||||||
|
|
||||||
|
(if (~iso (convert-braces '(((integer 1) <- loadi 4)
|
||||||
|
((integer 2) <- loadi 2)
|
||||||
|
((integer 3) <- add (integer 2) (integer 2))
|
||||||
|
{ begin
|
||||||
|
(break)
|
||||||
|
}
|
||||||
|
(reply)))
|
||||||
|
'(((integer 1) <- loadi 4)
|
||||||
|
((integer 2) <- loadi 2)
|
||||||
|
((integer 3) <- add (integer 2) (integer 2))
|
||||||
|
(jmp (offset 0))
|
||||||
|
(reply)))
|
||||||
|
(prn "F - convert-braces works for degenerate blocks"))
|
||||||
|
|
||||||
|
(if (~iso (convert-braces '(((integer 1) <- loadi 4)
|
||||||
|
((integer 2) <- loadi 2)
|
||||||
|
((integer 3) <- add (integer 2) (integer 2))
|
||||||
|
{ begin
|
||||||
|
((boolean 4) <- neq (integer 1) (integer 3))
|
||||||
|
(breakif (boolean 4))
|
||||||
|
{ begin
|
||||||
|
((integer 5) <- loadi 34)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
(reply)))
|
||||||
|
'(((integer 1) <- loadi 4)
|
||||||
|
((integer 2) <- loadi 2)
|
||||||
|
((integer 3) <- add (integer 2) (integer 2))
|
||||||
|
((boolean 4) <- neq (integer 1) (integer 3))
|
||||||
|
(jif (boolean 4) (offset 1))
|
||||||
|
((integer 5) <- loadi 34)
|
||||||
|
(reply)))
|
||||||
|
(prn "F - convert-braces balances curlies"))
|
||||||
|
|
||||||
|
(if (~iso (convert-braces '(((integer 1) <- loadi 4)
|
||||||
|
((integer 2) <- loadi 2)
|
||||||
|
((integer 3) <- add (integer 2) (integer 2))
|
||||||
|
{ begin
|
||||||
|
{ begin
|
||||||
|
((boolean 4) <- neq (integer 1) (integer 3))
|
||||||
|
}
|
||||||
|
(continueif (boolean 4))
|
||||||
|
((integer 5) <- loadi 34)
|
||||||
|
}
|
||||||
|
(reply)))
|
||||||
|
'(((integer 1) <- loadi 4)
|
||||||
|
((integer 2) <- loadi 2)
|
||||||
|
((integer 3) <- add (integer 2) (integer 2))
|
||||||
|
((boolean 4) <- neq (integer 1) (integer 3))
|
||||||
|
(jif (boolean 4) (offset -2))
|
||||||
|
((integer 5) <- loadi 34)
|
||||||
|
(reply)))
|
||||||
|
(prn "F - convert-braces balances curlies"))
|
||||||
|
|
Loading…
Reference in New Issue