-
Notifications
You must be signed in to change notification settings - Fork 40
/
Copy pathcompiler_fsm_conditional.go
67 lines (53 loc) · 1.36 KB
/
compiler_fsm_conditional.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package ride
// If-else statement.
type ConditionalFsm struct {
params
prev Fsm
patchPosition uint16
}
func (a ConditionalFsm) FuncDeclaration(name string, args []string) Fsm {
panic("Illegal call FuncDeclaration on ConditionalFsm")
}
func (a ConditionalFsm) Bytes(b []byte) Fsm {
return constant(a, a.params, rideBytes(b))
}
func conditionalTransition(prev Fsm, params params) Fsm {
return ConditionalFsm{
prev: prev,
params: params,
}
}
func (a ConditionalFsm) Condition() Fsm {
return conditionalTransition(a, a.params)
}
func (a ConditionalFsm) TrueBranch() Fsm {
a.b.jpmIfFalse()
a.patchPosition = a.b.writeStub(2)
return a
}
func (a ConditionalFsm) FalseBranch() Fsm {
a.b.patch(a.patchPosition, encode(a.b.len()))
return a
}
func (a ConditionalFsm) Assigment(name string) Fsm {
return assigmentFsmTransition(a, a.params, name)
}
func (a ConditionalFsm) Return() Fsm {
a.b.ret()
return a.prev
}
func (a ConditionalFsm) Long(value int64) Fsm {
return long(a, a.params, value)
}
func (a ConditionalFsm) Call(name string, argc uint16) Fsm {
return callTransition(a, a.params, name, argc)
}
func (a ConditionalFsm) Reference(name string) Fsm {
return reference(a, a.params, name)
}
func (a ConditionalFsm) Boolean(v bool) Fsm {
return boolean(a, a.params, v)
}
func (a ConditionalFsm) String(s string) Fsm {
return str(a, a.params, s)
}