immunio 1.2.1 → 2.0.2

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 (291) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +13 -5
  3. data/ext/immunio/Rakefile +14 -6
  4. data/lib/immunio/context.rb +2 -0
  5. data/lib/immunio/plugins/action_view.rb +7 -668
  6. data/lib/immunio/plugins/action_view/action_view.rb +22 -0
  7. data/lib/immunio/plugins/action_view/active_support_hash.rb +29 -0
  8. data/lib/immunio/plugins/action_view/cache_store.rb +24 -0
  9. data/lib/immunio/plugins/action_view/erubi.rb +38 -0
  10. data/lib/immunio/plugins/action_view/erubis.rb +39 -0
  11. data/lib/immunio/plugins/action_view/fragment_caching.rb +29 -0
  12. data/lib/immunio/plugins/action_view/haml.rb +46 -0
  13. data/lib/immunio/plugins/action_view/slim.rb +42 -0
  14. data/lib/immunio/plugins/action_view/template.rb +431 -0
  15. data/lib/immunio/plugins/action_view/template_rendering.rb +45 -0
  16. data/lib/immunio/plugins/http_tracker.rb +2 -0
  17. data/lib/immunio/plugins/io.rb +34 -0
  18. data/lib/immunio/version.rb +1 -1
  19. data/lua-hooks/Makefile +36 -9
  20. data/lua-hooks/ext/luajit/COPYRIGHT +1 -1
  21. data/lua-hooks/ext/luajit/Makefile +22 -15
  22. data/lua-hooks/ext/luajit/README +2 -2
  23. data/lua-hooks/ext/luajit/doc/bluequad-print.css +1 -1
  24. data/lua-hooks/ext/luajit/doc/bluequad.css +1 -1
  25. data/lua-hooks/ext/luajit/doc/changes.html +69 -3
  26. data/lua-hooks/ext/luajit/doc/contact.html +10 -3
  27. data/lua-hooks/ext/luajit/doc/ext_c_api.html +2 -2
  28. data/lua-hooks/ext/luajit/doc/ext_ffi.html +2 -2
  29. data/lua-hooks/ext/luajit/doc/ext_ffi_api.html +2 -2
  30. data/lua-hooks/ext/luajit/doc/ext_ffi_semantics.html +3 -4
  31. data/lua-hooks/ext/luajit/doc/ext_ffi_tutorial.html +2 -2
  32. data/lua-hooks/ext/luajit/doc/ext_jit.html +3 -3
  33. data/lua-hooks/ext/luajit/doc/ext_profiler.html +2 -2
  34. data/lua-hooks/ext/luajit/doc/extensions.html +47 -20
  35. data/lua-hooks/ext/luajit/doc/faq.html +2 -2
  36. data/lua-hooks/ext/luajit/doc/install.html +74 -45
  37. data/lua-hooks/ext/luajit/doc/luajit.html +5 -5
  38. data/lua-hooks/ext/luajit/doc/running.html +3 -3
  39. data/lua-hooks/ext/luajit/doc/status.html +13 -8
  40. data/lua-hooks/ext/luajit/dynasm/dasm_arm.h +1 -1
  41. data/lua-hooks/ext/luajit/dynasm/dasm_arm.lua +1 -1
  42. data/lua-hooks/ext/luajit/dynasm/dasm_arm64.h +1 -1
  43. data/lua-hooks/ext/luajit/dynasm/dasm_arm64.lua +1 -1
  44. data/lua-hooks/ext/luajit/dynasm/dasm_mips.h +8 -5
  45. data/lua-hooks/ext/luajit/dynasm/dasm_mips.lua +66 -11
  46. data/lua-hooks/ext/luajit/dynasm/dasm_mips64.lua +12 -0
  47. data/lua-hooks/ext/luajit/dynasm/dasm_ppc.h +1 -1
  48. data/lua-hooks/ext/luajit/dynasm/dasm_ppc.lua +1 -1
  49. data/lua-hooks/ext/luajit/dynasm/dasm_proto.h +1 -1
  50. data/lua-hooks/ext/luajit/dynasm/dasm_x64.lua +1 -1
  51. data/lua-hooks/ext/luajit/dynasm/dasm_x86.h +1 -1
  52. data/lua-hooks/ext/luajit/dynasm/dasm_x86.lua +5 -1
  53. data/lua-hooks/ext/luajit/dynasm/dynasm.lua +2 -2
  54. data/lua-hooks/ext/luajit/etc/luajit.1 +1 -1
  55. data/lua-hooks/ext/luajit/etc/luajit.pc +1 -1
  56. data/lua-hooks/ext/luajit/src/Makefile +15 -11
  57. data/lua-hooks/ext/luajit/src/Makefile.dep +16 -16
  58. data/lua-hooks/ext/luajit/src/host/buildvm.c +2 -2
  59. data/lua-hooks/ext/luajit/src/host/buildvm.h +1 -1
  60. data/lua-hooks/ext/luajit/src/host/buildvm_asm.c +9 -4
  61. data/lua-hooks/ext/luajit/src/host/buildvm_fold.c +2 -2
  62. data/lua-hooks/ext/luajit/src/host/buildvm_lib.c +1 -1
  63. data/lua-hooks/ext/luajit/src/host/buildvm_libbc.h +14 -3
  64. data/lua-hooks/ext/luajit/src/host/buildvm_peobj.c +27 -3
  65. data/lua-hooks/ext/luajit/src/host/genlibbc.lua +1 -1
  66. data/lua-hooks/ext/luajit/src/host/genminilua.lua +6 -5
  67. data/lua-hooks/ext/luajit/src/host/minilua.c +1 -1
  68. data/lua-hooks/ext/luajit/src/jit/bc.lua +1 -1
  69. data/lua-hooks/ext/luajit/src/jit/bcsave.lua +8 -8
  70. data/lua-hooks/ext/luajit/src/jit/dis_arm.lua +2 -2
  71. data/lua-hooks/ext/luajit/src/jit/dis_arm64.lua +1216 -0
  72. data/lua-hooks/ext/luajit/src/jit/dis_arm64be.lua +12 -0
  73. data/lua-hooks/ext/luajit/src/jit/dis_mips.lua +35 -20
  74. data/lua-hooks/ext/luajit/src/jit/dis_mips64.lua +17 -0
  75. data/lua-hooks/ext/luajit/src/jit/dis_mips64el.lua +17 -0
  76. data/lua-hooks/ext/luajit/src/jit/dis_mipsel.lua +1 -1
  77. data/lua-hooks/ext/luajit/src/jit/dis_ppc.lua +2 -2
  78. data/lua-hooks/ext/luajit/src/jit/dis_x64.lua +1 -1
  79. data/lua-hooks/ext/luajit/src/jit/dis_x86.lua +7 -4
  80. data/lua-hooks/ext/luajit/src/jit/dump.lua +17 -12
  81. data/lua-hooks/ext/luajit/src/jit/p.lua +3 -2
  82. data/lua-hooks/ext/luajit/src/jit/v.lua +2 -2
  83. data/lua-hooks/ext/luajit/src/jit/zone.lua +1 -1
  84. data/lua-hooks/ext/luajit/src/lauxlib.h +14 -20
  85. data/lua-hooks/ext/luajit/src/lib_aux.c +38 -27
  86. data/lua-hooks/ext/luajit/src/lib_base.c +12 -5
  87. data/lua-hooks/ext/luajit/src/lib_bit.c +1 -1
  88. data/lua-hooks/ext/luajit/src/lib_debug.c +5 -5
  89. data/lua-hooks/ext/luajit/src/lib_ffi.c +2 -2
  90. data/lua-hooks/ext/luajit/src/lib_init.c +16 -16
  91. data/lua-hooks/ext/luajit/src/lib_io.c +6 -7
  92. data/lua-hooks/ext/luajit/src/lib_jit.c +14 -4
  93. data/lua-hooks/ext/luajit/src/lib_math.c +1 -5
  94. data/lua-hooks/ext/luajit/src/lib_os.c +1 -1
  95. data/lua-hooks/ext/luajit/src/lib_package.c +14 -23
  96. data/lua-hooks/ext/luajit/src/lib_string.c +1 -5
  97. data/lua-hooks/ext/luajit/src/lib_table.c +21 -1
  98. data/lua-hooks/ext/luajit/src/lj.supp +3 -3
  99. data/lua-hooks/ext/luajit/src/lj_alloc.c +174 -83
  100. data/lua-hooks/ext/luajit/src/lj_api.c +97 -18
  101. data/lua-hooks/ext/luajit/src/lj_arch.h +54 -22
  102. data/lua-hooks/ext/luajit/src/lj_asm.c +172 -53
  103. data/lua-hooks/ext/luajit/src/lj_asm.h +1 -1
  104. data/lua-hooks/ext/luajit/src/lj_asm_arm.h +19 -16
  105. data/lua-hooks/ext/luajit/src/lj_asm_arm64.h +2022 -0
  106. data/lua-hooks/ext/luajit/src/lj_asm_mips.h +564 -158
  107. data/lua-hooks/ext/luajit/src/lj_asm_ppc.h +19 -18
  108. data/lua-hooks/ext/luajit/src/lj_asm_x86.h +578 -92
  109. data/lua-hooks/ext/luajit/src/lj_bc.c +1 -1
  110. data/lua-hooks/ext/luajit/src/lj_bc.h +1 -1
  111. data/lua-hooks/ext/luajit/src/lj_bcdump.h +1 -1
  112. data/lua-hooks/ext/luajit/src/lj_bcread.c +1 -1
  113. data/lua-hooks/ext/luajit/src/lj_bcwrite.c +1 -1
  114. data/lua-hooks/ext/luajit/src/lj_buf.c +1 -1
  115. data/lua-hooks/ext/luajit/src/lj_buf.h +1 -1
  116. data/lua-hooks/ext/luajit/src/lj_carith.c +1 -1
  117. data/lua-hooks/ext/luajit/src/lj_carith.h +1 -1
  118. data/lua-hooks/ext/luajit/src/lj_ccall.c +172 -7
  119. data/lua-hooks/ext/luajit/src/lj_ccall.h +21 -5
  120. data/lua-hooks/ext/luajit/src/lj_ccallback.c +71 -17
  121. data/lua-hooks/ext/luajit/src/lj_ccallback.h +1 -1
  122. data/lua-hooks/ext/luajit/src/lj_cconv.c +4 -2
  123. data/lua-hooks/ext/luajit/src/lj_cconv.h +1 -1
  124. data/lua-hooks/ext/luajit/src/lj_cdata.c +7 -5
  125. data/lua-hooks/ext/luajit/src/lj_cdata.h +1 -1
  126. data/lua-hooks/ext/luajit/src/lj_clib.c +5 -5
  127. data/lua-hooks/ext/luajit/src/lj_clib.h +1 -1
  128. data/lua-hooks/ext/luajit/src/lj_cparse.c +11 -6
  129. data/lua-hooks/ext/luajit/src/lj_cparse.h +1 -1
  130. data/lua-hooks/ext/luajit/src/lj_crecord.c +70 -14
  131. data/lua-hooks/ext/luajit/src/lj_crecord.h +1 -1
  132. data/lua-hooks/ext/luajit/src/lj_ctype.c +1 -1
  133. data/lua-hooks/ext/luajit/src/lj_ctype.h +8 -8
  134. data/lua-hooks/ext/luajit/src/lj_debug.c +1 -1
  135. data/lua-hooks/ext/luajit/src/lj_debug.h +1 -1
  136. data/lua-hooks/ext/luajit/src/lj_def.h +6 -9
  137. data/lua-hooks/ext/luajit/src/lj_dispatch.c +3 -3
  138. data/lua-hooks/ext/luajit/src/lj_dispatch.h +2 -1
  139. data/lua-hooks/ext/luajit/src/lj_emit_arm.h +5 -4
  140. data/lua-hooks/ext/luajit/src/lj_emit_arm64.h +419 -0
  141. data/lua-hooks/ext/luajit/src/lj_emit_mips.h +100 -20
  142. data/lua-hooks/ext/luajit/src/lj_emit_ppc.h +4 -4
  143. data/lua-hooks/ext/luajit/src/lj_emit_x86.h +116 -25
  144. data/lua-hooks/ext/luajit/src/lj_err.c +34 -13
  145. data/lua-hooks/ext/luajit/src/lj_err.h +1 -1
  146. data/lua-hooks/ext/luajit/src/lj_errmsg.h +1 -1
  147. data/lua-hooks/ext/luajit/src/lj_ff.h +1 -1
  148. data/lua-hooks/ext/luajit/src/lj_ffrecord.c +58 -49
  149. data/lua-hooks/ext/luajit/src/lj_ffrecord.h +1 -1
  150. data/lua-hooks/ext/luajit/src/lj_frame.h +33 -6
  151. data/lua-hooks/ext/luajit/src/lj_func.c +4 -2
  152. data/lua-hooks/ext/luajit/src/lj_func.h +1 -1
  153. data/lua-hooks/ext/luajit/src/lj_gc.c +16 -7
  154. data/lua-hooks/ext/luajit/src/lj_gc.h +1 -1
  155. data/lua-hooks/ext/luajit/src/lj_gdbjit.c +31 -1
  156. data/lua-hooks/ext/luajit/src/lj_gdbjit.h +1 -1
  157. data/lua-hooks/ext/luajit/src/lj_ir.c +69 -96
  158. data/lua-hooks/ext/luajit/src/lj_ir.h +29 -18
  159. data/lua-hooks/ext/luajit/src/lj_ircall.h +24 -30
  160. data/lua-hooks/ext/luajit/src/lj_iropt.h +9 -9
  161. data/lua-hooks/ext/luajit/src/lj_jit.h +67 -9
  162. data/lua-hooks/ext/luajit/src/lj_lex.c +1 -1
  163. data/lua-hooks/ext/luajit/src/lj_lex.h +1 -1
  164. data/lua-hooks/ext/luajit/src/lj_lib.c +1 -1
  165. data/lua-hooks/ext/luajit/src/lj_lib.h +1 -1
  166. data/lua-hooks/ext/luajit/src/lj_load.c +1 -1
  167. data/lua-hooks/ext/luajit/src/lj_mcode.c +11 -10
  168. data/lua-hooks/ext/luajit/src/lj_mcode.h +1 -1
  169. data/lua-hooks/ext/luajit/src/lj_meta.c +1 -1
  170. data/lua-hooks/ext/luajit/src/lj_meta.h +1 -1
  171. data/lua-hooks/ext/luajit/src/lj_obj.c +1 -1
  172. data/lua-hooks/ext/luajit/src/lj_obj.h +7 -3
  173. data/lua-hooks/ext/luajit/src/lj_opt_dce.c +1 -1
  174. data/lua-hooks/ext/luajit/src/lj_opt_fold.c +84 -17
  175. data/lua-hooks/ext/luajit/src/lj_opt_loop.c +1 -1
  176. data/lua-hooks/ext/luajit/src/lj_opt_mem.c +3 -3
  177. data/lua-hooks/ext/luajit/src/lj_opt_narrow.c +24 -22
  178. data/lua-hooks/ext/luajit/src/lj_opt_sink.c +11 -6
  179. data/lua-hooks/ext/luajit/src/lj_opt_split.c +11 -2
  180. data/lua-hooks/ext/luajit/src/lj_parse.c +9 -7
  181. data/lua-hooks/ext/luajit/src/lj_parse.h +1 -1
  182. data/lua-hooks/ext/luajit/src/lj_profile.c +1 -1
  183. data/lua-hooks/ext/luajit/src/lj_profile.h +1 -1
  184. data/lua-hooks/ext/luajit/src/lj_record.c +201 -117
  185. data/lua-hooks/ext/luajit/src/lj_record.h +1 -1
  186. data/lua-hooks/ext/luajit/src/lj_snap.c +72 -26
  187. data/lua-hooks/ext/luajit/src/lj_snap.h +1 -1
  188. data/lua-hooks/ext/luajit/src/lj_state.c +6 -6
  189. data/lua-hooks/ext/luajit/src/lj_state.h +2 -2
  190. data/lua-hooks/ext/luajit/src/lj_str.c +1 -1
  191. data/lua-hooks/ext/luajit/src/lj_str.h +1 -1
  192. data/lua-hooks/ext/luajit/src/lj_strfmt.c +7 -3
  193. data/lua-hooks/ext/luajit/src/lj_strfmt.h +1 -1
  194. data/lua-hooks/ext/luajit/src/lj_strfmt_num.c +4 -3
  195. data/lua-hooks/ext/luajit/src/lj_strscan.c +1 -1
  196. data/lua-hooks/ext/luajit/src/lj_strscan.h +1 -1
  197. data/lua-hooks/ext/luajit/src/lj_tab.c +1 -2
  198. data/lua-hooks/ext/luajit/src/lj_tab.h +1 -1
  199. data/lua-hooks/ext/luajit/src/lj_target.h +3 -3
  200. data/lua-hooks/ext/luajit/src/lj_target_arm.h +1 -1
  201. data/lua-hooks/ext/luajit/src/lj_target_arm64.h +239 -7
  202. data/lua-hooks/ext/luajit/src/lj_target_mips.h +111 -22
  203. data/lua-hooks/ext/luajit/src/lj_target_ppc.h +1 -1
  204. data/lua-hooks/ext/luajit/src/lj_target_x86.h +21 -4
  205. data/lua-hooks/ext/luajit/src/lj_trace.c +63 -18
  206. data/lua-hooks/ext/luajit/src/lj_trace.h +2 -1
  207. data/lua-hooks/ext/luajit/src/lj_traceerr.h +1 -1
  208. data/lua-hooks/ext/luajit/src/lj_udata.c +1 -1
  209. data/lua-hooks/ext/luajit/src/lj_udata.h +1 -1
  210. data/lua-hooks/ext/luajit/src/lj_vm.h +5 -1
  211. data/lua-hooks/ext/luajit/src/lj_vmevent.c +1 -1
  212. data/lua-hooks/ext/luajit/src/lj_vmevent.h +1 -1
  213. data/lua-hooks/ext/luajit/src/lj_vmmath.c +1 -1
  214. data/lua-hooks/ext/luajit/src/ljamalg.c +1 -1
  215. data/lua-hooks/ext/luajit/src/lua.h +9 -1
  216. data/lua-hooks/ext/luajit/src/luaconf.h +3 -7
  217. data/lua-hooks/ext/luajit/src/luajit.c +69 -54
  218. data/lua-hooks/ext/luajit/src/luajit.h +4 -4
  219. data/lua-hooks/ext/luajit/src/lualib.h +1 -1
  220. data/lua-hooks/ext/luajit/src/msvcbuild.bat +12 -4
  221. data/lua-hooks/ext/luajit/src/vm_arm.dasc +1 -1
  222. data/lua-hooks/ext/luajit/src/vm_arm64.dasc +255 -32
  223. data/lua-hooks/ext/luajit/src/vm_mips.dasc +26 -23
  224. data/lua-hooks/ext/luajit/src/vm_mips64.dasc +5062 -0
  225. data/lua-hooks/ext/luajit/src/vm_ppc.dasc +1 -1
  226. data/lua-hooks/ext/luajit/src/vm_x64.dasc +24 -25
  227. data/lua-hooks/ext/luajit/src/vm_x86.dasc +77 -4
  228. data/lua-hooks/libluahooks.darwin.a +0 -0
  229. data/lua-hooks/libluahooks.linux.a +0 -0
  230. data/lua-hooks/options.mk +1 -1
  231. metadata +37 -77
  232. data/lua-hooks/ext/all.c +0 -69
  233. data/lua-hooks/ext/libinjection/COPYING +0 -37
  234. data/lua-hooks/ext/libinjection/libinjection.h +0 -65
  235. data/lua-hooks/ext/libinjection/libinjection_html5.c +0 -847
  236. data/lua-hooks/ext/libinjection/libinjection_html5.h +0 -54
  237. data/lua-hooks/ext/libinjection/libinjection_sqli.c +0 -2301
  238. data/lua-hooks/ext/libinjection/libinjection_sqli.h +0 -295
  239. data/lua-hooks/ext/libinjection/libinjection_sqli_data.h +0 -9349
  240. data/lua-hooks/ext/libinjection/libinjection_xss.c +0 -531
  241. data/lua-hooks/ext/libinjection/libinjection_xss.h +0 -21
  242. data/lua-hooks/ext/libinjection/lualib.c +0 -145
  243. data/lua-hooks/ext/libinjection/module.mk +0 -5
  244. data/lua-hooks/ext/lpeg/HISTORY +0 -96
  245. data/lua-hooks/ext/lpeg/lpcap.c +0 -537
  246. data/lua-hooks/ext/lpeg/lpcap.h +0 -56
  247. data/lua-hooks/ext/lpeg/lpcode.c +0 -1014
  248. data/lua-hooks/ext/lpeg/lpcode.h +0 -40
  249. data/lua-hooks/ext/lpeg/lpeg-128.gif +0 -0
  250. data/lua-hooks/ext/lpeg/lpeg.html +0 -1445
  251. data/lua-hooks/ext/lpeg/lpprint.c +0 -244
  252. data/lua-hooks/ext/lpeg/lpprint.h +0 -36
  253. data/lua-hooks/ext/lpeg/lptree.c +0 -1303
  254. data/lua-hooks/ext/lpeg/lptree.h +0 -82
  255. data/lua-hooks/ext/lpeg/lptypes.h +0 -149
  256. data/lua-hooks/ext/lpeg/lpvm.c +0 -364
  257. data/lua-hooks/ext/lpeg/lpvm.h +0 -58
  258. data/lua-hooks/ext/lpeg/makefile +0 -55
  259. data/lua-hooks/ext/lpeg/module.mk +0 -6
  260. data/lua-hooks/ext/lpeg/re.html +0 -498
  261. data/lua-hooks/ext/lua-cmsgpack/.gitignore +0 -13
  262. data/lua-hooks/ext/lua-cmsgpack/CMakeLists.txt +0 -45
  263. data/lua-hooks/ext/lua-cmsgpack/README.md +0 -115
  264. data/lua-hooks/ext/lua-cmsgpack/lua_cmsgpack.c +0 -970
  265. data/lua-hooks/ext/lua-cmsgpack/module.mk +0 -2
  266. data/lua-hooks/ext/lua-cmsgpack/test.lua +0 -570
  267. data/lua-hooks/ext/lua-snapshot/LICENSE +0 -7
  268. data/lua-hooks/ext/lua-snapshot/Makefile +0 -12
  269. data/lua-hooks/ext/lua-snapshot/README.md +0 -18
  270. data/lua-hooks/ext/lua-snapshot/dump.lua +0 -15
  271. data/lua-hooks/ext/lua-snapshot/module.mk +0 -2
  272. data/lua-hooks/ext/lua-snapshot/snapshot.c +0 -462
  273. data/lua-hooks/ext/luautf8/README.md +0 -152
  274. data/lua-hooks/ext/luautf8/lutf8lib.c +0 -1274
  275. data/lua-hooks/ext/luautf8/module.mk +0 -2
  276. data/lua-hooks/ext/luautf8/unidata.h +0 -3064
  277. data/lua-hooks/ext/module.mk +0 -15
  278. data/lua-hooks/ext/modules.h +0 -17
  279. data/lua-hooks/ext/perf/luacpu.c +0 -114
  280. data/lua-hooks/ext/perf/lualoadavg.c +0 -40
  281. data/lua-hooks/ext/perf/luameminfo.c +0 -38
  282. data/lua-hooks/ext/perf/luaoslib.c +0 -203
  283. data/lua-hooks/ext/perf/module.mk +0 -5
  284. data/lua-hooks/ext/sha1/luasha1.c +0 -74
  285. data/lua-hooks/ext/sha1/module.mk +0 -5
  286. data/lua-hooks/ext/sha1/sha1.c +0 -145
  287. data/lua-hooks/ext/sha2/luasha256.c +0 -77
  288. data/lua-hooks/ext/sha2/module.mk +0 -5
  289. data/lua-hooks/ext/sha2/sha256.c +0 -196
  290. data/lua-hooks/ext/sysutils/lua_utils.c +0 -56
  291. data/lua-hooks/ext/sysutils/module.mk +0 -2
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  ** Error handling.
3
- ** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
3
+ ** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
4
4
  */
