immunio 0.15.4 → 0.16.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.
Files changed (454) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +0 -27
  3. data/ext/immunio/Rakefile +9 -0
  4. data/lib/immunio/plugins/active_record.rb +1 -1
  5. data/lib/immunio/plugins/active_record_relation.rb +1 -1
  6. data/lib/immunio/plugins/environment_reporter.rb +20 -0
  7. data/lib/immunio/rufus_lua_ext/ref.rb +1 -3
  8. data/lib/immunio/version.rb +1 -1
  9. data/lib/immunio/vm.rb +1 -2
  10. data/lua-hooks/Makefile +97 -0
  11. data/lua-hooks/ext/all.c +41 -52
  12. data/lua-hooks/ext/all.o +0 -0
  13. data/lua-hooks/ext/libinjection/libinjection_html5.o +0 -0
  14. data/lua-hooks/ext/libinjection/libinjection_sqli.o +0 -0
  15. data/lua-hooks/ext/libinjection/libinjection_xss.o +0 -0
  16. data/lua-hooks/ext/libinjection/lualib.c +2 -2
  17. data/lua-hooks/ext/lpeg/lpcap.c +2 -2
  18. data/lua-hooks/ext/lpeg/lpcap.o +0 -0
  19. data/lua-hooks/ext/lpeg/lpcode.c +2 -2
  20. data/lua-hooks/ext/lpeg/lpcode.h +1 -1
  21. data/lua-hooks/ext/lpeg/lpcode.o +0 -0
  22. data/lua-hooks/ext/lpeg/lpprint.o +0 -0
  23. data/lua-hooks/ext/lpeg/lptree.c +2 -2
  24. data/lua-hooks/ext/lpeg/lptypes.h +1 -1
  25. data/lua-hooks/ext/lpeg/lpvm.c +2 -2
  26. data/lua-hooks/ext/lpeg/lpvm.o +0 -0
  27. data/lua-hooks/ext/lua-cmsgpack/lua_cmsgpack.c +16 -3
  28. data/lua-hooks/ext/lua-snapshot/snapshot.c +14 -7
  29. data/lua-hooks/ext/luajit/COPYRIGHT +56 -0
  30. data/lua-hooks/ext/luajit/Makefile +159 -0
  31. data/lua-hooks/ext/luajit/README +16 -0
  32. data/lua-hooks/ext/luajit/doc/bluequad-print.css +166 -0
  33. data/lua-hooks/ext/luajit/doc/bluequad.css +325 -0
  34. data/lua-hooks/ext/luajit/doc/changes.html +804 -0
  35. data/lua-hooks/ext/luajit/doc/contact.html +104 -0
  36. data/lua-hooks/ext/luajit/doc/ext_c_api.html +189 -0
  37. data/lua-hooks/ext/luajit/doc/ext_ffi.html +332 -0
  38. data/lua-hooks/ext/luajit/doc/ext_ffi_api.html +570 -0
  39. data/lua-hooks/ext/luajit/doc/ext_ffi_semantics.html +1261 -0
  40. data/lua-hooks/ext/luajit/doc/ext_ffi_tutorial.html +603 -0
  41. data/lua-hooks/ext/luajit/doc/ext_jit.html +201 -0
  42. data/lua-hooks/ext/luajit/doc/ext_profiler.html +365 -0
  43. data/lua-hooks/ext/luajit/doc/extensions.html +448 -0
  44. data/lua-hooks/ext/luajit/doc/faq.html +186 -0
  45. data/lua-hooks/ext/luajit/doc/img/contact.png +0 -0
  46. data/lua-hooks/ext/luajit/doc/install.html +659 -0
  47. data/lua-hooks/ext/luajit/doc/luajit.html +236 -0
  48. data/lua-hooks/ext/luajit/doc/running.html +309 -0
  49. data/lua-hooks/ext/luajit/doc/status.html +118 -0
  50. data/lua-hooks/ext/luajit/dynasm/dasm_arm.h +456 -0
  51. data/lua-hooks/ext/luajit/dynasm/dasm_arm.lua +1125 -0
  52. data/lua-hooks/ext/luajit/dynasm/dasm_arm64.h +518 -0
  53. data/lua-hooks/ext/luajit/dynasm/dasm_arm64.lua +1166 -0
  54. data/lua-hooks/ext/luajit/dynasm/dasm_mips.h +416 -0
  55. data/lua-hooks/ext/luajit/dynasm/dasm_mips.lua +953 -0
  56. data/lua-hooks/ext/luajit/dynasm/dasm_ppc.h +419 -0
  57. data/lua-hooks/ext/luajit/dynasm/dasm_ppc.lua +1919 -0
  58. data/lua-hooks/ext/luajit/dynasm/dasm_proto.h +83 -0
  59. data/lua-hooks/ext/luajit/dynasm/dasm_x64.lua +12 -0
  60. data/lua-hooks/ext/luajit/dynasm/dasm_x86.h +471 -0
  61. data/lua-hooks/ext/luajit/dynasm/dasm_x86.lua +1945 -0
  62. data/lua-hooks/ext/luajit/dynasm/dynasm.lua +1094 -0
  63. data/lua-hooks/ext/luajit/etc/luajit.1 +88 -0
  64. data/lua-hooks/ext/luajit/etc/luajit.pc +25 -0
  65. data/lua-hooks/ext/luajit/src/Makefile +697 -0
  66. data/lua-hooks/ext/luajit/src/Makefile.dep +244 -0
  67. data/lua-hooks/ext/luajit/src/host/README +4 -0
  68. data/lua-hooks/ext/luajit/src/host/buildvm +0 -0
  69. data/lua-hooks/ext/luajit/src/host/buildvm.c +518 -0
  70. data/lua-hooks/ext/luajit/src/host/buildvm.h +105 -0
  71. data/lua-hooks/ext/luajit/src/host/buildvm.o +0 -0
  72. data/lua-hooks/ext/luajit/src/host/buildvm_arch.h +7449 -0
  73. data/lua-hooks/ext/luajit/src/host/buildvm_asm.c +345 -0
  74. data/lua-hooks/ext/luajit/src/host/buildvm_asm.o +0 -0
  75. data/lua-hooks/ext/luajit/src/host/buildvm_fold.c +229 -0
  76. data/lua-hooks/ext/luajit/src/host/buildvm_fold.o +0 -0
  77. data/lua-hooks/ext/luajit/src/host/buildvm_lib.c +457 -0
  78. data/lua-hooks/ext/luajit/src/host/buildvm_lib.o +0 -0
  79. data/lua-hooks/ext/luajit/src/host/buildvm_libbc.h +45 -0
  80. data/lua-hooks/ext/luajit/src/host/buildvm_peobj.c +368 -0
  81. data/lua-hooks/ext/luajit/src/host/buildvm_peobj.o +0 -0
  82. data/lua-hooks/ext/luajit/src/host/genlibbc.lua +197 -0
  83. data/lua-hooks/ext/luajit/src/host/genminilua.lua +428 -0
  84. data/lua-hooks/ext/luajit/src/host/minilua +0 -0
  85. data/lua-hooks/ext/luajit/src/host/minilua.c +7770 -0
  86. data/lua-hooks/ext/luajit/src/host/minilua.o +0 -0
  87. data/lua-hooks/ext/luajit/src/jit/bc.lua +190 -0
  88. data/lua-hooks/ext/luajit/src/jit/bcsave.lua +661 -0
  89. data/lua-hooks/ext/luajit/src/jit/dis_arm.lua +689 -0
  90. data/lua-hooks/ext/luajit/src/jit/dis_mips.lua +428 -0
  91. data/lua-hooks/ext/luajit/src/jit/dis_mipsel.lua +17 -0
  92. data/lua-hooks/ext/luajit/src/jit/dis_ppc.lua +591 -0
  93. data/lua-hooks/ext/luajit/src/jit/dis_x64.lua +17 -0
  94. data/lua-hooks/ext/luajit/src/jit/dis_x86.lua +838 -0
  95. data/lua-hooks/ext/luajit/src/jit/dump.lua +706 -0
  96. data/lua-hooks/ext/luajit/src/jit/p.lua +310 -0
  97. data/lua-hooks/ext/luajit/src/jit/v.lua +170 -0
  98. data/lua-hooks/ext/luajit/src/jit/vmdef.lua +362 -0
  99. data/lua-hooks/ext/luajit/src/jit/zone.lua +45 -0
  100. data/lua-hooks/ext/{lua → luajit/src}/lauxlib.h +10 -17
  101. data/lua-hooks/ext/luajit/src/lib_aux.c +356 -0
  102. data/lua-hooks/ext/luajit/src/lib_aux.o +0 -0
  103. data/lua-hooks/ext/luajit/src/lib_aux_dyn.o +0 -0
  104. data/lua-hooks/ext/luajit/src/lib_base.c +664 -0
  105. data/lua-hooks/ext/luajit/src/lib_base.o +0 -0
  106. data/lua-hooks/ext/luajit/src/lib_base_dyn.o +0 -0
  107. data/lua-hooks/ext/luajit/src/lib_bit.c +180 -0
  108. data/lua-hooks/ext/luajit/src/lib_bit.o +0 -0
  109. data/lua-hooks/ext/luajit/src/lib_bit_dyn.o +0 -0
  110. data/lua-hooks/ext/luajit/src/lib_debug.c +405 -0
  111. data/lua-hooks/ext/luajit/src/lib_debug.o +0 -0
  112. data/lua-hooks/ext/luajit/src/lib_debug_dyn.o +0 -0
  113. data/lua-hooks/ext/luajit/src/lib_ffi.c +872 -0
  114. data/lua-hooks/ext/luajit/src/lib_ffi.o +0 -0
  115. data/lua-hooks/ext/luajit/src/lib_ffi_dyn.o +0 -0
  116. data/lua-hooks/ext/luajit/src/lib_init.c +55 -0
  117. data/lua-hooks/ext/luajit/src/lib_init.o +0 -0
  118. data/lua-hooks/ext/luajit/src/lib_init_dyn.o +0 -0
  119. data/lua-hooks/ext/luajit/src/lib_io.c +541 -0
  120. data/lua-hooks/ext/luajit/src/lib_io.o +0 -0
  121. data/lua-hooks/ext/luajit/src/lib_io_dyn.o +0 -0
  122. data/lua-hooks/ext/luajit/src/lib_jit.c +767 -0
  123. data/lua-hooks/ext/luajit/src/lib_jit.o +0 -0
  124. data/lua-hooks/ext/luajit/src/lib_jit_dyn.o +0 -0
  125. data/lua-hooks/ext/luajit/src/lib_math.c +230 -0
  126. data/lua-hooks/ext/luajit/src/lib_math.o +0 -0
  127. data/lua-hooks/ext/luajit/src/lib_math_dyn.o +0 -0
  128. data/lua-hooks/ext/luajit/src/lib_os.c +292 -0
  129. data/lua-hooks/ext/luajit/src/lib_os.o +0 -0
  130. data/lua-hooks/ext/luajit/src/lib_os_dyn.o +0 -0
  131. data/lua-hooks/ext/luajit/src/lib_package.c +610 -0
  132. data/lua-hooks/ext/luajit/src/lib_package.o +0 -0
  133. data/lua-hooks/ext/luajit/src/lib_package_dyn.o +0 -0
  134. data/lua-hooks/ext/luajit/src/lib_string.c +752 -0
  135. data/lua-hooks/ext/luajit/src/lib_string.o +0 -0
  136. data/lua-hooks/ext/luajit/src/lib_string_dyn.o +0 -0
  137. data/lua-hooks/ext/luajit/src/lib_table.c +307 -0
  138. data/lua-hooks/ext/luajit/src/lib_table.o +0 -0
  139. data/lua-hooks/ext/luajit/src/lib_table_dyn.o +0 -0
  140. data/lua-hooks/ext/luajit/src/libluajit.a +0 -0
  141. data/lua-hooks/ext/luajit/src/libluajit.so +0 -0
  142. data/lua-hooks/ext/luajit/src/lj.supp +26 -0
  143. data/lua-hooks/ext/luajit/src/lj_alloc.c +1398 -0
  144. data/lua-hooks/ext/luajit/src/lj_alloc.h +17 -0
  145. data/lua-hooks/ext/luajit/src/lj_alloc.o +0 -0
  146. data/lua-hooks/ext/luajit/src/lj_alloc_dyn.o +0 -0
  147. data/lua-hooks/ext/luajit/src/lj_api.c +1210 -0
  148. data/lua-hooks/ext/luajit/src/lj_api.o +0 -0
  149. data/lua-hooks/ext/luajit/src/lj_api_dyn.o +0 -0
  150. data/lua-hooks/ext/luajit/src/lj_arch.h +509 -0
  151. data/lua-hooks/ext/luajit/src/lj_asm.c +2278 -0
  152. data/lua-hooks/ext/luajit/src/lj_asm.h +17 -0
  153. data/lua-hooks/ext/luajit/src/lj_asm.o +0 -0
  154. data/lua-hooks/ext/luajit/src/lj_asm_arm.h +2217 -0
  155. data/lua-hooks/ext/luajit/src/lj_asm_dyn.o +0 -0
  156. data/lua-hooks/ext/luajit/src/lj_asm_mips.h +1833 -0
  157. data/lua-hooks/ext/luajit/src/lj_asm_ppc.h +2015 -0
  158. data/lua-hooks/ext/luajit/src/lj_asm_x86.h +2634 -0
  159. data/lua-hooks/ext/luajit/src/lj_bc.c +14 -0
  160. data/lua-hooks/ext/luajit/src/lj_bc.h +265 -0
  161. data/lua-hooks/ext/luajit/src/lj_bc.o +0 -0
  162. data/lua-hooks/ext/luajit/src/lj_bc_dyn.o +0 -0
  163. data/lua-hooks/ext/luajit/src/lj_bcdef.h +220 -0
  164. data/lua-hooks/ext/luajit/src/lj_bcdump.h +68 -0
  165. data/lua-hooks/ext/luajit/src/lj_bcread.c +457 -0
  166. data/lua-hooks/ext/luajit/src/lj_bcread.o +0 -0
  167. data/lua-hooks/ext/luajit/src/lj_bcread_dyn.o +0 -0
  168. data/lua-hooks/ext/luajit/src/lj_bcwrite.c +361 -0
  169. data/lua-hooks/ext/luajit/src/lj_bcwrite.o +0 -0
  170. data/lua-hooks/ext/luajit/src/lj_bcwrite_dyn.o +0 -0
  171. data/lua-hooks/ext/luajit/src/lj_buf.c +234 -0
  172. data/lua-hooks/ext/luajit/src/lj_buf.h +105 -0
  173. data/lua-hooks/ext/luajit/src/lj_buf.o +0 -0
  174. data/lua-hooks/ext/luajit/src/lj_buf_dyn.o +0 -0
  175. data/lua-hooks/ext/luajit/src/lj_carith.c +429 -0
  176. data/lua-hooks/ext/luajit/src/lj_carith.h +37 -0
  177. data/lua-hooks/ext/luajit/src/lj_carith.o +0 -0
  178. data/lua-hooks/ext/luajit/src/lj_carith_dyn.o +0 -0
  179. data/lua-hooks/ext/luajit/src/lj_ccall.c +984 -0
  180. data/lua-hooks/ext/luajit/src/lj_ccall.h +178 -0
  181. data/lua-hooks/ext/luajit/src/lj_ccall.o +0 -0
  182. data/lua-hooks/ext/luajit/src/lj_ccall_dyn.o +0 -0
  183. data/lua-hooks/ext/luajit/src/lj_ccallback.c +712 -0
  184. data/lua-hooks/ext/luajit/src/lj_ccallback.h +25 -0
  185. data/lua-hooks/ext/luajit/src/lj_ccallback.o +0 -0
  186. data/lua-hooks/ext/luajit/src/lj_ccallback_dyn.o +0 -0
  187. data/lua-hooks/ext/luajit/src/lj_cconv.c +752 -0
  188. data/lua-hooks/ext/luajit/src/lj_cconv.h +70 -0
  189. data/lua-hooks/ext/luajit/src/lj_cconv.o +0 -0
  190. data/lua-hooks/ext/luajit/src/lj_cconv_dyn.o +0 -0
  191. data/lua-hooks/ext/luajit/src/lj_cdata.c +288 -0
  192. data/lua-hooks/ext/luajit/src/lj_cdata.h +76 -0
  193. data/lua-hooks/ext/luajit/src/lj_cdata.o +0 -0
  194. data/lua-hooks/ext/luajit/src/lj_cdata_dyn.o +0 -0
  195. data/lua-hooks/ext/luajit/src/lj_char.c +43 -0
  196. data/lua-hooks/ext/luajit/src/lj_char.h +42 -0
  197. data/lua-hooks/ext/luajit/src/lj_char.o +0 -0
  198. data/lua-hooks/ext/luajit/src/lj_char_dyn.o +0 -0
  199. data/lua-hooks/ext/luajit/src/lj_clib.c +418 -0
  200. data/lua-hooks/ext/luajit/src/lj_clib.h +29 -0
  201. data/lua-hooks/ext/luajit/src/lj_clib.o +0 -0
  202. data/lua-hooks/ext/luajit/src/lj_clib_dyn.o +0 -0
  203. data/lua-hooks/ext/luajit/src/lj_cparse.c +1862 -0
  204. data/lua-hooks/ext/luajit/src/lj_cparse.h +65 -0
  205. data/lua-hooks/ext/luajit/src/lj_cparse.o +0 -0
  206. data/lua-hooks/ext/luajit/src/lj_cparse_dyn.o +0 -0
  207. data/lua-hooks/ext/luajit/src/lj_crecord.c +1834 -0
  208. data/lua-hooks/ext/luajit/src/lj_crecord.h +38 -0
  209. data/lua-hooks/ext/luajit/src/lj_crecord.o +0 -0
  210. data/lua-hooks/ext/luajit/src/lj_crecord_dyn.o +0 -0
  211. data/lua-hooks/ext/luajit/src/lj_ctype.c +635 -0
  212. data/lua-hooks/ext/luajit/src/lj_ctype.h +461 -0
  213. data/lua-hooks/ext/luajit/src/lj_ctype.o +0 -0
  214. data/lua-hooks/ext/luajit/src/lj_ctype_dyn.o +0 -0
  215. data/lua-hooks/ext/luajit/src/lj_debug.c +699 -0
  216. data/lua-hooks/ext/luajit/src/lj_debug.h +65 -0
  217. data/lua-hooks/ext/luajit/src/lj_debug.o +0 -0
  218. data/lua-hooks/ext/luajit/src/lj_debug_dyn.o +0 -0
  219. data/lua-hooks/ext/luajit/src/lj_def.h +365 -0
  220. data/lua-hooks/ext/luajit/src/lj_dispatch.c +557 -0
  221. data/lua-hooks/ext/luajit/src/lj_dispatch.h +138 -0
  222. data/lua-hooks/ext/luajit/src/lj_dispatch.o +0 -0
  223. data/lua-hooks/ext/luajit/src/lj_dispatch_dyn.o +0 -0
  224. data/lua-hooks/ext/luajit/src/lj_emit_arm.h +356 -0
  225. data/lua-hooks/ext/luajit/src/lj_emit_mips.h +211 -0
  226. data/lua-hooks/ext/luajit/src/lj_emit_ppc.h +238 -0
  227. data/lua-hooks/ext/luajit/src/lj_emit_x86.h +462 -0
  228. data/lua-hooks/ext/luajit/src/lj_err.c +794 -0
  229. data/lua-hooks/ext/luajit/src/lj_err.h +41 -0
  230. data/lua-hooks/ext/luajit/src/lj_err.o +0 -0
  231. data/lua-hooks/ext/luajit/src/lj_err_dyn.o +0 -0
  232. data/lua-hooks/ext/luajit/src/lj_errmsg.h +190 -0
  233. data/lua-hooks/ext/luajit/src/lj_ff.h +18 -0
  234. data/lua-hooks/ext/luajit/src/lj_ffdef.h +209 -0
  235. data/lua-hooks/ext/luajit/src/lj_ffrecord.c +1247 -0
  236. data/lua-hooks/ext/luajit/src/lj_ffrecord.h +24 -0
  237. data/lua-hooks/ext/luajit/src/lj_ffrecord.o +0 -0
  238. data/lua-hooks/ext/luajit/src/lj_ffrecord_dyn.o +0 -0
  239. data/lua-hooks/ext/luajit/src/lj_folddef.h +1138 -0
  240. data/lua-hooks/ext/luajit/src/lj_frame.h +259 -0
  241. data/lua-hooks/ext/luajit/src/lj_func.c +185 -0
  242. data/lua-hooks/ext/luajit/src/lj_func.h +24 -0
  243. data/lua-hooks/ext/luajit/src/lj_func.o +0 -0
  244. data/lua-hooks/ext/luajit/src/lj_func_dyn.o +0 -0
  245. data/lua-hooks/ext/luajit/src/lj_gc.c +845 -0
  246. data/lua-hooks/ext/luajit/src/lj_gc.h +134 -0
  247. data/lua-hooks/ext/luajit/src/lj_gc.o +0 -0
  248. data/lua-hooks/ext/luajit/src/lj_gc_dyn.o +0 -0
  249. data/lua-hooks/ext/luajit/src/lj_gdbjit.c +787 -0
  250. data/lua-hooks/ext/luajit/src/lj_gdbjit.h +22 -0
  251. data/lua-hooks/ext/luajit/src/lj_gdbjit.o +0 -0
  252. data/lua-hooks/ext/luajit/src/lj_gdbjit_dyn.o +0 -0
  253. data/lua-hooks/ext/luajit/src/lj_ir.c +505 -0
  254. data/lua-hooks/ext/luajit/src/lj_ir.h +577 -0
  255. data/lua-hooks/ext/luajit/src/lj_ir.o +0 -0
  256. data/lua-hooks/ext/luajit/src/lj_ir_dyn.o +0 -0
  257. data/lua-hooks/ext/luajit/src/lj_ircall.h +321 -0
  258. data/lua-hooks/ext/luajit/src/lj_iropt.h +161 -0
  259. data/lua-hooks/ext/luajit/src/lj_jit.h +440 -0
  260. data/lua-hooks/ext/luajit/src/lj_lex.c +482 -0
  261. data/lua-hooks/ext/luajit/src/lj_lex.h +86 -0
  262. data/lua-hooks/ext/luajit/src/lj_lex.o +0 -0
  263. data/lua-hooks/ext/luajit/src/lj_lex_dyn.o +0 -0
  264. data/lua-hooks/ext/luajit/src/lj_lib.c +303 -0
  265. data/lua-hooks/ext/luajit/src/lj_lib.h +115 -0
  266. data/lua-hooks/ext/luajit/src/lj_lib.o +0 -0
  267. data/lua-hooks/ext/luajit/src/lj_lib_dyn.o +0 -0
  268. data/lua-hooks/ext/luajit/src/lj_libdef.h +414 -0
  269. data/lua-hooks/ext/luajit/src/lj_load.c +168 -0
  270. data/lua-hooks/ext/luajit/src/lj_load.o +0 -0
  271. data/lua-hooks/ext/luajit/src/lj_load_dyn.o +0 -0
  272. data/lua-hooks/ext/luajit/src/lj_mcode.c +386 -0
  273. data/lua-hooks/ext/luajit/src/lj_mcode.h +30 -0
  274. data/lua-hooks/ext/luajit/src/lj_mcode.o +0 -0
  275. data/lua-hooks/ext/luajit/src/lj_mcode_dyn.o +0 -0
  276. data/lua-hooks/ext/luajit/src/lj_meta.c +477 -0
  277. data/lua-hooks/ext/luajit/src/lj_meta.h +38 -0
  278. data/lua-hooks/ext/luajit/src/lj_meta.o +0 -0
  279. data/lua-hooks/ext/luajit/src/lj_meta_dyn.o +0 -0
  280. data/lua-hooks/ext/luajit/src/lj_obj.c +50 -0
  281. data/lua-hooks/ext/luajit/src/lj_obj.h +976 -0
  282. data/lua-hooks/ext/luajit/src/lj_obj.o +0 -0
  283. data/lua-hooks/ext/luajit/src/lj_obj_dyn.o +0 -0
  284. data/lua-hooks/ext/luajit/src/lj_opt_dce.c +78 -0
  285. data/lua-hooks/ext/luajit/src/lj_opt_dce.o +0 -0
  286. data/lua-hooks/ext/luajit/src/lj_opt_dce_dyn.o +0 -0
  287. data/lua-hooks/ext/luajit/src/lj_opt_fold.c +2488 -0
  288. data/lua-hooks/ext/luajit/src/lj_opt_fold.o +0 -0
  289. data/lua-hooks/ext/luajit/src/lj_opt_fold_dyn.o +0 -0
  290. data/lua-hooks/ext/luajit/src/lj_opt_loop.c +449 -0
  291. data/lua-hooks/ext/luajit/src/lj_opt_loop.o +0 -0
  292. data/lua-hooks/ext/luajit/src/lj_opt_loop_dyn.o +0 -0
  293. data/lua-hooks/ext/luajit/src/lj_opt_mem.c +935 -0
  294. data/lua-hooks/ext/luajit/src/lj_opt_mem.o +0 -0
  295. data/lua-hooks/ext/luajit/src/lj_opt_mem_dyn.o +0 -0
  296. data/lua-hooks/ext/luajit/src/lj_opt_narrow.c +652 -0
  297. data/lua-hooks/ext/luajit/src/lj_opt_narrow.o +0 -0
  298. data/lua-hooks/ext/luajit/src/lj_opt_narrow_dyn.o +0 -0
  299. data/lua-hooks/ext/luajit/src/lj_opt_sink.c +245 -0
  300. data/lua-hooks/ext/luajit/src/lj_opt_sink.o +0 -0
  301. data/lua-hooks/ext/luajit/src/lj_opt_sink_dyn.o +0 -0
  302. data/lua-hooks/ext/luajit/src/lj_opt_split.c +856 -0
  303. data/lua-hooks/ext/luajit/src/lj_opt_split.o +0 -0
  304. data/lua-hooks/ext/luajit/src/lj_opt_split_dyn.o +0 -0
  305. data/lua-hooks/ext/luajit/src/lj_parse.c +2725 -0
  306. data/lua-hooks/ext/luajit/src/lj_parse.h +18 -0
  307. data/lua-hooks/ext/luajit/src/lj_parse.o +0 -0
  308. data/lua-hooks/ext/luajit/src/lj_parse_dyn.o +0 -0
  309. data/lua-hooks/ext/luajit/src/lj_profile.c +368 -0
  310. data/lua-hooks/ext/luajit/src/lj_profile.h +21 -0
  311. data/lua-hooks/ext/luajit/src/lj_profile.o +0 -0
  312. data/lua-hooks/ext/luajit/src/lj_profile_dyn.o +0 -0
  313. data/lua-hooks/ext/luajit/src/lj_recdef.h +270 -0
  314. data/lua-hooks/ext/luajit/src/lj_record.c +2554 -0
  315. data/lua-hooks/ext/luajit/src/lj_record.h +45 -0
  316. data/lua-hooks/ext/luajit/src/lj_record.o +0 -0
  317. data/lua-hooks/ext/luajit/src/lj_record_dyn.o +0 -0
  318. data/lua-hooks/ext/luajit/src/lj_snap.c +870 -0
  319. data/lua-hooks/ext/luajit/src/lj_snap.h +34 -0
  320. data/lua-hooks/ext/luajit/src/lj_snap.o +0 -0
  321. data/lua-hooks/ext/luajit/src/lj_snap_dyn.o +0 -0
  322. data/lua-hooks/ext/luajit/src/lj_state.c +300 -0
  323. data/lua-hooks/ext/luajit/src/lj_state.h +35 -0
  324. data/lua-hooks/ext/luajit/src/lj_state.o +0 -0
  325. data/lua-hooks/ext/luajit/src/lj_state_dyn.o +0 -0
  326. data/lua-hooks/ext/luajit/src/lj_str.c +197 -0
  327. data/lua-hooks/ext/luajit/src/lj_str.h +27 -0
  328. data/lua-hooks/ext/luajit/src/lj_str.o +0 -0
  329. data/lua-hooks/ext/luajit/src/lj_str_dyn.o +0 -0
  330. data/lua-hooks/ext/luajit/src/lj_strfmt.c +554 -0
  331. data/lua-hooks/ext/luajit/src/lj_strfmt.h +125 -0
  332. data/lua-hooks/ext/luajit/src/lj_strfmt.o +0 -0
  333. data/lua-hooks/ext/luajit/src/lj_strfmt_dyn.o +0 -0
  334. data/lua-hooks/ext/luajit/src/lj_strscan.c +547 -0
  335. data/lua-hooks/ext/luajit/src/lj_strscan.h +39 -0
  336. data/lua-hooks/ext/luajit/src/lj_strscan.o +0 -0
  337. data/lua-hooks/ext/luajit/src/lj_strscan_dyn.o +0 -0
  338. data/lua-hooks/ext/luajit/src/lj_tab.c +666 -0
  339. data/lua-hooks/ext/luajit/src/lj_tab.h +73 -0
  340. data/lua-hooks/ext/luajit/src/lj_tab.o +0 -0
  341. data/lua-hooks/ext/luajit/src/lj_tab_dyn.o +0 -0
  342. data/lua-hooks/ext/luajit/src/lj_target.h +164 -0
  343. data/lua-hooks/ext/luajit/src/lj_target_arm.h +270 -0
  344. data/lua-hooks/ext/luajit/src/lj_target_arm64.h +97 -0
  345. data/lua-hooks/ext/luajit/src/lj_target_mips.h +260 -0
  346. data/lua-hooks/ext/luajit/src/lj_target_ppc.h +280 -0
  347. data/lua-hooks/ext/luajit/src/lj_target_x86.h +345 -0
  348. data/lua-hooks/ext/luajit/src/lj_trace.c +859 -0
  349. data/lua-hooks/ext/luajit/src/lj_trace.h +54 -0
  350. data/lua-hooks/ext/luajit/src/lj_trace.o +0 -0
  351. data/lua-hooks/ext/luajit/src/lj_trace_dyn.o +0 -0
  352. data/lua-hooks/ext/luajit/src/lj_traceerr.h +63 -0
  353. data/lua-hooks/ext/luajit/src/lj_udata.c +34 -0
  354. data/lua-hooks/ext/luajit/src/lj_udata.h +14 -0
  355. data/lua-hooks/ext/luajit/src/lj_udata.o +0 -0
  356. data/lua-hooks/ext/luajit/src/lj_udata_dyn.o +0 -0
  357. data/lua-hooks/ext/luajit/src/lj_vm.S +2730 -0
  358. data/lua-hooks/ext/luajit/src/lj_vm.h +114 -0
  359. data/lua-hooks/ext/luajit/src/lj_vm.o +0 -0
  360. data/lua-hooks/ext/luajit/src/lj_vm_dyn.o +0 -0
  361. data/lua-hooks/ext/luajit/src/lj_vmevent.c +58 -0
  362. data/lua-hooks/ext/luajit/src/lj_vmevent.h +59 -0
  363. data/lua-hooks/ext/luajit/src/lj_vmevent.o +0 -0
  364. data/lua-hooks/ext/luajit/src/lj_vmevent_dyn.o +0 -0
  365. data/lua-hooks/ext/luajit/src/lj_vmmath.c +152 -0
  366. data/lua-hooks/ext/luajit/src/lj_vmmath.o +0 -0
  367. data/lua-hooks/ext/luajit/src/lj_vmmath_dyn.o +0 -0
  368. data/lua-hooks/ext/luajit/src/ljamalg.c +96 -0
  369. data/lua-hooks/ext/{lua → luajit/src}/lua.h +12 -7
  370. data/lua-hooks/ext/luajit/src/lua.hpp +9 -0
  371. data/lua-hooks/ext/luajit/src/luaconf.h +156 -0
  372. data/lua-hooks/ext/luajit/src/luajit +0 -0
  373. data/lua-hooks/ext/luajit/src/luajit.c +570 -0
  374. data/lua-hooks/ext/luajit/src/luajit.h +79 -0
  375. data/lua-hooks/ext/luajit/src/luajit.o +0 -0
  376. data/lua-hooks/ext/luajit/src/lualib.h +43 -0
  377. data/lua-hooks/ext/luajit/src/msvcbuild.bat +114 -0
  378. data/lua-hooks/ext/luajit/src/ps4build.bat +103 -0
  379. data/lua-hooks/ext/luajit/src/psvitabuild.bat +93 -0
  380. data/lua-hooks/ext/luajit/src/vm_arm.dasc +4585 -0
  381. data/lua-hooks/ext/luajit/src/vm_arm64.dasc +3764 -0
  382. data/lua-hooks/ext/luajit/src/vm_mips.dasc +4355 -0
  383. data/lua-hooks/ext/luajit/src/vm_ppc.dasc +5252 -0
  384. data/lua-hooks/ext/luajit/src/vm_x64.dasc +4902 -0
  385. data/lua-hooks/ext/luajit/src/vm_x86.dasc +5710 -0
  386. data/lua-hooks/ext/luajit/src/xb1build.bat +101 -0
  387. data/lua-hooks/ext/luajit/src/xedkbuild.bat +92 -0
  388. data/lua-hooks/ext/luautf8/lutf8lib.c +3 -3
  389. data/lua-hooks/lib/boot.lua +37 -2
  390. metadata +372 -69
  391. data/lua-hooks/ext/bitop/README +0 -22
  392. data/lua-hooks/ext/bitop/bit.c +0 -189
  393. data/lua-hooks/ext/extconf.rb +0 -38
  394. data/lua-hooks/ext/lua/COPYRIGHT +0 -34
  395. data/lua-hooks/ext/lua/lapi.c +0 -1087
  396. data/lua-hooks/ext/lua/lapi.h +0 -16
  397. data/lua-hooks/ext/lua/lauxlib.c +0 -652
  398. data/lua-hooks/ext/lua/lbaselib.c +0 -659
  399. data/lua-hooks/ext/lua/lcode.c +0 -831
  400. data/lua-hooks/ext/lua/lcode.h +0 -76
  401. data/lua-hooks/ext/lua/ldblib.c +0 -398
  402. data/lua-hooks/ext/lua/ldebug.c +0 -638
  403. data/lua-hooks/ext/lua/ldebug.h +0 -33
  404. data/lua-hooks/ext/lua/ldo.c +0 -519
  405. data/lua-hooks/ext/lua/ldo.h +0 -57
  406. data/lua-hooks/ext/lua/ldump.c +0 -164
  407. data/lua-hooks/ext/lua/lfunc.c +0 -174
  408. data/lua-hooks/ext/lua/lfunc.h +0 -34
  409. data/lua-hooks/ext/lua/lgc.c +0 -710
  410. data/lua-hooks/ext/lua/lgc.h +0 -110
  411. data/lua-hooks/ext/lua/linit.c +0 -38
  412. data/lua-hooks/ext/lua/liolib.c +0 -556
  413. data/lua-hooks/ext/lua/llex.c +0 -463
  414. data/lua-hooks/ext/lua/llex.h +0 -81
  415. data/lua-hooks/ext/lua/llimits.h +0 -128
  416. data/lua-hooks/ext/lua/lmathlib.c +0 -263
  417. data/lua-hooks/ext/lua/lmem.c +0 -86
  418. data/lua-hooks/ext/lua/lmem.h +0 -49
  419. data/lua-hooks/ext/lua/loadlib.c +0 -705
  420. data/lua-hooks/ext/lua/loadlib_rel.c +0 -760
  421. data/lua-hooks/ext/lua/lobject.c +0 -214
  422. data/lua-hooks/ext/lua/lobject.h +0 -381
  423. data/lua-hooks/ext/lua/lopcodes.c +0 -102
  424. data/lua-hooks/ext/lua/lopcodes.h +0 -268
  425. data/lua-hooks/ext/lua/loslib.c +0 -243
  426. data/lua-hooks/ext/lua/lparser.c +0 -1339
  427. data/lua-hooks/ext/lua/lparser.h +0 -82
  428. data/lua-hooks/ext/lua/lstate.c +0 -214
  429. data/lua-hooks/ext/lua/lstate.h +0 -169
  430. data/lua-hooks/ext/lua/lstring.c +0 -111
  431. data/lua-hooks/ext/lua/lstring.h +0 -31
  432. data/lua-hooks/ext/lua/lstrlib.c +0 -871
  433. data/lua-hooks/ext/lua/ltable.c +0 -588
  434. data/lua-hooks/ext/lua/ltable.h +0 -40
  435. data/lua-hooks/ext/lua/ltablib.c +0 -287
  436. data/lua-hooks/ext/lua/ltm.c +0 -75
  437. data/lua-hooks/ext/lua/ltm.h +0 -54
  438. data/lua-hooks/ext/lua/lua.c +0 -392
  439. data/lua-hooks/ext/lua/lua.def +0 -131
  440. data/lua-hooks/ext/lua/lua.rc +0 -28
  441. data/lua-hooks/ext/lua/lua_dll.rc +0 -26
  442. data/lua-hooks/ext/lua/luac.c +0 -200
  443. data/lua-hooks/ext/lua/luac.rc +0 -1
  444. data/lua-hooks/ext/lua/luaconf.h +0 -763
  445. data/lua-hooks/ext/lua/luaconf.h.in +0 -724
  446. data/lua-hooks/ext/lua/luaconf.h.orig +0 -763
  447. data/lua-hooks/ext/lua/lualib.h +0 -53
  448. data/lua-hooks/ext/lua/lundump.c +0 -227
  449. data/lua-hooks/ext/lua/lundump.h +0 -36
  450. data/lua-hooks/ext/lua/lvm.c +0 -767
  451. data/lua-hooks/ext/lua/lvm.h +0 -36
  452. data/lua-hooks/ext/lua/lzio.c +0 -82
  453. data/lua-hooks/ext/lua/lzio.h +0 -67
  454. data/lua-hooks/ext/lua/print.c +0 -227
