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,386 @@
1
+ /*
2
+ ** Machine code management.
3
+ ** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h
4
+ */
5
+
6
+ #define lj_mcode_c
7
+ #define LUA_CORE
8
+
9
+ #include "lj_obj.h"
10
+ #if LJ_HASJIT
11
+ #include "lj_gc.h"
12
+ #include "lj_err.h"
13
+ #include "lj_jit.h"
14
+ #include "lj_mcode.h"
15
+ #include "lj_trace.h"
16
+ #include "lj_dispatch.h"
17
+ #endif
18
+ #if LJ_HASJIT || LJ_HASFFI
19
+ #include "lj_vm.h"
20
+ #endif
21
+
22
+ /* -- OS-specific functions ----------------------------------------------- */
23
+
24
+ #if LJ_HASJIT || LJ_HASFFI
25
+
26
+ /* Define this if you want to run LuaJIT with Valgrind. */
27
+ #ifdef LUAJIT_USE_VALGRIND
28
+ #include <valgrind/valgrind.h>
29
+ #endif
30
+
31
+ #if LJ_TARGET_IOS
32
+ void sys_icache_invalidate(void *start, size_t len);
33
+ #endif
34
+
35
+ /* Synchronize data/instruction cache. */
36
+ void lj_mcode_sync(void *start, void *end)
37
+ {
38
+ #ifdef LUAJIT_USE_VALGRIND
39
+ VALGRIND_DISCARD_TRANSLATIONS(start, (char *)end-(char *)start);
40
+ #endif
41
+ #if LJ_TARGET_X86ORX64
42
+ UNUSED(start); UNUSED(end);
43
+ #elif LJ_TARGET_IOS
44
+ sys_icache_invalidate(start, (char *)end-(char *)start);
45
+ #elif LJ_TARGET_PPC
46
+ lj_vm_cachesync(start, end);
47
+ #elif defined(__GNUC__)
48
+ __clear_cache(start, end);
49
+ #else
50
+ #error "Missing builtin to flush instruction cache"
51
+ #endif
52
+ }
53
+
54
+ #endif
55
+
56
+ #if LJ_HASJIT
57
+
58
+ #if LJ_TARGET_WINDOWS
59
+
60
+ #define WIN32_LEAN_AND_MEAN
61
+ #include <windows.h>
62
+
63
+ #define MCPROT_RW PAGE_READWRITE
64
+ #define MCPROT_RX PAGE_EXECUTE_READ
65
+ #define MCPROT_RWX PAGE_EXECUTE_READWRITE
66
+
67
+ static void *mcode_alloc_at(jit_State *J, uintptr_t hint, size_t sz, DWORD prot)
68
+ {
69
+ void *p = VirtualAlloc((void *)hint, sz,
70
+ MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN, prot);
71
+ if (!p && !hint)
72
+ lj_trace_err(J, LJ_TRERR_MCODEAL);
73
+ return p;
74
+ }
75
+
76
+ static void mcode_free(jit_State *J, void *p, size_t sz)
77
+ {
78
+ UNUSED(J); UNUSED(sz);
79
+ VirtualFree(p, 0, MEM_RELEASE);
80
+ }
81
+
82
+ static int mcode_setprot(void *p, size_t sz, DWORD prot)
83
+ {
84
+ DWORD oprot;
85
+ return !VirtualProtect(p, sz, prot, &oprot);
86
+ }
87
+
88
+ #elif LJ_TARGET_POSIX
89
+
90
+ #include <sys/mman.h>
91
+
92
+ #ifndef MAP_ANONYMOUS
93
+ #define MAP_ANONYMOUS MAP_ANON
94
+ #endif
95
+
96
+ #define MCPROT_RW (PROT_READ|PROT_WRITE)
97
+ #define MCPROT_RX (PROT_READ|PROT_EXEC)
98
+ #define MCPROT_RWX (PROT_READ|PROT_WRITE|PROT_EXEC)
99
+
100
+ static void *mcode_alloc_at(jit_State *J, uintptr_t hint, size_t sz, int prot)
101
+ {
102
+ void *p = mmap((void *)hint, sz, prot, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
103
+ if (p == MAP_FAILED) {
104
+ if (!hint) lj_trace_err(J, LJ_TRERR_MCODEAL);
105
+ p = NULL;
106
+ }
107
+ return p;
108
+ }
109
+
110
+ static void mcode_free(jit_State *J, void *p, size_t sz)
111
+ {
112
+ UNUSED(J);
113
+ munmap(p, sz);
114
+ }
115
+
116
+ static int mcode_setprot(void *p, size_t sz, int prot)
117
+ {
118
+ return mprotect(p, sz, prot);
119
+ }
120
+
121
+ #elif LJ_64
122
+
123
+ #error "Missing OS support for explicit placement of executable memory"
124
+
125
+ #else
126
+
127
+ /* Fallback allocator. This will fail if memory is not executable by default. */
128
+ #define LUAJIT_UNPROTECT_MCODE
129
+ #define MCPROT_RW 0
130
+ #define MCPROT_RX 0
131
+ #define MCPROT_RWX 0
132
+
133
+ static void *mcode_alloc_at(jit_State *J, uintptr_t hint, size_t sz, int prot)
134
+ {
135
+ UNUSED(hint); UNUSED(prot);
136
+ return lj_mem_new(J->L, sz);
137
+ }
138
+
139
+ static void mcode_free(jit_State *J, void *p, size_t sz)
140
+ {
141
+ lj_mem_free(J2G(J), p, sz);
142
+ }
143
+
144
+ #endif
145
+
146
+ /* -- MCode area protection ----------------------------------------------- */
147
+
148
+ /* Define this ONLY if page protection twiddling becomes a bottleneck. */
149
+ #ifdef LUAJIT_UNPROTECT_MCODE
150
+
151
+ /* It's generally considered to be a potential security risk to have
152
+ ** pages with simultaneous write *and* execute access in a process.
153
+ **
154
+ ** Do not even think about using this mode for server processes or
155
+ ** apps handling untrusted external data (such as a browser).
156
+ **
157
+ ** The security risk is not in LuaJIT itself -- but if an adversary finds
158
+ ** any *other* flaw in your C application logic, then any RWX memory page
159
+ ** simplifies writing an exploit considerably.
160
+ */
161
+ #define MCPROT_GEN MCPROT_RWX
162
+ #define MCPROT_RUN MCPROT_RWX
163
+
164
+ static void mcode_protect(jit_State *J, int prot)
165
+ {
166
+ UNUSED(J); UNUSED(prot);
167
+ }
168
+
169
+ #else
170
+
171
+ /* This is the default behaviour and much safer:
172
+ **
173
+ ** Most of the time the memory pages holding machine code are executable,
174
+ ** but NONE of them is writable.
175
+ **
176
+ ** The current memory area is marked read-write (but NOT executable) only
177
+ ** during the short time window while the assembler generates machine code.
178
+ */
179
+ #define MCPROT_GEN MCPROT_RW
180
+ #define MCPROT_RUN MCPROT_RX
181
+
182
+ /* Protection twiddling failed. Probably due to kernel security. */
183
+ static LJ_NOINLINE void mcode_protfail(jit_State *J)
184
+ {
185
+ lua_CFunction panic = J2G(J)->panic;
186
+ if (panic) {
187
+ lua_State *L = J->L;
188
+ setstrV(L, L->top++, lj_err_str(L, LJ_ERR_JITPROT));
189
+ panic(L);
190
+ }
191
+ }
192
+
193
+ /* Change protection of MCode area. */
194
+ static void mcode_protect(jit_State *J, int prot)
195
+ {
196
+ if (J->mcprot != prot) {
197
+ if (LJ_UNLIKELY(mcode_setprot(J->mcarea, J->szmcarea, prot)))
198
+ mcode_protfail(J);
199
+ J->mcprot = prot;
200
+ }
201
+ }
202
+
203
+ #endif
204
+
205
+ /* -- MCode area allocation ----------------------------------------------- */
206
+
207
+ #if LJ_TARGET_X64
208
+ #define mcode_validptr(p) ((p) && (uintptr_t)(p) < (uintptr_t)1<<47)
209
+ #else
210
+ #define mcode_validptr(p) ((p) && (uintptr_t)(p) < 0xffff0000)
211
+ #endif
212
+
213
+ #ifdef LJ_TARGET_JUMPRANGE
214
+
215
+ /* Get memory within relative jump distance of our code in 64 bit mode. */
216
+ static void *mcode_alloc(jit_State *J, size_t sz)
217
+ {
218
+ /* Target an address in the static assembler code (64K aligned).
219
+ ** Try addresses within a distance of target-range/2+1MB..target+range/2-1MB.
220
+ ** Use half the jump range so every address in the range can reach any other.
221
+ */
222
+ #if LJ_TARGET_MIPS
223
+ /* Use the middle of the 256MB-aligned region. */
224
+ uintptr_t target = ((uintptr_t)(void *)lj_vm_exit_handler & 0xf0000000u) +
225
+ 0x08000000u;
226
+ #else
227
+ uintptr_t target = (uintptr_t)(void *)lj_vm_exit_handler & ~(uintptr_t)0xffff;
228
+ #endif
229
+ const uintptr_t range = (1u << (LJ_TARGET_JUMPRANGE-1)) - (1u << 21);
230
+ /* First try a contiguous area below the last one. */
231
+ uintptr_t hint = J->mcarea ? (uintptr_t)J->mcarea - sz : 0;
232
+ int i;
233
+ for (i = 0; i < 32; i++) { /* 32 attempts ought to be enough ... */
234
+ if (mcode_validptr(hint)) {
235
+ void *p = mcode_alloc_at(J, hint, sz, MCPROT_GEN);
236
+
237
+ if (mcode_validptr(p) &&
238
+ ((uintptr_t)p + sz - target < range || target - (uintptr_t)p < range))
239
+ return p;
240
+ if (p) mcode_free(J, p, sz); /* Free badly placed area. */
241
+ }
242
+ /* Next try probing pseudo-random addresses. */
243
+ do {
244
+ hint = (0x78fb ^ LJ_PRNG_BITS(J, 15)) << 16; /* 64K aligned. */
245
+ } while (!(hint + sz < range));
246
+ hint = target + hint - (range>>1);
247
+ }
248
+ lj_trace_err(J, LJ_TRERR_MCODEAL); /* Give up. OS probably ignores hints? */
249
+ return NULL;
250
+ }
251
+
252
+ #else
253
+
254
+ /* All memory addresses are reachable by relative jumps. */
255
+ static void *mcode_alloc(jit_State *J, size_t sz)
256
+ {
257
+ #ifdef __OpenBSD__
258
+ /* Allow better executable memory allocation for OpenBSD W^X mode. */
259
+ void *p = mcode_alloc_at(J, 0, sz, MCPROT_RUN);
260
+ if (p && mcode_setprot(p, sz, MCPROT_GEN)) {
261
+ mcode_free(J, p, sz);
262
+ return NULL;
263
+ }
264
+ return p;
265
+ #else
266
+ return mcode_alloc_at(J, 0, sz, MCPROT_GEN);
267
+ #endif
268
+ }
269
+
270
+ #endif
271
+
272
+ /* -- MCode area management ----------------------------------------------- */
273
+
274
+ /* Linked list of MCode areas. */
275
+ typedef struct MCLink {
276
+ MCode *next; /* Next area. */
277
+ size_t size; /* Size of current area. */
278
+ } MCLink;
279
+
280
+ /* Allocate a new MCode area. */
281
+ static void mcode_allocarea(jit_State *J)
282
+ {
283
+ MCode *oldarea = J->mcarea;
284
+ size_t sz = (size_t)J->param[JIT_P_sizemcode] << 10;
285
+ sz = (sz + LJ_PAGESIZE-1) & ~(size_t)(LJ_PAGESIZE - 1);
286
+ J->mcarea = (MCode *)mcode_alloc(J, sz);
287
+ J->szmcarea = sz;
288
+ J->mcprot = MCPROT_GEN;
289
+ J->mctop = (MCode *)((char *)J->mcarea + J->szmcarea);
290
+ J->mcbot = (MCode *)((char *)J->mcarea + sizeof(MCLink));
291
+ ((MCLink *)J->mcarea)->next = oldarea;
292
+ ((MCLink *)J->mcarea)->size = sz;
293
+ J->szallmcarea += sz;
294
+ }
295
+
296
+ /* Free all MCode areas. */
297
+ void lj_mcode_free(jit_State *J)
298
+ {
299
+ MCode *mc = J->mcarea;
300
+ J->mcarea = NULL;
301
+ J->szallmcarea = 0;
302
+ while (mc) {
303
+ MCode *next = ((MCLink *)mc)->next;
304
+ mcode_free(J, mc, ((MCLink *)mc)->size);
305
+ mc = next;
306
+ }
307
+ }
308
+
309
+ /* -- MCode transactions -------------------------------------------------- */
310
+
311
+ /* Reserve the remainder of the current MCode area. */
312
+ MCode *lj_mcode_reserve(jit_State *J, MCode **lim)
313
+ {
314
+ if (!J->mcarea)
315
+ mcode_allocarea(J);
316
+ else
317
+ mcode_protect(J, MCPROT_GEN);
318
+ *lim = J->mcbot;
319
+ return J->mctop;
320
+ }
321
+
322
+ /* Commit the top part of the current MCode area. */
323
+ void lj_mcode_commit(jit_State *J, MCode *top)
324
+ {
325
+ J->mctop = top;
326
+ mcode_protect(J, MCPROT_RUN);
327
+ }
328
+
329
+ /* Abort the reservation. */
330
+ void lj_mcode_abort(jit_State *J)
331
+ {
332
+ if (J->mcarea)
333
+ mcode_protect(J, MCPROT_RUN);
334
+ }
335
+
336
+ /* Set/reset protection to allow patching of MCode areas. */
337
+ MCode *lj_mcode_patch(jit_State *J, MCode *ptr, int finish)
338
+ {
339
+ #ifdef LUAJIT_UNPROTECT_MCODE
340
+ UNUSED(J); UNUSED(ptr); UNUSED(finish);
341
+ return NULL;
342
+ #else
343
+ if (finish) {
344
+ if (J->mcarea == ptr)
345
+ mcode_protect(J, MCPROT_RUN);
346
+ else if (LJ_UNLIKELY(mcode_setprot(ptr, ((MCLink *)ptr)->size, MCPROT_RUN)))
347
+ mcode_protfail(J);
348
+ return NULL;
349
+ } else {
350
+ MCode *mc = J->mcarea;
351
+ /* Try current area first to use the protection cache. */
352
+ if (ptr >= mc && ptr < (MCode *)((char *)mc + J->szmcarea)) {
353
+ mcode_protect(J, MCPROT_GEN);
354
+ return mc;
355
+ }
356
+ /* Otherwise search through the list of MCode areas. */
357
+ for (;;) {
358
+ mc = ((MCLink *)mc)->next;
359
+ lua_assert(mc != NULL);
360
+ if (ptr >= mc && ptr < (MCode *)((char *)mc + ((MCLink *)mc)->size)) {
361
+ if (LJ_UNLIKELY(mcode_setprot(mc, ((MCLink *)mc)->size, MCPROT_GEN)))
362
+ mcode_protfail(J);
363
+ return mc;
364
+ }
365
+ }
366
+ }
367
+ #endif
368
+ }
369
+
370
+ /* Limit of MCode reservation reached. */
371
+ void lj_mcode_limiterr(jit_State *J, size_t need)
372
+ {
373
+ size_t sizemcode, maxmcode;
374
+ lj_mcode_abort(J);
375
+ sizemcode = (size_t)J->param[JIT_P_sizemcode] << 10;
376
+ sizemcode = (sizemcode + LJ_PAGESIZE-1) & ~(size_t)(LJ_PAGESIZE - 1);
377
+ maxmcode = (size_t)J->param[JIT_P_maxmcode] << 10;
378
+ if ((size_t)need > sizemcode)
379
+ lj_trace_err(J, LJ_TRERR_MCODEOV); /* Too long for any area. */
380
+ if (J->szallmcarea + sizemcode > maxmcode)
381
+ lj_trace_err(J, LJ_TRERR_MCODEAL);
382
+ mcode_allocarea(J);
383
+ lj_trace_err(J, LJ_TRERR_MCODELM); /* Retry with new area. */
384
+ }
385
+
386
+ #endif
@@ -0,0 +1,30 @@
1
+ /*
2
+ ** Machine code management.
3
+ ** Copyright (C) 2005-2015 Mike Pall. See Copyright Notice in luajit.h
4
+ */
5
+
6
+ #ifndef _LJ_MCODE_H
7
+ #define _LJ_MCODE_H
8
+
9
+ #include "lj_obj.h"
10
+
11
+ #if LJ_HASJIT || LJ_HASFFI
12
+ LJ_FUNC void lj_mcode_sync(void *start, void *end);
13
+ #endif
14
+
15
+ #if LJ_HASJIT
16
+
17
+ #include "lj_jit.h"
18
+
19
+ LJ_FUNC void lj_mcode_free(jit_State *J);
20
+ LJ_FUNC MCode *lj_mcode_reserve(jit_State *J, MCode **lim);
21
+ LJ_FUNC void lj_mcode_commit(jit_State *J, MCode *m);
22
+ LJ_FUNC void lj_mcode_abort(jit_State *J);
23
+ LJ_FUNC MCode *lj_mcode_patch(jit_State *J, MCode *ptr, int finish);
24
+ LJ_FUNC_NORET void lj_mcode_limiterr(jit_State *J, size_t need);
25
+
26
+ #define lj_mcode_commitbot(J, m) (J->mcbot = (m))
27
+
28
+ #endif
29
+
30
+ #endif
@@ -0,0 +1,477 @@
1
+ /*
2
+ ** Metamethod handling.
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
+ #define lj_meta_c
10
+ #define LUA_CORE
11
+
12
+ #include "lj_obj.h"
13
+ #include "lj_gc.h"
14
+ #include "lj_err.h"
15
+ #include "lj_buf.h"
16
+ #include "lj_str.h"
17
+ #include "lj_tab.h"
18
+ #include "lj_meta.h"
19
+ #include "lj_frame.h"
20
+ #include "lj_bc.h"
21
+ #include "lj_vm.h"
22
+ #include "lj_strscan.h"
23
+ #include "lj_strfmt.h"
24
+ #include "lj_lib.h"
25
+
26
+ /* -- Metamethod handling ------------------------------------------------- */
27
+
28
+ /* String interning of metamethod names for fast indexing. */
29
+ void lj_meta_init(lua_State *L)
30
+ {
31
+ #define MMNAME(name) "__" #name
32
+ const char *metanames = MMDEF(MMNAME);
33
+ #undef MMNAME
34
+ global_State *g = G(L);
35
+ const char *p, *q;
36
+ uint32_t mm;
37
+ for (mm = 0, p = metanames; *p; mm++, p = q) {
38
+ GCstr *s;
39
+ for (q = p+2; *q && *q != '_'; q++) ;
40
+ s = lj_str_new(L, p, (size_t)(q-p));
41
+ /* NOBARRIER: g->gcroot[] is a GC root. */
42
+ setgcref(g->gcroot[GCROOT_MMNAME+mm], obj2gco(s));
43
+ }
44
+ }
45
+
46
+ /* Negative caching of a few fast metamethods. See the lj_meta_fast() macro. */
47
+ cTValue *lj_meta_cache(GCtab *mt, MMS mm, GCstr *name)
48
+ {
49
+ cTValue *mo = lj_tab_getstr(mt, name);
50
+ lua_assert(mm <= MM_FAST);
51
+ if (!mo || tvisnil(mo)) { /* No metamethod? */
52
+ mt->nomm |= (uint8_t)(1u<<mm); /* Set negative cache flag. */
53
+ return NULL;
54
+ }
55
+ return mo;
56
+ }
57
+
58
+ /* Lookup metamethod for object. */
59
+ cTValue *lj_meta_lookup(lua_State *L, cTValue *o, MMS mm)
60
+ {
61
+ GCtab *mt;
62
+ if (tvistab(o))
63
+ mt = tabref(tabV(o)->metatable);
64
+ else if (tvisudata(o))
65
+ mt = tabref(udataV(o)->metatable);
66
+ else
67
+ mt = tabref(basemt_obj(G(L), o));
68
+ if (mt) {
69
+ cTValue *mo = lj_tab_getstr(mt, mmname_str(G(L), mm));
70
+ if (mo)
71
+ return mo;
72
+ }
73
+ return niltv(L);
74
+ }
75
+
76
+ #if LJ_HASFFI
77
+ /* Tailcall from C function. */
78
+ int lj_meta_tailcall(lua_State *L, cTValue *tv)
79
+ {
80
+ TValue *base = L->base;
81
+ TValue *top = L->top;
82
+ const BCIns *pc = frame_pc(base-1); /* Preserve old PC from frame. */
83
+ copyTV(L, base-1-LJ_FR2, tv); /* Replace frame with new object. */
84
+ if (LJ_FR2)
85
+ (top++)->u64 = LJ_CONT_TAILCALL;
86
+ else
87
+ top->u32.lo = LJ_CONT_TAILCALL;
88
+ setframe_pc(top++, pc);
89
+ if (LJ_FR2) top++;
90
+ setframe_gc(top, obj2gco(L), LJ_TTHREAD); /* Dummy frame object. */
91
+ setframe_ftsz(top, ((char *)(top+1) - (char *)base) + FRAME_CONT);
92
+ L->base = L->top = top+1;
93
+ /*
94
+ ** before: [old_mo|PC] [... ...]
95
+ ** ^base ^top
96
+ ** after: [new_mo|itype] [... ...] [NULL|PC] [dummy|delta]
97
+ ** ^base/top
98
+ ** tailcall: [new_mo|PC] [... ...]
99
+ ** ^base ^top
100
+ */
101
+ return 0;
102
+ }
103
+ #endif
104
+
105
+ /* Setup call to metamethod to be run by Assembler VM. */
106
+ static TValue *mmcall(lua_State *L, ASMFunction cont, cTValue *mo,
107
+ cTValue *a, cTValue *b)
108
+ {
109
+ /*
110
+ ** |-- framesize -> top top+1 top+2 top+3
111
+ ** before: [func slots ...]
112
+ ** mm setup: [func slots ...] [cont|?] [mo|tmtype] [a] [b]
113
+ ** in asm: [func slots ...] [cont|PC] [mo|delta] [a] [b]
114
+ ** ^-- func base ^-- mm base
115
+ ** after mm: [func slots ...] [result]
116
+ ** ^-- copy to base[PC_RA] --/ for lj_cont_ra
117
+ ** istruecond + branch for lj_cont_cond*
118
+ ** ignore for lj_cont_nop
119
+ ** next PC: [func slots ...]
120
+ */
121
+ TValue *top = L->top;
122
+ if (curr_funcisL(L)) top = curr_topL(L);
123
+ setcont(top++, cont); /* Assembler VM stores PC in upper word or FR2. */
124
+ if (LJ_FR2) setnilV(top++);
125
+ copyTV(L, top++, mo); /* Store metamethod and two arguments. */
126
+ if (LJ_FR2) setnilV(top++);
127
+ copyTV(L, top, a);
128
+ copyTV(L, top+1, b);
129
+ return top; /* Return new base. */
130
+ }
131
+
132
+ /* -- C helpers for some instructions, called from assembler VM ----------- */
133
+
134
+ /* Helper for TGET*. __index chain and metamethod. */
135
+ cTValue *lj_meta_tget(lua_State *L, cTValue *o, cTValue *k)
136
+ {
137
+ int loop;
138
+ for (loop = 0; loop < LJ_MAX_IDXCHAIN; loop++) {
139
+ cTValue *mo;
140
+ if (LJ_LIKELY(tvistab(o))) {
141
+ GCtab *t = tabV(o);
142
+ cTValue *tv = lj_tab_get(L, t, k);
143
+ if (!tvisnil(tv) ||
144
+ !(mo = lj_meta_fast(L, tabref(t->metatable), MM_index)))
145
+ return tv;
146
+ } else if (tvisnil(mo = lj_meta_lookup(L, o, MM_index))) {
147
+ lj_err_optype(L, o, LJ_ERR_OPINDEX);
148
+ return NULL; /* unreachable */
149
+ }
150
+ if (tvisfunc(mo)) {
151
+ L->top = mmcall(L, lj_cont_ra, mo, o, k);
152
+ return NULL; /* Trigger metamethod call. */
153
+ }
154
+ o = mo;
155
+ }
156
+ lj_err_msg(L, LJ_ERR_GETLOOP);
157
+ return NULL; /* unreachable */
158
+ }
159
+
160
+ /* Helper for TSET*. __newindex chain and metamethod. */
161
+ TValue *lj_meta_tset(lua_State *L, cTValue *o, cTValue *k)
162
+ {
163
+ TValue tmp;
164
+ int loop;
165
+ for (loop = 0; loop < LJ_MAX_IDXCHAIN; loop++) {
166
+ cTValue *mo;
167
+ if (LJ_LIKELY(tvistab(o))) {
168
+ GCtab *t = tabV(o);
169
+ cTValue *tv = lj_tab_get(L, t, k);
170
+ if (LJ_LIKELY(!tvisnil(tv))) {
171
+ t->nomm = 0; /* Invalidate negative metamethod cache. */
172
+ lj_gc_anybarriert(L, t);
173
+ return (TValue *)tv;
174
+ } else if (!(mo = lj_meta_fast(L, tabref(t->metatable), MM_newindex))) {
175
+ t->nomm = 0; /* Invalidate negative metamethod cache. */
176
+ lj_gc_anybarriert(L, t);
177
+ if (tv != niltv(L))
178
+ return (TValue *)tv;
179
+ if (tvisnil(k)) lj_err_msg(L, LJ_ERR_NILIDX);
180
+ else if (tvisint(k)) { setnumV(&tmp, (lua_Number)intV(k)); k = &tmp; }
181
+ else if (tvisnum(k) && tvisnan(k)) lj_err_msg(L, LJ_ERR_NANIDX);
182
+ return lj_tab_newkey(L, t, k);
183
+ }
184
+ } else if (tvisnil(mo = lj_meta_lookup(L, o, MM_newindex))) {
185
+ lj_err_optype(L, o, LJ_ERR_OPINDEX);
186
+ return NULL; /* unreachable */
187
+ }
188
+ if (tvisfunc(mo)) {
189
+ L->top = mmcall(L, lj_cont_nop, mo, o, k);
190
+ /* L->top+2 = v filled in by caller. */
191
+ return NULL; /* Trigger metamethod call. */
192
+ }
193
+ copyTV(L, &tmp, mo);
194
+ o = &tmp;
195
+ }
196
+ lj_err_msg(L, LJ_ERR_SETLOOP);
197
+ return NULL; /* unreachable */
198
+ }
199
+
200
+ static cTValue *str2num(cTValue *o, TValue *n)
201
+ {
202
+ if (tvisnum(o))
203
+ return o;
204
+ else if (tvisint(o))
205
+ return (setnumV(n, (lua_Number)intV(o)), n);
206
+ else if (tvisstr(o) && lj_strscan_num(strV(o), n))
207
+ return n;
208
+ else
209
+ return NULL;
210
+ }
211
+
212
+ /* Helper for arithmetic instructions. Coercion, metamethod. */
213
+ TValue *lj_meta_arith(lua_State *L, TValue *ra, cTValue *rb, cTValue *rc,
214
+ BCReg op)
215
+ {
216
+ MMS mm = bcmode_mm(op);
217
+ TValue tempb, tempc;
218
+ cTValue *b, *c;
219
+ if ((b = str2num(rb, &tempb)) != NULL &&
220
+ (c = str2num(rc, &tempc)) != NULL) { /* Try coercion first. */
221
+ setnumV(ra, lj_vm_foldarith(numV(b), numV(c), (int)mm-MM_add));
222
+ return NULL;
223
+ } else {
224
+ cTValue *mo = lj_meta_lookup(L, rb, mm);
225
+ if (tvisnil(mo)) {
226
+ mo = lj_meta_lookup(L, rc, mm);
227
+ if (tvisnil(mo)) {
228
+ if (str2num(rb, &tempb) == NULL) rc = rb;
229
+ lj_err_optype(L, rc, LJ_ERR_OPARITH);
230
+ return NULL; /* unreachable */
231
+ }
232
+ }
233
+ return mmcall(L, lj_cont_ra, mo, rb, rc);
234
+ }
235
+ }
236
+
237
+ /* Helper for CAT. Coercion, iterative concat, __concat metamethod. */
238
+ TValue *lj_meta_cat(lua_State *L, TValue *top, int left)
239
+ {
240
+ int fromc = 0;
241
+ if (left < 0) { left = -left; fromc = 1; }
242
+ do {
243
+ if (!(tvisstr(top) || tvisnumber(top)) ||
244
+ !(tvisstr(top-1) || tvisnumber(top-1))) {
245
+ cTValue *mo = lj_meta_lookup(L, top-1, MM_concat);
246
+ if (tvisnil(mo)) {
247
+ mo = lj_meta_lookup(L, top, MM_concat);
248
+ if (tvisnil(mo)) {
249
+ if (tvisstr(top-1) || tvisnumber(top-1)) top++;
250
+ lj_err_optype(L, top-1, LJ_ERR_OPCAT);
251
+ return NULL; /* unreachable */
252
+ }
253
+ }
254
+ /* One of the top two elements is not a string, call __cat metamethod:
255
+ **
256
+ ** before: [...][CAT stack .........................]
257
+ ** top-1 top top+1 top+2
258
+ ** pick two: [...][CAT stack ...] [o1] [o2]
259
+ ** setup mm: [...][CAT stack ...] [cont|?] [mo|tmtype] [o1] [o2]
260
+ ** in asm: [...][CAT stack ...] [cont|PC] [mo|delta] [o1] [o2]
261
+ ** ^-- func base ^-- mm base
262
+ ** after mm: [...][CAT stack ...] <--push-- [result]
263
+ ** next step: [...][CAT stack .............]
264
+ */
265
+ copyTV(L, top+2*LJ_FR2+2, top); /* Carefully ordered stack copies! */
266
+ copyTV(L, top+2*LJ_FR2+1, top-1);
267
+ copyTV(L, top+LJ_FR2, mo);
268
+ setcont(top-1, lj_cont_cat);
269
+ if (LJ_FR2) { setnilV(top); setnilV(top+2); top += 2; }
270
+ return top+1; /* Trigger metamethod call. */
271
+ } else {
272
+ /* Pick as many strings as possible from the top and concatenate them:
273
+ **
274
+ ** before: [...][CAT stack ...........................]
275
+ ** pick str: [...][CAT stack ...] [...... strings ......]
276
+ ** concat: [...][CAT stack ...] [result]
277
+ ** next step: [...][CAT stack ............]
278
+ */
279
+ TValue *e, *o = top;
280
+ uint64_t tlen = tvisstr(o) ? strV(o)->len : STRFMT_MAXBUF_NUM;
281
+ char *p, *buf;
282
+ do {
283
+ o--; tlen += tvisstr(o) ? strV(o)->len : STRFMT_MAXBUF_NUM;
284
+ } while (--left > 0 && (tvisstr(o-1) || tvisnumber(o-1)));
285
+ if (tlen >= LJ_MAX_STR) lj_err_msg(L, LJ_ERR_STROV);
286
+ p = buf = lj_buf_tmp(L, (MSize)tlen);
287
+ for (e = top, top = o; o <= e; o++) {
288
+ if (tvisstr(o)) {
289
+ GCstr *s = strV(o);
290
+ MSize len = s->len;
291
+ p = lj_buf_wmem(p, strdata(s), len);
292
+ } else if (tvisint(o)) {
293
+ p = lj_strfmt_wint(p, intV(o));
294
+ } else {
295
+ lua_assert(tvisnum(o));
296
+ p = lj_strfmt_wnum(p, o);
297
+ }
298
+ }
299
+ setstrV(L, top, lj_str_new(L, buf, (size_t)(p-buf)));
300
+ }
301
+ } while (left >= 1);
302
+ if (LJ_UNLIKELY(G(L)->gc.total >= G(L)->gc.threshold)) {
303
+ if (!fromc) L->top = curr_topL(L);
304
+ lj_gc_step(L);
305
+ }
306
+ return NULL;
307
+ }
308
+
309
+ /* Helper for LEN. __len metamethod. */
310
+ TValue * LJ_FASTCALL lj_meta_len(lua_State *L, cTValue *o)
311
+ {
312
+ cTValue *mo = lj_meta_lookup(L, o, MM_len);
313
+ if (tvisnil(mo)) {
314
+ if (LJ_52 && tvistab(o))
315
+ tabref(tabV(o)->metatable)->nomm |= (uint8_t)(1u<<MM_len);
316
+ else
317
+ lj_err_optype(L, o, LJ_ERR_OPLEN);
318
+ return NULL;
319
+ }
320
+ return mmcall(L, lj_cont_ra, mo, o, LJ_52 ? o : niltv(L));
321
+ }
322
+
323
+ /* Helper for equality comparisons. __eq metamethod. */
324
+ TValue *lj_meta_equal(lua_State *L, GCobj *o1, GCobj *o2, int ne)
325
+ {
326
+ /* Field metatable must be at same offset for GCtab and GCudata! */
327
+ cTValue *mo = lj_meta_fast(L, tabref(o1->gch.metatable), MM_eq);
328
+ if (mo) {
329
+ TValue *top;
330
+ uint32_t it;
331
+ if (tabref(o1->gch.metatable) != tabref(o2->gch.metatable)) {
332
+ cTValue *mo2 = lj_meta_fast(L, tabref(o2->gch.metatable), MM_eq);
333
+ if (mo2 == NULL || !lj_obj_equal(mo, mo2))
334
+ return (TValue *)(intptr_t)ne;
335
+ }
336
+ top = curr_top(L);
337
+ setcont(top++, ne ? lj_cont_condf : lj_cont_condt);
338
+ if (LJ_FR2) setnilV(top++);
339
+ copyTV(L, top++, mo);
340
+ if (LJ_FR2) setnilV(top++);
341
+ it = ~(uint32_t)o1->gch.gct;
342
+ setgcV(L, top, o1, it);
343
+ setgcV(L, top+1, o2, it);
344
+ return top; /* Trigger metamethod call. */
345
+ }
346
+ return (TValue *)(intptr_t)ne;
347
+ }
348
+
349
+ #if LJ_HASFFI
350
+ TValue * LJ_FASTCALL lj_meta_equal_cd(lua_State *L, BCIns ins)
351
+ {
352
+ ASMFunction cont = (bc_op(ins) & 1) ? lj_cont_condf : lj_cont_condt;
353
+ int op = (int)bc_op(ins) & ~1;
354
+ TValue tv;
355
+ cTValue *mo, *o2, *o1 = &L->base[bc_a(ins)];
356
+ cTValue *o1mm = o1;
357
+ if (op == BC_ISEQV) {
358
+ o2 = &L->base[bc_d(ins)];
359
+ if (!tviscdata(o1mm)) o1mm = o2;
360
+ } else if (op == BC_ISEQS) {
361
+ setstrV(L, &tv, gco2str(proto_kgc(curr_proto(L), ~(ptrdiff_t)bc_d(ins))));
362
+ o2 = &tv;
363
+ } else if (op == BC_ISEQN) {
364
+ o2 = &mref(curr_proto(L)->k, cTValue)[bc_d(ins)];
365
+ } else {
366
+ lua_assert(op == BC_ISEQP);
367
+ setpriV(&tv, ~bc_d(ins));
368
+ o2 = &tv;
369
+ }
370
+ mo = lj_meta_lookup(L, o1mm, MM_eq);
371
+ if (LJ_LIKELY(!tvisnil(mo)))
372
+ return mmcall(L, cont, mo, o1, o2);
373
+ else
374
+ return (TValue *)(intptr_t)(bc_op(ins) & 1);
375
+ }
376
+ #endif
377
+
378
+ /* Helper for ordered comparisons. String compare, __lt/__le metamethods. */
379
+ TValue *lj_meta_comp(lua_State *L, cTValue *o1, cTValue *o2, int op)
380
+ {
381
+ if (LJ_HASFFI && (tviscdata(o1) || tviscdata(o2))) {
382
+ ASMFunction cont = (op & 1) ? lj_cont_condf : lj_cont_condt;
383
+ MMS mm = (op & 2) ? MM_le : MM_lt;
384
+ cTValue *mo = lj_meta_lookup(L, tviscdata(o1) ? o1 : o2, mm);
385
+ if (LJ_UNLIKELY(tvisnil(mo))) goto err;
386
+ return mmcall(L, cont, mo, o1, o2);
387
+ } else if (LJ_52 || itype(o1) == itype(o2)) {
388
+ /* Never called with two numbers. */
389
+ if (tvisstr(o1) && tvisstr(o2)) {
390
+ int32_t res = lj_str_cmp(strV(o1), strV(o2));
391
+ return (TValue *)(intptr_t)(((op&2) ? res <= 0 : res < 0) ^ (op&1));
392
+ } else {
393
+ trymt:
394
+ while (1) {
395
+ ASMFunction cont = (op & 1) ? lj_cont_condf : lj_cont_condt;
396
+ MMS mm = (op & 2) ? MM_le : MM_lt;
397
+ cTValue *mo = lj_meta_lookup(L, o1, mm);
398
+ #if LJ_52
399
+ if (tvisnil(mo) && tvisnil((mo = lj_meta_lookup(L, o2, mm))))
400
+ #else
401
+ cTValue *mo2 = lj_meta_lookup(L, o2, mm);
402
+ if (tvisnil(mo) || !lj_obj_equal(mo, mo2))
403
+ #endif
404
+ {
405
+ if (op & 2) { /* MM_le not found: retry with MM_lt. */
406
+ cTValue *ot = o1; o1 = o2; o2 = ot; /* Swap operands. */
407
+ op ^= 3; /* Use LT and flip condition. */
408
+ continue;
409
+ }
410
+ goto err;
411
+ }
412
+ return mmcall(L, cont, mo, o1, o2);
413
+ }
414
+ }
415
+ } else if (tvisbool(o1) && tvisbool(o2)) {
416
+ goto trymt;
417
+ } else {
418
+ err:
419
+ lj_err_comp(L, o1, o2);
420
+ return NULL;
421
+ }
422
+ }
423
+
424
+ /* Helper for ISTYPE and ISNUM. Implicit coercion or error. */
425
+ void lj_meta_istype(lua_State *L, BCReg ra, BCReg tp)
426
+ {
427
+ L->top = curr_topL(L);
428
+ ra++; tp--;
429
+ lua_assert(LJ_DUALNUM || tp != ~LJ_TNUMX); /* ISTYPE -> ISNUM broken. */
430
+ if (LJ_DUALNUM && tp == ~LJ_TNUMX) lj_lib_checkint(L, ra);
431
+ else if (tp == ~LJ_TNUMX+1) lj_lib_checknum(L, ra);
432
+ else if (tp == ~LJ_TSTR) lj_lib_checkstr(L, ra);
433
+ else lj_err_argtype(L, ra, lj_obj_itypename[tp]);
434
+ }
435
+
436
+ /* Helper for calls. __call metamethod. */
437
+ void lj_meta_call(lua_State *L, TValue *func, TValue *top)
438
+ {
439
+ cTValue *mo = lj_meta_lookup(L, func, MM_call);
440
+ TValue *p;
441
+ if (!tvisfunc(mo))
442
+ lj_err_optype_call(L, func);
443
+ for (p = top; p > func+2*LJ_FR2; p--) copyTV(L, p, p-1);
444
+ if (LJ_FR2) copyTV(L, func+2, func);
445
+ copyTV(L, func, mo);
446
+ }
447
+
448
+ /* Helper for FORI. Coercion. */
449
+ void LJ_FASTCALL lj_meta_for(lua_State *L, TValue *o)
450
+ {
451
+ if (!lj_strscan_numberobj(o)) lj_err_msg(L, LJ_ERR_FORINIT);
452
+ if (!lj_strscan_numberobj(o+1)) lj_err_msg(L, LJ_ERR_FORLIM);
453
+ if (!lj_strscan_numberobj(o+2)) lj_err_msg(L, LJ_ERR_FORSTEP);
454
+ if (LJ_DUALNUM) {
455
+ /* Ensure all slots are integers or all slots are numbers. */
456
+ int32_t k[3];
457
+ int nint = 0;
458
+ ptrdiff_t i;
459
+ for (i = 0; i <= 2; i++) {
460
+ if (tvisint(o+i)) {
461
+ k[i] = intV(o+i); nint++;
462
+ } else {
463
+ k[i] = lj_num2int(numV(o+i)); nint += ((lua_Number)k[i] == numV(o+i));
464
+ }
465
+ }
466
+ if (nint == 3) { /* Narrow to integers. */
467
+ setintV(o, k[0]);
468
+ setintV(o+1, k[1]);
469
+ setintV(o+2, k[2]);
470
+ } else if (nint != 0) { /* Widen to numbers. */
471
+ if (tvisint(o)) setnumV(o, (lua_Number)intV(o));
472
+ if (tvisint(o+1)) setnumV(o+1, (lua_Number)intV(o+1));
473
+ if (tvisint(o+2)) setnumV(o+2, (lua_Number)intV(o+2));
474
+ }
475
+ }
476
+ }
477
+