5
5
 
6
6
  #define lj_err_c
@@ -46,7 +46,8 @@
46
46
  ** the wrapper function feature. Lua errors thrown through C++ frames
47
47
  ** cannot be caught by C++ code and C++ destructors are not run.
48
48
  **
49
- ** EXT is the default on x64 systems, INT is the default on all other systems.
49
+ ** EXT is the default on x64 systems and on Windows, INT is the default on all
50
+ ** other systems.
50
51
  **
51
52
  ** EXT can be manually enabled on POSIX systems using GCC and DWARF2 stack
52
53
  ** unwinding with -DLUAJIT_UNWIND_EXTERNAL. *All* C code must be compiled
@@ -55,7 +56,6 @@
55
56
  ** and all C libraries that have callbacks which may be used to call back
56
57
  ** into Lua. C++ code must *not* be compiled with -fno-exceptions.
57
58
  **
58
- ** EXT cannot be enabled on WIN32 since system exceptions use code-driven SEH.
59
59
  ** EXT is mandatory on WIN64 since the calling convention has an abundance
60
60
  ** of callee-saved registers (rbx, rbp, rsi, rdi, r12-r15, xmm6-xmm15).
61
61
  ** The POSIX/x64 interpreter only saves r12/r13 for INT (e.g. PS4).