@@ -0,0 +1,38 @@
1
+ /*
2
+ ** Metamethod handling.
3
+ ** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h
4
+ */
5
+
6
+ #ifndef _LJ_META_H
7
+ #define _LJ_META_H
8
+
9
+ #include "lj_obj.h"
10
+
11
+ /* Metamethod handling */
12
+ LJ_FUNC void lj_meta_init(lua_State *L);
13
+ LJ_FUNC cTValue *lj_meta_cache(GCtab *mt, MMS mm, GCstr *name);
14
+ LJ_FUNC cTValue *lj_meta_lookup(lua_State *L, cTValue *o, MMS mm);
15
+ #if LJ_HASFFI
16
+ LJ_FUNC int lj_meta_tailcall(lua_State *L, cTValue *tv);
17
+ #endif
18
+
19
+ #define lj_meta_fastg(g, mt, mm) \
20
+ ((mt) == NULL ? NULL : ((mt)->nomm & (1u<<(mm))) ? NULL : \
21
+ lj_meta_cache(mt, mm, mmname_str(g, mm)))
22
+ #define lj_meta_fast(L, mt, mm) lj_meta_fastg(G(L), mt, mm)
23
+
24
+ /* C helpers for some instructions, called from assembler VM. */
25
+ LJ_FUNCA cTValue *lj_meta_tget(lua_State *L, cTValue *o, cTValue *k);
26
+ LJ_FUNCA TValue *lj_meta_tset(lua_State *L, cTValue *o, cTValue *k);
27
+ LJ_FUNCA TValue *lj_meta_arith(lua_State *L, TValue *ra, cTValue *rb,
28
+ cTValue *rc, BCReg op);
29
+ LJ_FUNCA TValue *lj_meta_cat(lua_State *L, TValue *top, int left);
30
+ LJ_FUNCA TValue * LJ_FASTCALL lj_meta_len(lua_State *L, cTValue *o);
31
+ LJ_FUNCA TValue *lj_meta_equal(lua_State *L, GCobj *o1, GCobj *o2, int ne);
32
+ LJ_FUNCA TValue * LJ_FASTCALL lj_meta_equal_cd(lua_State *L, BCIns ins);
33
+ LJ_FUNCA TValue *lj_meta_comp(lua_State *L, cTValue *o1, cTValue *o2, int op);
34
+ LJ_FUNCA void lj_meta_istype(lua_State *L, BCReg ra, BCReg tp);
35
+ LJ_FUNCA void lj_meta_call(lua_State *L, TValue *func, TValue *top);
36
+ LJ_FUNCA void LJ_FASTCALL lj_meta_for(lua_State *L, TValue *o);
37
+
38
+ #endif
@@ -0,0 +1,50 @@
1
+ /*
2
+ ** Miscellaneous object handling.
3
+ ** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h
4
+ */
5
+
6
+ #define lj_obj_c
7
+ #define LUA_CORE
8
+
9
+ #include "lj_obj.h"
10
+
11
+ /* Object type names. */
12
+ LJ_DATADEF const char *const lj_obj_typename[] = { /* ORDER LUA_T */
13
+ "no value", "nil", "boolean", "userdata", "number", "string",
14
+ "table", "function", "userdata", "thread", "proto", "cdata"
15
+ };
16
+
17
+ LJ_DATADEF const char *const lj_obj_itypename[] = { /* ORDER LJ_T */
18
+ "nil", "boolean", "boolean", "userdata", "string", "upval", "thread",
19
+ "proto", "function", "trace", "cdata", "table", "userdata", "number"
20
+ };
21
+
22
+ /* Compare two objects without calling metamethods. */
23
+ int LJ_FASTCALL lj_obj_equal(cTValue *o1, cTValue *o2)
24
+ {
25
+ if (itype(o1) == itype(o2)) {
26
+ if (tvispri(o1))
27
+ return 1;
28
+ if (!tvisnum(o1))
29
+ return gcrefeq(o1->gcr, o2->gcr);
30
+ } else if (!tvisnumber(o1) || !tvisnumber(o2)) {
31
+ return 0;
32
+ }
33
+ return numberVnum(o1) == numberVnum(o2);
34
+ }
35
+
36
+ /* Return pointer to object or its object data. */
37
+ const void * LJ_FASTCALL lj_obj_ptr(cTValue *o)
38
+ {
39
+ if (tvisudata(o))
40
+ return uddata(udataV(o));
41
+ else if (tvislightud(o))
42
+ return lightudV(o);
43
+ else if (LJ_HASFFI && tviscdata(o))
44
+ return cdataptr(cdataV(o));
45
+ else if (tvisgcv(o))
46
+ return gcV(o);
47
+ else
48
+ return NULL;
49
+ }
50
+
@@ -0,0 +1,976 @@
1
+ /*
2
+ ** LuaJIT VM tags, values and objects.
3
+ ** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h
4
+ **
5
+ ** Portions taken verbatim or adapted from the Lua interpreter.
6
+ ** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h
7
+ */
8
+
9
+ #ifndef _LJ_OBJ_H
10
+ #define _LJ_OBJ_H
11
+
12
+ #include "lua.h"
13
+ #include "lj_def.h"
14
+ #include "lj_arch.h"
15
+
16
+ /* -- Memory references (32 bit address space) ---------------------------- */
17
+
18
+ /* Memory and GC object sizes. */
19
+ typedef uint32_t MSize;
20
+ #if LJ_GC64
21
+ typedef uint64_t GCSize;
22
+ #else
23
+ typedef uint32_t GCSize;
24
+ #endif
25
+
26
+ /* Memory reference */
27
+ typedef struct MRef {
28
+ #if LJ_GC64
29
+ uint64_t ptr64; /* True 64 bit pointer. */
30
+ #else
31
+ uint32_t ptr32; /* Pseudo 32 bit pointer. */
32
+ #endif
33
+ } MRef;
34
+
35
+ #if LJ_GC64
36
+ #define mref(r, t) ((t *)(void *)(r).ptr64)
37
+
38
+ #define setmref(r, p) ((r).ptr64 = (uint64_t)(void *)(p))
39
+ #define setmrefr(r, v) ((r).ptr64 = (v).ptr64)
40
+ #else
41
+ #define mref(r, t) ((t *)(void *)(uintptr_t)(r).ptr32)
42
+
43
+ #define setmref(r, p) ((r).ptr32 = (uint32_t)(uintptr_t)(void *)(p))
44
+ #define setmrefr(r, v) ((r).ptr32 = (v).ptr32)
45
+ #endif
46
+
47
+ /* -- GC object references (32 bit address space) ------------------------- */
48
+
49
+ /* GCobj reference */
50
+ typedef struct GCRef {
51
+ #if LJ_GC64
52
+ uint64_t gcptr64; /* True 64 bit pointer. */
53
+ #else
54
+ uint32_t gcptr32; /* Pseudo 32 bit pointer. */
55
+ #endif
56
+ } GCRef;
57
+
58
+ /* Common GC header for all collectable objects. */
59
+ #define GCHeader GCRef nextgc; uint8_t marked; uint8_t gct
60
+ /* This occupies 6 bytes, so use the next 2 bytes for non-32 bit fields. */
61
+
62
+ #if LJ_GC64
63
+ #define gcref(r) ((GCobj *)(r).gcptr64)
64
+ #define gcrefp(r, t) ((t *)(void *)(r).gcptr64)
65
+ #define gcrefu(r) ((r).gcptr64)
66
+ #define gcrefeq(r1, r2) ((r1).gcptr64 == (r2).gcptr64)
67
+
68
+ #define setgcref(r, gc) ((r).gcptr64 = (uint64_t)&(gc)->gch)
69
+ #define setgcreft(r, gc, it) \
70
+ (r).gcptr64 = (uint64_t)&(gc)->gch | (((uint64_t)(it)) << 47)
71
+ #define setgcrefp(r, p) ((r).gcptr64 = (uint64_t)(p))
72
+ #define setgcrefnull(r) ((r).gcptr64 = 0)
73
+ #define setgcrefr(r, v) ((r).gcptr64 = (v).gcptr64)
74
+ #else
75
+ #define gcref(r) ((GCobj *)(uintptr_t)(r).gcptr32)
76
+ #define gcrefp(r, t) ((t *)(void *)(uintptr_t)(r).gcptr32)
77
+ #define gcrefu(r) ((r).gcptr32)
78
+ #define gcrefeq(r1, r2) ((r1).gcptr32 == (r2).gcptr32)
79
+
80
+ #define setgcref(r, gc) ((r).gcptr32 = (uint32_t)(uintptr_t)&(gc)->gch)
81
+ #define setgcrefp(r, p) ((r).gcptr32 = (uint32_t)(uintptr_t)(p))
82
+ #define setgcrefnull(r) ((r).gcptr32 = 0)
83
+ #define setgcrefr(r, v) ((r).gcptr32 = (v).gcptr32)
84
+ #endif
85
+
86
+ #define gcnext(gc) (gcref((gc)->gch.nextgc))
87
+
88
+ /* IMPORTANT NOTE:
89
+ **
90
+ ** All uses of the setgcref* macros MUST be accompanied with a write barrier.
91
+ **
92
+ ** This is to ensure the integrity of the incremental GC. The invariant
93
+ ** to preserve is that a black object never points to a white object.
94
+ ** I.e. never store a white object into a field of a black object.
95
+ **
96
+ ** It's ok to LEAVE OUT the write barrier ONLY in the following cases:
97
+ ** - The source is not a GC object (NULL).
98
+ ** - The target is a GC root. I.e. everything in global_State.
99
+ ** - The target is a lua_State field (threads are never black).
100
+ ** - The target is a stack slot, see setgcV et al.
101
+ ** - The target is an open upvalue, i.e. pointing to a stack slot.
102
+ ** - The target is a newly created object (i.e. marked white). But make
103
+ ** sure nothing invokes the GC inbetween.
104
+ ** - The target and the source are the same object (self-reference).
105
+ ** - The target already contains the object (e.g. moving elements around).
106
+ **
107
+ ** The most common case is a store to a stack slot. All other cases where
108
+ ** a barrier has been omitted are annotated with a NOBARRIER comment.
109
+ **
110
+ ** The same logic applies for stores to table slots (array part or hash
111
+ ** part). ALL uses of lj_tab_set* require a barrier for the stored value
112
+ ** *and* the stored key, based on the above rules. In practice this means
113
+ ** a barrier is needed if *either* of the key or value are a GC object.
114
+ **
115
+ ** It's ok to LEAVE OUT the write barrier in the following special cases:
116
+ ** - The stored value is nil. The key doesn't matter because it's either
117
+ ** not resurrected or lj_tab_newkey() will take care of the key barrier.
118
+ ** - The key doesn't matter if the *previously* stored value is guaranteed
119
+ ** to be non-nil (because the key is kept alive in the table).
120
+ ** - The key doesn't matter if it's guaranteed not to be part of the table,
121
+ ** since lj_tab_newkey() takes care of the key barrier. This applies
122
+ ** trivially to new tables, but watch out for resurrected keys. Storing
123
+ ** a nil value leaves the key in the table!
124
+ **
125
+ ** In case of doubt use lj_gc_anybarriert() as it's rather cheap. It's used
126
+ ** by the interpreter for all table stores.
127
+ **
128
+ ** Note: In contrast to Lua's GC, LuaJIT's GC does *not* specially mark
129
+ ** dead keys in tables. The reference is left in, but it's guaranteed to
130
+ ** be never dereferenced as long as the value is nil. It's ok if the key is
131
+ ** freed or if any object subsequently gets the same address.
132
+ **
133
+ ** Not destroying dead keys helps to keep key hash slots stable. This avoids
134
+ ** specialization back-off for HREFK when a value flips between nil and
135
+ ** non-nil and the GC gets in the way. It also allows safely hoisting
136
+ ** HREF/HREFK across GC steps. Dead keys are only removed if a table is
137
+ ** resized (i.e. by NEWREF) and xREF must not be CSEd across a resize.
138
+ **
139
+ ** The trade-off is that a write barrier for tables must take the key into
140
+ ** account, too. Implicitly resurrecting the key by storing a non-nil value
141
+ ** may invalidate the incremental GC invariant.
142
+ */
143
+
144
+ /* -- Common type definitions --------------------------------------------- */
145
+
146
+ /* Types for handling bytecodes. Need this here, details in lj_bc.h. */
147
+ typedef uint32_t BCIns; /* Bytecode instruction. */
148
+ typedef uint32_t BCPos; /* Bytecode position. */
149
+ typedef uint32_t BCReg; /* Bytecode register. */
150
+ typedef int32_t BCLine; /* Bytecode line number. */
151
+
152
+ /* Internal assembler functions. Never call these directly from C. */
153
+ typedef void (*ASMFunction)(void);
154
+
155
+ /* Resizable string buffer. Need this here, details in lj_buf.h. */
156
+ typedef struct SBuf {
157
+ MRef p; /* String buffer pointer. */
158
+ MRef e; /* String buffer end pointer. */
159
+ MRef b; /* String buffer base. */
160
+ MRef L; /* lua_State, used for buffer resizing. */
161
+ } SBuf;
162
+
163
+ /* -- Tags and values ----------------------------------------------------- */
164
+
165
+ /* Frame link. */
166
+ typedef union {
167
+ int32_t ftsz; /* Frame type and size of previous frame. */
168
+ MRef pcr; /* Or PC for Lua frames. */
169
+ } FrameLink;
170
+
171
+ /* Tagged value. */
172
+ typedef LJ_ALIGN(8) union TValue {
173
+ uint64_t u64; /* 64 bit pattern overlaps number. */
174
+ lua_Number n; /* Number object overlaps split tag/value object. */
175
+ #if LJ_GC64
176
+ GCRef gcr; /* GCobj reference with tag. */
177
+ int64_t it64;
178
+ struct {
179
+ LJ_ENDIAN_LOHI(
180
+ int32_t i; /* Integer value. */
181
+ , uint32_t it; /* Internal object tag. Must overlap MSW of number. */
182
+ )
183
+ };
184
+ #else
185
+ struct {
186
+ LJ_ENDIAN_LOHI(
187
+ union {
188
+ GCRef gcr; /* GCobj reference (if any). */
189
+ int32_t i; /* Integer value. */
190
+ };
191
+ , uint32_t it; /* Internal object tag. Must overlap MSW of number. */
192
+ )
193
+ };
194
+ #endif
195
+ #if LJ_FR2
196
+ int64_t ftsz; /* Frame type and size of previous frame, or PC. */
197
+ #else
198
+ struct {
199
+ LJ_ENDIAN_LOHI(
200
+ GCRef func; /* Function for next frame (or dummy L). */
201
+ , FrameLink tp; /* Link to previous frame. */
202
+ )
203
+ } fr;
204
+ #endif
205
+ struct {
206
+ LJ_ENDIAN_LOHI(
207
+ uint32_t lo; /* Lower 32 bits of number. */
208
+ , uint32_t hi; /* Upper 32 bits of number. */
209
+ )
210
+ } u32;
211
+ } TValue;
212
+
213
+ typedef const TValue cTValue;
214
+
215
+ #define tvref(r) (mref(r, TValue))
216
+
217
+ /* More external and GCobj tags for internal objects. */
218
+ #define LAST_TT LUA_TTHREAD
219
+ #define LUA_TPROTO (LAST_TT+1)
220
+ #define LUA_TCDATA (LAST_TT+2)
221
+
222
+ /* Internal object tags.
223
+ **
224
+ ** Format for 32 bit GC references (!LJ_GC64):
225
+ **
226
+ ** Internal tags overlap the MSW of a number object (must be a double).
227
+ ** Interpreted as a double these are special NaNs. The FPU only generates
228
+ ** one type of NaN (0xfff8_0000_0000_0000). So MSWs > 0xfff80000 are available
229
+ ** for use as internal tags. Small negative numbers are used to shorten the
230
+ ** encoding of type comparisons (reg/mem against sign-ext. 8 bit immediate).
231
+ **
232
+ ** ---MSW---.---LSW---
233
+ ** primitive types | itype | |
234
+ ** lightuserdata | itype | void * | (32 bit platforms)
235
+ ** lightuserdata |ffff| void * | (64 bit platforms, 47 bit pointers)
236
+ ** GC objects | itype | GCRef |
237
+ ** int (LJ_DUALNUM)| itype | int |
238
+ ** number -------double------
239
+ **
240
+ ** Format for 64 bit GC references (LJ_GC64):
241
+ **
242
+ ** The upper 13 bits must be 1 (0xfff8...) for a special NaN. The next
243
+ ** 4 bits hold the internal tag. The lowest 47 bits either hold a pointer,
244
+ ** a zero-extended 32 bit integer or all bits set to 1 for primitive types.
245
+ **
246
+ ** ------MSW------.------LSW------
247
+ ** primitive types |1..1|itype|1..................1|
248
+ ** GC objects/lightud |1..1|itype|-------GCRef--------|
249
+ ** int (LJ_DUALNUM) |1..1|itype|0..0|-----int-------|
250
+ ** number ------------double-------------
251
+ **
252
+ ** ORDER LJ_T
253
+ ** Primitive types nil/false/true must be first, lightuserdata next.
254
+ ** GC objects are at the end, table/userdata must be lowest.
255
+ ** Also check lj_ir.h for similar ordering constraints.
256
+ */
257
+ #define LJ_TNIL (~0u)
258
+ #define LJ_TFALSE (~1u)
259
+ #define LJ_TTRUE (~2u)
260
+ #define LJ_TLIGHTUD (~3u)
261
+ #define LJ_TSTR (~4u)
262
+ #define LJ_TUPVAL (~5u)
263
+ #define LJ_TTHREAD (~6u)
264
+ #define LJ_TPROTO (~7u)
265
+ #define LJ_TFUNC (~8u)
266
+ #define LJ_TTRACE (~9u)
267
+ #define LJ_TCDATA (~10u)
268
+ #define LJ_TTAB (~11u)
269
+ #define LJ_TUDATA (~12u)
270
+ /* This is just the canonical number type used in some places. */
271
+ #define LJ_TNUMX (~13u)
272
+
273
+ /* Integers have itype == LJ_TISNUM doubles have itype < LJ_TISNUM */
274
+ #if LJ_64 && !LJ_GC64
275
+ #define LJ_TISNUM 0xfffeffffu
276
+ #else
277
+ #define LJ_TISNUM LJ_TNUMX
278
+ #endif
279
+ #define LJ_TISTRUECOND LJ_TFALSE
280
+ #define LJ_TISPRI LJ_TTRUE
281
+ #define LJ_TISGCV (LJ_TSTR+1)
282
+ #define LJ_TISTABUD LJ_TTAB
283
+
284
+ #if LJ_GC64
285
+ #define LJ_GCVMASK (((uint64_t)1 << 47) - 1)
286
+ #endif
287
+
288
+ /* -- String object ------------------------------------------------------- */
289
+
290
+ /* String object header. String payload follows. */
291
+ typedef struct GCstr {
292
+ GCHeader;
293
+ uint8_t reserved; /* Used by lexer for fast lookup of reserved words. */
294
+ uint8_t unused;
295
+ MSize hash; /* Hash of string. */
296
+ MSize len; /* Size of string. */
297
+ } GCstr;
298
+
299
+ #define strref(r) (&gcref((r))->str)
300
+ #define strdata(s) ((const char *)((s)+1))
301
+ #define strdatawr(s) ((char *)((s)+1))
302
+ #define strVdata(o) strdata(strV(o))
303
+ #define sizestring(s) (sizeof(struct GCstr)+(s)->len+1)
304
+
305
+ /* -- Userdata object ----------------------------------------------------- */
306
+
307
+ /* Userdata object. Payload follows. */
308
+ typedef struct GCudata {
309
+ GCHeader;
310
+ uint8_t udtype; /* Userdata type. */
311
+ uint8_t unused2;
312
+ GCRef env; /* Should be at same offset in GCfunc. */
313
+ MSize len; /* Size of payload. */
314
+ GCRef metatable; /* Must be at same offset in GCtab. */
315
+ uint32_t align1; /* To force 8 byte alignment of the payload. */
316
+ } GCudata;
317
+
318
+ /* Userdata types. */
319
+ enum {
320
+ UDTYPE_USERDATA, /* Regular userdata. */
321
+ UDTYPE_IO_FILE, /* I/O library FILE. */
322
+ UDTYPE_FFI_CLIB, /* FFI C library namespace. */
323
+ UDTYPE__MAX
324
+ };
325
+
326
+ #define uddata(u) ((void *)((u)+1))
327
+ #define sizeudata(u) (sizeof(struct GCudata)+(u)->len)
328
+
329
+ /* -- C data object ------------------------------------------------------- */
330
+
331
+ /* C data object. Payload follows. */
332
+ typedef struct GCcdata {
333
+ GCHeader;
334
+ uint16_t ctypeid; /* C type ID. */
335
+ } GCcdata;
336
+
337
+ /* Prepended to variable-sized or realigned C data objects. */
338
+ typedef struct GCcdataVar {
339
+ uint16_t offset; /* Offset to allocated memory (relative to GCcdata). */
340
+ uint16_t extra; /* Extra space allocated (incl. GCcdata + GCcdatav). */
341
+ MSize len; /* Size of payload. */
342
+ } GCcdataVar;
343
+
344
+ #define cdataptr(cd) ((void *)((cd)+1))
345
+ #define cdataisv(cd) ((cd)->marked & 0x80)
346
+ #define cdatav(cd) ((GCcdataVar *)((char *)(cd) - sizeof(GCcdataVar)))
347
+ #define cdatavlen(cd) check_exp(cdataisv(cd), cdatav(cd)->len)
348
+ #define sizecdatav(cd) (cdatavlen(cd) + cdatav(cd)->extra)
349
+ #define memcdatav(cd) ((void *)((char *)(cd) - cdatav(cd)->offset))
350
+
351
+ /* -- Prototype object ---------------------------------------------------- */
352
+
353
+ #define SCALE_NUM_GCO ((int32_t)sizeof(lua_Number)/sizeof(GCRef))
354
+ #define round_nkgc(n) (((n) + SCALE_NUM_GCO-1) & ~(SCALE_NUM_GCO-1))
355
+
356
+ typedef struct GCproto {
357
+ GCHeader;
358
+ uint8_t numparams; /* Number of parameters. */
359
+ uint8_t framesize; /* Fixed frame size. */
360
+ MSize sizebc; /* Number of bytecode instructions. */
361
+ #if LJ_GC64
362
+ uint32_t unused_gc64;
363
+ #endif
364
+ GCRef gclist;
365
+ MRef k; /* Split constant array (points to the middle). */
366
+ MRef uv; /* Upvalue list. local slot|0x8000 or parent uv idx. */
367
+ MSize sizekgc; /* Number of collectable constants. */
368
+ MSize sizekn; /* Number of lua_Number constants. */
369
+ MSize sizept; /* Total size including colocated arrays. */
370
+ uint8_t sizeuv; /* Number of upvalues. */
371
+ uint8_t flags; /* Miscellaneous flags (see below). */
372
+ uint16_t trace; /* Anchor for chain of root traces. */
373
+ /* ------ The following fields are for debugging/tracebacks only ------ */
374
+ GCRef chunkname; /* Name of the chunk this function was defined in. */
375
+ BCLine firstline; /* First line of the function definition. */
376
+ BCLine numline; /* Number of lines for the function definition. */
377
+ MRef lineinfo; /* Compressed map from bytecode ins. to source line. */
378
+ MRef uvinfo; /* Upvalue names. */
379
+ MRef varinfo; /* Names and compressed extents of local variables. */
380
+ } GCproto;
381
+
382
+ /* Flags for prototype. */
383
+ #define PROTO_CHILD 0x01 /* Has child prototypes. */
384
+ #define PROTO_VARARG 0x02 /* Vararg function. */
385
+ #define PROTO_FFI 0x04 /* Uses BC_KCDATA for FFI datatypes. */
386
+ #define PROTO_NOJIT 0x08 /* JIT disabled for this function. */
387
+ #define PROTO_ILOOP 0x10 /* Patched bytecode with ILOOP etc. */
388
+ /* Only used during parsing. */
389
+ #define PROTO_HAS_RETURN 0x20 /* Already emitted a return. */
390
+ #define PROTO_FIXUP_RETURN 0x40 /* Need to fixup emitted returns. */
391
+ /* Top bits used for counting created closures. */
392
+ #define PROTO_CLCOUNT 0x20 /* Base of saturating 3 bit counter. */
393
+ #define PROTO_CLC_BITS 3
394
+ #define PROTO_CLC_POLY (3*PROTO_CLCOUNT) /* Polymorphic threshold. */
395
+
396
+ #define PROTO_UV_LOCAL 0x8000 /* Upvalue for local slot. */
397
+ #define PROTO_UV_IMMUTABLE 0x4000 /* Immutable upvalue. */
398
+
399
+ #define proto_kgc(pt, idx) \
400
+ check_exp((uintptr_t)(intptr_t)(idx) >= (uintptr_t)-(intptr_t)(pt)->sizekgc, \
401
+ gcref(mref((pt)->k, GCRef)[(idx)]))
402
+ #define proto_knumtv(pt, idx) \
403
+ check_exp((uintptr_t)(idx) < (pt)->sizekn, &mref((pt)->k, TValue)[(idx)])
404
+ #define proto_bc(pt) ((BCIns *)((char *)(pt) + sizeof(GCproto)))
405
+ #define proto_bcpos(pt, pc) ((BCPos)((pc) - proto_bc(pt)))
406
+ #define proto_uv(pt) (mref((pt)->uv, uint16_t))
407
+
408
+ #define proto_chunkname(pt) (strref((pt)->chunkname))
409
+ #define proto_chunknamestr(pt) (strdata(proto_chunkname((pt))))
410
+ #define proto_lineinfo(pt) (mref((pt)->lineinfo, const void))
411
+ #define proto_uvinfo(pt) (mref((pt)->uvinfo, const uint8_t))
412
+ #define proto_varinfo(pt) (mref((pt)->varinfo, const uint8_t))
413
+
414
+ /* -- Upvalue object ------------------------------------------------------ */
415
+
416
+ typedef struct GCupval {
417
+ GCHeader;
418
+ uint8_t closed; /* Set if closed (i.e. uv->v == &uv->u.value). */
419
+ uint8_t immutable; /* Immutable value. */
420
+ union {
421
+ TValue tv; /* If closed: the value itself. */
422
+ struct { /* If open: double linked list, anchored at thread. */
423
+ GCRef prev;
424
+ GCRef next;
425
+ };
426
+ };
427
+ MRef v; /* Points to stack slot (open) or above (closed). */
428
+ uint32_t dhash; /* Disambiguation hash: dh1 != dh2 => cannot alias. */
429
+ } GCupval;
430
+
431
+ #define uvprev(uv_) (&gcref((uv_)->prev)->uv)
432
+ #define uvnext(uv_) (&gcref((uv_)->next)->uv)
433
+ #define uvval(uv_) (mref((uv_)->v, TValue))
434
+
435
+ /* -- Function object (closures) ------------------------------------------ */
436
+
437
+ /* Common header for functions. env should be at same offset in GCudata. */
438
+ #define GCfuncHeader \
439
+ GCHeader; uint8_t ffid; uint8_t nupvalues; \
440
+ GCRef env; GCRef gclist; MRef pc
441
+
442
+ typedef struct GCfuncC {
443
+ GCfuncHeader;
444
+ lua_CFunction f; /* C function to be called. */
445
+ TValue upvalue[1]; /* Array of upvalues (TValue). */
446
+ } GCfuncC;
447
+
448
+ typedef struct GCfuncL {
449
+ GCfuncHeader;
450
+ GCRef uvptr[1]; /* Array of _pointers_ to upvalue objects (GCupval). */
451
+ } GCfuncL;
452
+
453
+ typedef union GCfunc {
454
+ GCfuncC c;
455
+ GCfuncL l;
456
+ } GCfunc;
457
+
458
+ #define FF_LUA 0
459
+ #define FF_C 1
460
+ #define isluafunc(fn) ((fn)->c.ffid == FF_LUA)
461
+ #define iscfunc(fn) ((fn)->c.ffid == FF_C)
462
+ #define isffunc(fn) ((fn)->c.ffid > FF_C)
463
+ #define funcproto(fn) \
464
+ check_exp(isluafunc(fn), (GCproto *)(mref((fn)->l.pc, char)-sizeof(GCproto)))
465
+ #define sizeCfunc(n) (sizeof(GCfuncC)-sizeof(TValue)+sizeof(TValue)*(n))
466
+ #define sizeLfunc(n) (sizeof(GCfuncL)-sizeof(GCRef)+sizeof(GCRef)*(n))
467
+
468
+ /* -- Table object -------------------------------------------------------- */
469
+
470
+ /* Hash node. */
471
+ typedef struct Node {
472
+ TValue val; /* Value object. Must be first field. */
473
+ TValue key; /* Key object. */
474
+ MRef next; /* Hash chain. */
475
+ #if !LJ_GC64
476
+ MRef freetop; /* Top of free elements (stored in t->node[0]). */
477
+ #endif
478
+ } Node;
479
+
480
+ LJ_STATIC_ASSERT(offsetof(Node, val) == 0);
481
+
482
+ typedef struct GCtab {
483
+ GCHeader;
484
+ uint8_t nomm; /* Negative cache for fast metamethods. */
485
+ int8_t colo; /* Array colocation. */
486
+ MRef array; /* Array part. */
487
+ GCRef gclist;
488
+ GCRef metatable; /* Must be at same offset in GCudata. */
489
+ MRef node; /* Hash part. */
490
+ uint32_t asize; /* Size of array part (keys [0, asize-1]). */
491
+ uint32_t hmask; /* Hash part mask (size of hash part - 1). */
492
+ #if LJ_GC64
493
+ MRef freetop; /* Top of free elements. */
494
+ #endif
495
+ } GCtab;
496
+
497
+ #define sizetabcolo(n) ((n)*sizeof(TValue) + sizeof(GCtab))
498
+ #define tabref(r) (&gcref((r))->tab)
499
+ #define noderef(r) (mref((r), Node))
500
+ #define nextnode(n) (mref((n)->next, Node))
501
+ #if LJ_GC64
502
+ #define getfreetop(t, n) (noderef((t)->freetop))
503
+ #define setfreetop(t, n, v) (setmref((t)->freetop, (v)))
504
+ #else
505
+ #define getfreetop(t, n) (noderef((n)->freetop))
506
+ #define setfreetop(t, n, v) (setmref((n)->freetop, (v)))
507
+ #endif
508
+
509
+ /* -- State objects ------------------------------------------------------- */
510
+
511
+ /* VM states. */
512
+ enum {
513
+ LJ_VMST_INTERP, /* Interpreter. */
514
+ LJ_VMST_C, /* C function. */
515
+ LJ_VMST_GC, /* Garbage collector. */
516
+ LJ_VMST_EXIT, /* Trace exit handler. */
517
+ LJ_VMST_RECORD, /* Trace recorder. */
518
+ LJ_VMST_OPT, /* Optimizer. */
519
+ LJ_VMST_ASM, /* Assembler. */
520
+ LJ_VMST__MAX
521
+ };
522
+
523
+ #define setvmstate(g, st) ((g)->vmstate = ~LJ_VMST_##st)
524
+
525
+ /* Metamethods. ORDER MM */
526
+ #ifdef LJ_HASFFI
527
+ #define MMDEF_FFI(_) _(new)
528
+ #else
529
+ #define MMDEF_FFI(_)
530
+ #endif
531
+
532
+ #if LJ_52 || LJ_HASFFI
533
+ #define MMDEF_PAIRS(_) _(pairs) _(ipairs)
534
+ #else
535
+ #define MMDEF_PAIRS(_)
536
+ #define MM_pairs 255
537
+ #define MM_ipairs 255
538
+ #endif
539
+
540
+ #define MMDEF(_) \
541
+ _(index) _(newindex) _(gc) _(mode) _(eq) _(len) \
542
+ /* Only the above (fast) metamethods are negative cached (max. 8). */ \
543
+ _(lt) _(le) _(concat) _(call) \
544
+ /* The following must be in ORDER ARITH. */ \
545
+ _(add) _(sub) _(mul) _(div) _(mod) _(pow) _(unm) \
546
+ /* The following are used in the standard libraries. */ \
547
+ _(metatable) _(tostring) MMDEF_FFI(_) MMDEF_PAIRS(_)
548
+
549
+ typedef enum {
550
+ #define MMENUM(name) MM_##name,
551
+ MMDEF(MMENUM)
552
+ #undef MMENUM
553
+ MM__MAX,
554
+ MM____ = MM__MAX,
555
+ MM_FAST = MM_len
556
+ } MMS;
557
+
558
+ /* GC root IDs. */
559
+ typedef enum {
560
+ GCROOT_MMNAME, /* Metamethod names. */
561
+ GCROOT_MMNAME_LAST = GCROOT_MMNAME + MM__MAX-1,
562
+ GCROOT_BASEMT, /* Metatables for base types. */
563
+ GCROOT_BASEMT_NUM = GCROOT_BASEMT + ~LJ_TNUMX,
564
+ GCROOT_IO_INPUT, /* Userdata for default I/O input file. */
565
+ GCROOT_IO_OUTPUT, /* Userdata for default I/O output file. */
566
+ GCROOT_MAX
567
+ } GCRootID;
568
+
569
+ #define basemt_it(g, it) ((g)->gcroot[GCROOT_BASEMT+~(it)])
570
+ #define basemt_obj(g, o) ((g)->gcroot[GCROOT_BASEMT+itypemap(o)])
571
+ #define mmname_str(g, mm) (strref((g)->gcroot[GCROOT_MMNAME+(mm)]))
572
+
573
+ typedef struct GCState {
574
+ GCSize total; /* Memory currently allocated. */
575
+ GCSize threshold; /* Memory threshold. */
576
+ uint8_t currentwhite; /* Current white color. */
577
+ uint8_t state; /* GC state. */
578
+ uint8_t nocdatafin; /* No cdata finalizer called. */
579
+ uint8_t unused2;
580
+ MSize sweepstr; /* Sweep position in string table. */
581
+ GCRef root; /* List of all collectable objects. */
582
+ MRef sweep; /* Sweep position in root list. */
583
+ GCRef gray; /* List of gray objects. */
584
+ GCRef grayagain; /* List of objects for atomic traversal. */
585
+ GCRef weak; /* List of weak tables (to be cleared). */
586
+ GCRef mmudata; /* List of userdata (to be finalized). */
587
+ GCSize debt; /* Debt (how much GC is behind schedule). */
588
+ GCSize estimate; /* Estimate of memory actually in use. */
589
+ MSize stepmul; /* Incremental GC step granularity. */
590
+ MSize pause; /* Pause between successive GC cycles. */
591
+ } GCState;
592
+
593
+ /* Global state, shared by all threads of a Lua universe. */
594
+ typedef struct global_State {
595
+ GCRef *strhash; /* String hash table (hash chain anchors). */
596
+ MSize strmask; /* String hash mask (size of hash table - 1). */
597
+ MSize strnum; /* Number of strings in hash table. */
598
+ lua_Alloc allocf; /* Memory allocator. */
599
+ void *allocd; /* Memory allocator data. */
600
+ GCState gc; /* Garbage collector. */
601
+ volatile int32_t vmstate; /* VM state or current JIT code trace number. */
602
+ SBuf tmpbuf; /* Temporary string buffer. */
603
+ GCstr strempty; /* Empty string. */
604
+ uint8_t stremptyz; /* Zero terminator of empty string. */
605
+ uint8_t hookmask; /* Hook mask. */
606
+ uint8_t dispatchmode; /* Dispatch mode. */
607
+ uint8_t vmevmask; /* VM event mask. */
608
+ GCRef mainthref; /* Link to main thread. */
609
+ TValue registrytv; /* Anchor for registry. */
610
+ TValue tmptv, tmptv2; /* Temporary TValues. */
611
+ Node nilnode; /* Fallback 1-element hash part (nil key and value). */
612
+ GCupval uvhead; /* Head of double-linked list of all open upvalues. */
613
+ int32_t hookcount; /* Instruction hook countdown. */
614
+ int32_t hookcstart; /* Start count for instruction hook counter. */
615
+ lua_Hook hookf; /* Hook function. */
616
+ lua_CFunction wrapf; /* Wrapper for C function calls. */
617
+ lua_CFunction panic; /* Called as a last resort for errors. */
618
+ BCIns bc_cfunc_int; /* Bytecode for internal C function calls. */
619
+ BCIns bc_cfunc_ext; /* Bytecode for external C function calls. */
620
+ GCRef cur_L; /* Currently executing lua_State. */
621
+ MRef jit_base; /* Current JIT code L->base or NULL. */
622
+ MRef ctype_state; /* Pointer to C type state. */
623
+ GCRef gcroot[GCROOT_MAX]; /* GC roots. */
624
+ } global_State;
625
+
626
+ #define mainthread(g) (&gcref(g->mainthref)->th)
627
+ #define niltv(L) \
628
+ check_exp(tvisnil(&G(L)->nilnode.val), &G(L)->nilnode.val)
629
+ #define niltvg(g) \
630
+ check_exp(tvisnil(&(g)->nilnode.val), &(g)->nilnode.val)
631
+
632
+ /* Hook management. Hook event masks are defined in lua.h. */
633
+ #define HOOK_EVENTMASK 0x0f
634
+ #define HOOK_ACTIVE 0x10
635
+ #define HOOK_ACTIVE_SHIFT 4
636
+ #define HOOK_VMEVENT 0x20
637
+ #define HOOK_GC 0x40
638
+ #define HOOK_PROFILE 0x80
639
+ #define hook_active(g) ((g)->hookmask & HOOK_ACTIVE)
640
+ #define hook_enter(g) ((g)->hookmask |= HOOK_ACTIVE)
641
+ #define hook_entergc(g) ((g)->hookmask |= (HOOK_ACTIVE|HOOK_GC))
642
+ #define hook_vmevent(g) ((g)->hookmask |= (HOOK_ACTIVE|HOOK_VMEVENT))
643
+ #define hook_leave(g) ((g)->hookmask &= ~HOOK_ACTIVE)
644
+ #define hook_save(g) ((g)->hookmask & ~HOOK_EVENTMASK)
645
+ #define hook_restore(g, h) \
646
+ ((g)->hookmask = ((g)->hookmask & HOOK_EVENTMASK) | (h))
647
+
648
+ /* Per-thread state object. */
649
+ struct lua_State {
650
+ GCHeader;
651
+ uint8_t dummy_ffid; /* Fake FF_C for curr_funcisL() on dummy frames. */
652
+ uint8_t status; /* Thread status. */
653
+ MRef glref; /* Link to global state. */
654
+ GCRef gclist; /* GC chain. */
655
+ TValue *base; /* Base of currently executing function. */
656
+ TValue *top; /* First free slot in the stack. */
657
+ MRef maxstack; /* Last free slot in the stack. */
658
+ MRef stack; /* Stack base. */
659
+ GCRef openupval; /* List of open upvalues in the stack. */
660
+ GCRef env; /* Thread environment (table of globals). */
661
+ void *cframe; /* End of C stack frame chain. */
662
+ MSize stacksize; /* True stack size (incl. LJ_STACK_EXTRA). */
663
+ };
664
+
665
+ #define G(L) (mref(L->glref, global_State))
666
+ #define registry(L) (&G(L)->registrytv)
667
+
668
+ /* Macros to access the currently executing (Lua) function. */
669
+ #if LJ_GC64
670
+ #define curr_func(L) (&gcval(L->base-2)->fn)
671
+ #elif LJ_FR2
672
+ #define curr_func(L) (&gcref((L->base-2)->gcr)->fn)
673
+ #else
674
+ #define curr_func(L) (&gcref((L->base-1)->fr.func)->fn)
675
+ #endif
676
+ #define curr_funcisL(L) (isluafunc(curr_func(L)))
677
+ #define curr_proto(L) (funcproto(curr_func(L)))
678
+ #define curr_topL(L) (L->base + curr_proto(L)->framesize)
679
+ #define curr_top(L) (curr_funcisL(L) ? curr_topL(L) : L->top)
680
+
681
+ /* -- GC object definition and conversions -------------------------------- */
682
+
683
+ /* GC header for generic access to common fields of GC objects. */
684
+ typedef struct GChead {
685
+ GCHeader;
686
+ uint8_t unused1;
687
+ uint8_t unused2;
688
+ GCRef env;
689
+ GCRef gclist;
690
+ GCRef metatable;
691
+ } GChead;
692
+
693
+ /* The env field SHOULD be at the same offset for all GC objects. */
694
+ LJ_STATIC_ASSERT(offsetof(GChead, env) == offsetof(GCfuncL, env));
695
+ LJ_STATIC_ASSERT(offsetof(GChead, env) == offsetof(GCudata, env));
696
+
697
+ /* The metatable field MUST be at the same offset for all GC objects. */
698
+ LJ_STATIC_ASSERT(offsetof(GChead, metatable) == offsetof(GCtab, metatable));
699
+ LJ_STATIC_ASSERT(offsetof(GChead, metatable) == offsetof(GCudata, metatable));
700
+
701
+ /* The gclist field MUST be at the same offset for all GC objects. */
702
+ LJ_STATIC_ASSERT(offsetof(GChead, gclist) == offsetof(lua_State, gclist));
703
+ LJ_STATIC_ASSERT(offsetof(GChead, gclist) == offsetof(GCproto, gclist));
704
+ LJ_STATIC_ASSERT(offsetof(GChead, gclist) == offsetof(GCfuncL, gclist));
705
+ LJ_STATIC_ASSERT(offsetof(GChead, gclist) == offsetof(GCtab, gclist));
706
+
707
+ typedef union GCobj {
708
+ GChead gch;
709
+ GCstr str;
710
+ GCupval uv;
711
+ lua_State th;
712
+ GCproto pt;
713
+ GCfunc fn;
714
+ GCcdata cd;
715
+ GCtab tab;
716
+ GCudata ud;
717
+ } GCobj;
718
+
719
+ /* Macros to convert a GCobj pointer into a specific value. */
720
+ #define gco2str(o) check_exp((o)->gch.gct == ~LJ_TSTR, &(o)->str)
721
+ #define gco2uv(o) check_exp((o)->gch.gct == ~LJ_TUPVAL, &(o)->uv)
722
+ #define gco2th(o) check_exp((o)->gch.gct == ~LJ_TTHREAD, &(o)->th)
723
+ #define gco2pt(o) check_exp((o)->gch.gct == ~LJ_TPROTO, &(o)->pt)
724
+ #define gco2func(o) check_exp((o)->gch.gct == ~LJ_TFUNC, &(o)->fn)
725
+ #define gco2cd(o) check_exp((o)->gch.gct == ~LJ_TCDATA, &(o)->cd)
726
+ #define gco2tab(o) check_exp((o)->gch.gct == ~LJ_TTAB, &(o)->tab)
727
+ #define gco2ud(o) check_exp((o)->gch.gct == ~LJ_TUDATA, &(o)->ud)
728
+
729
+ /* Macro to convert any collectable object into a GCobj pointer. */
730
+ #define obj2gco(v) ((GCobj *)(v))
731
+
732
+ /* -- TValue getters/setters ---------------------------------------------- */
733
+
734
+ #ifdef LUA_USE_ASSERT
735
+ #include "lj_gc.h"
736
+ #endif
737
+
738
+ /* Macros to test types. */
739
+ #if LJ_GC64
740
+ #define itype(o) ((uint32_t)((o)->it64 >> 47))
741
+ #define tvisnil(o) ((o)->it64 == -1)
742
+ #else
743
+ #define itype(o) ((o)->it)
744
+ #define tvisnil(o) (itype(o) == LJ_TNIL)
745
+ #endif
746
+ #define tvisfalse(o) (itype(o) == LJ_TFALSE)
747
+ #define tvistrue(o) (itype(o) == LJ_TTRUE)
748
+ #define tvisbool(o) (tvisfalse(o) || tvistrue(o))
749
+ #if LJ_64 && !LJ_GC64
750
+ #define tvislightud(o) (((int32_t)itype(o) >> 15) == -2)
751
+ #else
752
+ #define tvislightud(o) (itype(o) == LJ_TLIGHTUD)
753
+ #endif
754
+ #define tvisstr(o) (itype(o) == LJ_TSTR)
755
+ #define tvisfunc(o) (itype(o) == LJ_TFUNC)
756
+ #define tvisthread(o) (itype(o) == LJ_TTHREAD)
757
+ #define tvisproto(o) (itype(o) == LJ_TPROTO)
758
+ #define tviscdata(o) (itype(o) == LJ_TCDATA)
759
+ #define tvistab(o) (itype(o) == LJ_TTAB)
760
+ #define tvisudata(o) (itype(o) == LJ_TUDATA)
761
+ #define tvisnumber(o) (itype(o) <= LJ_TISNUM)
762
+ #define tvisint(o) (LJ_DUALNUM && itype(o) == LJ_TISNUM)
763
+ #define tvisnum(o) (itype(o) < LJ_TISNUM)
764
+
765
+ #define tvistruecond(o) (itype(o) < LJ_TISTRUECOND)
766
+ #define tvispri(o) (itype(o) >= LJ_TISPRI)
767
+ #define tvistabud(o) (itype(o) <= LJ_TISTABUD) /* && !tvisnum() */
768
+ #define tvisgcv(o) ((itype(o) - LJ_TISGCV) > (LJ_TNUMX - LJ_TISGCV))
769
+
770
+ /* Special macros to test numbers for NaN, +0, -0, +1 and raw equality. */
771
+ #define tvisnan(o) ((o)->n != (o)->n)
772
+ #if LJ_64
773
+ #define tviszero(o) (((o)->u64 << 1) == 0)
774
+ #else
775
+ #define tviszero(o) (((o)->u32.lo | ((o)->u32.hi << 1)) == 0)
776
+ #endif
777
+ #define tvispzero(o) ((o)->u64 == 0)
778
+ #define tvismzero(o) ((o)->u64 == U64x(80000000,00000000))
779
+ #define tvispone(o) ((o)->u64 == U64x(3ff00000,00000000))
780
+ #define rawnumequal(o1, o2) ((o1)->u64 == (o2)->u64)
781
+
782
+ /* Macros to convert type ids. */
783
+ #if LJ_64 && !LJ_GC64
784
+ #define itypemap(o) \
785
+ (tvisnumber(o) ? ~LJ_TNUMX : tvislightud(o) ? ~LJ_TLIGHTUD : ~itype(o))
786
+ #else
787
+ #define itypemap(o) (tvisnumber(o) ? ~LJ_TNUMX : ~itype(o))
788
+ #endif
789
+
790
+ /* Macros to get tagged values. */
791
+ #if LJ_GC64
792
+ #define gcval(o) ((GCobj *)(gcrefu((o)->gcr) & LJ_GCVMASK))
793
+ #else
794
+ #define gcval(o) (gcref((o)->gcr))
795
+ #endif
796
+ #define boolV(o) check_exp(tvisbool(o), (LJ_TFALSE - itype(o)))
797
+ #if LJ_64
798
+ #define lightudV(o) \
799
+ check_exp(tvislightud(o), (void *)((o)->u64 & U64x(00007fff,ffffffff)))
800
+ #else
801
+ #define lightudV(o) check_exp(tvislightud(o), gcrefp((o)->gcr, void))
802
+ #endif
803
+ #define gcV(o) check_exp(tvisgcv(o), gcval(o))
804
+ #define strV(o) check_exp(tvisstr(o), &gcval(o)->str)
805
+ #define funcV(o) check_exp(tvisfunc(o), &gcval(o)->fn)
806
+ #define threadV(o) check_exp(tvisthread(o), &gcval(o)->th)
807
+ #define protoV(o) check_exp(tvisproto(o), &gcval(o)->pt)
808
+ #define cdataV(o) check_exp(tviscdata(o), &gcval(o)->cd)
809
+ #define tabV(o) check_exp(tvistab(o), &gcval(o)->tab)
810
+ #define udataV(o) check_exp(tvisudata(o), &gcval(o)->ud)
811
+ #define numV(o) check_exp(tvisnum(o), (o)->n)
812
+ #define intV(o) check_exp(tvisint(o), (int32_t)(o)->i)
813
+
814
+ /* Macros to set tagged values. */
815
+ #if LJ_GC64
816
+ #define setitype(o, i) ((o)->it = ((i) << 15))
817
+ #define setnilV(o) ((o)->it64 = -1)
818
+ #define setpriV(o, x) ((o)->it64 = (int64_t)~((uint64_t)~(x)<<47))
819
+ #define setboolV(o, x) ((o)->it64 = (int64_t)~((uint64_t)((x)+1)<<47))
820
+ #else
821
+ #define setitype(o, i) ((o)->it = (i))
822
+ #define setnilV(o) ((o)->it = LJ_TNIL)
823
+ #define setboolV(o, x) ((o)->it = LJ_TFALSE-(uint32_t)(x))
824
+ #define setpriV(o, i) (setitype((o), (i)))
825
+ #endif
826
+
827
+ static LJ_AINLINE void setlightudV(TValue *o, void *p)
828
+ {
829
+ #if LJ_GC64
830
+ o->u64 = (uint64_t)p | (((uint64_t)LJ_TLIGHTUD) << 47);
831
+ #elif LJ_64
832
+ o->u64 = (uint64_t)p | (((uint64_t)0xffff) << 48);
833
+ #else
834
+ setgcrefp(o->gcr, p); setitype(o, LJ_TLIGHTUD);
835
+ #endif
836
+ }
837
+
838
+ #if LJ_64
839
+ #define checklightudptr(L, p) \
840
+ (((uint64_t)(p) >> 47) ? (lj_err_msg(L, LJ_ERR_BADLU), NULL) : (p))
841
+ #else
842
+ #define checklightudptr(L, p) (p)
843
+ #endif
844
+
845
+ #if LJ_FR2
846
+ #define setcont(o, f) ((o)->u64 = (uint64_t)(uintptr_t)(void *)(f))
847
+ #elif LJ_64
848
+ #define setcont(o, f) \
849
+ ((o)->u64 = (uint64_t)(void *)(f) - (uint64_t)lj_vm_asm_begin)
850
+ #else
851
+ #define setcont(o, f) setlightudV((o), (void *)(f))
852
+ #endif
853
+
854
+ #define tvchecklive(L, o) \
855
+ UNUSED(L), lua_assert(!tvisgcv(o) || \
856
+ ((~itype(o) == gcval(o)->gch.gct) && !isdead(G(L), gcval(o))))
857
+
858
+ static LJ_AINLINE void setgcVraw(TValue *o, GCobj *v, uint32_t itype)
859
+ {
860
+ #if LJ_GC64
861
+ setgcreft(o->gcr, v, itype);
862
+ #else
863
+ setgcref(o->gcr, v); setitype(o, itype);
864
+ #endif
865
+ }
866
+
867
+ static LJ_AINLINE void setgcV(lua_State *L, TValue *o, GCobj *v, uint32_t it)
868
+ {
869
+ setgcVraw(o, v, it); tvchecklive(L, o);
870
+ }
871
+
872
+ #define define_setV(name, type, tag) \
873
+ static LJ_AINLINE void name(lua_State *L, TValue *o, type *v) \
874
+ { \
875
+ setgcV(L, o, obj2gco(v), tag); \
876
+ }
877
+ define_setV(setstrV, GCstr, LJ_TSTR)
878
+ define_setV(setthreadV, lua_State, LJ_TTHREAD)
879
+ define_setV(setprotoV, GCproto, LJ_TPROTO)
880
+ define_setV(setfuncV, GCfunc, LJ_TFUNC)
881
+ define_setV(setcdataV, GCcdata, LJ_TCDATA)
882
+ define_setV(settabV, GCtab, LJ_TTAB)
883
+ define_setV(setudataV, GCudata, LJ_TUDATA)
884
+
885
+ #define setnumV(o, x) ((o)->n = (x))
886
+ #define setnanV(o) ((o)->u64 = U64x(fff80000,00000000))
887
+ #define setpinfV(o) ((o)->u64 = U64x(7ff00000,00000000))
888
+ #define setminfV(o) ((o)->u64 = U64x(fff00000,00000000))
889
+
890
+ static LJ_AINLINE void setintV(TValue *o, int32_t i)
891
+ {
892
+ #if LJ_DUALNUM
893
+ o->i = (uint32_t)i; setitype(o, LJ_TISNUM);
894
+ #else
895
+ o->n = (lua_Number)i;
896
+ #endif
897
+ }
898
+
899
+ static LJ_AINLINE void setint64V(TValue *o, int64_t i)
900
+ {
901
+ if (LJ_DUALNUM && LJ_LIKELY(i == (int64_t)(int32_t)i))
902
+ setintV(o, (int32_t)i);
903
+ else
904
+ setnumV(o, (lua_Number)i);
905
+ }
906
+
907
+ #if LJ_64
908
+ #define setintptrV(o, i) setint64V((o), (i))
909
+ #else
910
+ #define setintptrV(o, i) setintV((o), (i))
911
+ #endif
912
+
913
+ /* Copy tagged values. */
914
+ static LJ_AINLINE void copyTV(lua_State *L, TValue *o1, const TValue *o2)
915
+ {
916
+ *o1 = *o2; tvchecklive(L, o1);
917
+ }
918
+
919
+ /* -- Number to integer conversion ---------------------------------------- */
920
+
921
+ #if LJ_SOFTFP
922
+ LJ_ASMF int32_t lj_vm_tobit(double x);
923
+ #endif
924
+
925
+ static LJ_AINLINE int32_t lj_num2bit(lua_Number n)
926
+ {
927
+ #if LJ_SOFTFP
928
+ return lj_vm_tobit(n);
929
+ #else
930
+ TValue o;
931
+ o.n = n + 6755399441055744.0; /* 2^52 + 2^51 */
932
+ return (int32_t)o.u32.lo;
933
+ #endif
934
+ }
935
+
936
+ #define lj_num2int(n) ((int32_t)(n))
937
+
938
+ static LJ_AINLINE uint64_t lj_num2u64(lua_Number n)
939
+ {
940
+ #ifdef _MSC_VER
941
+ if (n >= 9223372036854775808.0) /* They think it's a feature. */
942
+ return (uint64_t)(int64_t)(n - 18446744073709551616.0);
943
+ else
944
+ #endif
945
+ return (uint64_t)n;
946
+ }
947
+
948
+ static LJ_AINLINE int32_t numberVint(cTValue *o)
949
+ {
950
+ if (LJ_LIKELY(tvisint(o)))
951
+ return intV(o);
952
+ else
953
+ return lj_num2int(numV(o));
954
+ }
955
+
956
+ static LJ_AINLINE lua_Number numberVnum(cTValue *o)
957
+ {
958
+ if (LJ_UNLIKELY(tvisint(o)))
959
+ return (lua_Number)intV(o);
960
+ else
961
+ return numV(o);
962
+ }
963
+
964
+ /* -- Miscellaneous object handling --------------------------------------- */
965
+
966
+ /* Names and maps for internal and external object tags. */
967
+ LJ_DATA const char *const lj_obj_typename[1+LUA_TCDATA+1];
968
+ LJ_DATA const char *const lj_obj_itypename[~LJ_TNUMX+1];
969
+
970
+ #define lj_typename(o) (lj_obj_itypename[itypemap(o)])
971
+
972
+ /* Compare two objects without calling metamethods. */
973
+ LJ_FUNC int LJ_FASTCALL lj_obj_equal(cTValue *o1, cTValue *o2);
974
+ LJ_FUNC const void * LJ_FASTCALL lj_obj_ptr(cTValue *o);
975
+
976
+ #endif