rufus-lua-win 5.1.5

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.
Files changed (459) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/Gemfile +4 -0
  4. data/LICENSE.txt +22 -0
  5. data/README.md +69 -0
  6. data/Rakefile +1 -0
  7. data/lib/rufus/lua/win.rb +18 -0
  8. data/lib/rufus/lua/win/version.rb +7 -0
  9. data/rufus-lua-win.gemspec +23 -0
  10. data/vendor/lua/bin/liblua.dll +0 -0
  11. data/vendor/lua/lib/lua/LuaXml.lua +119 -0
  12. data/vendor/lua/lib/lua/alien.lua +250 -0
  13. data/vendor/lua/lib/lua/alien/core.dll +0 -0
  14. data/vendor/lua/lib/lua/alien/struct.dll +0 -0
  15. data/vendor/lua/lib/lua/base.lua +536 -0
  16. data/vendor/lua/lib/lua/bin.lua +20 -0
  17. data/vendor/lua/lib/lua/bit.dll +0 -0
  18. data/vendor/lua/lib/lua/cdlua.dll +0 -0
  19. data/vendor/lua/lib/lua/cdluacontextplus.dll +0 -0
  20. data/vendor/lua/lib/lua/cdluagl.dll +0 -0
  21. data/vendor/lua/lib/lua/cdluaim.dll +0 -0
  22. data/vendor/lua/lib/lua/cdluapdf.dll +0 -0
  23. data/vendor/lua/lib/lua/copas.lua +543 -0
  24. data/vendor/lua/lib/lua/coxpcall.lua +57 -0
  25. data/vendor/lua/lib/lua/date.lua +745 -0
  26. data/vendor/lua/lib/lua/debug_ext.lua +84 -0
  27. data/vendor/lua/lib/lua/debug_init.lua +2 -0
  28. data/vendor/lua/lib/lua/des56.dll +0 -0
  29. data/vendor/lua/lib/lua/dist/config.lua +109 -0
  30. data/vendor/lua/lib/lua/dist/constraints.lua +271 -0
  31. data/vendor/lua/lib/lua/dist/depends.lua +601 -0
  32. data/vendor/lua/lib/lua/dist/git.lua +307 -0
  33. data/vendor/lua/lib/lua/dist/init.lua +278 -0
  34. data/vendor/lua/lib/lua/dist/manifest.lua +225 -0
  35. data/vendor/lua/lib/lua/dist/package.lua +583 -0
  36. data/vendor/lua/lib/lua/dist/sys.lua +367 -0
  37. data/vendor/lua/lib/lua/dist/utils.lua +130 -0
  38. data/vendor/lua/lib/lua/ex.dll +0 -0
  39. data/vendor/lua/lib/lua/fstable.lua +116 -0
  40. data/vendor/lua/lib/lua/getopt.lua +273 -0
  41. data/vendor/lua/lib/lua/git.lua +5 -0
  42. data/vendor/lua/lib/lua/git/core.dll +0 -0
  43. data/vendor/lua/lib/lua/git/objects.lua +121 -0
  44. data/vendor/lua/lib/lua/git/pack.lua +316 -0
  45. data/vendor/lua/lib/lua/git/protocol.lua +188 -0
  46. data/vendor/lua/lib/lua/git/repo.lua +283 -0
  47. data/vendor/lua/lib/lua/git/util.lua +233 -0
  48. data/vendor/lua/lib/lua/gzio.dll +0 -0
  49. data/vendor/lua/lib/lua/gzip.lua +81 -0
  50. data/vendor/lua/lib/lua/iconv.dll +0 -0
  51. data/vendor/lua/lib/lua/imlua.dll +0 -0
  52. data/vendor/lua/lib/lua/imlua_fftw.dll +0 -0
  53. data/vendor/lua/lib/lua/imlua_jp2.dll +0 -0
  54. data/vendor/lua/lib/lua/imlua_process.dll +0 -0
  55. data/vendor/lua/lib/lua/imlua_process_omp.dll +0 -0
  56. data/vendor/lua/lib/lua/io_ext.lua +115 -0
  57. data/vendor/lua/lib/lua/iuplua.dll +0 -0
  58. data/vendor/lua/lib/lua/iuplua_mglplot.dll +0 -0
  59. data/vendor/lua/lib/lua/iuplua_pplot.dll +0 -0
  60. data/vendor/lua/lib/lua/iupluacd.dll +0 -0
  61. data/vendor/lua/lib/lua/iupluacontrols.dll +0 -0
  62. data/vendor/lua/lib/lua/iupluagl.dll +0 -0
  63. data/vendor/lua/lib/lua/iupluaim.dll +0 -0
  64. data/vendor/lua/lib/lua/iupluaimglib.dll +0 -0
  65. data/vendor/lua/lib/lua/iupluatuio.dll +0 -0
  66. data/vendor/lua/lib/lua/lanes-keeper.lua +302 -0
  67. data/vendor/lua/lib/lua/lanes.lua +591 -0
  68. data/vendor/lua/lib/lua/lanes/core.dll +0 -0
  69. data/vendor/lua/lib/lua/lcs.lua +55 -0
  70. data/vendor/lua/lib/lua/lemock.lua +659 -0
  71. data/vendor/lua/lib/lua/lfs.dll +0 -0
  72. data/vendor/lua/lib/lua/list.lua +375 -0
  73. data/vendor/lua/lib/lua/logging.lua +189 -0
  74. data/vendor/lua/lib/lua/logging/console.lua +22 -0
  75. data/vendor/lua/lib/lua/logging/email.lua +44 -0
  76. data/vendor/lua/lib/lua/logging/file.lua +55 -0
  77. data/vendor/lua/lib/lua/logging/rolling_file.lua +81 -0
  78. data/vendor/lua/lib/lua/logging/socket.lua +35 -0
  79. data/vendor/lua/lib/lua/logging/sql.lua +64 -0
  80. data/vendor/lua/lib/lua/loop/base.lua +68 -0
  81. data/vendor/lua/lib/lua/loop/cached.lua +312 -0
  82. data/vendor/lua/lib/lua/loop/collection/MapWithArrayOfKeys.lua +64 -0
  83. data/vendor/lua/lib/lua/loop/collection/ObjectCache.lua +39 -0
  84. data/vendor/lua/lib/lua/loop/collection/OrderedSet.lua +164 -0
  85. data/vendor/lua/lib/lua/loop/collection/PriorityQueue.lua +86 -0
  86. data/vendor/lua/lib/lua/loop/collection/UnorderedArray.lua +32 -0
  87. data/vendor/lua/lib/lua/loop/collection/UnorderedArraySet.lua +56 -0
  88. data/vendor/lua/lib/lua/loop/compiler/Arguments.lua +108 -0
  89. data/vendor/lua/lib/lua/loop/compiler/Conditional.lua +50 -0
  90. data/vendor/lua/lib/lua/loop/compiler/Expression.lua +215 -0
  91. data/vendor/lua/lib/lua/loop/component/base.lua +221 -0
  92. data/vendor/lua/lib/lua/loop/component/contained.lua +71 -0
  93. data/vendor/lua/lib/lua/loop/component/dynamic.lua +223 -0
  94. data/vendor/lua/lib/lua/loop/component/intercepted.lua +354 -0
  95. data/vendor/lua/lib/lua/loop/component/wrapped.lua +195 -0
  96. data/vendor/lua/lib/lua/loop/debug/Inspector.lua +521 -0
  97. data/vendor/lua/lib/lua/loop/debug/Matcher.lua +192 -0
  98. data/vendor/lua/lib/lua/loop/debug/Verbose.lua +266 -0
  99. data/vendor/lua/lib/lua/loop/debug/Viewer.lua +200 -0
  100. data/vendor/lua/lib/lua/loop/multiple.lua +105 -0
  101. data/vendor/lua/lib/lua/loop/object/Exception.lua +57 -0
  102. data/vendor/lua/lib/lua/loop/object/Publisher.lua +43 -0
  103. data/vendor/lua/lib/lua/loop/object/Wrapper.lua +39 -0
  104. data/vendor/lua/lib/lua/loop/scoped.lua +585 -0
  105. data/vendor/lua/lib/lua/loop/serial/FileStream.lua +48 -0
  106. data/vendor/lua/lib/lua/loop/serial/Serializer.lua +291 -0
  107. data/vendor/lua/lib/lua/loop/serial/SocketStream.lua +51 -0
  108. data/vendor/lua/lib/lua/loop/serial/StringStream.lua +47 -0
  109. data/vendor/lua/lib/lua/loop/simple.lua +75 -0
  110. data/vendor/lua/lib/lua/loop/table.lua +71 -0
  111. data/vendor/lua/lib/lua/loop/thread/CoSocket.lua +416 -0
  112. data/vendor/lua/lib/lua/loop/thread/IOScheduler.lua +170 -0
  113. data/vendor/lua/lib/lua/loop/thread/Scheduler.lua +327 -0
  114. data/vendor/lua/lib/lua/loop/thread/SocketScheduler.lua +88 -0
  115. data/vendor/lua/lib/lua/loop/thread/Timer.lua +54 -0
  116. data/vendor/lua/lib/lua/lpeg.dll +0 -0
  117. data/vendor/lua/lib/lua/ltn12.lua +292 -0
  118. data/vendor/lua/lib/lua/luaXML_lib.dll +0 -0
  119. data/vendor/lua/lib/lua/luacurl.dll +0 -0
  120. data/vendor/lua/lib/lua/luadoc/config.lua +34 -0
  121. data/vendor/lua/lib/lua/luadoc/doclet/debug.lua +46 -0
  122. data/vendor/lua/lib/lua/luadoc/doclet/formatter.lua +84 -0
  123. data/vendor/lua/lib/lua/luadoc/doclet/html.lua +289 -0
  124. data/vendor/lua/lib/lua/luadoc/doclet/html/file.lp +113 -0
  125. data/vendor/lua/lib/lua/luadoc/doclet/html/function.lp +64 -0
  126. data/vendor/lua/lib/lua/luadoc/doclet/html/index.lp +70 -0
  127. data/vendor/lua/lib/lua/luadoc/doclet/html/luadoc.css +286 -0
  128. data/vendor/lua/lib/lua/luadoc/doclet/html/menu.lp +55 -0
  129. data/vendor/lua/lib/lua/luadoc/doclet/html/module.lp +109 -0
  130. data/vendor/lua/lib/lua/luadoc/doclet/html/table.lp +15 -0
  131. data/vendor/lua/lib/lua/luadoc/doclet/raw.lua +12 -0
  132. data/vendor/lua/lib/lua/luadoc/init.lua +58 -0
  133. data/vendor/lua/lib/lua/luadoc/lp.lua +130 -0
  134. data/vendor/lua/lib/lua/luadoc/taglet/standard.lua +495 -0
  135. data/vendor/lua/lib/lua/luadoc/taglet/standard/tags.lua +171 -0
  136. data/vendor/lua/lib/lua/luadoc/util.lua +233 -0
  137. data/vendor/lua/lib/lua/luagl.dll +0 -0
  138. data/vendor/lua/lib/lua/luaglu.dll +0 -0
  139. data/vendor/lua/lib/lua/luaidl.lua +113 -0
  140. data/vendor/lua/lib/lua/luaidl/lex.lua +793 -0
  141. data/vendor/lua/lib/lua/luaidl/pre.lua +149 -0
  142. data/vendor/lua/lib/lua/luaidl/sin.lua +3631 -0
  143. data/vendor/lua/lib/lua/luarocks/add.lua +108 -0
  144. data/vendor/lua/lib/lua/luarocks/admin_remove.lua +87 -0
  145. data/vendor/lua/lib/lua/luarocks/build.lua +330 -0
  146. data/vendor/lua/lib/lua/luarocks/build/builtin.lua +253 -0
  147. data/vendor/lua/lib/lua/luarocks/build/cmake.lua +54 -0
  148. data/vendor/lua/lib/lua/luarocks/build/command.lua +32 -0
  149. data/vendor/lua/lib/lua/luarocks/build/make.lua +92 -0
  150. data/vendor/lua/lib/lua/luarocks/cache.lua +85 -0
  151. data/vendor/lua/lib/lua/luarocks/cfg.lua +449 -0
  152. data/vendor/lua/lib/lua/luarocks/command_line.lua +163 -0
  153. data/vendor/lua/lib/lua/luarocks/deps.lua +654 -0
  154. data/vendor/lua/lib/lua/luarocks/dir.lua +69 -0
  155. data/vendor/lua/lib/lua/luarocks/download.lua +90 -0
  156. data/vendor/lua/lib/lua/luarocks/fetch.lua +321 -0
  157. data/vendor/lua/lib/lua/luarocks/fetch/cvs.lua +44 -0
  158. data/vendor/lua/lib/lua/luarocks/fetch/git.lua +81 -0
  159. data/vendor/lua/lib/lua/luarocks/fetch/git_file.lua +17 -0
  160. data/vendor/lua/lib/lua/luarocks/fetch/hg.lua +54 -0
  161. data/vendor/lua/lib/lua/luarocks/fetch/sscm.lua +42 -0
  162. data/vendor/lua/lib/lua/luarocks/fetch/svn.lua +53 -0
  163. data/vendor/lua/lib/lua/luarocks/fs.lua +40 -0
  164. data/vendor/lua/lib/lua/luarocks/fs/lua.lua +676 -0
  165. data/vendor/lua/lib/lua/luarocks/fs/unix.lua +88 -0
  166. data/vendor/lua/lib/lua/luarocks/fs/unix/tools.lua +325 -0
  167. data/vendor/lua/lib/lua/luarocks/fs/win32.lua +107 -0
  168. data/vendor/lua/lib/lua/luarocks/fs/win32/tools.lua +334 -0
  169. data/vendor/lua/lib/lua/luarocks/help.lua +101 -0
  170. data/vendor/lua/lib/lua/luarocks/index.lua +172 -0
  171. data/vendor/lua/lib/lua/luarocks/install.lua +151 -0
  172. data/vendor/lua/lib/lua/luarocks/list.lua +35 -0
  173. data/vendor/lua/lib/lua/luarocks/loader.lua +228 -0
  174. data/vendor/lua/lib/lua/luarocks/make.lua +71 -0
  175. data/vendor/lua/lib/lua/luarocks/make_manifest.lua +34 -0
  176. data/vendor/lua/lib/lua/luarocks/manif.lua +360 -0
  177. data/vendor/lua/lib/lua/luarocks/manif_core.lua +75 -0
  178. data/vendor/lua/lib/lua/luarocks/new_version.lua +141 -0
  179. data/vendor/lua/lib/lua/luarocks/pack.lua +205 -0
  180. data/vendor/lua/lib/lua/luarocks/path.lua +315 -0
  181. data/vendor/lua/lib/lua/luarocks/persist.lua +173 -0
  182. data/vendor/lua/lib/lua/luarocks/refresh_cache.lua +30 -0
  183. data/vendor/lua/lib/lua/luarocks/remove.lua +135 -0
  184. data/vendor/lua/lib/lua/luarocks/rep.lua +313 -0
  185. data/vendor/lua/lib/lua/luarocks/require.lua +6 -0
  186. data/vendor/lua/lib/lua/luarocks/search.lua +399 -0
  187. data/vendor/lua/lib/lua/luarocks/show.lua +138 -0
  188. data/vendor/lua/lib/lua/luarocks/site_config.lua +23 -0
  189. data/vendor/lua/lib/lua/luarocks/tools/patch.lua +712 -0
  190. data/vendor/lua/lib/lua/luarocks/tools/tar.lua +144 -0
  191. data/vendor/lua/lib/lua/luarocks/tools/zip.lua +245 -0
  192. data/vendor/lua/lib/lua/luarocks/type_check.lua +267 -0
  193. data/vendor/lua/lib/lua/luarocks/unpack.lua +151 -0
  194. data/vendor/lua/lib/lua/luarocks/util.lua +420 -0
  195. data/vendor/lua/lib/lua/luarocks/validate.lua +164 -0
  196. data/vendor/lua/lib/lua/luars232.dll +0 -0
  197. data/vendor/lua/lib/lua/luasql/mysql.dll +0 -0
  198. data/vendor/lua/lib/lua/luasql/postgres.dll +0 -0
  199. data/vendor/lua/lib/lua/luasql/sqlite3.dll +0 -0
  200. data/vendor/lua/lib/lua/luaunit.lua +601 -0
  201. data/vendor/lua/lib/lua/lxp.dll +0 -0
  202. data/vendor/lua/lib/lua/lxp/lom.lua +60 -0
  203. data/vendor/lua/lib/lua/math_ext.lua +27 -0
  204. data/vendor/lua/lib/lua/mbox.lua +53 -0
  205. data/vendor/lua/lib/lua/md5.lua +19 -0
  206. data/vendor/lua/lib/lua/md5/core.dll +0 -0
  207. data/vendor/lua/lib/lua/metalua.lua +0 -0
  208. data/vendor/lua/lib/lua/metalua/ast_to_string.mlua +553 -0
  209. data/vendor/lua/lib/lua/metalua/base.lua +104 -0
  210. data/vendor/lua/lib/lua/metalua/bytecode.lua +0 -0
  211. data/vendor/lua/lib/lua/metalua/clopts.mlua +204 -0
  212. data/vendor/lua/lib/lua/metalua/compiler.lua +3 -0
  213. data/vendor/lua/lib/lua/metalua/dollar.mlua +24 -0
  214. data/vendor/lua/lib/lua/metalua/extension/H-runtime.mlua +216 -0
  215. data/vendor/lua/lib/lua/metalua/extension/H.mlua +22 -0
  216. data/vendor/lua/lib/lua/metalua/extension/anaphoric.mlua +54 -0
  217. data/vendor/lua/lib/lua/metalua/extension/clist.mlua +149 -0
  218. data/vendor/lua/lib/lua/metalua/extension/continue.mlua +53 -0
  219. data/vendor/lua/lib/lua/metalua/extension/localin.mlua +2 -0
  220. data/vendor/lua/lib/lua/metalua/extension/log.mlua +39 -0
  221. data/vendor/lua/lib/lua/metalua/extension/match.mlua +374 -0
  222. data/vendor/lua/lib/lua/metalua/extension/ternary.mlua +10 -0
  223. data/vendor/lua/lib/lua/metalua/extension/trycatch.mlua +189 -0
  224. data/vendor/lua/lib/lua/metalua/extension/types-runtime.mlua +159 -0
  225. data/vendor/lua/lib/lua/metalua/extension/types.mlua +352 -0
  226. data/vendor/lua/lib/lua/metalua/extension/withdo.mlua +30 -0
  227. data/vendor/lua/lib/lua/metalua/extension/xglobal-runtime.lua +41 -0
  228. data/vendor/lua/lib/lua/metalua/extension/xglobal.mlua +20 -0
  229. data/vendor/lua/lib/lua/metalua/extension/xloop.mlua +100 -0
  230. data/vendor/lua/lib/lua/metalua/extension/xmatch.mlua +216 -0
  231. data/vendor/lua/lib/lua/metalua/metaloop.mlua +76 -0
  232. data/vendor/lua/lib/lua/metalua/mlc.lua +0 -0
  233. data/vendor/lua/lib/lua/metalua/mlc_xcall.lua +119 -0
  234. data/vendor/lua/lib/lua/metalua/mlp.lua +0 -0
  235. data/vendor/lua/lib/lua/metalua/package2.lua +101 -0
  236. data/vendor/lua/lib/lua/metalua/runtime.lua +3 -0
  237. data/vendor/lua/lib/lua/metalua/string2.lua +44 -0
  238. data/vendor/lua/lib/lua/metalua/table2.lua +372 -0
  239. data/vendor/lua/lib/lua/metalua/walk.mlua +304 -0
  240. data/vendor/lua/lib/lua/metalua/walk/bindings.mlua +41 -0
  241. data/vendor/lua/lib/lua/metalua/walk/id.mlua +186 -0
  242. data/vendor/lua/lib/lua/metalua/walk/scope.lua +54 -0
  243. data/vendor/lua/lib/lua/mime.lua +87 -0
  244. data/vendor/lua/lib/lua/mime/core.dll +0 -0
  245. data/vendor/lua/lib/lua/mobdebug.lua +1484 -0
  246. data/vendor/lua/lib/lua/modules.lua +16 -0
  247. data/vendor/lua/lib/lua/object.lua +56 -0
  248. data/vendor/lua/lib/lua/oil/Exception.lua +26 -0
  249. data/vendor/lua/lib/lua/oil/arch.lua +27 -0
  250. data/vendor/lua/lib/lua/oil/arch/basic/client.lua +29 -0
  251. data/vendor/lua/lib/lua/oil/arch/basic/common.lua +13 -0
  252. data/vendor/lua/lib/lua/oil/arch/basic/server.lua +27 -0
  253. data/vendor/lua/lib/lua/oil/arch/cooperative/common.lua +10 -0
  254. data/vendor/lua/lib/lua/oil/arch/cooperative/server.lua +16 -0
  255. data/vendor/lua/lib/lua/oil/arch/corba/client.lua +39 -0
  256. data/vendor/lua/lib/lua/oil/arch/corba/common.lua +58 -0
  257. data/vendor/lua/lib/lua/oil/arch/corba/intercepted/client.lua +9 -0
  258. data/vendor/lua/lib/lua/oil/arch/corba/intercepted/server.lua +9 -0
  259. data/vendor/lua/lib/lua/oil/arch/corba/server.lua +35 -0
  260. data/vendor/lua/lib/lua/oil/arch/ludo/byref.lua +18 -0
  261. data/vendor/lua/lib/lua/oil/arch/ludo/client.lua +19 -0
  262. data/vendor/lua/lib/lua/oil/arch/ludo/common.lua +18 -0
  263. data/vendor/lua/lib/lua/oil/arch/ludo/server.lua +19 -0
  264. data/vendor/lua/lib/lua/oil/arch/typed/client.lua +27 -0
  265. data/vendor/lua/lib/lua/oil/arch/typed/common.lua +9 -0
  266. data/vendor/lua/lib/lua/oil/arch/typed/server.lua +18 -0
  267. data/vendor/lua/lib/lua/oil/assert.lua +87 -0
  268. data/vendor/lua/lib/lua/oil/builder.lua +45 -0
  269. data/vendor/lua/lib/lua/oil/builder/basic/client.lua +31 -0
  270. data/vendor/lua/lib/lua/oil/builder/basic/common.lua +11 -0
  271. data/vendor/lua/lib/lua/oil/builder/basic/server.lua +13 -0
  272. data/vendor/lua/lib/lua/oil/builder/cooperative/common.lua +11 -0
  273. data/vendor/lua/lib/lua/oil/builder/cooperative/server.lua +11 -0
  274. data/vendor/lua/lib/lua/oil/builder/corba/client.lua +13 -0
  275. data/vendor/lua/lib/lua/oil/builder/corba/common.lua +24 -0
  276. data/vendor/lua/lib/lua/oil/builder/corba/gencode.lua +13 -0
  277. data/vendor/lua/lib/lua/oil/builder/corba/intercepted/client.lua +11 -0
  278. data/vendor/lua/lib/lua/oil/builder/corba/intercepted/server.lua +11 -0
  279. data/vendor/lua/lib/lua/oil/builder/corba/server.lua +13 -0
  280. data/vendor/lua/lib/lua/oil/builder/lua/client.lua +11 -0
  281. data/vendor/lua/lib/lua/oil/builder/lua/server.lua +12 -0
  282. data/vendor/lua/lib/lua/oil/builder/ludo/byref.lua +13 -0
  283. data/vendor/lua/lib/lua/oil/builder/ludo/client.lua +13 -0
  284. data/vendor/lua/lib/lua/oil/builder/ludo/common.lua +14 -0
  285. data/vendor/lua/lib/lua/oil/builder/ludo/server.lua +13 -0
  286. data/vendor/lua/lib/lua/oil/builder/typed/client.lua +16 -0
  287. data/vendor/lua/lib/lua/oil/builder/typed/server.lua +12 -0
  288. data/vendor/lua/lib/lua/oil/compat.lua +846 -0
  289. data/vendor/lua/lib/lua/oil/component.lua +1 -0
  290. data/vendor/lua/lib/lua/oil/corba/giop.lua +301 -0
  291. data/vendor/lua/lib/lua/oil/corba/giop/Codec.lua +1568 -0
  292. data/vendor/lua/lib/lua/oil/corba/giop/CodecGen.lua +589 -0
  293. data/vendor/lua/lib/lua/oil/corba/giop/Exception.lua +25 -0
  294. data/vendor/lua/lib/lua/oil/corba/giop/Indexer.lua +63 -0
  295. data/vendor/lua/lib/lua/oil/corba/giop/Listener.lua +343 -0
  296. data/vendor/lua/lib/lua/oil/corba/giop/Messenger.lua +228 -0
  297. data/vendor/lua/lib/lua/oil/corba/giop/Referrer.lua +180 -0
  298. data/vendor/lua/lib/lua/oil/corba/giop/Requester.lua +462 -0
  299. data/vendor/lua/lib/lua/oil/corba/idl.lua +597 -0
  300. data/vendor/lua/lib/lua/oil/corba/idl/Compiler.lua +133 -0
  301. data/vendor/lua/lib/lua/oil/corba/idl/Importer.lua +235 -0
  302. data/vendor/lua/lib/lua/oil/corba/idl/Indexer.lua +95 -0
  303. data/vendor/lua/lib/lua/oil/corba/idl/Registry.lua +1821 -0
  304. data/vendor/lua/lib/lua/oil/corba/idl/ir.lua +847 -0
  305. data/vendor/lua/lib/lua/oil/corba/idl/sysex.lua +21 -0
  306. data/vendor/lua/lib/lua/oil/corba/iiop/Profiler.lua +200 -0
  307. data/vendor/lua/lib/lua/oil/corba/intercepted/Listener.lua +158 -0
  308. data/vendor/lua/lib/lua/oil/corba/intercepted/Requester.lua +181 -0
  309. data/vendor/lua/lib/lua/oil/corba/services/event.lua +126 -0
  310. data/vendor/lua/lib/lua/oil/corba/services/event/ConsumerAdmin.lua +50 -0
  311. data/vendor/lua/lib/lua/oil/corba/services/event/EventFactory.lua +15 -0
  312. data/vendor/lua/lib/lua/oil/corba/services/event/EventQueue.lua +37 -0
  313. data/vendor/lua/lib/lua/oil/corba/services/event/ProxyPushConsumer.lua +75 -0
  314. data/vendor/lua/lib/lua/oil/corba/services/event/ProxyPushSupplier.lua +62 -0
  315. data/vendor/lua/lib/lua/oil/corba/services/event/SingleDeferredDispatcher.lua +60 -0
  316. data/vendor/lua/lib/lua/oil/corba/services/event/SingleSynchronousDispatcher.lua +39 -0
  317. data/vendor/lua/lib/lua/oil/corba/services/event/SupplierAdmin.lua +50 -0
  318. data/vendor/lua/lib/lua/oil/corba/services/naming.lua +436 -0
  319. data/vendor/lua/lib/lua/oil/kernel/base/Acceptor.lua +268 -0
  320. data/vendor/lua/lib/lua/oil/kernel/base/Channels.lua +121 -0
  321. data/vendor/lua/lib/lua/oil/kernel/base/Connector.lua +147 -0
  322. data/vendor/lua/lib/lua/oil/kernel/base/Dispatcher.lua +99 -0
  323. data/vendor/lua/lib/lua/oil/kernel/base/Proxies.lua +86 -0
  324. data/vendor/lua/lib/lua/oil/kernel/base/Proxies/asynchronous.lua +56 -0
  325. data/vendor/lua/lib/lua/oil/kernel/base/Proxies/protected.lua +17 -0
  326. data/vendor/lua/lib/lua/oil/kernel/base/Proxies/synchronous.lua +17 -0
  327. data/vendor/lua/lib/lua/oil/kernel/base/Proxies/utils.lua +29 -0
  328. data/vendor/lua/lib/lua/oil/kernel/base/Receiver.lua +110 -0
  329. data/vendor/lua/lib/lua/oil/kernel/base/Servants.lua +207 -0
  330. data/vendor/lua/lib/lua/oil/kernel/base/Sockets.lua +44 -0
  331. data/vendor/lua/lib/lua/oil/kernel/cooperative/Receiver.lua +139 -0
  332. data/vendor/lua/lib/lua/oil/kernel/intercepted/Listener.lua +47 -0
  333. data/vendor/lua/lib/lua/oil/kernel/intercepted/Requester.lua +58 -0
  334. data/vendor/lua/lib/lua/oil/kernel/lua/Dispatcher.lua +76 -0
  335. data/vendor/lua/lib/lua/oil/kernel/lua/Proxies.lua +69 -0
  336. data/vendor/lua/lib/lua/oil/kernel/typed/Dispatcher.lua +91 -0
  337. data/vendor/lua/lib/lua/oil/kernel/typed/Proxies.lua +153 -0
  338. data/vendor/lua/lib/lua/oil/kernel/typed/Servants.lua +137 -0
  339. data/vendor/lua/lib/lua/oil/ludo/Codec.lua +66 -0
  340. data/vendor/lua/lib/lua/oil/ludo/CodecByRef.lua +103 -0
  341. data/vendor/lua/lib/lua/oil/ludo/Listener.lua +151 -0
  342. data/vendor/lua/lib/lua/oil/ludo/Referrer.lua +72 -0
  343. data/vendor/lua/lib/lua/oil/ludo/Requester.lua +107 -0
  344. data/vendor/lua/lib/lua/oil/oo.lua +1 -0
  345. data/vendor/lua/lib/lua/oil/port.lua +1 -0
  346. data/vendor/lua/lib/lua/oil/properties.lua +57 -0
  347. data/vendor/lua/lib/lua/oil/verbose.lua +133 -0
  348. data/vendor/lua/lib/lua/package_ext.lua +15 -0
  349. data/vendor/lua/lib/lua/parser.lua +268 -0
  350. data/vendor/lua/lib/lua/pl/Date.lua +555 -0
  351. data/vendor/lua/lib/lua/pl/List.lua +613 -0
  352. data/vendor/lua/lib/lua/pl/Map.lua +113 -0
  353. data/vendor/lua/lib/lua/pl/MultiMap.lua +62 -0
  354. data/vendor/lua/lib/lua/pl/OrderedMap.lua +151 -0
  355. data/vendor/lua/lib/lua/pl/Set.lua +153 -0
  356. data/vendor/lua/lib/lua/pl/app.lua +165 -0
  357. data/vendor/lua/lib/lua/pl/array2d.lua +501 -0
  358. data/vendor/lua/lib/lua/pl/class.lua +180 -0
  359. data/vendor/lua/lib/lua/pl/comprehension.lua +286 -0
  360. data/vendor/lua/lib/lua/pl/config.lua +176 -0
  361. data/vendor/lua/lib/lua/pl/data.lua +606 -0
  362. data/vendor/lua/lib/lua/pl/dir.lua +475 -0
  363. data/vendor/lua/lib/lua/pl/file.lua +70 -0
  364. data/vendor/lua/lib/lua/pl/func.lua +376 -0
  365. data/vendor/lua/lib/lua/pl/init.lua +68 -0
  366. data/vendor/lua/lib/lua/pl/input.lua +173 -0
  367. data/vendor/lua/lib/lua/pl/lapp.lua +407 -0
  368. data/vendor/lua/lib/lua/pl/lexer.lua +456 -0
  369. data/vendor/lua/lib/lua/pl/luabalanced.lua +264 -0
  370. data/vendor/lua/lib/lua/pl/operator.lua +201 -0
  371. data/vendor/lua/lib/lua/pl/path.lua +398 -0
  372. data/vendor/lua/lib/lua/pl/permute.lua +63 -0
  373. data/vendor/lua/lib/lua/pl/platf/luajava.lua +101 -0
  374. data/vendor/lua/lib/lua/pl/pretty.lua +285 -0
  375. data/vendor/lua/lib/lua/pl/seq.lua +551 -0
  376. data/vendor/lua/lib/lua/pl/sip.lua +344 -0
  377. data/vendor/lua/lib/lua/pl/strict.lua +70 -0
  378. data/vendor/lua/lib/lua/pl/stringio.lua +158 -0
  379. data/vendor/lua/lib/lua/pl/stringx.lua +440 -0
  380. data/vendor/lua/lib/lua/pl/tablex.lua +817 -0
  381. data/vendor/lua/lib/lua/pl/template.lua +103 -0
  382. data/vendor/lua/lib/lua/pl/test.lua +135 -0
  383. data/vendor/lua/lib/lua/pl/text.lua +243 -0
  384. data/vendor/lua/lib/lua/pl/utils.lua +550 -0
  385. data/vendor/lua/lib/lua/pl/xml.lua +689 -0
  386. data/vendor/lua/lib/lua/profiler.dll +0 -0
  387. data/vendor/lua/lib/lua/re.lua +248 -0
  388. data/vendor/lua/lib/lua/rex_onig.dll +0 -0
  389. data/vendor/lua/lib/lua/rex_pcre.dll +0 -0
  390. data/vendor/lua/lib/lua/rex_posix.dll +0 -0
  391. data/vendor/lua/lib/lua/rings.dll +0 -0
  392. data/vendor/lua/lib/lua/serialize.lua +193 -0
  393. data/vendor/lua/lib/lua/set.lua +149 -0
  394. data/vendor/lua/lib/lua/socket.lua +133 -0
  395. data/vendor/lua/lib/lua/socket/core.dll +0 -0
  396. data/vendor/lua/lib/lua/socket/ftp.lua +281 -0
  397. data/vendor/lua/lib/lua/socket/http.lua +350 -0
  398. data/vendor/lua/lib/lua/socket/smtp.lua +251 -0
  399. data/vendor/lua/lib/lua/socket/tp.lua +123 -0
  400. data/vendor/lua/lib/lua/socket/url.lua +297 -0
  401. data/vendor/lua/lib/lua/ssl.dll +0 -0
  402. data/vendor/lua/lib/lua/ssl.lua +93 -0
  403. data/vendor/lua/lib/lua/ssl/https.lua +138 -0
  404. data/vendor/lua/lib/lua/stable.lua +28 -0
  405. data/vendor/lua/lib/lua/std.lua +16 -0
  406. data/vendor/lua/lib/lua/strbuf.lua +32 -0
  407. data/vendor/lua/lib/lua/strict.lua +45 -0
  408. data/vendor/lua/lib/lua/string_ext.lua +274 -0
  409. data/vendor/lua/lib/lua/table_ext.lua +117 -0
  410. data/vendor/lua/lib/lua/tar.lua +262 -0
  411. data/vendor/lua/lib/lua/task.dll +0 -0
  412. data/vendor/lua/lib/lua/tree.lua +81 -0
  413. data/vendor/lua/lib/lua/unicode.dll +0 -0
  414. data/vendor/lua/lib/lua/verbose_require.lua +11 -0
  415. data/vendor/lua/lib/lua/vstruct.lua +86 -0
  416. data/vendor/lua/lib/lua/vstruct/ast.lua +192 -0
  417. data/vendor/lua/lib/lua/vstruct/ast/Bitpack.lua +33 -0
  418. data/vendor/lua/lib/lua/vstruct/ast/Generator.lua +174 -0
  419. data/vendor/lua/lib/lua/vstruct/ast/IO.lua +45 -0
  420. data/vendor/lua/lib/lua/vstruct/ast/List.lua +56 -0
  421. data/vendor/lua/lib/lua/vstruct/ast/Name.lua +20 -0
  422. data/vendor/lua/lib/lua/vstruct/ast/Repeat.lua +23 -0
  423. data/vendor/lua/lib/lua/vstruct/ast/Root.lua +19 -0
  424. data/vendor/lua/lib/lua/vstruct/ast/Table.lua +65 -0
  425. data/vendor/lua/lib/lua/vstruct/cursor.lua +81 -0
  426. data/vendor/lua/lib/lua/vstruct/io.lua +45 -0
  427. data/vendor/lua/lib/lua/vstruct/io/a.lua +24 -0
  428. data/vendor/lua/lib/lua/vstruct/io/b.lua +28 -0
  429. data/vendor/lua/lib/lua/vstruct/io/bigendian.lua +21 -0
  430. data/vendor/lua/lib/lua/vstruct/io/c.lua +25 -0
  431. data/vendor/lua/lib/lua/vstruct/io/defaults.lua +24 -0
  432. data/vendor/lua/lib/lua/vstruct/io/endianness.lua +41 -0
  433. data/vendor/lua/lib/lua/vstruct/io/f.lua +129 -0
  434. data/vendor/lua/lib/lua/vstruct/io/hostendian.lua +21 -0
  435. data/vendor/lua/lib/lua/vstruct/io/i.lua +42 -0
  436. data/vendor/lua/lib/lua/vstruct/io/littleendian.lua +21 -0
  437. data/vendor/lua/lib/lua/vstruct/io/m.lua +62 -0
  438. data/vendor/lua/lib/lua/vstruct/io/p.lua +23 -0
  439. data/vendor/lua/lib/lua/vstruct/io/s.lua +27 -0
  440. data/vendor/lua/lib/lua/vstruct/io/seekb.lua +18 -0
  441. data/vendor/lua/lib/lua/vstruct/io/seekf.lua +18 -0
  442. data/vendor/lua/lib/lua/vstruct/io/seekto.lua +18 -0
  443. data/vendor/lua/lib/lua/vstruct/io/u.lua +54 -0
  444. data/vendor/lua/lib/lua/vstruct/io/x.lua +34 -0
  445. data/vendor/lua/lib/lua/vstruct/io/z.lua +63 -0
  446. data/vendor/lua/lib/lua/vstruct/lexer.lua +100 -0
  447. data/vendor/lua/lib/lua/vstruct/pack.lua +142 -0
  448. data/vendor/lua/lib/lua/vstruct/test.lua +47 -0
  449. data/vendor/lua/lib/lua/vstruct/test/basic.lua +73 -0
  450. data/vendor/lua/lib/lua/vstruct/test/common.lua +100 -0
  451. data/vendor/lua/lib/lua/vstruct/test/fp-bigendian.lua +56 -0
  452. data/vendor/lua/lib/lua/vstruct/test/fp-littleendian.lua +56 -0
  453. data/vendor/lua/lib/lua/vstruct/test/struct-test-gen.lua +1230 -0
  454. data/vendor/lua/lib/lua/vstruct/unpack.lua +126 -0
  455. data/vendor/lua/lib/lua/wx.dll +0 -0
  456. data/vendor/lua/lib/lua/xml.lua +75 -0
  457. data/vendor/lua/lib/lua/zip.dll +0 -0
  458. data/vendor/lua/lib/lua/zlib.dll +0 -0
  459. metadata +529 -0
