rubyduino 0.1.3 → 0.2.1

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 (1628) hide show
  1. checksums.yaml +4 -4
  2. data/.gitmodules +1 -0
  3. data/CHANGELOG.md +12 -0
  4. data/README.md +1 -2
  5. data/examples/hc_sr04.rb +39 -0
  6. data/lib/rubyduino/arduino_uno.rb +76 -0
  7. data/lib/rubyduino/sp_runtime.h +287 -0
  8. data/lib/rubyduino/spinel.rb +1 -1
  9. data/lib/rubyduino/spinel_arduino_codegen.rb +53 -13
  10. data/lib/rubyduino/version.rb +1 -1
  11. data/vendor/spinel/Makefile +463 -54
  12. data/vendor/spinel/README.md +248 -68
  13. data/vendor/spinel/benchmark/bm_jekyll_lite.rb +241 -0
  14. data/vendor/spinel/benchmark/bm_micro_lisp.rb +282 -0
  15. data/vendor/spinel/benchmark/bm_poly_cells.rb +75 -0
  16. data/vendor/spinel/benchmark/bm_range_each.rb +15 -0
  17. data/vendor/spinel/benchmark/bm_sinatra_mini.rb +126 -0
  18. data/vendor/spinel/compiler_helpers.rb +1506 -0
  19. data/vendor/spinel/docs/ANALYZE-IR.md +411 -0
  20. data/vendor/spinel/docs/AST.md +360 -0
  21. data/vendor/spinel/docs/CLASS-OBJECT.md +521 -0
  22. data/vendor/spinel/docs/FFI.md +9 -0
  23. data/vendor/spinel/docs/FLOAT-ROUNDING.md +47 -0
  24. data/vendor/spinel/docs/HASH-NULLABLE.md +379 -0
  25. data/vendor/spinel/docs/INCOMPATIBILITIES.md +102 -0
  26. data/vendor/spinel/docs/RBS-EXTRACT.md +128 -0
  27. data/vendor/spinel/docs/fast-bootstrap.md +74 -0
  28. data/vendor/spinel/docs/issue-646-plan.md +159 -0
  29. data/vendor/spinel/docs/promote-mode-plan.md +227 -0
  30. data/vendor/spinel/docs/setbyte-semantic-plan.md +203 -0
  31. data/vendor/spinel/examples/ffi/sqlite/README.md +7 -6
  32. data/vendor/spinel/examples/ffi/sqlite/sqlite3_lib.rb +7 -4
  33. data/vendor/spinel/experiments/rbs/box.rb +32 -0
  34. data/vendor/spinel/experiments/rbs/box.seed +18 -0
  35. data/vendor/spinel/experiments/rbs/harness.rb +117 -0
  36. data/vendor/spinel/lib/regexp/re_compile.c +265 -25
  37. data/vendor/spinel/lib/regexp/re_exec.c +80 -19
  38. data/vendor/spinel/lib/regexp/re_internal.h +22 -2
  39. data/vendor/spinel/lib/regexp/re_utf8.c +21 -2
  40. data/vendor/spinel/lib/sp_bigint.c +67 -3
  41. data/vendor/spinel/lib/sp_core.c +248 -0
  42. data/vendor/spinel/lib/sp_core.h +37 -0
  43. data/vendor/spinel/lib/sp_crypto.c +583 -0
  44. data/vendor/spinel/lib/sp_crypto.h +79 -0
  45. data/vendor/spinel/lib/sp_fiber.c +95 -0
  46. data/vendor/spinel/lib/sp_fiber.h +41 -0
  47. data/vendor/spinel/lib/sp_gc.c +89 -0
  48. data/vendor/spinel/lib/sp_gc.h +81 -0
  49. data/vendor/spinel/lib/sp_io.c +98 -0
  50. data/vendor/spinel/lib/sp_io.h +31 -0
  51. data/vendor/spinel/lib/sp_net.c +350 -0
  52. data/vendor/spinel/lib/sp_net.h +97 -0
  53. data/vendor/spinel/lib/sp_pack.c +431 -0
  54. data/vendor/spinel/lib/sp_runtime.h +3485 -341
  55. data/vendor/spinel/lib/sp_strscan.c +320 -0
  56. data/vendor/spinel/lib/sp_system.c +173 -0
  57. data/vendor/spinel/lib/sp_system.h +16 -0
  58. data/vendor/spinel/lib/sp_time.c +204 -0
  59. data/vendor/spinel/lib/sp_time.h +63 -0
  60. data/vendor/spinel/lib/sp_types.h +144 -0
  61. data/vendor/spinel/lib/stringio.c +31 -3
  62. data/vendor/spinel/lib/strscan.c +34 -7
  63. data/vendor/spinel/lib/strscan.rb +6 -53
  64. data/vendor/spinel/node_table_loader.rb +150 -0
  65. data/vendor/spinel/spinel +319 -21
  66. data/vendor/spinel/spinel_analyze.rb +37556 -0
  67. data/vendor/spinel/spinel_codegen.rb +47620 -33346
  68. data/vendor/spinel/spinel_parse +0 -0
  69. data/vendor/spinel/spinel_parse.c +801 -91
  70. data/vendor/spinel/spinel_rbs_extract.c +931 -0
  71. data/vendor/spinel/test/alias_attr_reader_source.rb +38 -0
  72. data/vendor/spinel/test/alias_attr_reader_source.rb.expected +7 -0
  73. data/vendor/spinel/test/alias_inherited_method.rb +20 -0
  74. data/vendor/spinel/test/alias_inherited_method.rb.expected +3 -0
  75. data/vendor/spinel/test/alias_method_dispatch.rb +14 -0
  76. data/vendor/spinel/test/analyze_fail/attributes_non_symbol.rb +3 -0
  77. data/vendor/spinel/test/analyze_fail/attributes_non_symbol.stderr.expected +1 -0
  78. data/vendor/spinel/test/analyze_fail/dynamic_define_method.rb +4 -0
  79. data/vendor/spinel/test/analyze_fail/dynamic_define_method.stderr.expected +1 -0
  80. data/vendor/spinel/test/analyze_fail/instance_exec_def_in_block.rb +14 -0
  81. data/vendor/spinel/test/analyze_fail/instance_exec_def_in_block.stderr.expected +1 -0
  82. data/vendor/spinel/test/analyze_fail/instance_exec_define_method.rb +15 -0
  83. data/vendor/spinel/test/analyze_fail/instance_exec_define_method.stderr.expected +1 -0
  84. data/vendor/spinel/test/analyze_fail/instance_exec_no_block.rb +13 -0
  85. data/vendor/spinel/test/analyze_fail/instance_exec_no_block.stderr.expected +1 -0
  86. data/vendor/spinel/test/analyze_fail/nonliteral_define_method_each.rb +7 -0
  87. data/vendor/spinel/test/analyze_fail/nonliteral_define_method_each.stderr.expected +1 -0
  88. data/vendor/spinel/test/argv_gc.rb +45 -0
  89. data/vendor/spinel/test/argv_gc.rb.args +1 -0
  90. data/vendor/spinel/test/argv_gc.rb.expected +6 -0
  91. data/vendor/spinel/test/array_at_out_of_bounds.rb +23 -0
  92. data/vendor/spinel/test/array_at_out_of_bounds.rb.expected +12 -0
  93. data/vendor/spinel/test/array_clear_expr.rb +26 -0
  94. data/vendor/spinel/test/array_clear_expr.rb.expected +10 -0
  95. data/vendor/spinel/test/array_combination_block.rb +11 -0
  96. data/vendor/spinel/test/array_compact_eq.rb +16 -0
  97. data/vendor/spinel/test/array_compact_eq.rb.expected +10 -0
  98. data/vendor/spinel/test/array_fill_poly.rb.expected +1 -0
  99. data/vendor/spinel/test/array_first_last_empty.rb +12 -0
  100. data/vendor/spinel/test/array_first_last_empty.rb.expected +8 -0
  101. data/vendor/spinel/test/array_flatten_typed_elements.rb +19 -0
  102. data/vendor/spinel/test/array_frozen_mutate_raises.rb +36 -0
  103. data/vendor/spinel/test/array_frozen_mutate_raises.rb.expected +20 -0
  104. data/vendor/spinel/test/array_frozen_slice_bang.rb +19 -0
  105. data/vendor/spinel/test/array_frozen_slice_bang.rb.expected +2 -0
  106. data/vendor/spinel/test/array_get_oob_negative.rb +22 -0
  107. data/vendor/spinel/test/array_get_oob_negative.rb.expected +6 -0
  108. data/vendor/spinel/test/array_grep.rb +12 -0
  109. data/vendor/spinel/test/array_grep.rb.expected +8 -0
  110. data/vendor/spinel/test/array_index_int_opt_narrow.rb +30 -0
  111. data/vendor/spinel/test/array_index_int_opt_narrow.rb.expected +7 -0
  112. data/vendor/spinel/test/array_map_bang.rb +28 -0
  113. data/vendor/spinel/test/array_map_bang.rb.expected +7 -0
  114. data/vendor/spinel/test/array_minmax_block.rb +14 -0
  115. data/vendor/spinel/test/array_negative_index_too_small.rb +22 -0
  116. data/vendor/spinel/test/array_negative_index_too_small.rb.expected +5 -0
  117. data/vendor/spinel/test/array_object_id.rb +12 -0
  118. data/vendor/spinel/test/array_object_id.rb.expected +6 -0
  119. data/vendor/spinel/test/array_pack_returns_string.expected +2 -0
  120. data/vendor/spinel/test/array_pack_returns_string.rb +4 -0
  121. data/vendor/spinel/test/array_pack_string_unpack.rb +12 -0
  122. data/vendor/spinel/test/array_pattern_match_basic.rb +27 -0
  123. data/vendor/spinel/test/array_predicate_no_block.rb +14 -0
  124. data/vendor/spinel/test/array_predicate_no_block.rb.expected +11 -0
  125. data/vendor/spinel/test/array_predicate_no_block_param.rb +14 -0
  126. data/vendor/spinel/test/array_predicate_no_block_param.rb.expected +10 -0
  127. data/vendor/spinel/test/array_product.rb +5 -0
  128. data/vendor/spinel/test/array_push_multi_arg.rb +32 -0
  129. data/vendor/spinel/test/array_push_multi_arg.rb.expected +10 -0
  130. data/vendor/spinel/test/array_select_bang.rb +34 -0
  131. data/vendor/spinel/test/array_select_bang.rb.expected +8 -0
  132. data/vendor/spinel/test/array_slice_before_after.rb +6 -0
  133. data/vendor/spinel/test/array_slice_when_chunk.rb +7 -0
  134. data/vendor/spinel/test/array_to_h_sort_bang_block.rb +26 -0
  135. data/vendor/spinel/test/array_to_h_sort_bang_block.rb.expected +10 -0
  136. data/vendor/spinel/test/array_transpose_poly_elements.rb +34 -0
  137. data/vendor/spinel/test/array_transpose_typed_elements.rb +19 -0
  138. data/vendor/spinel/test/array_unresolved_inspect_no_segv.rb +9 -0
  139. data/vendor/spinel/test/array_unresolved_inspect_no_segv.rb.expected +2 -0
  140. data/vendor/spinel/test/at_exit_lifo.rb +6 -0
  141. data/vendor/spinel/test/at_exit_lifo.rb.expected +4 -0
  142. data/vendor/spinel/test/back_ref.rb +15 -1
  143. data/vendor/spinel/test/back_ref.rb.expected +5 -0
  144. data/vendor/spinel/test/bang_op_ruby_truthy.expected +7 -0
  145. data/vendor/spinel/test/bang_op_ruby_truthy.rb +10 -0
  146. data/vendor/spinel/test/bare_arg_in_module_body.rb +29 -0
  147. data/vendor/spinel/test/bare_sibling_cls_method_call.rb +67 -0
  148. data/vendor/spinel/test/bare_sibling_cls_method_call.rb.expected +4 -0
  149. data/vendor/spinel/test/begin_rescue_as_expression.expected +5 -0
  150. data/vendor/spinel/test/begin_rescue_as_expression.rb +14 -0
  151. data/vendor/spinel/test/begin_rescue_else_clause.rb +63 -0
  152. data/vendor/spinel/test/begin_rescue_else_clause.rb.expected +7 -0
  153. data/vendor/spinel/test/bigint_propagation_chain.rb +33 -0
  154. data/vendor/spinel/test/bigint_propagation_chain.rb.expected +9 -0
  155. data/vendor/spinel/test/bigint_volatile_combo.rb +69 -0
  156. data/vendor/spinel/test/bigint_volatile_combo.rb.expected +18 -0
  157. data/vendor/spinel/test/block_given_block_param.rb +21 -3
  158. data/vendor/spinel/test/block_given_block_param.rb.expected +2 -0
  159. data/vendor/spinel/test/block_given_inline_call_site.expected +2 -0
  160. data/vendor/spinel/test/block_given_inline_call_site.rb +9 -0
  161. data/vendor/spinel/test/block_optional_unused.rb +18 -0
  162. data/vendor/spinel/test/block_optional_unused.rb.expected +4 -0
  163. data/vendor/spinel/test/block_param_call_block_given.rb +46 -0
  164. data/vendor/spinel/test/block_param_call_block_given.rb.expected +6 -0
  165. data/vendor/spinel/test/block_param_call_value_return.rb +32 -0
  166. data/vendor/spinel/test/block_param_call_value_return.rb.expected +5 -0
  167. data/vendor/spinel/test/bm_instance_eval.rb +9 -8
  168. data/vendor/spinel/test/bool_case_equality.rb +10 -0
  169. data/vendor/spinel/test/bool_logical_operators.rb +9 -0
  170. data/vendor/spinel/test/bool_logical_operators.rb.expected +8 -0
  171. data/vendor/spinel/test/builtin_array_method_capture.rb +38 -0
  172. data/vendor/spinel/test/builtin_array_method_capture.rb.expected +11 -0
  173. data/vendor/spinel/test/bundle_array_e.rb +250 -0
  174. data/vendor/spinel/test/bundle_array_e.rb.expected +57 -0
  175. data/vendor/spinel/test/bundle_array_f.rb +169 -0
  176. data/vendor/spinel/test/bundle_class_01.rb +43 -0
  177. data/vendor/spinel/test/bundle_class_01.rb.expected +4 -0
  178. data/vendor/spinel/test/bundle_class_03.rb +57 -0
  179. data/vendor/spinel/test/bundle_class_03.rb.expected +6 -0
  180. data/vendor/spinel/test/bundle_class_05.rb +187 -0
  181. data/vendor/spinel/test/bundle_class_05.rb.expected +14 -0
  182. data/vendor/spinel/test/bundle_class_06.rb +201 -0
  183. data/vendor/spinel/test/bundle_class_06.rb.expected +12 -0
  184. data/vendor/spinel/test/bundle_class_07.rb +72 -0
  185. data/vendor/spinel/test/bundle_class_07.rb.expected +6 -0
  186. data/vendor/spinel/test/bundle_class_08.rb +101 -0
  187. data/vendor/spinel/test/bundle_class_08.rb.expected +9 -0
  188. data/vendor/spinel/test/bundle_class_09.rb +171 -0
  189. data/vendor/spinel/test/bundle_class_09.rb.expected +9 -0
  190. data/vendor/spinel/test/bundle_class_10.rb +189 -0
  191. data/vendor/spinel/test/bundle_class_10.rb.expected +5 -0
  192. data/vendor/spinel/test/bundle_class_11.rb +191 -0
  193. data/vendor/spinel/test/bundle_class_11.rb.expected +8 -0
  194. data/vendor/spinel/test/bundle_class_12.rb +234 -0
  195. data/vendor/spinel/test/bundle_class_12.rb.expected +15 -0
  196. data/vendor/spinel/test/bundle_class_13.rb +61 -0
  197. data/vendor/spinel/test/bundle_class_13.rb.expected +2 -0
  198. data/vendor/spinel/test/bundle_class_14.rb +162 -0
  199. data/vendor/spinel/test/bundle_class_14.rb.expected +10 -0
  200. data/vendor/spinel/test/bundle_class_15.rb +184 -0
  201. data/vendor/spinel/test/bundle_class_15.rb.expected +8 -0
  202. data/vendor/spinel/test/bundle_class_18.rb +101 -0
  203. data/vendor/spinel/test/bundle_class_18.rb.expected +13 -0
  204. data/vendor/spinel/test/bundle_class_19.rb +67 -0
  205. data/vendor/spinel/test/bundle_class_19.rb.expected +8 -0
  206. data/vendor/spinel/test/bundle_class_20.rb +122 -0
  207. data/vendor/spinel/test/bundle_class_20.rb.expected +6 -0
  208. data/vendor/spinel/test/bundle_class_21.rb +208 -0
  209. data/vendor/spinel/test/bundle_class_21.rb.expected +27 -0
  210. data/vendor/spinel/test/bundle_class_22.rb +218 -0
  211. data/vendor/spinel/test/bundle_class_22.rb.expected +23 -0
  212. data/vendor/spinel/test/bundle_class_23.rb +187 -0
  213. data/vendor/spinel/test/bundle_class_23.rb.expected +19 -0
  214. data/vendor/spinel/test/bundle_class_a.rb +111 -0
  215. data/vendor/spinel/test/bundle_class_a.rb.expected +14 -0
  216. data/vendor/spinel/test/bundle_classd_04.rb +149 -0
  217. data/vendor/spinel/test/bundle_classd_04.rb.expected +15 -0
  218. data/vendor/spinel/test/bundle_classd_05.rb +65 -0
  219. data/vendor/spinel/test/bundle_classd_05.rb.expected +15 -0
  220. data/vendor/spinel/test/bundle_classd_08.rb +44 -0
  221. data/vendor/spinel/test/bundle_classd_08.rb.expected +4 -0
  222. data/vendor/spinel/test/bundle_classd_09.rb +221 -0
  223. data/vendor/spinel/test/bundle_classd_09.rb.expected +16 -0
  224. data/vendor/spinel/test/bundle_classd_10.rb +77 -0
  225. data/vendor/spinel/test/bundle_classd_10.rb.expected +10 -0
  226. data/vendor/spinel/test/bundle_classd_11.rb +89 -0
  227. data/vendor/spinel/test/bundle_classd_11.rb.expected +6 -0
  228. data/vendor/spinel/test/bundle_classd_12.rb +211 -0
  229. data/vendor/spinel/test/bundle_classd_12.rb.expected +19 -0
  230. data/vendor/spinel/test/bundle_classd_13.rb +246 -0
  231. data/vendor/spinel/test/bundle_classd_13.rb.expected +20 -0
  232. data/vendor/spinel/test/bundle_classd_14.rb +72 -0
  233. data/vendor/spinel/test/bundle_classd_14.rb.expected +10 -0
  234. data/vendor/spinel/test/bundle_classd_17.rb +206 -0
  235. data/vendor/spinel/test/bundle_classd_17.rb.expected +17 -0
  236. data/vendor/spinel/test/bundle_classd_18.rb +89 -0
  237. data/vendor/spinel/test/bundle_classd_18.rb.expected +3 -0
  238. data/vendor/spinel/test/bundle_classd_19.rb +134 -0
  239. data/vendor/spinel/test/bundle_classd_19.rb.expected +23 -0
  240. data/vendor/spinel/test/bundle_classd_26.rb +103 -0
  241. data/vendor/spinel/test/bundle_classd_26.rb.expected +7 -0
  242. data/vendor/spinel/test/bundle_classd_27.rb +241 -0
  243. data/vendor/spinel/test/bundle_classd_27.rb.expected +15 -0
  244. data/vendor/spinel/test/bundle_classd_28.rb +80 -0
  245. data/vendor/spinel/test/bundle_classd_28.rb.expected +10 -0
  246. data/vendor/spinel/test/bundle_classd_32.rb +63 -0
  247. data/vendor/spinel/test/bundle_classd_32.rb.expected +7 -0
  248. data/vendor/spinel/test/bundle_classd_33.rb +117 -0
  249. data/vendor/spinel/test/bundle_classd_33.rb.expected +17 -0
  250. data/vendor/spinel/test/bundle_classd_35.rb +90 -0
  251. data/vendor/spinel/test/bundle_classd_35.rb.expected +5 -0
  252. data/vendor/spinel/test/bundle_classd_36.rb +97 -0
  253. data/vendor/spinel/test/bundle_classd_36.rb.expected +5 -0
  254. data/vendor/spinel/test/bundle_classd_38.rb +50 -0
  255. data/vendor/spinel/test/bundle_classd_38.rb.expected +7 -0
  256. data/vendor/spinel/test/bundle_classd_39.rb +76 -0
  257. data/vendor/spinel/test/bundle_classd_39.rb.expected +15 -0
  258. data/vendor/spinel/test/bundle_classd_43.rb +84 -0
  259. data/vendor/spinel/test/bundle_classd_43.rb.expected +7 -0
  260. data/vendor/spinel/test/bundle_classd_45.rb +115 -0
  261. data/vendor/spinel/test/bundle_classd_45.rb.expected +7 -0
  262. data/vendor/spinel/test/bundle_classd_46.rb +72 -0
  263. data/vendor/spinel/test/bundle_classd_46.rb.expected +5 -0
  264. data/vendor/spinel/test/bundle_classd_48.rb +85 -0
  265. data/vendor/spinel/test/bundle_classd_49.rb +153 -0
  266. data/vendor/spinel/test/bundle_classd_50.rb +200 -0
  267. data/vendor/spinel/test/bundle_classd_50.rb.expected +10 -0
  268. data/vendor/spinel/test/bundle_classd_51.rb +191 -0
  269. data/vendor/spinel/test/bundle_classd_51.rb.expected +12 -0
  270. data/vendor/spinel/test/bundle_file_a.rb +119 -0
  271. data/vendor/spinel/test/bundle_file_a.rb.expected +23 -0
  272. data/vendor/spinel/test/bundle_hash_b1.rb +99 -0
  273. data/vendor/spinel/test/bundle_hash_b2.rb +107 -0
  274. data/vendor/spinel/test/bundle_int_a.rb +104 -0
  275. data/vendor/spinel/test/bundle_int_a.rb.expected +23 -0
  276. data/vendor/spinel/test/bundle_misc_c_08.rb +170 -0
  277. data/vendor/spinel/test/bundle_misc_c_08.rb.expected +33 -0
  278. data/vendor/spinel/test/bundle_misc_c_09.rb +72 -0
  279. data/vendor/spinel/test/bundle_misc_c_09.rb.expected +6 -0
  280. data/vendor/spinel/test/bundle_misc_c_10.rb +73 -0
  281. data/vendor/spinel/test/bundle_misc_c_10.rb.expected +8 -0
  282. data/vendor/spinel/test/bundle_misc_c_17.rb +124 -0
  283. data/vendor/spinel/test/bundle_misc_c_17.rb.expected +18 -0
  284. data/vendor/spinel/test/bundle_misc_c_23.rb +97 -0
  285. data/vendor/spinel/test/bundle_misc_c_23.rb.expected +10 -0
  286. data/vendor/spinel/test/bundle_misc_c_26.rb +107 -0
  287. data/vendor/spinel/test/bundle_misc_c_26.rb.expected +24 -0
  288. data/vendor/spinel/test/bundle_misc_c_30.rb +94 -0
  289. data/vendor/spinel/test/bundle_misc_c_31.rb +89 -0
  290. data/vendor/spinel/test/bundle_misc_c_31.rb.expected +14 -0
  291. data/vendor/spinel/test/bundle_misc_c_33.rb +163 -0
  292. data/vendor/spinel/test/bundle_misc_c_33.rb.expected +53 -0
  293. data/vendor/spinel/test/bundle_misc_c_34.rb +106 -0
  294. data/vendor/spinel/test/bundle_misc_c_34.rb.expected +11 -0
  295. data/vendor/spinel/test/bundle_misc_c_35.rb +143 -0
  296. data/vendor/spinel/test/bundle_misc_c_35.rb.expected +44 -0
  297. data/vendor/spinel/test/bundle_misc_c_36.rb +165 -0
  298. data/vendor/spinel/test/bundle_misc_c_36.rb.expected +59 -0
  299. data/vendor/spinel/test/bundle_misc_c_37.rb +119 -0
  300. data/vendor/spinel/test/bundle_misc_c_37.rb.expected +22 -0
  301. data/vendor/spinel/test/bundle_poly_b1.rb +44 -0
  302. data/vendor/spinel/test/bundle_poly_b1.rb.expected +7 -0
  303. data/vendor/spinel/test/bundle_string_c.rb +250 -0
  304. data/vendor/spinel/test/bundle_string_c.rb.expected +51 -0
  305. data/vendor/spinel/test/bundle_sym.rb +2 -4
  306. data/vendor/spinel/test/bundle_tiny_array.rb +160 -0
  307. data/vendor/spinel/test/bundle_tiny_array.rb.expected +53 -0
  308. data/vendor/spinel/test/bundle_tiny_misc.rb +187 -0
  309. data/vendor/spinel/test/bundle_tiny_misc.rb.expected +59 -0
  310. data/vendor/spinel/test/bundle_tiny_num.rb +87 -0
  311. data/vendor/spinel/test/bundle_tiny_num.rb.expected +27 -0
  312. data/vendor/spinel/test/bundle_tiny_string.rb +226 -0
  313. data/vendor/spinel/test/bundle_tiny_string.rb.expected +78 -0
  314. data/vendor/spinel/test/captured_block_call_value.rb +45 -0
  315. data/vendor/spinel/test/captured_block_call_value.rb.expected +5 -0
  316. data/vendor/spinel/test/case_fallthrough_returns_nil.expected +5 -0
  317. data/vendor/spinel/test/case_fallthrough_returns_nil.rb +8 -0
  318. data/vendor/spinel/test/case_in_no_match_error.rb +54 -0
  319. data/vendor/spinel/test/case_in_no_match_error.rb.expected +6 -0
  320. data/vendor/spinel/test/case_local_in_lambda.rb +57 -0
  321. data/vendor/spinel/test/case_local_in_lambda.rb.expected +5 -0
  322. data/vendor/spinel/test/case_when_class.rb +28 -66
  323. data/vendor/spinel/test/case_when_class.rb.expected +5 -5
  324. data/vendor/spinel/test/case_when_class_scalar_predicate.rb +53 -0
  325. data/vendor/spinel/test/case_when_class_scalar_predicate.rb.expected +3 -0
  326. data/vendor/spinel/test/case_when_poly_scrutinee_bound_to_local.rb +36 -0
  327. data/vendor/spinel/test/case_when_poly_scrutinee_bound_to_local.rb.expected +5 -0
  328. data/vendor/spinel/test/case_when_qualified_class.rb +47 -0
  329. data/vendor/spinel/test/case_when_qualified_class.rb.expected +2 -0
  330. data/vendor/spinel/test/case_when_regex.rb +23 -0
  331. data/vendor/spinel/test/case_when_regex.rb.expected +3 -0
  332. data/vendor/spinel/test/chained_aset_on_poly_hash_recv.rb +19 -0
  333. data/vendor/spinel/test/chained_aset_on_poly_hash_recv.rb.expected +1 -0
  334. data/vendor/spinel/test/clamp_string_and_range.rb +14 -0
  335. data/vendor/spinel/test/clamp_string_and_range.rb.expected +8 -0
  336. data/vendor/spinel/test/class_const_as_value.rb +58 -0
  337. data/vendor/spinel/test/class_const_as_value.rb.expected +4 -0
  338. data/vendor/spinel/test/class_hierarchy.rb +41 -0
  339. data/vendor/spinel/test/class_hierarchy.rb.expected +10 -0
  340. data/vendor/spinel/test/class_hierarchy_builtin.rb +43 -0
  341. data/vendor/spinel/test/class_hierarchy_builtin.rb.expected +14 -0
  342. data/vendor/spinel/test/class_hierarchy_module.rb +55 -0
  343. data/vendor/spinel/test/class_hierarchy_module.rb.expected +6 -0
  344. data/vendor/spinel/test/class_in_collection.rb +22 -0
  345. data/vendor/spinel/test/class_in_collection.rb.expected +10 -0
  346. data/vendor/spinel/test/class_ivar_in_class_method.rb +66 -0
  347. data/vendor/spinel/test/class_ivar_in_class_method.rb.expected +11 -0
  348. data/vendor/spinel/test/class_lt_builtin_parent.rb +13 -0
  349. data/vendor/spinel/test/class_name_in_cmeth.rb +30 -0
  350. data/vendor/spinel/test/class_name_in_cmeth.rb.expected +3 -0
  351. data/vendor/spinel/test/class_of_primitive.rb +14 -0
  352. data/vendor/spinel/test/class_of_primitive.rb.expected +9 -0
  353. data/vendor/spinel/test/class_phase2_name_eq.rb +61 -0
  354. data/vendor/spinel/test/class_phase2_name_eq.rb.expected +15 -0
  355. data/vendor/spinel/test/class_reopen_replaces_methods.rb +40 -0
  356. data/vendor/spinel/test/class_reopen_replaces_methods.rb.expected +3 -0
  357. data/vendor/spinel/test/class_singleton_def.rb +27 -0
  358. data/vendor/spinel/test/class_singleton_def.rb.expected +4 -0
  359. data/vendor/spinel/test/class_superclass.rb +15 -0
  360. data/vendor/spinel/test/class_superclass.rb.expected +3 -0
  361. data/vendor/spinel/test/class_value_builtin_and_nested.rb +36 -0
  362. data/vendor/spinel/test/cls_method_specialization_boxer.expected +2 -0
  363. data/vendor/spinel/test/cls_method_specialization_boxer.rb +47 -0
  364. data/vendor/spinel/test/cmeth_name_collision_with_kernel.rb +56 -0
  365. data/vendor/spinel/test/cmeth_name_collision_with_kernel.rb.expected +5 -0
  366. data/vendor/spinel/test/cmeth_return_nil_or_obj_via_intermediate.rb +89 -0
  367. data/vendor/spinel/test/cmeth_return_nil_or_obj_via_intermediate.rb.expected +6 -0
  368. data/vendor/spinel/test/comparable_between_user_type.rb +26 -0
  369. data/vendor/spinel/test/comparable_between_user_type.rb.expected +10 -0
  370. data/vendor/spinel/test/compile_time_attribute_singular.rb +12 -0
  371. data/vendor/spinel/test/compile_time_attribute_singular.rb.expected +2 -0
  372. data/vendor/spinel/test/compile_time_attribute_wrapped_record.rb +72 -0
  373. data/vendor/spinel/test/compile_time_attribute_wrapped_record.rb.expected +2 -0
  374. data/vendor/spinel/test/compile_time_attributes.rb +14 -0
  375. data/vendor/spinel/test/compile_time_attributes.rb.expected +3 -0
  376. data/vendor/spinel/test/compile_time_define_method_direct.rb +8 -0
  377. data/vendor/spinel/test/compile_time_define_method_direct.rb.expected +2 -0
  378. data/vendor/spinel/test/compile_time_define_method_int.rb +9 -0
  379. data/vendor/spinel/test/compile_time_define_method_int.rb.expected +2 -0
  380. data/vendor/spinel/test/compile_time_define_method_predicates.rb +18 -0
  381. data/vendor/spinel/test/compile_time_define_method_predicates.rb.expected +4 -0
  382. data/vendor/spinel/test/compile_time_define_method_strings.rb +9 -0
  383. data/vendor/spinel/test/compile_time_define_method_strings.rb.expected +2 -0
  384. data/vendor/spinel/test/complex_polar.rb +37 -0
  385. data/vendor/spinel/test/complex_polar.rb.expected +10 -0
  386. data/vendor/spinel/test/concat_chain_operand_gc_root.rb +16 -0
  387. data/vendor/spinel/test/concat_chain_operand_gc_root.rb.expected +4 -0
  388. data/vendor/spinel/test/concat_print_poly_unbox.rb +115 -0
  389. data/vendor/spinel/test/concat_print_poly_unbox.rb.expected +9 -0
  390. data/vendor/spinel/test/const_aliased_class_reopen_include.rb +33 -0
  391. data/vendor/spinel/test/const_aliased_class_reopen_include.rb.expected +2 -0
  392. data/vendor/spinel/test/const_compound_assign.rb +34 -0
  393. data/vendor/spinel/test/const_path_compound_assign.rb +15 -0
  394. data/vendor/spinel/test/const_path_deep_nesting.rb +30 -0
  395. data/vendor/spinel/test/const_path_deep_nesting.rb.expected +2 -0
  396. data/vendor/spinel/test/const_path_unresolved_require.rb +11 -0
  397. data/vendor/spinel/test/const_path_unresolved_require.rb.expected +2 -0
  398. data/vendor/spinel/test/const_self_ref_raises_name_error.rb +44 -0
  399. data/vendor/spinel/test/const_self_ref_raises_name_error.rb.expected +3 -0
  400. data/vendor/spinel/test/crashers_536.rb +32 -0
  401. data/vendor/spinel/test/crashers_536.rb.expected +4 -0
  402. data/vendor/spinel/test/cvar_method_first_assign.rb +6 -0
  403. data/vendor/spinel/test/data_define.rb +27 -0
  404. data/vendor/spinel/test/data_define.rb.expected +5 -0
  405. data/vendor/spinel/test/default_nil_param_with_str_return.rb +30 -0
  406. data/vendor/spinel/test/default_nil_param_with_str_return.rb.expected +4 -0
  407. data/vendor/spinel/test/defined_globals_methods.rb +15 -0
  408. data/vendor/spinel/test/defined_globals_methods.rb.expected +5 -0
  409. data/vendor/spinel/test/defined_op.rb +17 -0
  410. data/vendor/spinel/test/defined_op.rb.expected +8 -0
  411. data/vendor/spinel/test/destructure_typed_ptr_array_return.rb +30 -0
  412. data/vendor/spinel/test/destructure_typed_ptr_array_return.rb.expected +2 -0
  413. data/vendor/spinel/test/dir_exist.rb +2 -0
  414. data/vendor/spinel/test/dir_methods.rb +15 -0
  415. data/vendor/spinel/test/double_splat_kwargs.rb +26 -0
  416. data/vendor/spinel/test/double_splat_kwargs.rb.expected +6 -0
  417. data/vendor/spinel/test/dynamic_class_new.rb +44 -0
  418. data/vendor/spinel/test/dynamic_class_new.rb.expected +4 -0
  419. data/vendor/spinel/test/dynamic_is_a.rb +41 -0
  420. data/vendor/spinel/test/dynamic_is_a.rb.expected +5 -0
  421. data/vendor/spinel/test/each_cons_block_destructure.rb +10 -0
  422. data/vendor/spinel/test/each_cons_with_index_map_no_double_gets.rb +21 -0
  423. data/vendor/spinel/test/each_cons_with_index_map_no_double_gets.rb.expected +3 -0
  424. data/vendor/spinel/test/each_entry_reverse_each.rb +8 -0
  425. data/vendor/spinel/test/each_slice_map.rb +7 -0
  426. data/vendor/spinel/test/empty_array_local_arg_widen.rb +57 -0
  427. data/vendor/spinel/test/empty_array_local_arg_widen.rb.expected +2 -0
  428. data/vendor/spinel/test/empty_array_loop_intermediate_push.rb +103 -0
  429. data/vendor/spinel/test/empty_array_loop_intermediate_push.rb.expected +5 -0
  430. data/vendor/spinel/test/empty_array_push_container_elem.rb +35 -0
  431. data/vendor/spinel/test/empty_array_push_ptr.rb +26 -0
  432. data/vendor/spinel/test/empty_array_push_ptr.rb.expected +3 -0
  433. data/vendor/spinel/test/empty_hash_arg_param_widen.rb +44 -0
  434. data/vendor/spinel/test/empty_hash_arg_param_widen.rb.expected +6 -0
  435. data/vendor/spinel/test/empty_hash_int_int_no_widen.rb +46 -0
  436. data/vendor/spinel/test/empty_hash_int_int_no_widen.rb.expected +4 -0
  437. data/vendor/spinel/test/empty_hash_int_int_promote.rb +32 -0
  438. data/vendor/spinel/test/empty_hash_int_int_promote.rb.expected +8 -0
  439. data/vendor/spinel/test/empty_int_array_min_max.rb +15 -0
  440. data/vendor/spinel/test/empty_int_array_min_max.rb.expected +4 -0
  441. data/vendor/spinel/test/empty_method_returns_nil.rb +8 -0
  442. data/vendor/spinel/test/empty_method_returns_nil.rb.expected +3 -0
  443. data/vendor/spinel/test/empty_symbol_literal.rb +23 -0
  444. data/vendor/spinel/test/empty_symbol_literal.rb.expected +9 -0
  445. data/vendor/spinel/test/eq_string_vs_int.rb +20 -0
  446. data/vendor/spinel/test/eq_string_vs_int.rb.expected +9 -0
  447. data/vendor/spinel/test/exception_backtrace_empty.rb +12 -0
  448. data/vendor/spinel/test/exception_backtrace_empty.rb.expected +4 -0
  449. data/vendor/spinel/test/exception_class_new.rb +46 -0
  450. data/vendor/spinel/test/exception_class_new.rb.expected +10 -0
  451. data/vendor/spinel/test/exception_namespaced_default_message.rb +28 -0
  452. data/vendor/spinel/test/exception_namespaced_default_message.rb.expected +4 -0
  453. data/vendor/spinel/test/exception_object_methods.rb +3 -2
  454. data/vendor/spinel/test/exception_object_methods.rb.expected +1 -1
  455. data/vendor/spinel/test/exception_super_interpolated_message.rb +41 -0
  456. data/vendor/spinel/test/exception_super_interpolated_message.rb.expected +5 -0
  457. data/vendor/spinel/test/exception_user_subclass.rb +35 -0
  458. data/vendor/spinel/test/exception_user_subclass.rb.expected +10 -0
  459. data/vendor/spinel/test/extend_module.rb +30 -0
  460. data/vendor/spinel/test/extend_module.rb.expected +4 -0
  461. data/vendor/spinel/test/ffi_array_specs_decl.rb +25 -0
  462. data/vendor/spinel/test/ffi_int_arg_poly_value.rb +27 -0
  463. data/vendor/spinel/test/ffi_ptr_array.rb +35 -0
  464. data/vendor/spinel/test/ffi_ptr_int_literal.rb +31 -0
  465. data/vendor/spinel/test/ffi_str_arg_poly_value.rb +26 -0
  466. data/vendor/spinel/test/fiber_capture_no_leak_to_sibling.rb +27 -0
  467. data/vendor/spinel/test/fiber_capture_no_leak_to_sibling.rb.expected +1 -0
  468. data/vendor/spinel/test/fiber_gc_root_isolation.rb +76 -0
  469. data/vendor/spinel/test/file_dir_methods.rb +11 -0
  470. data/vendor/spinel/test/file_dir_methods.rb.expected +8 -0
  471. data/vendor/spinel/test/file_expand_path.rb +10 -0
  472. data/vendor/spinel/test/file_expand_path.rb.expected +8 -0
  473. data/vendor/spinel/test/file_mtime.rb +10 -0
  474. data/vendor/spinel/test/file_mtime.rb.expected +2 -0
  475. data/vendor/spinel/test/file_read_count.rb +19 -0
  476. data/vendor/spinel/test/file_read_count.rb.expected +5 -0
  477. data/vendor/spinel/test/file_readlines.rb +15 -0
  478. data/vendor/spinel/test/file_readlines.rb.expected +4 -0
  479. data/vendor/spinel/test/file_write_at_tail_position.rb +16 -0
  480. data/vendor/spinel/test/float_array_first_last_nil.rb +20 -0
  481. data/vendor/spinel/test/float_array_first_last_nil.rb.expected +8 -0
  482. data/vendor/spinel/test/float_divmod_zerodiv.rb +57 -0
  483. data/vendor/spinel/test/float_divmod_zerodiv.rb.expected +7 -0
  484. data/vendor/spinel/test/float_limit_constants.rb +14 -0
  485. data/vendor/spinel/test/float_round_ndigits_return_type.rb +24 -0
  486. data/vendor/spinel/test/float_round_ndigits_return_type.rb.expected +14 -0
  487. data/vendor/spinel/test/float_round_value_based_type.rb +17 -0
  488. data/vendor/spinel/test/float_round_value_based_type.rb.expected +14 -0
  489. data/vendor/spinel/test/float_round_zero.rb +18 -0
  490. data/vendor/spinel/test/float_round_zero.rb.expected +11 -0
  491. data/vendor/spinel/test/float_spaceship.rb +13 -0
  492. data/vendor/spinel/test/float_step_block.rb +16 -0
  493. data/vendor/spinel/test/float_step_block.rb.expected +3 -0
  494. data/vendor/spinel/test/float_step_to_a.rb +20 -0
  495. data/vendor/spinel/test/float_step_to_a.rb.expected +10 -0
  496. data/vendor/spinel/test/gc_grandparent_ivar_scan.rb +28 -0
  497. data/vendor/spinel/test/gc_grandparent_ivar_scan.rb.expected +2 -0
  498. data/vendor/spinel/test/gc_poly_local_int.rb +11 -0
  499. data/vendor/spinel/test/gc_poly_local_int.rb.expected +1 -0
  500. data/vendor/spinel/test/gc_poly_local_root.rb +19 -0
  501. data/vendor/spinel/test/gc_poly_local_root.rb.expected +1 -0
  502. data/vendor/spinel/test/gc_poly_local_setjmp.rb +16 -0
  503. data/vendor/spinel/test/gc_poly_local_setjmp.rb.expected +1 -0
  504. data/vendor/spinel/test/gc_root_call_args.rb +35 -0
  505. data/vendor/spinel/test/gc_root_call_args.rb.expected +3 -0
  506. data/vendor/spinel/test/gc_root_heap_param.rb +21 -0
  507. data/vendor/spinel/test/gc_root_heap_param.rb.expected +1 -0
  508. data/vendor/spinel/test/global_multi_assign.rb +28 -0
  509. data/vendor/spinel/test/global_var_punct.rb +9 -0
  510. data/vendor/spinel/test/gsub_sub_block.rb +14 -0
  511. data/vendor/spinel/test/gsub_sub_block.rb.expected +7 -0
  512. data/vendor/spinel/test/gsub_with_hash_replacement.rb +19 -0
  513. data/vendor/spinel/test/gsub_with_hash_replacement.rb.expected +3 -0
  514. data/vendor/spinel/test/hangs_548.rb +66 -0
  515. data/vendor/spinel/test/hangs_548.rb.expected +4 -0
  516. data/vendor/spinel/test/hash_block_methods_variants.rb +15 -0
  517. data/vendor/spinel/test/hash_block_methods_variants.rb.expected +12 -0
  518. data/vendor/spinel/test/hash_clear.rb +43 -0
  519. data/vendor/spinel/test/hash_clear.rb.expected +12 -0
  520. data/vendor/spinel/test/hash_compound_assign_more.rb +21 -0
  521. data/vendor/spinel/test/hash_delete_if_select_reject_bang.rb +19 -0
  522. data/vendor/spinel/test/hash_delete_if_select_reject_bang.rb.expected +4 -0
  523. data/vendor/spinel/test/hash_delete_returns_value.rb +21 -0
  524. data/vendor/spinel/test/hash_delete_returns_value.rb.expected +8 -0
  525. data/vendor/spinel/test/hash_dispatch_missing_cells.rb +24 -0
  526. data/vendor/spinel/test/hash_dispatch_missing_cells.rb.expected +8 -0
  527. data/vendor/spinel/test/hash_each_key_value.rb +85 -0
  528. data/vendor/spinel/test/hash_each_key_value.rb.expected +72 -0
  529. data/vendor/spinel/test/hash_each_with_object.rb +16 -0
  530. data/vendor/spinel/test/hash_each_with_object.rb.expected +2 -0
  531. data/vendor/spinel/test/hash_fetch_block.rb +31 -0
  532. data/vendor/spinel/test/hash_fetch_block.rb.expected +13 -0
  533. data/vendor/spinel/test/hash_fetch_block_key.rb +9 -0
  534. data/vendor/spinel/test/hash_fetch_block_key.rb.expected +4 -0
  535. data/vendor/spinel/test/hash_fetch_block_key_type.rb +37 -0
  536. data/vendor/spinel/test/hash_fetch_block_key_type.rb.expected +7 -0
  537. data/vendor/spinel/test/hash_fetch_keyerror.rb +23 -0
  538. data/vendor/spinel/test/hash_flatten_rassoc_compact.rb +33 -0
  539. data/vendor/spinel/test/hash_float_value_preserved.rb +27 -0
  540. data/vendor/spinel/test/hash_float_value_preserved.rb.expected +6 -0
  541. data/vendor/spinel/test/hash_index_assign_expression.rb +21 -0
  542. data/vendor/spinel/test/hash_inspect_poly.rb +13 -0
  543. data/vendor/spinel/test/hash_inspect_poly.rb.expected +6 -0
  544. data/vendor/spinel/test/hash_int_and_or_assign.rb +30 -0
  545. data/vendor/spinel/test/hash_int_and_or_assign.rb.expected +8 -0
  546. data/vendor/spinel/test/hash_invert.rb +16 -0
  547. data/vendor/spinel/test/hash_invert.rb.expected +4 -0
  548. data/vendor/spinel/test/hash_key_via_intermediate_local.rb +32 -0
  549. data/vendor/spinel/test/hash_map_block.rb +6 -0
  550. data/vendor/spinel/test/hash_merge_with_block.rb +10 -0
  551. data/vendor/spinel/test/hash_new_default_block_assign.rb +16 -0
  552. data/vendor/spinel/test/hash_param_each_kv_inference.rb +67 -0
  553. data/vendor/spinel/test/hash_param_each_kv_inference.rb.expected +3 -0
  554. data/vendor/spinel/test/hash_param_each_kv_weak_default.rb +75 -0
  555. data/vendor/spinel/test/hash_param_each_kv_weak_default.rb.expected +6 -0
  556. data/vendor/spinel/test/hash_param_widen_from_callee_slot.rb +43 -0
  557. data/vendor/spinel/test/hash_replace_variants.rb +17 -0
  558. data/vendor/spinel/test/hash_replace_variants.rb.expected +6 -0
  559. data/vendor/spinel/test/hash_temp_gc_root.rb +26 -0
  560. data/vendor/spinel/test/hash_transform_keys_cross.rb +12 -0
  561. data/vendor/spinel/test/hash_transform_keys_cross.rb.expected +5 -0
  562. data/vendor/spinel/test/hash_value_p.rb +19 -0
  563. data/vendor/spinel/test/hash_value_p.rb.expected +7 -0
  564. data/vendor/spinel/test/hash_value_split_widen.rb +22 -0
  565. data/vendor/spinel/test/hash_value_split_widen.rb.expected +2 -0
  566. data/vendor/spinel/test/hash_values_at_fetch_values.rb +23 -0
  567. data/vendor/spinel/test/hash_variant_call_boundary_sym.rb +27 -0
  568. data/vendor/spinel/test/hash_variant_call_boundary_sym.rb.expected +2 -0
  569. data/vendor/spinel/test/heterogeneous_tuple_return.rb +32 -0
  570. data/vendor/spinel/test/heterogeneous_tuple_return.rb.expected +7 -0
  571. data/vendor/spinel/test/i1006.rb +21 -0
  572. data/vendor/spinel/test/i1006.rb.expected +7 -0
  573. data/vendor/spinel/test/i1007.rb +25 -0
  574. data/vendor/spinel/test/i1007.rb.expected +4 -0
  575. data/vendor/spinel/test/i1009.rb +9 -0
  576. data/vendor/spinel/test/i1009.rb.expected +4 -0
  577. data/vendor/spinel/test/i1011.rb +12 -0
  578. data/vendor/spinel/test/i1011.rb.expected +2 -0
  579. data/vendor/spinel/test/i1015.rb +11 -0
  580. data/vendor/spinel/test/i1015.rb.expected +2 -0
  581. data/vendor/spinel/test/i1017.rb +37 -0
  582. data/vendor/spinel/test/i1017.rb.expected +1 -0
  583. data/vendor/spinel/test/i1020.rb +31 -0
  584. data/vendor/spinel/test/i1020.rb.expected +2 -0
  585. data/vendor/spinel/test/i1021.rb +12 -0
  586. data/vendor/spinel/test/i1021.rb.expected +9 -0
  587. data/vendor/spinel/test/i1027.rb +28 -0
  588. data/vendor/spinel/test/i1027.rb.expected +1 -0
  589. data/vendor/spinel/test/i1031.rb +64 -0
  590. data/vendor/spinel/test/i1031.rb.expected +4 -0
  591. data/vendor/spinel/test/i1035.rb +18 -0
  592. data/vendor/spinel/test/i1035.rb.expected +3 -0
  593. data/vendor/spinel/test/i1038.rb +7 -0
  594. data/vendor/spinel/test/i1038.rb.expected +4 -0
  595. data/vendor/spinel/test/i1041.rb +31 -0
  596. data/vendor/spinel/test/i1041.rb.expected +4 -0
  597. data/vendor/spinel/test/i709.rb +41 -0
  598. data/vendor/spinel/test/i709.rb.expected +3 -0
  599. data/vendor/spinel/test/i898.rb +23 -0
  600. data/vendor/spinel/test/i898.rb.expected +7 -0
  601. data/vendor/spinel/test/i912.rb +15 -0
  602. data/vendor/spinel/test/i912.rb.expected +8 -0
  603. data/vendor/spinel/test/i916.rb +14 -0
  604. data/vendor/spinel/test/i916.rb.expected +4 -0
  605. data/vendor/spinel/test/i918.rb +45 -0
  606. data/vendor/spinel/test/i918.rb.expected +13 -0
  607. data/vendor/spinel/test/i919.rb +12 -0
  608. data/vendor/spinel/test/i919.rb.expected +5 -0
  609. data/vendor/spinel/test/i920.rb +9 -0
  610. data/vendor/spinel/test/i920.rb.expected +4 -0
  611. data/vendor/spinel/test/i960.rb +13 -0
  612. data/vendor/spinel/test/i960.rb.expected +5 -0
  613. data/vendor/spinel/test/i972.rb +38 -0
  614. data/vendor/spinel/test/i972.rb.expected +11 -0
  615. data/vendor/spinel/test/i974.rb +23 -0
  616. data/vendor/spinel/test/i974.rb.expected +19 -0
  617. data/vendor/spinel/test/i994.rb +18 -0
  618. data/vendor/spinel/test/i994.rb.expected +9 -0
  619. data/vendor/spinel/test/i997.rb +20 -0
  620. data/vendor/spinel/test/i997.rb.expected +6 -0
  621. data/vendor/spinel/test/if_expr_multi_stmt_body.rb +78 -0
  622. data/vendor/spinel/test/if_expr_multi_stmt_body.rb.expected +13 -0
  623. data/vendor/spinel/test/implicit_alloc_site_cache_helper_specialization.rb +112 -0
  624. data/vendor/spinel/test/implicit_alloc_site_cache_helper_specialization.rb.expected +6 -0
  625. data/vendor/spinel/test/implicit_alloc_site_escape_layout.rb +30 -0
  626. data/vendor/spinel/test/implicit_alloc_site_escape_layout.rb.expected +2 -0
  627. data/vendor/spinel/test/implicit_alloc_site_escape_param.rb +27 -0
  628. data/vendor/spinel/test/implicit_alloc_site_escape_param.rb.expected +2 -0
  629. data/vendor/spinel/test/implicit_alloc_site_escape_scoped_locals.rb +44 -0
  630. data/vendor/spinel/test/implicit_alloc_site_escape_scoped_locals.rb.expected +2 -0
  631. data/vendor/spinel/test/implicit_alloc_site_holder_poly_array.rb +23 -0
  632. data/vendor/spinel/test/implicit_alloc_site_holder_poly_array.rb.expected +3 -0
  633. data/vendor/spinel/test/implicit_alloc_site_holder_shared_method.rb +23 -0
  634. data/vendor/spinel/test/implicit_alloc_site_holder_shared_method.rb.expected +3 -0
  635. data/vendor/spinel/test/implicit_alloc_site_holder_specialization.rb +19 -0
  636. data/vendor/spinel/test/implicit_alloc_site_holder_specialization.rb.expected +3 -0
  637. data/vendor/spinel/test/implicit_alloc_site_ivar_helper_return_specialization.rb +46 -0
  638. data/vendor/spinel/test/implicit_alloc_site_ivar_helper_return_specialization.rb.expected +3 -0
  639. data/vendor/spinel/test/implicit_alloc_site_store_specialization.rb +28 -0
  640. data/vendor/spinel/test/implicit_alloc_site_store_specialization.rb.expected +4 -0
  641. data/vendor/spinel/test/implicit_new_local_method_scope.rb +65 -0
  642. data/vendor/spinel/test/implicit_new_local_method_scope.rb.expected +2 -0
  643. data/vendor/spinel/test/include_chain_const_lookup.rb +48 -0
  644. data/vendor/spinel/test/include_chain_const_lookup.rb.expected +3 -0
  645. data/vendor/spinel/test/include_chain_module_nested_const.rb +62 -0
  646. data/vendor/spinel/test/include_chain_module_nested_const.rb.expected +2 -0
  647. data/vendor/spinel/test/include_constant_path.rb +98 -0
  648. data/vendor/spinel/test/include_constant_path.rb.expected +5 -0
  649. data/vendor/spinel/test/include_nested_module.rb +99 -0
  650. data/vendor/spinel/test/include_nested_module.rb.expected +3 -0
  651. data/vendor/spinel/test/include_skips_module_class_methods.rb +27 -0
  652. data/vendor/spinel/test/include_skips_module_class_methods.rb.expected +3 -0
  653. data/vendor/spinel/test/inherited_factory_poly_param_narrow_attr.rb +25 -0
  654. data/vendor/spinel/test/inherited_kwarg_nil_default_string_ivar.rb +61 -0
  655. data/vendor/spinel/test/inherited_kwarg_nil_default_string_ivar.rb.expected +2 -0
  656. data/vendor/spinel/test/inherited_method_kwarg_block_self.rb +67 -0
  657. data/vendor/spinel/test/inherited_method_kwarg_block_self.rb.expected +2 -0
  658. data/vendor/spinel/test/initialize_override_param_inference.rb +68 -0
  659. data/vendor/spinel/test/inject_symbol_op.rb +11 -0
  660. data/vendor/spinel/test/inject_symbol_op.rb.expected +7 -0
  661. data/vendor/spinel/test/inject_symbol_to_proc.rb +41 -0
  662. data/vendor/spinel/test/inject_symbol_to_proc.rb.expected +12 -0
  663. data/vendor/spinel/test/inlined_yield_block_param_type.rb +32 -0
  664. data/vendor/spinel/test/inlined_yield_block_param_type.rb.expected +2 -0
  665. data/vendor/spinel/test/inlined_yield_self_locals.rb +49 -0
  666. data/vendor/spinel/test/inlined_yield_self_locals.rb.expected +5 -0
  667. data/vendor/spinel/test/instance_eval_block_params.rb +93 -0
  668. data/vendor/spinel/test/instance_eval_block_params.rb.expected +10 -0
  669. data/vendor/spinel/test/instance_eval_trampoline.rb +17 -0
  670. data/vendor/spinel/test/instance_eval_trampoline.rb.expected +1 -0
  671. data/vendor/spinel/test/instance_exec_capture.rb +48 -0
  672. data/vendor/spinel/test/instance_exec_capture.rb.expected +7 -0
  673. data/vendor/spinel/test/instance_exec_direct.rb +72 -0
  674. data/vendor/spinel/test/instance_exec_direct.rb.expected +5 -0
  675. data/vendor/spinel/test/instance_exec_override.rb +69 -0
  676. data/vendor/spinel/test/instance_exec_override.rb.expected +4 -0
  677. data/vendor/spinel/test/instance_exec_parity.rb +44 -0
  678. data/vendor/spinel/test/instance_exec_parity.rb.expected +6 -0
  679. data/vendor/spinel/test/instance_exec_return.rb +54 -0
  680. data/vendor/spinel/test/instance_exec_return.rb.expected +7 -0
  681. data/vendor/spinel/test/instance_exec_trampoline.rb +101 -0
  682. data/vendor/spinel/test/instance_exec_trampoline.rb.expected +6 -0
  683. data/vendor/spinel/test/instance_exec_valuetype.rb +48 -0
  684. data/vendor/spinel/test/instance_exec_valuetype.rb.expected +7 -0
  685. data/vendor/spinel/test/instance_methods_false.rb +41 -0
  686. data/vendor/spinel/test/instance_methods_false.rb.expected +14 -0
  687. data/vendor/spinel/test/int_array_bracket_assign_expr.rb +30 -0
  688. data/vendor/spinel/test/int_array_bracket_assign_expr.rb.expected +8 -0
  689. data/vendor/spinel/test/int_array_tally.rb +14 -0
  690. data/vendor/spinel/test/int_array_tally.rb.expected +8 -0
  691. data/vendor/spinel/test/int_array_uniq_bang.rb +15 -0
  692. data/vendor/spinel/test/int_array_uniq_bang.rb.expected +3 -0
  693. data/vendor/spinel/test/int_ceil_floor_round.rb +11 -0
  694. data/vendor/spinel/test/int_ceil_floor_round.rb.expected +8 -0
  695. data/vendor/spinel/test/int_ceil_floor_round_truncate_ndigits.rb +17 -0
  696. data/vendor/spinel/test/int_ceil_floor_round_truncate_ndigits.rb.expected +12 -0
  697. data/vendor/spinel/test/int_hash_missing_nil_check.rb +27 -0
  698. data/vendor/spinel/test/int_hash_missing_nil_check.rb.expected +14 -0
  699. data/vendor/spinel/test/int_int_hash_literal.rb +13 -0
  700. data/vendor/spinel/test/int_int_hash_literal.rb.expected +7 -0
  701. data/vendor/spinel/test/int_int_hash_missing_key_nil.rb +10 -0
  702. data/vendor/spinel/test/int_int_hash_missing_key_nil.rb.expected +8 -0
  703. data/vendor/spinel/test/int_opt_p_inspect.rb +8 -0
  704. data/vendor/spinel/test/int_opt_p_inspect.rb.expected +5 -0
  705. data/vendor/spinel/test/int_overflow_promote.rb +41 -0
  706. data/vendor/spinel/test/int_overflow_raises.rb +34 -0
  707. data/vendor/spinel/test/int_overflow_raises.rb.expected +6 -0
  708. data/vendor/spinel/test/int_round_large_precision.rb +11 -0
  709. data/vendor/spinel/test/int_round_large_precision.rb.expected +8 -0
  710. data/vendor/spinel/test/integer_argument_error.rb +116 -0
  711. data/vendor/spinel/test/integer_argument_error.rb.expected +36 -0
  712. data/vendor/spinel/test/integer_extra_methods.rb +12 -0
  713. data/vendor/spinel/test/integer_extra_methods.rb.expected +8 -0
  714. data/vendor/spinel/test/integer_pow_negative_exponent.rb +17 -0
  715. data/vendor/spinel/test/integer_pow_negative_exponent.rb.expected +6 -0
  716. data/vendor/spinel/test/integer_times_as_expr.rb +9 -0
  717. data/vendor/spinel/test/integer_times_as_expr.rb.expected +3 -0
  718. data/vendor/spinel/test/interp_array_container.rb +41 -0
  719. data/vendor/spinel/test/interp_array_container.rb.expected +8 -0
  720. data/vendor/spinel/test/interpolation_multistmt.rb +15 -0
  721. data/vendor/spinel/test/interpolation_multistmt.rb.expected +3 -0
  722. data/vendor/spinel/test/interpolation_symbol_name.rb +23 -0
  723. data/vendor/spinel/test/interpolation_symbol_name.rb.expected +6 -0
  724. data/vendor/spinel/test/introspection_constant_path.rb +60 -0
  725. data/vendor/spinel/test/introspection_constant_path.rb.expected +13 -0
  726. data/vendor/spinel/test/io_pipe.rb +6 -0
  727. data/vendor/spinel/test/io_pipe.rb.expected +3 -0
  728. data/vendor/spinel/test/is_a_descendant_runtime.rb +59 -0
  729. data/vendor/spinel/test/is_a_descendant_runtime.rb.expected +11 -0
  730. data/vendor/spinel/test/is_a_included_module.rb +28 -0
  731. data/vendor/spinel/test/is_a_included_module.rb.expected +9 -0
  732. data/vendor/spinel/test/ivar_assign_and_expr.rb +22 -0
  733. data/vendor/spinel/test/ivar_assign_and_expr.rb.expected +3 -0
  734. data/vendor/spinel/test/ivar_lazy_init_push_via_inherited_getter.rb +67 -0
  735. data/vendor/spinel/test/ivar_lazy_init_push_via_inherited_getter.rb.expected +6 -0
  736. data/vendor/spinel/test/json_generate_basic.rb +16 -0
  737. data/vendor/spinel/test/json_generate_basic.rb.expected +12 -0
  738. data/vendor/spinel/test/json_generate_struct_record.rb +9 -0
  739. data/vendor/spinel/test/json_generate_struct_record.rb.expected +4 -0
  740. data/vendor/spinel/test/kernel_complex.rb +9 -0
  741. data/vendor/spinel/test/kernel_dir.rb +9 -0
  742. data/vendor/spinel/test/kernel_dir.rb.expected +2 -0
  743. data/vendor/spinel/test/kernel_float_strict.rb +16 -0
  744. data/vendor/spinel/test/kernel_float_strict.rb.expected +6 -0
  745. data/vendor/spinel/test/kernel_integer_with_base.rb +16 -0
  746. data/vendor/spinel/test/kernel_integer_with_base.rb.expected +6 -0
  747. data/vendor/spinel/test/kwarg_back_propagate_callee_type.rb +26 -0
  748. data/vendor/spinel/test/kwarg_back_propagate_callee_type.rb.expected +1 -0
  749. data/vendor/spinel/test/kwargs_double_splat.rb +15 -0
  750. data/vendor/spinel/test/kwargs_double_splat.rb.expected +2 -0
  751. data/vendor/spinel/test/kwargs_merge_default_hash.rb +51 -0
  752. data/vendor/spinel/test/lambda_arrow_string_return.rb +8 -0
  753. data/vendor/spinel/test/lambda_arrow_string_return.rb.expected +2 -0
  754. data/vendor/spinel/test/lambda_inference_chain.rb +35 -0
  755. data/vendor/spinel/test/lambda_inference_chain.rb.expected +5 -0
  756. data/vendor/spinel/test/local_empty_array_push_promotion_propagates.rb +61 -0
  757. data/vendor/spinel/test/local_empty_array_push_promotion_propagates.rb.expected +3 -0
  758. data/vendor/spinel/test/logical_pointer_guard.rb +20 -0
  759. data/vendor/spinel/test/logical_pointer_guard.rb.expected +2 -0
  760. data/vendor/spinel/test/logical_value_return.rb +15 -0
  761. data/vendor/spinel/test/lv_widen_from_callee_arg_slot.rb +56 -0
  762. data/vendor/spinel/test/lv_widen_from_callee_arg_slot.rb.expected +1 -0
  763. data/vendor/spinel/test/map_block_string_new_join.rb +33 -0
  764. data/vendor/spinel/test/map_block_string_new_join.rb.expected +3 -0
  765. data/vendor/spinel/test/map_obj_array_poly_field.rb +28 -0
  766. data/vendor/spinel/test/map_recv_emitted_once.rb +44 -0
  767. data/vendor/spinel/test/map_recv_emitted_once.rb.expected +7 -0
  768. data/vendor/spinel/test/map_to_heap_objects.rb +16 -0
  769. data/vendor/spinel/test/map_to_heap_objects.rb.expected +4 -0
  770. data/vendor/spinel/test/map_to_value_type_objects.rb +26 -0
  771. data/vendor/spinel/test/map_to_value_type_objects.rb.expected +7 -0
  772. data/vendor/spinel/test/masgn_classvar_target.rb +13 -0
  773. data/vendor/spinel/test/masgn_constpath_target.rb +11 -0
  774. data/vendor/spinel/test/method_level_rescue_return.rb +42 -0
  775. data/vendor/spinel/test/method_level_rescue_return.rb.expected +6 -0
  776. data/vendor/spinel/test/method_level_rescue_return_string.rb +39 -0
  777. data/vendor/spinel/test/method_level_rescue_return_string.rb.expected +6 -0
  778. data/vendor/spinel/test/method_return_mixed_int_string.rb +65 -0
  779. data/vendor/spinel/test/method_return_mixed_int_string.rb.expected +10 -0
  780. data/vendor/spinel/test/middle_splat_param.rb +14 -0
  781. data/vendor/spinel/test/middle_splat_param.rb.expected +4 -0
  782. data/vendor/spinel/test/missing_positional_arg_warns.rb +23 -0
  783. data/vendor/spinel/test/missing_positional_arg_warns.rb.expected +2 -0
  784. data/vendor/spinel/test/module_accessor_delete_chain.rb +32 -0
  785. data/vendor/spinel/test/module_accessor_delete_chain.rb.expected +1 -0
  786. data/vendor/spinel/test/module_accessor_nil_check.rb +40 -0
  787. data/vendor/spinel/test/module_accessor_nil_check.rb.expected +2 -0
  788. data/vendor/spinel/test/module_body_string_const_interp.rb +40 -0
  789. data/vendor/spinel/test/module_body_string_const_interp.rb.expected +5 -0
  790. data/vendor/spinel/test/module_class_body_side_effects.rb +32 -0
  791. data/vendor/spinel/test/module_class_body_side_effects.rb.expected +7 -0
  792. data/vendor/spinel/test/module_class_reflection.rb +27 -0
  793. data/vendor/spinel/test/module_class_reflection.rb.expected +14 -0
  794. data/vendor/spinel/test/module_const_defined.rb +13 -0
  795. data/vendor/spinel/test/module_const_defined.rb.expected +4 -0
  796. data/vendor/spinel/test/module_cvars.rb +32 -0
  797. data/vendor/spinel/test/module_cvars.rb.expected +4 -0
  798. data/vendor/spinel/test/module_def_self_ivar.rb +14 -0
  799. data/vendor/spinel/test/module_def_self_ivar.rb.expected +2 -0
  800. data/vendor/spinel/test/module_function_dead_method_dce.rb +29 -0
  801. data/vendor/spinel/test/module_function_dead_method_dce.rb.expected +2 -0
  802. data/vendor/spinel/test/module_function_namespace.rb.expected +3 -0
  803. data/vendor/spinel/test/module_function_str_method_param.rb +14 -0
  804. data/vendor/spinel/test/module_function_str_method_param.rb.expected +1 -0
  805. data/vendor/spinel/test/module_ivar_empty_hash_reset.rb +64 -0
  806. data/vendor/spinel/test/module_ivar_empty_hash_reset.rb.expected +7 -0
  807. data/vendor/spinel/test/module_ivar_nil_poly.rb +17 -0
  808. data/vendor/spinel/test/module_ivar_op_write.rb +53 -0
  809. data/vendor/spinel/test/module_ivar_op_write.rb.expected +3 -0
  810. data/vendor/spinel/test/module_reopen_after_include_ivar.rb +33 -0
  811. data/vendor/spinel/test/module_reopen_after_include_ivar.rb.expected +2 -0
  812. data/vendor/spinel/test/module_reopen_after_include_namespaced.rb +33 -0
  813. data/vendor/spinel/test/module_reopen_after_include_namespaced.rb.expected +1 -0
  814. data/vendor/spinel/test/module_reopen_cmeth_redefine.rb +26 -0
  815. data/vendor/spinel/test/module_reopen_cmeth_redefine.rb.expected +2 -0
  816. data/vendor/spinel/test/module_singleton_attr_accessor.rb +41 -0
  817. data/vendor/spinel/test/module_singleton_attr_accessor.rb.expected +4 -0
  818. data/vendor/spinel/test/module_singleton_new_user_method.rb +23 -0
  819. data/vendor/spinel/test/module_singleton_new_user_method.rb.expected +2 -0
  820. data/vendor/spinel/test/module_singleton_self_accessor.rb +31 -0
  821. data/vendor/spinel/test/module_singleton_self_accessor.rb.expected +4 -0
  822. data/vendor/spinel/test/more_truthies_nil_compare.rb +31 -0
  823. data/vendor/spinel/test/more_truthies_nil_compare.rb.expected +9 -0
  824. data/vendor/spinel/test/multi_arg_lambda.rb +31 -0
  825. data/vendor/spinel/test/multi_arg_lambda.rb.expected +6 -0
  826. data/vendor/spinel/test/multi_assign_ivar_type.rb +21 -0
  827. data/vendor/spinel/test/multi_assign_ivar_type.rb.expected +3 -0
  828. data/vendor/spinel/test/multi_write_call_rhs_as_expr.rb +31 -0
  829. data/vendor/spinel/test/multi_write_call_rhs_as_expr.rb.expected +10 -0
  830. data/vendor/spinel/test/multi_write_scalar_rhs.rb +12 -0
  831. data/vendor/spinel/test/multi_write_scalar_rhs.rb.expected +5 -0
  832. data/vendor/spinel/test/mutable_str_alias_uaf.rb +62 -0
  833. data/vendor/spinel/test/mutable_str_alias_uaf.rb.expected +4 -0
  834. data/vendor/spinel/test/mutable_str_force_encoding_return.rb +21 -0
  835. data/vendor/spinel/test/mutable_str_force_encoding_return.rb.expected +1 -0
  836. data/vendor/spinel/test/mutable_str_into_str_array.rb +46 -0
  837. data/vendor/spinel/test/mutable_str_into_str_array.rb.expected +7 -0
  838. data/vendor/spinel/test/mutex_synchronize_block.rb +29 -0
  839. data/vendor/spinel/test/mutex_synchronize_block.rb.expected +6 -0
  840. data/vendor/spinel/test/narrow_and_predicate.rb +23 -0
  841. data/vendor/spinel/test/narrow_and_predicate.rb.expected +1 -0
  842. data/vendor/spinel/test/negative_range_slice.rb +32 -0
  843. data/vendor/spinel/test/negative_range_slice.rb.expected +12 -0
  844. data/vendor/spinel/test/nested_array_eq.rb +22 -0
  845. data/vendor/spinel/test/nested_array_eq.rb.expected +12 -0
  846. data/vendor/spinel/test/nested_yield_with_block_param.rb +33 -0
  847. data/vendor/spinel/test/nil_default_param_widens_to_poly.rb +26 -0
  848. data/vendor/spinel/test/nil_default_param_widens_to_poly.rb.expected +4 -0
  849. data/vendor/spinel/test/nil_guard_narrows_int_or_nil.rb +40 -0
  850. data/vendor/spinel/test/nil_guard_narrows_int_or_nil.rb.expected +5 -0
  851. data/vendor/spinel/test/not_match_op.rb +8 -0
  852. data/vendor/spinel/test/not_match_op.rb.expected +4 -0
  853. data/vendor/spinel/test/nullable_hash_recv_bracket.expected +3 -0
  854. data/vendor/spinel/test/nullable_hash_recv_bracket.rb +33 -0
  855. data/vendor/spinel/test/nullable_obj_nil_compare.rb +92 -0
  856. data/vendor/spinel/test/nullable_obj_nil_compare.rb.expected +8 -0
  857. data/vendor/spinel/test/nullable_poly_hash_arg_unbox.rb +85 -0
  858. data/vendor/spinel/test/nullable_poly_hash_arg_unbox.rb.expected +4 -0
  859. data/vendor/spinel/test/numeric_coerce.rb +24 -0
  860. data/vendor/spinel/test/numeric_coerce.rb.expected +9 -0
  861. data/vendor/spinel/test/obj_class_dispatch.rb +69 -0
  862. data/vendor/spinel/test/obj_class_dispatch.rb.expected +4 -0
  863. data/vendor/spinel/test/object_id_basic.rb +19 -0
  864. data/vendor/spinel/test/object_id_basic.rb.expected +8 -0
  865. data/vendor/spinel/test/object_method_gaps_callee_clone_itself.rb +23 -0
  866. data/vendor/spinel/test/object_method_gaps_callee_clone_itself.rb.expected +7 -0
  867. data/vendor/spinel/test/op_assign_user_operator.rb.expected +2 -0
  868. data/vendor/spinel/test/op_method_bitwise.rb +30 -0
  869. data/vendor/spinel/test/op_method_bitwise.rb.expected +8 -0
  870. data/vendor/spinel/test/op_method_shift.rb +30 -0
  871. data/vendor/spinel/test/op_method_shift.rb.expected +3 -0
  872. data/vendor/spinel/test/open_class_array_builtin.rb +11 -0
  873. data/vendor/spinel/test/open_class_array_builtin.rb.expected +1 -0
  874. data/vendor/spinel/test/open_class_bool_builtin.rb +28 -0
  875. data/vendor/spinel/test/open_class_bool_builtin.rb.expected +6 -0
  876. data/vendor/spinel/test/open_class_default_arg.rb +47 -0
  877. data/vendor/spinel/test/open_class_default_arg.rb.expected +9 -0
  878. data/vendor/spinel/test/open_class_object.rb +26 -0
  879. data/vendor/spinel/test/open_class_object.rb.expected +5 -0
  880. data/vendor/spinel/test/pack_utf8.rb +12 -0
  881. data/vendor/spinel/test/pack_utf8.rb.expected +10 -0
  882. data/vendor/spinel/test/param_body_array_hash_inference.rb +58 -0
  883. data/vendor/spinel/test/param_body_array_hash_inference.rb.expected +3 -0
  884. data/vendor/spinel/test/param_body_hash_inference.rb +72 -0
  885. data/vendor/spinel/test/param_body_hash_inference.rb.expected +6 -0
  886. data/vendor/spinel/test/param_include_body_widen.rb +32 -0
  887. data/vendor/spinel/test/param_include_body_widen.rb.expected +5 -0
  888. data/vendor/spinel/test/param_lengthlike_body_widen.rb +53 -0
  889. data/vendor/spinel/test/param_lengthlike_body_widen.rb.expected +6 -0
  890. data/vendor/spinel/test/param_ptr_from_callee_slot.rb +42 -0
  891. data/vendor/spinel/test/param_ptr_from_callee_slot.rb.expected +6 -0
  892. data/vendor/spinel/test/parser_long_ast_record.rb +132 -0
  893. data/vendor/spinel/test/parser_long_ast_record.rb.expected +3 -0
  894. data/vendor/spinel/test/pattern_match_as_and_guard.rb +33 -0
  895. data/vendor/spinel/test/pattern_match_as_and_guard.rb.expected +4 -0
  896. data/vendor/spinel/test/pattern_match_splat_rest.rb +15 -0
  897. data/vendor/spinel/test/pattern_match_splat_rest.rb.expected +4 -0
  898. data/vendor/spinel/test/pattern_pin.rb +105 -0
  899. data/vendor/spinel/test/pattern_pin.rb.expected +11 -0
  900. data/vendor/spinel/test/poly_arg_int_keyed_hash.rb +42 -0
  901. data/vendor/spinel/test/poly_arg_int_keyed_hash.rb.expected +5 -0
  902. data/vendor/spinel/test/poly_arg_to_typed_method_param.rb +28 -0
  903. data/vendor/spinel/test/poly_arg_to_typed_method_param.rb.expected +4 -0
  904. data/vendor/spinel/test/poly_array_assoc.rb +9 -0
  905. data/vendor/spinel/test/poly_array_compact.rb +15 -0
  906. data/vendor/spinel/test/poly_array_compact.rb.expected +3 -0
  907. data/vendor/spinel/test/poly_array_compact_bang.rb +17 -0
  908. data/vendor/spinel/test/poly_array_compact_bang.rb.expected +3 -0
  909. data/vendor/spinel/test/poly_array_dup.rb +52 -0
  910. data/vendor/spinel/test/poly_array_dup.rb.expected +5 -0
  911. data/vendor/spinel/test/poly_array_flatten.rb +17 -0
  912. data/vendor/spinel/test/poly_array_flatten.rb.expected +4 -0
  913. data/vendor/spinel/test/poly_attr_reader_box_dispatch.expected +1 -0
  914. data/vendor/spinel/test/poly_attr_reader_box_dispatch.rb +35 -0
  915. data/vendor/spinel/test/poly_attr_writer.rb +95 -0
  916. data/vendor/spinel/test/poly_attr_writer.rb.expected +5 -0
  917. data/vendor/spinel/test/poly_class_dispatch.rb +11 -0
  918. data/vendor/spinel/test/poly_class_dispatch.rb.expected +7 -0
  919. data/vendor/spinel/test/poly_dispatch_inherited_attr_reader.rb +20 -0
  920. data/vendor/spinel/test/poly_dispatch_inherited_attr_reader.rb.expected +2 -0
  921. data/vendor/spinel/test/poly_dispatch_inherited_method.rb +19 -0
  922. data/vendor/spinel/test/poly_dispatch_inherited_method.rb.expected +2 -0
  923. data/vendor/spinel/test/poly_dispatch_multilevel_inheritance.rb +28 -0
  924. data/vendor/spinel/test/poly_dispatch_multilevel_inheritance.rb.expected +4 -0
  925. data/vendor/spinel/test/poly_dispatch_narrow_return_type.rb +53 -0
  926. data/vendor/spinel/test/poly_dispatch_narrow_return_type.rb.expected +3 -0
  927. data/vendor/spinel/test/poly_each_receiver_gc_root.rb +40 -0
  928. data/vendor/spinel/test/poly_each_receiver_gc_root.rb.expected +1 -0
  929. data/vendor/spinel/test/poly_gsub_str_arm.rb +24 -0
  930. data/vendor/spinel/test/poly_gsub_str_arm.rb.expected +1 -0
  931. data/vendor/spinel/test/poly_gsub_str_str_hash.rb +37 -0
  932. data/vendor/spinel/test/poly_gsub_str_str_hash.rb.expected +1 -0
  933. data/vendor/spinel/test/poly_idx_int_nullable.rb +14 -0
  934. data/vendor/spinel/test/poly_idx_int_nullable.rb.expected +1 -0
  935. data/vendor/spinel/test/poly_length_string_tag.rb +20 -0
  936. data/vendor/spinel/test/poly_length_string_tag.rb.expected +3 -0
  937. data/vendor/spinel/test/poly_local_is_a_string_narrow_in_non_tail_if.rb +39 -0
  938. data/vendor/spinel/test/poly_local_is_a_string_narrow_in_non_tail_if.rb.expected +1 -0
  939. data/vendor/spinel/test/poly_local_is_a_string_narrow_in_tail_if.rb +23 -0
  940. data/vendor/spinel/test/poly_local_is_a_string_narrow_in_tail_if.rb.expected +1 -0
  941. data/vendor/spinel/test/poly_local_is_a_string_narrow_in_y1_inline.rb +27 -0
  942. data/vendor/spinel/test/poly_local_is_a_string_narrow_in_y1_inline.rb.expected +1 -0
  943. data/vendor/spinel/test/poly_poly_hash_each_value.rb +34 -0
  944. data/vendor/spinel/test/poly_poly_hash_each_value.rb.expected +11 -0
  945. data/vendor/spinel/test/poly_poly_hash_fetch_dup.rb +26 -0
  946. data/vendor/spinel/test/poly_poly_hash_fetch_dup.rb.expected +2 -0
  947. data/vendor/spinel/test/poly_recv_aset_poly_key.rb +30 -0
  948. data/vendor/spinel/test/poly_recv_aset_poly_key.rb.expected +1 -0
  949. data/vendor/spinel/test/poly_recv_dispatch_narrow_module.rb +37 -0
  950. data/vendor/spinel/test/poly_recv_dispatch_narrow_module.rb.expected +3 -0
  951. data/vendor/spinel/test/poly_recv_fetch_arm_incompat.rb +37 -0
  952. data/vendor/spinel/test/poly_recv_fetch_arm_incompat.rb.expected +1 -0
  953. data/vendor/spinel/test/poly_recv_fetch_hash_arms.rb +31 -0
  954. data/vendor/spinel/test/poly_recv_fetch_hash_arms.rb.expected +2 -0
  955. data/vendor/spinel/test/poly_recv_hash_dup.rb +48 -0
  956. data/vendor/spinel/test/poly_recv_hash_each_dispatch.rb +40 -0
  957. data/vendor/spinel/test/poly_recv_hash_each_dispatch.rb.expected +5 -0
  958. data/vendor/spinel/test/poly_recv_map_join.rb +31 -0
  959. data/vendor/spinel/test/poly_recv_map_join.rb.expected +5 -0
  960. data/vendor/spinel/test/poly_recv_range_sym_hash_dispatch.rb +55 -0
  961. data/vendor/spinel/test/poly_recv_range_sym_hash_dispatch.rb.expected +9 -0
  962. data/vendor/spinel/test/poly_recv_two_arg_slice.rb +27 -0
  963. data/vendor/spinel/test/poly_value_into_str_str_hash.rb +44 -0
  964. data/vendor/spinel/test/poly_value_into_str_str_hash.rb.expected +2 -0
  965. data/vendor/spinel/test/prepend_super_basic.rb +18 -0
  966. data/vendor/spinel/test/prepend_super_basic.rb.expected +1 -0
  967. data/vendor/spinel/test/prepend_super_chain.rb +23 -0
  968. data/vendor/spinel/test/prepend_super_chain.rb.expected +1 -0
  969. data/vendor/spinel/test/prepend_super_forward.rb +17 -0
  970. data/vendor/spinel/test/prepend_super_forward.rb.expected +1 -0
  971. data/vendor/spinel/test/prepend_super_multi.rb +25 -0
  972. data/vendor/spinel/test/prepend_super_multi.rb.expected +1 -0
  973. data/vendor/spinel/test/prepend_super_subclass.rb +21 -0
  974. data/vendor/spinel/test/prepend_super_subclass.rb.expected +1 -0
  975. data/vendor/spinel/test/primitive_eq_user_class.rb +84 -0
  976. data/vendor/spinel/test/primitive_eq_user_class.rb.expected +49 -0
  977. data/vendor/spinel/test/proc_anon_dot_call.rb +50 -0
  978. data/vendor/spinel/test/proc_anon_dot_call.rb.expected +5 -0
  979. data/vendor/spinel/test/proc_arg_object.rb +17 -0
  980. data/vendor/spinel/test/proc_arg_object.rb.expected +1 -0
  981. data/vendor/spinel/test/proc_call_value_return.rb +20 -0
  982. data/vendor/spinel/test/proc_call_value_return.rb.expected +5 -0
  983. data/vendor/spinel/test/proc_introspection.rb +11 -0
  984. data/vendor/spinel/test/proc_introspection.rb.expected +6 -0
  985. data/vendor/spinel/test/process_pid.rb +5 -0
  986. data/vendor/spinel/test/process_pid.rb.expected +2 -0
  987. data/vendor/spinel/test/ptr_array_to_poly_array_at_call.rb +39 -0
  988. data/vendor/spinel/test/ptr_array_to_poly_array_at_call.rb.expected +2 -0
  989. data/vendor/spinel/test/public_send.rb +12 -0
  990. data/vendor/spinel/test/public_send.rb.expected +4 -0
  991. data/vendor/spinel/test/puts_class_value.rb +10 -0
  992. data/vendor/spinel/test/puts_class_value.rb.expected +2 -0
  993. data/vendor/spinel/test/puts_nil.rb +7 -0
  994. data/vendor/spinel/test/raise_reraise_in_def.rb +44 -0
  995. data/vendor/spinel/test/raise_unless_isa_narrow.rb +72 -0
  996. data/vendor/spinel/test/raise_unless_isa_narrow.rb.expected +3 -0
  997. data/vendor/spinel/test/range_and_array_range_args.rb +43 -0
  998. data/vendor/spinel/test/range_and_array_range_args.rb.expected +18 -0
  999. data/vendor/spinel/test/range_begin_end_polyarr_include_delete_bang.rb +21 -0
  1000. data/vendor/spinel/test/range_bsearch.rb +11 -0
  1001. data/vendor/spinel/test/range_bsearch.rb.expected +8 -0
  1002. data/vendor/spinel/test/range_case_eq_type_mismatch.rb +10 -0
  1003. data/vendor/spinel/test/range_case_eq_type_mismatch.rb.expected +7 -0
  1004. data/vendor/spinel/test/range_each_fusion.rb +109 -0
  1005. data/vendor/spinel/test/range_each_fusion.rb.expected +16 -0
  1006. data/vendor/spinel/test/range_each_no_block.rb +5 -0
  1007. data/vendor/spinel/test/range_equality.rb +9 -0
  1008. data/vendor/spinel/test/range_exclude_end_size.rb +24 -0
  1009. data/vendor/spinel/test/range_exclude_end_size.rb.expected +18 -0
  1010. data/vendor/spinel/test/range_exclusive_nonliteral.rb +34 -0
  1011. data/vendor/spinel/test/range_overlap_array_flatten_depth.rb +14 -0
  1012. data/vendor/spinel/test/range_overlap_array_flatten_depth.rb.expected +8 -0
  1013. data/vendor/spinel/test/range_step.rb +15 -0
  1014. data/vendor/spinel/test/range_step.rb.expected +5 -0
  1015. data/vendor/spinel/test/range_string_cover.rb +10 -0
  1016. data/vendor/spinel/test/rational_complex_literals.rb +27 -0
  1017. data/vendor/spinel/test/rational_complex_literals.rb.expected +12 -0
  1018. data/vendor/spinel/test/rbs/README.md +45 -0
  1019. data/vendor/spinel/test/rbs/arrays.rbs +10 -0
  1020. data/vendor/spinel/test/rbs/arrays.seed.expected +7 -0
  1021. data/vendor/spinel/test/rbs/dropped_members.rbs +13 -0
  1022. data/vendor/spinel/test/rbs/dropped_members.seed.expected +2 -0
  1023. data/vendor/spinel/test/rbs/dropped_sigs.rbs +14 -0
  1024. data/vendor/spinel/test/rbs/dropped_sigs.seed.expected +2 -0
  1025. data/vendor/spinel/test/rbs/dropped_types.rbs +14 -0
  1026. data/vendor/spinel/test/rbs/dropped_types.seed.expected +2 -0
  1027. data/vendor/spinel/test/rbs/hashes.rbs +11 -0
  1028. data/vendor/spinel/test/rbs/hashes.seed.expected +7 -0
  1029. data/vendor/spinel/test/rbs/ivars.rbs +8 -0
  1030. data/vendor/spinel/test/rbs/ivars.seed.expected +5 -0
  1031. data/vendor/spinel/test/rbs/members.rbs +7 -0
  1032. data/vendor/spinel/test/rbs/members.seed.expected +5 -0
  1033. data/vendor/spinel/test/rbs/nominal.rbs +7 -0
  1034. data/vendor/spinel/test/rbs/nominal.seed.expected +3 -0
  1035. data/vendor/spinel/test/rbs/nullable.rbs +8 -0
  1036. data/vendor/spinel/test/rbs/nullable.seed.expected +5 -0
  1037. data/vendor/spinel/test/rbs/overloads.rbs +13 -0
  1038. data/vendor/spinel/test/rbs/overloads.seed.expected +3 -0
  1039. data/vendor/spinel/test/rbs/scalars.rbs +12 -0
  1040. data/vendor/spinel/test/rbs/scalars.seed.expected +9 -0
  1041. data/vendor/spinel/test/rbs/union_poly.rbs +9 -0
  1042. data/vendor/spinel/test/rbs/union_poly.seed.expected +4 -0
  1043. data/vendor/spinel/test/rbs/unqualified.rbs +13 -0
  1044. data/vendor/spinel/test/rbs/unqualified.seed.expected +4 -0
  1045. data/vendor/spinel/test/recursive_block_forward_value.rb +19 -0
  1046. data/vendor/spinel/test/recursive_block_forward_value.rb.expected +3 -0
  1047. data/vendor/spinel/test/recursive_implicit_yield_value.rb +35 -0
  1048. data/vendor/spinel/test/recursive_implicit_yield_value.rb.expected +7 -0
  1049. data/vendor/spinel/test/regex.rb +7 -0
  1050. data/vendor/spinel/test/regex.rb.expected +2 -0
  1051. data/vendor/spinel/test/regex_backref_oob_nil.rb +13 -0
  1052. data/vendor/spinel/test/regex_backref_oob_nil.rb.expected +5 -0
  1053. data/vendor/spinel/test/regex_const_freeze.rb +17 -0
  1054. data/vendor/spinel/test/regex_const_freeze.rb.expected +3 -0
  1055. data/vendor/spinel/test/regex_hex_shorthand.rb +13 -0
  1056. data/vendor/spinel/test/regex_hex_shorthand.rb.expected +12 -0
  1057. data/vendor/spinel/test/regex_match_nonstring.rb +18 -0
  1058. data/vendor/spinel/test/regex_match_nonstring.rb.expected +3 -0
  1059. data/vendor/spinel/test/regex_namespaced_const.rb +17 -0
  1060. data/vendor/spinel/test/regex_namespaced_const.rb.expected +4 -0
  1061. data/vendor/spinel/test/regex_negated_shorthand_toplevel.rb +9 -0
  1062. data/vendor/spinel/test/regex_negated_shorthand_toplevel.rb.expected +13 -0
  1063. data/vendor/spinel/test/regex_sub_backref.rb +11 -0
  1064. data/vendor/spinel/test/regex_unanchored_class_seq.rb +13 -0
  1065. data/vendor/spinel/test/regex_unanchored_class_seq.rb.expected +6 -0
  1066. data/vendor/spinel/test/regexp_capture_ivar_hash.rb +48 -0
  1067. data/vendor/spinel/test/regexp_capture_ivar_hash.rb.expected +7 -0
  1068. data/vendor/spinel/test/regexp_error_catchable.rb +14 -0
  1069. data/vendor/spinel/test/regexp_error_catchable.rb.expected +3 -0
  1070. data/vendor/spinel/test/regexp_gsub_zero_width.rb +27 -0
  1071. data/vendor/spinel/test/regexp_gsub_zero_width.rb.expected +12 -0
  1072. data/vendor/spinel/test/regexp_last_match_capture.rb +21 -0
  1073. data/vendor/spinel/test/regexp_last_match_capture.rb.expected +7 -0
  1074. data/vendor/spinel/test/regexp_line_anchors.rb +34 -0
  1075. data/vendor/spinel/test/regexp_line_anchors.rb.expected +15 -0
  1076. data/vendor/spinel/test/regexp_local_if_else_union.rb +36 -0
  1077. data/vendor/spinel/test/regexp_local_if_else_union.rb.expected +5 -0
  1078. data/vendor/spinel/test/regexp_match_data.rb +17 -0
  1079. data/vendor/spinel/test/regexp_match_data.rb.expected +8 -0
  1080. data/vendor/spinel/test/regexp_match_p_position.rb +7 -0
  1081. data/vendor/spinel/test/regexp_match_p_position.rb.expected +4 -0
  1082. data/vendor/spinel/test/regexp_new_literal.rb +72 -0
  1083. data/vendor/spinel/test/regexp_new_literal.rb.expected +24 -0
  1084. data/vendor/spinel/test/regexp_source_options.rb +10 -0
  1085. data/vendor/spinel/test/regexp_source_options.rb.expected +5 -0
  1086. data/vendor/spinel/test/regexp_sub_gsub_length.rb +17 -0
  1087. data/vendor/spinel/test/regexp_sub_gsub_length.rb.expected +10 -0
  1088. data/vendor/spinel/test/regexp_sub_gsub_realloc.rb +25 -0
  1089. data/vendor/spinel/test/regexp_sub_gsub_realloc.rb.expected +6 -0
  1090. data/vendor/spinel/test/regexp_threeq.rb +15 -0
  1091. data/vendor/spinel/test/regexp_threeq.rb.expected +4 -0
  1092. data/vendor/spinel/test/require_first_line.rb +7 -0
  1093. data/vendor/spinel/test/require_first_line.rb.expected +1 -0
  1094. data/vendor/spinel/test/require_modifier.rb +12 -0
  1095. data/vendor/spinel/test/require_same_line.rb +5 -0
  1096. data/vendor/spinel/test/require_same_line.rb.expected +2 -0
  1097. data/vendor/spinel/test/require_unsupported_lib.rb +8 -0
  1098. data/vendor/spinel/test/require_unsupported_lib.rb.expected +2 -0
  1099. data/vendor/spinel/test/rescue_bind_in_fiber_body.rb +24 -0
  1100. data/vendor/spinel/test/rescue_bind_in_fiber_body.rb.expected +6 -0
  1101. data/vendor/spinel/test/rescue_bind_in_lambda_proc_body.rb +16 -0
  1102. data/vendor/spinel/test/rescue_bind_in_lambda_proc_body.rb.expected +4 -0
  1103. data/vendor/spinel/test/rescue_walks_class_hierarchy.rb +37 -0
  1104. data/vendor/spinel/test/rescue_walks_class_hierarchy.rb.expected +7 -0
  1105. data/vendor/spinel/test/rescue_widens_nil_local_to_exception.expected +1 -0
  1106. data/vendor/spinel/test/rescue_widens_nil_local_to_exception.rb +11 -0
  1107. data/vendor/spinel/test/respond_to_def_self_method.rb +14 -0
  1108. data/vendor/spinel/test/respond_to_module_singleton_accessor.rb +10 -0
  1109. data/vendor/spinel/test/respond_to_module_singleton_accessor.rb.expected +3 -0
  1110. data/vendor/spinel/test/respond_to_primitive.rb +9 -0
  1111. data/vendor/spinel/test/respond_to_primitive.rb.expected +5 -0
  1112. data/vendor/spinel/test/return_unify_int_vs_pointer.rb +37 -0
  1113. data/vendor/spinel/test/return_unify_int_vs_pointer.rb.expected +4 -0
  1114. data/vendor/spinel/test/return_unify_isa_early_return.rb +29 -0
  1115. data/vendor/spinel/test/return_unify_isa_early_return.rb.expected +2 -0
  1116. data/vendor/spinel/test/rightward_assign_destructure.rb +27 -0
  1117. data/vendor/spinel/test/rightward_assign_destructure.rb.expected +8 -0
  1118. data/vendor/spinel/test/safe_navigation_returns_nil.expected +6 -0
  1119. data/vendor/spinel/test/safe_navigation_returns_nil.rb +28 -0
  1120. data/vendor/spinel/test/same_named_attr_no_widen.rb +24 -0
  1121. data/vendor/spinel/test/same_named_attr_no_widen.rb.expected +1 -0
  1122. data/vendor/spinel/test/scan_locals_def_boundary.rb +58 -0
  1123. data/vendor/spinel/test/scan_locals_def_boundary.rb.expected +2 -0
  1124. data/vendor/spinel/test/scan_walkers_def_boundary.rb +52 -0
  1125. data/vendor/spinel/test/scan_walkers_def_boundary.rb.expected +4 -0
  1126. data/vendor/spinel/test/self_class_divergent_returns.rb +61 -0
  1127. data/vendor/spinel/test/self_class_divergent_returns.rb.expected +3 -0
  1128. data/vendor/spinel/test/self_class_new_construction.rb +16 -0
  1129. data/vendor/spinel/test/self_class_new_construction.rb.expected +2 -0
  1130. data/vendor/spinel/test/self_operator_subclass_dispatch.rb +40 -0
  1131. data/vendor/spinel/test/self_operator_subclass_dispatch.rb.expected +2 -0
  1132. data/vendor/spinel/test/signal_trap_stub.rb +30 -0
  1133. data/vendor/spinel/test/signal_trap_stub.rb.expected +3 -0
  1134. data/vendor/spinel/test/sort_min_max_block_comparator.rb +18 -0
  1135. data/vendor/spinel/test/sort_min_max_block_comparator.rb.expected +7 -0
  1136. data/vendor/spinel/test/source_encoding.rb +19 -0
  1137. data/vendor/spinel/test/source_encoding.rb.expected +9 -0
  1138. data/vendor/spinel/test/sp_crypto_basic.rb +45 -0
  1139. data/vendor/spinel/test/sp_crypto_basic.rb.expected +6 -0
  1140. data/vendor/spinel/test/sp_crypto_sha1.rb +18 -0
  1141. data/vendor/spinel/test/sp_crypto_sha1.rb.expected +3 -0
  1142. data/vendor/spinel/test/sp_net_basic.rb +17 -0
  1143. data/vendor/spinel/test/sp_net_basic.rb.expected +2 -0
  1144. data/vendor/spinel/test/splat_heterogeneous_call.rb +14 -0
  1145. data/vendor/spinel/test/splat_params_instance.rb +21 -0
  1146. data/vendor/spinel/test/splat_params_instance.rb.expected +8 -0
  1147. data/vendor/spinel/test/sprintf_long_interp.rb +23 -0
  1148. data/vendor/spinel/test/sprintf_long_interp.rb.expected +3 -0
  1149. data/vendor/spinel/test/stdlib_class_in_ivar.rb +85 -0
  1150. data/vendor/spinel/test/stdlib_class_in_ivar.rb.expected +7 -0
  1151. data/vendor/spinel/test/str_array_max_min_by.rb +6 -0
  1152. data/vendor/spinel/test/str_array_sort_by.rb +11 -0
  1153. data/vendor/spinel/test/str_array_sort_by.rb.expected +5 -0
  1154. data/vendor/spinel/test/str_chomp_paragraph_mode.rb +16 -0
  1155. data/vendor/spinel/test/str_chomp_paragraph_mode.rb.expected +9 -0
  1156. data/vendor/spinel/test/str_count_multi_arg.rb +11 -0
  1157. data/vendor/spinel/test/str_count_multi_arg.rb.expected +4 -0
  1158. data/vendor/spinel/test/str_delete_count_negation.rb +16 -0
  1159. data/vendor/spinel/test/str_delete_count_negation.rb.expected +6 -0
  1160. data/vendor/spinel/test/str_force_encoding_return.rb +26 -0
  1161. data/vendor/spinel/test/str_force_encoding_return.rb.expected +3 -0
  1162. data/vendor/spinel/test/str_int_hash_missing_key_nil.rb +16 -0
  1163. data/vendor/spinel/test/str_int_hash_missing_key_nil.rb.expected +10 -0
  1164. data/vendor/spinel/test/str_match_position.rb +15 -0
  1165. data/vendor/spinel/test/str_match_position.rb.expected +8 -0
  1166. data/vendor/spinel/test/str_method_nil_arg_no_segv.rb +47 -0
  1167. data/vendor/spinel/test/str_method_nil_arg_no_segv.rb.expected +7 -0
  1168. data/vendor/spinel/test/str_oct_prefix.rb +11 -0
  1169. data/vendor/spinel/test/str_oct_prefix.rb.expected +5 -0
  1170. data/vendor/spinel/test/str_ord_empty.rb +11 -0
  1171. data/vendor/spinel/test/str_ord_empty.rb.expected +3 -0
  1172. data/vendor/spinel/test/str_poly_hash_dup_widen.rb +21 -0
  1173. data/vendor/spinel/test/str_poly_hash_dup_widen.rb.expected +4 -0
  1174. data/vendor/spinel/test/str_poly_hash_dup_widen_from_int.rb +17 -0
  1175. data/vendor/spinel/test/str_poly_hash_dup_widen_from_int.rb.expected +3 -0
  1176. data/vendor/spinel/test/str_rindex_position.rb +23 -0
  1177. data/vendor/spinel/test/str_rindex_position.rb.expected +17 -0
  1178. data/vendor/spinel/test/str_split_space_whitespace.rb +10 -0
  1179. data/vendor/spinel/test/str_split_space_whitespace.rb.expected +4 -0
  1180. data/vendor/spinel/test/str_split_trailing_empty.rb +12 -0
  1181. data/vendor/spinel/test/str_split_trailing_empty.rb.expected +7 -0
  1182. data/vendor/spinel/test/str_squeeze_arg.rb +18 -0
  1183. data/vendor/spinel/test/str_squeeze_arg.rb.expected +7 -0
  1184. data/vendor/spinel/test/str_str_hash_nullable_bracket_assign.rb +39 -0
  1185. data/vendor/spinel/test/str_str_hash_nullable_bracket_assign.rb.expected +5 -0
  1186. data/vendor/spinel/test/str_to_i_overflow.rb +32 -0
  1187. data/vendor/spinel/test/str_to_i_overflow.rb.expected +6 -0
  1188. data/vendor/spinel/test/str_tr_negation.rb +10 -0
  1189. data/vendor/spinel/test/str_tr_negation.rb.expected +4 -0
  1190. data/vendor/spinel/test/string_byteslice.rb +9 -0
  1191. data/vendor/spinel/test/string_byteslice.rb.expected +6 -0
  1192. data/vendor/spinel/test/string_casecmp.rb +9 -0
  1193. data/vendor/spinel/test/string_casecmp.rb.expected +7 -0
  1194. data/vendor/spinel/test/string_charset_range_notation.rb +9 -0
  1195. data/vendor/spinel/test/string_charset_range_notation.rb.expected +5 -0
  1196. data/vendor/spinel/test/string_chomp_bang_mutates.rb +20 -0
  1197. data/vendor/spinel/test/string_chomp_bang_mutates.rb.expected +4 -0
  1198. data/vendor/spinel/test/string_crypt.rb +22 -0
  1199. data/vendor/spinel/test/string_crypt.rb.expected +7 -0
  1200. data/vendor/spinel/test/string_delete_prefix_suffix_bang.rb +29 -0
  1201. data/vendor/spinel/test/string_delete_prefix_suffix_bang.rb.expected +5 -0
  1202. data/vendor/spinel/test/string_each_char_returns_self.rb +15 -0
  1203. data/vendor/spinel/test/string_each_line_expr.rb +25 -0
  1204. data/vendor/spinel/test/string_each_line_expr.rb.expected +19 -0
  1205. data/vendor/spinel/test/string_each_line_keeps_newline.rb +15 -0
  1206. data/vendor/spinel/test/string_encoding.rb +8 -0
  1207. data/vendor/spinel/test/string_encoding.rb.expected +5 -0
  1208. data/vendor/spinel/test/string_enum_block_returns_self.rb +27 -0
  1209. data/vendor/spinel/test/string_enum_block_returns_self.rb.expected +11 -0
  1210. data/vendor/spinel/test/string_format_polyarr.rb +6 -0
  1211. data/vendor/spinel/test/string_frozen_mutation_raises.rb +27 -0
  1212. data/vendor/spinel/test/string_frozen_mutation_raises.rb.expected +4 -0
  1213. data/vendor/spinel/test/string_gsub_block.rb +8 -0
  1214. data/vendor/spinel/test/string_index_nil_typeerror.rb +9 -0
  1215. data/vendor/spinel/test/string_index_nil_typeerror.rb.expected +1 -0
  1216. data/vendor/spinel/test/string_index_regex.rb +9 -0
  1217. data/vendor/spinel/test/string_index_regex.rb.expected +6 -0
  1218. data/vendor/spinel/test/string_lshift_int_codepoint.rb +9 -0
  1219. data/vendor/spinel/test/string_lshift_int_codepoint.rb.expected +2 -0
  1220. data/vendor/spinel/test/string_multiply_overflow.rb +14 -0
  1221. data/vendor/spinel/test/string_multiply_overflow.rb.expected +4 -0
  1222. data/vendor/spinel/test/string_nil_arg_typeerror.rb +38 -0
  1223. data/vendor/spinel/test/string_nil_arg_typeerror.rb.expected +5 -0
  1224. data/vendor/spinel/test/string_param_inference_from_body.rb +40 -0
  1225. data/vendor/spinel/test/string_param_inference_from_body.rb.expected +3 -0
  1226. data/vendor/spinel/test/string_partition_regex_and_puts.rb +8 -0
  1227. data/vendor/spinel/test/string_partition_regex_and_puts.rb.expected +6 -0
  1228. data/vendor/spinel/test/string_range_to_a.rb +10 -0
  1229. data/vendor/spinel/test/string_range_to_a.rb.expected +4 -0
  1230. data/vendor/spinel/test/string_replace_prepend_insert_clear.rb +34 -0
  1231. data/vendor/spinel/test/string_rpartition_regex.rb +10 -0
  1232. data/vendor/spinel/test/string_scanner_basic.rb +35 -0
  1233. data/vendor/spinel/test/string_scanner_check_unscan.rb +24 -0
  1234. data/vendor/spinel/test/string_scanner_getch_utf8.rb +26 -0
  1235. data/vendor/spinel/test/string_scanner_nullable.rb +75 -0
  1236. data/vendor/spinel/test/string_scanner_nullable.rb.expected +37 -0
  1237. data/vendor/spinel/test/string_scanner_scan_to_local.rb +11 -0
  1238. data/vendor/spinel/test/string_scanner_unscan_error.rb +54 -0
  1239. data/vendor/spinel/test/string_scrub.rb +7 -0
  1240. data/vendor/spinel/test/string_slice_range.rb +18 -0
  1241. data/vendor/spinel/test/string_split_capture.rb +8 -0
  1242. data/vendor/spinel/test/string_split_inline_arg_gc_root.rb +77 -0
  1243. data/vendor/spinel/test/string_split_inline_arg_gc_root.rb.expected +1 -0
  1244. data/vendor/spinel/test/string_squeeze_no_trailing_nul.rb +12 -0
  1245. data/vendor/spinel/test/string_sub_hash_replacement.rb +8 -0
  1246. data/vendor/spinel/test/string_to_i_base.rb +9 -0
  1247. data/vendor/spinel/test/string_to_i_base.rb.expected +6 -0
  1248. data/vendor/spinel/test/string_to_i_base_zero.rb +9 -0
  1249. data/vendor/spinel/test/string_to_i_overflow_raises.rb +30 -0
  1250. data/vendor/spinel/test/string_to_i_overflow_raises.rb.expected +6 -0
  1251. data/vendor/spinel/test/string_undump.rb +9 -0
  1252. data/vendor/spinel/test/string_upto.rb +20 -0
  1253. data/vendor/spinel/test/string_with_embedded_nul.rb +46 -0
  1254. data/vendor/spinel/test/string_with_embedded_nul.rb.expected +16 -0
  1255. data/vendor/spinel/test/stringio_new_mode.rb +21 -0
  1256. data/vendor/spinel/test/stringio_new_mode.rb.expected +5 -0
  1257. data/vendor/spinel/test/stringio_new_nil.rb +14 -0
  1258. data/vendor/spinel/test/stringio_new_nil.rb.expected +2 -0
  1259. data/vendor/spinel/test/stringio_open.rb +30 -0
  1260. data/vendor/spinel/test/stringio_open.rb.expected +10 -0
  1261. data/vendor/spinel/test/stringio_putc_fsync.rb +24 -0
  1262. data/vendor/spinel/test/stringio_putc_fsync.rb.expected +3 -0
  1263. data/vendor/spinel/test/strip_nul.rb +13 -0
  1264. data/vendor/spinel/test/strip_nul.rb.expected +8 -0
  1265. data/vendor/spinel/test/struct_dig.rb +16 -0
  1266. data/vendor/spinel/test/struct_int_member_unboxed.rb +14 -0
  1267. data/vendor/spinel/test/struct_int_member_unboxed.rb.expected +6 -0
  1268. data/vendor/spinel/test/struct_member_name_no_global_merge.rb +28 -0
  1269. data/vendor/spinel/test/struct_member_name_no_global_merge.rb.expected +3 -0
  1270. data/vendor/spinel/test/struct_to_a_values.rb +12 -0
  1271. data/vendor/spinel/test/struct_to_a_values.rb.expected +6 -0
  1272. data/vendor/spinel/test/struct_to_h.rb +8 -0
  1273. data/vendor/spinel/test/struct_to_h.rb.expected +4 -0
  1274. data/vendor/spinel/test/struct_to_h_block.rb +30 -0
  1275. data/vendor/spinel/test/super_in_non_initialize.rb +44 -0
  1276. data/vendor/spinel/test/super_in_non_initialize.rb.expected +3 -0
  1277. data/vendor/spinel/test/super_with_args.rb +25 -0
  1278. data/vendor/spinel/test/super_with_args.rb.expected +4 -0
  1279. data/vendor/spinel/test/sym_hash_cross_variant_merge.rb +40 -0
  1280. data/vendor/spinel/test/sym_hash_cross_variant_merge.rb.expected +3 -0
  1281. data/vendor/spinel/test/sym_int_hash_merge.rb +52 -0
  1282. data/vendor/spinel/test/sym_int_hash_merge.rb.expected +11 -0
  1283. data/vendor/spinel/test/sym_int_hash_missing_key_nil.rb +15 -0
  1284. data/vendor/spinel/test/sym_int_hash_missing_key_nil.rb.expected +11 -0
  1285. data/vendor/spinel/test/sym_poly_hash_merge_sym_int.rb +18 -0
  1286. data/vendor/spinel/test/sym_poly_hash_merge_sym_int.rb.expected +4 -0
  1287. data/vendor/spinel/test/symbol_id2name_ruby_desc_minmax.rb +13 -0
  1288. data/vendor/spinel/test/symbol_id2name_ruby_desc_minmax.rb.expected +7 -0
  1289. data/vendor/spinel/test/symbol_to_proc_after_positional.rb +18 -0
  1290. data/vendor/spinel/test/symbol_to_proc_after_positional.rb.expected +5 -0
  1291. data/vendor/spinel/test/symbol_upcase_interpolation.rb +24 -0
  1292. data/vendor/spinel/test/symbol_upcase_interpolation.rb.expected +5 -0
  1293. data/vendor/spinel/test/system_argument_list.rb +15 -0
  1294. data/vendor/spinel/test/system_argument_list.rb.expected +7 -0
  1295. data/vendor/spinel/test/thread_new_value.rb +5 -0
  1296. data/vendor/spinel/test/thread_new_value.rb.expected +2 -0
  1297. data/vendor/spinel/test/time_localtime_gmtime.rb +19 -0
  1298. data/vendor/spinel/test/time_mktime_local_utc.rb +24 -0
  1299. data/vendor/spinel/test/time_mktime_local_utc.rb.expected +13 -0
  1300. data/vendor/spinel/test/time_strftime_long_format.rb +21 -0
  1301. data/vendor/spinel/test/time_strftime_long_format.rb.expected +5 -0
  1302. data/vendor/spinel/test/time_subsec_utc.rb +19 -0
  1303. data/vendor/spinel/test/time_subsec_utc.rb.expected +9 -0
  1304. data/vendor/spinel/test/time_to_s.rb +5 -0
  1305. data/vendor/spinel/test/toplevel_include_module_function.rb +101 -0
  1306. data/vendor/spinel/test/toplevel_include_module_function.rb.expected +8 -0
  1307. data/vendor/spinel/test/toplevel_kwrest_block_param.rb +19 -0
  1308. data/vendor/spinel/test/toplevel_kwrest_block_param.rb.expected +2 -0
  1309. data/vendor/spinel/test/tuple_inspect.rb +9 -0
  1310. data/vendor/spinel/test/tuple_inspect.rb.expected +4 -0
  1311. data/vendor/spinel/test/typed_array_empty_returns_nil.rb +19 -0
  1312. data/vendor/spinel/test/typed_array_empty_returns_nil.rb.expected +8 -0
  1313. data/vendor/spinel/test/typed_array_include_cross_type.rb +6 -0
  1314. data/vendor/spinel/test/typed_hash_caller_no_body_widen.rb +46 -0
  1315. data/vendor/spinel/test/typed_hash_caller_no_body_widen.rb.expected +1 -0
  1316. data/vendor/spinel/test/typed_hash_inspect_and_each_value.rb +12 -0
  1317. data/vendor/spinel/test/typed_hash_inspect_and_each_value.rb.expected +6 -0
  1318. data/vendor/spinel/test/typed_hash_missing_returns_nil.rb +17 -0
  1319. data/vendor/spinel/test/typed_hash_missing_returns_nil.rb.expected +4 -0
  1320. data/vendor/spinel/test/unary_operator_methods.rb +19 -0
  1321. data/vendor/spinel/test/unary_operator_methods.rb.expected +3 -0
  1322. data/vendor/spinel/test/undef_method_raises.rb +34 -0
  1323. data/vendor/spinel/test/undef_method_raises.rb.expected +3 -0
  1324. data/vendor/spinel/test/uninit_const_raises_nameerror.rb +18 -0
  1325. data/vendor/spinel/test/uninit_ivar_returns_nil.rb +23 -0
  1326. data/vendor/spinel/test/uninit_ivar_returns_nil.rb.expected +4 -0
  1327. data/vendor/spinel/test/unless_return_path_hash.rb +39 -0
  1328. data/vendor/spinel/test/unless_return_path_hash.rb.expected +6 -0
  1329. data/vendor/spinel/test/user_class_aset_dispatch.rb +75 -0
  1330. data/vendor/spinel/test/user_class_aset_dispatch.rb.expected +3 -0
  1331. data/vendor/spinel/test/value_type_tuple_gc_scan.rb +28 -0
  1332. data/vendor/spinel/test/value_type_tuple_gc_scan.rb.expected +2 -0
  1333. data/vendor/spinel/test/values_at.rb +19 -0
  1334. data/vendor/spinel/test/values_at.rb.expected +4 -0
  1335. data/vendor/spinel/test/volatile_strip_skips_coerced_arg.expected +1 -0
  1336. data/vendor/spinel/test/volatile_strip_skips_coerced_arg.rb +30 -0
  1337. data/vendor/spinel/test/warn_kernel.rb +13 -0
  1338. data/vendor/spinel/test/warn_kernel.rb.expected +3 -0
  1339. data/vendor/spinel/test/warn_unresolved_call_context.rb +20 -0
  1340. data/vendor/spinel/test/when_splat_rational_complex.rb +30 -0
  1341. data/vendor/spinel/test/when_splat_rational_complex.rb.expected +6 -0
  1342. data/vendor/spinel/test/yield_call_assigned_return.rb +41 -0
  1343. data/vendor/spinel/test/yield_call_assigned_return.rb.expected +6 -0
  1344. data/vendor/spinel/test/yield_typed_hash_block_local.rb +41 -0
  1345. data/vendor/spinel/test/yield_typed_hash_block_local.rb.expected +2 -0
  1346. data/vendor/spinel/test/yield_value_return.rb +52 -0
  1347. data/vendor/spinel/test/yield_value_return.rb.expected +8 -0
  1348. data/vendor/spinel/test/yield_value_returns_from_method.expected +6 -0
  1349. data/vendor/spinel/test/yield_value_returns_from_method.rb +27 -0
  1350. data/vendor/spinel/tools/fast-bootstrap +74 -0
  1351. metadata +1326 -279
  1352. data/vendor/spinel/test/alias_method.rb +0 -28
  1353. data/vendor/spinel/test/alias_method.rb.expected +0 -5
  1354. data/vendor/spinel/test/and_node_poly_operand.rb +0 -24
  1355. data/vendor/spinel/test/array_3d_nested.rb +0 -48
  1356. data/vendor/spinel/test/array_clear_typed.rb +0 -40
  1357. data/vendor/spinel/test/array_clear_typed.rb.expected +0 -7
  1358. data/vendor/spinel/test/array_concat.rb +0 -18
  1359. data/vendor/spinel/test/array_concat.rb.expected +0 -2
  1360. data/vendor/spinel/test/array_each_with_object.rb +0 -17
  1361. data/vendor/spinel/test/array_flat_map.rb +0 -16
  1362. data/vendor/spinel/test/array_flat_map.rb.expected +0 -2
  1363. data/vendor/spinel/test/array_keyed_hash_int_array_eql.rb +0 -29
  1364. data/vendor/spinel/test/array_keyed_hash_int_array_eql.rb.expected +0 -6
  1365. data/vendor/spinel/test/array_method_name_clash.rb +0 -15
  1366. data/vendor/spinel/test/array_new_block_typed_container.rb +0 -37
  1367. data/vendor/spinel/test/array_new_block_typed_container.rb.expected +0 -7
  1368. data/vendor/spinel/test/array_new_empty_inner_deferred.rb +0 -47
  1369. data/vendor/spinel/test/array_new_empty_inner_deferred.rb.expected +0 -8
  1370. data/vendor/spinel/test/array_partition_gc.rb +0 -20
  1371. data/vendor/spinel/test/array_partition_gc.rb.expected +0 -3
  1372. data/vendor/spinel/test/array_plus.rb +0 -18
  1373. data/vendor/spinel/test/array_plus.rb.expected +0 -2
  1374. data/vendor/spinel/test/array_rotate_bang.rb +0 -54
  1375. data/vendor/spinel/test/array_rotate_bang.rb.expected +0 -34
  1376. data/vendor/spinel/test/array_shuffle_ptr.rb +0 -11
  1377. data/vendor/spinel/test/attr_writer_poly_box.rb +0 -24
  1378. data/vendor/spinel/test/attr_writer_poly_no_double_eval.rb +0 -29
  1379. data/vendor/spinel/test/attr_writer_poly_no_double_eval.rb.expected +0 -3
  1380. data/vendor/spinel/test/attr_writer_returns_rhs.rb +0 -23
  1381. data/vendor/spinel/test/auto_unbox_keeps_int_slot.rb +0 -38
  1382. data/vendor/spinel/test/auto_unbox_keeps_int_slot.rb.expected +0 -3
  1383. data/vendor/spinel/test/auto_unbox_poly_to_int_local.rb +0 -36
  1384. data/vendor/spinel/test/auto_unbox_poly_to_int_local.rb.expected +0 -2
  1385. data/vendor/spinel/test/bare_return_in_cls_method.rb +0 -46
  1386. data/vendor/spinel/test/bare_return_in_cls_method.rb.expected +0 -2
  1387. data/vendor/spinel/test/bare_return_in_poly_method.rb +0 -26
  1388. data/vendor/spinel/test/bare_return_in_poly_method.rb.expected +0 -2
  1389. data/vendor/spinel/test/bound_method_array.rb +0 -22
  1390. data/vendor/spinel/test/bound_method_array.rb.expected +0 -4
  1391. data/vendor/spinel/test/bound_method_basic.rb +0 -27
  1392. data/vendor/spinel/test/bound_method_basic.rb.expected +0 -2
  1393. data/vendor/spinel/test/call_op_write.rb +0 -51
  1394. data/vendor/spinel/test/call_op_write.rb.expected +0 -11
  1395. data/vendor/spinel/test/chained_attr_setter.rb +0 -55
  1396. data/vendor/spinel/test/chained_ivar_op_assign_emits_inner_write.rb +0 -28
  1397. data/vendor/spinel/test/chained_ivar_op_assign_emits_inner_write.rb.expected +0 -3
  1398. data/vendor/spinel/test/chained_ivar_write_split.rb +0 -26
  1399. data/vendor/spinel/test/chained_ivar_write_split.rb.expected +0 -3
  1400. data/vendor/spinel/test/chained_ivar_write_subclass.rb +0 -26
  1401. data/vendor/spinel/test/chained_ivar_write_subclass.rb.expected +0 -2
  1402. data/vendor/spinel/test/chained_or_assign_collection_array_nested.rb +0 -32
  1403. data/vendor/spinel/test/chained_or_assign_collection_array_nested.rb.expected +0 -3
  1404. data/vendor/spinel/test/chained_or_assign_collection_element.rb +0 -29
  1405. data/vendor/spinel/test/chained_or_assign_collection_element.rb.expected +0 -2
  1406. data/vendor/spinel/test/chained_or_assign_collection_poly_array.rb +0 -25
  1407. data/vendor/spinel/test/chained_or_assign_collection_poly_array.rb.expected +0 -3
  1408. data/vendor/spinel/test/chained_or_assign_collection_str_keys.rb +0 -24
  1409. data/vendor/spinel/test/chained_or_assign_collection_str_keys.rb.expected +0 -3
  1410. data/vendor/spinel/test/class_constant_sym_array.rb +0 -19
  1411. data/vendor/spinel/test/class_var_write.rb +0 -19
  1412. data/vendor/spinel/test/cls_ivar_type_parent_defer.rb +0 -32
  1413. data/vendor/spinel/test/cls_method_object.rb +0 -31
  1414. data/vendor/spinel/test/cls_method_object.rb.expected +0 -2
  1415. data/vendor/spinel/test/comparable.rb +0 -21
  1416. data/vendor/spinel/test/comparable.rb.expected +0 -5
  1417. data/vendor/spinel/test/default_argv_narrows_from_string_call_site.rb +0 -32
  1418. data/vendor/spinel/test/each_poly_recv_block_auto_splat.rb +0 -43
  1419. data/vendor/spinel/test/each_poly_recv_block_auto_splat.rb.expected +0 -2
  1420. data/vendor/spinel/test/each_with_object_seed_shadow.rb +0 -14
  1421. data/vendor/spinel/test/each_with_object_seed_shadow.rb.expected +0 -4
  1422. data/vendor/spinel/test/empty_hash_ivar_string_value.rb +0 -51
  1423. data/vendor/spinel/test/empty_hash_ivar_string_value.rb.expected +0 -4
  1424. data/vendor/spinel/test/ensure_raise_overrides_body_raise.rb +0 -19
  1425. data/vendor/spinel/test/ensure_raise_overrides_body_raise.rb.expected +0 -1
  1426. data/vendor/spinel/test/ensure_runs_on_raise.rb +0 -32
  1427. data/vendor/spinel/test/ensure_runs_on_raise.rb.expected +0 -3
  1428. data/vendor/spinel/test/ensure_runs_on_raise_nested.rb +0 -38
  1429. data/vendor/spinel/test/ensure_runs_on_raise_nested.rb.expected +0 -4
  1430. data/vendor/spinel/test/ensure_runs_on_return_from_rescue.rb +0 -26
  1431. data/vendor/spinel/test/ensure_runs_on_return_from_rescue.rb.expected +0 -2
  1432. data/vendor/spinel/test/ensure_runs_on_return_nested.rb +0 -37
  1433. data/vendor/spinel/test/ensure_runs_on_return_nested.rb.expected +0 -3
  1434. data/vendor/spinel/test/enumerable.rb +0 -19
  1435. data/vendor/spinel/test/enumerable.rb.expected +0 -2
  1436. data/vendor/spinel/test/exceptions.rb +0 -34
  1437. data/vendor/spinel/test/exceptions.rb.expected +0 -4
  1438. data/vendor/spinel/test/fiber_ivar_persists_across_yield.rb +0 -22
  1439. data/vendor/spinel/test/fiber_ivar_persists_across_yield.rb.expected +0 -3
  1440. data/vendor/spinel/test/fiber_yield_across_method_call.rb +0 -28
  1441. data/vendor/spinel/test/fiber_yield_across_method_call.rb.expected +0 -3
  1442. data/vendor/spinel/test/file_class_methods_int_recv.rb +0 -20
  1443. data/vendor/spinel/test/file_class_methods_int_recv.rb.expected +0 -3
  1444. data/vendor/spinel/test/float_array_sort.rb +0 -18
  1445. data/vendor/spinel/test/float_array_sort.rb.expected +0 -8
  1446. data/vendor/spinel/test/forward_call_class_method_inherited_init.rb +0 -36
  1447. data/vendor/spinel/test/forward_call_class_method_inherited_init.rb.expected +0 -1
  1448. data/vendor/spinel/test/forward_call_class_method_inherited_init_int_array.rb +0 -32
  1449. data/vendor/spinel/test/forward_call_class_method_inherited_init_obj.rb +0 -41
  1450. data/vendor/spinel/test/forward_call_class_method_inherited_init_obj.rb.expected +0 -1
  1451. data/vendor/spinel/test/forward_call_class_method_int_array.rb +0 -26
  1452. data/vendor/spinel/test/forward_call_class_method_int_array.rb.expected +0 -1
  1453. data/vendor/spinel/test/forward_call_class_method_nested.rb +0 -35
  1454. data/vendor/spinel/test/forward_call_class_method_obj.rb +0 -36
  1455. data/vendor/spinel/test/forward_call_class_method_obj.rb.expected +0 -1
  1456. data/vendor/spinel/test/forward_call_param_type_int_array.rb +0 -34
  1457. data/vendor/spinel/test/forward_call_param_type_int_array.rb.expected +0 -1
  1458. data/vendor/spinel/test/forward_call_param_type_obj.rb +0 -38
  1459. data/vendor/spinel/test/forward_call_param_type_obj.rb.expected +0 -1
  1460. data/vendor/spinel/test/gc_save_double_in_new.rb +0 -13
  1461. data/vendor/spinel/test/gc_save_double_in_new.rb.expected +0 -1
  1462. data/vendor/spinel/test/gc_scan_skip_inherited_ivar.rb +0 -54
  1463. data/vendor/spinel/test/gc_scan_skip_inherited_ivar.rb.expected +0 -2
  1464. data/vendor/spinel/test/heterogeneous_dispatch_int_return_narrow.rb +0 -46
  1465. data/vendor/spinel/test/heterogeneous_dispatch_int_return_narrow.rb.expected +0 -2
  1466. data/vendor/spinel/test/if_static_false_skips_dead_branch_compile.rb +0 -50
  1467. data/vendor/spinel/test/if_static_false_skips_dead_branch_compile.rb.expected +0 -3
  1468. data/vendor/spinel/test/implicit_self_param_poly.rb +0 -17
  1469. data/vendor/spinel/test/implicit_self_param_poly.rb.expected +0 -1
  1470. data/vendor/spinel/test/inherit.rb +0 -52
  1471. data/vendor/spinel/test/inherit.rb.expected +0 -7
  1472. data/vendor/spinel/test/inherited_method_param_widen.rb +0 -49
  1473. data/vendor/spinel/test/init_locals.rb +0 -43
  1474. data/vendor/spinel/test/init_locals.rb.expected +0 -3
  1475. data/vendor/spinel/test/initialize_param_poly_call_sites.rb +0 -20
  1476. data/vendor/spinel/test/initialize_param_poly_call_sites.rb.expected +0 -2
  1477. data/vendor/spinel/test/initialize_param_through_call.rb +0 -15
  1478. data/vendor/spinel/test/initialize_void_wrapper_gc_save.rb +0 -40
  1479. data/vendor/spinel/test/int_array_replace_expr.rb +0 -23
  1480. data/vendor/spinel/test/int_array_replace_expr.rb.expected +0 -7
  1481. data/vendor/spinel/test/intarray_slice_assign_from_intarray_ptr_array_first.rb +0 -25
  1482. data/vendor/spinel/test/intarray_slice_assign_from_intarray_ptr_array_first.rb.expected +0 -1
  1483. data/vendor/spinel/test/integer_div.rb +0 -21
  1484. data/vendor/spinel/test/integer_div.rb.expected +0 -10
  1485. data/vendor/spinel/test/introspect.rb +0 -35
  1486. data/vendor/spinel/test/introspect.rb.expected +0 -11
  1487. data/vendor/spinel/test/issue176_empty_hash_default.rb +0 -34
  1488. data/vendor/spinel/test/issue176_empty_hash_default.rb.expected +0 -3
  1489. data/vendor/spinel/test/issue204_user_find_fetch.rb +0 -25
  1490. data/vendor/spinel/test/issue204_user_find_fetch.rb.expected +0 -5
  1491. data/vendor/spinel/test/issue207_factory_pattern.rb +0 -35
  1492. data/vendor/spinel/test/issue207_factory_pattern.rb.expected +0 -1
  1493. data/vendor/spinel/test/issue207_full_repro.rb +0 -52
  1494. data/vendor/spinel/test/issue207_full_repro.rb.expected +0 -1
  1495. data/vendor/spinel/test/issue208_inherited_class_method.rb +0 -24
  1496. data/vendor/spinel/test/issue208_inherited_class_method.rb.expected +0 -4
  1497. data/vendor/spinel/test/issue219_aref_chain.rb +0 -36
  1498. data/vendor/spinel/test/issue219_aref_chain.rb.expected +0 -5
  1499. data/vendor/spinel/test/issue235_chain_tail_widening.rb +0 -48
  1500. data/vendor/spinel/test/issue235_chain_tail_widening.rb.expected +0 -5
  1501. data/vendor/spinel/test/ivar_and_write_basic.rb +0 -34
  1502. data/vendor/spinel/test/ivar_and_write_basic.rb.expected +0 -5
  1503. data/vendor/spinel/test/ivar_c_keyword.rb +0 -14
  1504. data/vendor/spinel/test/ivar_c_keyword.rb.expected +0 -1
  1505. data/vendor/spinel/test/ivar_float_array.rb +0 -59
  1506. data/vendor/spinel/test/ivar_float_array.rb.expected +0 -11
  1507. data/vendor/spinel/test/ivar_op_assign_bitwise_and_shift.rb +0 -22
  1508. data/vendor/spinel/test/ivar_op_assign_bitwise_and_shift.rb.expected +0 -6
  1509. data/vendor/spinel/test/ivar_or_write_basic.rb +0 -57
  1510. data/vendor/spinel/test/ivar_or_write_basic.rb.expected +0 -9
  1511. data/vendor/spinel/test/ivar_writer_heterogeneity.rb +0 -34
  1512. data/vendor/spinel/test/ivar_writer_heterogeneity.rb.expected +0 -2
  1513. data/vendor/spinel/test/known_constants.rb +0 -25
  1514. data/vendor/spinel/test/known_constants.rb.expected +0 -4
  1515. data/vendor/spinel/test/kw_nil_default_string_call.rb +0 -6
  1516. data/vendor/spinel/test/kw_nil_default_string_call.rb.expected +0 -2
  1517. data/vendor/spinel/test/map_array_block_result.rb +0 -29
  1518. data/vendor/spinel/test/map_array_block_result.rb.expected +0 -2
  1519. data/vendor/spinel/test/map_block_returns_nested_array.rb +0 -53
  1520. data/vendor/spinel/test/map_empty_block.rb +0 -26
  1521. data/vendor/spinel/test/map_empty_block.rb.expected +0 -6
  1522. data/vendor/spinel/test/map_range_recv_array_block.rb +0 -31
  1523. data/vendor/spinel/test/method_param_unify_to_poly.rb +0 -40
  1524. data/vendor/spinel/test/method_param_unify_to_poly.rb.expected +0 -2
  1525. data/vendor/spinel/test/multi_arg_block_call.rb +0 -56
  1526. data/vendor/spinel/test/multi_arg_block_call.rb.expected +0 -5
  1527. data/vendor/spinel/test/multi_assign_ivar.rb +0 -33
  1528. data/vendor/spinel/test/multi_assign_ivar.rb.expected +0 -1
  1529. data/vendor/spinel/test/multi_write_const.rb +0 -36
  1530. data/vendor/spinel/test/multi_write_const.rb.expected +0 -9
  1531. data/vendor/spinel/test/multi_write_from_poly_recv.rb +0 -34
  1532. data/vendor/spinel/test/multi_write_ivar.rb +0 -34
  1533. data/vendor/spinel/test/multi_write_ivar.rb.expected +0 -3
  1534. data/vendor/spinel/test/multi_write_ivar_widening.rb +0 -10
  1535. data/vendor/spinel/test/multi_write_ivar_widening.rb.expected +0 -2
  1536. data/vendor/spinel/test/multi_write_map_block.rb +0 -31
  1537. data/vendor/spinel/test/multi_write_map_block.rb.expected +0 -7
  1538. data/vendor/spinel/test/multi_write_setter.rb +0 -28
  1539. data/vendor/spinel/test/multi_write_setter.rb.expected +0 -3
  1540. data/vendor/spinel/test/multi_write_typed_array_dispatch.rb +0 -44
  1541. data/vendor/spinel/test/multi_write_typed_array_dispatch.rb.expected +0 -3
  1542. data/vendor/spinel/test/nested_class_in_class.rb +0 -38
  1543. data/vendor/spinel/test/nested_class_in_class.rb.expected +0 -3
  1544. data/vendor/spinel/test/no_attr_write_shortcut_complex.rb +0 -33
  1545. data/vendor/spinel/test/no_attr_write_shortcut_complex.rb.expected +0 -3
  1546. data/vendor/spinel/test/no_attr_write_shortcut_multi.rb +0 -38
  1547. data/vendor/spinel/test/no_attr_write_shortcut_multi.rb.expected +0 -4
  1548. data/vendor/spinel/test/no_keywords_param.rb +0 -15
  1549. data/vendor/spinel/test/no_keywords_param.rb.expected +0 -2
  1550. data/vendor/spinel/test/obj_array.rb +0 -26
  1551. data/vendor/spinel/test/obj_array.rb.expected +0 -6
  1552. data/vendor/spinel/test/obj_class_returns_string.rb +0 -24
  1553. data/vendor/spinel/test/obj_class_returns_string.rb.expected +0 -2
  1554. data/vendor/spinel/test/optional_string_param_method.rb +0 -11
  1555. data/vendor/spinel/test/optional_string_param_method.rb.expected +0 -3
  1556. data/vendor/spinel/test/poly_array_literal_callnode_typed_elem.rb +0 -37
  1557. data/vendor/spinel/test/poly_array_literal_callnode_typed_elem.rb.expected +0 -9
  1558. data/vendor/spinel/test/poly_array_slot_literal.rb +0 -41
  1559. data/vendor/spinel/test/poly_array_slot_sized_default.rb +0 -33
  1560. data/vendor/spinel/test/poly_box_int_array.rb +0 -13
  1561. data/vendor/spinel/test/poly_box_int_array.rb.expected +0 -2
  1562. data/vendor/spinel/test/poly_dispatch_args_ret.rb +0 -45
  1563. data/vendor/spinel/test/poly_dispatch_args_ret.rb.expected +0 -4
  1564. data/vendor/spinel/test/poly_dispatch_arity_padding.rb +0 -36
  1565. data/vendor/spinel/test/poly_dispatch_arity_truncate.rb +0 -45
  1566. data/vendor/spinel/test/poly_hash_literal_from_ivar.rb +0 -47
  1567. data/vendor/spinel/test/poly_hash_literal_from_ivar.rb.expected +0 -5
  1568. data/vendor/spinel/test/poly_int_arith_auto_unify.rb +0 -26
  1569. data/vendor/spinel/test/poly_int_arith_auto_unify.rb.expected +0 -4
  1570. data/vendor/spinel/test/poly_int_bit_index.rb +0 -50
  1571. data/vendor/spinel/test/poly_int_bit_index.rb.expected +0 -14
  1572. data/vendor/spinel/test/poly_or_returns_value.rb +0 -13
  1573. data/vendor/spinel/test/poly_or_returns_value.rb.expected +0 -4
  1574. data/vendor/spinel/test/poly_recv_bracket_assign.rb +0 -31
  1575. data/vendor/spinel/test/poly_recv_bracket_assign.rb.expected +0 -1
  1576. data/vendor/spinel/test/poly_recv_each.rb +0 -35
  1577. data/vendor/spinel/test/poly_recv_each.rb.expected +0 -7
  1578. data/vendor/spinel/test/poly_shl_array_push_dispatch.rb +0 -35
  1579. data/vendor/spinel/test/poly_shl_array_push_dispatch.rb.expected +0 -5
  1580. data/vendor/spinel/test/proc_hash_value.rb +0 -27
  1581. data/vendor/spinel/test/regexp.rb +0 -34
  1582. data/vendor/spinel/test/regexp.rb.expected +0 -12
  1583. data/vendor/spinel/test/reopen_class.rb +0 -33
  1584. data/vendor/spinel/test/reopen_class.rb.expected +0 -5
  1585. data/vendor/spinel/test/runtime_widen_int_to_poly_array.rb +0 -27
  1586. data/vendor/spinel/test/runtime_widen_int_to_poly_array.rb.expected +0 -3
  1587. data/vendor/spinel/test/sample_user_method.rb +0 -20
  1588. data/vendor/spinel/test/scan_ivars_inherited_slot.rb +0 -32
  1589. data/vendor/spinel/test/scan_new_calls_class_scope.rb +0 -35
  1590. data/vendor/spinel/test/send.rb +0 -15
  1591. data/vendor/spinel/test/send.rb.expected +0 -2
  1592. data/vendor/spinel/test/stdlib.rb +0 -28
  1593. data/vendor/spinel/test/stdlib.rb.expected +0 -5
  1594. data/vendor/spinel/test/strip_nullable_int_cast.rb +0 -24
  1595. data/vendor/spinel/test/super_arg_cross_class_cast.rb +0 -39
  1596. data/vendor/spinel/test/super_arg_cross_class_cast.rb.expected +0 -2
  1597. data/vendor/spinel/test/super_forwarding.rb +0 -25
  1598. data/vendor/spinel/test/super_forwarding.rb.expected +0 -3
  1599. data/vendor/spinel/test/sym_case.rb +0 -15
  1600. data/vendor/spinel/test/sym_case.rb.expected +0 -4
  1601. data/vendor/spinel/test/symbol_ivar_reassign.rb +0 -25
  1602. data/vendor/spinel/test/symbol_ivar_reassign.rb.expected +0 -2
  1603. data/vendor/spinel/test/toplevel_ivar_array.rb +0 -19
  1604. data/vendor/spinel/test/toplevel_ivar_array.rb.expected +0 -4
  1605. data/vendor/spinel/test/unbox_poly_index_in_dispatch.rb +0 -20
  1606. data/vendor/spinel/test/unbox_poly_index_in_dispatch.rb.expected +0 -1
  1607. data/vendor/spinel/test/undef.rb +0 -33
  1608. data/vendor/spinel/test/undef.rb.expected +0 -2
  1609. data/vendor/spinel/test/user_method_named_like_mutator.rb +0 -30
  1610. data/vendor/spinel/test/user_method_named_like_mutator.rb.expected +0 -2
  1611. data/vendor/spinel/test/value_type_ctor_gc_save.rb +0 -46
  1612. data/vendor/spinel/test/value_type_ctor_gc_save.rb.expected +0 -3
  1613. data/vendor/spinel/test/widen_int_obj_to_poly.rb +0 -29
  1614. /data/vendor/spinel/test/{multi_write_from_poly_recv.rb.expected → bare_arg_in_module_body.rb.expected} +0 -0
  1615. /data/vendor/spinel/test/{default_argv_narrows_from_string_call_site.rb.expected → cvar_method_first_assign.rb.expected} +0 -0
  1616. /data/vendor/spinel/test/{array_each_with_object.rb.expected → empty_array_push_container_elem.rb.expected} +0 -0
  1617. /data/vendor/spinel/test/{class_var_write.rb.expected → ffi_array_specs_decl.rb.expected} +0 -0
  1618. /data/vendor/spinel/test/{array_method_name_clash.rb.expected → ffi_int_arg_poly_value.rb.expected} +0 -0
  1619. /data/vendor/spinel/test/{initialize_void_wrapper_gc_save.rb.expected → ffi_ptr_array.rb.expected} +0 -0
  1620. /data/vendor/spinel/test/{inherited_method_param_widen.rb.expected → ffi_ptr_int_literal.rb.expected} +0 -0
  1621. /data/vendor/spinel/test/{forward_call_class_method_nested.rb.expected → ffi_str_arg_poly_value.rb.expected} +0 -0
  1622. /data/vendor/spinel/test/{proc_hash_value.rb.expected → file_write_at_tail_position.rb.expected} +0 -0
  1623. /data/vendor/spinel/test/{array_shuffle_ptr.rb.expected → hash_key_via_intermediate_local.rb.expected} +0 -0
  1624. /data/vendor/spinel/test/{forward_call_class_method_inherited_init_int_array.rb.expected → hash_param_widen_from_callee_slot.rb.expected} +0 -0
  1625. /data/vendor/spinel/test/{strip_nullable_int_cast.rb.expected → hash_temp_gc_root.rb.expected} +0 -0
  1626. /data/vendor/spinel/test/{scan_new_calls_class_scope.rb.expected → poly_recv_hash_dup.rb.expected} +0 -0
  1627. /data/vendor/spinel/test/{class_constant_sym_array.rb.expected → respond_to_def_self_method.rb.expected} +0 -0
  1628. /data/vendor/spinel/test/{initialize_param_through_call.rb.expected → warn_unresolved_call_context.rb.expected} +0 -0
