immunio 0.15.4 → 0.16.0

Sign up to get free protection for your applications and to get access to all the features.
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,449 @@
1
+ /*
2
+ ** LOOP: Loop Optimizations.
3
+ ** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h
4
+ */
5
+
6
+ #define lj_opt_loop_c
7
+ #define LUA_CORE
8
+
9
+ #include "lj_obj.h"
10
+
11
+ #if LJ_HASJIT
12
+
13
+ #include "lj_err.h"
14
+ #include "lj_buf.h"
15
+ #include "lj_ir.h"
16
+ #include "lj_jit.h"
17
+ #include "lj_iropt.h"
18
+ #include "lj_trace.h"
19
+ #include "lj_snap.h"
20
+ #include "lj_vm.h"
21
+
22
+ /* Loop optimization:
23
+ **
24
+ ** Traditional Loop-Invariant Code Motion (LICM) splits the instructions
25
+ ** of a loop into invariant and variant instructions. The invariant
26
+ ** instructions are hoisted out of the loop and only the variant
27
+ ** instructions remain inside the loop body.
28
+ **
29
+ ** Unfortunately LICM is mostly useless for compiling dynamic languages.
30
+ ** The IR has many guards and most of the subsequent instructions are
31
+ ** control-dependent on them. The first non-hoistable guard would
32
+ ** effectively prevent hoisting of all subsequent instructions.
33
+ **
34
+ ** That's why we use a special form of unrolling using copy-substitution,
35
+ ** combined with redundancy elimination:
36
+ **
37
+ ** The recorded instruction stream is re-emitted to the compiler pipeline
38
+ ** with substituted operands. The substitution table is filled with the
39
+ ** refs returned by re-emitting each instruction. This can be done
40
+ ** on-the-fly, because the IR is in strict SSA form, where every ref is
41
+ ** defined before its use.
42
+ **
43
+ ** This aproach generates two code sections, separated by the LOOP
44
+ ** instruction:
45
+ **
46
+ ** 1. The recorded instructions form a kind of pre-roll for the loop. It
47
+ ** contains a mix of invariant and variant instructions and performs
48
+ ** exactly one loop iteration (but not necessarily the 1st iteration).
49
+ **
50
+ ** 2. The loop body contains only the variant instructions and performs
51
+ ** all remaining loop iterations.
52
+ **
53
+ ** On first sight that looks like a waste of space, because the variant
54
+ ** instructions are present twice. But the key insight is that the
55
+ ** pre-roll honors the control-dependencies for *both* the pre-roll itself
56
+ ** *and* the loop body!
57
+ **
58
+ ** It also means one doesn't have to explicitly model control-dependencies
59
+ ** (which, BTW, wouldn't help LICM much). And it's much easier to
60
+ ** integrate sparse snapshotting with this approach.
61
+ **
62
+ ** One of the nicest aspects of this approach is that all of the
63
+ ** optimizations of the compiler pipeline (FOLD, CSE, FWD, etc.) can be
64
+ ** reused with only minor restrictions (e.g. one should not fold
65
+ ** instructions across loop-carried dependencies).
66
+ **
67
+ ** But in general all optimizations can be applied which only need to look
68
+ ** backwards into the generated instruction stream. At any point in time
69
+ ** during the copy-substitution process this contains both a static loop
70
+ ** iteration (the pre-roll) and a dynamic one (from the to-be-copied
71
+ ** instruction up to the end of the partial loop body).
72
+ **
73
+ ** Since control-dependencies are implicitly kept, CSE also applies to all
74
+ ** kinds of guards. The major advantage is that all invariant guards can
75
+ ** be hoisted, too.
76
+ **
77
+ ** Load/store forwarding works across loop iterations, too. This is
78
+ ** important if loop-carried dependencies are kept in upvalues or tables.
79
+ ** E.g. 'self.idx = self.idx + 1' deep down in some OO-style method may
80
+ ** become a forwarded loop-recurrence after inlining.
81
+ **
82
+ ** Since the IR is in SSA form, loop-carried dependencies have to be
83
+ ** modeled with PHI instructions. The potential candidates for PHIs are
84
+ ** collected on-the-fly during copy-substitution. After eliminating the
85
+ ** redundant ones, PHI instructions are emitted *below* the loop body.
86
+ **
87
+ ** Note that this departure from traditional SSA form doesn't change the
88
+ ** semantics of the PHI instructions themselves. But it greatly simplifies
89
+ ** on-the-fly generation of the IR and the machine code.
90
+ */
91
+
92
+ /* Some local macros to save typing. Undef'd at the end. */
93
+ #define IR(ref) (&J->cur.ir[(ref)])
94
+
95
+ /* Pass IR on to next optimization in chain (FOLD). */
96
+ #define emitir(ot, a, b) (lj_ir_set(J, (ot), (a), (b)), lj_opt_fold(J))
97
+
98
+ /* Emit raw IR without passing through optimizations. */
99
+ #define emitir_raw(ot, a, b) (lj_ir_set(J, (ot), (a), (b)), lj_ir_emit(J))
100
+
101
+ /* -- PHI elimination ----------------------------------------------------- */
102
+
103
+ /* Emit or eliminate collected PHIs. */
104
+ static void loop_emit_phi(jit_State *J, IRRef1 *subst, IRRef1 *phi, IRRef nphi,
105
+ SnapNo onsnap)
106
+ {
107
+ int passx = 0;
108
+ IRRef i, j, nslots;
109
+ IRRef invar = J->chain[IR_LOOP];
110
+ /* Pass #1: mark redundant and potentially redundant PHIs. */
111
+ for (i = 0, j = 0; i < nphi; i++) {
112
+ IRRef lref = phi[i];
113
+ IRRef rref = subst[lref];
114
+ if (lref == rref || rref == REF_DROP) { /* Invariants are redundant. */
115
+ irt_clearphi(IR(lref)->t);
116
+ } else {
117
+ phi[j++] = (IRRef1)lref;
118
+ if (!(IR(rref)->op1 == lref || IR(rref)->op2 == lref)) {
119
+ /* Quick check for simple recurrences failed, need pass2. */
120
+ irt_setmark(IR(lref)->t);
121
+ passx = 1;
122
+ }
123
+ }
124
+ }
125
+ nphi = j;
126
+ /* Pass #2: traverse variant part and clear marks of non-redundant PHIs. */
127
+ if (passx) {
128
+ SnapNo s;
129
+ for (i = J->cur.nins-1; i > invar; i--) {
130
+ IRIns *ir = IR(i);
131
+ if (!irref_isk(ir->op2)) irt_clearmark(IR(ir->op2)->t);
132
+ if (!irref_isk(ir->op1)) {
133
+ irt_clearmark(IR(ir->op1)->t);
134
+ if (ir->op1 < invar &&
135
+ ir->o >= IR_CALLN && ir->o <= IR_CARG) { /* ORDER IR */
136
+ ir = IR(ir->op1);
137
+ while (ir->o == IR_CARG) {
138
+ if (!irref_isk(ir->op2)) irt_clearmark(IR(ir->op2)->t);
139
+ if (irref_isk(ir->op1)) break;
140
+ ir = IR(ir->op1);
141
+ irt_clearmark(ir->t);
142
+ }
143
+ }
144
+ }
145
+ }
146
+ for (s = J->cur.nsnap-1; s >= onsnap; s--) {
147
+ SnapShot *snap = &J->cur.snap[s];
148
+ SnapEntry *map = &J->cur.snapmap[snap->mapofs];
149
+ MSize n, nent = snap->nent;
150
+ for (n = 0; n < nent; n++) {
151
+ IRRef ref = snap_ref(map[n]);
152
+ if (!irref_isk(ref)) irt_clearmark(IR(ref)->t);
153
+ }
154
+ }
155
+ }
156
+ /* Pass #3: add PHIs for variant slots without a corresponding SLOAD. */
157
+ nslots = J->baseslot+J->maxslot;
158
+ for (i = 1; i < nslots; i++) {
159
+ IRRef ref = tref_ref(J->slot[i]);
160
+ while (!irref_isk(ref) && ref != subst[ref]) {
161
+ IRIns *ir = IR(ref);
162
+ irt_clearmark(ir->t); /* Unmark potential uses, too. */
163
+ if (irt_isphi(ir->t) || irt_ispri(ir->t))
164
+ break;
165
+ irt_setphi(ir->t);
166
+ if (nphi >= LJ_MAX_PHI)
167
+ lj_trace_err(J, LJ_TRERR_PHIOV);
168
+ phi[nphi++] = (IRRef1)ref;
169
+ ref = subst[ref];
170
+ if (ref > invar)
171
+ break;
172
+ }
173
+ }
174
+ /* Pass #4: propagate non-redundant PHIs. */
175
+ while (passx) {
176
+ passx = 0;
177
+ for (i = 0; i < nphi; i++) {
178
+ IRRef lref = phi[i];
179
+ IRIns *ir = IR(lref);
180
+ if (!irt_ismarked(ir->t)) { /* Propagate only from unmarked PHIs. */
181
+ IRIns *irr = IR(subst[lref]);
182
+ if (irt_ismarked(irr->t)) { /* Right ref points to other PHI? */
183
+ irt_clearmark(irr->t); /* Mark that PHI as non-redundant. */
184
+ passx = 1; /* Retry. */
185
+ }
186
+ }
187
+ }
188
+ }
189
+ /* Pass #5: emit PHI instructions or eliminate PHIs. */
190
+ for (i = 0; i < nphi; i++) {
191
+ IRRef lref = phi[i];
192
+ IRIns *ir = IR(lref);
193
+ if (!irt_ismarked(ir->t)) { /* Emit PHI if not marked. */
194
+ IRRef rref = subst[lref];
195
+ if (rref > invar)
196
+ irt_setphi(IR(rref)->t);
197
+ emitir_raw(IRT(IR_PHI, irt_type(ir->t)), lref, rref);
198
+ } else { /* Otherwise eliminate PHI. */
199
+ irt_clearmark(ir->t);
200
+ irt_clearphi(ir->t);
201
+ }
202
+ }
203
+ }
204
+
205
+ /* -- Loop unrolling using copy-substitution ------------------------------ */
206
+
207
+ /* Copy-substitute snapshot. */
208
+ static void loop_subst_snap(jit_State *J, SnapShot *osnap,
209
+ SnapEntry *loopmap, IRRef1 *subst)
210
+ {
211
+ SnapEntry *nmap, *omap = &J->cur.snapmap[osnap->mapofs];
212
+ SnapEntry *nextmap = &J->cur.snapmap[snap_nextofs(&J->cur, osnap)];
213
+ MSize nmapofs;
214
+ MSize on, ln, nn, onent = osnap->nent;
215
+ BCReg nslots = osnap->nslots;
216
+ SnapShot *snap = &J->cur.snap[J->cur.nsnap];
217
+ if (irt_isguard(J->guardemit)) { /* Guard inbetween? */
218
+ nmapofs = J->cur.nsnapmap;
219
+ J->cur.nsnap++; /* Add new snapshot. */
220
+ } else { /* Otherwise overwrite previous snapshot. */
221
+ snap--;
222
+ nmapofs = snap->mapofs;
223
+ }
224
+ J->guardemit.irt = 0;
225
+ /* Setup new snapshot. */
226
+ snap->mapofs = (uint16_t)nmapofs;
227
+ snap->ref = (IRRef1)J->cur.nins;
228
+ snap->nslots = nslots;
229
+ snap->topslot = osnap->topslot;
230
+ snap->count = 0;
231
+ nmap = &J->cur.snapmap[nmapofs];
232
+ /* Substitute snapshot slots. */
233
+ on = ln = nn = 0;
234
+ while (on < onent) {
235
+ SnapEntry osn = omap[on], lsn = loopmap[ln];
236
+ if (snap_slot(lsn) < snap_slot(osn)) { /* Copy slot from loop map. */
237
+ nmap[nn++] = lsn;
238
+ ln++;
239
+ } else { /* Copy substituted slot from snapshot map. */
240
+ if (snap_slot(lsn) == snap_slot(osn)) ln++; /* Shadowed loop slot. */
241
+ if (!irref_isk(snap_ref(osn)))
242
+ osn = snap_setref(osn, subst[snap_ref(osn)]);
243
+ nmap[nn++] = osn;
244
+ on++;
245
+ }
246
+ }
247
+ while (snap_slot(loopmap[ln]) < nslots) /* Copy remaining loop slots. */
248
+ nmap[nn++] = loopmap[ln++];
249
+ snap->nent = (uint8_t)nn;
250
+ omap += onent;
251
+ nmap += nn;
252
+ while (omap < nextmap) /* Copy PC + frame links. */
253
+ *nmap++ = *omap++;
254
+ J->cur.nsnapmap = (uint16_t)(nmap - J->cur.snapmap);
255
+ }
256
+
257
+ typedef struct LoopState {
258
+ jit_State *J;
259
+ IRRef1 *subst;
260
+ MSize sizesubst;
261
+ } LoopState;
262
+
263
+ /* Unroll loop. */
264
+ static void loop_unroll(LoopState *lps)
265
+ {
266
+ jit_State *J = lps->J;
267
+ IRRef1 phi[LJ_MAX_PHI];
268
+ uint32_t nphi = 0;
269
+ IRRef1 *subst;
270
+ SnapNo onsnap;
271
+ SnapShot *osnap, *loopsnap;
272
+ SnapEntry *loopmap, *psentinel;
273
+ IRRef ins, invar;
274
+
275
+ /* Allocate substitution table.
276
+ ** Only non-constant refs in [REF_BIAS,invar) are valid indexes.
277
+ */
278
+ invar = J->cur.nins;
279
+ lps->sizesubst = invar - REF_BIAS;
280
+ lps->subst = lj_mem_newvec(J->L, lps->sizesubst, IRRef1);
281
+ subst = lps->subst - REF_BIAS;
282
+ subst[REF_BASE] = REF_BASE;
283
+
284
+ /* LOOP separates the pre-roll from the loop body. */
285
+ emitir_raw(IRTG(IR_LOOP, IRT_NIL), 0, 0);
286
+
287
+ /* Grow snapshot buffer and map for copy-substituted snapshots.
288
+ ** Need up to twice the number of snapshots minus #0 and loop snapshot.
289
+ ** Need up to twice the number of entries plus fallback substitutions
290
+ ** from the loop snapshot entries for each new snapshot.
291
+ ** Caveat: both calls may reallocate J->cur.snap and J->cur.snapmap!
292
+ */
293
+ onsnap = J->cur.nsnap;
294
+ lj_snap_grow_buf(J, 2*onsnap-2);
295
+ lj_snap_grow_map(J, J->cur.nsnapmap*2+(onsnap-2)*J->cur.snap[onsnap-1].nent);
296
+
297
+ /* The loop snapshot is used for fallback substitutions. */
298
+ loopsnap = &J->cur.snap[onsnap-1];
299
+ loopmap = &J->cur.snapmap[loopsnap->mapofs];
300
+ /* The PC of snapshot #0 and the loop snapshot must match. */
301
+ psentinel = &loopmap[loopsnap->nent];
302
+ lua_assert(*psentinel == J->cur.snapmap[J->cur.snap[0].nent]);
303
+ *psentinel = SNAP(255, 0, 0); /* Replace PC with temporary sentinel. */
304
+
305
+ /* Start substitution with snapshot #1 (#0 is empty for root traces). */
306
+ osnap = &J->cur.snap[1];
307
+
308
+ /* Copy and substitute all recorded instructions and snapshots. */
309
+ for (ins = REF_FIRST; ins < invar; ins++) {
310
+ IRIns *ir;
311
+ IRRef op1, op2;
312
+
313
+ if (ins >= osnap->ref) /* Instruction belongs to next snapshot? */
314
+ loop_subst_snap(J, osnap++, loopmap, subst); /* Copy-substitute it. */
315
+
316
+ /* Substitute instruction operands. */
317
+ ir = IR(ins);
318
+ op1 = ir->op1;
319
+ if (!irref_isk(op1)) op1 = subst[op1];
320
+ op2 = ir->op2;
321
+ if (!irref_isk(op2)) op2 = subst[op2];
322
+ if (irm_kind(lj_ir_mode[ir->o]) == IRM_N &&
323
+ op1 == ir->op1 && op2 == ir->op2) { /* Regular invariant ins? */
324
+ subst[ins] = (IRRef1)ins; /* Shortcut. */
325
+ } else {
326
+ /* Re-emit substituted instruction to the FOLD/CSE/etc. pipeline. */
327
+ IRType1 t = ir->t; /* Get this first, since emitir may invalidate ir. */
328
+ IRRef ref = tref_ref(emitir(ir->ot & ~IRT_ISPHI, op1, op2));
329
+ subst[ins] = (IRRef1)ref;
330
+ if (ref != ins) {
331
+ IRIns *irr = IR(ref);
332
+ if (ref < invar) { /* Loop-carried dependency? */
333
+ /* Potential PHI? */
334
+ if (!irref_isk(ref) && !irt_isphi(irr->t) && !irt_ispri(irr->t)) {
335
+ irt_setphi(irr->t);
336
+ if (nphi >= LJ_MAX_PHI)
337
+ lj_trace_err(J, LJ_TRERR_PHIOV);
338
+ phi[nphi++] = (IRRef1)ref;
339
+ }
340
+ /* Check all loop-carried dependencies for type instability. */
341
+ if (!irt_sametype(t, irr->t)) {
342
+ if (irt_isinteger(t) && irt_isinteger(irr->t))
343
+ continue;
344
+ else if (irt_isnum(t) && irt_isinteger(irr->t)) /* Fix int->num. */
345
+ ref = tref_ref(emitir(IRTN(IR_CONV), ref, IRCONV_NUM_INT));
346
+ else if (irt_isnum(irr->t) && irt_isinteger(t)) /* Fix num->int. */
347
+ ref = tref_ref(emitir(IRTGI(IR_CONV), ref,
348
+ IRCONV_INT_NUM|IRCONV_CHECK));
349
+ else
350
+ lj_trace_err(J, LJ_TRERR_TYPEINS);
351
+ subst[ins] = (IRRef1)ref;
352
+ irr = IR(ref);
353
+ goto phiconv;
354
+ }
355
+ } else if (ref != REF_DROP && irr->o == IR_CONV &&
356
+ ref > invar && irr->op1 < invar) {
357
+ /* May need an extra PHI for a CONV. */
358
+ ref = irr->op1;
359
+ irr = IR(ref);
360
+ phiconv:
361
+ if (ref < invar && !irref_isk(ref) && !irt_isphi(irr->t)) {
362
+ irt_setphi(irr->t);
363
+ if (nphi >= LJ_MAX_PHI)
364
+ lj_trace_err(J, LJ_TRERR_PHIOV);
365
+ phi[nphi++] = (IRRef1)ref;
366
+ }
367
+ }
368
+ }
369
+ }
370
+ }
371
+ if (!irt_isguard(J->guardemit)) /* Drop redundant snapshot. */
372
+ J->cur.nsnapmap = (uint16_t)J->cur.snap[--J->cur.nsnap].mapofs;
373
+ lua_assert(J->cur.nsnapmap <= J->sizesnapmap);
374
+ *psentinel = J->cur.snapmap[J->cur.snap[0].nent]; /* Restore PC. */
375
+
376
+ loop_emit_phi(J, subst, phi, nphi, onsnap);
377
+ }
378
+
379
+ /* Undo any partial changes made by the loop optimization. */
380
+ static void loop_undo(jit_State *J, IRRef ins, SnapNo nsnap, MSize nsnapmap)
381
+ {
382
+ ptrdiff_t i;
383
+ SnapShot *snap = &J->cur.snap[nsnap-1];
384
+ SnapEntry *map = J->cur.snapmap;
385
+ map[snap->mapofs + snap->nent] = map[J->cur.snap[0].nent]; /* Restore PC. */
386
+ J->cur.nsnapmap = (uint16_t)nsnapmap;
387
+ J->cur.nsnap = nsnap;
388
+ J->guardemit.irt = 0;
389
+ lj_ir_rollback(J, ins);
390
+ for (i = 0; i < BPROP_SLOTS; i++) { /* Remove backprop. cache entries. */
391
+ BPropEntry *bp = &J->bpropcache[i];
392
+ if (bp->val >= ins)
393
+ bp->key = 0;
394
+ }
395
+ for (ins--; ins >= REF_FIRST; ins--) { /* Remove flags. */
396
+ IRIns *ir = IR(ins);
397
+ irt_clearphi(ir->t);
398
+ irt_clearmark(ir->t);
399
+ }
400
+ }
401
+
402
+ /* Protected callback for loop optimization. */
403
+ static TValue *cploop_opt(lua_State *L, lua_CFunction dummy, void *ud)
404
+ {
405
+ UNUSED(L); UNUSED(dummy);
406
+ loop_unroll((LoopState *)ud);
407
+ return NULL;
408
+ }
409
+
410
+ /* Loop optimization. */
411
+ int lj_opt_loop(jit_State *J)
412
+ {
413
+ IRRef nins = J->cur.nins;
414
+ SnapNo nsnap = J->cur.nsnap;
415
+ MSize nsnapmap = J->cur.nsnapmap;
416
+ LoopState lps;
417
+ int errcode;
418
+ lps.J = J;
419
+ lps.subst = NULL;
420
+ lps.sizesubst = 0;
421
+ errcode = lj_vm_cpcall(J->L, NULL, &lps, cploop_opt);
422
+ lj_mem_freevec(J2G(J), lps.subst, lps.sizesubst, IRRef1);
423
+ if (LJ_UNLIKELY(errcode)) {
424
+ lua_State *L = J->L;
425
+ if (errcode == LUA_ERRRUN && tvisnumber(L->top-1)) { /* Trace error? */
426
+ int32_t e = numberVint(L->top-1);
427
+ switch ((TraceError)e) {
428
+ case LJ_TRERR_TYPEINS: /* Type instability. */
429
+ case LJ_TRERR_GFAIL: /* Guard would always fail. */
430
+ /* Unrolling via recording fixes many cases, e.g. a flipped boolean. */
431
+ if (--J->instunroll < 0) /* But do not unroll forever. */
432
+ break;
433
+ L->top--; /* Remove error object. */
434
+ loop_undo(J, nins, nsnap, nsnapmap);
435
+ return 1; /* Loop optimization failed, continue recording. */
436
+ default:
437
+ break;
438
+ }
439
+ }
440
+ lj_err_throw(L, errcode); /* Propagate all other errors. */
441
+ }
442
+ return 0; /* Loop optimization is ok. */
443
+ }
444
+
445
+ #undef IR
446
+ #undef emitir
447
+ #undef emitir_raw
448
+
449
+ #endif