tmove_objconstr.nim 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. discard """
  2. output: '''test created
  3. test destroyed 0
  4. 1
  5. 2
  6. 3
  7. 4
  8. Pony is dying!'''
  9. joinable: false
  10. target: "C"
  11. """
  12. # bug #4214
  13. type
  14. Data = object
  15. data: string
  16. rc: int
  17. proc `=destroy`(d: var Data) =
  18. dec d.rc
  19. echo d.data, " destroyed ", d.rc
  20. proc `=`(dst: var Data, src: Data) =
  21. echo src.data, " copied"
  22. dst.data = src.data & " (copy)"
  23. dec dst.rc
  24. inc dst.rc
  25. proc initData(s: string): Data =
  26. result = Data(data: s, rc: 1)
  27. echo s, " created"
  28. proc pointlessWrapper(s: string): Data =
  29. result = initData(s)
  30. proc main =
  31. var x = pointlessWrapper"test"
  32. when true:
  33. main()
  34. # bug #985
  35. type
  36. Pony = object
  37. name: string
  38. proc `=destroy`(o: var Pony) =
  39. echo "Pony is dying!"
  40. proc getPony: Pony =
  41. result.name = "Sparkles"
  42. iterator items(p: Pony): int =
  43. for i in 1..4:
  44. yield i
  45. for x in getPony():
  46. echo x
  47. # XXX this needs to be enabled once top level statements
  48. # produce destructor calls again.
  49. #echo "Pony is dying!"
  50. #------------------------------------------------------------
  51. #-- Move into tuple constructor and move on tuple unpacking
  52. #------------------------------------------------------------
  53. type
  54. MySeqNonCopyable* = object
  55. len: int
  56. data: ptr UncheckedArray[float]
  57. proc `=destroy`*(m: var MySeqNonCopyable) {.inline.} =
  58. if m.data != nil:
  59. deallocShared(m.data)
  60. m.data = nil
  61. proc `=`*(m: var MySeqNonCopyable, m2: MySeqNonCopyable) {.error.}
  62. proc `=sink`*(m: var MySeqNonCopyable, m2: MySeqNonCopyable) {.inline.} =
  63. if m.data != m2.data:
  64. if m.data != nil:
  65. `=destroy`(m)
  66. m.len = m2.len
  67. m.data = m2.data
  68. proc len*(m: MySeqNonCopyable): int {.inline.} = m.len
  69. proc `[]`*(m: MySeqNonCopyable; i: int): float {.inline.} =
  70. m.data[i.int]
  71. proc `[]=`*(m: var MySeqNonCopyable; i, val: float) {.inline.} =
  72. m.data[i.int] = val
  73. proc setTo(s: var MySeqNonCopyable, val: float) =
  74. for i in 0..<s.len.int:
  75. s.data[i] = val
  76. proc newMySeq*(size: int, initial_value = 0.0): MySeqNonCopyable =#
  77. result.len = size
  78. if size > 0:
  79. result.data = cast[ptr UncheckedArray[float]](createShared(float, size))
  80. result.setTo(initial_value)
  81. proc myfunc(x, y: int): (MySeqNonCopyable, MySeqNonCopyable) =
  82. result = (newMySeq(x, 1.0), newMySeq(y, 5.0))
  83. proc myfunc2(x, y: int): tuple[a: MySeqNonCopyable, b:int, c:MySeqNonCopyable] =
  84. var cc = newMySeq(y, 5.0)
  85. (a: case x:
  86. of 1:
  87. let (z1, z2) = myfunc(x,y)
  88. z2
  89. elif x > 5: raise newException(ValueError, "new error")
  90. else: newMySeq(x, 1.0),
  91. b: 0,
  92. c: block:
  93. var tmp = if y > 0: move(cc) else: newMySeq(1, 3.0)
  94. tmp[0] = 5
  95. tmp
  96. )
  97. let (seq1, seq2) = myfunc(2, 3)
  98. doAssert seq1.len == 2
  99. doAssert seq1[0] == 1.0
  100. doAssert seq2.len == 3
  101. doAssert seq2[0] == 5.0
  102. var (seq3, i, _) = myfunc2(2, 3)
  103. doAssert seq3.len == 2
  104. doAssert seq3[0] == 1.0
  105. var seq4, seq5: MySeqNonCopyable
  106. (seq4, i, seq5) = myfunc2(2, 3)
  107. seq4 = block:
  108. var tmp = newMySeq(4, 1.0)
  109. tmp[0] = 3.0
  110. tmp
  111. doAssert seq4[0] == 3.0
  112. import macros
  113. seq4 =
  114. if i > 0: newMySeq(2, 5.0)
  115. elif i < -100: raise newException(ValueError, "Parse Error")
  116. else: newMySeq(2, 3.0)
  117. seq4 =
  118. case (char) i:
  119. of 'A', {'W'..'Z'}: newMySeq(2, 5.0)
  120. of 'B': quit(-1)
  121. else:
  122. let (x1, x2, x3) = myfunc2(2, 3)
  123. x3
  124. #------------------------------------------------------------
  125. #-- Move into array constructor
  126. #------------------------------------------------------------
  127. var ii = 1
  128. let arr2 = [newMySeq(2, 5.0), if i > 1: newMySeq(3, 1.0) else: newMySeq(0, 0.0)]
  129. var seqOfSeq2 = @[newMySeq(2, 5.0), newMySeq(3, 1.0)]
  130. ## issue #10462
  131. proc myfuncLoop(x: int): MySeqNonCopyable =
  132. for i in 0..<x:
  133. var cc = newMySeq(i, 5.0)
  134. result = cc
  135. discard myfuncLoop(3)
  136. #------------------------------------------------------------
  137. # Move into table via openarray
  138. #------------------------------------------------------------
  139. type
  140. TableNonCopyable = object
  141. x: seq[(string, MySeqNonCopyable)]
  142. proc toTable(pairs: sink openArray[(string, MySeqNonCopyable)]): TableNonCopyable =
  143. discard
  144. let mytable = {"a": newMySeq(2, 5.0)}.toTable