@@ -20,31 +20,64 @@
20
20
  #include <stdlib.h>
21
21
  #include <string.h>
22
22
  #include <stdarg.h>
23
+ #include <limits.h>
23
24
  #include <prism.h>
24
25
 
25
26
  /* ---- Output buffer ---- */
26
27
  static char **lines;
27
- static int line_count;
28
- static int line_cap;
28
+ static size_t line_count;
29
+ static size_t line_cap;
29
30
  static int node_counter;
30
31
 
31
32
  static void out_add(const char *fmt, ...) {
32
33
  va_list ap;
33
34
  va_start(ap, fmt);
34
- char buf[4096];
35
- vsnprintf(buf, sizeof(buf), fmt, ap);
35
+ va_list ap2;
36
+ va_copy(ap2, ap);
37
+ int needed = vsnprintf(NULL, 0, fmt, ap);
36
38
  va_end(ap);
39
+ if (needed < 0) {
40
+ va_end(ap2);
41
+ fprintf(stderr, "spinel_parse: vsnprintf failed\n");
42
+ exit(1);
43
+ }
44
+ char *buf = malloc((size_t)needed + 1);
45
+ if (!buf) {
46
+ va_end(ap2);
47
+ fprintf(stderr, "spinel_parse: out of memory\n");
48
+ exit(1);
49
+ }
50
+ vsnprintf(buf, (size_t)needed + 1, fmt, ap2);
51
+ va_end(ap2);
37
52
  if (line_count >= line_cap) {
38
- line_cap = line_cap * 2 + 256;
39
- lines = realloc(lines, sizeof(char *) * line_cap);
53
+ if (line_cap > (((size_t)-1) - 256) / 2) {
54
+ fprintf(stderr, "spinel_parse: out of memory\n");
55
+ exit(1);
56
+ }
57
+ size_t new_cap = line_cap * 2 + 256;
58
+ char **new_lines = realloc(lines, sizeof(char *) * new_cap);
59
+ if (!new_lines) { fprintf(stderr, "spinel_parse: out of memory\n"); exit(1); }
60
+ lines = new_lines;
61
+ line_cap = new_cap;
40
62
  }
41
- lines[line_count++] = strdup(buf);
63
+ lines[line_count++] = buf;
42
64
  }