@@ -63,7 +63,7 @@
63
63
 
64
64
  #if defined(__GNUC__) && (LJ_TARGET_X64 || defined(LUAJIT_UNWIND_EXTERNAL)) && !LJ_NO_UNWIND
65
65
  #define LJ_UNWIND_EXT 1
66
- #elif LJ_TARGET_X64 && LJ_TARGET_WINDOWS
66
+ #elif LJ_TARGET_WINDOWS
67
67
  #define LJ_UNWIND_EXT 1
68
68
  #endif
69
69
 
@@ -310,7 +310,6 @@ static void err_raise_ext(int errcode)
310
310
  #define _US_FORCE_UNWIND 8
311
311
 
312
312
  typedef struct _Unwind_Control_Block _Unwind_Control_Block;
313
- typedef struct _Unwind_Context _Unwind_Context;
314
313
 
315
314
  struct _Unwind_Control_Block {
316
315
  uint64_t exclass;
@@ -385,7 +384,7 @@ static void err_raise_ext(int errcode)
385
384
 
386
385
  #endif /* LJ_TARGET_ARM */
387
386
 
388
- #elif LJ_TARGET_X64 && LJ_ABI_WIN
387
+ #elif LJ_ABI_WIN
389
388
 
390
389
  /*
391
390
  ** Someone in Redmond owes me several days of my life. A lot of this is
@@ -403,6 +402,7 @@ static void err_raise_ext(int errcode)
403
402
  #define WIN32_LEAN_AND_MEAN
404
403
  #include <windows.h>
405
404
 
405
+ #if LJ_TARGET_X64
406
406
  /* Taken from: http://www.nynaeve.net/?p=99 */
407
407
  typedef struct UndocumentedDispatcherContext {
408
408
  ULONG64 ControlPc;
@@ -417,11 +417,14 @@ typedef struct UndocumentedDispatcherContext {
417
417
  ULONG ScopeIndex;
418
418
  ULONG Fill0;
419
419
  } UndocumentedDispatcherContext;
420
+ #else
421
+ typedef void *UndocumentedDispatcherContext;
422
+ #endif
420
423
 
421
424
  /* Another wild guess. */
422
425
  extern void __DestructExceptionObject(EXCEPTION_RECORD *rec, int nothrow);
423
426
 
424
- #ifdef MINGW_SDK_INIT
427
+ #if LJ_TARGET_X64 && defined(MINGW_SDK_INIT)
425
428
  /* Workaround for broken MinGW64 declaration. */
426
429
  VOID RtlUnwindEx_FIXED(PVOID,PVOID,PVOID,PVOID,PVOID,PVOID) asm("RtlUnwindEx");
427
430
  #define RtlUnwindEx RtlUnwindEx_FIXED
@@ -435,10 +438,15 @@ VOID RtlUnwindEx_FIXED(PVOID,PVOID,PVOID,PVOID,PVOID,PVOID) asm("RtlUnwindEx");
435
438
  #define LJ_EXCODE_CHECK(cl) (((cl) ^ LJ_EXCODE) <= 0xff)
436
439
  #define LJ_EXCODE_ERRCODE(cl) ((int)((cl) & 0xff))
437
440
 
438
- /* Win64 exception handler for interpreter frame. */
439
- LJ_FUNCA EXCEPTION_DISPOSITION lj_err_unwind_win64(EXCEPTION_RECORD *rec,
440
- void *cf, CONTEXT *ctx, UndocumentedDispatcherContext *dispatch)
441
+ /* Windows exception handler for interpreter frame. */
442
+ LJ_FUNCA int lj_err_unwind_win(EXCEPTION_RECORD *rec,
443
+ void *f, CONTEXT *ctx, UndocumentedDispatcherContext *dispatch)
441
444
  {
445
+ #if LJ_TARGET_X64
446
+ void *cf = f;
447
+ #else
448
+ void *cf = (char *)f - CFRAME_OFS_SEH;
449
+ #endif
442
450
  lua_State *L = cframe_L(cf);
443
451
  int errcode = LJ_EXCODE_CHECK(rec->ExceptionCode) ?
444
452
  LJ_EXCODE_ERRCODE(rec->ExceptionCode) : LUA_ERRRUN;
@@ -456,8 +464,9 @@ LJ_FUNCA EXCEPTION_DISPOSITION lj_err_unwind_win64(EXCEPTION_RECORD *rec,
456
464
  setstrV(L, L->top++, lj_err_str(L, LJ_ERR_ERRCPP));
457
465
  } else if (!LJ_EXCODE_CHECK(rec->ExceptionCode)) {
458
466
  /* Don't catch access violations etc. */
459
- return ExceptionContinueSearch;
467
+ return 1; /* ExceptionContinueSearch */
460
468
  }
469
+ #if LJ_TARGET_X64
461
470
  /* Unwind the stack and call all handlers for all lower C frames
462
471
  ** (including ourselves) again with EH_UNWINDING set. Then set
463
472
  ** rsp = cf, rax = errcode and jump to the specified target.
@@ -467,9 +476,21 @@ LJ_FUNCA EXCEPTION_DISPOSITION lj_err_unwind_win64(EXCEPTION_RECORD *rec,
467
476
  lj_vm_unwind_c_eh),
468
477
  rec, (void *)(uintptr_t)errcode, ctx, dispatch->HistoryTable);
469
478
  /* RtlUnwindEx should never return. */
479
+ #else
480
+ UNUSED(ctx);
481
+ UNUSED(dispatch);
482
+ /* Call all handlers for all lower C frames (including ourselves) again
483
+ ** with EH_UNWINDING set. Then call the specified function, passing cf
484
+ ** and errcode.
485
+ */
486
+ lj_vm_rtlunwind(cf, (void *)rec,
487
+ (cframe_unwind_ff(cf2) && errcode != LUA_YIELD) ?
488
+ (void *)lj_vm_unwind_ff : (void *)lj_vm_unwind_c, errcode);
489
+ /* lj_vm_rtlunwind does not return. */
490
+ #endif
470
491
  }
471
492
  }
472
- return ExceptionContinueSearch;
493
+ return 1; /* ExceptionContinueSearch */
473
494
  }
