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
  ** String library.
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
  ** Major portions taken verbatim or adapted from the Lua interpreter.
6
6
  ** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h
@@ -737,10 +737,6 @@ LUALIB_API int luaopen_string(lua_State *L)
737
737
  GCtab *mt;
738
738
  global_State *g;
739
739
  LJ_LIB_REG(L, LUA_STRLIBNAME, string);
740
- #if defined(LUA_COMPAT_GFIND) && !LJ_52
741
- lua_getfield(L, -1, "gmatch");
742
- lua_setfield(L, -2, "gfind");
743
- #endif
744
740
  mt = lj_tab_new(L, 0, 1);
745
741
  /* NOBARRIER: basemt is a GC root. */
746
742
  g = G(L);
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  ** Table library.
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
  ** Major portions taken verbatim or adapted from the Lua interpreter.
6
6
  ** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h
@@ -129,6 +129,26 @@ LJLIB_LUA(table_remove) /*
129
129
  end
130
130
  */
131
131
 
132
+ LJLIB_LUA(table_move) /*
133
+ function(a1, f, e, t, a2)
134
+ CHECK_tab(a1)
135
+ CHECK_int(f)
136
+ CHECK_int(e)
137
+ CHECK_int(t)
138
+ if a2 == nil then a2 = a1 end
139
+ CHECK_tab(a2)
140
+ if e >= f then
141
+ local d = t - f
142
+ if t > e or t <= f or a2 ~= a1 then
143
+ for i=f,e do a2[i+d] = a1[i] end
144
+ else
145
+ for i=e,f,-1 do a2[i+d] = a1[i] end
146
+ end
147
+ end
148
+ return a2
149
+ end
150
+ */
151
+
132
152
  LJLIB_CF(table_concat) LJLIB_REC(.)