43
65
 
44
66
  /* ---- Name from constant pool ---- */
45
67
  static const pm_parser_t *g_parser;
46
68
  static const char *g_source_file = "";
47
69
  static char *g_source_file_escaped = NULL; /* escape_str(g_source_file), set once at init */
70
+ /* Debug builds: when SPINEL_DEBUG=1, flatten() emits a per-node
71
+ `node_line` field so codegen can place C `#line` directives. Off by
72
+ default so the AST text format (and golden tests) are unchanged. */
73
+ static int g_emit_line = 0;
74
+ /* Debug multi-file source map, populated by sp_build_line_map() before
75
+ flatten() runs and read in flatten() to attribute each node to its
76
+ original file/line. Declared here because flatten() precedes the
77
+ require-resolution machinery that defines the builder. */
78
+ static int *sp_line_file = NULL; /* buffer line (1-based) -> file id */
79
+ static int *sp_line_orig = NULL; /* buffer line (1-based) -> original line */
80
+ static int sp_line_map_n = 0;
48
81
 
49
82
  static char *cstr(pm_constant_id_t id) {
50
83
  if (id == 0) return strdup("");
@@ -67,6 +100,11 @@ static char *escape_str(const uint8_t *src, size_t len) {
67
100
  else if (c == '\r') { out[j++]='%'; out[j++]='0'; out[j++]='D'; }
68
101
  else if (c == '\t') { out[j++]='%'; out[j++]='0'; out[j++]='9'; }
69
102
  else if (c == ' ') { out[j++]='%'; out[j++]='2'; out[j++]='0'; }
103
+ /* Issue #722: NUL byte inside a string literal would truncate
104
+ the field at the AST text-serialization layer (lines split
105
+ on '\n' and the loader uses strlen on fields). Encode as %00
106
+ so the byte survives the round-trip. */
107
+ else if (c == 0) { out[j++]='%'; out[j++]='0'; out[j++]='0'; }
70
108
  else out[j++] = c;
71
109
  }
72
110
  out[j] = '\0';
@@ -107,11 +145,21 @@ static void emit_int(int id, const char *field, long long val) {
107
145
  }
108
146
 
109
147
  static void emit_float(int id, const char *field, double val) {
148
+ /* Issue #766: 64-byte buf; "%.17g" produces at most 24 chars, plus
149
+ ".0" trailer = 26. Safe by margin.
150
+ Issue #767: snprintf is locale-sensitive (de_DE produces "3,14"
151
+ for 3.14, which then fails to parse as a C float literal).
152
+ Format into a fresh sprintf via the C locale by using a manual
153
+ dot conversion: produce in current locale then replace ',' -> '.'.
154
+ The lib-side replacement is safe because Ruby float literals never
155
+ contain a comma. */
110
156
  char buf[64];
111
157
  snprintf(buf, sizeof(buf), "%.17g", val);
112
- /* Ensure there's a decimal point (Ruby outputs 0.0, not 0) */
113
- if (!strchr(buf, '.') && !strchr(buf, 'e') && !strchr(buf, 'E'))
114
- strcat(buf, ".0");
158
+ for (char *p = buf; *p; p++) if (*p == ',') *p = '.';
159
+ if (!strchr(buf, '.') && !strchr(buf, 'e') && !strchr(buf, 'E')) {
160
+ size_t l = strlen(buf);
161
+ if (l + 3 < sizeof(buf)) strcat(buf, ".0");
162
+ }
115
163
  out_add("F %d %s %s", id, field, buf);
116
164
  }
117
165
 
@@ -128,30 +176,60 @@ static void emit_node_array(int id, const char *field, pm_node_list_t *list) {
128
176
  int *ids = malloc(sizeof(int) * list->size);
129
177
  for (size_t i = 0; i < list->size; i++)
130
178
  ids[i] = flatten(list->nodes[i]);
131
- /* Build comma-separated string */
132
- char buf[65536];
133
- int pos = 0;
179
+ /* Issue #744: build comma-separated string into a growable buffer.
180
+ Previously a fixed 65536-byte stack buffer overflowed on
181
+ 20k+-element arrays -- snprintf returns the bytes it WOULD have
182
+ written, advancing pos past the end and corrupting the stack. */
183
+ size_t cap = 1024;
184
+ char *buf = malloc(cap);
185
+ size_t pos = 0;
134
186
  for (size_t i = 0; i < list->size; i++) {
187
+ /* worst case per iter: ", -2147483648\0" -> 14 bytes; reserve 16 to be safe */
188
+ if (pos + 16 >= cap) {
189
+ size_t new_cap = cap * 2 + 16;
190
+ char *nb = realloc(buf, new_cap);
191
+ if (!nb) { fprintf(stderr, "spinel_parse: out of memory\n"); exit(1); }
192
+ buf = nb;
193
+ cap = new_cap;
194
+ }
135
195
  if (i > 0) buf[pos++] = ',';
136
- pos += snprintf(buf + pos, sizeof(buf) - pos, "%d", ids[i]);
196
+ int n = snprintf(buf + pos, cap - pos, "%d", ids[i]);
197
+ if (n > 0) pos += (size_t)n;
137
198
  }
138
199
  buf[pos] = '\0';
139
200
  out_add("A %d %s %s", id, field, buf);
201
+ free(buf);
140
202
  free(ids);
141
203
  }
142
204
 
143
205
  /* ---- Integer value extraction ---- */
144
206
  static long long pm_int_value(pm_integer_t *integer) {
145
- long long val = 0;
146
- if (integer->length == 0) {
147
- val = (long long)integer->value;
207
+ uint64_t val = 0;
208
+ uint64_t max_positive = (uint64_t)LLONG_MAX;
209
+ uint64_t max_negative = max_positive + 1ULL;
210
+ const size_t limb_bits = 32;
211
+ const size_t value_bits = sizeof(val) * CHAR_BIT;
212
+ int overflow = 0;
213
+
214
+ if (integer->values == NULL) {
215
+ val = (uint64_t)integer->value;
148
216
  } else {
149
- /* Large integer - approximate with first word */
150
- val = (long long)integer->value;
151
- /* TODO: proper bignum support */
217
+ for (size_t i = 0; i < integer->length; i++) {
218
+ if (i >= value_bits / limb_bits) {
219
+ if (integer->values[i] != 0) overflow = 1;
220
+ continue;
221
+ }
222
+ size_t shift = i * limb_bits;
223
+ val |= ((uint64_t)integer->values[i]) << shift;
224
+ }
225
+ }
226
+
227
+ if (integer->negative) {
228
+ if (overflow || val >= max_negative) return LLONG_MIN;
229
+ return -(long long)val;
152
230
  }
153
- if (integer->negative) val = -val;
154
- return val;
231
+ if (overflow || val > max_positive) return LLONG_MAX;
232
+ return (long long)val;
155
233
  }
156
234
 
157
235
  /* ---- Main flattening ---- */
@@ -161,6 +239,30 @@ static int flatten(pm_node_t *node) {
161
239
  int id = node_counter++;
162
240
  pm_node_type_t t = PM_NODE_TYPE(node);
163
241
 
242
+ /* Debug builds only: stamp every node with its source line — and, when a
243
+ multi-file map was built, its original file — so codegen can emit
244
+ `#line N "file"` directives. Written to dedicated `node_line` /
245
+ `node_file` fields (NOT the overloaded `value`/`start_line` slot). The
246
+ raw value is the line in the concatenated buffer; the map translates it
247
+ back to the original file and line. */
248
+ if (g_emit_line) {
249
+ pm_line_column_t lc = pm_newline_list_line_column(&g_parser->newline_list,
250
+ node->location.start,
251
+ g_parser->start_line);
252
+ int32_t bl = lc.line;
253
+ int orig = bl;
254
+ int fid = 0;
255
+ if (sp_line_map_n > 0 && bl >= 1 && bl <= sp_line_map_n) {
256
+ orig = sp_line_orig[bl];
257
+ fid = sp_line_file[bl];
258
+ }
259
+ emit_int(id, "node_line", (long long)orig);
260
+ emit_int(id, "node_file", (long long)fid);
261
+ /* Column is concatenation-stable (require splicing is line-based), so the
262
+ buffer column equals the original-file column. 0-based, as Prism gives. */
263
+ emit_int(id, "node_col", (long long)lc.column);
264
+ }
265
+
164
266
  #define N(type_name) out_add("N %d " type_name, id)
165
267
  #define S(field, val) do { char *_e = (val); emit_str(id, field, _e); free(_e); } while(0)
166
268
  #define I(field, val) emit_int(id, field, val)
@@ -227,8 +329,12 @@ static int flatten(pm_node_t *node) {
227
329
  R("receiver", n->receiver);
228
330
  R("arguments", n->arguments);
229
331
  R("block", n->block);
332
+ /* Issue #793: emit explicit call_operator for non-safe-nav calls
333
+ too, so codegen reads "." instead of an unset field. */
230
334
  if (PM_NODE_FLAG_P(node, PM_CALL_NODE_FLAGS_SAFE_NAVIGATION)) {
231
335
  S("call_operator", escape_str((const uint8_t *)"&.", 2));
336
+ } else {
337
+ S("call_operator", escape_str((const uint8_t *)".", 1));
232
338
  }
233
339
  break;
234
340
  }
@@ -246,6 +352,50 @@ static int flatten(pm_node_t *node) {
246
352
  R("target", n->target);
247
353
  break;
248
354
  }
355
+ case PM_CONSTANT_OPERATOR_WRITE_NODE: {
356
+ pm_constant_operator_write_node_t *n = (pm_constant_operator_write_node_t *)node;
357
+ N("ConstantOperatorWriteNode");
358
+ NAME("name", n->name);
359
+ NAME("binary_operator", n->binary_operator);
360
+ R("value", n->value);
361
+ break;
362
+ }
363
+ case PM_CONSTANT_OR_WRITE_NODE: {
364
+ pm_constant_or_write_node_t *n = (pm_constant_or_write_node_t *)node;
365
+ N("ConstantOrWriteNode");
366
+ NAME("name", n->name);
367
+ R("value", n->value);
368
+ break;
369
+ }
370
+ case PM_CONSTANT_AND_WRITE_NODE: {
371
+ pm_constant_and_write_node_t *n = (pm_constant_and_write_node_t *)node;
372
+ N("ConstantAndWriteNode");
373
+ NAME("name", n->name);
374
+ R("value", n->value);
375
+ break;
376
+ }
377
+ case PM_CONSTANT_PATH_OPERATOR_WRITE_NODE: {
378
+ pm_constant_path_operator_write_node_t *n = (pm_constant_path_operator_write_node_t *)node;
379
+ N("ConstantPathOperatorWriteNode");
380
+ NAME("binary_operator", n->binary_operator);
381
+ R("value", n->value);
382
+ R("target", (pm_node_t *)n->target);
383
+ break;
384
+ }
385
+ case PM_CONSTANT_PATH_OR_WRITE_NODE: {
386
+ pm_constant_path_or_write_node_t *n = (pm_constant_path_or_write_node_t *)node;
387
+ N("ConstantPathOrWriteNode");
388
+ R("value", n->value);
389
+ R("target", (pm_node_t *)n->target);
390
+ break;
391
+ }
392
+ case PM_CONSTANT_PATH_AND_WRITE_NODE: {
393
+ pm_constant_path_and_write_node_t *n = (pm_constant_path_and_write_node_t *)node;
394
+ N("ConstantPathAndWriteNode");
395
+ R("value", n->value);
396
+ R("target", (pm_node_t *)n->target);
397
+ break;
398
+ }
249
399
  case PM_CONSTANT_READ_NODE: {
250
400
  pm_constant_read_node_t *n = (pm_constant_read_node_t *)node;
251
401
  N("ConstantReadNode");
@@ -332,6 +482,19 @@ static int flatten(pm_node_t *node) {
332
482
  NAME("name", n->name);
333
483
  break;
334
484
  }
485
+ case PM_CLASS_VARIABLE_TARGET_NODE: {
486
+ pm_class_variable_target_node_t *n = (pm_class_variable_target_node_t *)node;
487
+ N("ClassVariableTargetNode");
488
+ NAME("name", n->name);
489
+ break;
490
+ }
491
+ case PM_CONSTANT_PATH_TARGET_NODE: {
492
+ pm_constant_path_target_node_t *n = (pm_constant_path_target_node_t *)node;
493
+ N("ConstantPathTargetNode");
494
+ R("parent", n->parent);
495
+ NAME("name", n->name);
496
+ break;
497
+ }
335
498
  case PM_INSTANCE_VARIABLE_AND_WRITE_NODE: {
336
499
  pm_instance_variable_and_write_node_t *n = (pm_instance_variable_and_write_node_t *)node;
337
500
  N("InstanceVariableAndWriteNode");
@@ -367,6 +530,28 @@ static int flatten(pm_node_t *node) {
367
530
  NAME("name", n->name);
368
531
  break;
369
532
  }
533
+ case PM_CLASS_VARIABLE_OPERATOR_WRITE_NODE: {
534
+ pm_class_variable_operator_write_node_t *n = (pm_class_variable_operator_write_node_t *)node;
535
+ N("ClassVariableOperatorWriteNode");
536
+ NAME("name", n->name);
537
+ NAME("binary_operator", n->binary_operator);
538
+ R("value", n->value);
539
+ break;
540
+ }
541
+ case PM_CLASS_VARIABLE_OR_WRITE_NODE: {
542
+ pm_class_variable_or_write_node_t *n = (pm_class_variable_or_write_node_t *)node;
543
+ N("ClassVariableOrWriteNode");
544
+ NAME("name", n->name);
545
+ R("value", n->value);
546
+ break;
547
+ }
548
+ case PM_CLASS_VARIABLE_AND_WRITE_NODE: {
549
+ pm_class_variable_and_write_node_t *n = (pm_class_variable_and_write_node_t *)node;
550
+ N("ClassVariableAndWriteNode");
551
+ NAME("name", n->name);
552
+ R("value", n->value);
553
+ break;
554
+ }
370
555
  case PM_INDEX_OPERATOR_WRITE_NODE: {
371
556
  pm_index_operator_write_node_t *n = (pm_index_operator_write_node_t *)node;
372
557
  N("IndexOperatorWriteNode");
@@ -496,6 +681,29 @@ static int flatten(pm_node_t *node) {
496
681
  F("value", n->value);
497
682
  break;
498
683
  }
684
+ case PM_IMAGINARY_NODE: {
685
+ /* `2i` -- imaginary numeric. Issue #840. Wraps an inner
686
+ IntegerNode or FloatNode in `numeric`. Codegen surfaces this
687
+ as a sp_Complex literal {re=0, im=numeric}. */
688
+ pm_imaginary_node_t *n = (pm_imaginary_node_t *)node;
689
+ N("ImaginaryNode");
690
+ R("numeric", n->numeric);
691
+ break;
692
+ }
693
+ case PM_RATIONAL_NODE: {
694
+ /* `1/2r` or `1.5r` -- rational literal. Issue #841. Emits
695
+ numerator + denominator as decimal-text fields (loader pins
696
+ them in @nd_rat_num / @nd_rat_den). Prism stores both as
697
+ reduced pm_integer_t. */
698
+ pm_rational_node_t *n = (pm_rational_node_t *)node;
699
+ N("RationalNode");
700
+ char nbuf[32];
701
+ snprintf(nbuf, sizeof(nbuf), "%lld", (long long)pm_int_value(&n->numerator));
702
+ emit_str(id, "rat_num", nbuf);
703
+ snprintf(nbuf, sizeof(nbuf), "%lld", (long long)pm_int_value(&n->denominator));
704
+ emit_str(id, "rat_den", nbuf);
705
+ break;
706
+ }
499
707
  case PM_STRING_NODE: {
500
708
  pm_string_node_t *n = (pm_string_node_t *)node;
501
709
  N("StringNode");
@@ -687,12 +895,18 @@ static int flatten(pm_node_t *node) {
687
895
  R("arguments", n->arguments);
688
896
  break;
689
897
  }
690
- case PM_BREAK_NODE:
898
+ case PM_BREAK_NODE: {
899
+ pm_break_node_t *n = (pm_break_node_t *)node;
691
900
  N("BreakNode");
901
+ R("arguments", n->arguments);
692
902
  break;
693
- case PM_NEXT_NODE:
903
+ }
904
+ case PM_NEXT_NODE: {
905
+ pm_next_node_t *n = (pm_next_node_t *)node;
694
906
  N("NextNode");
907
+ R("arguments", n->arguments);
695
908
  break;
909
+ }
696
910
  case PM_RETRY_NODE:
697
911
  N("RetryNode");
698
912
  break;
@@ -847,9 +1061,8 @@ static int flatten(pm_node_t *node) {
847
1061
  break;
848
1062
  }
849
1063
  case PM_SOURCE_ENCODING_NODE: {
850
- /* `__ENCODING__`. CRuby returns an Encoding object; Spinel has
851
- no Encoding runtime, so we return the canonical name as a
852
- frozen string. All Spinel sources are UTF-8. */
1064
+ /* `__ENCODING__`. Spinel sources are UTF-8; codegen returns a
1065
+ small Encoding value for Ruby-compatible `.class` / `.name`. */
853
1066
  N("SourceEncodingNode");
854
1067
  break;
855
1068
  }
@@ -892,15 +1105,28 @@ static int flatten(pm_node_t *node) {
892
1105
  R("expression", n->expression);
893
1106
  break;
894
1107
  }
1108
+ case PM_ASSOC_SPLAT_NODE: {
1109
+ /* `**h` in argument position — splice a hash's entries as
1110
+ keyword args. Wraps the inner hash expression; codegen
1111
+ handles the expansion at call sites. Issue #917. */
1112
+ pm_assoc_splat_node_t *n = (pm_assoc_splat_node_t *)node;
1113
+ N("AssocSplatNode");
1114
+ R("value", n->value);
1115
+ break;
1116
+ }
895
1117
  case PM_SUPER_NODE: {
896
1118
  pm_super_node_t *n = (pm_super_node_t *)node;
897
1119
  N("SuperNode");
898
1120
  R("arguments", n->arguments);
1121
+ R("block", n->block);
899
1122
  break;
900
1123
  }
901
- case PM_FORWARDING_SUPER_NODE:
1124
+ case PM_FORWARDING_SUPER_NODE: {
1125
+ pm_forwarding_super_node_t *n = (pm_forwarding_super_node_t *)node;
902
1126
  N("ForwardingSuperNode");
1127
+ R("block", (pm_node_t *)n->block);
903
1128
  break;
1129
+ }
904
1130
  case PM_MULTI_WRITE_NODE: {
905
1131
  pm_multi_write_node_t *n = (pm_multi_write_node_t *)node;
906
1132
  N("MultiWriteNode");
@@ -1001,6 +1227,79 @@ static int flatten(pm_node_t *node) {
1001
1227
  R("right", n->right);
1002
1228
  break;
1003
1229
  }
1230
+ case PM_ARRAY_PATTERN_NODE: {
1231
+ /* `case x in [a, b, c]`. requireds is the list of fixed-position
1232
+ sub-patterns. rest / posts cover `[a, *, c]`. constant covers
1233
+ `Foo[a, b]` (Foo() destructuring). Minimal initial support:
1234
+ emit requireds as a node-id array; rest / posts / constant
1235
+ handled later when the codegen path catches up. Issue #669. */
1236
+ pm_array_pattern_node_t *n = (pm_array_pattern_node_t *)node;
1237
+ N("ArrayPatternNode");
1238
+ R("constant", n->constant);
1239
+ A("requireds", &n->requireds);
1240
+ R("rest", n->rest);
1241
+ A("posts", &n->posts);
1242
+ break;
1243
+ }
1244
+ case PM_HASH_PATTERN_NODE: {
1245
+ /* `case x in {a:, b: 2}`. elements is a list of AssocNodes
1246
+ (key + sub-pattern); a `:b:` shorthand binds the key's symbol
1247
+ as a same-named LV. Constant covers `Foo[a:]` destructuring
1248
+ (not yet handled by codegen). Rest covers `**rest` (also not
1249
+ yet handled). Issue #805. */
1250
+ pm_hash_pattern_node_t *n = (pm_hash_pattern_node_t *)node;
1251
+ N("HashPatternNode");
1252
+ R("constant", n->constant);
1253
+ A("elements", &n->elements);
1254
+ R("rest", n->rest);
1255
+ break;
1256
+ }
1257
+ case PM_FIND_PATTERN_NODE: {
1258
+ /* `case x in [*a, b, *c]` -- find-anywhere pattern with leading
1259
+ and trailing wildcards plus required middle elements.
1260
+ Currently surfaces all three slots so the codegen can match
1261
+ on length + extract requireds; the find-anywhere semantics
1262
+ (variable-position match) are not yet implemented but the
1263
+ shape no longer drops to UnsupportedNode. Issue #805. */
1264
+ pm_find_pattern_node_t *n = (pm_find_pattern_node_t *)node;
1265
+ N("FindPatternNode");
1266
+ R("constant", n->constant);
1267
+ R("left", (pm_node_t *)n->left);
1268
+ A("requireds", &n->requireds);
1269
+ R("right", n->right);
1270
+ break;
1271
+ }
1272
+ case PM_CAPTURE_PATTERN_NODE: {
1273
+ /* `case x in pat => var` -- match `pat`, bind matched value to
1274
+ `var` (LocalVariableTargetNode). Issue #884. */
1275
+ pm_capture_pattern_node_t *n = (pm_capture_pattern_node_t *)node;
1276
+ N("CapturePatternNode");
1277
+ R("value", (pm_node_t *)n->value);
1278
+ R("target", (pm_node_t *)n->target);
1279
+ break;
1280
+ }
1281
+ case PM_PINNED_EXPRESSION_NODE: {
1282
+ /* `case x in ^(expr)`. The pinned expression is evaluated at
1283
+ match time and compared by `==` against the scrutinee. */
1284
+ pm_pinned_expression_node_t *n = (pm_pinned_expression_node_t *)node;
1285
+ N("PinnedExpressionNode");
1286
+ R("expression", n->expression);
1287
+ break;
1288
+ }
1289
+ case PM_PINNED_VARIABLE_NODE: {
1290
+ /* `case x in ^var`. The wrapped variable can be any read-shape
1291
+ node prism emits for `^var` -- LocalVariableReadNode,
1292
+ InstanceVariableReadNode, ClassVariableReadNode,
1293
+ GlobalVariableReadNode, ConstantReadNode,
1294
+ NumberedReferenceReadNode, BackReferenceReadNode. Routed to
1295
+ the same `@nd_expression` slot as PinnedExpressionNode so the
1296
+ codegen treats them uniformly -- both are "match the scrutinee
1297
+ by `==` against this expression". */
1298
+ pm_pinned_variable_node_t *n = (pm_pinned_variable_node_t *)node;
1299
+ N("PinnedVariableNode");
1300
+ R("expression", n->variable);
1301
+ break;
1302
+ }
1004
1303
  case PM_NUMBERED_PARAMETERS_NODE: {
1005
1304
  pm_numbered_parameters_node_t *n = (pm_numbered_parameters_node_t *)node;
1006
1305
  N("NumberedParametersNode");
@@ -1185,11 +1484,19 @@ static int flatten(pm_node_t *node) {
1185
1484
  static char *read_file(const char *path) {
1186
1485
  FILE *f = fopen(path, "rb");
1187
1486
  if (!f) return NULL;
1188
- fseek(f, 0, SEEK_END);
1487
+ if (fseek(f, 0, SEEK_END) != 0) { fclose(f); return NULL; }
1189
1488
  long len = ftell(f);
1190
- fseek(f, 0, SEEK_SET);
1191
- char *buf = malloc(len + 1);
1192
- size_t nread = fread(buf, 1, len, f);
1489
+ /* Issue #768: ftell returning -1 (stream error) used to wrap len + 1
1490
+ to 0, malloc(0) returns NULL, then fread(NULL, 1, SIZE_MAX, f)
1491
+ tried to read 16 exabytes. Bail cleanly. */
1492
+ if (len < 0) { fclose(f); return NULL; }
1493
+ if (fseek(f, 0, SEEK_SET) != 0) { fclose(f); return NULL; }
1494
+ char *buf = malloc((size_t)len + 1);
1495
+ if (!buf) { fclose(f); return NULL; }
1496
+ size_t nread = fread(buf, 1, (size_t)len, f);
1497
+ /* Issue #763: detect short read and bail rather than processing
1498
+ a truncated source file silently. */
1499
+ if (nread != (size_t)len) { free(buf); fclose(f); return NULL; }
1193
1500
  buf[nread] = '\0';
1194
1501
  fclose(f);
1195
1502
  return buf;
@@ -1204,27 +1511,44 @@ static int sp_included_cap = 0;
1204
1511
 
1205
1512
  /* Resolve a path to its canonical form for dedup. realpath() returns NULL
1206
1513
  on missing files; in that case fall back to the literal path. */
1514
+ /* Issue #749: realpath/_fullpath + strdup can both fail under OOM,
1515
+ leaving callers with a NULL pointer that goes to strcmp(NULL, ...)
1516
+ and segfaults. Fall back to a static empty string so downstream
1517
+ `strcmp(canonical, ...) == 0` consistently misses (the caller then
1518
+ treats this as "not already included" and proceeds with the file
1519
+ read, which fails through the normal LoadError path). */
1207
1520
  static char *sp_canonical_path(const char *path) {
1521
+ if (!path) { char *e = strdup(""); return e ? e : NULL; }
1208
1522
  #ifdef _WIN32
1209
1523
  char *real = _fullpath(NULL, path, 0);
1210
1524
  #else
1211
1525
  char *real = realpath(path, NULL);
1212
1526
  #endif
1213
- return real ? real : strdup(path);
1527
+ if (real) return real;
1528
+ char *d = strdup(path);
1529
+ if (d) return d;
1530
+ /* Last resort: return a static empty string to avoid NULL. The
1531
+ buffer is read-only by callers (passed to strcmp, then freed by
1532
+ the caller's free() -- so allocate a fresh empty string instead
1533
+ of returning a string literal). */
1534
+ return strdup("");
1214
1535
  }
1215
1536
 
1216
1537
  static int sp_path_already_included(const char *canonical) {
1538
+ if (!canonical) return 0;
1217
1539
  for (int i = 0; i < sp_included_count; i++) {
1218
- if (strcmp(sp_included_paths[i], canonical) == 0) return 1;
1540
+ if (sp_included_paths[i] && strcmp(sp_included_paths[i], canonical) == 0) return 1;
1219
1541
  }
1220
1542
  return 0;
1221
1543
  }
1222
1544
 
1223
1545
  static void sp_mark_path_included(const char *canonical) {
1224
1546
  if (sp_included_count >= sp_included_cap) {
1225
- sp_included_cap = sp_included_cap == 0 ? 16 : sp_included_cap * 2;
1226
- sp_included_paths = (char **)realloc(sp_included_paths,
1227
- sizeof(char *) * sp_included_cap);
1547
+ int new_cap = sp_included_cap == 0 ? 16 : sp_included_cap * 2;
1548
+ char **np = (char **)realloc(sp_included_paths, sizeof(char *) * new_cap);
1549
+ if (!np) { fprintf(stderr, "spinel_parse: out of memory\n"); exit(1); }
1550
+ sp_included_paths = np;
1551
+ sp_included_cap = new_cap;
1228
1552
  }
1229
1553
  sp_included_paths[sp_included_count++] = strdup(canonical);
1230
1554
  }
@@ -1242,6 +1566,108 @@ static void sp_includes_free(void) {
1242
1566
  sp_included_cap = 0;
1243
1567
  }
1244
1568
 
1569
+ /* ---- Debug multi-file source map (g_emit_line only) -------------------
1570
+ require/require_relative are resolved by *textual* splicing into one
1571
+ buffer, so a node's Prism line is a line in that concatenated buffer and
1572
+ the original file boundaries are lost. For --debug we recover them: each
1573
+ spliced file's content is wrapped in PUSH/POP marker *comments* (Prism
1574
+ ignores comments, so the AST is unchanged), and a single pass over the
1575
+ final buffer reconstructs, per buffer line, which file and original line
1576
+ it came from. The stack accounting needs no original-line bookkeeping at
1577
+ splice time: a PUSH consumes the parent's (replaced) require line, then
1578
+ content lines count within the child's own coordinates until POP. */
1579
+ #define SP_PUSH_PREFIX "#<SPINEL_PUSH>"
1580
+ #define SP_POP_PREFIX "#<SPINEL_POP>"
1581
+
1582
+ static char **sp_file_table = NULL; /* id -> path */
1583
+ static int sp_file_count = 0, sp_file_cap = 0;
1584
+
1585
+ static int sp_intern_file(const char *path) {
1586
+ for (int i = 0; i < sp_file_count; i++)
1587
+ if (strcmp(sp_file_table[i], path) == 0) return i;
1588
+ if (sp_file_count >= sp_file_cap) {
1589
+ int nc = sp_file_cap == 0 ? 8 : sp_file_cap * 2;
1590
+ char **np = (char **)realloc(sp_file_table, sizeof(char *) * nc);
1591
+ if (!np) { fprintf(stderr, "spinel_parse: out of memory\n"); exit(1); }
1592
+ sp_file_table = np; sp_file_cap = nc;
1593
+ }
1594
+ char *dup_path = strdup(path);
1595
+ if (!dup_path) { fprintf(stderr, "spinel_parse: out of memory\n"); exit(1); }
1596
+ sp_file_table[sp_file_count] = dup_path;
1597
+ return sp_file_count++;
1598
+ }
1599
+
1600
+ /* In debug mode, wrap an included file's (already-resolved) content with
1601
+ PUSH <path> / POP marker lines. Takes ownership of `content`; returns it
1602
+ unchanged when not in debug mode. */
1603
+ static char *sp_wrap_included(char *content, const char *path) {
1604
+ if (!g_emit_line) return content;
1605
+ size_t clen = strlen(content);
1606
+ int need_nl = (clen > 0 && content[clen - 1] != '\n') ? 1 : 0;
1607
+ size_t total = strlen(SP_PUSH_PREFIX) + strlen(path) + 1 + clen + need_nl
1608
+ + strlen(SP_POP_PREFIX) + 1 + 1;
1609
+ char *w = malloc(total + 8);
1610
+ if (!w) { fprintf(stderr, "spinel_parse: out of memory\n"); exit(1); }
1611
+ size_t o = (size_t)sprintf(w, SP_PUSH_PREFIX "%s\n", path);
1612
+ memcpy(w + o, content, clen); o += clen;
1613
+ if (need_nl) w[o++] = '\n';
1614
+ o += (size_t)sprintf(w + o, SP_POP_PREFIX "\n");
1615
+ w[o] = '\0';
1616
+ free(content);
1617
+ return w;
1618
+ }
1619
+
1620
+ /* Reconstruct the line map from the final spliced buffer. toplevel is the
1621
+ path of the outermost file (interned as the initial frame). */
1622
+ static void sp_build_line_map(const char *src, const char *toplevel) {
1623
+ size_t nlines = 1;
1624
+ for (const char *p = src; *p; p++) if (*p == '\n') nlines++;
1625
+ sp_line_map_n = (int)nlines;
1626
+ sp_line_file = (int *)calloc(nlines + 2, sizeof(int));
1627
+ sp_line_orig = (int *)calloc(nlines + 2, sizeof(int));
1628
+
1629
+ int *stk_file = (int *)malloc(sizeof(int) * (nlines + 2));
1630
+ int *stk_next = (int *)malloc(sizeof(int) * (nlines + 2));
1631
+ if (!sp_line_file || !sp_line_orig || !stk_file || !stk_next) {
1632
+ fprintf(stderr, "spinel_parse: out of memory\n"); exit(1);
1633
+ }
1634
+ int sp = 0;
1635
+ stk_file[sp] = sp_intern_file(toplevel);
1636
+ stk_next[sp] = 1;
1637
+
1638
+ int bl = 1;
1639
+ const char *line = src;
1640
+ while (1) {
1641
+ const char *eol = strchr(line, '\n');
1642
+ size_t len = eol ? (size_t)(eol - line) : strlen(line);
1643
+ if (strncmp(line, SP_PUSH_PREFIX, strlen(SP_PUSH_PREFIX)) == 0) {
1644
+ /* The replaced require occupied one parent line: consume it. */
1645
+ if (sp >= 0) stk_next[sp] += 1;
1646
+ char pathbuf[1024];
1647
+ size_t plen = len - strlen(SP_PUSH_PREFIX);
1648
+ if (plen >= sizeof(pathbuf)) plen = sizeof(pathbuf) - 1;
1649
+ memcpy(pathbuf, line + strlen(SP_PUSH_PREFIX), plen);
1650
+ pathbuf[plen] = '\0';
1651
+ sp++;
1652
+ stk_file[sp] = sp_intern_file(pathbuf);
1653
+ stk_next[sp] = 1;
1654
+ /* marker line maps to nothing meaningful */
1655
+ } else if (strncmp(line, SP_POP_PREFIX, strlen(SP_POP_PREFIX)) == 0) {
1656
+ if (sp > 0) sp--;
1657
+ } else {
1658
+ sp_line_file[bl] = stk_file[sp];
1659
+ sp_line_orig[bl] = stk_next[sp];
1660
+ stk_next[sp] += 1;
1661
+ }
1662
+ bl++;
1663
+ if (!eol) break;
1664
+ line = eol + 1;
1665
+ if (*line == '\0') break;
1666
+ }
1667
+ free(stk_file);
1668
+ free(stk_next);
1669
+ }
1670
+
1245
1671
  /* Simple require_relative resolver: replace lines matching
1246
1672
  require_relative "path" with the file content. Files that have
1247
1673
  already been included once are silently skipped on subsequent
@@ -1289,12 +1715,16 @@ static char *resolve_requires(const char *source, const char *source_path) {
1289
1715
  if (!end || end > line_end) { scan_from = pos + 1; continue; }
1290
1716
 
1291
1717
  size_t path_len = end - start;
1718
+ /* Issue #765: bail rather than silently truncating overlong paths
1719
+ into the fixed-size buffers. */
1720
+ if (path_len >= sizeof(((struct {char x[512];}*)0)->x)) { scan_from = pos + 1; continue; }
1292
1721
  char rel_path[512];
1293
1722
  snprintf(rel_path, sizeof(rel_path), "%.*s", (int)path_len, start);
1294
1723
 
1295
1724
  /* Build full path */
1296
1725
  char full_path[1024];
1297
- snprintf(full_path, sizeof(full_path), "%s/%s", dir, rel_path);
1726
+ int fp_n = snprintf(full_path, sizeof(full_path), "%s/%s", dir, rel_path);
1727
+ if (fp_n < 0 || (size_t)fp_n >= sizeof(full_path)) { scan_from = pos + 1; continue; }
1298
1728
  {
1299
1729
  size_t fl = strlen(full_path);
1300
1730
  if (fl < sizeof(full_path) - 4 && (fl < 3 || strcmp(full_path + fl - 3, ".rb") != 0))
@@ -1311,6 +1741,9 @@ static char *resolve_requires(const char *source, const char *source_path) {
1311
1741
  sp_mark_path_included(canonical);
1312
1742
  content = read_file(full_path);
1313
1743
  if (!content) {
1744
+ fprintf(stderr,
1745
+ "warning: require_relative \"%s\" from %s could not be resolved (no such file: %s); the call is ignored\n",
1746
+ rel_path, source_path, full_path);
1314
1747
  content = strdup("# require_relative not found");
1315
1748
  } else {
1316
1749
  /* Recursively resolve */
@@ -1321,6 +1754,10 @@ static char *resolve_requires(const char *source, const char *source_path) {
1321
1754
  free(canonical);
1322
1755
  }
1323
1756
 
1757
+ /* Debug: wrap with PUSH/POP markers so the line map can attribute this
1758
+ file's nodes to the right source. No-op outside --debug. */
1759
+ content = sp_wrap_included(content, full_path);
1760
+
1324
1761
  /* Replace the line */
1325
1762
  size_t line_len = (line_end - pos) + ((*line_end == '\n') ? 1 : 0);
1326
1763
  size_t content_len = strlen(content);
@@ -1344,6 +1781,20 @@ static char *resolve_requires(const char *source, const char *source_path) {
1344
1781
  return result;
1345
1782
  }
1346
1783
 
1784
+ /* A `require "X"` whose X has no bundled lib/X.rb may still be provided
1785
+ natively by the Spinel runtime/codegen (e.g. the JSON module). Such a
1786
+ require is a harmless no-op and must not warn. Bundled .rb libs (set,
1787
+ stringio, strscan, erb, ...) are resolved by file existence and never
1788
+ reach the not-found branch, so they don't belong here -- only the
1789
+ C-native modules that map to a stdlib require name do. */
1790
+ static int sp_lib_is_native(const char *name) {
1791
+ static const char *const natives[] = { "json", NULL };
1792
+ for (int i = 0; natives[i]; i++) {
1793
+ if (strcmp(name, natives[i]) == 0) return 1;
1794
+ }
1795
+ return 0;
1796
+ }
1797
+
1347
1798
  /* ---- Plain require resolution ---- */
1348
1799
  static char *resolve_plain_requires(char *source, const char *exe_path) {
1349
1800
  /* Find lib/ directory relative to this executable */
@@ -1356,10 +1807,20 @@ static char *resolve_plain_requires(char *source, const char *exe_path) {
1356
1807
 
1357
1808
  char *result = source;
1358
1809
  char *pos;
1359
- while ((pos = strstr(result, "\nrequire ")) != NULL ||
1360
- (pos == NULL && result == source && strncmp(result, "require ", 8) == 0 && (pos = result))) {
1361
- if (pos != result) pos++; /* skip \n */
1362
- if (pos != result && *(pos - 1) != '\n') break;
1810
+ /* Match a `require` at the very start of the buffer (offset 0) or
1811
+ immediately after a newline. Re-checking offset 0 every iteration --
1812
+ not just while `result == source` -- is what lets a first-line
1813
+ `require` still be processed when a later `require` exists: once the
1814
+ buffer is rebuilt below, `result != source`, and the old condition
1815
+ stranded the line-1 require. */
1816
+ for (;;) {
1817
+ if (strncmp(result, "require ", 8) == 0) {
1818
+ pos = result;
1819
+ } else {
1820
+ pos = strstr(result, "\nrequire ");
1821
+ if (pos == NULL) break;
1822
+ pos++; /* skip the matched newline */
1823
+ }
1363
1824
  char *line_end = strchr(pos, '\n');
1364
1825
  if (!line_end) line_end = pos + strlen(pos);
1365
1826
 
@@ -1397,7 +1858,16 @@ static char *resolve_plain_requires(char *source, const char *exe_path) {
1397
1858
  free(canonical);
1398
1859
  content = read_file(lib_path);
1399
1860
  if (!content) {
1400
- content = strdup("# require not resolved");
1861
+ if (sp_lib_is_native(lib_name)) {
1862
+ /* Provided natively by the Spinel runtime; the require is a
1863
+ harmless no-op, so don't warn. */
1864
+ content = strdup("# require provided by Spinel runtime");
1865
+ } else {
1866
+ fprintf(stderr,
1867
+ "warning: '%s' is not available in Spinel; the require is ignored and code using it will fail\n",
1868
+ lib_name);
1869
+ content = strdup("# require not resolved");
1870
+ }
1401
1871
  } else {
1402
1872
  char *resolved = resolve_requires(content, lib_path);
1403
1873
  free(content);
@@ -1405,7 +1875,51 @@ static char *resolve_plain_requires(char *source, const char *exe_path) {
1405
1875
  }
1406
1876
  }
1407
1877
 
1408
- size_t line_len = (line_end - pos) + ((*line_end == '\n') ? 1 : 0);
1878
+ /* A trailing same-line modifier (`rescue`, `if`, `unless`, `and`,
1879
+ `&&`, ...) puts the require in expression position: `require 'x'
1880
+ rescue nil`. Replacing it with inlined statements or a comment
1881
+ strands the modifier and Prism reports `unexpected 'rescue'`.
1882
+ Substitute a `nil` expression instead so the modifier attaches;
1883
+ an optional/unavailable require degrades to nil, which is what the
1884
+ `rescue` guards for. `;`, `#`, newline and EOF are statement
1885
+ boundaries, not modifiers, and keep the normal inlining path. */
1886
+ {
1887
+ char *trail = end + 1;
1888
+ while (*trail == ' ' || *trail == '\t') trail++;
1889
+ /* `\r` is part of a CRLF line ending, not a modifier: treat it as a
1890
+ statement boundary so Windows sources keep the normal inlining
1891
+ path. */
1892
+ if (*trail != '\n' && *trail != '\r' && *trail != ';' &&
1893
+ *trail != '\0' && *trail != '#') {
1894
+ free(content);
1895
+ size_t rl_len = (size_t)((end + 1) - pos); /* the `require 'x'` span */
1896
+ size_t result_len = strlen(result);
1897
+ size_t before_len = (size_t)(pos - result);
1898
+ char *new_result = malloc(result_len - rl_len + 4);
1899
+ memcpy(new_result, result, before_len);
1900
+ memcpy(new_result + before_len, "nil", 3);
1901
+ memcpy(new_result + before_len + 3, pos + rl_len,
1902
+ result_len - before_len - rl_len + 1);
1903
+ free(result);
1904
+ result = new_result;
1905
+ continue;
1906
+ }
1907
+ }
1908
+
1909
+ /* Debug: marker-wrap so plain-require'd lib content doesn't corrupt the
1910
+ line map's accounting for code after the require. No-op without --debug. */
1911
+ content = sp_wrap_included(content, lib_path);
1912
+
1913
+ /* Replace only the `require "name"` statement itself, not the whole
1914
+ line, so `require "x"; code` keeps `code`. Consume trailing
1915
+ horizontal whitespace and a single terminating newline (so a
1916
+ require on its own line leaves no blank line); stop at `;` or any
1917
+ other trailing code, which the inserted content's trailing newline
1918
+ then pushes onto its own line. */
1919
+ char *stmt_end = end + 1; /* just past the closing quote */
1920
+ while (*stmt_end == ' ' || *stmt_end == '\t') stmt_end++;
1921
+ if (*stmt_end == '\n') stmt_end++;
1922
+ size_t line_len = stmt_end - pos;
1409
1923
  size_t content_len = strlen(content);
1410
1924
  size_t result_len = strlen(result);
1411
1925
  size_t before_len = pos - result;
@@ -1423,8 +1937,21 @@ static char *resolve_plain_requires(char *source, const char *exe_path) {
1423
1937
  }
1424
1938
 
1425
1939
  /* ---- Syntax sugar rewriting ---- */
1940
+
1941
+ /* Ruby method-name char class: idents, digits, `?` / `!` / `=` suffixes,
1942
+ operator-method chars (`+`, `-`, `*`, etc.), and `[` / `]` for the
1943
+ index operators `[]` and `[]=`. Digits are allowed in the body but
1944
+ the macro rejects digit-leading names (invalid Ruby method syntax). */
1945
+ static int sp_is_method_name_char(char c) {
1946
+ return c == '_' || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') ||
1947
+ (c >= '0' && c <= '9') || c == '?' || c == '!' || c == '+' ||
1948
+ c == '-' || c == '*' || c == '/' || c == '<' || c == '>' ||
1949
+ c == '=' || c == '&' || c == '|' || c == '^' || c == '~' ||
1950
+ c == '%' || c == '[' || c == ']';
1951
+ }
1952
+
1426
1953
  static char *rewrite_syntax_sugar(char *source) {
1427
- /* Rewrite .send(:method, args) → .method(args) */
1954
+ /* Rewrite .send(:foo, args) / .send("foo", args) → .foo(args) */
1428
1955
  /* Rewrite &:symbol → { |_spx| _spx.symbol } */
1429
1956
  size_t len = strlen(source);
1430
1957
  size_t cap = len * 2 + 256;
@@ -1432,68 +1959,184 @@ static char *rewrite_syntax_sugar(char *source) {
1432
1959
  size_t oi = 0;
1433
1960
  size_t i = 0;
1434
1961
 
1435
- #define OUT_CHAR(c) do { if (oi >= cap - 1) { cap *= 2; out = realloc(out, cap); } out[oi++] = (c); } while(0)
1962
+ #define OUT_CHAR(c) do { if (oi >= cap - 1) { size_t _nc = cap * 2; char *_no = realloc(out, _nc); if (!_no) { fprintf(stderr, "spinel_parse: out of memory\n"); exit(1); } out = _no; cap = _nc; } out[oi++] = (c); } while(0)
1436
1963
  #define OUT_STR(s) do { const char *_s = (s); while (*_s) { OUT_CHAR(*_s); _s++; } } while(0)
1437
1964
 
1965
+ /* Rewrite one .send(:foo / .send("foo dispatch. `string_form` is 1
1966
+ for the double-quoted variant (requires a closing `"`) and 0 for
1967
+ the colon-symbol variant. On mismatch (empty / digit-leading
1968
+ name, unclosed quote), emits the prefix verbatim and advances
1969
+ past it so the outer loop resumes scanning. The args copy tracks
1970
+ `"..."` and `'...'` state with `\` escape skipping so parens
1971
+ inside string literals do not prematurely close the call. */
1972
+ #define REWRITE_SEND_CALL(prefix_str, prefix_len, string_form) do { \
1973
+ size_t _save_i = i; \
1974
+ i += (prefix_len); \
1975
+ size_t _ns = i; \
1976
+ while (i < len && sp_is_method_name_char(source[i])) i++; \
1977
+ size_t _name_len = i - _ns; \
1978
+ int _ok = (_name_len > 0); \
1979
+ /* Reject digit-leading names: `.123foo()` is not valid Ruby. */ \
1980
+ if (_ok && source[_ns] >= '0' && source[_ns] <= '9') { _ok = 0; } \
1981
+ if (_ok && (string_form)) { \
1982
+ if (i >= len || source[i] != '"') { _ok = 0; } \
1983
+ else { i++; /* skip closing quote */ } \
1984
+ } \
1985
+ if (!_ok) { i = _save_i; OUT_STR(prefix_str); i += (prefix_len); } \
1986
+ else { \
1987
+ OUT_CHAR('.'); \
1988
+ { size_t _k; for (_k = 0; _k < _name_len; _k++) OUT_CHAR(source[_ns + _k]); } \
1989
+ if (i < len && source[i] == ')') { \
1990
+ i++; /* no args */ \
1991
+ } else if (i < len && source[i] == ',') { \
1992
+ i++; \
1993
+ while (i < len && source[i] == ' ') i++; \
1994
+ OUT_CHAR('('); \
1995
+ { int _depth = 1; char _qc = 0; \
1996
+ while (i < len && _depth > 0) { \
1997
+ char _ac = source[i]; \
1998
+ if (_qc != 0) { \
1999
+ /* Inside string: `\` escapes next char, skip it as a pair. */ \
2000
+ if (_ac == '\\' && i + 1 < len) { \
2001
+ OUT_CHAR(_ac); OUT_CHAR(source[i + 1]); i += 2; continue; \
2002
+ } \
2003
+ if (_ac == _qc) _qc = 0; \
2004
+ OUT_CHAR(_ac); i++; continue; \
2005
+ } \
2006
+ if (_ac == '"' || _ac == '\'') { _qc = _ac; OUT_CHAR(_ac); i++; continue; } \
2007
+ if (_ac == '(') _depth++; \
2008
+ else if (_ac == ')') { _depth--; if (_depth == 0) { i++; break; } } \
2009
+ OUT_CHAR(_ac); i++; \
2010
+ } } \
2011
+ OUT_CHAR(')'); \
2012
+ } \
2013
+ } \
2014
+ } while(0)
2015
+
1438
2016
  while (i < len) {
1439
- /* .send(:symbol ...) */
2017
+ /* .send(:foo, args) → .foo(args) */
1440
2018
  if (i + 7 < len && strncmp(source + i, ".send(:", 7) == 0) {
1441
- i += 7; /* skip .send(: */
1442
- /* Extract method name */
1443
- size_t ns = i;
1444
- while (i < len && (source[i] == '_' || (source[i] >= 'a' && source[i] <= 'z') ||
1445
- (source[i] >= 'A' && source[i] <= 'Z') || (source[i] >= '0' && source[i] <= '9') ||
1446
- source[i] == '?' || source[i] == '!' || source[i] == '+' || source[i] == '-' ||
1447
- source[i] == '*' || source[i] == '/' || source[i] == '<' || source[i] == '>' ||
1448
- source[i] == '=' || source[i] == '&' || source[i] == '|' || source[i] == '^' ||
1449
- source[i] == '~' || source[i] == '%')) i++;
1450
- size_t name_len = i - ns;
1451
- if (name_len > 0) {
1452
- OUT_CHAR('.');
1453
- size_t k; for (k = 0; k < name_len; k++) OUT_CHAR(source[ns + k]);
1454
- /* Skip optional comma + space, then copy remaining args until ) */
1455
- if (i < len && source[i] == ')') {
1456
- i++; /* no args */
1457
- } else if (i < len && source[i] == ',') {
1458
- i++; /* skip comma */
1459
- while (i < len && source[i] == ' ') i++;
1460
- OUT_CHAR('(');
1461
- /* Copy args until matching ) */
1462
- int depth = 1;
1463
- while (i < len && depth > 0) {
1464
- if (source[i] == '(') depth++;
1465
- else if (source[i] == ')') { depth--; if (depth == 0) { i++; break; } }
1466
- OUT_CHAR(source[i]); i++;
1467
- }
1468
- OUT_CHAR(')');
1469
- }
1470
- continue;
1471
- }
1472
- /* Failed to parse, output original */
1473
- OUT_STR(".send(:");
2019
+ REWRITE_SEND_CALL(".send(:", 7, 0);
2020
+ continue;
2021
+ }
2022
+ /* .send("foo", args) .foo(args). Plain string literal only;
2023
+ interpolated strings parse as InterpolatedStringNode and are
2024
+ left untouched (Spinel can't resolve the name statically). */
2025
+ if (i + 7 < len && strncmp(source + i, ".send(\"", 7) == 0) {
2026
+ REWRITE_SEND_CALL(".send(\"", 7, 1);
1474
2027
  continue;
1475
2028
  }
1476
- /* (&:symbol) → { |_spx| _spx.symbol } — also remove enclosing parens */
2029
+ /* .__send__(:foo, args) → .foo(args). CRuby's overrides-resistant
2030
+ alias of send; semantically identical for Spinel's static dispatch. */
2031
+ if (i + 11 < len && strncmp(source + i, ".__send__(:", 11) == 0) {
2032
+ REWRITE_SEND_CALL(".__send__(:", 11, 0);
2033
+ continue;
2034
+ }
2035
+ /* .__send__("foo", args) → .foo(args). String-form variant. */
2036
+ if (i + 11 < len && strncmp(source + i, ".__send__(\"", 11) == 0) {
2037
+ REWRITE_SEND_CALL(".__send__(\"", 11, 1);
2038
+ continue;
2039
+ }
2040
+ /* .public_send(:foo, args) → .foo(args). Visibility isn't modeled
2041
+ in Spinel's static dispatch -- public_send is semantically
2042
+ identical to send. Issue #735. */
2043
+ if (i + 14 < len && strncmp(source + i, ".public_send(:", 14) == 0) {
2044
+ REWRITE_SEND_CALL(".public_send(:", 14, 0);
2045
+ continue;
2046
+ }
2047
+ if (i + 14 < len && strncmp(source + i, ".public_send(\"", 14) == 0) {
2048
+ REWRITE_SEND_CALL(".public_send(\"", 14, 1);
2049
+ continue;
2050
+ }
2051
+ /* `&:symbol` symbol-to-proc. Prism parses `&:sym` natively, but
2052
+ Spinel only lowers the native BlockArgumentNode+SymbolNode shape
2053
+ for a few methods (inject / reduce / sort_by); general block
2054
+ takers rely on this textual rewrite to an explicit block. The
2055
+ block has to land where Ruby reads it as a block, not a hash:
2056
+ - sole parenthesized arg `m(&:s)` -> `m { |_spx| _spx.s }`
2057
+ - after a positional, paren call
2058
+ `m(a, &:s)` -> `m(a) { |_spx| _spx.s }`
2059
+ - after a positional, command call
2060
+ `m a, &:s` -> `m a do |_spx| _spx.s end`
2061
+ - command-position sole arg `m &:s` -> `m { |_spx| _spx.s }`
2062
+ The bare `{ |_spx| ... }` was only correct in block position; a
2063
+ `,`-prefixed brace parses as a hash literal, which was the bundler
2064
+ (`File.open(f, "r:UTF-8", &:read)`) / minitest
2065
+ (`define_method :mu_pp, &:pretty_inspect`) parse failure.
2066
+
2067
+ Operator symbols (`&:+`) have name_len 0 here and are left for
2068
+ Prism's native path (the arith reduce/inject lowering handles
2069
+ them). Known limitation: a paren-less command carrying a
2070
+ symbol-proc that is itself nested as an argument inside a paren
2071
+ call -- `p(foo :a, &:s)` -- mis-binds the block to the outer
2072
+ call, because textually its args sit at the same paren depth as
2073
+ the enclosing call (indistinguishable without re-implementing
2074
+ Ruby's command/arg disambiguation). Neither target gem hits
2075
+ this; a robust fix is an AST-level lowering, deferred. */
1477
2076
  if (i + 2 < len && source[i] == '&' && source[i + 1] == ':') {
1478
- /* Check if preceded by ( and remove it */
1479
- int had_paren = 0;
1480
- if (oi > 0 && out[oi - 1] == '(') { oi--; had_paren = 1; }
2077
+ /* Last emitted non-space char. Skip newlines too so a multi-line
2078
+ `m(a,\n &:s)` still sees the comma. */
2079
+ size_t back = oi;
2080
+ while (back > 0 && (out[back - 1] == ' ' || out[back - 1] == '\t' ||
2081
+ out[back - 1] == '\n' || out[back - 1] == '\r')) back--;
2082
+ char prev = (back > 0) ? out[back - 1] : '\0';
1481
2083
  i += 2;
1482
2084
  size_t ns = i;
1483
2085
  while (i < len && (source[i] == '_' || (source[i] >= 'a' && source[i] <= 'z') ||
1484
2086
  (source[i] >= 'A' && source[i] <= 'Z') || (source[i] >= '0' && source[i] <= '9') ||
1485
2087
  source[i] == '?' || source[i] == '!')) i++;
1486
2088
  size_t name_len = i - ns;
1487
- if (name_len > 0) {
1488
- /* Skip closing paren if we removed opening */
1489
- if (had_paren && i < len && source[i] == ')') i++;
2089
+ if (name_len == 0) {
2090
+ /* Operator / empty symbol: leave `&:` for Prism's native path. */
2091
+ OUT_STR("&:");
2092
+ continue;
2093
+ }
2094
+ if (prev == '(') {
2095
+ /* Sole parenthesized arg: drop the `(` (and any trailing ws)
2096
+ and the matching `)` so the block binds paren-less. #792:
2097
+ tolerate whitespace before the `)`. Restore `i` if no `)`
2098
+ follows so trailing content isn't swallowed. */
2099
+ oi = back - 1;
2100
+ size_t after_sym = i;
2101
+ while (i < len && (source[i] == ' ' || source[i] == '\t' ||
2102
+ source[i] == '\n' || source[i] == '\r')) i++;
2103
+ if (i < len && source[i] == ')') i++;
2104
+ else i = after_sym;
1490
2105
  OUT_STR(" { |_spx| _spx.");
1491
- size_t k; for (k = 0; k < name_len; k++) OUT_CHAR(source[ns + k]);
2106
+ { size_t k; for (k = 0; k < name_len; k++) OUT_CHAR(source[ns + k]); }
1492
2107
  OUT_STR(" }");
1493
2108
  continue;
1494
2109
  }
1495
- if (had_paren) OUT_CHAR('('); /* restore if failed */
1496
- OUT_STR("&:");
2110
+ if (prev == ',') {
2111
+ /* After a positional arg. Drop the separating comma and
2112
+ relocate the block: a parenthesized call closes first then
2113
+ takes a brace block; a command call takes a trailing do..end
2114
+ (a brace would still read as a hash). Only consume up to the
2115
+ `)`; otherwise restore `i` so the newline/`end` that follows
2116
+ a paren-less command is preserved. */
2117
+ oi = back - 1;
2118
+ size_t after_sym = i;
2119
+ while (i < len && (source[i] == ' ' || source[i] == '\t' ||
2120
+ source[i] == '\n' || source[i] == '\r')) i++;
2121
+ if (i < len && source[i] == ')') {
2122
+ i++;
2123
+ OUT_CHAR(')');
2124
+ OUT_STR(" { |_spx| _spx.");
2125
+ { size_t k; for (k = 0; k < name_len; k++) OUT_CHAR(source[ns + k]); }
2126
+ OUT_STR(" }");
2127
+ } else {
2128
+ i = after_sym;
2129
+ OUT_STR(" do |_spx| _spx.");
2130
+ { size_t k; for (k = 0; k < name_len; k++) OUT_CHAR(source[ns + k]); }
2131
+ OUT_STR(" end");
2132
+ }
2133
+ continue;
2134
+ }
2135
+ /* Command-position sole arg (`m &:s`): the brace binds as a
2136
+ block (no comma precedes it). */
2137
+ OUT_STR(" { |_spx| _spx.");
2138
+ { size_t k; for (k = 0; k < name_len; k++) OUT_CHAR(source[ns + k]); }
2139
+ OUT_STR(" }");
1497
2140
  continue;
1498
2141
  }
1499
2142
  OUT_CHAR(source[i]);
@@ -1520,11 +2163,51 @@ int main(int argc, char **argv) {
1520
2163
  return 1;
1521
2164
  }
1522
2165
 
2166
+ /* Set the debug flag before resolving requires so the resolvers insert the
2167
+ PUSH/POP markers used to rebuild the multi-file source map. */
2168
+ {
2169
+ const char *dbg = getenv("SPINEL_DEBUG");
2170
+ const char *lm = getenv("SPINEL_LINE_MAP");
2171
+ int on = (dbg != NULL && dbg[0] == '1' && dbg[1] == '\0')
2172
+ || (lm != NULL && lm[0] == '1' && lm[1] == '\0');
2173
+ g_emit_line = on ? 1 : 0;
2174
+ }
2175
+
1523
2176
  /* Resolve require_relative and plain require */
1524
2177
  char *resolved = resolve_requires(source, source_file);
1525
2178
  free(source);
1526
2179
  source = resolve_plain_requires(resolved, argv[0]);
2180
+
2181
+ /* Debug: build the buffer-line -> (file, original line) map from the
2182
+ marker-annotated buffer *before* syntax-sugar rewriting (which could
2183
+ touch a marker line's text). Sugar preserves line count, so the map
2184
+ stays aligned with the parsed node lines; if that ever fails to hold,
2185
+ disable the map rather than emit wrong attributions. */
2186
+ char *premap = NULL;
2187
+ if (g_emit_line) {
2188
+ premap = strdup(source);
2189
+ if (!premap) { fprintf(stderr, "spinel_parse: out of memory\n"); exit(1); }
2190
+ }
1527
2191
  source = rewrite_syntax_sugar(source);
2192
+ if (g_emit_line) {
2193
+ size_t la = 1, lb = 1;
2194
+ for (const char *p = premap; *p; p++) if (*p == '\n') la++;
2195
+ for (const char *p = source; *p; p++) if (*p == '\n') lb++;
2196
+ if (la == lb) {
2197
+ sp_build_line_map(premap, source_file);
2198
+ } else {
2199
+ /* Multi-file line attribution unavailable for this program; #line
2200
+ falls back to buffer lines. Only worth a word under an explicit
2201
+ --debug build (faithful stepping matters there); stay silent for
2202
+ the default line-map so normal builds aren't noisy. */
2203
+ const char *dbg = getenv("SPINEL_DEBUG");
2204
+ if (dbg != NULL && dbg[0] == '1' && dbg[1] == '\0') {
2205
+ fprintf(stderr, "spinel_parse: multi-file line map disabled "
2206
+ "(syntax-sugar changed line count)\n");
2207
+ }
2208
+ }
2209
+ free(premap);
2210
+ }
1528
2211
 
1529
2212
  size_t source_len = strlen(source);
1530
2213
 
@@ -1539,9 +2222,12 @@ int main(int argc, char **argv) {
1539
2222
  for (diag = (pm_diagnostic_t *)parser.error_list.head; diag; diag = (pm_diagnostic_t *)diag->node.next) {
1540
2223
  fprintf(stderr, " %s\n", diag->message);
1541
2224
  }
2225
+ /* Issue #764: free the registered include paths on the parse-
2226
+ error exit path too. */
1542
2227
  pm_node_destroy(&parser, root);
1543
2228
  pm_parser_free(&parser);
1544
2229
  free(source);
2230
+ sp_includes_free();
1545
2231
  return 1;
1546
2232
  }
1547
2233
 
@@ -1563,12 +2249,36 @@ int main(int argc, char **argv) {
1563
2249
  out = fopen(argv[2], "wb");
1564
2250
  if (!out) {
1565
2251
  fprintf(stderr, "spinel_parse: cannot write '%s'\n", argv[2]);
2252
+ /* Issue #764: clean up before bailing on the output-open
2253
+ failure. We've allocated source, g_source_file_escaped,
2254
+ lines[], plus parser/root, and registered sp_included_paths
2255
+ entries -- free all to avoid leaking on the way out. */
2256
+ for (size_t i = 0; i < line_count; i++) free(lines[i]);
2257
+ free(lines);
2258
+ pm_node_destroy(&parser, root);
2259
+ pm_parser_free(&parser);
2260
+ free(source);
2261
+ free(g_source_file_escaped);
2262
+ g_source_file_escaped = NULL;
2263
+ sp_includes_free();
1566
2264
  return 1;
1567
2265
  }
1568
2266
  }
1569
2267
 
1570
2268
  fprintf(out, "ROOT %d\n", root_id);
1571
- for (int i = 0; i < line_count; i++) {
2269
+ /* Issue #878: emit the source file path as a top-level fact so
2270
+ `__dir__` and similar compile-time helpers can recover it
2271
+ even when the source contains no `__FILE__` reference. The
2272
+ loader stashes it in @source_file_path. */
2273
+ fprintf(out, "SOURCE_FILE %s\n", g_source_file_escaped);
2274
+ /* Debug multi-file map: emit the id -> path table so codegen can resolve
2275
+ each node's `node_file` id to a path for its `#line` directive. */
2276
+ for (int i = 0; i < sp_file_count; i++) {
2277
+ char *esc = escape_str((const uint8_t *)sp_file_table[i], strlen(sp_file_table[i]));
2278
+ fprintf(out, "FILE %d %s\n", i, esc);
2279
+ free(esc);
2280
+ }
2281
+ for (size_t i = 0; i < line_count; i++) {
1572
2282
  fprintf(out, "%s\n", lines[i]);
1573
2283
  free(lines[i]);
1574
2284
  }