dub 0.2.2 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of dub might be problematic. Click here for more details.

Files changed (277) hide show
  1. data/History.txt +92 -0
  2. data/LICENSE +20 -0
  3. data/README.rdoc +115 -0
  4. data/Rakefile +59 -0
  5. data/dub.gemspec +197 -0
  6. data/lib/dub/argument.rb +286 -0
  7. data/lib/dub/entities_unescape.rb +9 -0
  8. data/lib/dub/function.rb +177 -0
  9. data/lib/dub/function_group.rb +72 -0
  10. data/lib/dub/generator.rb +15 -0
  11. data/lib/dub/group.rb +20 -0
  12. data/lib/dub/klass.rb +338 -0
  13. data/lib/dub/lua/class.cpp.erb +114 -0
  14. data/lib/dub/lua/class_gen.rb +96 -0
  15. data/lib/dub/lua/function.cpp.erb +15 -0
  16. data/lib/dub/lua/function_gen.rb +329 -0
  17. data/lib/dub/lua/group.cpp.erb +9 -0
  18. data/lib/dub/lua/lua_cpp_helper.cpp +259 -0
  19. data/lib/dub/lua/lua_cpp_helper.h +219 -0
  20. data/lib/dub/lua/lua_object.cpp +158 -0
  21. data/lib/dub/lua/lua_object.h +69 -0
  22. data/lib/dub/lua/namespace.cpp.erb +42 -0
  23. data/lib/dub/lua/namespace_gen.rb +69 -0
  24. data/lib/dub/lua.rb +24 -0
  25. data/lib/dub/member_extraction.rb +128 -0
  26. data/lib/dub/namespace.rb +295 -0
  27. data/lib/dub/opts_parser.rb +30 -0
  28. data/lib/dub/parser.rb +46 -0
  29. data/lib/dub/templates/lua_template.erb +21 -0
  30. data/lib/dub/version.rb +3 -0
  31. data/lib/dub.rb +24 -20
  32. data/test/argument_test.rb +581 -0
  33. data/test/fixtures/app/CMakeLists.txt +54 -0
  34. data/test/fixtures/app/Doxyfile +1600 -0
  35. data/test/fixtures/app/bindings/all_lua.cpp +299 -0
  36. data/test/fixtures/app/include/matrix.h +283 -0
  37. data/test/fixtures/app/make_lua_bindings.rb +13 -0
  38. data/test/fixtures/app/vendor/lua/CMakeLists.txt +25 -0
  39. data/test/fixtures/app/vendor/lua/COPYRIGHT +34 -0
  40. data/test/fixtures/app/vendor/lua/HISTORY +183 -0
  41. data/test/fixtures/app/vendor/lua/INSTALL +99 -0
  42. data/test/fixtures/app/vendor/lua/Makefile +183 -0
  43. data/test/fixtures/app/vendor/lua/README +37 -0
  44. data/test/fixtures/app/vendor/lua/lapi.c +1080 -0
  45. data/test/fixtures/app/vendor/lua/lapi.h +16 -0
  46. data/test/fixtures/app/vendor/lua/lauxlib.c +653 -0
  47. data/test/fixtures/app/vendor/lua/lauxlib.h +174 -0
  48. data/test/fixtures/app/vendor/lua/lbaselib.c +643 -0
  49. data/test/fixtures/app/vendor/lua/lcode.c +839 -0
  50. data/test/fixtures/app/vendor/lua/lcode.h +76 -0
  51. data/test/fixtures/app/vendor/lua/ldblib.c +397 -0
  52. data/test/fixtures/app/vendor/lua/ldebug.c +622 -0
  53. data/test/fixtures/app/vendor/lua/ldebug.h +33 -0
  54. data/test/fixtures/app/vendor/lua/ldo.c +516 -0
  55. data/test/fixtures/app/vendor/lua/ldo.h +57 -0
  56. data/test/fixtures/app/vendor/lua/ldump.c +164 -0
  57. data/test/fixtures/app/vendor/lua/lfunc.c +174 -0
  58. data/test/fixtures/app/vendor/lua/lfunc.h +34 -0
  59. data/test/fixtures/app/vendor/lua/lgc.c +711 -0
  60. data/test/fixtures/app/vendor/lua/lgc.h +110 -0
  61. data/test/fixtures/app/vendor/lua/liblua.a +0 -0
  62. data/test/fixtures/app/vendor/lua/linit.c +38 -0
  63. data/test/fixtures/app/vendor/lua/liolib.c +532 -0
  64. data/test/fixtures/app/vendor/lua/llex.c +461 -0
  65. data/test/fixtures/app/vendor/lua/llex.h +81 -0
  66. data/test/fixtures/app/vendor/lua/llimits.h +128 -0
  67. data/test/fixtures/app/vendor/lua/lmathlib.c +263 -0
  68. data/test/fixtures/app/vendor/lua/lmem.c +86 -0
  69. data/test/fixtures/app/vendor/lua/lmem.h +49 -0
  70. data/test/fixtures/app/vendor/lua/loadlib.c +664 -0
  71. data/test/fixtures/app/vendor/lua/lobject.c +214 -0
  72. data/test/fixtures/app/vendor/lua/lobject.h +381 -0
  73. data/test/fixtures/app/vendor/lua/lopcodes.c +102 -0
  74. data/test/fixtures/app/vendor/lua/lopcodes.h +268 -0
  75. data/test/fixtures/app/vendor/lua/loslib.c +244 -0
  76. data/test/fixtures/app/vendor/lua/lparser.c +1337 -0
  77. data/test/fixtures/app/vendor/lua/lparser.h +82 -0
  78. data/test/fixtures/app/vendor/lua/lstate.c +214 -0
  79. data/test/fixtures/app/vendor/lua/lstate.h +168 -0
  80. data/test/fixtures/app/vendor/lua/lstring.c +111 -0
  81. data/test/fixtures/app/vendor/lua/lstring.h +31 -0
  82. data/test/fixtures/app/vendor/lua/lstrlib.c +868 -0
  83. data/test/fixtures/app/vendor/lua/ltable.c +588 -0
  84. data/test/fixtures/app/vendor/lua/ltable.h +40 -0
  85. data/test/fixtures/app/vendor/lua/ltablib.c +278 -0
  86. data/test/fixtures/app/vendor/lua/ltm.c +75 -0
  87. data/test/fixtures/app/vendor/lua/ltm.h +54 -0
  88. data/test/fixtures/app/vendor/lua/lua.c +695 -0
  89. data/test/fixtures/app/vendor/lua/lua.h +385 -0
  90. data/test/fixtures/app/vendor/lua/lua_dub_helper.h +77 -0
  91. data/test/fixtures/app/vendor/lua/luac +0 -0
  92. data/test/fixtures/app/vendor/lua/luac.c +200 -0
  93. data/test/fixtures/app/vendor/lua/luaconf.h +762 -0
  94. data/test/fixtures/app/vendor/lua/lualib.h +53 -0
  95. data/test/fixtures/app/vendor/lua/lundump.c +223 -0
  96. data/test/fixtures/app/vendor/lua/lundump.h +36 -0
  97. data/test/fixtures/app/vendor/lua/lvm.c +765 -0
  98. data/test/fixtures/app/vendor/lua/lvm.h +36 -0
  99. data/test/fixtures/app/vendor/lua/lzio.c +82 -0
  100. data/test/fixtures/app/vendor/lua/lzio.h +67 -0
  101. data/test/fixtures/app/vendor/lua/matrix.h +102 -0
  102. data/test/fixtures/app/vendor/lua/print.c +227 -0
  103. data/test/fixtures/app/vendor/lua/test/README +26 -0
  104. data/test/fixtures/app/vendor/lua/test/bisect.lua +27 -0
  105. data/test/fixtures/app/vendor/lua/test/cf.lua +16 -0
  106. data/test/fixtures/app/vendor/lua/test/echo.lua +5 -0
  107. data/test/fixtures/app/vendor/lua/test/env.lua +7 -0
  108. data/test/fixtures/app/vendor/lua/test/factorial.lua +32 -0
  109. data/test/fixtures/app/vendor/lua/test/fib.lua +40 -0
  110. data/test/fixtures/app/vendor/lua/test/fibfor.lua +13 -0
  111. data/test/fixtures/app/vendor/lua/test/globals.lua +13 -0
  112. data/test/fixtures/app/vendor/lua/test/hello.lua +3 -0
  113. data/test/fixtures/app/vendor/lua/test/life.lua +111 -0
  114. data/test/fixtures/app/vendor/lua/test/luac.lua +7 -0
  115. data/test/fixtures/app/vendor/lua/test/printf.lua +7 -0
  116. data/test/fixtures/app/vendor/lua/test/readonly.lua +12 -0
  117. data/test/fixtures/app/vendor/lua/test/sieve.lua +29 -0
  118. data/test/fixtures/app/vendor/lua/test/sort.lua +66 -0
  119. data/test/fixtures/app/vendor/lua/test/table.lua +12 -0
  120. data/test/fixtures/app/vendor/lua/test/trace-calls.lua +32 -0
  121. data/test/fixtures/app/vendor/lua/test/trace-globals.lua +38 -0
  122. data/test/fixtures/app/vendor/lua/test/xd.lua +14 -0
  123. data/test/fixtures/app/xml/classdub_1_1_base.xml +85 -0
  124. data/test/fixtures/app/xml/classdub_1_1_custom_destructor.xml +67 -0
  125. data/test/fixtures/app/xml/classdub_1_1_deletable_out_of_lua.xml +43 -0
  126. data/test/fixtures/app/xml/classdub_1_1_matrix.xml +482 -0
  127. data/test/fixtures/app/xml/classdub_1_1_no_destructor.xml +49 -0
  128. data/test/fixtures/app/xml/classdub_1_1_priv_sub_base.xml +89 -0
  129. data/test/fixtures/app/xml/classdub_1_1_private_constr.xml +68 -0
  130. data/test/fixtures/app/xml/classdub_1_1_static_constr.xml +69 -0
  131. data/test/fixtures/app/xml/classdub_1_1_sub_base.xml +89 -0
  132. data/test/fixtures/app/xml/classdub_1_1_t_mat.xml +252 -0
  133. data/test/fixtures/app/xml/combine.xslt +15 -0
  134. data/test/fixtures/app/xml/compound.xsd +814 -0
  135. data/test/fixtures/app/xml/dir_53661a2bdeb1d55e60581a7e15deb763.xml +12 -0
  136. data/test/fixtures/app/xml/index.xml +91 -0
  137. data/test/fixtures/app/xml/index.xsd +66 -0
  138. data/test/fixtures/app/xml/matrix_8h.xml +310 -0
  139. data/test/fixtures/app/xml/namespacedub.xml +48 -0
  140. data/test/fixtures/classcv_1_1_mat.xml +1996 -0
  141. data/test/fixtures/classcv_1_1_point__.xml +341 -0
  142. data/test/fixtures/classcv_1_1_scalar__.xml +269 -0
  143. data/test/fixtures/classcv_1_1_size__.xml +270 -0
  144. data/test/fixtures/dummy_class.cpp.erb +1 -0
  145. data/test/fixtures/dummy_function.cpp.erb +1 -0
  146. data/test/fixtures/group___magic_type.xml +406 -0
  147. data/test/fixtures/namespacecv.xml +12659 -0
  148. data/test/function_group_test.rb +43 -0
  149. data/test/function_test.rb +405 -0
  150. data/test/group_test.rb +241 -0
  151. data/test/helper.rb +34 -0
  152. data/test/klass_test.rb +551 -0
  153. data/test/lua_function_gen_test.rb +242 -0
  154. data/test/namespace_test.rb +220 -0
  155. data/test/parser_test.rb +36 -0
  156. metadata +229 -272
  157. checksums.yaml +0 -7
  158. data/lib/open_api_sdk/analytics.rb +0 -99
  159. data/lib/open_api_sdk/domains.rb +0 -353
  160. data/lib/open_api_sdk/dub.rb +0 -88
  161. data/lib/open_api_sdk/links.rb +0 -766
  162. data/lib/open_api_sdk/metatags.rb +0 -54
  163. data/lib/open_api_sdk/models/operations/bulkcreatelinks_response.rb +0 -60
  164. data/lib/open_api_sdk/models/operations/bulkupdatelinks_requestbody.rb +0 -27
  165. data/lib/open_api_sdk/models/operations/bulkupdatelinks_response.rb +0 -60
  166. data/lib/open_api_sdk/models/operations/color.rb +0 -24
  167. data/lib/open_api_sdk/models/operations/createdomain_requestbody.rb +0 -33
  168. data/lib/open_api_sdk/models/operations/createdomain_response.rb +0 -60
  169. data/lib/open_api_sdk/models/operations/createlink_requestbody.rb +0 -95
  170. data/lib/open_api_sdk/models/operations/createlink_response.rb +0 -60
  171. data/lib/open_api_sdk/models/operations/createtag_requestbody.rb +0 -32
  172. data/lib/open_api_sdk/models/operations/createtag_response.rb +0 -60
  173. data/lib/open_api_sdk/models/operations/data.rb +0 -83
  174. data/lib/open_api_sdk/models/operations/deletedomain_request.rb +0 -24
  175. data/lib/open_api_sdk/models/operations/deletedomain_response.rb +0 -60
  176. data/lib/open_api_sdk/models/operations/deletedomain_responsebody.rb +0 -24
  177. data/lib/open_api_sdk/models/operations/deletelink_request.rb +0 -24
  178. data/lib/open_api_sdk/models/operations/deletelink_response.rb +0 -60
  179. data/lib/open_api_sdk/models/operations/deletelink_responsebody.rb +0 -24
  180. data/lib/open_api_sdk/models/operations/event.rb +0 -21
  181. data/lib/open_api_sdk/models/operations/getlinkinfo_request.rb +0 -33
  182. data/lib/open_api_sdk/models/operations/getlinkinfo_response.rb +0 -60
  183. data/lib/open_api_sdk/models/operations/getlinks_request.rb +0 -51
  184. data/lib/open_api_sdk/models/operations/getlinks_response.rb +0 -60
  185. data/lib/open_api_sdk/models/operations/getlinkscount_request.rb +0 -48
  186. data/lib/open_api_sdk/models/operations/getlinkscount_response.rb +0 -60
  187. data/lib/open_api_sdk/models/operations/getmetatags_request.rb +0 -24
  188. data/lib/open_api_sdk/models/operations/getmetatags_response.rb +0 -33
  189. data/lib/open_api_sdk/models/operations/getmetatags_responsebody.rb +0 -30
  190. data/lib/open_api_sdk/models/operations/getqrcode_request.rb +0 -39
  191. data/lib/open_api_sdk/models/operations/getqrcode_response.rb +0 -60
  192. data/lib/open_api_sdk/models/operations/gettags_response.rb +0 -60
  193. data/lib/open_api_sdk/models/operations/getworkspace_request.rb +0 -24
  194. data/lib/open_api_sdk/models/operations/getworkspace_response.rb +0 -60
  195. data/lib/open_api_sdk/models/operations/groupby.rb +0 -28
  196. data/lib/open_api_sdk/models/operations/interval.rb +0 -25
  197. data/lib/open_api_sdk/models/operations/level.rb +0 -21
  198. data/lib/open_api_sdk/models/operations/listdomains_response.rb +0 -60
  199. data/lib/open_api_sdk/models/operations/paymentprocessor.rb +0 -20
  200. data/lib/open_api_sdk/models/operations/requestbody.rb +0 -95
  201. data/lib/open_api_sdk/models/operations/retrieveanalytics_request.rb +0 -81
  202. data/lib/open_api_sdk/models/operations/retrieveanalytics_response.rb +0 -60
  203. data/lib/open_api_sdk/models/operations/sort.rb +0 -20
  204. data/lib/open_api_sdk/models/operations/trackcustomer_requestbody.rb +0 -33
  205. data/lib/open_api_sdk/models/operations/trackcustomer_response.rb +0 -60
  206. data/lib/open_api_sdk/models/operations/trackcustomer_responsebody.rb +0 -33
  207. data/lib/open_api_sdk/models/operations/tracklead_requestbody.rb +0 -42
  208. data/lib/open_api_sdk/models/operations/tracklead_response.rb +0 -60
  209. data/lib/open_api_sdk/models/operations/tracklead_responsebody.rb +0 -42
  210. data/lib/open_api_sdk/models/operations/tracksale_requestbody.rb +0 -42
  211. data/lib/open_api_sdk/models/operations/tracksale_response.rb +0 -60
  212. data/lib/open_api_sdk/models/operations/tracksale_responsebody.rb +0 -42
  213. data/lib/open_api_sdk/models/operations/updatedomain_request.rb +0 -27
  214. data/lib/open_api_sdk/models/operations/updatedomain_requestbody.rb +0 -33
  215. data/lib/open_api_sdk/models/operations/updatedomain_response.rb +0 -60
  216. data/lib/open_api_sdk/models/operations/updatelink_request.rb +0 -27
  217. data/lib/open_api_sdk/models/operations/updatelink_requestbody.rb +0 -95
  218. data/lib/open_api_sdk/models/operations/updatelink_response.rb +0 -60
  219. data/lib/open_api_sdk/models/operations/updatetag_color.rb +0 -24
  220. data/lib/open_api_sdk/models/operations/updatetag_request.rb +0 -27
  221. data/lib/open_api_sdk/models/operations/updatetag_requestbody.rb +0 -32
  222. data/lib/open_api_sdk/models/operations/updatetag_response.rb +0 -60
  223. data/lib/open_api_sdk/models/operations/updateworkspace_request.rb +0 -27
  224. data/lib/open_api_sdk/models/operations/updateworkspace_requestbody.rb +0 -27
  225. data/lib/open_api_sdk/models/operations/updateworkspace_response.rb +0 -60
  226. data/lib/open_api_sdk/models/operations/upsertlink_requestbody.rb +0 -95
  227. data/lib/open_api_sdk/models/operations/upsertlink_response.rb +0 -60
  228. data/lib/open_api_sdk/models/operations.rb +0 -74
  229. data/lib/open_api_sdk/models/shared/badrequest.rb +0 -24
  230. data/lib/open_api_sdk/models/shared/code.rb +0 -18
  231. data/lib/open_api_sdk/models/shared/color.rb +0 -24
  232. data/lib/open_api_sdk/models/shared/conflict.rb +0 -24
  233. data/lib/open_api_sdk/models/shared/conflict_code.rb +0 -18
  234. data/lib/open_api_sdk/models/shared/conflict_error.rb +0 -30
  235. data/lib/open_api_sdk/models/shared/countrycode.rb +0 -267
  236. data/lib/open_api_sdk/models/shared/domains.rb +0 -27
  237. data/lib/open_api_sdk/models/shared/domainschema.rb +0 -48
  238. data/lib/open_api_sdk/models/shared/error.rb +0 -30
  239. data/lib/open_api_sdk/models/shared/forbidden.rb +0 -24
  240. data/lib/open_api_sdk/models/shared/forbidden_code.rb +0 -18
  241. data/lib/open_api_sdk/models/shared/forbidden_error.rb +0 -30
  242. data/lib/open_api_sdk/models/shared/geo.rb +0 -771
  243. data/lib/open_api_sdk/models/shared/internalservererror.rb +0 -24
  244. data/lib/open_api_sdk/models/shared/internalservererror_code.rb +0 -18
  245. data/lib/open_api_sdk/models/shared/internalservererror_error.rb +0 -30
  246. data/lib/open_api_sdk/models/shared/inviteexpired.rb +0 -24
  247. data/lib/open_api_sdk/models/shared/inviteexpired_code.rb +0 -18
  248. data/lib/open_api_sdk/models/shared/inviteexpired_error.rb +0 -30
  249. data/lib/open_api_sdk/models/shared/linkgeotargeting.rb +0 -771
  250. data/lib/open_api_sdk/models/shared/linkschema.rb +0 -142
  251. data/lib/open_api_sdk/models/shared/notfound.rb +0 -24
  252. data/lib/open_api_sdk/models/shared/notfound_code.rb +0 -18
  253. data/lib/open_api_sdk/models/shared/notfound_error.rb +0 -30
  254. data/lib/open_api_sdk/models/shared/plan.rb +0 -24
  255. data/lib/open_api_sdk/models/shared/ratelimitexceeded.rb +0 -24
  256. data/lib/open_api_sdk/models/shared/ratelimitexceeded_code.rb +0 -18
  257. data/lib/open_api_sdk/models/shared/ratelimitexceeded_error.rb +0 -30
  258. data/lib/open_api_sdk/models/shared/role.rb +0 -19
  259. data/lib/open_api_sdk/models/shared/security.rb +0 -24
  260. data/lib/open_api_sdk/models/shared/tagschema.rb +0 -30
  261. data/lib/open_api_sdk/models/shared/unauthorized.rb +0 -24
  262. data/lib/open_api_sdk/models/shared/unauthorized_code.rb +0 -18
  263. data/lib/open_api_sdk/models/shared/unauthorized_error.rb +0 -30
  264. data/lib/open_api_sdk/models/shared/unprocessableentity.rb +0 -24
  265. data/lib/open_api_sdk/models/shared/unprocessableentity_code.rb +0 -18
  266. data/lib/open_api_sdk/models/shared/unprocessableentity_error.rb +0 -30
  267. data/lib/open_api_sdk/models/shared/users.rb +0 -24
  268. data/lib/open_api_sdk/models/shared/workspaceschema.rb +0 -81
  269. data/lib/open_api_sdk/models/shared.rb +0 -49
  270. data/lib/open_api_sdk/qr_codes.rb +0 -97
  271. data/lib/open_api_sdk/sdkconfiguration.rb +0 -52
  272. data/lib/open_api_sdk/tags.rb +0 -272
  273. data/lib/open_api_sdk/track.rb +0 -276
  274. data/lib/open_api_sdk/utils/metadata_fields.rb +0 -150
  275. data/lib/open_api_sdk/utils/t.rb +0 -59
  276. data/lib/open_api_sdk/utils/utils.rb +0 -772
  277. data/lib/open_api_sdk/workspaces.rb +0 -192
