def test_nested_for_compiles(): i = pt.ScratchVar() expr = pt.For(i.store(pt.Int(0)), pt.Int(1), i.store(i.load() + pt.Int(1))).Do( pt.Seq( [ pt.For(i.store(pt.Int(0)), pt.Int(1), i.store(i.load() + pt.Int(1))).Do( pt.Seq([i.store(pt.Int(0))]) ) ] ) ) assert expr.type_of() == pt.TealType.none assert not expr.has_return()
def test_for(): i = pt.ScratchVar() items = [ (i.store(pt.Int(0))), i.load() < pt.Int(10), i.store(i.load() + pt.Int(1)), pt.App.globalPut(pt.Itob(i.load()), i.load() * pt.Int(2)), ] expr = pt.For(items[0], items[1], items[2]).Do(pt.Seq([items[3]])) assert expr.type_of() == pt.TealType.none assert not expr.has_return() expected, varEnd = items[0].__teal__(options) condStart, condEnd = items[1].__teal__(options) stepStart, stepEnd = items[2].__teal__(options) do, doEnd = pt.Seq([items[3]]).__teal__(options) expectedBranch = pt.TealConditionalBlock([]) end = pt.TealSimpleBlock([]) varEnd.setNextBlock(condStart) doEnd.setNextBlock(stepStart) expectedBranch.setTrueBlock(do) expectedBranch.setFalseBlock(end) condEnd.setNextBlock(expectedBranch) stepEnd.setNextBlock(condStart) actual, _ = expr.__teal__(options) assert actual == expected
def test_continue_break(): i = pt.ScratchVar() expr = pt.For(i.store(pt.Int(0)), pt.Int(1), i.store(i.load() + pt.Int(1))).Do( pt.Seq([pt.If(pt.Int(1), pt.Break(), pt.Continue())]) ) assert expr.type_of() == pt.TealType.none assert not expr.has_return() expr.__teal__(options)
def test_for_compiles(): i = pt.ScratchVar() expr = pt.For(i.store(pt.Int(0)), pt.Int(1), i.store(i.load() + pt.Int(1))).Do( pt.App.globalPut(pt.Itob(pt.Int(0)), pt.Itob(pt.Int(2))) ) assert expr.type_of() == pt.TealType.none assert not expr.has_return() expr.__teal__(options)
def string_mult(s: pt.ScratchVar, n): i = pt.ScratchVar(pt.TealType.uint64) tmp = pt.ScratchVar(pt.TealType.bytes) start = pt.Seq(i.store(pt.Int(1)), tmp.store(s.load()), s.store(pt.Bytes(""))) step = i.store(i.load() + pt.Int(1)) return pt.Seq( pt.For(start, i.load() <= n, step).Do(s.store(pt.Concat(s.load(), tmp.load()))), s.load(), )
def test_invalid_for(): with pytest.raises(TypeError): expr = pt.For() with pytest.raises(TypeError): expr = pt.For(pt.Int(2)) with pytest.raises(TypeError): expr = pt.For(pt.Int(1), pt.Int(2)) with pytest.raises(pt.TealTypeError): i = pt.ScratchVar() expr = pt.For(i.store(pt.Int(0)), pt.Int(1), pt.Int(2)) expr.__teal__(options) with pytest.raises(pt.TealCompileError): i = pt.ScratchVar() expr = pt.For(i.store(pt.Int(0)), pt.Int(1), i.store(i.load() + pt.Int(1))) expr.type_of() with pytest.raises(pt.TealCompileError): i = pt.ScratchVar() expr = pt.For(i.store(pt.Int(0)), pt.Int(1), i.store(i.load() + pt.Int(1))) expr.__str__() with pytest.raises(pt.TealTypeError): i = pt.ScratchVar() expr = pt.For(i.store(pt.Int(0)), pt.Int(1), i.store(i.load() + pt.Int(1))).Do( pt.Int(0) ) with pytest.raises(pt.TealTypeError): i = pt.ScratchVar() expr = pt.For(i.store(pt.Int(0)), pt.Int(1), i.store(i.load() + pt.Int(1))).Do( pt.Pop(pt.Int(1)), pt.Int(2) ) with pytest.raises(pt.TealCompileError): expr = ( pt.For(i.store(pt.Int(0)), pt.Int(1), i.store(i.load() + pt.Int(1))) .Do(pt.Continue()) .Do(pt.Continue()) ) expr.__str__()
def reverse(a: pt.abi.String, *, output: pt.abi.String) -> pt.Expr: idx = pt.ScratchVar() buff = pt.ScratchVar() init = idx.store(pt.Int(0)) cond = idx.load() < a.length() _iter = idx.store(idx.load() + pt.Int(1)) return pt.Seq( buff.store(pt.Bytes("")), pt.For(init, cond, _iter).Do( a[idx.load()].use(lambda v: buff.store(pt.Concat(v.encode(), buff.load()))) ), output.set(buff.load()), )
def fast_fibonacci(n): i = pt.ScratchVar(pt.TealType.uint64) a = pt.ScratchVar(pt.TealType.uint64) b = pt.ScratchVar(pt.TealType.uint64) return pt.Seq( a.store(pt.Int(0)), b.store(pt.Int(1)), pt.For(i.store(pt.Int(1)), i.load() <= n, i.store(i.load() + pt.Int(1))).Do( pt.Seq( b.store(a.load() + b.load()), a.store(b.load() - a.load()), )), a.load(), )
def concat_strings( b: pt.abi.DynamicArray[pt.abi.String], *, output: pt.abi.String ) -> pt.Expr: idx = pt.ScratchVar() buff = pt.ScratchVar() init = idx.store(pt.Int(0)) cond = idx.load() < b.length() _iter = idx.store(idx.load() + pt.Int(1)) return pt.Seq( buff.store(pt.Bytes("")), pt.For(init, cond, _iter).Do( b[idx.load()].use(lambda s: buff.store(pt.Concat(buff.load(), s.get()))) ), output.set(buff.load()), )