474
495
 
475
496
  /* Raise Windows exception. */
@@ -488,7 +509,7 @@ LJ_NOINLINE void LJ_FASTCALL lj_err_throw(lua_State *L, int errcode)
488
509
  global_State *g = G(L);
489
510
  lj_trace_abort(g);
490
511
  setmref(g->jit_base, NULL);
491
- L->status = 0;
512
+ L->status = LUA_OK;
492
513
  #if LJ_UNWIND_EXT
493
514
  err_raise_ext(errcode);
494
515
  /*
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  ** Error handling.
3
- ** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
3
+ ** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
4
4
  */
5
5
 
6
6
  #ifndef _LJ_ERR_H
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  ** VM error messages.
3
- ** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
3
+ ** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
4
4
  */
5
5
 
6
6
  /* This file may be included multiple times with different ERRDEF macros. */
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  ** Fast function IDs.
3
- ** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
3
+ ** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
4
4
  */
5
5
 
6
6
  #ifndef _LJ_FF_H
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  ** Fast function call recorder.
3
- ** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
3
+ ** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
4
4
  */
5
5
 
6
6
  #define lj_ffrecord_c
@@ -102,42 +102,41 @@ static void recff_stitch(jit_State *J)
102
102
  ASMFunction cont = lj_cont_stitch;
103
103
  lua_State *L = J->L;
