mirror of
https://github.com/krgamestudios/Toy.git
synced 2026-04-15 14:54:07 +10:00
Planned control flow statements
This commit is contained in:
120
.notes/control-flow-opcodes.txt
Normal file
120
.notes/control-flow-opcodes.txt
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
types:
|
||||||
|
if-then-else
|
||||||
|
ternary ?:
|
||||||
|
while
|
||||||
|
do-while
|
||||||
|
for
|
||||||
|
foreach (compounds)
|
||||||
|
switch-case-default (and continue/break?)
|
||||||
|
continue
|
||||||
|
break
|
||||||
|
|
||||||
|
if-then:
|
||||||
|
cond-branch
|
||||||
|
if false jump end
|
||||||
|
{
|
||||||
|
then-branch
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
if-then-else: (also ternary)
|
||||||
|
cond-branch
|
||||||
|
if false jump else
|
||||||
|
{
|
||||||
|
then-branch
|
||||||
|
}
|
||||||
|
jump end
|
||||||
|
{
|
||||||
|
else-branch
|
||||||
|
}
|
||||||
|
end
|
||||||
|
|
||||||
|
while:
|
||||||
|
begin
|
||||||
|
cond-branch
|
||||||
|
if false jump end
|
||||||
|
{
|
||||||
|
then-branch
|
||||||
|
}
|
||||||
|
jump begin
|
||||||
|
end
|
||||||
|
|
||||||
|
do-while:
|
||||||
|
begin
|
||||||
|
{
|
||||||
|
then-branch
|
||||||
|
}
|
||||||
|
cond-branch
|
||||||
|
if true jump begin
|
||||||
|
end
|
||||||
|
|
||||||
|
for:
|
||||||
|
{
|
||||||
|
pre-branch
|
||||||
|
begin
|
||||||
|
cond-branch
|
||||||
|
if false jump end
|
||||||
|
{
|
||||||
|
then-branch
|
||||||
|
}
|
||||||
|
post-branch
|
||||||
|
jump begin
|
||||||
|
end
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach:
|
||||||
|
...needs more planning
|
||||||
|
|
||||||
|
switch-case-default:
|
||||||
|
...needs more planning
|
||||||
|
|
||||||
|
continue:
|
||||||
|
jump begin
|
||||||
|
unwind scopes
|
||||||
|
|
||||||
|
break:
|
||||||
|
jump end
|
||||||
|
unwind scopes
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
Notes:
|
||||||
|
The additional scope in 'for' is to safely encapsulate pre-branch, as variables can be declared here.
|
||||||
|
do-while's 'end' is only there for the break/continue keywords.
|
||||||
|
break and continue will also unwind scopes, up to the innermost control-flow level.
|
||||||
|
|
||||||
|
break/continue within nested scopes:
|
||||||
|
Because control flows can be nested, a stack of scope depths may be needed for break/continue...
|
||||||
|
However, this would get more complicated with closures.
|
||||||
|
To fix this, scopes may need to remember their own depth, and the depth of the innermost control-flow level.
|
||||||
|
If a scope's depth is 10 and the inner control-flow-level is 7, then calling break/continue will jump AND unwind to the inner control-flow level.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
JUMP word:
|
||||||
|
opcode
|
||||||
|
type (absolute, relative)
|
||||||
|
conditional (always, if_true, if_false)
|
||||||
|
-
|
||||||
|
|
||||||
|
value
|
||||||
|
|
||||||
|
absolute:
|
||||||
|
"value" is relative to the code sections starting position
|
||||||
|
|
||||||
|
relative:
|
||||||
|
"value" is relative to the program counter, after this opcode has been read from the bytecode
|
||||||
|
|
||||||
|
always:
|
||||||
|
Always jump
|
||||||
|
|
||||||
|
if_true:
|
||||||
|
pop the stack top
|
||||||
|
if the popped value is true, then jump
|
||||||
|
else ignore
|
||||||
|
|
||||||
|
if_false:
|
||||||
|
pop the stack top
|
||||||
|
if the popped value is true, then ignore
|
||||||
|
else jump
|
||||||
|
|
||||||
Reference in New Issue
Block a user