133
153
  {
134
154
  GCtab *t = lj_lib_checktab(L, 1);
@@ -27,15 +27,15 @@
27
27
  {
28
28
  Optimized string compare
29
29
  Memcheck:Addr4
30
- fun:lj_str_fastcmp
30
+ fun:str_fastcmp
31
31
  }
32
32
  {
33
33
  Optimized string compare
34
34
  Memcheck:Addr1
35
- fun:lj_str_fastcmp
35
+ fun:str_fastcmp
36
36
  }
37
37
  {
38
38
  Optimized string compare
39
39
  Memcheck:Cond
40
- fun:lj_str_fastcmp
40
+ fun:str_fastcmp
41
41
  }
@@ -72,13 +72,56 @@
72
72
 
73
73
  #define IS_DIRECT_BIT (SIZE_T_ONE)
74
74
 
75
+
76
+ /* Determine system-specific block allocation method. */
75
77
  #if LJ_TARGET_WINDOWS
76
78
 
77
79
  #define WIN32_LEAN_AND_MEAN
78
80
  #include <windows.h>
79
81
 
82
+ #define LJ_ALLOC_VIRTUALALLOC 1
83
+
80
84
  #if LJ_64 && !LJ_GC64
85
+ #define LJ_ALLOC_NTAVM 1
86
+ #endif
87
+
88
+ #else
89
+
90
+ #include <errno.h>
91
+ /* If this include fails, then rebuild with: -DLUAJIT_USE_SYSMALLOC */
92
+ #include <sys/mman.h>
93
+
94
+ #define LJ_ALLOC_MMAP 1
95
+
96
+ #if LJ_64
97
+
98
+ #define LJ_ALLOC_MMAP_PROBE 1
99
+
100
+ #if LJ_GC64
101
+ #define LJ_ALLOC_MBITS 47 /* 128 TB in LJ_GC64 mode. */
102
+ #elif LJ_TARGET_X64 && LJ_HASJIT
103
+ /* Due to limitations in the x64 compiler backend. */
104
+ #define LJ_ALLOC_MBITS 31 /* 2 GB on x64 with !LJ_GC64. */
105
+ #else
106
+ #define LJ_ALLOC_MBITS 32 /* 4 GB on other archs with !LJ_GC64. */
107
+ #endif
108
+
109
+ #endif
110
+
111
+ #if LJ_64 && !LJ_GC64 && defined(MAP_32BIT)
112
+ #define LJ_ALLOC_MMAP32 1
113
+ #endif
114
+
115
+ #if LJ_TARGET_LINUX
116
+ #define LJ_ALLOC_MREMAP 1
117
+ #endif
118
+
119
+ #endif
81
120
 
121
+
122
+ #if LJ_ALLOC_VIRTUALALLOC
123
+
124
+ #if LJ_ALLOC_NTAVM
82
125
  /* Undocumented, but hey, that's what we all love so much about Windows. */
83
126
  typedef long (*PNTAVM)(HANDLE handle, void **addr, ULONG zbits,
84
127
  size_t *size, ULONG alloctype, ULONG prot);
@@ -89,14 +132,15 @@ static PNTAVM ntavm;
89
132
  */
90
133
  #define NTAVM_ZEROBITS 1
91
134
 
92
- static void INIT_MMAP(void)
135
+ static void init_mmap(void)
93
136
  {
94
137
  ntavm = (PNTAVM)GetProcAddress(GetModuleHandleA("ntdll.dll"),
95
138
  "NtAllocateVirtualMemory");
96
139
  }
140
+ #define INIT_MMAP() init_mmap()
97
141
 
98
142
  /* Win64 32 bit MMAP via NtAllocateVirtualMemory. */
99
- static LJ_AINLINE void *CALL_MMAP(size_t size)
143
+ static void *CALL_MMAP(size_t size)
100
144
  {
101
145
  DWORD olderr = GetLastError();
102
146
  void *ptr = NULL;
@@ -107,7 +151,7 @@ static LJ_AINLINE void *CALL_MMAP(size_t size)
107
151
  }
108
152
 
109
153
  /* For direct MMAP, use MEM_TOP_DOWN to minimize interference */
110
- static LJ_AINLINE void *DIRECT_MMAP(size_t size)
154
+ static void *DIRECT_MMAP(size_t size)
111
155
  {
112
156
  DWORD olderr = GetLastError();
113
157
  void *ptr = NULL;
@@ -119,10 +163,8 @@ static LJ_AINLINE void *DIRECT_MMAP(size_t size)
119
163
 
120
164
  #else
121
165
 
122
- #define INIT_MMAP() ((void)0)
123
-
124
166
  /* Win32 MMAP via VirtualAlloc */
125
- static LJ_AINLINE void *CALL_MMAP(size_t size)
167
+ static void *CALL_MMAP(size_t size)
126
168
  {
127
169
  DWORD olderr = GetLastError();
128
170
  void *ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT, PAGE_READWRITE);
@@ -131,7 +173,7 @@ static LJ_AINLINE void *CALL_MMAP(size_t size)
131
173
  }
132
174
 
133
175
  /* For direct MMAP, use MEM_TOP_DOWN to minimize interference */
134
- static LJ_AINLINE void *DIRECT_MMAP(size_t size)
176
+ static void *DIRECT_MMAP(size_t size)
135
177
  {
136
178
  DWORD olderr = GetLastError();
137
179
  void *ptr = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN,
@@ -143,7 +185,7 @@ static LJ_AINLINE void *DIRECT_MMAP(size_t size)
143
185
  #endif
144
186
 
145
187
  /* This function supports releasing coalesed segments */
146
- static LJ_AINLINE int CALL_MUNMAP(void *ptr, size_t size)
188
+ static int CALL_MUNMAP(void *ptr, size_t size)
147
189
  {
148
190
  DWORD olderr = GetLastError();
149
191
  MEMORY_BASIC_INFORMATION minfo;
@@ -163,10 +205,7 @@ static LJ_AINLINE int CALL_MUNMAP(void *ptr, size_t size)
163
205
  return 0;
164
206
  }
165
207
 
166
- #else
167
-
168
- #include <errno.h>
169
- #include <sys/mman.h>
208
+ #elif LJ_ALLOC_MMAP
170
209
 
171
210
  #define MMAP_PROT (PROT_READ|PROT_WRITE)
172
211
  #if !defined(MAP_ANONYMOUS) && defined(MAP_ANON)
@@ -174,107 +213,151 @@ static LJ_AINLINE int CALL_MUNMAP(void *ptr, size_t size)
174
213
  #endif
175
214
  #define MMAP_FLAGS (MAP_PRIVATE|MAP_ANONYMOUS)
176
215
 
177
- #if LJ_64 && !LJ_GC64
178
- /* 64 bit mode with 32 bit pointers needs special support for allocating
179
- ** memory in the lower 2GB.
180
- */
181
-
182
- #if defined(MAP_32BIT)
216
+ #if LJ_ALLOC_MMAP_PROBE
183
217
 
184
- #if defined(__sun__)
185
- #define MMAP_REGION_START ((uintptr_t)0x1000)
218
+ #ifdef MAP_TRYFIXED
219
+ #define MMAP_FLAGS_PROBE (MMAP_FLAGS|MAP_TRYFIXED)
186
220
  #else
187
- /* Actually this only gives us max. 1GB in current Linux kernels. */
188
- #define MMAP_REGION_START ((uintptr_t)0)
221
+ #define MMAP_FLAGS_PROBE MMAP_FLAGS
189
222
  #endif
190
223
 
191
- static LJ_AINLINE void *CALL_MMAP(size_t size)
192
- {
193
- int olderr = errno;
194
- void *ptr = mmap((void *)MMAP_REGION_START, size, MMAP_PROT, MAP_32BIT|MMAP_FLAGS, -1, 0);
195
- errno = olderr;
196
- return ptr;
197
- }
224
+ #define LJ_ALLOC_MMAP_PROBE_MAX 30
225
+ #define LJ_ALLOC_MMAP_PROBE_LINEAR 5
198
226
 
199
- #elif LJ_TARGET_OSX || LJ_TARGET_PS4 || defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) || defined(__sun__) || defined(__CYGWIN__)
227
+ #define LJ_ALLOC_MMAP_PROBE_LOWER ((uintptr_t)0x4000)
200
228
 
201
- /* OSX and FreeBSD mmap() use a naive first-fit linear search.
202
- ** That's perfect for us. Except that -pagezero_size must be set for OSX,
203
- ** otherwise the lower 4GB are blocked. And the 32GB RLIMIT_DATA needs
204
- ** to be reduced to 250MB on FreeBSD.
229
+ /* No point in a giant ifdef mess. Just try to open /dev/urandom.
230
+ ** It doesn't really matter if this fails, since we get some ASLR bits from
231
+ ** every unsuitable allocation, too. And we prefer linear allocation, anyway.
205
232
  */
206
- #if LJ_TARGET_OSX || defined(__DragonFly__)
207
- #define MMAP_REGION_START ((uintptr_t)0x10000)
208
- #elif LJ_TARGET_PS4
209
- #define MMAP_REGION_START ((uintptr_t)0x4000)
210
- #else
211
- #define MMAP_REGION_START ((uintptr_t)0x10000000)
212
- #endif
213
- #define MMAP_REGION_END ((uintptr_t)0x80000000)
233
+ #include <fcntl.h>
234
+ #include <unistd.h>
214
235
 
215
- #if (defined(__FreeBSD__) || defined(__FreeBSD_kernel__)) && !LJ_TARGET_PS4
216
- #include <sys/resource.h>
217
- #endif
236
+ static uintptr_t mmap_probe_seed(void)
237
+ {
238
+ uintptr_t val;
239
+ int fd = open("/dev/urandom", O_RDONLY);
240
+ if (fd != -1) {
241
+ int ok = ((size_t)read(fd, &val, sizeof(val)) == sizeof(val));
242
+ (void)close(fd);
243
+ if (ok) return val;
244
+ }
245
+ return 1; /* Punt. */
246
+ }
218
247
 
219
- static LJ_AINLINE void *CALL_MMAP(size_t size)
248
+ static void *mmap_probe(size_t size)
220
249
  {
221
- int olderr = errno;
222
250
  /* Hint for next allocation. Doesn't need to be thread-safe. */
223
- static uintptr_t alloc_hint = MMAP_REGION_START;
224
- int retry = 0;
225
- #if (defined(__FreeBSD__) || defined(__FreeBSD_kernel__)) && !LJ_TARGET_PS4
226
- static int rlimit_modified = 0;
227
- if (LJ_UNLIKELY(rlimit_modified == 0)) {
228
- struct rlimit rlim;
229
- rlim.rlim_cur = rlim.rlim_max = MMAP_REGION_START;
230
- setrlimit(RLIMIT_DATA, &rlim); /* Ignore result. May fail below. */
231
- rlimit_modified = 1;
232
- }
233
- #endif
234
- for (;;) {
235
- void *p = mmap((void *)alloc_hint, size, MMAP_PROT, MMAP_FLAGS, -1, 0);
236
- if ((uintptr_t)p >= MMAP_REGION_START &&
237
- (uintptr_t)p + size < MMAP_REGION_END) {
238
- alloc_hint = (uintptr_t)p + size;
251
+ static uintptr_t hint_addr = 0;
252
+ static uintptr_t hint_prng = 0;
253
+ int olderr = errno;
254
+ int retry;
255
+ for (retry = 0; retry < LJ_ALLOC_MMAP_PROBE_MAX; retry++) {
256
+ void *p = mmap((void *)hint_addr, size, MMAP_PROT, MMAP_FLAGS_PROBE, -1, 0);
257
+ uintptr_t addr = (uintptr_t)p;
258
+ if ((addr >> LJ_ALLOC_MBITS) == 0 && addr >= LJ_ALLOC_MMAP_PROBE_LOWER) {
259
+ /* We got a suitable address. Bump the hint address. */
260
+ hint_addr = addr + size;
239
261
  errno = olderr;
240
262
  return p;
241
263
  }
242
- if (p != CMFAIL) munmap(p, size);
243
- #if defined(__sun__) || defined(__DragonFly__)
244
- alloc_hint += 0x1000000; /* Need near-exhaustive linear scan. */
245
- if (alloc_hint + size < MMAP_REGION_END) continue;
246
- #endif
247
- if (retry) break;
248
- retry = 1;
249
- alloc_hint = MMAP_REGION_START;
264
+ if (p != MFAIL) {
265
+ munmap(p, size);
266
+ } else if (errno == ENOMEM) {
267
+ return MFAIL;
268
+ }
269
+ if (hint_addr) {
270
+ /* First, try linear probing. */
271
+ if (retry < LJ_ALLOC_MMAP_PROBE_LINEAR) {
272
+ hint_addr += 0x1000000;
273
+ if (((hint_addr + size) >> LJ_ALLOC_MBITS) != 0)
274
+ hint_addr = 0;
275
+ continue;
276
+ } else if (retry == LJ_ALLOC_MMAP_PROBE_LINEAR) {
277
+ /* Next, try a no-hint probe to get back an ASLR address. */
278
+ hint_addr = 0;
279
+ continue;
280
+ }
281
+ }
282
+ /* Finally, try pseudo-random probing. */
283
+ if (LJ_UNLIKELY(hint_prng == 0)) {
284
+ hint_prng = mmap_probe_seed();
285
+ }
286
+ /* The unsuitable address we got has some ASLR PRNG bits. */
287
+ hint_addr ^= addr & ~((uintptr_t)(LJ_PAGESIZE-1));
288
+ do { /* The PRNG itself is very weak, but see above. */
289
+ hint_prng = hint_prng * 1103515245 + 12345;
290
+ hint_addr ^= hint_prng * (uintptr_t)LJ_PAGESIZE;
291
+ hint_addr &= (((uintptr_t)1 << LJ_ALLOC_MBITS)-1);
292
+ } while (hint_addr < LJ_ALLOC_MMAP_PROBE_LOWER);
250
293
  }
251
294
  errno = olderr;
252
- return CMFAIL;
295
+ return MFAIL;
253
296
  }
254
297
 
298
+ #endif
299
+
300
+ #if LJ_ALLOC_MMAP32
301
+
302
+ #if defined(__sun__)
303
+ #define LJ_ALLOC_MMAP32_START ((uintptr_t)0x1000)
255
304
  #else
305
+ #define LJ_ALLOC_MMAP32_START ((uintptr_t)0)
306
+ #endif
256
307
 
257
- #error "NYI: need an equivalent of MAP_32BIT for this 64 bit OS"
308
+ static void *mmap_map32(size_t size)
309
+ {
310
+ #if LJ_ALLOC_MMAP_PROBE
311
+ static int fallback = 0;
312
+ if (fallback)
313
+ return mmap_probe(size);
314
+ #endif
315
+ {
316
+ int olderr = errno;
317
+ void *ptr = mmap((void *)LJ_ALLOC_MMAP32_START, size, MMAP_PROT, MAP_32BIT|MMAP_FLAGS, -1, 0);
318
+ errno = olderr;
319
+ /* This only allows 1GB on Linux. So fallback to probing to get 2GB. */
320
+ #if LJ_ALLOC_MMAP_PROBE
321
+ if (ptr == MFAIL) {
322
+ fallback = 1;
323
+ return mmap_probe(size);
324
+ }
325
+ #endif
326
+ return ptr;
327
+ }
328
+ }
258
329
 
259
330
  #endif
260
331
 
332
+ #if LJ_ALLOC_MMAP32
333
+ #define CALL_MMAP(size) mmap_map32(size)
334
+ #elif LJ_ALLOC_MMAP_PROBE
335
+ #define CALL_MMAP(size) mmap_probe(size)
261
336
  #else
262
-
263
- /* 32 bit mode and GC64 mode is easy. */
264
- static LJ_AINLINE void *CALL_MMAP(size_t size)
337
+ static void *CALL_MMAP(size_t size)
265
338
  {
266
339
  int olderr = errno;
267
340
  void *ptr = mmap(NULL, size, MMAP_PROT, MMAP_FLAGS, -1, 0);
268
341
  errno = olderr;
269
342
  return ptr;
270
343
  }
271
-
272
344
  #endif
273
345
 
274
- #define INIT_MMAP() ((void)0)
275
- #define DIRECT_MMAP(s) CALL_MMAP(s)
346
+ #if (defined(__FreeBSD__) || defined(__FreeBSD_kernel__)) && !LJ_TARGET_PS4
347
+
348
+ #include <sys/resource.h>
349
+
350
+ static void init_mmap(void)
351
+ {
352
+ struct rlimit rlim;
353
+ rlim.rlim_cur = rlim.rlim_max = 0x10000;
354
+ setrlimit(RLIMIT_DATA, &rlim); /* Ignore result. May fail later. */
355
+ }
356
+ #define INIT_MMAP() init_mmap()
357
+
358
+ #endif
276
359
 
277
- static LJ_AINLINE int CALL_MUNMAP(void *ptr, size_t size)
360
+ static int CALL_MUNMAP(void *ptr, size_t size)
278
361
  {
279
362
  int olderr = errno;
280
363
  int ret = munmap(ptr, size);
@@ -282,10 +365,9 @@ static LJ_AINLINE int CALL_MUNMAP(void *ptr, size_t size)
282
365
  return ret;
283
366
  }
284
367
 
285
- #if LJ_TARGET_LINUX
368
+ #if LJ_ALLOC_MREMAP
286
369
  /* Need to define _GNU_SOURCE to get the mremap prototype. */
287
- static LJ_AINLINE void *CALL_MREMAP_(void *ptr, size_t osz, size_t nsz,
288
- int flags)
370
+ static void *CALL_MREMAP_(void *ptr, size_t osz, size_t nsz, int flags)
289
371
  {
290
372
  int olderr = errno;
291
373
  ptr = mremap(ptr, osz, nsz, flags);
@@ -305,6 +387,15 @@ static LJ_AINLINE void *CALL_MREMAP_(void *ptr, size_t osz, size_t nsz,
305
387
 
306
388
  #endif
307
389
 
390
+
391
+ #ifndef INIT_MMAP
392
+ #define INIT_MMAP() ((void)0)
393
+ #endif
394
+
395
+ #ifndef DIRECT_MMAP
396
+ #define DIRECT_MMAP(s) CALL_MMAP(s)
397
+ #endif
398
+
308
399
  #ifndef CALL_MREMAP
309
400
  #define CALL_MREMAP(addr, osz, nsz, mv) ((void)osz, MFAIL)
310
401
  #endif
@@ -1,6 +1,6 @@
1
1
  /*
2
2
  ** Public Lua/C API.
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
  ** Major portions taken verbatim or adapted from the Lua interpreter.
6
6
  ** Copyright (C) 1994-2008 Lua.org, PUC-Rio. See Copyright Notice in lua.h
@@ -112,6 +112,13 @@ LUA_API void lua_xmove(lua_State *from, lua_State *to, int n)
112
112
  from->top = f;
113
113
  }
114
114
 
115
+ LUA_API const lua_Number *lua_version(lua_State *L)
116
+ {
117
+ static const lua_Number version = LUA_VERSION_NUM;
118
+ UNUSED(L);
119
+ return &version;
120
+ }
121
+
115
122
  /* -- Stack manipulation -------------------------------------------------- */
116
123
 
117
124
  LUA_API int lua_gettop(lua_State *L)
@@ -152,30 +159,40 @@ LUA_API void lua_insert(lua_State *L, int idx)
152
159
  copyTV(L, p, L->top);
153
160
  }
154
161
 
155
- LUA_API void lua_replace(lua_State *L, int idx)
162
+ static void copy_slot(lua_State *L, TValue *f, int idx)
156
163
  {
157
- api_checknelems(L, 1);
158
164
  if (idx == LUA_GLOBALSINDEX) {
159
- api_check(L, tvistab(L->top-1));
165
+ api_check(L, tvistab(f));
160
166
  /* NOBARRIER: A thread (i.e. L) is never black. */
161
- setgcref(L->env, obj2gco(tabV(L->top-1)));
167
+ setgcref(L->env, obj2gco(tabV(f)));
162
168
  } else if (idx == LUA_ENVIRONINDEX) {
163
169
  GCfunc *fn = curr_func(L);
164
170
  if (fn->c.gct != ~LJ_TFUNC)
165
171
  lj_err_msg(L, LJ_ERR_NOENV);
166
- api_check(L, tvistab(L->top-1));
167
- setgcref(fn->c.env, obj2gco(tabV(L->top-1)));
168
- lj_gc_barrier(L, fn, L->top-1);
172
+ api_check(L, tvistab(f));
173
+ setgcref(fn->c.env, obj2gco(tabV(f)));
174
+ lj_gc_barrier(L, fn, f);
169
175
  } else {
170
176
  TValue *o = index2adr(L, idx);
171
177
  api_checkvalidindex(L, o);
172
- copyTV(L, o, L->top-1);
178
+ copyTV(L, o, f);
173
179
  if (idx < LUA_GLOBALSINDEX) /* Need a barrier for upvalues. */
174
- lj_gc_barrier(L, curr_func(L), L->top-1);
180
+ lj_gc_barrier(L, curr_func(L), f);
175
181
  }
182
+ }
183
+
184
+ LUA_API void lua_replace(lua_State *L, int idx)
185
+ {
186
+ api_checknelems(L, 1);
187
+ copy_slot(L, L->top - 1, idx);
176
188
  L->top--;
177
189
  }
178
190
 
191
+ LUA_API void lua_copy(lua_State *L, int fromidx, int toidx)
192
+ {
193
+ copy_slot(L, index2adr(L, fromidx), toidx);
194
+ }
195
+
179
196
  LUA_API void lua_pushvalue(lua_State *L, int idx)
180
197
  {
181
198
  copyTV(L, L->top, index2adr(L, idx));
@@ -325,6 +342,22 @@ LUA_API lua_Number lua_tonumber(lua_State *L, int idx)
325
342
  return 0;
326
343
  }
327
344
 
345
+ LUA_API lua_Number lua_tonumberx(lua_State *L, int idx, int *ok)
346
+ {
347
+ cTValue *o = index2adr(L, idx);
348
+ TValue tmp;
349
+ if (LJ_LIKELY(tvisnumber(o))) {
350
+ if (ok) *ok = 1;
351
+ return numberVnum(o);
352
+ } else if (tvisstr(o) && lj_strscan_num(strV(o), &tmp)) {
353
+ if (ok) *ok = 1;
354
+ return numV(&tmp);
355
+ } else {
356
+ if (ok) *ok = 0;
357
+ return 0;
358
+ }
359
+ }
360
+
328
361
  LUALIB_API lua_Number luaL_checknumber(lua_State *L, int idx)
329
362
  {
330
363
  cTValue *o = index2adr(L, idx);
@@ -362,7 +395,7 @@ LUA_API lua_Integer lua_tointeger(lua_State *L, int idx)
362
395
  if (!(tvisstr(o) && lj_strscan_number(strV(o), &tmp)))
363
396
  return 0;
364
397
  if (tvisint(&tmp))
365
- return (lua_Integer)intV(&tmp);
398
+ return intV(&tmp);
366
399
  n = numV(&tmp);
367
400
  }
368
401
  #if LJ_64
@@ -372,6 +405,35 @@ LUA_API lua_Integer lua_tointeger(lua_State *L, int idx)
372
405
  #endif
373
406
  }
374
407
 
408
+ LUA_API lua_Integer lua_tointegerx(lua_State *L, int idx, int *ok)
409
+ {
410
+ cTValue *o = index2adr(L, idx);
411
+ TValue tmp;
412
+ lua_Number n;
413
+ if (LJ_LIKELY(tvisint(o))) {
414
+ if (ok) *ok = 1;
415
+ return intV(o);
416
+ } else if (LJ_LIKELY(tvisnum(o))) {
417
+ n = numV(o);
418
+ } else {
419
+ if (!(tvisstr(o) && lj_strscan_number(strV(o), &tmp))) {
420
+ if (ok) *ok = 0;
421
+ return 0;
422
+ }
423
+ if (tvisint(&tmp)) {
424
+ if (ok) *ok = 1;
425
+ return intV(&tmp);
426
+ }
427
+ n = numV(&tmp);
428
+ }
429
+ if (ok) *ok = 1;
430
+ #if LJ_64
431
+ return (lua_Integer)n;
432
+ #else
433
+ return lj_num2int(n);
434
+ #endif
435
+ }
436
+
375
437
  LUALIB_API lua_Integer luaL_checkinteger(lua_State *L, int idx)
376
438
  {
377
439
  cTValue *o = index2adr(L, idx);
@@ -858,7 +920,7 @@ LUA_API void lua_upvaluejoin(lua_State *L, int idx1, int n1, int idx2, int n2)
858
920
  lj_gc_objbarrier(L, fn1, gcref(fn1->l.uvptr[n1]));
859
921
  }
860
922
 
861
- LUALIB_API void *luaL_checkudata(lua_State *L, int idx, const char *tname)
923
+ LUALIB_API void *luaL_testudata(lua_State *L, int idx, const char *tname)
862
924
  {
863
925
  cTValue *o = index2adr(L, idx);
864
926
  if (tvisudata(o)) {
@@ -867,8 +929,14 @@ LUALIB_API void *luaL_checkudata(lua_State *L, int idx, const char *tname)
867
929
  if (tv && tvistab(tv) && tabV(tv) == tabref(ud->metatable))
868
930
  return uddata(ud);
869
931
  }
870
- lj_err_argtype(L, idx, tname);
871
- return NULL; /* unreachable */
932
+ return NULL; /* value is not a userdata with a metatable */
933
+ }
934
+
935
+ LUALIB_API void *luaL_checkudata(lua_State *L, int idx, const char *tname)
936
+ {
937
+ void *p = luaL_testudata(L, idx, tname);
938
+ if (!p) lj_err_argtype(L, idx, tname);
939
+ return p;
872
940
  }
873
941
 
874
942
  /* -- Object setters ------------------------------------------------------ */
@@ -977,6 +1045,12 @@ LUA_API int lua_setmetatable(lua_State *L, int idx)
977
1045
  return 1;
978
1046
  }
979
1047
 
1048
+ LUALIB_API void luaL_setmetatable(lua_State *L, const char *tname)
1049
+ {
1050
+ lua_getfield(L, LUA_REGISTRYINDEX, tname);
1051
+ lua_setmetatable(L, -2);
1052
+ }
1053
+
980
1054
  LUA_API int lua_setfenv(lua_State *L, int idx)
981
1055
  {
982
1056
  cTValue *o = index2adr(L, idx);
@@ -1032,7 +1106,7 @@ static TValue *api_call_base(lua_State *L, int nargs)
1032
1106
 
1033
1107
  LUA_API void lua_call(lua_State *L, int nargs, int nresults)
1034
1108
  {
1035
- api_check(L, L->status == 0 || L->status == LUA_ERRERR);
1109
+ api_check(L, L->status == LUA_OK || L->status == LUA_ERRERR);
1036
1110
  api_checknelems(L, nargs+1);
1037
1111
  lj_vm_call(L, api_call_base(L, nargs), nresults+1);
1038
1112
  }
@@ -1043,7 +1117,7 @@ LUA_API int lua_pcall(lua_State *L, int nargs, int nresults, int errfunc)
1043
1117
  uint8_t oldh = hook_save(g);
1044
1118
  ptrdiff_t ef;
1045
1119
  int status;
1046
- api_check(L, L->status == 0 || L->status == LUA_ERRERR);
1120
+ api_check(L, L->status == LUA_OK || L->status == LUA_ERRERR);
1047
1121
  api_checknelems(L, nargs+1);
1048
1122
  if (errfunc == 0) {
1049
1123
  ef = 0;
@@ -1075,7 +1149,7 @@ LUA_API int lua_cpcall(lua_State *L, lua_CFunction func, void *ud)
1075
1149
  global_State *g = G(L);
1076
1150
  uint8_t oldh = hook_save(g);
1077
1151
  int status;
1078
- api_check(L, L->status == 0 || L->status == LUA_ERRERR);
1152
+ api_check(L, L->status == LUA_OK || L->status == LUA_ERRERR);
1079
1153
  status = lj_vm_cpcall(L, func, ud, cpcall);
1080
1154
  if (status) hook_restore(g, oldh);
1081
1155
  return status;
@@ -1096,6 +1170,11 @@ LUALIB_API int luaL_callmeta(lua_State *L, int idx, const char *field)
1096
1170
 
1097
1171
  /* -- Coroutine yield and resume ------------------------------------------ */
1098
1172
 
1173
+ LUA_API int lua_isyieldable(lua_State *L)
1174
+ {
1175
+ return cframe_canyield(L->cframe);
1176
+ }
1177
+
1099
1178
  LUA_API int lua_yield(lua_State *L, int nresults)
1100
1179
  {
1101
1180
  void *cf = L->cframe;
@@ -1140,7 +1219,7 @@ LUA_API int lua_resume(lua_State *L, int nargs)
1140
1219
  {
1141
1220
  if (L->cframe == NULL && L->status <= LUA_YIELD)
1142
1221
  return lj_vm_resume(L,
1143
- L->status == 0 ? api_call_base(L, nargs) : L->top - nargs,
1222
+ L->status == LUA_OK ? api_call_base(L, nargs) : L->top - nargs,
1144
1223
  0, 0);
1145
1224
  L->top = L->base;
1146
1225
  setstrV(L, L->top, lj_err_str(L, LJ_ERR_COSUSP));