|
| 1 | +function transformVars!(expr::Expr, symbols::Base.KeyIterator{Dict{Symbol,Type}}) |
| 2 | + for i in 1:length(expr.args) |
| 3 | + if expr.head == :kw && i == 1 |
| 4 | + |
| 5 | + elseif expr.head == Symbol(".") && i == 2 |
| 6 | + |
| 7 | + elseif isa(expr.args[i], Symbol) && in(expr.args[i], symbols) |
| 8 | + expr.args[i] = :(_fsm.$(expr.args[i])) |
| 9 | + elseif isa(expr.args[i], Expr) |
| 10 | + transformVars!(expr.args[i], symbols) |
| 11 | + end |
| 12 | + end |
| 13 | +end |
| 14 | + |
| 15 | +function transformTry!(expr::Expr, n::UInt8=0x00, super::Expr=:(), line_no::Int=0, super_try::Expr=:(), line_try::Int=0) :: UInt8 |
| 16 | + for (i, arg) in enumerate(expr.args) |
| 17 | + if isa(arg, Expr) |
| 18 | + if arg.head == :line |
| 19 | + line_no = i+1 |
| 20 | + super = expr |
| 21 | + elseif arg.head == :macrocall && arg.args[1] == Symbol("@yield") |
| 22 | + n += one(UInt8) |
| 23 | + if expr == super |
| 24 | + expr.args[i] = :(isa(_ret, Exception) && throw(_ret)) |
| 25 | + else |
| 26 | + expr.args[i] = :(_ret) |
| 27 | + insert!(super.args, line_no+1, :(isa(_ret, Exception) && throw(_ret))) |
| 28 | + end |
| 29 | + insert!(super.args, line_no, :(_fsm._state = 0xff)) |
| 30 | + insert!(super.args, line_no, arg.args[2]) |
| 31 | + insert!(super.args, line_no, :(_fsm._state = $n)) |
| 32 | + insert!(super_try.args, line_try, :(@label $(Symbol("_STATE_",:($n))))) |
| 33 | + insert!(super_try.args, line_try, deepcopy(super_try.args[line_try+1])) |
| 34 | + for j in length(super_try.args[line_try].args[1].args):-1:line_no+2 |
| 35 | + deleteat!(super_try.args[line_try].args[1].args, j) |
| 36 | + end |
| 37 | + for j in 1:line_no+1 |
| 38 | + deleteat!(super_try.args[line_try+2].args[1].args, 1) |
| 39 | + end |
| 40 | + break |
| 41 | + else |
| 42 | + m = transformTry!(arg, n, super, line_no, super_try, line_try) |
| 43 | + if m > n |
| 44 | + n=m |
| 45 | + break |
| 46 | + end |
| 47 | + end |
| 48 | + end |
| 49 | + end |
| 50 | + n |
| 51 | +end |
| 52 | + |
| 53 | +function transformYield!(expr::Expr, n::UInt8=0x00, super::Expr=:(), line_no::Int=0) :: UInt8 |
| 54 | + for (i, arg) in enumerate(expr.args) |
| 55 | + if isa(arg, Expr) |
| 56 | + if arg.head == :try |
| 57 | + n = transformTry!(arg.args[1], n, super, line_no, expr, i) |
| 58 | + println("hi") |
| 59 | + elseif arg.head == :line |
| 60 | + line_no = i+1 |
| 61 | + super = expr |
| 62 | + elseif arg.head == :macrocall && arg.args[1] == Symbol("@yield") |
| 63 | + n += one(UInt8) |
| 64 | + if expr == super |
| 65 | + expr.args[i] = :(_fsm._state = 0xff) |
| 66 | + else |
| 67 | + expr.args[i] = :(_ret) |
| 68 | + insert!(super.args, line_no, :(_fsm._state = 0xff)) |
| 69 | + end |
| 70 | + insert!(super.args, line_no, :(@label $(Symbol("_STATE_",:($n))))) |
| 71 | + insert!(super.args, line_no, arg.args[2]) |
| 72 | + insert!(super.args, line_no, :(_fsm._state = $n)) |
| 73 | + else |
| 74 | + n = transformYield!(arg, n, super, line_no) |
| 75 | + end |
| 76 | + end |
| 77 | + end |
| 78 | + n |
| 79 | +end |
0 commit comments