test_adopt.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. // Copyright Daniel Wallin 2008. Use, modification and distribution is
  2. // subject to the Boost Software License, Version 1.0. (See accompanying
  3. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  4. #include "test.hpp"
  5. #include <luabind/luabind.hpp>
  6. #include <luabind/adopt_policy.hpp>
  7. #include <iostream>
  8. struct Base
  9. {
  10. Base()
  11. {
  12. count++;
  13. }
  14. virtual ~Base()
  15. {
  16. count--;
  17. }
  18. static int count;
  19. };
  20. int Base::count = 0;
  21. struct Base_wrap : Base, luabind::wrap_base
  22. {};
  23. void destroy(Base* p)
  24. {
  25. delete p;
  26. }
  27. Base* adopted = 0;
  28. void take_ownership(Base* p)
  29. {
  30. adopted = p;
  31. }
  32. void not_null(Base* p)
  33. {
  34. TEST_CHECK(p);
  35. }
  36. void test_main(lua_State* L)
  37. {
  38. using namespace luabind;
  39. disable_super_deprecation();
  40. module(L) [
  41. class_<Base, Base_wrap>("Base")
  42. .def(constructor<>()),
  43. def("take_ownership", &take_ownership, adopt(_1)),
  44. def("not_null", &not_null)
  45. ];
  46. DOSTRING(L,
  47. "x = Base()\n"
  48. );
  49. TEST_CHECK(Base::count == 1);
  50. DOSTRING(L,
  51. "x = nil\n"
  52. "collectgarbage('collect')\n"
  53. );
  54. TEST_CHECK(Base::count == 0);
  55. DOSTRING(L,
  56. "class 'Derived' (Base)\n"
  57. " function Derived:__init()\n"
  58. " super()\n"
  59. " self.x = Base()\n"
  60. " end\n"
  61. );
  62. DOSTRING(L,
  63. "x = Derived()\n"
  64. );
  65. TEST_CHECK(Base::count == 2);
  66. DOSTRING(L,
  67. "x = nil\n"
  68. "collectgarbage('collect')\n"
  69. "collectgarbage('collect')\n"
  70. );
  71. TEST_CHECK(Base::count == 0);
  72. DOSTRING(L,
  73. "x = nil\n"
  74. "collectgarbage('collect')\n"
  75. );
  76. TEST_CHECK(Base::count == 0);
  77. DOSTRING(L,
  78. "class 'Derived2' (Derived)\n"
  79. " function Derived2:__init()\n"
  80. " super()\n"
  81. " end\n"
  82. );
  83. DOSTRING(L,
  84. "x = Derived2()\n"
  85. );
  86. TEST_CHECK(Base::count == 2);
  87. DOSTRING(L,
  88. "x = nil\n"
  89. "collectgarbage('collect')\n"
  90. "collectgarbage('collect')\n"
  91. );
  92. TEST_CHECK(Base::count == 0);
  93. DOSTRING(L,
  94. "x = Derived()\n"
  95. );
  96. TEST_CHECK(Base::count == 2);
  97. DOSTRING(L,
  98. "take_ownership(x)\n"
  99. "x = nil\n"
  100. "collectgarbage('collect')\n"
  101. "collectgarbage('collect')\n"
  102. );
  103. TEST_CHECK(Base::count == 2);
  104. delete adopted;
  105. DOSTRING(L,
  106. "collectgarbage('collect')\n"
  107. "collectgarbage('collect')\n"
  108. );
  109. TEST_CHECK(Base::count == 0);
  110. DOSTRING(L,
  111. "x = Derived2()\n"
  112. );
  113. TEST_CHECK(Base::count == 2);
  114. DOSTRING(L,
  115. "take_ownership(x)\n"
  116. "x = nil\n"
  117. "collectgarbage('collect')\n"
  118. "collectgarbage('collect')\n"
  119. );
  120. TEST_CHECK(Base::count == 2);
  121. delete adopted;
  122. DOSTRING(L,
  123. "collectgarbage('collect')\n"
  124. "collectgarbage('collect')\n"
  125. );
  126. TEST_CHECK(Base::count == 0);
  127. DOSTRING(L,
  128. "x = Derived()\n"
  129. "take_ownership(x)\n"
  130. "not_null(x)\n"
  131. );
  132. delete adopted;
  133. DOSTRING(L,
  134. "x = nil\n"
  135. "collectgarbage('collect')\n"
  136. );
  137. TEST_CHECK(Base::count == 0);
  138. }