104
104
  TValue *base = L->base;
105
+ BCReg nslot = J->maxslot + 1 + LJ_FR2;
106
+ TValue *nframe = base + 1 + LJ_FR2;
105
107
  const BCIns *pc = frame_pc(base-1);
106
108
  TValue *pframe = frame_prevl(base-1);
107
- TRef trcont;
108
109
 
109
- lua_assert(!LJ_FR2); /* TODO_FR2: handle frame shift. */
110
110
  /* Move func + args up in Lua stack and insert continuation. */
111
- memmove(&base[1], &base[-1], sizeof(TValue)*(J->maxslot+1));
112
- setframe_ftsz(base+1, ((char *)(base+1) - (char *)pframe) + FRAME_CONT);
113
- setcont(base, cont);
111
+ memmove(&base[1], &base[-1-LJ_FR2], sizeof(TValue)*nslot);
112
+ setframe_ftsz(nframe, ((char *)nframe - (char *)pframe) + FRAME_CONT);
113
+ setcont(base-LJ_FR2, cont);
114
114
  setframe_pc(base, pc);
115
- setnilV(base-1); /* Incorrect, but rec_check_slots() won't run anymore. */
116
- L->base += 2;
117
- L->top += 2;
115
+ setnilV(base-1-LJ_FR2); /* Incorrect, but rec_check_slots() won't run anymore. */
116
+ L->base += 2 + LJ_FR2;
117
+ L->top += 2 + LJ_FR2;
118
118
 