@@ -0,0 +1,219 @@
1
+ /*
2
+ Copyright (c) 2011 by Gaspard Bucher (http://teti.ch).
3
+
4
+ Permission is hereby granted, free of charge, to any person obtaining
5
+ a copy of this software and associated documentation files (the
6
+ "Software"), to deal in the Software without restriction, including
7
+ without limitation the rights to use, copy, modify, merge, publish,
8
+ distribute, sublicense, and/or sell copies of the Software, and to
9
+ permit persons to whom the Software is furnished to do so, subject to
10
+ the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be
13
+ included in all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
19
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
20
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
21
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22
+ */
23
+
24
+ #ifndef DOXY_GENERATOR_LIB_DOXY_GENERATOR_INCLUDE_LUA_DOXY_HELPER_H_
25
+ #define DOXY_GENERATOR_LIB_DOXY_GENERATOR_INCLUDE_LUA_DOXY_HELPER_H_
26
+
27
+ #include <stdlib.h> // malloc
28
+ #include <string> // std::string for Exception
29
+ #include <exception> // std::exception
30
+
31
+ #ifdef __cplusplus
32
+ extern "C" {
33
+ #endif
34
+ // We need C linkage because lua lib is compiled as C code
35
+ #include "lua.h"
36
+ #include "lauxlib.h"
37
+
38
+ #ifdef __cplusplus
39
+ }
40
+ #endif
41
+ /** Try/catch safe versions of luaL_checknumber, luaL_checkudata, .. */
42
+
43
+ namespace dub {
44
+ class Exception : public std::exception
45
+ {
46
+ std::string message_;
47
+ public:
48
+ explicit Exception(const char *format, ...);
49
+
50
+ ~Exception() throw();
51
+
52
+ const char* what() const throw();
53
+ };
54
+
55
+ class TypeException : public Exception
56
+ {
57
+ public:
58
+ explicit TypeException(lua_State *L, int narg, const char *type, bool is_super = false);
59
+ };
60
+
61
+ } // dub
62
+
63
+
64
+ // ================================================== dubL_check... try/catch safe
65
+ // these provide the same funcionality of their equivalent luaL_check... but they
66
+ // throw std::exception which can be caught (eventually to call lua_error)
67
+
68
+ lua_Number dubL_checknumber(lua_State *L, int narg) throw(dub::TypeException);
69
+
70
+ lua_Number dubL_checkint(lua_State *L, int narg) throw(dub::TypeException);
71
+
72
+ const char *dubL_checklstring(lua_State *L, int narg, size_t *len) throw(dub::TypeException);
73
+
74
+ lua_Integer dubL_checkinteger(lua_State *L, int narg) throw(dub::TypeException);
75
+
76
+ void *dubL_checkudata(lua_State *L, int ud, const char *tname) throw(dub::TypeException);
77
+
78
+ // super aware userdata calls
79
+ void *dubL_checksdata(lua_State *L, int ud, const char *tname) throw(dub::TypeException);
80
+ // does not throw exceptions (can be used with a #define for luaL_checksdata)
81
+ void *dubL_checksdata_n(lua_State *L, int ud, const char *tname) throw();
82
+
83
+ #define dubL_checkstring(L,n) (dubL_checklstring(L, (n), NULL))
84
+ #define dubL_checkint(L,n) ((int)dubL_checkinteger(L, (n)))
85
+ // super aware userdata check (does not throw)
86
+ #define luaL_checksdata(L, u, t) (dubL_checksdata_n(L, u, t))
87
+
88
+ /** ======================================== lua_pushclass */
89
+
90
+ /** Push a custom type on the stack.
91
+ * Since the value is passed as a pointer, we assume it has been created
92
+ * using 'new' and Lua can safely call delete when it needs to garbage-
93
+ * -collect it.
94
+ */
95
+ template<class T>
96
+ void lua_pushclass(lua_State *L, T *ptr, const char *type_name) {
97
+ T **userdata = (T**)lua_newuserdata(L, sizeof(T*));
98
+ *userdata = ptr;
99
+
100
+ // the userdata is now on top of the stack
101
+
102
+ // set metatable (contains methods)
103
+ luaL_getmetatable(L, type_name);
104
+ lua_setmetatable(L, -2);
105
+ }
106
+
107
+ /** Push a custom type on the stack and give it the pointer to the userdata.
108
+ * Passing the userdata enables early deletion from some other thread (GUI)
109
+ * that safely invalidates the userdatum.
110
+ */
111
+ template<class T>
112
+ void lua_pushclass2(lua_State *L, T *ptr, const char *type_name) {
113
+ T **userdata = (T**)lua_newuserdata(L, sizeof(T*));
114
+ *userdata = ptr;
115
+
116
+ // store pointer in class so that it can set it to NULL on destroy with
117
+ // *userdata = NULL
118
+ ptr->set_userdata_ptr((void**)userdata);
119
+
120
+ // the userdata is now on top of the stack
121
+
122
+ // set metatable (contains methods)
123
+ luaL_getmetatable(L, type_name);
124
+ lua_setmetatable(L, -2);
125
+ }
126
+
127
+ /** Classes that can be deleted out of Lua should inherit from this class or
128
+ * implement 'set_userdata_ptr' (and manage the userdata_ptr...)
129
+ */
130
+ class DeletableOutOfLua {
131
+ void **userdata_ptr_;
132
+ public:
133
+ DeletableOutOfLua();
134
+
135
+ virtual ~DeletableOutOfLua();
136
+
137
+ virtual void dub_destroy();
138
+
139
+ /** @internal
140
+ */
141
+ void set_userdata_ptr(void **ptr);
142
+
143
+ protected:
144
+ /** MUST be called from the custom destructor.
145
+ */
146
+ void dub_cleanup();
147
+ };
148
+
149
+ /** Push a custom type on the stack.
150
+ * Since the value is passed by value, we have to allocate a copy
151
+ * using 'new' so that Lua can keep it.
152
+ */
153
+ template<class T>
154
+ void lua_pushclass(lua_State *L, T &val, const char *type_name) {
155
+ T *val_ptr = new T(val);
156
+ lua_pushclass<T>(L, val_ptr, type_name);
157
+ }
158
+
159
+ /** ======================================== DubArgPointer */
160
+
161
+ /** This class is a helper to provide pointer to data from
162
+ * Lua to C (but maybe it's not a good idea).
163
+ */
164
+ template<class T>
165
+ class DubArgPointer {
166
+ public:
167
+ DubArgPointer() : data(NULL) {}
168
+
169
+ ~DubArgPointer() {
170
+ if (data) free(data);
171
+ }
172
+
173
+ // TODO: we should have a hint on required sizes !
174
+ T *operator()(lua_State *L, int index) {
175
+ if (!lua_istable(L, index)) throw 1;
176
+
177
+ size_t size = lua_objlen(L, index);
178
+ if (size == 0) return NULL;
179
+
180
+ data = (T*)malloc(size * sizeof(T));
181
+ if (!data) throw 1;
182
+
183
+ for(size_t i=0; i < size; ++i) {
184
+ data[i] = get_value_at(L, index, i+1);
185
+ }
186
+ return data;
187
+ }
188
+
189
+ private:
190
+ T get_value_at(lua_State *L, int table_index, int index) {
191
+ lua_pushinteger(L, index + 1);
192
+ lua_gettable(L, index);
193
+ T value = luaL_checknumber(L, -1);
194
+ lua_pop(L, 1);
195
+ return value;
196
+ }
197
+
198
+ T *data;
199
+ };
200
+
201
+ /** ======================================== is_userdata */
202
+
203
+ bool is_userdata(lua_State *L, int index, const char *tname);
204
+
205
+ /** ======================================== register_constants */
206
+
207
+ typedef struct lua_constants_Reg {
208
+ const char *name;
209
+ double constant;
210
+ } lua_constants_Reg;
211
+
212
+ int libsize (const lua_constants_Reg *l);
213
+
214
+ void register_constants(lua_State *L, const char *name_space, const lua_constants_Reg *l);
215
+
216
+ // The metatable lives in libname.ClassName_
217
+ void register_mt(lua_State *L, const char *libname, const char *class_name);
218
+
219
+ #endif // DOXY_GENERATOR_LIB_DOXY_GENERATOR_INCLUDE_LUA_DOXY_HELPER_H_
@@ -0,0 +1,158 @@
1
+ /*
2
+ ==============================================================================
3
+
4
+ This file is part of the LUBYK project (http://lubyk.org)
5
+ Copyright (c) 2007-2011 by Gaspard Bucher (http://teti.ch).
6
+
7
+ ------------------------------------------------------------------------------
8
+
9
+ Permission is hereby granted, free of charge, to any person obtaining a copy
10
+ of this software and associated documentation files (the "Software"), to deal
11
+ in the Software without restriction, including without limitation the rights
12
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
+ copies of the Software, and to permit persons to whom the Software is
14
+ furnished to do so, subject to the following conditions:
15
+
16
+ The above copyright notice and this permission notice shall be included in
17
+ all copies or substantial portions of the Software.
18
+
19
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25
+ THE SOFTWARE.
26
+
27
+ ==============================================================================
28
+ */
29
+ #include "lua_object.h"
30
+ #include "lua_cpp_helper.h"
31
+
32
+ using namespace dub;
33
+
34
+ LuaObject::LuaObject() throw () :
35
+ lua_(NULL) {
36
+ }
37
+
38
+ int LuaObject::lua_init(lua_State *L, const char *type_name) throw() {
39
+ // ... <self> or new table
40
+ setupSuper(L); // creates self if there is no table (without a 'super' field)
41
+ // ... <self>.super = userdata
42
+ // ... <self> <udata>
43
+
44
+ setupMetatable(L, type_name);
45
+ // ... <self> <udata>
46
+
47
+ setupLuaThread(L);
48
+ // <self>
49
+ return 1;
50
+ }
51
+
52
+ void LuaObject::setupSuper(lua_State *L) throw() {
53
+ if (!lua_istable(L, -1)) {
54
+ lua_newtable(L);
55
+ }
56
+ // ... <self>
57
+ LuaObject **userdata = (LuaObject**)lua_newuserdata(L, sizeof(LuaObject*));
58
+ *userdata = this;
59
+ // ... <self> <udata>
60
+ lua_pushlstring(L, "super", 5);
61
+ // ... <self> <udata> <"super">
62
+ lua_pushvalue(L, -2);
63
+ // ... <self> <udata> <"super"> <udata>
64
+ lua_rawset(L, -4);
65
+ // self.super = udata
66
+ // ... <self> <udata>
67
+ }
68
+
69
+ void LuaObject::setupMetatable(lua_State *L, const char *type_name) throw() {
70
+ // set metatable
71
+ luaL_getmetatable(L, type_name);
72
+ // ... <self> <udata> <mt>
73
+ lua_pushvalue(L, -1);
74
+ // ... <self> <udata> <mt> <mt>
75
+ lua_setmetatable(L, -3);
76
+ // ... <self> <udata> <mt>
77
+ lua_setmetatable(L, -3);
78
+ // ... <self> <udata>
79
+ }
80
+
81
+ // dependency relationship:
82
+ // self.super ---> udata ---> fenv ---> thread ---> self
83
+ //
84
+ // Thanks to Robert G. Jakabosky for the idea to use lua_xmove
85
+ // instead of weak tables to store the function reference.
86
+ void LuaObject::setupLuaThread(lua_State *L) throw() {
87
+ // ... <self> <udata>
88
+ lua_getfenv(L, -1);
89
+ // ... <self> <udata> <env>
90
+ lua_pushstring(L, ".");
91
+ // ... <self> <udata> <env> "."
92
+ lua_rawget(L, -2); // <env>["."]
93
+ // ... <self> <udata> <env> <??>
94
+ if (!lua_rawequal(L, -1, -3)) {
95
+ // ... <self> <udata> <env> <nil>
96
+ // does not have it's own env table
97
+ lua_pop(L, 2);
98
+ // ... <self> <udata>
99
+ // Create env table
100
+ lua_newtable(L);
101
+ // ... <self> <udata> <env>
102
+ lua_pushstring(L, ".");
103
+ // ... <self> <udata> <env> "."
104
+ lua_pushvalue(L, -3);
105
+ // ... <self> <udata> <env> "." <udata>
106
+ lua_rawset(L, -3); // env["."] = udata
107
+ // ... <self> <udata> <env>
108
+ lua_pushvalue(L, -1);
109
+ // ... <self> <udata> <env> <env>
110
+ if (!lua_setfenv(L, -3)) {
111
+ luaL_error(L, "Could not set userdata env on '%s'.", lua_typename(L, lua_type(L, -3)));
112
+ }
113
+ // ... <self> <udata> <env>
114
+ } else {
115
+ // ... <self> <udata> <env> <self>
116
+ // has its own env table
117
+ lua_pop(L, 1);
118
+ // ... <self> <udata> <env>
119
+ }
120
+
121
+ // ... <self> <udata> <env>
122
+ if (lua_) {
123
+ // remove from env
124
+ luaL_unref(L, -1, thread_in_env_idx_);
125
+ }
126
+
127
+ lua_ = lua_newthread(L);
128
+ // ... <self> <udata> <env> <thread>
129
+
130
+ // Store the thread in the Thread/Socket's environment table so it is not GC too soon
131
+ thread_in_env_idx_ = luaL_ref(L, -2);
132
+ // ... <self> <udata> <env>
133
+
134
+ lua_pop(L, 2);
135
+ // ... <self>
136
+
137
+ // Transfer copies of <self> to thread stack
138
+ lua_pushvalue(L, -1);
139
+ // ... <self> <self>
140
+ lua_xmove(L, lua_, 1);
141
+ // ... <self>
142
+
143
+ // lua_ stack is now
144
+ // <self>
145
+
146
+ // L is now
147
+ // <self>
148
+ }
149
+
150
+ void LuaObject::pushLuaCallback(const char *method, int len) const {
151
+ // <self>
152
+ lua_pushlstring(lua_, method, len);
153
+ // <self> <"method">
154
+ lua_gettable(lua_, -2);
155
+ // <self> <?>
156
+ lua_pushvalue(lua_, 1);
157
+ // <self> <?> <self>
158
+ }
@@ -0,0 +1,69 @@
1
+ /*
2
+ ==============================================================================
3
+
4
+ This file is part of the LUBYK project (http://lubyk.org)
5
+ Copyright (c) 2007-2011 by Gaspard Bucher (http://teti.ch).
6
+
7
+ ------------------------------------------------------------------------------
8
+
9
+ Permission is hereby granted, free of charge, to any person obtaining a copy
10
+ of this software and associated documentation files (the "Software"), to deal
11
+ in the Software without restriction, including without limitation the rights
12
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
13
+ copies of the Software, and to permit persons to whom the Software is
14
+ furnished to do so, subject to the following conditions:
15
+
16
+ The above copyright notice and this permission notice shall be included in
17
+ all copies or substantial portions of the Software.
18
+
19
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
22
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
23
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
24
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25
+ THE SOFTWARE.
26
+
27
+ ==============================================================================
28
+ */
29
+ #ifndef INCLUDE_DUB_LUA_OBJECT_H_
30
+ #define INCLUDE_DUB_LUA_OBJECT_H_
31
+
32
+ namespace dub {
33
+ /** Calls a lua function back.
34
+ */
35
+ class LuaObject
36
+ {
37
+ public:
38
+ /** Prepare tables to work with the table based self idion.
39
+ * expects stack to be:
40
+ * ... self
41
+ * if self (last argument) is a table, it is used as self.
42
+ * Otherwise, a new table is created.
43
+ * The method leaves "self" on top of the stack, with self.super = this.
44
+ */
45
+ LuaObject() throw();
46
+
47
+ int lua_init(lua_State *L, const char *type_name) throw();
48
+
49
+ virtual ~LuaObject() {}
50
+
51
+ /** The caller should lock before calling this.
52
+ * TODO: The 'const' stuff is stupid: can't we remove it ?
53
+ */
54
+ void pushLuaCallback(const char *method, int len) const;
55
+
56
+ lua_State *lua_;
57
+
58
+ private:
59
+
60
+ int thread_in_env_idx_;
61
+
62
+ void setupSuper(lua_State *L) throw();
63
+ void setupMetatable(lua_State *L, const char *type_name) throw() ;
64
+ void setupLuaThread(lua_State *L) throw();
65
+ };
66
+
67
+ } // dub
68
+
69
+ #endif // INCLUDE_DUB_LUA_OBJECT_H_
@@ -0,0 +1,42 @@
1
+ #include "<%= @namespace.header %>"
2
+
3
+ #include "lua_cpp_helper.h"
4
+
5
+ using namespace <%= @namespace.name %>;
6
+
7
+ <% if @namespace.members; @namespace.members.each do |function| %>
8
+
9
+ <%= function %>
10
+
11
+ <% end; end %>
12
+
13
+ // Register namespace
14
+
15
+ static const struct luaL_Reg <%= @namespace.name %>_functions[] = {
16
+ <% if @namespace.has_functions? %>
17
+ <%= indent(functions_registration, 2) %>,
18
+ <% end %>
19
+ {NULL, NULL},
20
+ };
21
+
22
+ <% if @namespace.has_constants? %>
23
+ static const struct lua_constants_Reg <%= @namespace.name %>_namespace_constants[] = {
24
+ <%= indent(constants_registration, 2) %>,
25
+ {NULL, NULL},
26
+ };
27
+ <% end %>
28
+
29
+ #ifdef DUB_LUA_NO_OPEN
30
+ int luaload_<%= @namespace.lib_name %>(lua_State *L) {
31
+ #else
32
+ extern "C" int luaopen_<%= @namespace.lib_name %>(lua_State *L) {
33
+ #endif
34
+ // register functions
35
+ luaL_register(L, <%= @namespace.name.inspect %>, <%= @namespace.name %>_functions);
36
+
37
+ <% if @namespace.has_constants? %>
38
+ // register namespace enums
39
+ register_constants(L, <%= @namespace.id_name.inspect %>, <%= @namespace.name %>_namespace_constants);
40
+ <% end %>
41
+ return 0;
42
+ }
@@ -0,0 +1,69 @@
1
+ require 'dub/generator'
2
+ require 'erb'
3
+
4
+ module Dub
5
+ module Lua
6
+ class NamespaceGen < Dub::Generator
7
+ def initialize
8
+ @namespace_template = ::ERB.new(File.read(File.join(File.dirname(__FILE__), 'namespace.cpp.erb')))
9
+ end
10
+
11
+ def namespace(namespace)
12
+ @namespace = namespace
13
+ @namespace_template.result(binding)
14
+ end
15
+
16
+ def class_generator
17
+ Lua.class_generator
18
+ end
19
+
20
+ def function_generator
21
+ Lua.function_generator
22
+ end
23
+
24
+ def functions_registration(namespace = @namespace)
25
+ (namespace.members || []).map do |method|
26
+ "{%-32s, #{method.method_name(0)}}" % method.name.inspect
27
+ end.join(",\n")
28
+ end
29
+
30
+ def constants_registration(namespace = @namespace)
31
+ res = []
32
+ if namespace.has_enums?
33
+ res << namespace.enums.map do |name|
34
+ "{%-32s, #{namespace.full_type}::#{name}}" % name.inspect
35
+ end.join(",\n")
36
+ end
37
+
38
+ if namespace.has_defines?
39
+ res << namespace.defines.map do |name|
40
+ "{%-32s, #{name}}" % name.inspect
41
+ end.join(",\n")
42
+ end
43
+
44
+ same = namespace.enums & namespace.defines
45
+ unless same.empty?
46
+ # Should never happen (not sure if it would compile ok in the first place)
47
+ puts "Warning: the following are present both as enum and define: #{same.inspect}"
48
+ end
49
+ res.join(",\n\n")
50
+ end
51
+
52
+ def members_list(all_members)
53
+ all_members
54
+ #list = (all_members || []).map do |member_or_group|
55
+ # if member_or_group.kind_of?(Array)
56
+ # members_list(member_or_group)
57
+ # elsif ignore_member?(member_or_group)
58
+ # nil
59
+ # else
60
+ # member_or_group
61
+ # end
62
+ #end
63
+ #
64
+ #list.compact!
65
+ #list == [] ? nil : list
66
+ end
67
+ end
68
+ end
69
+ end
data/lib/dub/lua.rb ADDED
@@ -0,0 +1,24 @@
1
+ require 'dub/lua/function_gen'
2
+ require 'dub/lua/namespace_gen'
3
+ require 'dub/lua/class_gen'
4
+
5
+ module Dub
6
+ module Lua
7
+ def self.function_generator
8
+ @@function_generator ||= Dub::Lua::FunctionGen.new
9
+ end
10
+
11
+ def self.class_generator
12
+ @@class_generator ||= Dub::Lua::ClassGen.new
13
+ end
14
+
15
+ def self.namespace_generator
16
+ @@namespace_generator ||= Dub::Lua::NamespaceGen.new
17
+ end
18
+
19
+ def self.bind(object)
20
+ object.bind(self)
21
+ object
22
+ end
23
+ end # Lua
24
+ end # Dub