@@ -0,0 +1,10 @@
1
+ local function b(x, suffix)
2
+ local v, ontrue, onfalse = mlp.gensym "test", unpack (suffix)
3
+ return `Stat{
4
+ +{ block:
5
+ local -{v}
6
+ if -{x} then (-{v}) = -{ontrue} else (-{v}) = -{onfalse or `Nil} end },
7
+ v }
8
+ end
9
+
10
+ mlp.expr.suffix:add{ "?", mlp.expr, gg.onkeyword{ ",", mlp.expr }, prec=5, builder=b }
@@ -0,0 +1,189 @@
1
+ -{ extension 'match' }
2
+
3
+ --------------------------------------------------------------------------------
4
+ --
5
+ -- TODO:
6
+ --
7
+ -- * Hygienize calls to pcall()
8
+ --
9
+ --------------------------------------------------------------------------------
10
+
11
+ -{ extension 'H' }
12
+ -{ extension 'log' }
13
+
14
+ -- Get match parsers and builder, for catch cases handling:
15
+ local match_alpha = require 'metalua.extension.match'
16
+ local H = H:new{side='inside', alpha = match_alpha }
17
+
18
+ -- We'll need to track rogue return statements:
19
+ require 'metalua.walk'
20
+
21
+ -- Put a block AST into a pcall():
22
+ local mkpcall = |block| +{pcall(function() -{block} end)}
23
+
24
+ -- The statement builder:
25
+ function trycatch_builder(x)
26
+ --$log ("trycatch_builder", x, 'nohash', 60)
27
+ local try_code, catch_cases, finally_code = unpack(x)
28
+ local insert_return_catcher = false
29
+
30
+ -- Can't be hygienize automatically by the current version of H, as
31
+ -- it must bridge from inside user code (hacjed return statements)
32
+ -- to outside macro code.
33
+ local caught_return = !mlp.gensym 'caught_return'
34
+ local saved_args
35
+
36
+ !try_code; !(finally_code or { })
37
+ -- FIXME: Am I sure there's no need to hygienize inside?
38
+ --[[if catch_cases then
39
+ for case in ivalues(catch_cases) do
40
+ --$log(case,'nohash')
41
+ local patterns, guard, block = unpack(case)
42
+ ! block
43
+ end
44
+ end]]
45
+
46
+
47
+ ----------------------------------------------------------------
48
+ -- Returns in the try-block must be transformed:
49
+ -- from the user's PoV, the code in the try-block isn't
50
+ -- a function, therefore a return in it must not merely
51
+ -- end the execution of the try block, but:
52
+ -- * not cause any error to be caught;
53
+ -- * let the finally-block be executed;
54
+ -- * only then, let the enclosing function return with the
55
+ -- appropraite values.
56
+ -- The way to handle that is that any returned value is stored
57
+ -- into the runtime variable caught_return, then a return with
58
+ -- no value is sent, to stop the execution of the try-code.
59
+ --
60
+ -- Similarly, a return in a catch case code must not prevent
61
+ -- the finally-code from being run.
62
+ --
63
+ -- This walker catches return statements and perform the relevant
64
+ -- transformation into caught_return setting + empty return.
65
+ --
66
+ -- There is an insert_return_catcher compile-time flag, which
67
+ -- allows to avoid inserting return-handling code in the result
68
+ -- when not needed.
69
+ ----------------------------------------------------------------
70
+ local replace_returns_and_dots do
71
+ local function f(x)
72
+ match x with
73
+ | `Return{...} ->
74
+ insert_return_catcher = true
75
+ -- Setvar's 'caught_return' code can't be hygienize by H currently.
76
+ local setvar = `Set{ {caught_return}, { `Table{ unpack(x) } } }
77
+ x <- { setvar; `Return }; x.tag = nil;
78
+ --$log('transformed return stat:', x, 60)
79
+ return 'break'
80
+ | `Function{...} -> return 'break'
81
+ -- inside this, returns would be the nested function's, not ours.
82
+ | `Dots ->
83
+ if not saved_args then saved_args = mlp.gensym 'args' end
84
+ x <- `Call{ `Id 'unpack', saved_args }
85
+ | _ -> -- pass
86
+ end
87
+ end
88
+ local cfg = { stat = {down=f}, expr = {down=f} }
89
+ replace_returns_and_dots = |x| walk.block(cfg, x)
90
+ end
91
+
92
+ -- parse returns in the try-block:
93
+ replace_returns_and_dots (try_code)
94
+
95
+ -- code handling the error catching process:
96
+ local catch_result do
97
+ if catch_cases and #catch_cases>0 then
98
+ ----------------------------------------------------------
99
+ -- Protect catch code against failures: they run in a pcall(), and
100
+ -- the result is kept in catch_* vars so that it can be used to
101
+ -- relaunch the error after the finally code has been executed.
102
+ ----------------------------------------------------------
103
+ for x in ivalues (catch_cases) do
104
+ local case_code = x[3]
105
+ -- handle rogue returns:
106
+ replace_returns_and_dots (case_code)
107
+ -- in case of error in the catch, we still need to run "finally":
108
+ x[3] = +{block: catch_success, catch_error = -{mkpcall(case_code)}}
109
+ end
110
+ ----------------------------------------------------------
111
+ -- Uncaught exceptions must not cause a mismatch,
112
+ -- so we introduce a catch-all do-nothing last case:
113
+ ----------------------------------------------------------
114
+ table.insert (catch_cases, { { { `Id '_' } }, false, { } })
115
+ catch_result = spmatch.match_builder{ {+{user_error}}, catch_cases }
116
+ else
117
+ catch_result = { }
118
+ end
119
+ end
120
+
121
+ ----------------------------------------------------------------
122
+ -- Build the bits of code that will handle return statements
123
+ -- in the user code (try-block and catch-blocks).
124
+ ----------------------------------------------------------------
125
+ local caught_return_init, caught_return_rethrow do
126
+ if insert_return_catcher then
127
+ caught_return_init = `Local{{caught_return}}
128
+ caught_return_rethrow =
129
+ +{stat: if -{caught_return} then return unpack(-{caught_return}) end}
130
+ else
131
+ caught_return_init, caught_return_rethrow = { }, { }
132
+ end
133
+ end
134
+
135
+ local saved_args_init =
136
+ saved_args and `Local{ {saved_args}, { `Table{`Dots} } } or { }
137
+
138
+ -- The finally code, to execute no matter what:
139
+ local finally_result = finally_code or { }
140
+
141
+ -- And the whole statement, gluing all taht together:
142
+ local result = +{stat:
143
+ do
144
+ -{ saved_args_init }
145
+ -{ caught_return_init }
146
+ local user_success, user_error = -{mkpcall(try_code)}
147
+ local catch_success, catch_error = false, user_error
148
+ if not user_success then -{catch_result} end
149
+ -{finally_result}
150
+ if not user_success and not catch_success then error(catch_error) end
151
+ -{ caught_return_rethrow }
152
+ end }
153
+
154
+ H(result)
155
+
156
+ return result
157
+ end
158
+
159
+ function catch_case_builder(x)
160
+ --$log ("catch_case_builder", x, 'nohash', 60)
161
+ local patterns, guard, _, code = unpack(x)
162
+ -- patterns ought to be a pattern_group, but each expression must
163
+ -- be converted into a single-element pattern_seq.
164
+ for i = 1, #patterns do patterns[i] = {patterns[i]} end
165
+ return { patterns, guard, code }
166
+ end
167
+
168
+ mlp.lexer:add{ 'try', 'catch', 'finally', '->' }
169
+ mlp.block.terminators:add{ 'catch', 'finally' }
170
+
171
+ mlp.stat:add{
172
+ 'try',
173
+ mlp.block,
174
+ gg.onkeyword{ 'catch',
175
+ gg.list{
176
+ gg.sequence{
177
+ mlp.expr_list,
178
+ gg.onkeyword{ 'if', mlp.expr },
179
+ gg.optkeyword 'then',
180
+ mlp.block,
181
+ builder = catch_case_builder },
182
+ separators = 'catch' } },
183
+ gg.onkeyword{ 'finally', mlp.block },
184
+ 'end',
185
+ builder = trycatch_builder }
186
+
187
+ return H.alpha
188
+
189
+
@@ -0,0 +1,159 @@
1
+ --------------------------------------------------------------------------------
2
+ -- Initialize the types table. It has an __index metatable entry,
3
+ -- so that if a symbol is not found in it, it is looked for in the current
4
+ -- environment. It allows to write things like [ n=3; x :: vector(n) ].
5
+ --------------------------------------------------------------------------------
6
+ types = { }
7
+ setmetatable (types, { __index = getfenv(0)})
8
+
9
+ function types.error (fmt, ...)
10
+ error(string.format("Runtime type-checking failure: "..fmt, ...))
11
+ end
12
+
13
+ --------------------------------------------------------------------------------
14
+ -- Add a prefix to an error message, if an error occurs.
15
+ -- Useful for type checkers that call sub-type-checkers.
16
+ --------------------------------------------------------------------------------
17
+ local function nest_error (prefix, ...)
18
+ local status, msg = pcall(...)
19
+ if not status then types.error("%s:\n%s", prefix, msg) end
20
+ end
21
+
22
+ --------------------------------------------------------------------------------
23
+ -- Built-in types
24
+ --------------------------------------------------------------------------------
25
+ for typename in values{ "number", "string", "boolean", "function", "thread" } do
26
+ types[typename] =
27
+ function (val)
28
+ if type(val) ~= typename then types.error ("%s expected", typename) end
29
+ end
30
+ end
31
+
32
+ function types.integer(val)
33
+ if type(val)~='number' or val%1~=0 then types.error 'integer expected' end
34
+ end
35
+
36
+ --------------------------------------------------------------------------------
37
+ -- table(foo) checks
38
+ -- table(foo, bar) checks
39
+ -- table(i) where i is an integer checks
40
+ -- table(i, j) where i and j are integers checks
41
+ -- Integers and key/value types can be combined
42
+ --------------------------------------------------------------------------------
43
+ function types.table (...)
44
+
45
+ local key_type, val_type, range_from, range_to
46
+ -- arguments parsing
47
+ for x in values{...} do
48
+ if type(x) == "number" then
49
+ if range2 then types.error "Invalid type: too many numbers in table type"
50
+ elseif range1 then range2 = x
51
+ else range1 = x end
52
+ else
53
+ if type_key then types.error "Invalid type: too many types"
54
+ elseif type_val then type_key, type_val = type_val, x
55
+ else type_val = x end
56
+ end
57
+ end
58
+ if not range2 then range2=range1 end
59
+ if not type_key then type_key = types.integer end
60
+ return function (val)
61
+ if type(val) ~= "table" then types.error "table expected" end
62
+ local s = #val
63
+ if range2 and range2 > s then types.error "Not enough table elements" end
64
+ if range1 and range1 < s then types.error "Too many elements table elements" end
65
+ for k,v in pairs(val) do
66
+ nest_error ("in table key", type_key, k)
67
+ nest_error ("in table value", type_val, v)
68
+ end
69
+ end
70
+ end
71
+
72
+ --------------------------------------------------------------------------------
73
+ -- [list (subtype)] checks that the term is a table, and all of its
74
+ -- integer-indexed elements are of type [subtype].
75
+ --------------------------------------------------------------------------------
76
+ types.list = |...| types.table (types.integer, ...)
77
+
78
+ --------------------------------------------------------------------------------
79
+ -- Check that [x] is an integral number
80
+ --------------------------------------------------------------------------------
81
+ function types.int (x)
82
+ if type(x)~="number" or x%1~=0 then types.error "Integer number expected" end
83
+ end
84
+
85
+ --------------------------------------------------------------------------------
86
+ -- [range(a,b)] checks that number [val] is between [a] and [b]. [a] and [b]
87
+ -- can be omitted.
88
+ --------------------------------------------------------------------------------
89
+ function types.range (a,b)
90
+ return function (val)
91
+ if type(val)~="number" or a and val<a or b and val>b then
92
+ types.error ("Number between %s and %s expected",
93
+ a and tostring(a) or "-infty",
94
+ b and tostring(b) or "+infty")
95
+ end
96
+ end
97
+ end
98
+
99
+ --------------------------------------------------------------------------------
100
+ -- [inter (x, y)] checks that the term has both types [x] and [y].
101
+ --------------------------------------------------------------------------------
102
+ function types.inter (...)
103
+ local args={...}
104
+ return function(val)
105
+ for t in values(args) do nest_error ("in inter type", t, args) end
106
+ end
107
+ end
108
+
109
+ --------------------------------------------------------------------------------
110
+ -- [inter (x, y)] checks that the term has type either [x] or [y].
111
+ --------------------------------------------------------------------------------
112
+ function types.union (...)
113
+ local args={...}
114
+ return function(val)
115
+ for t in values(args) do if pcall(t, val) then return end end
116
+ types.error "None of the types in the union fits"
117
+ end
118
+ end
119
+
120
+ --------------------------------------------------------------------------------
121
+ -- [optional(t)] accepts values of types [t] or [nil].
122
+ --------------------------------------------------------------------------------
123
+ function types.optional(t)
124
+ return function(val)
125
+ if val~=nil then nest_error("In optional type", t, val) end
126
+ end
127
+ end
128
+
129
+ --------------------------------------------------------------------------------
130
+ -- A call to this is done on litteral tables passed as types, i.e.
131
+ -- type {1,2,3} is transformed into types.__table{1,2,3}.
132
+ --------------------------------------------------------------------------------
133
+ function types.__table(s_type)
134
+ return function (s_val)
135
+ if type(s_val) ~= "table" then types.error "Struct table expected" end
136
+ for k, field_type in pairs (s_type) do
137
+ nest_error ("in struct field "..k, field_type, s_val[k])
138
+ end
139
+ end
140
+ end
141
+
142
+ --------------------------------------------------------------------------------
143
+ -- Same as __table, except that it's called on literal strings.
144
+ --------------------------------------------------------------------------------
145
+ function types.__string(s_type)
146
+ return function (s_val)
147
+ if s_val ~= s_type then
148
+ types.error("String %q expected", s_type)
149
+ end
150
+ end
151
+ end
152
+
153
+ --------------------------------------------------------------------------------
154
+ -- Top and Bottom:
155
+ --------------------------------------------------------------------------------
156
+ function types.any() end
157
+ function types.none() types.error "Empty type" end
158
+ types.__or = types.union
159
+ types.__and = types.inter
@@ -0,0 +1,352 @@
1
+ -- This extension inserts type-checking code at approriate place in the code,
2
+ -- thanks to annotations based on "::" keyword:
3
+ --
4
+ -- * function declarations can be annotated with a returned type. When they
5
+ -- are, type-checking code is inserted in each of their return statements,
6
+ -- to make sure they return the expected type.
7
+ --
8
+ -- * function parameters can also be annotated. If they are, type-checking
9
+ -- code is inserted in the function body, which checks the arguments' types
10
+ -- and cause an explicit error upon incorrect calls. Moreover, if a new value
11
+ -- is assigned to the parameter in the function's body, the new value's type
12
+ -- is checked before the assignment is performed.
13
+ --
14
+ -- * Local variables can also be annotated. If they are, type-checking
15
+ -- code is inserted before any value assignment or re-assignment is
16
+ -- performed on them.
17
+ --
18
+ -- Type checking can be disabled with:
19
+ --
20
+ -- -{stat: types.enabled = false }
21
+ --
22
+ -- Code transformation is performed at the chunk level, i.e. file by
23
+ -- file. Therefore, it the value of compile-time variable
24
+ -- [types.enabled] changes in the file, the only value that counts is
25
+ -- its value once the file is entirely parsed.
26
+ --
27
+ -- Syntax
28
+ -- ======
29
+ --
30
+ -- Syntax annotations consist of "::" followed by a type
31
+ -- specifier. They can appear after a function parameter name, after
32
+ -- the closing parameter parenthese of a function, or after a local
33
+ -- variable name in the declaration. See example in samples.
34
+ --
35
+ -- Type specifiers are expressions, in which identifiers are taken
36
+ -- from table types. For instance, [number] is transformed into
37
+ -- [types.number]. These [types.xxx] fields must contain functions,
38
+ -- which generate an error when they receive an argument which doesn't
39
+ -- belong to the type they represent. It is perfectly acceptible for a
40
+ -- type-checking function to return another type-checking function,
41
+ -- thus defining parametric/generic types. Parameters can be
42
+ -- identifiers (they're then considered as indexes in table [types])
43
+ -- or literals.
44
+ --
45
+ -- Design hints
46
+ -- ============
47
+ --
48
+ -- This extension uses the code walking library [walk] to globally
49
+ -- transform the chunk AST. See [chunk_transformer()] for details
50
+ -- about the walker.
51
+ --
52
+ -- During parsing, type informations are stored in string-indexed
53
+ -- fields, in the AST nodes of tags `Local and `Function. They are
54
+ -- used by the walker to generate code only if [types.enabled] is
55
+ -- true.
56
+ --
57
+ -- TODO
58
+ -- ====
59
+ --
60
+ -- It's easy to add global vars type-checking, by declaring :: as an
61
+ -- assignment operator. It's easy to add arbitrary expr
62
+ -- type-checking, by declaring :: as an infix operator. How to make
63
+ -- both cohabit?
64
+
65
+ --------------------------------------------------------------------------------
66
+ --
67
+ -- Function chunk_transformer()
68
+ --
69
+ --------------------------------------------------------------------------------
70
+ --
71
+ -- Takes a block annotated with extra fields, describing typing
72
+ -- constraints, and returns a normal AST where these constraints have
73
+ -- been turned into type-checking instructions.
74
+ --
75
+ -- It relies on the following annotations:
76
+ --
77
+ -- * [`Local{ }] statements may have a [types] field, which contains a
78
+ -- id name ==> type name map.
79
+ --
80
+ -- * [Function{ }] expressions may have an [param_types] field, also a
81
+ -- id name ==> type name map. They may also have a [ret_type] field
82
+ -- containing the type of the returned value.
83
+ --
84
+ -- Design hints:
85
+ -- =============
86
+ --
87
+ -- It relies on the code walking library, and two states:
88
+ --
89
+ -- * [return_types] is a stack of the expected return values types for
90
+ -- the functions currently in scope, the most deeply nested one
91
+ -- having the biggest index.
92
+ --
93
+ -- * [scopes] is a stack of id name ==> type name scopes, one per
94
+ -- currently active variables scope.
95
+ --
96
+ -- What's performed by the walker:
97
+ --
98
+ -- * Assignments to a typed variable involve a type checking of the
99
+ -- new value;
100
+ --
101
+ -- * Local declarations are checked for additional type declarations.
102
+ --
103
+ -- * Blocks create and destroy variable scopes in [scopes]
104
+ --
105
+ -- * Functions create an additional scope (around its body block's scope)
106
+ -- which retains its argument type associations, and stacks another
107
+ -- return type (or [false] if no type constraint is given)
108
+ --
109
+ -- * Return statements get the additional type checking statement if
110
+ -- applicable.
111
+ --
112
+ --------------------------------------------------------------------------------
113
+
114
+ -- TODO: unify scopes handling with free variables detector
115
+ -- FIXME: scopes are currently incorrect anyway, only functions currently define a scope.
116
+
117
+ require "metalua.walk"
118
+
119
+ -{ extension 'match' }
120
+
121
+ module("types", package.seeall)
122
+
123
+ enabled = true
124
+
125
+ local function chunk_transformer (block)
126
+ if not enabled then return end
127
+ local return_types, scopes = { }, { }
128
+ local cfg = { block = { }; stat = { }; expr = { } }
129
+
130
+ function cfg.stat.down (x)
131
+ match x with
132
+ | `Local{ lhs, rhs, types = x_types } ->
133
+ -- Add new types declared by lhs in current scope.
134
+ local myscope = scopes [#scopes]
135
+ for var, type in pairs (x_types) do
136
+ myscope [var] = process_type (type)
137
+ end
138
+ -- Type-check each rhs value with the type of the
139
+ -- corresponding lhs declaration, if any. Check backward, in
140
+ -- case a local var name is used more than once.
141
+ for i = 1, max (#lhs, #rhs) do
142
+ local type, new_val = myscope[lhs[i][1]], rhs[i]
143
+ if type and new_val then
144
+ rhs[i] = checktype_builder (type, new_val, 'expr')
145
+ end
146
+ end
147
+ | `Set{ lhs, rhs } ->
148
+ for i=1, #lhs do
149
+ match lhs[i] with
150
+ | `Id{ v } ->
151
+ -- Retrieve the type associated with the variable, if any:
152
+ local j, type = #scopes, nil
153
+ repeat j, type = j-1, scopes[j][v] until type or j==0
154
+ -- If a type constraint is found, apply it:
155
+ if type then rhs[i] = checktype_builder(type, rhs[i] or `Nil, 'expr') end
156
+ | _ -> -- assignment to a non-variable, pass
157
+ end
158
+ end
159
+ | `Return{ r_val } ->
160
+ local r_type = return_types[#return_types]
161
+ if r_type then
162
+ x <- `Return{ checktype_builder (r_type, r_val, 'expr') }
163
+ end
164
+ | _ -> -- pass
165
+ end
166
+ end
167
+
168
+ function cfg.expr.down (x)
169
+ if x.tag ~= 'Function' then return end
170
+ local new_scope = { }
171
+ table.insert (scopes, new_scope)
172
+ for var, type in pairs (x.param_types or { }) do
173
+ new_scope[var] = process_type (type)
174
+ end
175
+ local r_type = x.ret_type and process_type (x.ret_type) or false
176
+ table.insert (return_types, r_type)
177
+ end
178
+
179
+ -------------------------------------------------------------------
180
+ -- Unregister the returned type and the variable scope in which
181
+ -- arguments are registered;
182
+ -- then, adds the parameters type checking instructions at the
183
+ -- beginning of the function, if applicable.
184
+ -------------------------------------------------------------------
185
+ function cfg.expr.up (x)
186
+ if x.tag ~= 'Function' then return end
187
+ -- Unregister stuff going out of scope:
188
+ table.remove (return_types)
189
+ table.remove (scopes)
190
+ -- Add initial type checking:
191
+ for v, t in pairs(x.param_types or { }) do
192
+ table.insert(x[2], 1, checktype_builder(t, `Id{v}, 'stat'))
193
+ end
194
+ end
195
+
196
+ cfg.block.down = || table.insert (scopes, { })
197
+ cfg.block.up = || table.remove (scopes)
198
+
199
+ walk.block(cfg, block)
200
+ end
201
+
202
+ --------------------------------------------------------------------------
203
+ -- Perform required transformations to change a raw type expression into
204
+ -- a callable function:
205
+ --
206
+ -- * identifiers are changed into indexes in [types], unless they're
207
+ -- allready indexed, or into parentheses;
208
+ --
209
+ -- * literal tables are embedded into a call to types.__table
210
+ --
211
+ -- This transformation is not performed when type checking is disabled:
212
+ -- types are stored under their raw form in the AST; the transformation is
213
+ -- only performed when they're put in the stacks (scopes and return_types)
214
+ -- of the main walker.
215
+ --------------------------------------------------------------------------
216
+ function process_type (type_term)
217
+ -- Transform the type:
218
+ cfg = { expr = { } }
219
+
220
+ function cfg.expr.down(x)
221
+ match x with
222
+ | `Index{...} | `Paren{...} -> return 'break'
223
+ | _ -> -- pass
224
+ end
225
+ end
226
+ function cfg.expr.up (x)
227
+ match x with
228
+ | `Id{i} -> x <- `Index{ `Id "types", `String{ i } }
229
+ | `Table{...} | `String{...} | `Op{...} ->
230
+ local xcopy, name = table.shallow_copy(x)
231
+ match x.tag with
232
+ | 'Table' -> name = '__table'
233
+ | 'String' -> name = '__string'
234
+ | 'Op' -> name = '__'..x[1]
235
+ end
236
+ x <- `Call{ `Index{ `Id "types", `String{ name } }, xcopy }
237
+ | `Function{ params, { results } } if results.tag=='Return' ->
238
+ results.tag = nil
239
+ x <- `Call{ +{types.__function}, params, results }
240
+ | `Function{...} -> error "malformed function type"
241
+ | _ -> -- pass
242
+ end
243
+ end
244
+ walk.expr(cfg, type_term)
245
+ return type_term
246
+ end
247
+
248
+ --------------------------------------------------------------------------
249
+ -- Insert a type-checking function call on [term] before returning
250
+ -- [term]'s value. Only legal in an expression context.
251
+ --------------------------------------------------------------------------
252
+ local non_const_tags = table.transpose
253
+ { 'Dots', 'Op', 'Index', 'Call', 'Invoke', 'Table' }
254
+ function checktype_builder(type, term, kind)
255
+ -- Shove type-checking code into the term to check:
256
+ match kind with
257
+ | 'expr' if non_const_tags [term.tag] ->
258
+ local v = mlp.gensym()
259
+ return `Stat{ { `Local{ {v}, {term} }; `Call{ type, v } }, v }
260
+ | 'expr' ->
261
+ return `Stat{ { `Call{ type, term } }, term }
262
+ | 'stat' ->
263
+ return `Call{ type, term }
264
+ end
265
+ end
266
+
267
+ --------------------------------------------------------------------------
268
+ -- Parse the typechecking tests in a function definition, and adds the
269
+ -- corresponding tests at the beginning of the function's body.
270
+ --------------------------------------------------------------------------
271
+ local function func_val_builder (x)
272
+ local typed_params, ret_type, body = unpack(x)
273
+ local e = `Function{ { }, body; param_types = { }; ret_type = ret_type }
274
+
275
+ -- Build [untyped_params] list, and [e.param_types] dictionary.
276
+ for i, y in ipairs (typed_params) do
277
+ if y.tag=="Dots" then
278
+ assert(i==#typed_params, "`...' must be the last parameter")
279
+ break
280
+ end
281
+ local param, type = unpack(y)
282
+ e[1][i] = param
283
+ if type then e.param_types[param[1]] = type end
284
+ end
285
+ return e
286
+ end
287
+
288
+ --------------------------------------------------------------------------
289
+ -- Parse ":: type" annotation if next token is "::", or return false.
290
+ -- Called by function parameters parser
291
+ --------------------------------------------------------------------------
292
+ local opt_type = gg.onkeyword{ "::", mlp.expr }
293
+
294
+ --------------------------------------------------------------------------
295
+ -- Updated function definition parser, which accepts typed vars as
296
+ -- parameters.
297
+ --------------------------------------------------------------------------
298
+
299
+ -- Parameters parsing:
300
+ local id_or_dots = gg.multisequence{ { "...", builder = "Dots" }, default = mlp.id }
301
+
302
+ -- Function parsing:
303
+ mlp.func_val = gg.sequence{
304
+ "(", gg.list{
305
+ gg.sequence{ id_or_dots, opt_type }, terminators = ")", separators = "," },
306
+ ")", opt_type, mlp.block, "end",
307
+ builder = func_val_builder }
308
+
309
+ mlp.lexer:add { "::", "newtype" }
310
+ mlp.chunk.transformers:add (chunk_transformer)
311
+
312
+ -- Local declarations parsing:
313
+ local local_decl_parser = mlp.stat:get "local" [2].default
314
+
315
+ local_decl_parser[1].primary = gg.sequence{ mlp.id, opt_type }
316
+
317
+ function local_decl_parser.builder(x)
318
+ local lhs, rhs = unpack(x)
319
+ local s, stypes = `Local{ { }, rhs or { } }, { }
320
+ for i = 1, #lhs do
321
+ local id, type = unpack(lhs[i])
322
+ s[1][i] = id
323
+ if type then stypes[id[1]]=type end
324
+ end
325
+ if next(stypes) then s.types = stypes end
326
+ return s
327
+ end
328
+
329
+ function newtype_builder(x)
330
+ local lhs, rhs = unpack(x)
331
+ match lhs with
332
+ | `Id{ x } -> t = process_type (rhs)
333
+ | `Call{ `Id{ x }, ... } ->
334
+ t = `Function{ { }, rhs }
335
+ for i = 2, #lhs do
336
+ if lhs[i].tag ~= "Id" then error "Invalid newtype parameter" end
337
+ t[1][i-1] = lhs[i]
338
+ end
339
+ | _ -> error "Invalid newtype definition"
340
+ end
341
+ return `Let{ { `Index{ `Id "types", `String{ x } } }, { t } }
342
+ end
343
+
344
+ mlp.stat:add{ "newtype", mlp.expr, "=", mlp.expr, builder = newtype_builder }
345
+
346
+
347
+ --------------------------------------------------------------------------
348
+ -- Register as an operator
349
+ --------------------------------------------------------------------------
350
+ --mlp.expr.infix:add{ "::", prec=100, builder = |a, _, b| insert_test(a,b) }
351
+
352
+ return +{ require (-{ `String{ package.metalua_extension_prefix .. 'types-runtime' } }) }