119
119
  /* Ditto for the IR. */
120
- memmove(&J->base[1], &J->base[-1], sizeof(TRef)*(J->maxslot+1));
121
- #if LJ_64
122
- trcont = lj_ir_kptr(J, (void *)((int64_t)cont-(int64_t)lj_vm_asm_begin));
120
+ memmove(&J->base[1], &J->base[-1-LJ_FR2], sizeof(TRef)*nslot);
121
+ #if LJ_FR2
122
+ J->base[2] = TREF_FRAME;
123
+ J->base[-1] = lj_ir_k64(J, IR_KNUM, u64ptr(contptr(cont)));
124
+ J->base[0] = lj_ir_k64(J, IR_KNUM, u64ptr(pc)) | TREF_CONT;
123
125
  #else
124
- trcont = lj_ir_kptr(J, (void *)cont);
126
+ J->base[0] = lj_ir_kptr(J, contptr(cont)) | TREF_CONT;
125
127
  #endif
126
- J->base[0] = trcont | TREF_CONT;
127
- J->ktracep = lj_ir_k64_reserve(J);
128
- lua_assert(irt_toitype_(IRT_P64) == LJ_TTRACE);
129
- J->base[-1] = emitir(IRT(IR_XLOAD, IRT_P64), lj_ir_kptr(J, &J->ktracep->gcr), 0);
130
- J->base += 2;
131
- J->baseslot += 2;
128
+ J->ktrace = tref_ref((J->base[-1-LJ_FR2] = lj_ir_ktrace(J)));
129
+ J->base += 2 + LJ_FR2;
130
+ J->baseslot += 2 + LJ_FR2;
132
131
  J->framedepth++;
133
132
 
134
133
  lj_record_stop(J, LJ_TRLINK_STITCH, 0);
135
134
 
136
135
  /* Undo Lua stack changes. */
137
- memmove(&base[-1], &base[1], sizeof(TValue)*(J->maxslot+1));
136
+ memmove(&base[-1-LJ_FR2], &base[1], sizeof(TValue)*nslot);
138
137
  setframe_pc(base-1, pc);
139
- L->base -= 2;
140
- L->top -= 2;
138
+ L->base -= 2 + LJ_FR2;
139
+ L->top -= 2 + LJ_FR2;
141
140
  }
142
141
 
143
142
  /* Fallback handler for fast functions that are not recorded (yet). */
@@ -179,7 +178,7 @@ static void LJ_FASTCALL recff_nyi(jit_State *J, RecordFFData *rd)
179
178
  /* Emit BUFHDR for the global temporary buffer. */
180
179
  static TRef recff_bufhdr(jit_State *J)
