tdestructor3.nim 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. discard """
  2. output: '''assign
  3. destroy
  4. destroy
  5. 5
  6. 123
  7. destroy Foo: 123
  8. destroy Foo: 5
  9. (x1: (val: ...))
  10. destroy
  11. ---------------
  12. app begin
  13. (val: ...)
  14. destroy
  15. app end
  16. '''
  17. joinable: false
  18. """
  19. # bug #2821
  20. type T = object
  21. proc `=`(lhs: var T, rhs: T) =
  22. echo "assign"
  23. proc `=destroy`(v: var T) =
  24. echo "destroy"
  25. proc use(x: T) = discard
  26. proc usedToBeBlock =
  27. var v1 : T
  28. var v2 : T = v1
  29. use v1
  30. usedToBeBlock()
  31. # bug #1632
  32. type
  33. Foo = object of RootObj
  34. x: int
  35. proc `=destroy`(a: var Foo) =
  36. echo "destroy Foo: " & $a.x
  37. template toFooPtr(a: int{lit}): ptr Foo =
  38. var temp = Foo(x:a)
  39. temp.addr
  40. proc test(a: ptr Foo) =
  41. echo a[].x
  42. proc main =
  43. test(toFooPtr(5))
  44. test(toFooPtr(123))
  45. main()
  46. # bug #11517
  47. type
  48. UniquePtr*[T] = object
  49. val: ptr T
  50. proc `=destroy`*[T](p: var UniquePtr[T]) =
  51. mixin `=destroy`
  52. echo "destroy"
  53. if p.val != nil:
  54. `=destroy`(p.val[])
  55. dealloc(p.val)
  56. p.val = nil
  57. proc `=`*[T](dest: var UniquePtr[T], src: UniquePtr[T]) {.error.}
  58. proc `=sink`*[T](dest: var UniquePtr[T], src: UniquePtr[T]) {.inline.} =
  59. if dest.val != src.val:
  60. if dest.val != nil:
  61. `=destroy`(dest)
  62. dest.val = src.val
  63. proc newUniquePtr*[T](val: sink T): UniquePtr[T] =
  64. result.val = create(T)
  65. result.val[] = val
  66. #-------------------------------------------------------------
  67. type
  68. MyObject = object of RootObj
  69. x1: UniquePtr[int]
  70. MyObject2 = object of MyObject
  71. proc newObj2(x:int, y: float): MyObject2 =
  72. MyObject2(x1: newUniquePtr(x))
  73. proc test =
  74. let obj2 = newObj2(1, 1.0)
  75. echo obj2
  76. test()
  77. #------------------------------------------------------------
  78. # Issue #12883
  79. type
  80. TopObject = object
  81. internal: UniquePtr[int]
  82. proc deleteTop(p: ptr TopObject) =
  83. if p != nil:
  84. `=destroy`(p[]) # !!! this operation used to leak the integer
  85. deallocshared(p)
  86. proc createTop(): ptr TopObject =
  87. result = cast[ptr TopObject](allocShared0(sizeof(TopObject)))
  88. result.internal = newUniquePtr(1)
  89. proc test2() =
  90. let x = createTop()
  91. echo $x.internal
  92. deleteTop(x)
  93. echo "---------------"
  94. echo "app begin"
  95. test2()
  96. echo "app end"