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
|
||||
;? (prn pc " " instr)
|
||||
(++ 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
|
||||
;? (prn `(open ,pc))
|
||||
(push `(open ,pc) locs)
|
||||
|
@ -153,10 +157,26 @@
|
|||
(assert:is oarg nil)
|
||||
(recur arg)
|
||||
(pop stack))
|
||||
break
|
||||
(do
|
||||
(assert:is oarg nil)
|
||||
(assert:is arg nil)
|
||||
(yield `(jmp (offset ,(close-offset pc locs)))))
|
||||
breakif
|
||||
(do
|
||||
;? (prn "breakif: " instr)
|
||||
(assert:is oarg nil)
|
||||
(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
|
||||
(yield instr))))
|
||||
(++ 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))
|
||||
(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)
|
||||
(add-fns
|
||||
'((test1
|
||||
|
@ -382,4 +398,58 @@
|
|||
(jif (boolean 4) (offset 1))
|
||||
((integer 5) <- loadi 34)
|
||||
(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