181
180
  {
182
- return emitir(IRT(IR_BUFHDR, IRT_P32),
181
+ return emitir(IRT(IR_BUFHDR, IRT_PGC),
183
182
  lj_ir_kptr(J, &J2G(J)->tmpbuf), IRBUFHDR_RESET);
184
183
  }
185
184
 
@@ -229,7 +228,7 @@ static void LJ_FASTCALL recff_setmetatable(jit_State *J, RecordFFData *rd)
229
228
  ix.tab = tr;
230
229
  copyTV(J->L, &ix.tabv, &rd->argv[0]);
231
230
  lj_record_mm_lookup(J, &ix, MM_metatable); /* Guard for no __metatable. */
232
- fref = emitir(IRT(IR_FREF, IRT_P32), tr, IRFL_TAB_META);
231
+ fref = emitir(IRT(IR_FREF, IRT_PGC), tr, IRFL_TAB_META);
233
232
  mtref = tref_isnil(mt) ? lj_ir_knull(J, IRT_TAB) : mt;
234
233
  emitir(IRT(IR_FSTORE, IRT_TAB), fref, mtref);
235
234
  if (!tref_isnil(mt))
@@ -295,7 +294,7 @@ int32_t lj_ffrecord_select_mode(jit_State *J, TRef tr, TValue *tv)
295
294
  if (strV(tv)->len == 1) {
296
295
  emitir(IRTG(IR_EQ, IRT_STR), tr, lj_ir_kstr(J, strV(tv)));
297
296
  } else {
298
- TRef trptr = emitir(IRT(IR_STRREF, IRT_P32), tr, lj_ir_kint(J, 0));
297
+ TRef trptr = emitir(IRT(IR_STRREF, IRT_PGC), tr, lj_ir_kint(J, 0));
299
298
  TRef trchar = emitir(IRT(IR_XLOAD, IRT_U8), trptr, IRXLOAD_READONLY);
300
299
  emitir(IRTG(IR_EQ, IRT_INT), trchar, lj_ir_kint(J, '#'));
301
300
  }
@@ -380,10 +379,10 @@ static int recff_metacall(jit_State *J, RecordFFData *rd, MMS mm)
380
379
  int errcode;
381
380
  TValue argv0;
382
381
  /* Temporarily insert metamethod below object. */
383
- J->base[1] = J->base[0];
382
+ J->base[1+LJ_FR2] = J->base[0];
384
383
  J->base[0] = ix.mobj;
385
384
  copyTV(J->L, &argv0, &rd->argv[0]);
386
- copyTV(J->L, &rd->argv[1], &rd->argv[0]);
385
+ copyTV(J->L, &rd->argv[1+LJ_FR2], &rd->argv[0]);
387
386
  copyTV(J->L, &rd->argv[0], &ix.mobjv);
388
387
  /* Need to protect lj_record_tailcall because it may throw. */
389
388
  errcode = lj_vm_cpcall(J->L, NULL, J, recff_metacall_cp);
@@ -450,6 +449,10 @@ static void LJ_FASTCALL recff_xpairs(jit_State *J, RecordFFData *rd)
450
449
  static void LJ_FASTCALL recff_pcall(jit_State *J, RecordFFData *rd)
451
450
  {
452
451
  if (J->maxslot >= 1) {
452
+ #if LJ_FR2
453
+ /* Shift function arguments up. */
454
+ memmove(J->base + 1, J->base, sizeof(TRef) * J->maxslot);
455
+ #endif
453
456
  lj_record_call(J, 0, J->maxslot - 1);
454
457
  rd->nres = -1; /* Pending call. */
455
458
  } /* else: Interpreter will throw. */
@@ -469,13 +472,16 @@ static void LJ_FASTCALL recff_xpcall(jit_State *J, RecordFFData *rd)
469
472
  TValue argv0, argv1;
470
473
  TRef tmp;
471
474
  int errcode;
472
- lua_assert(!LJ_FR2); /* TODO_FR2: handle different frame setup. */
473
475
  /* Swap function and traceback. */
474
476
  tmp = J->base[0]; J->base[0] = J->base[1]; J->base[1] = tmp;
475
477
  copyTV(J->L, &argv0, &rd->argv[0]);
476
478
  copyTV(J->L, &argv1, &rd->argv[1]);
477
479
  copyTV(J->L, &rd->argv[0], &argv1);
478
480
  copyTV(J->L, &rd->argv[1], &argv0);
481
+ #if LJ_FR2
482
+ /* Shift function arguments up. */
483
+ memmove(J->base + 2, J->base + 1, sizeof(TRef) * (J->maxslot-1));
484
+ #endif
479
485
  /* Need to protect lj_record_call because it may throw. */
480
486
  errcode = lj_vm_cpcall(J->L, NULL, J, recff_xpcall_cp);
481
487
  /* Always undo Lua stack swap to avoid confusing the interpreter. */
@@ -504,7 +510,7 @@ static void LJ_FASTCALL recff_getfenv(jit_State *J, RecordFFData *rd)
504
510
  static void LJ_FASTCALL recff_math_abs(jit_State *J, RecordFFData *rd)
505
511
  {
506
512
  TRef tr = lj_ir_tonum(J, J->base[0]);
507
- J->base[0] = emitir(IRTN(IR_ABS), tr, lj_ir_knum_abs(J));
513
+ J->base[0] = emitir(IRTN(IR_ABS), tr, lj_ir_ksimd(J, LJ_KSIMD_ABS));
508
514
  UNUSED(rd);
509
515
  }
510
516
 
@@ -613,10 +619,8 @@ static void LJ_FASTCALL recff_math_modf(jit_State *J, RecordFFData *rd)
613
619
 
614
620
  static void LJ_FASTCALL recff_math_pow(jit_State *J, RecordFFData *rd)
615
621
  {
616
- TRef tr = lj_ir_tonum(J, J->base[0]);
617
- if (!tref_isnumber_str(J->base[1]))
618
- lj_trace_err(J, LJ_TRERR_BADTYPE);
619
- J->base[0] = lj_opt_narrow_pow(J, tr, J->base[1], &rd->argv[1]);
622
+ J->base[0] = lj_opt_narrow_pow(J, J->base[0], J->base[1],
623
+ &rd->argv[0], &rd->argv[1]);
620
624
  UNUSED(rd);
621
625
  }
622
626
 
@@ -822,7 +826,7 @@ static void LJ_FASTCALL recff_string_range(jit_State *J, RecordFFData *rd)
822
826
  /* Also handle empty range here, to avoid extra traces. */
823
827
  TRef trptr, trslen = emitir(IRTI(IR_SUB), trend, trstart);
824
828
  emitir(IRTGI(IR_GE), trslen, tr0);
825
- trptr = emitir(IRT(IR_STRREF, IRT_P32), trstr, trstart);
829
+ trptr = emitir(IRT(IR_STRREF, IRT_PGC), trstr, trstart);
826
830
  J->base[0] = emitir(IRT(IR_SNEW, IRT_STR), trptr, trslen);
827
831
  } else { /* Range underflow: return empty string. */
828
832
  emitir(IRTGI(IR_LT), trend, trstart);
@@ -838,7 +842,7 @@ static void LJ_FASTCALL recff_string_range(jit_State *J, RecordFFData *rd)
838
842
  rd->nres = len;
839
843
  for (i = 0; i < len; i++) {
840
844
  TRef tmp = emitir(IRTI(IR_ADD), trstart, lj_ir_kint(J, (int32_t)i));
841
- tmp = emitir(IRT(IR_STRREF, IRT_P32), trstr, tmp);
845
+ tmp = emitir(IRT(IR_STRREF, IRT_PGC), trstr, tmp);
842
846
  J->base[i] = emitir(IRT(IR_XLOAD, IRT_U8), tmp, IRXLOAD_READONLY);
843
847
  }
844
848
  } else { /* Empty range or range underflow: return no results. */
@@ -860,7 +864,7 @@ static void LJ_FASTCALL recff_string_char(jit_State *J, RecordFFData *rd)
860
864
  if (i > 1) { /* Concatenate the strings, if there's more than one. */
861
865
  TRef hdr = recff_bufhdr(J), tr = hdr;
862
866
  for (i = 0; J->base[i] != 0; i++)
863
- tr = emitir(IRT(IR_BUFPUT, IRT_P32), tr, J->base[i]);
867
+ tr = emitir(IRT(IR_BUFPUT, IRT_PGC), tr, J->base[i]);
864
868
  J->base[0] = emitir(IRT(IR_BUFSTR, IRT_STR), tr, hdr);
865
869
  }
866
870
  UNUSED(rd);
@@ -877,14 +881,14 @@ static void LJ_FASTCALL recff_string_rep(jit_State *J, RecordFFData *rd)
877
881
  emitir(IRTGI(vrep > 1 ? IR_GT : IR_LE), rep, lj_ir_kint(J, 1));
878
882
  if (vrep > 1) {
879
883
  TRef hdr2 = recff_bufhdr(J);
880
- TRef tr2 = emitir(IRT(IR_BUFPUT, IRT_P32), hdr2, sep);
881
- tr2 = emitir(IRT(IR_BUFPUT, IRT_P32), tr2, str);
884
+ TRef tr2 = emitir(IRT(IR_BUFPUT, IRT_PGC), hdr2, sep);
885
+ tr2 = emitir(IRT(IR_BUFPUT, IRT_PGC), tr2, str);
882
886
  str2 = emitir(IRT(IR_BUFSTR, IRT_STR), tr2, hdr2);
883
887
  }
884
888
  }
885
889
  tr = hdr = recff_bufhdr(J);
886
890
  if (str2) {
887
- tr = emitir(IRT(IR_BUFPUT, IRT_P32), tr, str);
891
+ tr = emitir(IRT(IR_BUFPUT, IRT_PGC), tr, str);
888
892
  str = str2;
889
893
  rep = emitir(IRTI(IR_ADD), rep, lj_ir_kint(J, -1));
890
894
  }
@@ -935,8 +939,8 @@ static void LJ_FASTCALL recff_string_find(jit_State *J, RecordFFData *rd)
935
939
  if ((J->base[2] && tref_istruecond(J->base[3])) ||
936
940
  (emitir(IRTG(IR_EQ, IRT_STR), trpat, lj_ir_kstr(J, pat)),
937
941
  !lj_str_haspattern(pat))) { /* Search for fixed string. */
938
- TRef trsptr = emitir(IRT(IR_STRREF, IRT_P32), trstr, trstart);
939
- TRef trpptr = emitir(IRT(IR_STRREF, IRT_P32), trpat, tr0);
942
+ TRef trsptr = emitir(IRT(IR_STRREF, IRT_PGC), trstr, trstart);
943
+ TRef trpptr = emitir(IRT(IR_STRREF, IRT_PGC), trpat, tr0);
940
944
  TRef trslen = emitir(IRTI(IR_SUB), trlen, trstart);
941
945
  TRef trplen = emitir(IRTI(IR_FLOAD), trpat, IRFL_STR_LEN);
942
946
  TRef tr = lj_ir_call(J, IRCALL_lj_str_find, trsptr, trpptr, trslen, trplen);
@@ -944,13 +948,13 @@ static void LJ_FASTCALL recff_string_find(jit_State *J, RecordFFData *rd)
944
948
  if (lj_str_find(strdata(str)+(MSize)start, strdata(pat),
945
949
  str->len-(MSize)start, pat->len)) {
946
950
  TRef pos;
947
- emitir(IRTG(IR_NE, IRT_P32), tr, trp0);
948
- pos = emitir(IRTI(IR_SUB), tr, emitir(IRT(IR_STRREF, IRT_P32), trstr, tr0));
951
+ emitir(IRTG(IR_NE, IRT_PGC), tr, trp0);
952
+ pos = emitir(IRTI(IR_SUB), tr, emitir(IRT(IR_STRREF, IRT_PGC), trstr, tr0));
949
953
  J->base[0] = emitir(IRTI(IR_ADD), pos, lj_ir_kint(J, 1));
950
954
  J->base[1] = emitir(IRTI(IR_ADD), pos, trplen);
951
955
  rd->nres = 2;
952
956
  } else {
953
- emitir(IRTG(IR_EQ, IRT_P32), tr, trp0);
957
+ emitir(IRTG(IR_EQ, IRT_PGC), tr, trp0);
954
958
  J->base[0] = TREF_NIL;
955
959
  }
956
960
  } else { /* Search for pattern. */
@@ -977,7 +981,7 @@ static void LJ_FASTCALL recff_string_format(jit_State *J, RecordFFData *rd)
977
981
  IRCallID id;
978
982
  switch (STRFMT_TYPE(sf)) {
979
983
  case STRFMT_LIT:
980
- tr = emitir(IRT(IR_BUFPUT, IRT_P32), tr,
984
+ tr = emitir(IRT(IR_BUFPUT, IRT_PGC), tr,
981
985
  lj_ir_kstr(J, lj_str_new(J->L, fs.str, fs.len)));
982
986
  break;
983
987
  case STRFMT_INT:
@@ -986,7 +990,7 @@ static void LJ_FASTCALL recff_string_format(jit_State *J, RecordFFData *rd)
986
990
  if (!tref_isinteger(tra))
987
991
  goto handle_num;
988
992
  if (sf == STRFMT_INT) { /* Shortcut for plain %d. */
989
- tr = emitir(IRT(IR_BUFPUT, IRT_P32), tr,
993
+ tr = emitir(IRT(IR_BUFPUT, IRT_PGC), tr,
990
994
  emitir(IRT(IR_TOSTR, IRT_STR), tra, IRTOSTR_INT));
991
995
  } else {
992
996
  #if LJ_HASFFI
@@ -1016,7 +1020,7 @@ static void LJ_FASTCALL recff_string_format(jit_State *J, RecordFFData *rd)
1016
1020
  return;
1017
1021
  }
1018
1022
  if (sf == STRFMT_STR) /* Shortcut for plain %s. */
1019
- tr = emitir(IRT(IR_BUFPUT, IRT_P32), tr, tra);
1023
+ tr = emitir(IRT(IR_BUFPUT, IRT_PGC), tr, tra);
1020
1024
  else if ((sf & STRFMT_T_QUOTED))
1021
1025
  tr = lj_ir_call(J, IRCALL_lj_strfmt_putquoted, tr, tra);
1022
1026
  else
@@ -1025,7 +1029,7 @@ static void LJ_FASTCALL recff_string_format(jit_State *J, RecordFFData *rd)
1025
1029
  case STRFMT_CHAR:
1026
1030
  tra = lj_opt_narrow_toint(J, tra);
1027
1031
  if (sf == STRFMT_CHAR) /* Shortcut for plain %c. */
1028
- tr = emitir(IRT(IR_BUFPUT, IRT_P32), tr,
1032
+ tr = emitir(IRT(IR_BUFPUT, IRT_PGC), tr,
1029
1033
  emitir(IRT(IR_TOSTR, IRT_STR), tra, IRTOSTR_CHAR));
1030
1034
  else
1031
1035
  tr = lj_ir_call(J, IRCALL_lj_strfmt_putfchar, tr, trsf, tra);
@@ -1110,8 +1114,13 @@ static TRef recff_io_fp(jit_State *J, TRef *udp, int32_t id)
1110
1114
  {
1111
1115
  TRef tr, ud, fp;
1112
1116
  if (id) { /* io.func() */
1117
+ #if LJ_GC64
1118
+ /* TODO: fix ARM32 asm_fload(), so we can use this for all archs. */
1119
+ ud = lj_ir_ggfload(J, IRT_UDATA, GG_OFS(g.gcroot[id]));
1120
+ #else
1113
1121
  tr = lj_ir_kptr(J, &J2G(J)->gcroot[id]);
1114
1122
  ud = emitir(IRT(IR_XLOAD, IRT_UDATA), tr, 0);
1123
+ #endif
1115
1124
  } else { /* fp:method() */
1116
1125
  ud = J->base[0];
1117
1126
  if (!tref_isudata(ud))
@@ -1133,7 +1142,7 @@ static void LJ_FASTCALL recff_io_write(jit_State *J, RecordFFData *rd)
1133
1142
  ptrdiff_t i = rd->data == 0 ? 1 : 0;
1134
1143
  for (; J->base[i]; i++) {
1135
1144
  TRef str = lj_ir_tostr(J, J->base[i]);
1136
- TRef buf = emitir(IRT(IR_STRREF, IRT_P32), str, zero);
1145
+ TRef buf = emitir(IRT(IR_STRREF, IRT_PGC), str, zero);
1137
1146
  TRef len = emitir(IRTI(IR_FLOAD), str, IRFL_STR_LEN);
1138
1147
  if (tref_isk(len) && IR(tref_ref(len))->i == 1) {
1139
1148
  IRIns *irs = IR(tref_ref(str));
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  ** Fast function call recorder.
3
- ** Copyright (C) 2005-2016 Mike Pall. See Copyright Notice in luajit.h
3
+ ** Copyright (C) 2005-2017 Mike Pall. See Copyright Notice in luajit.h
4
4
  */
5
5
 
6
6
  #ifndef _LJ_FFRECORD_H