123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460 |
- discard """
- targets: "c js"
- output: '''
- [127, 127, 0, 255][127, 127, 0, 255]
- (data: 1)
- (2, 1)
- (2, 1)
- (2, 1)
- (f0: 5)
- '''
- nimout: '''caught Exception
- main:begin
- main:end
- @[{0}]
- (width: 0, height: 0, path: "")
- @[(width: 0, height: 0, path: ""), (width: 0, height: 0, path: "")]
- Done!
- foo4
- foo4
- foo4
- (a: 0, b: 0)
- (a: 0, b: 0)
- (a: 0, b: 0)
- z1 m: (lo: 12)
- z2 a: (lo: 3)
- x1 a: (lo: 3)
- x2 a: (lo: 6)
- x3 a: (lo: 0)
- z3 a: (lo: 3)
- x1 a: (lo: 3)
- x2 a: (lo: 6)
- x3 a: (lo: 0)
- (2, 1)
- (2, 1)
- (2, 1)
- (f0: 5)
- '''
- """
- import std/sets
- #bug #1009
- type
- TAggRgba8* = array[4, byte]
- template R*(self: TAggRgba8): byte = self[0]
- template G*(self: TAggRgba8): byte = self[1]
- template B*(self: TAggRgba8): byte = self[2]
- template A*(self: TAggRgba8): byte = self[3]
- template `R=`*(self: TAggRgba8, val: byte) =
- self[0] = val
- template `G=`*(self: TAggRgba8, val: byte) =
- self[1] = val
- template `B=`*(self: TAggRgba8, val: byte) =
- self[2] = val
- template `A=`*(self: TAggRgba8, val: byte) =
- self[3] = val
- proc ABGR*(val: int | int64): TAggRgba8 =
- var V = val
- result.R = byte(V and 0xFF)
- V = V shr 8
- result.G = byte(V and 0xFF)
- V = V shr 8
- result.B = byte(V and 0xFF)
- result.A = byte((V shr 8) and 0xFF)
- const
- c1 = ABGR(0xFF007F7F)
- echo ABGR(0xFF007F7F).repr, c1.repr
- # bug 8740
- static:
- try:
- raise newException(ValueError, "foo")
- except Exception:
- echo "caught Exception"
- except Defect:
- echo "caught Defect"
- except ValueError:
- echo "caught ValueError"
- # bug #10538
- block:
- proc fun1(): seq[int] =
- try:
- try:
- result.add(1)
- return
- except:
- result.add(-1)
- finally:
- result.add(2)
- finally:
- result.add(3)
- result.add(4)
- let x1 = fun1()
- const x2 = fun1()
- doAssert(x1 == x2)
- # bug #11610
- proc simpleTryFinally()=
- try:
- echo "main:begin"
- finally:
- echo "main:end"
- static: simpleTryFinally()
- # bug #10981
- proc main =
- for i in 0..<15:
- var someSets = @[initHashSet[int]()]
- someSets[^1].incl(0) # <-- segfaults
- if i == 0:
- echo someSets
- static:
- main()
- # bug #7261
- const file = """
- sprites.png
- size: 1024,1024
- format: RGBA8888
- filter: Linear,Linear
- repeat: none
- char/slide_down
- rotate: false
- xy: 730, 810
- size: 204, 116
- orig: 204, 116
- offset: 0, 0
- index: -1
- """
- type
- AtlasPage = object
- width, height: int
- path: string
- CtsStream = object
- data: string
- pos: int
- proc atEnd(stream: CtsStream): bool =
- stream.pos >= stream.data.len
- proc readChar(stream: var CtsStream): char =
- if stream.atEnd:
- result = '\0'
- else:
- result = stream.data[stream.pos]
- inc stream.pos
- proc readLine(s: var CtsStream, line: var string): bool =
- # This is pretty much copied from the standard library:
- line.setLen(0)
- while true:
- var c = readChar(s)
- if c == '\c':
- c = readChar(s)
- break
- elif c == '\L': break
- elif c == '\0':
- if line.len > 0: break
- else: return false
- line.add(c)
- result = true
- proc peekLine(s: var CtsStream, line: var string): bool =
- let oldPos = s.pos
- result = s.readLine(line)
- s.pos = oldPos
- proc initCtsStream(data: string): CtsStream =
- CtsStream(
- pos: 0,
- data: data
- )
- # ********************
- # Interesting stuff happens here:
- # ********************
- proc parseAtlas(stream: var CtsStream) =
- var pages = @[AtlasPage(), AtlasPage()]
- var line = ""
- block:
- let page = addr pages[^1]
- discard stream.peekLine(line)
- discard stream.peekLine(line)
- echo page[]
- echo pages
- static:
- var stream = initCtsStream(file)
- parseAtlas(stream)
- echo "Done!"
- # bug #12244
- type
- Apple = object
- data: int
- func what(x: var Apple) =
- x = Apple(data: 1)
- func oh_no(): Apple =
- what(result)
- const
- vmCrash = oh_no()
- debugEcho vmCrash
- # bug #12310
- proc someTransform(s: var array[8, uint64]) =
- var s1 = 5982491417506315008'u64
- s[1] += s1
- static:
- var state: array[8, uint64]
- state[1] = 7105036623409894663'u64
- someTransform(state)
- doAssert state[1] == 13087528040916209671'u64
- import macros
- # bug #12670
- macro fooImpl(arg: untyped) =
- result = quote do:
- `arg`
- proc foo(): string {.compileTime.} =
- fooImpl:
- result = "foo"
- result.addInt 4
- static:
- echo foo()
- echo foo()
- echo foo()
- # bug #12488
- type
- MyObject = object
- a,b: int
- MyObjectRef = ref MyObject
- static:
- let x1 = new(MyObject)
- echo x1[]
- let x2 = new(MyObjectRef)
- echo x2[]
- let x3 = new(ref MyObject) # cannot generate VM code for ref MyObject
- echo x3[]
- # bug #19464
- type
- Wrapper = object
- inner: int
- proc assign(r: var Wrapper, a: Wrapper) =
- r = a
- proc myEcho(a: Wrapper) =
- var tmp = a
- assign(tmp, Wrapper(inner: 0)) # this shouldn't modify `a`
- doAssert a.inner == 1
- static:
- var result: Wrapper
- assign(result, Wrapper(inner: 1))
- myEcho(result)
- when true:
- # bug #15974
- type Foo = object
- f0: int
- proc fn(a: var Foo) =
- var s: Foo
- a = Foo(f0: 2)
- s = a
- doAssert s.f0 == 2
- a = Foo(f0: 3)
- doAssert s.f0 == 2
- proc test2()=
- var a = Foo(f0: 1)
- fn(a)
- static: test2()
- test2()
- # bug #12551
- type
- StUint = object
- lo: uint64
- func `+=`(x: var Stuint, y: Stuint) =
- x.lo += y.lo
- func `-`(x, y: Stuint): Stuint =
- result.lo = x.lo - y.lo
- func `+`(x, y: Stuint): Stuint =
- result.lo = x.lo + y.lo
- func `-=`(x: var Stuint, y: Stuint) =
- x = x - y
- func `<`(x, y: Stuint): bool=
- x.lo < y.lo
- func `==`(x, y: Stuint): bool =
- x.lo == y.lo
- func `<=`(x, y: Stuint): bool =
- x.lo <= y.lo
- proc div3n2n(r: var Stuint, b: Stuint) =
- var d: Stuint
- r = d
- r += b
- func div2n1n(r: var Stuint, b: Stuint) =
- div3n2n(r, b)
- func divmodBZ(x, y: Stuint, r: var Stuint)=
- div2n1n(r, y)
- r.lo = 3
- func `mod`(x, y: Stuint): Stuint =
- divmodBZ(x, y, result)
- func doublemod_internal(a, m: Stuint): Stuint =
- result = a
- if a >= m - a:
- result -= m
- result += a
- func mulmod_internal(a, b, m: Stuint): Stuint =
- var (a, b) = (a, b)
- swap(a, b)
- debugEcho "x1 a: ", a
- a = doublemod_internal(a, m)
- debugEcho "x2 a: ", a
- a = doublemod_internal(a, m)
- debugEcho "x3 a: ", a
- func powmod_internal(a, m: Stuint): Stuint =
- var a = a
- debugEcho "z1 m: ", m
- debugEcho "z2 a: ", a
- result = mulmod_internal(result, a, m)
- debugEcho "z3 a: ", a
- a = mulmod_internal(a, a, m)
- func powmod*(a, m: Stuint) =
- discard powmod_internal(a mod m, m)
- static:
- var x = Stuint(lo: high(uint64))
- var y = Stuint(lo: 12)
- powmod(x, y)
- # bug #16780
- when true:
- template swap*[T](a, b: var T) =
- var a2 = addr(a)
- var b2 = addr(b)
- var aOld = a2[]
- a2[] = b2[]
- b2[] = aOld
- proc rather =
- block:
- var a = 1
- var b = 2
- swap(a, b)
- echo (a,b)
- block:
- type Foo = ref object
- x: int
- var a = Foo(x:1)
- var b = Foo(x:2)
- swap(a, b)
- echo (a.x, b.x)
- block:
- type Foo = object
- x: int
- var a = Foo(x:1)
- var b = Foo(x:2)
- swap(a, b)
- echo (a.x,b.x)
- static: rather()
- rather()
- # bug #16020
- when true:
- block:
- type Foo = object
- f0: int
- proc main=
- var f = Foo(f0: 3)
- var f2 = f.addr
- f2[].f0 += 1
- f2.f0 += 1
- echo f
- static: main()
- main()
- import tables, strutils
- # bug #14553
- const PpcPatterns = @[("aaaa", "bbbb"), ("aaaaa", "bbbbb"), ("aaaaaa", "bbbbbb"), ("aaaaaaa", "bbbbbbb"), ("aaaaaaaa", "bbbbb")]
- static:
- var
- needSecondIdentifier = initTable[uint32, seq[(string, string)]]()
- for (name, pattern) in PpcPatterns:
- let
- firstPart = 0'u32
- lastPart = "test"
- needSecondIdentifier.mgetOrPut(firstPart, @[]).add((name, pattern))
- doAssert needSecondIdentifier[0] == @[("aaaa", "bbbb"), ("aaaaa", "bbbbb"), ("aaaaaa", "bbbbbb"), ("aaaaaaa", "bbbbbbb"), ("aaaaaaaa", "bbbbb")]
- # bug #17864
- macro transform*(fn: typed) =
- quote do:
- `fn`
- var map: Table[string, HashSet[string]]
- proc publish*(): void {.transform.} =
- map["k"] = init_hash_set[string]()
- map["k"].incl "d"
- publish()
|