rubyduino 0.1.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 (735) hide show
  1. checksums.yaml +7 -0
  2. data/.gitmodules +3 -0
  3. data/CHANGELOG.md +9 -0
  4. data/LICENSE.txt +21 -0
  5. data/README.md +72 -0
  6. data/Rakefile +12 -0
  7. data/bin/rubyduino +186 -0
  8. data/examples/hello.rb +9 -0
  9. data/lib/rubyduino/arduino_entry.c +9 -0
  10. data/lib/rubyduino/sp_runtime.h +159 -0
  11. data/lib/rubyduino/spinel.rb +8 -0
  12. data/lib/rubyduino/spinel_arduino_codegen.rb +129 -0
  13. data/lib/rubyduino/version.rb +5 -0
  14. data/lib/rubyduino.rb +9 -0
  15. data/sig/rubyduino.rbs +4 -0
  16. data/vendor/spinel/AUTHORS +1 -0
  17. data/vendor/spinel/LICENSE +19 -0
  18. data/vendor/spinel/Makefile +406 -0
  19. data/vendor/spinel/POLY-AS-SET.md +217 -0
  20. data/vendor/spinel/README.md +409 -0
  21. data/vendor/spinel/benchmark/bm_ackermann.rb +12 -0
  22. data/vendor/spinel/benchmark/bm_ao_render.rb +323 -0
  23. data/vendor/spinel/benchmark/bm_attr_accessor.rb +41 -0
  24. data/vendor/spinel/benchmark/bm_bigint_fib.rb +10 -0
  25. data/vendor/spinel/benchmark/bm_binary_trees.rb +53 -0
  26. data/vendor/spinel/benchmark/bm_csv_process.rb +58 -0
  27. data/vendor/spinel/benchmark/bm_fannkuch.rb +88 -0
  28. data/vendor/spinel/benchmark/bm_fasta.rb +87 -0
  29. data/vendor/spinel/benchmark/bm_fib.rb +9 -0
  30. data/vendor/spinel/benchmark/bm_gcbench.rb +73 -0
  31. data/vendor/spinel/benchmark/bm_getivar.rb +34 -0
  32. data/vendor/spinel/benchmark/bm_getivar_module.rb +34 -0
  33. data/vendor/spinel/benchmark/bm_huffman.rb +141 -0
  34. data/vendor/spinel/benchmark/bm_inline.rb +68 -0
  35. data/vendor/spinel/benchmark/bm_io_wordcount.rb +57 -0
  36. data/vendor/spinel/benchmark/bm_json_parse.rb +157 -0
  37. data/vendor/spinel/benchmark/bm_keyword_args.rb +23 -0
  38. data/vendor/spinel/benchmark/bm_life.rb +70 -0
  39. data/vendor/spinel/benchmark/bm_linked_list.rb +75 -0
  40. data/vendor/spinel/benchmark/bm_loops_times.rb +16 -0
  41. data/vendor/spinel/benchmark/bm_mandel_term.rb +34 -0
  42. data/vendor/spinel/benchmark/bm_matmul.rb +42 -0
  43. data/vendor/spinel/benchmark/bm_nbody.rb +115 -0
  44. data/vendor/spinel/benchmark/bm_nested_loop.rb +29 -0
  45. data/vendor/spinel/benchmark/bm_nqueens.rb +46 -0
  46. data/vendor/spinel/benchmark/bm_object_new.rb +21 -0
  47. data/vendor/spinel/benchmark/bm_object_new_init.rb +21 -0
  48. data/vendor/spinel/benchmark/bm_object_new_no_escape.rb +28 -0
  49. data/vendor/spinel/benchmark/bm_partial_sums.rb +38 -0
  50. data/vendor/spinel/benchmark/bm_pidigits.rb +31 -0
  51. data/vendor/spinel/benchmark/bm_rbtree.rb +100 -0
  52. data/vendor/spinel/benchmark/bm_ruby_xor.rb +28 -0
  53. data/vendor/spinel/benchmark/bm_send_bmethod.rb +31 -0
  54. data/vendor/spinel/benchmark/bm_send_cfunc_block.rb +18 -0
  55. data/vendor/spinel/benchmark/bm_send_rubyfunc_block.rb +23 -0
  56. data/vendor/spinel/benchmark/bm_setivar.rb +33 -0
  57. data/vendor/spinel/benchmark/bm_setivar_object.rb +33 -0
  58. data/vendor/spinel/benchmark/bm_setivar_young.rb +37 -0
  59. data/vendor/spinel/benchmark/bm_sieve.rb +23 -0
  60. data/vendor/spinel/benchmark/bm_so_lists.rb +47 -0
  61. data/vendor/spinel/benchmark/bm_so_mandelbrot.rb +65 -0
  62. data/vendor/spinel/benchmark/bm_spectral_norm.rb +71 -0
  63. data/vendor/spinel/benchmark/bm_splay.rb +128 -0
  64. data/vendor/spinel/benchmark/bm_str_concat.rb +15 -0
  65. data/vendor/spinel/benchmark/bm_structaref.rb +25 -0
  66. data/vendor/spinel/benchmark/bm_structaset.rb +24 -0
  67. data/vendor/spinel/benchmark/bm_sudoku.rb +217 -0
  68. data/vendor/spinel/benchmark/bm_tak.rb +10 -0
  69. data/vendor/spinel/benchmark/bm_tarai.rb +10 -0
  70. data/vendor/spinel/benchmark/bm_template.rb +50 -0
  71. data/vendor/spinel/benchmark/bm_throw.rb +25 -0
  72. data/vendor/spinel/benchmark/bm_wordfreq.rb +43 -0
  73. data/vendor/spinel/docs/FFI.md +198 -0
  74. data/vendor/spinel/examples/ffi/libm/README.md +24 -0
  75. data/vendor/spinel/examples/ffi/libm/libm.rb +17 -0
  76. data/vendor/spinel/examples/ffi/sqlite/README.md +73 -0
  77. data/vendor/spinel/examples/ffi/sqlite/blog.rb +185 -0
  78. data/vendor/spinel/examples/ffi/sqlite/sqlite3_lib.rb +46 -0
  79. data/vendor/spinel/lib/erb.rb +19 -0
  80. data/vendor/spinel/lib/forwardable.rb +8 -0
  81. data/vendor/spinel/lib/mruby_shim.h +118 -0
  82. data/vendor/spinel/lib/optparse.rb +123 -0
  83. data/vendor/spinel/lib/regexp/re_compile.c +979 -0
  84. data/vendor/spinel/lib/regexp/re_exec.c +665 -0
  85. data/vendor/spinel/lib/regexp/re_internal.h +146 -0
  86. data/vendor/spinel/lib/regexp/re_utf8.c +76 -0
  87. data/vendor/spinel/lib/set.rb +12 -0
  88. data/vendor/spinel/lib/sp_bigint.c +5400 -0
  89. data/vendor/spinel/lib/sp_bigint.h +117 -0
  90. data/vendor/spinel/lib/sp_runtime.h +1361 -0
  91. data/vendor/spinel/lib/stringio.c +286 -0
  92. data/vendor/spinel/lib/stringio.rb +5 -0
  93. data/vendor/spinel/lib/strscan.c +170 -0
  94. data/vendor/spinel/lib/strscan.rb +55 -0
  95. data/vendor/spinel/spinel +191 -0
  96. data/vendor/spinel/spinel.bat +158 -0
  97. data/vendor/spinel/spinel_codegen.rb +39906 -0
  98. data/vendor/spinel/spinel_parse +0 -0
  99. data/vendor/spinel/spinel_parse.c +1586 -0
  100. data/vendor/spinel/test/alias_global.rb +16 -0
  101. data/vendor/spinel/test/alias_global.rb.expected +3 -0
  102. data/vendor/spinel/test/alias_method.rb +28 -0
  103. data/vendor/spinel/test/alias_method.rb.expected +5 -0
  104. data/vendor/spinel/test/and_node_poly_operand.rb +24 -0
  105. data/vendor/spinel/test/anon_block_forward.rb +47 -0
  106. data/vendor/spinel/test/anon_block_forward.rb.expected +4 -0
  107. data/vendor/spinel/test/array_3d_nested.rb +48 -0
  108. data/vendor/spinel/test/array_clear_typed.rb +40 -0
  109. data/vendor/spinel/test/array_clear_typed.rb.expected +7 -0
  110. data/vendor/spinel/test/array_concat.rb +18 -0
  111. data/vendor/spinel/test/array_concat.rb.expected +2 -0
  112. data/vendor/spinel/test/array_each_with_object.rb +17 -0
  113. data/vendor/spinel/test/array_each_with_object.rb.expected +2 -0
  114. data/vendor/spinel/test/array_fill_poly.rb +17 -0
  115. data/vendor/spinel/test/array_flat_map.rb +16 -0
  116. data/vendor/spinel/test/array_flat_map.rb.expected +2 -0
  117. data/vendor/spinel/test/array_keyed_hash_int_array_eql.rb +29 -0
  118. data/vendor/spinel/test/array_keyed_hash_int_array_eql.rb.expected +6 -0
  119. data/vendor/spinel/test/array_method_name_clash.rb +15 -0
  120. data/vendor/spinel/test/array_method_name_clash.rb.expected +1 -0
  121. data/vendor/spinel/test/array_new_block_typed_container.rb +37 -0
  122. data/vendor/spinel/test/array_new_block_typed_container.rb.expected +7 -0
  123. data/vendor/spinel/test/array_new_empty_inner_deferred.rb +47 -0
  124. data/vendor/spinel/test/array_new_empty_inner_deferred.rb.expected +8 -0
  125. data/vendor/spinel/test/array_partition_gc.rb +20 -0
  126. data/vendor/spinel/test/array_partition_gc.rb.expected +3 -0
  127. data/vendor/spinel/test/array_plus.rb +18 -0
  128. data/vendor/spinel/test/array_plus.rb.expected +2 -0
  129. data/vendor/spinel/test/array_rotate_bang.rb +54 -0
  130. data/vendor/spinel/test/array_rotate_bang.rb.expected +34 -0
  131. data/vendor/spinel/test/array_shuffle_ptr.rb +11 -0
  132. data/vendor/spinel/test/array_shuffle_ptr.rb.expected +1 -0
  133. data/vendor/spinel/test/array_slice_bang.rb +81 -0
  134. data/vendor/spinel/test/array_slice_bang.rb.expected +40 -0
  135. data/vendor/spinel/test/attr.rb +77 -0
  136. data/vendor/spinel/test/attr.rb.expected +9 -0
  137. data/vendor/spinel/test/attr_writer_poly_box.rb +24 -0
  138. data/vendor/spinel/test/attr_writer_poly_no_double_eval.rb +29 -0
  139. data/vendor/spinel/test/attr_writer_poly_no_double_eval.rb.expected +3 -0
  140. data/vendor/spinel/test/attr_writer_returns_rhs.rb +23 -0
  141. data/vendor/spinel/test/auto_unbox_keeps_int_slot.rb +38 -0
  142. data/vendor/spinel/test/auto_unbox_keeps_int_slot.rb.expected +3 -0
  143. data/vendor/spinel/test/auto_unbox_poly_to_int_local.rb +36 -0
  144. data/vendor/spinel/test/auto_unbox_poly_to_int_local.rb.expected +2 -0
  145. data/vendor/spinel/test/back_ref.rb +21 -0
  146. data/vendor/spinel/test/back_ref.rb.expected +6 -0
  147. data/vendor/spinel/test/bare_return_in_cls_method.rb +46 -0
  148. data/vendor/spinel/test/bare_return_in_cls_method.rb.expected +2 -0
  149. data/vendor/spinel/test/bare_return_in_initialize.rb +55 -0
  150. data/vendor/spinel/test/bare_return_in_initialize.rb.expected +4 -0
  151. data/vendor/spinel/test/bare_return_in_poly_method.rb +26 -0
  152. data/vendor/spinel/test/bare_return_in_poly_method.rb.expected +2 -0
  153. data/vendor/spinel/test/bigint_div_by_zero.rb +43 -0
  154. data/vendor/spinel/test/bigint_div_by_zero.rb.expected +3 -0
  155. data/vendor/spinel/test/block2.rb +31 -0
  156. data/vendor/spinel/test/block2.rb.expected +4 -0
  157. data/vendor/spinel/test/block_forward_block_arg.rb +60 -0
  158. data/vendor/spinel/test/block_forward_block_arg.rb.expected +4 -0
  159. data/vendor/spinel/test/block_forward_recv_typed.rb +82 -0
  160. data/vendor/spinel/test/block_forward_recv_typed.rb.expected +11 -0
  161. data/vendor/spinel/test/block_forward_self_call.rb +61 -0
  162. data/vendor/spinel/test/block_forward_self_call.rb.expected +6 -0
  163. data/vendor/spinel/test/block_given_block_param.rb +46 -0
  164. data/vendor/spinel/test/block_given_block_param.rb.expected +3 -0
  165. data/vendor/spinel/test/block_param_shadow.rb +246 -0
  166. data/vendor/spinel/test/block_param_shadow.rb.expected +71 -0
  167. data/vendor/spinel/test/bm_instance_eval.rb +209 -0
  168. data/vendor/spinel/test/bm_instance_eval.rb.expected +27 -0
  169. data/vendor/spinel/test/bound_method_array.rb +22 -0
  170. data/vendor/spinel/test/bound_method_array.rb.expected +4 -0
  171. data/vendor/spinel/test/bound_method_basic.rb +27 -0
  172. data/vendor/spinel/test/bound_method_basic.rb.expected +2 -0
  173. data/vendor/spinel/test/bound_method_gc.rb +30 -0
  174. data/vendor/spinel/test/bound_method_gc.rb.expected +1 -0
  175. data/vendor/spinel/test/bound_method_obj_recv.rb +41 -0
  176. data/vendor/spinel/test/bound_method_obj_recv.rb.expected +4 -0
  177. data/vendor/spinel/test/bound_method_single_eval.rb +37 -0
  178. data/vendor/spinel/test/bound_method_single_eval.rb.expected +4 -0
  179. data/vendor/spinel/test/box_pointer_to_poly.rb +27 -0
  180. data/vendor/spinel/test/box_pointer_to_poly.rb.expected +1 -0
  181. data/vendor/spinel/test/box_unbox_local_assign_cond.rb +22 -0
  182. data/vendor/spinel/test/box_unbox_local_assign_cond.rb.expected +2 -0
  183. data/vendor/spinel/test/bundle_array_a.rb +400 -0
  184. data/vendor/spinel/test/bundle_array_a.rb.expected +117 -0
  185. data/vendor/spinel/test/bundle_array_b.rb +369 -0
  186. data/vendor/spinel/test/bundle_array_b.rb.expected +136 -0
  187. data/vendor/spinel/test/bundle_array_c.rb +146 -0
  188. data/vendor/spinel/test/bundle_array_c.rb.expected +51 -0
  189. data/vendor/spinel/test/bundle_array_d.rb +181 -0
  190. data/vendor/spinel/test/bundle_array_d.rb.expected +66 -0
  191. data/vendor/spinel/test/bundle_hash.rb +328 -0
  192. data/vendor/spinel/test/bundle_hash.rb.expected +104 -0
  193. data/vendor/spinel/test/bundle_int_array.rb +125 -0
  194. data/vendor/spinel/test/bundle_int_array.rb.expected +24 -0
  195. data/vendor/spinel/test/bundle_integer.rb +248 -0
  196. data/vendor/spinel/test/bundle_integer.rb.expected +113 -0
  197. data/vendor/spinel/test/bundle_io_sys.rb +223 -0
  198. data/vendor/spinel/test/bundle_io_sys.rb.expected +62 -0
  199. data/vendor/spinel/test/bundle_misc_a.rb +462 -0
  200. data/vendor/spinel/test/bundle_misc_a.rb.expected +208 -0
  201. data/vendor/spinel/test/bundle_misc_b.rb +401 -0
  202. data/vendor/spinel/test/bundle_misc_b.rb.expected +120 -0
  203. data/vendor/spinel/test/bundle_poly.rb +145 -0
  204. data/vendor/spinel/test/bundle_poly.rb.expected +66 -0
  205. data/vendor/spinel/test/bundle_string_a.rb +278 -0
  206. data/vendor/spinel/test/bundle_string_a.rb.expected +93 -0
  207. data/vendor/spinel/test/bundle_string_b.rb +226 -0
  208. data/vendor/spinel/test/bundle_string_b.rb.expected +83 -0
  209. data/vendor/spinel/test/bundle_sym.rb +302 -0
  210. data/vendor/spinel/test/bundle_sym.rb.expected +117 -0
  211. data/vendor/spinel/test/call_and_write.rb +28 -0
  212. data/vendor/spinel/test/call_and_write.rb.expected +3 -0
  213. data/vendor/spinel/test/call_arg_int_to_obj_cast.rb +55 -0
  214. data/vendor/spinel/test/call_arg_int_to_obj_cast.rb.expected +1 -0
  215. data/vendor/spinel/test/call_op_write.rb +51 -0
  216. data/vendor/spinel/test/call_op_write.rb.expected +11 -0
  217. data/vendor/spinel/test/call_or_write.rb +35 -0
  218. data/vendor/spinel/test/call_or_write.rb.expected +3 -0
  219. data/vendor/spinel/test/case.rb +43 -0
  220. data/vendor/spinel/test/case.rb.expected +10 -0
  221. data/vendor/spinel/test/case_string_when_sym_no_match.rb +59 -0
  222. data/vendor/spinel/test/case_string_when_sym_no_match.rb.expected +7 -0
  223. data/vendor/spinel/test/case_when_class.rb +70 -0
  224. data/vendor/spinel/test/case_when_class.rb.expected +5 -0
  225. data/vendor/spinel/test/chained_attr_setter.rb +55 -0
  226. data/vendor/spinel/test/chained_ivar_op_assign_emits_inner_write.rb +28 -0
  227. data/vendor/spinel/test/chained_ivar_op_assign_emits_inner_write.rb.expected +3 -0
  228. data/vendor/spinel/test/chained_ivar_write_call_rhs.rb +30 -0
  229. data/vendor/spinel/test/chained_ivar_write_call_rhs.rb.expected +2 -0
  230. data/vendor/spinel/test/chained_ivar_write_split.rb +26 -0
  231. data/vendor/spinel/test/chained_ivar_write_split.rb.expected +3 -0
  232. data/vendor/spinel/test/chained_ivar_write_subclass.rb +26 -0
  233. data/vendor/spinel/test/chained_ivar_write_subclass.rb.expected +2 -0
  234. data/vendor/spinel/test/chained_or_assign_collection_array_nested.rb +32 -0
  235. data/vendor/spinel/test/chained_or_assign_collection_array_nested.rb.expected +3 -0
  236. data/vendor/spinel/test/chained_or_assign_collection_element.rb +29 -0
  237. data/vendor/spinel/test/chained_or_assign_collection_element.rb.expected +2 -0
  238. data/vendor/spinel/test/chained_or_assign_collection_poly_array.rb +25 -0
  239. data/vendor/spinel/test/chained_or_assign_collection_poly_array.rb.expected +3 -0
  240. data/vendor/spinel/test/chained_or_assign_collection_str_keys.rb +24 -0
  241. data/vendor/spinel/test/chained_or_assign_collection_str_keys.rb.expected +3 -0
  242. data/vendor/spinel/test/class_constant_path_read.rb +26 -0
  243. data/vendor/spinel/test/class_constant_path_read.rb.expected +4 -0
  244. data/vendor/spinel/test/class_constant_sym_array.rb +19 -0
  245. data/vendor/spinel/test/class_constant_sym_array.rb.expected +4 -0
  246. data/vendor/spinel/test/class_def_order.rb +66 -0
  247. data/vendor/spinel/test/class_def_order.rb.expected +4 -0
  248. data/vendor/spinel/test/class_method_open_class_call.rb +31 -0
  249. data/vendor/spinel/test/class_method_open_class_call.rb.expected +3 -0
  250. data/vendor/spinel/test/class_var_read.rb +113 -0
  251. data/vendor/spinel/test/class_var_read.rb.expected +8 -0
  252. data/vendor/spinel/test/class_var_write.rb +19 -0
  253. data/vendor/spinel/test/class_var_write.rb.expected +1 -0
  254. data/vendor/spinel/test/cls_ivar_type_parent_defer.rb +32 -0
  255. data/vendor/spinel/test/cls_method_object.rb +31 -0
  256. data/vendor/spinel/test/cls_method_object.rb.expected +2 -0
  257. data/vendor/spinel/test/codegen_class_in_module_with_explicit_parent.rb +15 -0
  258. data/vendor/spinel/test/codegen_class_in_module_with_explicit_parent.rb.expected +1 -0
  259. data/vendor/spinel/test/codegen_const_lookup_in_toplevel_method.rb +13 -0
  260. data/vendor/spinel/test/codegen_const_lookup_in_toplevel_method.rb.expected +1 -0
  261. data/vendor/spinel/test/comparable.rb +21 -0
  262. data/vendor/spinel/test/comparable.rb.expected +5 -0
  263. data/vendor/spinel/test/const_init_block_param_scan.rb +13 -0
  264. data/vendor/spinel/test/const_init_block_param_scan.rb.expected +2 -0
  265. data/vendor/spinel/test/constant_path.rb +102 -0
  266. data/vendor/spinel/test/constant_path.rb.expected +21 -0
  267. data/vendor/spinel/test/constants.rb +44 -0
  268. data/vendor/spinel/test/constants.rb.expected +13 -0
  269. data/vendor/spinel/test/control.rb +23 -0
  270. data/vendor/spinel/test/control.rb.expected +7 -0
  271. data/vendor/spinel/test/default_args.rb +108 -0
  272. data/vendor/spinel/test/default_args.rb.expected +13 -0
  273. data/vendor/spinel/test/default_argv_narrows_from_string_call_site.rb +32 -0
  274. data/vendor/spinel/test/default_argv_narrows_from_string_call_site.rb.expected +1 -0
  275. data/vendor/spinel/test/each_poly_recv_block_auto_splat.rb +43 -0
  276. data/vendor/spinel/test/each_poly_recv_block_auto_splat.rb.expected +2 -0
  277. data/vendor/spinel/test/each_with_object_seed_shadow.rb +14 -0
  278. data/vendor/spinel/test/each_with_object_seed_shadow.rb.expected +4 -0
  279. data/vendor/spinel/test/elsif_isa_chain.rb +56 -0
  280. data/vendor/spinel/test/elsif_isa_chain.rb.expected +6 -0
  281. data/vendor/spinel/test/embedded_var.rb +17 -0
  282. data/vendor/spinel/test/embedded_var.rb.expected +2 -0
  283. data/vendor/spinel/test/empty_array_param.rb +94 -0
  284. data/vendor/spinel/test/empty_array_param.rb.expected +18 -0
  285. data/vendor/spinel/test/empty_hash_ivar_string_value.rb +51 -0
  286. data/vendor/spinel/test/empty_hash_ivar_string_value.rb.expected +4 -0
  287. data/vendor/spinel/test/endless_method.rb +61 -0
  288. data/vendor/spinel/test/endless_method.rb.expected +11 -0
  289. data/vendor/spinel/test/endless_method_rescue.rb +33 -0
  290. data/vendor/spinel/test/endless_method_rescue.rb.expected +10 -0
  291. data/vendor/spinel/test/ensure_raise_overrides_body_raise.rb +19 -0
  292. data/vendor/spinel/test/ensure_raise_overrides_body_raise.rb.expected +1 -0
  293. data/vendor/spinel/test/ensure_runs_on_raise.rb +32 -0
  294. data/vendor/spinel/test/ensure_runs_on_raise.rb.expected +3 -0
  295. data/vendor/spinel/test/ensure_runs_on_raise_nested.rb +38 -0
  296. data/vendor/spinel/test/ensure_runs_on_raise_nested.rb.expected +4 -0
  297. data/vendor/spinel/test/ensure_runs_on_return.rb +61 -0
  298. data/vendor/spinel/test/ensure_runs_on_return.rb.expected +6 -0
  299. data/vendor/spinel/test/ensure_runs_on_return_from_rescue.rb +26 -0
  300. data/vendor/spinel/test/ensure_runs_on_return_from_rescue.rb.expected +2 -0
  301. data/vendor/spinel/test/ensure_runs_on_return_nested.rb +37 -0
  302. data/vendor/spinel/test/ensure_runs_on_return_nested.rb.expected +3 -0
  303. data/vendor/spinel/test/enumerable.rb +19 -0
  304. data/vendor/spinel/test/enumerable.rb.expected +2 -0
  305. data/vendor/spinel/test/env_string_inference.rb +37 -0
  306. data/vendor/spinel/test/env_string_inference.rb.expected +6 -0
  307. data/vendor/spinel/test/exception_object_methods.rb +99 -0
  308. data/vendor/spinel/test/exception_object_methods.rb.expected +15 -0
  309. data/vendor/spinel/test/exceptions.rb +34 -0
  310. data/vendor/spinel/test/exceptions.rb.expected +4 -0
  311. data/vendor/spinel/test/features.rb +32 -0
  312. data/vendor/spinel/test/features.rb.expected +9 -0
  313. data/vendor/spinel/test/ffi_buffer_reader.rb +23 -0
  314. data/vendor/spinel/test/ffi_buffer_reader.rb.expected +5 -0
  315. data/vendor/spinel/test/ffi_const.rb +12 -0
  316. data/vendor/spinel/test/ffi_const.rb.expected +5 -0
  317. data/vendor/spinel/test/ffi_libc_libm_basic.rb +16 -0
  318. data/vendor/spinel/test/ffi_libc_libm_basic.rb.expected +5 -0
  319. data/vendor/spinel/test/ffi_ptr_nil.rb +27 -0
  320. data/vendor/spinel/test/ffi_ptr_nil.rb.expected +2 -0
  321. data/vendor/spinel/test/ffi_void_return.rb +14 -0
  322. data/vendor/spinel/test/ffi_void_return.rb.expected +2 -0
  323. data/vendor/spinel/test/fiber_ivar_persists_across_yield.rb +22 -0
  324. data/vendor/spinel/test/fiber_ivar_persists_across_yield.rb.expected +3 -0
  325. data/vendor/spinel/test/fiber_yield_across_method_call.rb +28 -0
  326. data/vendor/spinel/test/fiber_yield_across_method_call.rb.expected +3 -0
  327. data/vendor/spinel/test/file_basename_gc.rb +59 -0
  328. data/vendor/spinel/test/file_basename_gc.rb.expected +2 -0
  329. data/vendor/spinel/test/forward_call_class_method_inherited_init.rb +36 -0
  330. data/vendor/spinel/test/forward_call_class_method_inherited_init.rb.expected +1 -0
  331. data/vendor/spinel/test/forward_call_class_method_inherited_init_int_array.rb +32 -0
  332. data/vendor/spinel/test/forward_call_class_method_inherited_init_int_array.rb.expected +1 -0
  333. data/vendor/spinel/test/forward_call_class_method_inherited_init_obj.rb +41 -0
  334. data/vendor/spinel/test/forward_call_class_method_inherited_init_obj.rb.expected +1 -0
  335. data/vendor/spinel/test/forward_call_class_method_int_array.rb +26 -0
  336. data/vendor/spinel/test/forward_call_class_method_int_array.rb.expected +1 -0
  337. data/vendor/spinel/test/forward_call_class_method_nested.rb +35 -0
  338. data/vendor/spinel/test/forward_call_class_method_nested.rb.expected +1 -0
  339. data/vendor/spinel/test/forward_call_class_method_obj.rb +36 -0
  340. data/vendor/spinel/test/forward_call_class_method_obj.rb.expected +1 -0
  341. data/vendor/spinel/test/forward_call_param_type_inference.rb +23 -0
  342. data/vendor/spinel/test/forward_call_param_type_inference.rb.expected +1 -0
  343. data/vendor/spinel/test/forward_call_param_type_int_array.rb +34 -0
  344. data/vendor/spinel/test/forward_call_param_type_int_array.rb.expected +1 -0
  345. data/vendor/spinel/test/forward_call_param_type_obj.rb +38 -0
  346. data/vendor/spinel/test/forward_call_param_type_obj.rb.expected +1 -0
  347. data/vendor/spinel/test/gc_root_ptr_array_literal.rb +63 -0
  348. data/vendor/spinel/test/gc_root_ptr_array_literal.rb.expected +1 -0
  349. data/vendor/spinel/test/gc_save_double_in_new.rb +13 -0
  350. data/vendor/spinel/test/gc_save_double_in_new.rb.expected +1 -0
  351. data/vendor/spinel/test/gc_scan_skip_inherited_ivar.rb +54 -0
  352. data/vendor/spinel/test/gc_scan_skip_inherited_ivar.rb.expected +2 -0
  353. data/vendor/spinel/test/global_var.rb +53 -0
  354. data/vendor/spinel/test/global_var.rb.expected +12 -0
  355. data/vendor/spinel/test/gvar.rb +22 -0
  356. data/vendor/spinel/test/gvar.rb.expected +4 -0
  357. data/vendor/spinel/test/hash_dig.rb +92 -0
  358. data/vendor/spinel/test/hash_dig.rb.expected +37 -0
  359. data/vendor/spinel/test/hash_keys_each_shadow.rb +40 -0
  360. data/vendor/spinel/test/hash_keys_each_shadow.rb.expected +9 -0
  361. data/vendor/spinel/test/hash_shorthand.rb +37 -0
  362. data/vendor/spinel/test/hash_shorthand.rb.expected +6 -0
  363. data/vendor/spinel/test/hash_shorthand_str.rb +48 -0
  364. data/vendor/spinel/test/hash_shorthand_str.rb.expected +19 -0
  365. data/vendor/spinel/test/heterogeneous_dispatch_int_return_narrow.rb +46 -0
  366. data/vendor/spinel/test/heterogeneous_dispatch_int_return_narrow.rb.expected +2 -0
  367. data/vendor/spinel/test/if_static_false_skips_dead_branch_compile.rb +50 -0
  368. data/vendor/spinel/test/if_static_false_skips_dead_branch_compile.rb.expected +3 -0
  369. data/vendor/spinel/test/implicit_self_param_poly.rb +17 -0
  370. data/vendor/spinel/test/implicit_self_param_poly.rb.expected +1 -0
  371. data/vendor/spinel/test/index_write.rb +106 -0
  372. data/vendor/spinel/test/index_write.rb.expected +30 -0
  373. data/vendor/spinel/test/inference_method_set.rb +35 -0
  374. data/vendor/spinel/test/inference_method_set.rb.expected +2 -0
  375. data/vendor/spinel/test/inherit.rb +52 -0
  376. data/vendor/spinel/test/inherit.rb.expected +7 -0
  377. data/vendor/spinel/test/inherited_method_param_widen.rb +49 -0
  378. data/vendor/spinel/test/inherited_method_param_widen.rb.expected +1 -0
  379. data/vendor/spinel/test/init_locals.rb +43 -0
  380. data/vendor/spinel/test/init_locals.rb.expected +3 -0
  381. data/vendor/spinel/test/initialize_param_poly_call_sites.rb +20 -0
  382. data/vendor/spinel/test/initialize_param_poly_call_sites.rb.expected +2 -0
  383. data/vendor/spinel/test/initialize_param_through_call.rb +15 -0
  384. data/vendor/spinel/test/initialize_param_through_call.rb.expected +1 -0
  385. data/vendor/spinel/test/initialize_void_wrapper_gc_save.rb +40 -0
  386. data/vendor/spinel/test/initialize_void_wrapper_gc_save.rb.expected +1 -0
  387. data/vendor/spinel/test/inspect.rb +86 -0
  388. data/vendor/spinel/test/inspect.rb.expected +52 -0
  389. data/vendor/spinel/test/instance_eval_trampoline.rb +88 -0
  390. data/vendor/spinel/test/instance_eval_trampoline.rb.expected +5 -0
  391. data/vendor/spinel/test/int_bracket_skip_sym_idx.rb +40 -0
  392. data/vendor/spinel/test/int_bracket_skip_sym_idx.rb.expected +5 -0
  393. data/vendor/spinel/test/int_keyed_hash_lookup_as_array.rb +19 -0
  394. data/vendor/spinel/test/int_keyed_hash_lookup_as_array.rb.expected +2 -0
  395. data/vendor/spinel/test/intarray_slice_assign_from_intarray_ptr_array_first.rb +25 -0
  396. data/vendor/spinel/test/intarray_slice_assign_from_intarray_ptr_array_first.rb.expected +1 -0
  397. data/vendor/spinel/test/integer_div.rb +21 -0
  398. data/vendor/spinel/test/integer_div.rb.expected +10 -0
  399. data/vendor/spinel/test/integer_div_by_zero.rb +80 -0
  400. data/vendor/spinel/test/integer_div_by_zero.rb.expected +10 -0
  401. data/vendor/spinel/test/interp_method_widening.rb +39 -0
  402. data/vendor/spinel/test/interp_method_widening.rb.expected +4 -0
  403. data/vendor/spinel/test/interp_symbol.rb +18 -0
  404. data/vendor/spinel/test/interp_symbol.rb.expected +3 -0
  405. data/vendor/spinel/test/introspect.rb +35 -0
  406. data/vendor/spinel/test/introspect.rb.expected +11 -0
  407. data/vendor/spinel/test/issue176_empty_hash_default.rb +34 -0
  408. data/vendor/spinel/test/issue176_empty_hash_default.rb.expected +3 -0
  409. data/vendor/spinel/test/issue203_string_new.rb +27 -0
  410. data/vendor/spinel/test/issue203_string_new.rb.expected +4 -0
  411. data/vendor/spinel/test/issue204_user_find_fetch.rb +25 -0
  412. data/vendor/spinel/test/issue204_user_find_fetch.rb.expected +5 -0
  413. data/vendor/spinel/test/issue207_factory_pattern.rb +35 -0
  414. data/vendor/spinel/test/issue207_factory_pattern.rb.expected +1 -0
  415. data/vendor/spinel/test/issue207_full_repro.rb +52 -0
  416. data/vendor/spinel/test/issue207_full_repro.rb.expected +1 -0
  417. data/vendor/spinel/test/issue208_inherited_class_method.rb +24 -0
  418. data/vendor/spinel/test/issue208_inherited_class_method.rb.expected +4 -0
  419. data/vendor/spinel/test/issue219_aref_chain.rb +36 -0
  420. data/vendor/spinel/test/issue219_aref_chain.rb.expected +5 -0
  421. data/vendor/spinel/test/issue224_bare_new_inherited.rb +66 -0
  422. data/vendor/spinel/test/issue224_bare_new_inherited.rb.expected +4 -0
  423. data/vendor/spinel/test/issue229_uncalled_cls_method.rb +76 -0
  424. data/vendor/spinel/test/issue229_uncalled_cls_method.rb.expected +3 -0
  425. data/vendor/spinel/test/issue235_chain_tail_widening.rb +48 -0
  426. data/vendor/spinel/test/issue235_chain_tail_widening.rb.expected +5 -0
  427. data/vendor/spinel/test/issue236_chain_empty_literal.rb +84 -0
  428. data/vendor/spinel/test/issue236_chain_empty_literal.rb.expected +7 -0
  429. data/vendor/spinel/test/issue239_cls_method_default_args.rb +41 -0
  430. data/vendor/spinel/test/issue239_cls_method_default_args.rb.expected +5 -0
  431. data/vendor/spinel/test/issue_266_def_length_inference.rb +63 -0
  432. data/vendor/spinel/test/issue_266_def_length_inference.rb.expected +1 -0
  433. data/vendor/spinel/test/ivar_and_write_basic.rb +34 -0
  434. data/vendor/spinel/test/ivar_and_write_basic.rb.expected +5 -0
  435. data/vendor/spinel/test/ivar_c_keyword.rb +14 -0
  436. data/vendor/spinel/test/ivar_c_keyword.rb.expected +1 -0
  437. data/vendor/spinel/test/ivar_float_array.rb +59 -0
  438. data/vendor/spinel/test/ivar_float_array.rb.expected +11 -0
  439. data/vendor/spinel/test/ivar_op_assign_bitwise_and_shift.rb +22 -0
  440. data/vendor/spinel/test/ivar_op_assign_bitwise_and_shift.rb.expected +6 -0
  441. data/vendor/spinel/test/ivar_or_write_basic.rb +57 -0
  442. data/vendor/spinel/test/ivar_or_write_basic.rb.expected +9 -0
  443. data/vendor/spinel/test/ivar_polymorphic.rb +87 -0
  444. data/vendor/spinel/test/ivar_polymorphic.rb.expected +12 -0
  445. data/vendor/spinel/test/ivar_ternary_mixed.rb +108 -0
  446. data/vendor/spinel/test/ivar_ternary_mixed.rb.expected +15 -0
  447. data/vendor/spinel/test/ivar_writer_heterogeneity.rb +34 -0
  448. data/vendor/spinel/test/ivar_writer_heterogeneity.rb.expected +2 -0
  449. data/vendor/spinel/test/known_constants.rb +25 -0
  450. data/vendor/spinel/test/known_constants.rb.expected +4 -0
  451. data/vendor/spinel/test/kw_nil_default_string_call.rb +6 -0
  452. data/vendor/spinel/test/kw_nil_default_string_call.rb.expected +2 -0
  453. data/vendor/spinel/test/kwargs.rb +21 -0
  454. data/vendor/spinel/test/kwargs.rb.expected +6 -0
  455. data/vendor/spinel/test/kwargs_param.rb +26 -0
  456. data/vendor/spinel/test/kwargs_param.rb.expected +2 -0
  457. data/vendor/spinel/test/kwargs_param_widen.rb +73 -0
  458. data/vendor/spinel/test/kwargs_param_widen.rb.expected +3 -0
  459. data/vendor/spinel/test/lrama_features.rb +142 -0
  460. data/vendor/spinel/test/lrama_features.rb.expected +38 -0
  461. data/vendor/spinel/test/map_array_block_result.rb +29 -0
  462. data/vendor/spinel/test/map_array_block_result.rb.expected +2 -0
  463. data/vendor/spinel/test/map_block_returns_nested_array.rb +53 -0
  464. data/vendor/spinel/test/map_empty_block.rb +26 -0
  465. data/vendor/spinel/test/map_empty_block.rb.expected +6 -0
  466. data/vendor/spinel/test/map_range_recv_array_block.rb +31 -0
  467. data/vendor/spinel/test/mega.rb +35 -0
  468. data/vendor/spinel/test/mega.rb.expected +7 -0
  469. data/vendor/spinel/test/method.rb +21 -0
  470. data/vendor/spinel/test/method.rb.expected +6 -0
  471. data/vendor/spinel/test/method_defined.rb +36 -0
  472. data/vendor/spinel/test/method_defined.rb.expected +17 -0
  473. data/vendor/spinel/test/method_dispatch_poly_array.rb +35 -0
  474. data/vendor/spinel/test/method_dispatch_poly_array.rb.expected +2 -0
  475. data/vendor/spinel/test/method_introspection.rb +24 -0
  476. data/vendor/spinel/test/method_introspection.rb.expected +6 -0
  477. data/vendor/spinel/test/method_param_unify_to_poly.rb +40 -0
  478. data/vendor/spinel/test/method_param_unify_to_poly.rb.expected +2 -0
  479. data/vendor/spinel/test/misc.rb +49 -0
  480. data/vendor/spinel/test/misc.rb.expected +7 -0
  481. data/vendor/spinel/test/mixin.rb +54 -0
  482. data/vendor/spinel/test/mixin.rb.expected +4 -0
  483. data/vendor/spinel/test/module_acc_dispatch_param_box.rb +46 -0
  484. data/vendor/spinel/test/module_acc_dispatch_param_box.rb.expected +2 -0
  485. data/vendor/spinel/test/module_class_new.rb +17 -0
  486. data/vendor/spinel/test/module_class_new.rb.expected +3 -0
  487. data/vendor/spinel/test/module_cls_method_string_return.rb +53 -0
  488. data/vendor/spinel/test/module_cls_method_string_return.rb.expected +5 -0
  489. data/vendor/spinel/test/module_const_array_widen.rb +36 -0
  490. data/vendor/spinel/test/module_const_array_widen.rb.expected +1 -0
  491. data/vendor/spinel/test/module_dispatch_param_widen.rb +55 -0
  492. data/vendor/spinel/test/module_dispatch_param_widen.rb.expected +1 -0
  493. data/vendor/spinel/test/module_function_namespace.rb +58 -0
  494. data/vendor/spinel/test/module_ivar_hash.rb +61 -0
  495. data/vendor/spinel/test/module_ivar_hash.rb.expected +7 -0
  496. data/vendor/spinel/test/module_relative_constant_path.rb +26 -0
  497. data/vendor/spinel/test/module_relative_constant_path.rb.expected +2 -0
  498. data/vendor/spinel/test/module_singleton_accessor.rb +65 -0
  499. data/vendor/spinel/test/module_singleton_accessor.rb.expected +3 -0
  500. data/vendor/spinel/test/module_singleton_accessor_poly.rb +62 -0
  501. data/vendor/spinel/test/module_singleton_accessor_poly.rb.expected +7 -0
  502. data/vendor/spinel/test/multi_arg_block_call.rb +56 -0
  503. data/vendor/spinel/test/multi_arg_block_call.rb.expected +5 -0
  504. data/vendor/spinel/test/multi_arg_yield.rb +70 -0
  505. data/vendor/spinel/test/multi_arg_yield.rb.expected +6 -0
  506. data/vendor/spinel/test/multi_assign_ivar.rb +33 -0
  507. data/vendor/spinel/test/multi_assign_ivar.rb.expected +1 -0
  508. data/vendor/spinel/test/multi_return.rb +35 -0
  509. data/vendor/spinel/test/multi_return.rb.expected +10 -0
  510. data/vendor/spinel/test/multi_return_bare.rb +77 -0
  511. data/vendor/spinel/test/multi_return_bare.rb.expected +16 -0
  512. data/vendor/spinel/test/multi_write_const.rb +36 -0
  513. data/vendor/spinel/test/multi_write_const.rb.expected +9 -0
  514. data/vendor/spinel/test/multi_write_from_poly_recv.rb +34 -0
  515. data/vendor/spinel/test/multi_write_from_poly_recv.rb.expected +1 -0
  516. data/vendor/spinel/test/multi_write_ivar.rb +34 -0
  517. data/vendor/spinel/test/multi_write_ivar.rb.expected +3 -0
  518. data/vendor/spinel/test/multi_write_ivar_const_from_array_rhs.rb +53 -0
  519. data/vendor/spinel/test/multi_write_ivar_const_from_array_rhs.rb.expected +6 -0
  520. data/vendor/spinel/test/multi_write_ivar_widening.rb +10 -0
  521. data/vendor/spinel/test/multi_write_ivar_widening.rb.expected +2 -0
  522. data/vendor/spinel/test/multi_write_map_block.rb +31 -0
  523. data/vendor/spinel/test/multi_write_map_block.rb.expected +7 -0
  524. data/vendor/spinel/test/multi_write_setter.rb +28 -0
  525. data/vendor/spinel/test/multi_write_setter.rb.expected +3 -0
  526. data/vendor/spinel/test/multi_write_typed_array_dispatch.rb +44 -0
  527. data/vendor/spinel/test/multi_write_typed_array_dispatch.rb.expected +3 -0
  528. data/vendor/spinel/test/nested_class_in_class.rb +38 -0
  529. data/vendor/spinel/test/nested_class_in_class.rb.expected +3 -0
  530. data/vendor/spinel/test/nested_class_module_const_resolution.rb +38 -0
  531. data/vendor/spinel/test/nested_class_module_const_resolution.rb.expected +2 -0
  532. data/vendor/spinel/test/nil_ivar.rb +44 -0
  533. data/vendor/spinel/test/nil_ivar.rb.expected +5 -0
  534. data/vendor/spinel/test/no_attr_write_shortcut_complex.rb +33 -0
  535. data/vendor/spinel/test/no_attr_write_shortcut_complex.rb.expected +3 -0
  536. data/vendor/spinel/test/no_attr_write_shortcut_multi.rb +38 -0
  537. data/vendor/spinel/test/no_attr_write_shortcut_multi.rb.expected +4 -0
  538. data/vendor/spinel/test/no_keywords_param.rb +15 -0
  539. data/vendor/spinel/test/no_keywords_param.rb.expected +2 -0
  540. data/vendor/spinel/test/nullable.rb +26 -0
  541. data/vendor/spinel/test/nullable.rb.expected +2 -0
  542. data/vendor/spinel/test/obj_array.rb +26 -0
  543. data/vendor/spinel/test/obj_array.rb.expected +6 -0
  544. data/vendor/spinel/test/object_new_sentinel.rb +18 -0
  545. data/vendor/spinel/test/object_new_sentinel.rb.expected +3 -0
  546. data/vendor/spinel/test/object_truthy.rb +31 -0
  547. data/vendor/spinel/test/object_truthy.rb.expected +5 -0
  548. data/vendor/spinel/test/op_assign_user_operator.rb +36 -0
  549. data/vendor/spinel/test/open_class.rb +27 -0
  550. data/vendor/spinel/test/open_class.rb.expected +4 -0
  551. data/vendor/spinel/test/optional_string_param_method.rb +11 -0
  552. data/vendor/spinel/test/optional_string_param_method.rb.expected +3 -0
  553. data/vendor/spinel/test/param_inference_if_predicate.rb +90 -0
  554. data/vendor/spinel/test/param_inference_if_predicate.rb.expected +3 -0
  555. data/vendor/spinel/test/param_narrow_from_body_call.rb +34 -0
  556. data/vendor/spinel/test/param_narrow_from_body_call.rb.expected +2 -0
  557. data/vendor/spinel/test/param_widens_when_body_assigns_string.rb +21 -0
  558. data/vendor/spinel/test/param_widens_when_body_assigns_string.rb.expected +6 -0
  559. data/vendor/spinel/test/pattern.rb +41 -0
  560. data/vendor/spinel/test/pattern.rb.expected +9 -0
  561. data/vendor/spinel/test/poly.rb +24 -0
  562. data/vendor/spinel/test/poly.rb.expected +9 -0
  563. data/vendor/spinel/test/poly2.rb +34 -0
  564. data/vendor/spinel/test/poly2.rb.expected +9 -0
  565. data/vendor/spinel/test/poly_arith.rb +34 -0
  566. data/vendor/spinel/test/poly_arith.rb.expected +10 -0
  567. data/vendor/spinel/test/poly_array_literal_callnode_typed_elem.rb +37 -0
  568. data/vendor/spinel/test/poly_array_literal_callnode_typed_elem.rb.expected +9 -0
  569. data/vendor/spinel/test/poly_array_slot_literal.rb +41 -0
  570. data/vendor/spinel/test/poly_array_slot_sized_default.rb +33 -0
  571. data/vendor/spinel/test/poly_box_int_array.rb +13 -0
  572. data/vendor/spinel/test/poly_box_int_array.rb.expected +2 -0
  573. data/vendor/spinel/test/poly_dispatch_args_ret.rb +45 -0
  574. data/vendor/spinel/test/poly_dispatch_args_ret.rb.expected +4 -0
  575. data/vendor/spinel/test/poly_dispatch_arity_padding.rb +36 -0
  576. data/vendor/spinel/test/poly_dispatch_arity_truncate.rb +45 -0
  577. data/vendor/spinel/test/poly_dispatch_attr_reader.rb +44 -0
  578. data/vendor/spinel/test/poly_dispatch_attr_reader.rb.expected +4 -0
  579. data/vendor/spinel/test/poly_dispatch_builtin.rb +16 -0
  580. data/vendor/spinel/test/poly_dispatch_builtin.rb.expected +2 -0
  581. data/vendor/spinel/test/poly_dispatch_builtin_all.rb +34 -0
  582. data/vendor/spinel/test/poly_dispatch_builtin_all.rb.expected +8 -0
  583. data/vendor/spinel/test/poly_dispatch_ptr_array.rb +57 -0
  584. data/vendor/spinel/test/poly_dispatch_ptr_array.rb.expected +6 -0
  585. data/vendor/spinel/test/poly_equality_mixed_sites.rb +40 -0
  586. data/vendor/spinel/test/poly_equality_mixed_sites.rb.expected +10 -0
  587. data/vendor/spinel/test/poly_gc.rb +39 -0
  588. data/vendor/spinel/test/poly_gc.rb.expected +3 -0
  589. data/vendor/spinel/test/poly_hash_literal_from_ivar.rb +47 -0
  590. data/vendor/spinel/test/poly_hash_literal_from_ivar.rb.expected +5 -0
  591. data/vendor/spinel/test/poly_hash_with_range.rb +36 -0
  592. data/vendor/spinel/test/poly_hash_with_range.rb.expected +10 -0
  593. data/vendor/spinel/test/poly_hash_with_time.rb +32 -0
  594. data/vendor/spinel/test/poly_hash_with_time.rb.expected +8 -0
  595. data/vendor/spinel/test/poly_int_arith_auto_unify.rb +26 -0
  596. data/vendor/spinel/test/poly_int_arith_auto_unify.rb.expected +4 -0
  597. data/vendor/spinel/test/poly_int_bit_index.rb +50 -0
  598. data/vendor/spinel/test/poly_int_bit_index.rb.expected +14 -0
  599. data/vendor/spinel/test/poly_int_bitops_auto_unify.rb +20 -0
  600. data/vendor/spinel/test/poly_int_bitops_auto_unify.rb.expected +5 -0
  601. data/vendor/spinel/test/poly_is_a.rb +47 -0
  602. data/vendor/spinel/test/poly_is_a.rb.expected +10 -0
  603. data/vendor/spinel/test/poly_keyed_hash_method_dedup.rb +37 -0
  604. data/vendor/spinel/test/poly_keyed_hash_method_dedup.rb.expected +4 -0
  605. data/vendor/spinel/test/poly_keyed_hash_pipeline.rb +40 -0
  606. data/vendor/spinel/test/poly_keyed_hash_pipeline.rb.expected +2 -0
  607. data/vendor/spinel/test/poly_method_args.rb +23 -0
  608. data/vendor/spinel/test/poly_method_args.rb.expected +2 -0
  609. data/vendor/spinel/test/poly_method_mixed_return.rb +23 -0
  610. data/vendor/spinel/test/poly_method_mixed_return.rb.expected +2 -0
  611. data/vendor/spinel/test/poly_or_returns_value.rb +13 -0
  612. data/vendor/spinel/test/poly_or_returns_value.rb.expected +4 -0
  613. data/vendor/spinel/test/poly_recv_aref_box_arm.rb +41 -0
  614. data/vendor/spinel/test/poly_recv_aref_box_arm.rb.expected +4 -0
  615. data/vendor/spinel/test/poly_recv_aref_str_key.rb +42 -0
  616. data/vendor/spinel/test/poly_recv_aref_str_key.rb.expected +2 -0
  617. data/vendor/spinel/test/poly_recv_bracket_assign.rb +31 -0
  618. data/vendor/spinel/test/poly_recv_bracket_assign.rb.expected +1 -0
  619. data/vendor/spinel/test/poly_recv_each.rb +35 -0
  620. data/vendor/spinel/test/poly_recv_each.rb.expected +7 -0
  621. data/vendor/spinel/test/poly_return_value_class.rb +66 -0
  622. data/vendor/spinel/test/poly_return_value_class.rb.expected +7 -0
  623. data/vendor/spinel/test/poly_self_deref.rb +28 -0
  624. data/vendor/spinel/test/poly_self_deref.rb.expected +2 -0
  625. data/vendor/spinel/test/poly_shl_array_push_dispatch.rb +35 -0
  626. data/vendor/spinel/test/poly_shl_array_push_dispatch.rb.expected +5 -0
  627. data/vendor/spinel/test/poly_slice_assign.rb +26 -0
  628. data/vendor/spinel/test/poly_slice_assign.rb.expected +3 -0
  629. data/vendor/spinel/test/poly_str_append.rb +40 -0
  630. data/vendor/spinel/test/poly_str_append.rb.expected +2 -0
  631. data/vendor/spinel/test/poly_to_i_via_str_poly_hash.rb +19 -0
  632. data/vendor/spinel/test/poly_to_i_via_str_poly_hash.rb.expected +1 -0
  633. data/vendor/spinel/test/post_execution.rb +17 -0
  634. data/vendor/spinel/test/post_execution.rb.expected +4 -0
  635. data/vendor/spinel/test/pre_execution.rb +18 -0
  636. data/vendor/spinel/test/pre_execution.rb.expected +4 -0
  637. data/vendor/spinel/test/primitive_method_shadow.rb +48 -0
  638. data/vendor/spinel/test/primitive_method_shadow.rb.expected +4 -0
  639. data/vendor/spinel/test/primitive_method_shadow_int_recv.rb +47 -0
  640. data/vendor/spinel/test/primitive_method_shadow_int_recv.rb.expected +1 -0
  641. data/vendor/spinel/test/proc.rb +42 -0
  642. data/vendor/spinel/test/proc.rb.expected +8 -0
  643. data/vendor/spinel/test/proc_closure.rb +44 -0
  644. data/vendor/spinel/test/proc_closure.rb.expected +8 -0
  645. data/vendor/spinel/test/proc_hash_value.rb +27 -0
  646. data/vendor/spinel/test/proc_hash_value.rb.expected +1 -0
  647. data/vendor/spinel/test/ptr_array.rb +107 -0
  648. data/vendor/spinel/test/ptr_array.rb.expected +23 -0
  649. data/vendor/spinel/test/range.rb +130 -0
  650. data/vendor/spinel/test/range.rb.expected +61 -0
  651. data/vendor/spinel/test/redo.rb +263 -0
  652. data/vendor/spinel/test/redo.rb.expected +71 -0
  653. data/vendor/spinel/test/reduce_acc_shadow.rb +31 -0
  654. data/vendor/spinel/test/reduce_acc_shadow.rb.expected +5 -0
  655. data/vendor/spinel/test/regex.rb +152 -0
  656. data/vendor/spinel/test/regex.rb.expected +43 -0
  657. data/vendor/spinel/test/regexp.rb +34 -0
  658. data/vendor/spinel/test/regexp.rb.expected +12 -0
  659. data/vendor/spinel/test/reopen_class.rb +33 -0
  660. data/vendor/spinel/test/reopen_class.rb.expected +5 -0
  661. data/vendor/spinel/test/require/lib/greeter.rb +9 -0
  662. data/vendor/spinel/test/require/main.rb +5 -0
  663. data/vendor/spinel/test/require_dedup/lib/data.rb +2 -0
  664. data/vendor/spinel/test/require_dedup/lib/types.rb +1 -0
  665. data/vendor/spinel/test/require_dedup/main.rb +8 -0
  666. data/vendor/spinel/test/rescue.rb +48 -0
  667. data/vendor/spinel/test/rescue.rb.expected +7 -0
  668. data/vendor/spinel/test/rescue_modifier_assign.rb +24 -0
  669. data/vendor/spinel/test/rescue_modifier_assign.rb.expected +4 -0
  670. data/vendor/spinel/test/rightward_assign.rb +36 -0
  671. data/vendor/spinel/test/rightward_assign.rb.expected +6 -0
  672. data/vendor/spinel/test/runtime_widen_int_to_poly_array.rb +27 -0
  673. data/vendor/spinel/test/runtime_widen_int_to_poly_array.rb.expected +3 -0
  674. data/vendor/spinel/test/sample_user_method.rb +20 -0
  675. data/vendor/spinel/test/scan_ivars_inherited_slot.rb +32 -0
  676. data/vendor/spinel/test/scan_new_calls_class_scope.rb +35 -0
  677. data/vendor/spinel/test/scan_new_calls_class_scope.rb.expected +1 -0
  678. data/vendor/spinel/test/send.rb +15 -0
  679. data/vendor/spinel/test/send.rb.expected +2 -0
  680. data/vendor/spinel/test/shareable_constant.rb +10 -0
  681. data/vendor/spinel/test/shareable_constant.rb.expected +2 -0
  682. data/vendor/spinel/test/sized_poly_array_nil_n.rb +37 -0
  683. data/vendor/spinel/test/sized_poly_array_nil_n.rb.expected +3 -0
  684. data/vendor/spinel/test/source_file.rb +37 -0
  685. data/vendor/spinel/test/source_file.rb.expected +8 -0
  686. data/vendor/spinel/test/splat_call.rb +72 -0
  687. data/vendor/spinel/test/splat_call.rb.expected +35 -0
  688. data/vendor/spinel/test/splat_destructure.rb +56 -0
  689. data/vendor/spinel/test/splat_destructure.rb.expected +36 -0
  690. data/vendor/spinel/test/splat_destructure_poly.rb +26 -0
  691. data/vendor/spinel/test/splat_destructure_poly.rb.expected +8 -0
  692. data/vendor/spinel/test/stdlib.rb +28 -0
  693. data/vendor/spinel/test/stdlib.rb.expected +5 -0
  694. data/vendor/spinel/test/stringio.rb +84 -0
  695. data/vendor/spinel/test/stringio.rb.expected +27 -0
  696. data/vendor/spinel/test/strip_nullable_int_cast.rb +24 -0
  697. data/vendor/spinel/test/strip_nullable_int_cast.rb.expected +1 -0
  698. data/vendor/spinel/test/struct.rb +25 -0
  699. data/vendor/spinel/test/struct.rb.expected +8 -0
  700. data/vendor/spinel/test/struct_inherit.rb +28 -0
  701. data/vendor/spinel/test/struct_inherit.rb.expected +7 -0
  702. data/vendor/spinel/test/struct_kw.rb +16 -0
  703. data/vendor/spinel/test/struct_kw.rb.expected +5 -0
  704. data/vendor/spinel/test/subclass_inherits_module_parent.rb +40 -0
  705. data/vendor/spinel/test/subclass_inherits_module_parent.rb.expected +3 -0
  706. data/vendor/spinel/test/super_arg_cross_class_cast.rb +39 -0
  707. data/vendor/spinel/test/super_arg_cross_class_cast.rb.expected +2 -0
  708. data/vendor/spinel/test/super_forwarding.rb +25 -0
  709. data/vendor/spinel/test/super_forwarding.rb.expected +3 -0
  710. data/vendor/spinel/test/sym_case.rb +15 -0
  711. data/vendor/spinel/test/sym_case.rb.expected +4 -0
  712. data/vendor/spinel/test/sym_poly_hash_merge.rb +47 -0
  713. data/vendor/spinel/test/sym_poly_hash_merge.rb.expected +11 -0
  714. data/vendor/spinel/test/symbol_ivar_reassign.rb +25 -0
  715. data/vendor/spinel/test/symbol_ivar_reassign.rb.expected +2 -0
  716. data/vendor/spinel/test/three_level_array_outer_index.rb +87 -0
  717. data/vendor/spinel/test/three_level_array_outer_index.rb.expected +17 -0
  718. data/vendor/spinel/test/toplevel_ivar_array.rb +19 -0
  719. data/vendor/spinel/test/toplevel_ivar_array.rb.expected +4 -0
  720. data/vendor/spinel/test/truncate_module_method.rb +46 -0
  721. data/vendor/spinel/test/truncate_module_method.rb.expected +6 -0
  722. data/vendor/spinel/test/unbox_poly_index_in_dispatch.rb +20 -0
  723. data/vendor/spinel/test/unbox_poly_index_in_dispatch.rb.expected +1 -0
  724. data/vendor/spinel/test/undef.rb +33 -0
  725. data/vendor/spinel/test/undef.rb.expected +2 -0
  726. data/vendor/spinel/test/user_method_named_like_mutator.rb +30 -0
  727. data/vendor/spinel/test/user_method_named_like_mutator.rb.expected +2 -0
  728. data/vendor/spinel/test/value_type_ctor_gc_save.rb +46 -0
  729. data/vendor/spinel/test/value_type_ctor_gc_save.rb.expected +3 -0
  730. data/vendor/spinel/test/widen_int_obj_to_poly.rb +29 -0
  731. data/vendor/spinel/test/yield.rb +67 -0
  732. data/vendor/spinel/test/yield.rb.expected +5 -0
  733. data/vendor/spinel/test/yield_method_call_in_method_body.rb +58 -0
  734. data/vendor/spinel/test/yield_method_call_in_method_body.rb.expected +4 -0
  735. metadata +778 -0
@@ -0,0 +1,406 @@
1
+ # Spinel AOT Compiler - Makefile
2
+ #
3
+ # Usage:
4
+ # make Build everything (parser + bootstrap compiler)
5
+ # make parse Build C parser only
6
+ # make bootstrap Bootstrap the compiler backend
7
+ # make test Run feature tests (requires bootstrap first)
8
+ # make bench Run benchmarks (requires bootstrap first)
9
+ # make clean Remove built binaries
10
+
11
+ CC ?= cc
12
+ # Auto-wrap CC with sccache or ccache when present. Skip when CC is
13
+ # already wrapped — the substring guard catches both "ccache" and
14
+ # "sccache" since "ccache" is a substring of "sccache", so CI's
15
+ # `CC=sccache <cc>` env stays untouched. NO_CCACHE=1 opts out.
16
+ # `override` is required so that `make CC=gcc` (command-line CC) is
17
+ # also wrapped — without it, command-line CC takes precedence over
18
+ # Makefile assignments and the wrap is silently ignored.
19
+ ifeq (,$(findstring ccache,$(CC)))
20
+ ifeq (,$(NO_CCACHE))
21
+ CCACHE_BIN := $(shell command -v sccache 2>/dev/null || command -v ccache 2>/dev/null)
22
+ ifneq (,$(CCACHE_BIN))
23
+ override CC := $(CCACHE_BIN) $(CC)
24
+ endif
25
+ endif
26
+ endif
27
+ # `-Wno-alloc-size-larger-than` silences a gcc 13+ paranoia warning that
28
+ # fires on the inlined `h->cap *= 2` in sp_*Hash_grow when the inliner
29
+ # can't bound h->cap. The pattern is bounded in practice (cap doubles
30
+ # from a small power of two until memory runs out, never approaches
31
+ # 2^60), but gcc tracks signed-overflow UB conservatively. Clang
32
+ # doesn't have that warning; without `-Wno-unknown-warning-option`
33
+ # first, clang would turn the unknown -Wno- into a -Werror failure on
34
+ # every cc invocation in `make test` / `make bench`.
35
+ # Optimization level for the C compiles driven by the test/bench
36
+ # harness (each .rb gets parsed → codegen → cc'd → run). CI overrides
37
+ # this to -O0 to cut Windows cc time substantially; locally -O2 keeps
38
+ # the test binaries reasonable-speed for quicker run-after-compile.
39
+ OPT ?= -O2
40
+ CFLAGS = $(OPT) -Wno-all -Wno-unknown-warning-option -Wno-alloc-size-larger-than
41
+ # Bootstrap-only flags: spinel_codegen runs on the developer's machine
42
+ # only, so we can use -O3 -flto for ~5-10% extra wall-clock without
43
+ # constraining users (whose generated C is built with plain CFLAGS).
44
+ # Override with LTO=0 on toolchains without LTO support.
45
+ LTO ?= 1
46
+ ifeq ($(LTO),1)
47
+ BOOTSTRAP_CFLAGS = -O3 -flto=auto -Wno-all
48
+ else
49
+ BOOTSTRAP_CFLAGS = $(CFLAGS)
50
+ endif
51
+ # Per-function sections allow the linker to strip unused bigint/regexp
52
+ # functions from the final binary (supported since GCC 2.7 / binutils 2.17).
53
+ SEC_FLAGS = -ffunction-sections -fdata-sections
54
+ # Apple ld64 spells dead-code stripping --dead_strip; GNU ld uses --gc-sections.
55
+ ifeq ($(shell uname -s),Darwin)
56
+ GC_FLAGS = -Wl,-dead_strip
57
+ else
58
+ GC_FLAGS = -Wl,--gc-sections
59
+ endif
60
+
61
+ # MinGW gcc appends .exe to its output filename; reflect that in target
62
+ # names so Make's dependency tracking and install/clean match reality.
63
+ # Windows (MinGW) default stack is also only 1MB — far too small for the
64
+ # deeply recursive bootstrap compile (~75k frames of AST traversal).
65
+ ifeq ($(OS),Windows_NT)
66
+ EXE = .exe
67
+ LDFLAGS += -Wl,--stack,67108864
68
+ endif
69
+
70
+ # `timeout` is GNU coreutils — present by default on Linux but missing
71
+ # on macOS unless `brew install coreutils` is run (where it's named
72
+ # `gtimeout`). Without it test/bench would chain-fail at the very first
73
+ # `timeout` call with exit 127, reporting 0 pass / 0 fail. Detect both
74
+ # names; if neither is found, run without time limits (slow benches
75
+ # won't be auto-killed, but otherwise everything works).
76
+ TIMEOUT_BIN := $(shell command -v timeout 2>/dev/null || command -v gtimeout 2>/dev/null)
77
+ TIMEOUT10 := $(if $(TIMEOUT_BIN),$(TIMEOUT_BIN) 10,)
78
+ TIMEOUT60 := $(if $(TIMEOUT_BIN),$(TIMEOUT_BIN) 60,)
79
+
80
+ # Default -j to logical CPU count when MAKEFLAGS doesn't already
81
+ # carry a -j flag. The combined guard catches the three forms a user
82
+ # can supply -j in (per the GNU Make manual): `-j N` / `-jN` via
83
+ # filter, the short-flag-cluster form like `-kj` via findstring on
84
+ # the first word (the leading `-` makes firstword non-empty when
85
+ # MAKEFLAGS starts blank), and Make 4.x's `--jobserver-auth=…` long
86
+ # form. Note: GNU Make 3.81 (macOS system make) reports MAKEFLAGS
87
+ # as empty at parse time, so the guard always fires there; users on
88
+ # 3.81 wanting to override should pass `MAKEFLAGS=-jN make …`.
89
+ ifeq (,$(filter -j%,$(MAKEFLAGS))$(findstring j,$(firstword -$(MAKEFLAGS)))$(filter --jobserver%,$(MAKEFLAGS)))
90
+ MAKEFLAGS += -j$(shell getconf _NPROCESSORS_ONLN 2>/dev/null || echo 4)
91
+ endif
92
+
93
+ # Reference Ruby for `make test` / `make bench` output comparison.
94
+ # Defaults to `ruby` (the system CRuby), matching the historical
95
+ # behaviour. Override on the command line when a newer or differently-
96
+ # built interpreter is needed, e.g.
97
+ #
98
+ # REF_RUBY=miniruby make test
99
+ #
100
+ # to use a freshly-built bootstrap interpreter (Ruby's `miniruby`)
101
+ # that supports newer features like the `it` block param. The
102
+ # harness falls back to `ruby` per-file if `REF_RUBY` exits non-zero
103
+ # — covers tests that `require` extension libraries (stringio, etc.)
104
+ # which the bootstrap miniruby can't load.
105
+ REF_RUBY ?= ruby
106
+
107
+ # Prism library: prefer vendor/prism (fetched via `make deps`), then
108
+ # fall back to the Prism gem if one is installed. Override by setting
109
+ # PRISM_DIR=/path/to/prism on the command line.
110
+ PRISM_VERSION ?= 1.9.0
111
+ ifneq ($(wildcard vendor/prism/include/prism.h),)
112
+ PRISM_DIR ?= vendor/prism
113
+ else
114
+ PRISM_DIR ?= $(shell ruby -rprism -e 'puts $$LOADED_FEATURES.grep(/prism/).first.sub(%r{/lib/.*}, "")' 2>/dev/null)
115
+ endif
116
+
117
+ PRISM_INC = $(PRISM_DIR)/include
118
+ PRISM_SRC = $(wildcard $(PRISM_DIR)/src/*.c) $(wildcard $(PRISM_DIR)/src/util/*.c)
119
+ PRISM_OBJ = $(patsubst $(PRISM_DIR)/src/%.c,build/prism/%.o,$(PRISM_SRC))
120
+ PRISM_LIB = build/libprism.a
121
+
122
+ CODEGEN_STAMP := build/stamps/spinel_codegen.rb.stamp
123
+ PARSE_STAMP := build/stamps/spinel_parse.c.stamp
124
+
125
+ .PHONY: all parse bootstrap codegen test retest clean-test-results regen-expected bench clean install uninstall deps
126
+
127
+ all: parse regexp spinel_codegen$(EXE)
128
+
129
+ # ---- Dependencies ----
130
+ # Clone Prism into vendor/prism at the pinned version. Run this once
131
+ # after cloning Spinel if you don't have the Prism gem installed.
132
+ deps: vendor/prism/include/prism/diagnostic.h
133
+
134
+ # Download the pre-built Prism gem from rubygems.org and extract its C
135
+ # sources. We use the .gem tarball instead of a git clone because it
136
+ # ships with the generated headers (diagnostic.h, etc.) already in
137
+ # place — no rake/bundler needed.
138
+ vendor/prism/include/prism/diagnostic.h:
139
+ @mkdir -p vendor/prism
140
+ @echo "Fetching prism v$(PRISM_VERSION) from rubygems.org..."
141
+ curl -sL -o /tmp/prism-$(PRISM_VERSION).gem https://rubygems.org/gems/prism-$(PRISM_VERSION).gem
142
+ @tmpdir=$$(mktemp -d); \
143
+ tar -xf /tmp/prism-$(PRISM_VERSION).gem -C $$tmpdir data.tar.gz; \
144
+ tar -xzf $$tmpdir/data.tar.gz -C vendor/prism; \
145
+ rm -rf $$tmpdir /tmp/prism-$(PRISM_VERSION).gem
146
+ @test -f $@ && echo "prism v$(PRISM_VERSION) ready at vendor/prism"
147
+
148
+ # If PRISM_DIR ended up empty (no vendor/prism, no gem), halt with a
149
+ # clear message before trying to build anything that needs it.
150
+ ifeq ($(PRISM_DIR),)
151
+ parse bootstrap codegen regexp all: prism-missing
152
+ prism-missing:
153
+ @echo "Error: Prism not found."; \
154
+ echo " Run 'make deps' to fetch libprism into vendor/prism,"; \
155
+ echo " or install the prism gem (gem install prism),"; \
156
+ echo " or set PRISM_DIR=/path/to/prism manually."; \
157
+ exit 1
158
+ endif
159
+
160
+ # ---- Prism static library ----
161
+
162
+ build/libprism.a: $(PRISM_OBJ)
163
+ @mkdir -p build
164
+ ar rcs $@ $^
165
+
166
+ build/prism/%.o: $(PRISM_DIR)/src/%.c
167
+ @mkdir -p $(dir $@)
168
+ $(CC) -c -O2 -I$(PRISM_INC) -I$(PRISM_DIR)/src $< -o $@
169
+
170
+ # ---- Content stamps ----
171
+ # Content stamps: rules depend on `build/stamps/foo.stamp` instead of
172
+ # `foo` directly, so `touch foo` (or `git checkout` of an identical
173
+ # version) doesn't invalidate downstream targets. cmp-or-replace
174
+ # advances the stamp's mtime only on real content change.
175
+ build/stamps:
176
+ @mkdir -p $@
177
+
178
+ build/stamps/%.stamp: % | build/stamps
179
+ @cmp -s $< $@ 2>/dev/null || cp $< $@
180
+
181
+ # Without .PRECIOUS make would delete these as pattern-rule
182
+ # intermediates, recreating them with fresh mtimes next run.
183
+ .PRECIOUS: build/stamps/%.stamp
184
+
185
+ # ---- C Parser ----
186
+
187
+ parse: spinel_parse$(EXE)
188
+
189
+ spinel_parse$(EXE): $(PARSE_STAMP) $(PRISM_LIB)
190
+ $(CC) $(CFLAGS) -I$(PRISM_INC) spinel_parse.c $(PRISM_LIB) -lm -o $@
191
+
192
+ # ---- Runtime library (regexp + bigint) ----
193
+
194
+ RE_SRC = lib/regexp/re_compile.c lib/regexp/re_exec.c lib/regexp/re_utf8.c
195
+ RE_OBJ = $(patsubst lib/regexp/%.c,build/regexp/%.o,$(RE_SRC))
196
+
197
+ build/regexp/%.o: lib/regexp/%.c lib/regexp/re_internal.h
198
+ @mkdir -p build/regexp
199
+ $(CC) -c -O2 $(SEC_FLAGS) -Ilib/regexp $< -o $@
200
+
201
+ build/sp_bigint.o: lib/sp_bigint.c lib/sp_bigint.h lib/mruby_shim.h
202
+ @mkdir -p build
203
+ $(CC) -c -O2 -Wno-all $(SEC_FLAGS) -Ilib lib/sp_bigint.c -o build/sp_bigint.o
204
+
205
+ SP_RT_LIB = lib/libspinel_rt.a
206
+
207
+ $(SP_RT_LIB): $(RE_OBJ) build/sp_bigint.o
208
+ ar rcs $@ $^
209
+
210
+ regexp: $(SP_RT_LIB)
211
+
212
+ # ---- Build the codegen binary (fast path) ----
213
+ # `make spinel_codegen` (or the alias `make codegen`) compiles
214
+ # spinel_codegen.rb once via CRuby and links the result. This is
215
+ # enough to use the binary; for the full self-hosting fixed-point
216
+ # check (gen2.c == gen3.c), use `make bootstrap`.
217
+
218
+ codegen: spinel_codegen$(EXE)
219
+
220
+ spinel_codegen$(EXE): $(CODEGEN_STAMP) spinel_parse$(EXE)
221
+ ./spinel_parse$(EXE) spinel_codegen.rb build/codegen.ast
222
+ ruby spinel_codegen.rb build/codegen.ast build/gen1.c
223
+ $(CC) $(BOOTSTRAP_CFLAGS) -Ilib build/gen1.c $(LDFLAGS) -lm -o spinel_codegen$(EXE)
224
+
225
+ # ---- Self-hosting verification (slow path) ----
226
+ # Re-runs the binary on its own AST to produce gen2.c, compiles bin2,
227
+ # re-runs bin2 to produce gen3.c, asserts gen2.c == gen3.c (the
228
+ # self-hosting fixed point). On success, replaces spinel_codegen with
229
+ # the verified bin2.
230
+
231
+ bootstrap: spinel_codegen$(EXE)
232
+ @echo "=== Bootstrap: gen2 (via spinel_codegen) ==="
233
+ ./spinel_codegen$(EXE) build/codegen.ast build/gen2.c
234
+ $(CC) $(BOOTSTRAP_CFLAGS) -Ilib build/gen2.c $(LDFLAGS) -lm -o build/bin2$(EXE)
235
+ @echo "=== Bootstrap: gen3 (via bin2) - verify ==="
236
+ ./build/bin2$(EXE) build/codegen.ast build/gen3.c
237
+ @diff build/gen2.c build/gen3.c > /dev/null && echo "gen2.c == gen3.c (bootstrap OK)" || (echo "BOOTSTRAP FAILED: gen2.c != gen3.c" && exit 1)
238
+ cp build/bin2$(EXE) spinel_codegen$(EXE)
239
+
240
+ # ---- Test ----
241
+
242
+ TESTS := $(wildcard test/*.rb)
243
+ TEST_TARGETS := $(patsubst test/%.rb,build/test-results/%.ok,$(TESTS))
244
+
245
+ # `make test` is incremental via mtime tracking on .ok files;
246
+ # `make retest` wipes them for a forced rerun.
247
+ test: $(TEST_TARGETS)
248
+ @if [ -z "$(TIMEOUT_BIN)" ]; then echo "Note: no 'timeout' command found; running without time limits."; fi
249
+ @if [ -t 1 ]; then printf '\n'; fi
250
+ @pass=$$(grep -l '^PASS' build/test-results/*.ok 2>/dev/null | wc -l); \
251
+ fail=$$(grep -l '^FAIL' build/test-results/*.ok 2>/dev/null | wc -l); \
252
+ err=$$(grep -l '^ERR' build/test-results/*.ok 2>/dev/null | wc -l); \
253
+ for f in build/test-results/*.ok; do \
254
+ bn=$$(basename "$$f" .ok); \
255
+ status=$$(cat "$$f"); \
256
+ if [ "$$status" = FAIL ]; then \
257
+ echo "FAIL: $$bn"; \
258
+ head -40 "$$f.diff"; \
259
+ elif [ "$$status" = ERR ]; then \
260
+ echo "ERR: $$bn"; \
261
+ fi; \
262
+ done; \
263
+ echo "Tests: $$pass pass, $$fail fail, $$err error"; \
264
+ if [ $$fail -ne 0 ] || [ $$err -ne 0 ]; then exit 1; fi
265
+
266
+ retest: clean-test-results
267
+ @$(MAKE) --no-print-directory test
268
+
269
+ # The .ok target is the test's stamp; mtime tracking gives per-test
270
+ # caching for free. Order-only spinel_parse$(EXE) / spinel_codegen$(EXE)
271
+ # stop a bootstrap relink from invalidating every test.
272
+ build/test-results/%.ok: test/%.rb $(SP_RT_LIB) $(CODEGEN_STAMP) $(PARSE_STAMP) | spinel_parse$(EXE) spinel_codegen$(EXE)
273
+ @mkdir -p build/test-results
274
+ @tmpdir=$$(mktemp -d /tmp/spinel-test.XXXXXX); \
275
+ ast=$$tmpdir/test.ast; \
276
+ cfile=$$tmpdir/test.c; \
277
+ bin=$$tmpdir/test_bin$(EXE); \
278
+ exp=$$tmpdir/expected; \
279
+ act=$$tmpdir/actual; \
280
+ rm -f "$@.diff"; \
281
+ ./spinel_parse$(EXE) "$<" "$$ast" 2>/dev/null && \
282
+ ./spinel_codegen$(EXE) "$$ast" "$$cfile" 2>/dev/null && \
283
+ $(CC) $(CFLAGS) -Werror $(SEC_FLAGS) -Ilib -c "$$cfile" -o "$$cfile.o" 2>/dev/null && \
284
+ $(CC) $(CFLAGS) "$$cfile.o" $(SP_RT_LIB) $(LDFLAGS) -lm $(GC_FLAGS) -o "$$bin" 2>/dev/null; \
285
+ if [ $$? -eq 0 ]; then \
286
+ if [ -f "$<.expected" ]; then \
287
+ LC_ALL=C sed 's/\r$$//' "$<.expected" >"$$exp.n"; \
288
+ else \
289
+ $(TIMEOUT10) $(REF_RUBY) "$<" >"$$exp" 2>/dev/null; \
290
+ ruby_rc=$$?; \
291
+ if [ $$ruby_rc -ne 0 ] && [ "$(REF_RUBY)" != "ruby" ]; then \
292
+ $(TIMEOUT10) ruby "$<" >"$$exp" 2>/dev/null; \
293
+ fi; \
294
+ LC_ALL=C sed 's/\r$$//' "$$exp" >"$$exp.n"; \
295
+ fi; \
296
+ $(TIMEOUT10) "$$bin" >"$$act" 2>/dev/null; \
297
+ LC_ALL=C sed 's/\r$$//' "$$act" >"$$act.n"; \
298
+ if cmp -s "$$exp.n" "$$act.n"; then \
299
+ echo PASS > "$@"; \
300
+ if [ -t 1 ]; then printf .; fi; \
301
+ else \
302
+ echo FAIL > "$@"; \
303
+ diff -u "$$exp.n" "$$act.n" > "$@.diff" 2>&1 || true; \
304
+ if [ -t 1 ]; then printf F; fi; \
305
+ fi; \
306
+ else \
307
+ echo ERR > "$@"; \
308
+ if [ -t 1 ]; then printf E; fi; \
309
+ fi; \
310
+ rm -rf "$$tmpdir"
311
+
312
+ clean-test-results:
313
+ @rm -rf build/test-results
314
+
315
+ # ---- Expected-output regeneration ----
316
+ # Capture each test's reference Ruby output into test/<name>.rb.expected.
317
+ # Once committed, the test target uses the .expected file directly and
318
+ # skips the per-test ruby invocation — useful in CI where ruby's startup
319
+ # (especially mingw64 ruby on Windows) adds up across hundreds of tests.
320
+ # Regenerate after adding or modifying tests; commit the result.
321
+
322
+ EXPECTED_FILES := $(patsubst test/%.rb,test/%.rb.expected,$(TESTS))
323
+
324
+ regen-expected: $(EXPECTED_FILES)
325
+
326
+ test/%.rb.expected: test/%.rb
327
+ @$(TIMEOUT10) $(REF_RUBY) $< >$@.tmp 2>/dev/null; \
328
+ rc=$$?; \
329
+ if [ $$rc -ne 0 ] && [ "$(REF_RUBY)" != "ruby" ]; then \
330
+ $(TIMEOUT10) ruby $< >$@.tmp 2>/dev/null; \
331
+ fi; \
332
+ LC_ALL=C sed 's/\r$$//' $@.tmp > $@; \
333
+ rm -f $@.tmp
334
+
335
+ bench: spinel_parse$(EXE) $(SP_RT_LIB) spinel_codegen$(EXE)
336
+ @if [ -z "$(TIMEOUT_BIN)" ]; then echo "Note: no 'timeout' command found; running without time limits."; fi
337
+ @total=$$(ls benchmark/*.rb | wc -l); \
338
+ if [ -t 1 ]; then tty=1; else tty=0; fi; \
339
+ pass=0; fail=0; err=0; skip=0; i=0; \
340
+ for f in benchmark/*.rb; do \
341
+ i=$$((i+1)); \
342
+ bn=$$(basename "$$f" .rb); \
343
+ if [ "$$tty" = 1 ]; then printf '\r\033[K [%d/%d] %s' "$$i" "$$total" "$$bn"; fi; \
344
+ $(TIMEOUT10) ./spinel_parse$(EXE) "$$f" /tmp/_sp_b.ast 2>/dev/null && \
345
+ $(TIMEOUT10) ./spinel_codegen$(EXE) /tmp/_sp_b.ast /tmp/_sp_b.c 2>/dev/null && \
346
+ $(CC) $(CFLAGS) -Werror $(SEC_FLAGS) -Ilib -c /tmp/_sp_b.c -o /tmp/_sp_b.c.o 2>/dev/null && \
347
+ $(CC) $(CFLAGS) /tmp/_sp_b.c.o $(SP_RT_LIB) $(LDFLAGS) -lm $(GC_FLAGS) -o /tmp/_sp_b_bin$(EXE) 2>/dev/null; \
348
+ if [ $$? -eq 0 ]; then \
349
+ $(TIMEOUT60) $(REF_RUBY) "$$f" >/tmp/_sp_b_exp 2>/dev/null; \
350
+ ruby_rc=$$?; \
351
+ if [ $$ruby_rc -ne 0 ] && [ "$(REF_RUBY)" != "ruby" ]; then \
352
+ $(TIMEOUT60) ruby "$$f" >/tmp/_sp_b_exp 2>/dev/null; \
353
+ ruby_rc=$$?; \
354
+ fi; \
355
+ if [ $$ruby_rc -eq 124 ]; then \
356
+ if [ "$$tty" = 1 ]; then printf '\r\033[K'; fi; \
357
+ echo "SKIP: $$bn (ruby timeout)"; skip=$$((skip+1)); \
358
+ else \
359
+ $(TIMEOUT60) /tmp/_sp_b_bin$(EXE) >/tmp/_sp_b_act 2>/dev/null; \
360
+ LC_ALL=C sed 's/\r$$//' /tmp/_sp_b_exp >/tmp/_sp_b_exp.n; \
361
+ LC_ALL=C sed 's/\r$$//' /tmp/_sp_b_act >/tmp/_sp_b_act.n; \
362
+ if cmp -s /tmp/_sp_b_exp.n /tmp/_sp_b_act.n; then \
363
+ pass=$$((pass+1)); \
364
+ else \
365
+ if [ "$$tty" = 1 ]; then printf '\r\033[K'; fi; \
366
+ echo "FAIL: $$bn"; \
367
+ diff -u /tmp/_sp_b_exp.n /tmp/_sp_b_act.n 2>&1 | head -40; \
368
+ fail=$$((fail+1)); \
369
+ fi; \
370
+ fi; \
371
+ else \
372
+ if [ "$$tty" = 1 ]; then printf '\r\033[K'; fi; \
373
+ echo "ERR: $$bn"; err=$$((err+1)); \
374
+ fi; \
375
+ done; \
376
+ if [ "$$tty" = 1 ]; then printf '\r\033[K'; fi; \
377
+ rm -f /tmp/_sp_b.ast /tmp/_sp_b.c /tmp/_sp_b.c.o /tmp/_sp_b_bin$(EXE) /tmp/_sp_b_exp /tmp/_sp_b_act /tmp/_sp_b_exp.n /tmp/_sp_b_act.n; \
378
+ echo "Benchmarks: $$pass pass, $$fail fail, $$err error, $$skip skip"; \
379
+ if [ $$fail -ne 0 ] || [ $$err -ne 0 ]; then exit 1; fi
380
+
381
+ # ---- Install ----
382
+
383
+ PREFIX ?= /usr/local
384
+ SPNLDIR = $(PREFIX)/lib/spinel
385
+
386
+ install: all
387
+ install -d $(SPNLDIR)/lib
388
+ install -m 755 spinel $(SPNLDIR)/
389
+ install -m 755 spinel_parse$(EXE) $(SPNLDIR)/
390
+ install -m 755 spinel_codegen$(EXE) $(SPNLDIR)/
391
+ install -m 644 spinel_codegen.rb $(SPNLDIR)/
392
+ install -m 644 lib/libspinel_rt.a $(SPNLDIR)/lib/
393
+ install -m 644 lib/sp_runtime.h $(SPNLDIR)/lib/
394
+ install -m 644 lib/*.rb $(SPNLDIR)/lib/
395
+ install -d $(PREFIX)/bin
396
+ ln -sf $(SPNLDIR)/spinel $(PREFIX)/bin/spinel
397
+
398
+ uninstall:
399
+ rm -f $(PREFIX)/bin/spinel
400
+ rm -rf $(SPNLDIR)
401
+
402
+ # ---- Clean ----
403
+
404
+ clean:
405
+ rm -rf build/
406
+ rm -f spinel_parse$(EXE) spinel_codegen$(EXE)
@@ -0,0 +1,217 @@
1
+ # Stage 2 設計案: poly-as-set 型表現
2
+
3
+ Stage 1 (`narrow_param_types_from_body_method_calls`、commit `0d10645`) の制約「呼ばれる全メソッドが**ただ1つ**のクラスにしかない」を外すための、内部型表現の拡張案。記録目的。実装は未着手。
4
+
5
+ ## 動機
6
+
7
+ 現状の "poly" は不透明な単一トークン。次の精度向上が手に入っていない:
8
+
9
+ 1. **set-intersection narrowing** — 候補集合を観測ごとに intersect して絞る
10
+ ```ruby
11
+ def render(model)
12
+ model.title # Article のみ → {Article}
13
+ model.body # Article + Comment → {Article, Comment}
14
+ # 交差 = {Article} → narrow できるはず
15
+ end
16
+ ```
17
+ Stage 1 では `model.body` の信号がぼやけて捨てられる。
18
+
19
+ 2. **else-arm 負の絞り込み** — `if x.is_a?(A); ... ; else; # x:NOT(A) ; end`
20
+ 現在 scan_new_calls の comment にも明示:
21
+ > The else-arm walks unchanged (we don't currently model "type minus C")
22
+
23
+ 3. **emit サイズ削減** — `compile_poly_method_call` の per-class arm が `@cls_names` を全列挙。候補集合に絞れば未到達 arm を消せる。
24
+
25
+ ## 内部表現
26
+
27
+ ### 文字列エンコード案
28
+
29
+ `"poly"` → `"poly{<sorted-class-name-list>}"` (集合を文字列でエンコード):
30
+
31
+ ```
32
+ "poly" → 既存の "全クラス" 意味、互換維持のため keep
33
+ "poly{Article}" → 単一クラス、`obj_Article` と等価扱いで折り畳み可能
34
+ "poly{Article;Comment}" → 二項
35
+ "poly{Article;Comment;HWIA}" → 三項
36
+ "poly{Article;Comment;HWIA}?" → nullable版 (既存の `?` サフィックス慣習継承)
37
+ ```
38
+
39
+ セパレータは `;` (既存の `@cls_meth_params` のクラス区切り `|` や param 区切り `,` と衝突しない、`@cls_meth_names` の method 区切りと一致)。
40
+
41
+ ### 正規化ルール
42
+
43
+ - ソートして決定的なエンコードに (`{B;A}` ではなく `{A;B}`)
44
+ - 重複除去
45
+ - サイズ 1 → `obj_<C>` に折り畳み (representation lift; 集合表現を消す)
46
+ - 全クラスを含む → `"poly"` に折り畳み (degenerate case)
47
+
48
+ ### 影響を受ける関数 (主要)
49
+
50
+ | 関数 | 既存ロジック | 必要な拡張 |
51
+ |------|-------------|------------|
52
+ | `base_type` | `"obj_C?"` → `"obj_C"` | `"poly{A;B}?"` → `"poly{A;B}"` |
53
+ | `is_obj_type` | `"obj_"` プレフィックス判定 | (poly-set は obj_ ではない、独立) |
54
+ | `is_value_type_obj` | obj_C の class lookup | poly-set は value-type 不可 (各候補は struct 化 NG) |
55
+ | `c_type` | `"poly"` → `"sp_RbVal"` | `"poly{...}"` も同じく `"sp_RbVal"` |
56
+ | `c_default_val` | `"poly"` → `"sp_box_nil()"` | 同 |
57
+ | `unify_call_types` | 二項 unify | set union (詳細下記) |
58
+ | `box_value_to_poly` | obj_C / 各種 → sp_box_* | set 経由は対象外、各 candidate ごとに caller 側で box済を期待 |
59
+
60
+ ### unify_call_types の拡張
61
+
62
+ ```
63
+ unify("poly{A;B}", "obj_A") = "poly{A;B}" (subset → 包含)
64
+ unify("poly{A;B}", "obj_C") = "poly{A;B;C}" (union)
65
+ unify("poly{A;B}", "poly{B;C}") = "poly{A;B;C}" (union)
66
+ unify("poly{A;B}", "poly{A;B}") = "poly{A;B}" (idempotent)
67
+ unify("poly{A;B}", "int") = "poly" (混合型は既存 poly に degrade)
68
+ unify("obj_A", "obj_B") = "poly{A;B}" (新ロジック; 現状は "poly")
69
+ unify("poly", any) = "poly" (degenerate keep)
70
+ ```
71
+
72
+ ポイント: **混合型 (obj+primitive) は既存の不透明 `"poly"` に落とす**。これにより既存コードの `"poly"` 判定 (受け取り側のすべての場所) と互換が取れる。`"poly{...}"` は **すべて user obj** な集合に限定。
73
+
74
+ ### intersection 演算 (Stage 1 を一般化)
75
+
76
+ ```
77
+ intersect("poly{A;B;C}", "poly{B;C;D}") = "poly{B;C}"
78
+ intersect("poly{A;B}", "poly{C;D}") = "" (空 → 信号矛盾)
79
+ intersect("poly{A}", "obj_A") = "obj_A"
80
+ intersect("poly{A;B}", "obj_C") = "" (空)
81
+ ```
82
+
83
+ Stage 1 の `unify_param_class_from_observations` を集合演算で書き直す:
84
+ - 各観測 `param.<m>` で「`<m>` を定義する user class 集合 S(m)」を計算
85
+ - 各観測の S(m) で intersection を取る
86
+ - `is_primitive_shared_method(m)` は S に「全クラス + builtins」を意味するので intersection 中立 (skip)
87
+ - 最終 intersection が空でなければ narrow
88
+
89
+ ### type minus 演算 (else-arm)
90
+
91
+ ```
92
+ type_minus("poly{A;B;C}", "obj_A") = "poly{B;C}"
93
+ type_minus("poly{A;B}", "obj_A") = "obj_B" (size 1 折り畳み)
94
+ type_minus("poly{A}", "obj_A") = "" (空; unreachable)
95
+ type_minus("poly", "obj_A") = "poly" (不透明は触らない)
96
+ ```
97
+
98
+ scan_new_calls の IfNode 処理に else-arm narrow を追加:
99
+ ```ruby
100
+ # then-arm
101
+ if narrow_var != ""
102
+ push_type_narrow(narrow_var, narrow_t) # 既存
103
+ end
104
+ walk(then_body)
105
+ pop
106
+
107
+ # else-arm (新規)
108
+ else_narrow_t = type_minus(原型, narrow_t)
109
+ if else_narrow_t != ""
110
+ push_type_narrow(narrow_var, else_narrow_t)
111
+ end
112
+ walk(else_body)
113
+ pop
114
+ ```
115
+
116
+ ## emit-side 変更
117
+
118
+ ### compile_poly_method_call
119
+
120
+ ```ruby
121
+ # 現状:
122
+ i = 0
123
+ while i < @cls_names.length
124
+ midx = cls_find_method_direct(i, mname)
125
+ if midx >= 0
126
+ # arm 出力
127
+ end
128
+ i += 1
129
+ end
130
+
131
+ # Stage 2:
132
+ candidates = poly_candidates(recv_type) # "poly{A;B}" → ["A", "B"]
133
+ # 候補が空 (= 不透明 "poly") なら現状通り全列挙
134
+ # 候補があれば限定列挙
135
+ candidates.each { |cn|
136
+ ci = find_class_idx(cn)
137
+ midx = cls_find_method_direct(ci, mname)
138
+ if midx >= 0
139
+ # arm 出力
140
+ end
141
+ }
142
+ ```
143
+
144
+ emit 量削減: Roundhouse 規模 (~20 user class、平均候補3クラス) で arm 17 個 ÷ poly call sites 50-100 個 ≈ 1000-2000 行の C 削減 (runtime 動作に影響なし、cc 時間 + emit サイズのみ)。
145
+
146
+ ### sp_RbVal タグの動作変化なし
147
+
148
+ ランタイムの sp_RbVal/cls_id 機構は変更不要。集合は **静的判定** だけの情報。runtime は cls_id で正しく分岐。
149
+
150
+ ## 不動点の収束
151
+
152
+ Stage 2 では union (拡大) と intersection (縮小) の両方を扱う:
153
+
154
+ - caller→callee widening (scan_new_calls): union で拡大
155
+ - callee→caller (戻り値伝播): union で拡大
156
+ - body-side narrow (Stage 1 拡張): intersection で縮小
157
+
158
+ 各 round 内の順序を:
159
+ 1. union 系 (call-site 観測) を全部走らせて param ptype を膨らませる
160
+ 2. その後で intersection 系 (body 観測) を走らせて絞る
161
+
162
+ → "拡大→縮小" の順序が各 round で一定なら、実質単調に近づく。`inference_signature` で前回と等しくなったら stop。最大 round 数を上げる必要があるかもしれない (現状 4 → 6〜8 程度に)。
163
+
164
+ ## 互換性 / 移行ステップ
165
+
166
+ Stage 2 を 1 PR で全部入れるのは bootstrap risk が高い。段階移行:
167
+
168
+ ### 2a. 表現拡張 (no-op)
169
+ - `"poly{A;B}"` 文字列を内部で生成する経路を入れるが、すべて `"poly"` に折り畳んで返す
170
+ - `unify_call_types` などはまだ既存挙動
171
+ - すべての判定箇所が新表現を view できることを bootstrap で確認
172
+
173
+ ### 2b. set-intersection narrow
174
+ - Stage 1 の単一クラス制約を外す
175
+ - `unify_param_class_from_observations` を set intersection で書き直す
176
+ - 既存の `"poly"` への混合型 degrade はそのまま
177
+
178
+ ### 2c. else-arm 負の絞り込み
179
+ - IfNode の else-arm に type_minus 適用
180
+ - recursive scan のスコープ管理を慎重に (then と else で違う narrow)
181
+
182
+ ### 2d. emit-side 列挙の限定
183
+ - `compile_poly_method_call` で候補集合があればそれを使う
184
+ - emit 出力差を 1 PR で分離 (review しやすさのため)
185
+
186
+ ## リスクと観察ポイント
187
+
188
+ 1. **bootstrap stability**: 型文字列処理の 1 箇所のミスで gen2 != gen3 → CI 全敗
189
+ - 各サブステップ後 `make bootstrap` 必須
190
+ - 表現変更前に既存 split/join ロジックの全数 grep し、新セパレータ衝突の有無を確認
191
+
192
+ 2. **テスト盲点**:
193
+ - 集合サイズ 0 (空 = unreachable) のハンドリング
194
+ - サイズ 1 → obj_<C> 折り畳みの一貫性
195
+ - 全クラス集合と "poly" の等価扱い
196
+
197
+ 3. **ROI 計測**:
198
+ - Stage 2a 完了時点で既存テスト + Roundhouse archive で no-op 確認
199
+ - Stage 2b 後、stage 1 で narrow できなかった param が集合 narrow できる事例を 1 つ以上見つける (見つからないなら投資中止判断材料)
200
+ - Stage 2c, 2d は 2b の効果を見て継続判断
201
+
202
+ ## 着手判断条件
203
+
204
+ Stage 2 に踏み込むべきタイミング:
205
+
206
+ - `caller-side widening が届かない経路` 起源でない、**型精度**起源のバグが具体例で現れた時
207
+ - Roundhouse 移行が runtime 段階に入って "static dispatch ミス" が顕在化した時
208
+ - emit サイズ・cc 時間のボトルネックが計測で示された時 (現状は CI 11分問題は sccache miss 由来で、emit サイズではない)
209
+
210
+ それまでは Stage 1 で観察を継続。
211
+
212
+ ---
213
+
214
+ 参考:
215
+ - Stage 1: `narrow_param_types_from_body_method_calls` (`0d10645`)
216
+ - 関連コメント: `spinel_codegen.rb` の `scan_new_calls` IfNode 処理 ("we don't currently model 'type minus C'")
217
+ - 既存集合的ロジックの先例: `module_acc_resolved` のセミコロン区切りクラス候補リスト (#126)