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,10 @@
1
+ def tak(x, y, z)
2
+ if y < x
3
+ tak(tak(x - 1, y, z), tak(y - 1, z, x), tak(z - 1, x, y))
4
+ else
5
+ z
6
+ end
7
+ end
8
+
9
+ puts tak(18, 9, 0)
10
+ puts "done"
@@ -0,0 +1,10 @@
1
+ def tarai(x, y, z)
2
+ if x <= y
3
+ y
4
+ else
5
+ tarai(tarai(x - 1, y, z), tarai(y - 1, z, x), tarai(z - 1, x, y))
6
+ end
7
+ end
8
+
9
+ puts tarai(12, 6, 0)
10
+ puts "done"
@@ -0,0 +1,50 @@
1
+ # Simple template engine
2
+ # Replaces {{key}} with values from a hash
3
+
4
+ def render(template, vars)
5
+ result = ""
6
+ i = 0
7
+ while i < template.length
8
+ if i + 1 < template.length && template[i] == "{" && template[i + 1] == "{"
9
+ # Find closing }}
10
+ j = i + 2
11
+ while j + 1 < template.length
12
+ if template[j] == "}" && template[j + 1] == "}"
13
+ break
14
+ end
15
+ j = j + 1
16
+ end
17
+ key = template[i + 2, j - i - 2]
18
+ if vars.has_key?(key)
19
+ result = result + vars[key]
20
+ else
21
+ result = result + "{{" + key + "}}"
22
+ end
23
+ i = j + 2
24
+ else
25
+ result = result + template[i]
26
+ i = i + 1
27
+ end
28
+ end
29
+ result
30
+ end
31
+
32
+ # Test
33
+ tmpl = "Hello {{name}}! You are {{age}} years old. Welcome to {{city}}."
34
+ vars = {"name" => "Matz", "age" => "58", "city" => "Matsue"}
35
+ puts render(tmpl, vars)
36
+
37
+ tmpl2 = "{{greeting}} {{name}}, {{message}}"
38
+ vars2 = {"greeting" => "Hi", "name" => "World", "message" => "how are you?"}
39
+ puts render(tmpl2, vars2)
40
+
41
+ # Missing key
42
+ puts render("{{known}} and {{unknown}}", {"known" => "yes"})
43
+
44
+ # Benchmark
45
+ i = 0
46
+ while i < 50000
47
+ render(tmpl, vars)
48
+ i = i + 1
49
+ end
50
+ puts "done"
@@ -0,0 +1,25 @@
1
+ def foo
2
+ yield
3
+ end
4
+
5
+ def bar
6
+ foo { return 1 }
7
+ end
8
+
9
+ total = 0
10
+ i = 0
11
+ while i < 200000
12
+ total = total + bar
13
+ total = total + bar
14
+ total = total + bar
15
+ total = total + bar
16
+ total = total + bar
17
+ total = total + bar
18
+ total = total + bar
19
+ total = total + bar
20
+ total = total + bar
21
+ total = total + bar
22
+ i = i + 1
23
+ end
24
+ puts total
25
+ puts "done"
@@ -0,0 +1,43 @@
1
+ # Word frequency counter using str_int_hash
2
+ # Tests Hash, String, Array operations
3
+
4
+ def gen_words(n)
5
+ words = ["the", "of", "and", "to", "in", "a", "is", "that", "for", "it",
6
+ "was", "on", "are", "be", "with", "as", "at", "by", "this", "from"]
7
+ result = []
8
+ seed = 42
9
+ i = 0
10
+ while i < n
11
+ seed = (seed * 1103515245 + 12345) % 2147483648
12
+ idx = seed / 107374182
13
+ result.push(words[idx])
14
+ i = i + 1
15
+ end
16
+ result
17
+ end
18
+
19
+ n = Integer(ARGV[0] || 10000)
20
+ words = gen_words(n)
21
+
22
+ freq = {}
23
+ i = 0
24
+ while i < words.length
25
+ w = words[i]
26
+ if freq.key?(w)
27
+ freq[w] = freq[w] + 1
28
+ else
29
+ freq[w] = 1
30
+ end
31
+ i = i + 1
32
+ end
33
+
34
+ # Sum all counts
35
+ keys = freq.keys
36
+ total = 0
37
+ i = 0
38
+ while i < keys.length
39
+ total = total + freq[keys[i]]
40
+ i = i + 1
41
+ end
42
+ puts total
43
+ puts keys.length
@@ -0,0 +1,198 @@
1
+ # Spinel FFI
2
+
3
+ Call C functions from Spinel Ruby programs. No extension compiler, no
4
+ `require "ffi"`: declarations go straight into the source and the AOT
5
+ compiler generates direct C call sites with the right externs and
6
+ linker flags.
7
+
8
+ ## Example
9
+
10
+ ```ruby
11
+ module LibC
12
+ ffi_func :strlen, [:str], :size_t
13
+ ffi_func :getpid, [], :int
14
+ end
15
+
16
+ puts LibC.strlen("hello, world") # 12
17
+ puts LibC.getpid
18
+ ```
19
+
20
+ Compile and run:
21
+
22
+ ```sh
23
+ ./spinel prog.rb && ./prog
24
+ ```
25
+
26
+ `libc` and `libm` are always linked; anything else needs `ffi_lib`.
27
+
28
+ ## DSL reference
29
+
30
+ All FFI declarations go inside a `module` body. The module name becomes
31
+ the namespace for the functions (`RAY.InitWindow`, `LibC.strlen`, …).
32
+
33
+ ### `ffi_lib "name"`
34
+
35
+ Declares that this module needs `-lname` on the link command line. May
36
+ appear multiple times per module.
37
+
38
+ ```ruby
39
+ module SQL
40
+ ffi_lib "sqlite3"
41
+ end
42
+ ```
43
+
44
+ ### `ffi_cflags "..."`
45
+
46
+ Declares cflags (include dirs, defines, link-search paths) needed for
47
+ this module's externs. Rarely needed — externs use standard C types
48
+ only, so headers don't have to be included in the generated code — but
49
+ useful when a library is installed somewhere non-standard.
50
+
51
+ ```ruby
52
+ ffi_cflags "-I/usr/local/include"
53
+ ffi_cflags "-Wl,-rpath,/usr/local/lib"
54
+ ```
55
+
56
+ ### `ffi_func :name, [arg_types], ret_type`
57
+
58
+ Declares a C function callable as `Module.name(...)`.
59
+
60
+ ```ruby
61
+ ffi_func :sqlite3_open, [:str, :ptr], :int
62
+ ffi_func :sqlite3_close, [:ptr], :int
63
+ ffi_func :sqlite3_exec, [:ptr, :str, :ptr, :ptr, :ptr], :int
64
+ ffi_func :sqlite3_errmsg, [:ptr], :str
65
+ ```
66
+
67
+ Recognized type specs:
68
+
69
+ | spec | C type | Spinel type |
70
+ |---|---|---|
71
+ | `:int` | `int` | `int` |
72
+ | `:uint32` | `uint32_t` | `int` |
73
+ | `:int32` | `int32_t` | `int` |
74
+ | `:uint16` | `uint16_t` | `int` |
75
+ | `:int16` | `int16_t` | `int` |
76
+ | `:uint8` | `uint8_t` | `int` |
77
+ | `:int8` | `int8_t` | `int` |
78
+ | `:size_t` | `size_t` | `int` |
79
+ | `:long` | `long` | `int` |
80
+ | `:float` | `float` | `float` |
81
+ | `:double` | `double` | `float` |
82
+ | `:bool` | `int` | `bool` |
83
+ | `:str` | `const char *` | `string` |
84
+ | `:ptr` | `void *` | `ptr` |
85
+ | `:void` | `void` | `void` (return only) |
86
+
87
+ All integer types collapse to `mrb_int` (int64) inside Spinel and are
88
+ cast to the declared C type at the call boundary. Floats collapse to
89
+ `double` the same way.
90
+
91
+ ### `ffi_const :NAME, <int>`
92
+
93
+ Declares an integer constant accessible as `Module::NAME`. Pure
94
+ convenience — the value is inlined at use sites like any other Ruby
95
+ integer constant.
96
+
97
+ ```ruby
98
+ ffi_const :SQLITE_OK, 0
99
+ ffi_const :SQLITE_ROW, 100
100
+ ffi_const :SQLITE_DONE, 101
101
+ ```
102
+
103
+ ### `ffi_buffer :name, <size>`
104
+
105
+ Declares a static `size`-byte buffer, accessible as `Module.name`
106
+ returning a `:ptr`. Useful as scratch space or as an out-parameter for
107
+ functions like sqlite3's `sqlite3_open`, which writes the database
108
+ handle into a caller-supplied `sqlite3 **`.
109
+
110
+ ```ruby
111
+ ffi_buffer :db_out, 8
112
+ SQL.sqlite3_open(":memory:", SQL.db_out)
113
+ db = SQL.read_ptr(SQL.db_out) # the actual sqlite3 *
114
+ ```
115
+
116
+ Lifetime: static. The buffer lives for the whole program.
117
+
118
+ ### `ffi_read_u32 :name, <offset>` / `ffi_read_i32` / `ffi_read_ptr`
119
+
120
+ Declares a field reader: `Module.name(buf)` returns the value at
121
+ `offset` bytes into `buf`. Handy for poking into C structs when you
122
+ only need a few fields, or for reading back what a C function wrote
123
+ into a buffer you handed it.
124
+
125
+ ```ruby
126
+ # sqlite3_open(path, ppDb) writes the new db handle into *ppDb.
127
+ # Pull the pointer out of our scratch buffer at offset 0.
128
+ ffi_read_ptr :read_ptr, 0
129
+
130
+ db = SQL.read_ptr(SQL.db_out)
131
+ ```
132
+
133
+ No `ffi_write_*` in the MVP — the assumption is that a C function is
134
+ the one writing into the buffer; Ruby just reads back.
135
+
136
+ ## Pointer semantics
137
+
138
+ `:ptr` maps to C `void *`. Values of this type are **not GC-tracked**:
139
+ the Spinel garbage collector never follows them and never frees them.
140
+ Foreign memory is the user's responsibility.
141
+
142
+ Two consequences worth knowing:
143
+
144
+ 1. **Call destroy functions explicitly.** Nothing calls `sqlite3_close`,
145
+ `sqlite3_finalize`, or `free()` for you.
146
+ 2. **Strings passed into C are only valid for the duration of the
147
+ call.** Spinel strings are GC-managed; if a C function stashes the
148
+ pointer somewhere and the string becomes unreachable afterward, a
149
+ later GC cycle will free it out from under the C code. If you need
150
+ a string to outlive the call, copy it into an `ffi_buffer` first.
151
+
152
+ `ptr` values compare equal to `nil` when the pointer is NULL:
153
+
154
+ ```ruby
155
+ db = SQL.read_ptr(SQL.db_out)
156
+ if db == nil
157
+ puts "could not open database"
158
+ end
159
+ ```
160
+
161
+ ## Link-flag plumbing
162
+
163
+ The codegen emits marker comments into the generated C:
164
+
165
+ ```c
166
+ /* SPINEL_LINK: -lsqlite3 */
167
+ /* SPINEL_CFLAGS: -I/usr/local/include */
168
+ ```
169
+
170
+ The `spinel` wrapper script scrapes these with `sed` and appends them
171
+ to the `cc` invocation. If you want to override (e.g. static linking or
172
+ a custom lib path), use `-c` to stop at C and drive the linker yourself.
173
+
174
+ ## Limitations
175
+
176
+ The MVP covers scalars, strings, opaque pointers, integer constants,
177
+ raw byte buffers, and simple struct-field reads. Not supported yet:
178
+
179
+ - **No struct declarations.** Use `ffi_buffer` + `ffi_read_*` for the
180
+ handful of fields you need.
181
+ - **No callbacks / Ruby-to-C function pointers.**
182
+ - **No variadic C functions** (`printf(...)`). Use Spinel's built-in
183
+ `printf` if you want formatted output.
184
+ - **No `ffi_write_*`** — can't write struct fields from Ruby. Pass a
185
+ buffer to a C function that writes it for you.
186
+ - **Pointers can't enter polymorphic values.** Don't put a `:ptr` into
187
+ a `poly_array` or a generic `Hash`; keep them as plain locals or
188
+ wrap them in a class with a `ptr`-typed ivar.
189
+
190
+ ## Examples
191
+
192
+ Runnable examples live under `examples/ffi/`:
193
+
194
+ - `examples/ffi/libm/` — libc / libm smoke (cos, sqrt, pow, strlen, getpid)
195
+ - `examples/ffi/sqlite/` — blog system (posts, tags, comments) on sqlite3
196
+
197
+ Each subdirectory has a `README.md` with build instructions and the
198
+ required system packages.
@@ -0,0 +1,24 @@
1
+ # libc / libm FFI demo
2
+
3
+ Calls a handful of libc and libm functions directly. libc and libm are
4
+ linked into every Spinel binary by default, so no `ffi_lib` declaration
5
+ is needed for these.
6
+
7
+ ## Build & run
8
+
9
+ From the repo root:
10
+
11
+ ```sh
12
+ ./spinel examples/ffi/libm/libm.rb
13
+ ./libm
14
+ ```
15
+
16
+ Expected output:
17
+
18
+ ```
19
+ 1
20
+ 4
21
+ 1024
22
+ 12
23
+ pid > 0: true
24
+ ```
@@ -0,0 +1,17 @@
1
+ module LibM
2
+ ffi_func :cos, [:double], :double
3
+ ffi_func :sin, [:double], :double
4
+ ffi_func :sqrt, [:double], :double
5
+ ffi_func :pow, [:double, :double], :double
6
+ end
7
+
8
+ module LibC
9
+ ffi_func :strlen, [:str], :size_t
10
+ ffi_func :getpid, [], :int
11
+ end
12
+
13
+ puts LibM.cos(0.0).to_i
14
+ puts LibM.sqrt(16.0).to_i
15
+ puts LibM.pow(2.0, 10.0).to_i
16
+ puts LibC.strlen("hello, world")
17
+ puts "pid > 0: " + (LibC.getpid > 0).to_s
@@ -0,0 +1,73 @@
1
+ # SQLite3 FFI demo — toy blog
2
+
3
+ A self-contained blog (posts, tags, comments) running on top of
4
+ SQLite3 via Spinel's FFI. Demonstrates:
5
+
6
+ - Open / close a database
7
+ - DDL via `sqlite3_exec`
8
+ - INSERT with `last_insert_rowid` follow-up
9
+ - Many-to-many joins (post_tags)
10
+ - SELECT with `prepare_v2` / `step` / `finalize` and `column_int` /
11
+ `column_text`
12
+ - `:ptr` out-params (`sqlite3 **`, `sqlite3_stmt **`) read back via
13
+ `ffi_buffer` + `ffi_read_ptr`
14
+
15
+ ## Setup
16
+
17
+ You need SQLite3 development headers and a linker stub:
18
+
19
+ ```sh
20
+ # Debian / Ubuntu / WSL
21
+ sudo apt install libsqlite3-dev
22
+
23
+ # Fedora
24
+ sudo dnf install sqlite-devel
25
+
26
+ # macOS (Homebrew)
27
+ brew install sqlite
28
+ ```
29
+
30
+ Spinel's `ffi_lib "sqlite3"` becomes `-lsqlite3` at link time, so the
31
+ runtime library (`libsqlite3.so`/`.dylib`) needs to be on the loader's
32
+ search path.
33
+
34
+ ## Build & run
35
+
36
+ From the repo root:
37
+
38
+ ```sh
39
+ ./spinel examples/ffi/sqlite/blog.rb
40
+ ./blog
41
+ ```
42
+
43
+ Expected output:
44
+
45
+ ```
46
+ Posts (with comment + tag counts):
47
+ [1] Spinel learns to call C (2 comments, 3 tags)
48
+ [2] Tasting o'tea (1 comments, 2 tags)
49
+ [3] Hashes vs SymIntHash (1 comments, 2 tags)
50
+
51
+ Posts tagged 'spinel':
52
+ - Spinel learns to call C
53
+ - Hashes vs SymIntHash
54
+
55
+ Comments on the FFI post:
56
+ alice: Wonderful — does it work with libcurl too?
57
+ bob: I tried sqlite3 myself; the bindings are tidy.
58
+ ```
59
+
60
+ ## Files
61
+
62
+ - `sqlite3_lib.rb` — minimal FFI bindings + a `Sql.q` helper that
63
+ escapes single quotes for inline string literals.
64
+ - `blog.rb` — the demo program.
65
+
66
+ ## Notes
67
+
68
+ The demo uses inline-quoted SQL with `Sql.q` for escaping, not bound
69
+ parameters. The reason: `sqlite3_bind_text`'s last argument is a
70
+ destructor callback (the `SQLITE_TRANSIENT` sentinel is `(void *)-1`),
71
+ and the MVP FFI can't yet construct a `:ptr` from a sentinel integer.
72
+ For real applications you'd write a tiny C helper that wraps `bind_text`
73
+ with `SQLITE_TRANSIENT` baked in and link it alongside.
@@ -0,0 +1,185 @@
1
+ require_relative "sqlite3_lib"
2
+
3
+ # A toy blog: posts, tags (many-to-many), comments. Demonstrates
4
+ # create / insert / select with a few joins on top of the bare-metal
5
+ # Spinel SQLite FFI bindings.
6
+
7
+ class Blog
8
+ def initialize(path)
9
+ rc = SQL.sqlite3_open(path, SQL.db_out)
10
+ if rc != SQL::OK
11
+ puts "sqlite3_open failed: " + rc.to_s
12
+ exit(1)
13
+ end
14
+ @db = SQL.read_ptr(SQL.db_out)
15
+ end
16
+
17
+ def close
18
+ SQL.sqlite3_close(@db)
19
+ @db = nil
20
+ end
21
+
22
+ # Run a statement that returns no rows (DDL, INSERT/UPDATE/DELETE).
23
+ def exec(sql)
24
+ rc = SQL.sqlite3_exec(@db, sql, nil, nil, nil)
25
+ if rc != SQL::OK
26
+ puts "exec failed (" + rc.to_s + "): " + SQL.sqlite3_errmsg(@db)
27
+ puts " sql: " + sql
28
+ exit(1)
29
+ end
30
+ end
31
+
32
+ def last_id
33
+ SQL.sqlite3_last_insert_rowid(@db)
34
+ end
35
+
36
+ # Prepare and step through a SELECT, returning the resulting stmt
37
+ # pointer. Caller is responsible for finalizing.
38
+ def prepare(sql)
39
+ rc = SQL.sqlite3_prepare_v2(@db, sql, -1, SQL.stmt_out, nil)
40
+ if rc != SQL::OK
41
+ puts "prepare failed (" + rc.to_s + "): " + SQL.sqlite3_errmsg(@db)
42
+ puts " sql: " + sql
43
+ exit(1)
44
+ end
45
+ SQL.read_ptr(SQL.stmt_out)
46
+ end
47
+
48
+ def db
49
+ @db
50
+ end
51
+ end
52
+
53
+ # Convenience wrappers — keep call sites readable.
54
+ def step?(stmt)
55
+ SQL.sqlite3_step(stmt) == SQL::ROW
56
+ end
57
+
58
+ def col_text(stmt, i)
59
+ s = SQL.sqlite3_column_text(stmt, i)
60
+ if s == nil
61
+ return ""
62
+ end
63
+ # Copy out — the buffer is invalidated by the next step / finalize.
64
+ s + ""
65
+ end
66
+
67
+ def col_int(stmt, i)
68
+ SQL.sqlite3_column_int(stmt, i)
69
+ end
70
+
71
+ def finalize(stmt)
72
+ SQL.sqlite3_finalize(stmt)
73
+ end
74
+
75
+ # Look up the id of a tag by name (creating it on the fly if missing).
76
+ def upsert_tag(blog, name)
77
+ blog.exec("INSERT OR IGNORE INTO tags (name) VALUES ('" + Sql.q(name) + "')")
78
+ stmt = blog.prepare("SELECT id FROM tags WHERE name = '" + Sql.q(name) + "'")
79
+ tid = 0
80
+ if step?(stmt)
81
+ tid = col_int(stmt, 0)
82
+ end
83
+ finalize(stmt)
84
+ tid
85
+ end
86
+
87
+ def add_post(blog, title, body, tag_names)
88
+ blog.exec("INSERT INTO posts (title, body) VALUES ('" +
89
+ Sql.q(title) + "', '" + Sql.q(body) + "')")
90
+ pid = blog.last_id
91
+ tag_names.each { |t|
92
+ tid = upsert_tag(blog, t)
93
+ blog.exec("INSERT INTO post_tags (post_id, tag_id) VALUES (" +
94
+ pid.to_s + ", " + tid.to_s + ")")
95
+ }
96
+ pid
97
+ end
98
+
99
+ def add_comment(blog, post_id, author, body)
100
+ blog.exec("INSERT INTO comments (post_id, author, body) VALUES (" +
101
+ post_id.to_s + ", '" + Sql.q(author) + "', '" + Sql.q(body) + "')")
102
+ end
103
+
104
+ # ---- Demo ----
105
+
106
+ # Use an in-memory database so each run starts fresh and we don't
107
+ # have to worry about cleaning up.
108
+ blog = Blog.new(":memory:")
109
+
110
+ blog.exec(
111
+ "CREATE TABLE posts (" +
112
+ "id INTEGER PRIMARY KEY AUTOINCREMENT, " +
113
+ "title TEXT NOT NULL, " +
114
+ "body TEXT NOT NULL)")
115
+ blog.exec(
116
+ "CREATE TABLE tags (" +
117
+ "id INTEGER PRIMARY KEY AUTOINCREMENT, " +
118
+ "name TEXT NOT NULL UNIQUE)")
119
+ blog.exec(
120
+ "CREATE TABLE post_tags (" +
121
+ "post_id INTEGER NOT NULL, " +
122
+ "tag_id INTEGER NOT NULL, " +
123
+ "PRIMARY KEY (post_id, tag_id))")
124
+ blog.exec(
125
+ "CREATE TABLE comments (" +
126
+ "id INTEGER PRIMARY KEY AUTOINCREMENT, " +
127
+ "post_id INTEGER NOT NULL, " +
128
+ "author TEXT NOT NULL, " +
129
+ "body TEXT NOT NULL)")
130
+
131
+ p1 = add_post(blog,
132
+ "Spinel learns to call C",
133
+ "Today the AOT compiler grew an FFI. Now we can drive sqlite3 directly.",
134
+ ["spinel", "ffi", "sqlite"])
135
+
136
+ p2 = add_post(blog,
137
+ "Tasting o'tea",
138
+ "She said it's the best Earl Grey in London.",
139
+ ["food", "off-topic"])
140
+
141
+ p3 = add_post(blog,
142
+ "Hashes vs SymIntHash",
143
+ "Symbol-keyed hashes get a dedicated type with no string hashing.",
144
+ ["spinel", "perf"])
145
+
146
+ add_comment(blog, p1, "alice", "Wonderful — does it work with libcurl too?")
147
+ add_comment(blog, p1, "bob", "I tried sqlite3 myself; the bindings are tidy.")
148
+ add_comment(blog, p2, "carol", "Where's the shop?")
149
+ add_comment(blog, p3, "dave", "Nice; the symbol path is hot in our app.")
150
+
151
+ puts "Posts (with comment + tag counts):"
152
+ stmt = blog.prepare(
153
+ "SELECT p.id, p.title, " +
154
+ "(SELECT COUNT(*) FROM comments WHERE post_id = p.id) AS n_comments, " +
155
+ "(SELECT COUNT(*) FROM post_tags WHERE post_id = p.id) AS n_tags " +
156
+ "FROM posts p ORDER BY p.id")
157
+ while step?(stmt)
158
+ puts " [" + col_int(stmt, 0).to_s + "] " + col_text(stmt, 1) +
159
+ " (" + col_int(stmt, 2).to_s + " comments, " +
160
+ col_int(stmt, 3).to_s + " tags)"
161
+ end
162
+ finalize(stmt)
163
+
164
+ puts ""
165
+ puts "Posts tagged 'spinel':"
166
+ stmt = blog.prepare(
167
+ "SELECT p.title FROM posts p " +
168
+ "JOIN post_tags pt ON pt.post_id = p.id " +
169
+ "JOIN tags t ON t.id = pt.tag_id " +
170
+ "WHERE t.name = 'spinel' ORDER BY p.id")
171
+ while step?(stmt)
172
+ puts " - " + col_text(stmt, 0)
173
+ end
174
+ finalize(stmt)
175
+
176
+ puts ""
177
+ puts "Comments on the FFI post:"
178
+ stmt = blog.prepare(
179
+ "SELECT author, body FROM comments WHERE post_id = " + p1.to_s + " ORDER BY id")
180
+ while step?(stmt)
181
+ puts " " + col_text(stmt, 0) + ": " + col_text(stmt, 1)
182
+ end
183
+ finalize(stmt)
184
+
185
+ blog.close
@@ -0,0 +1,46 @@
1
+ # Minimal SQLite3 FFI bindings for Spinel.
2
+ #
3
+ # Only the surface area the blog demo needs:
4
+ # - open / close
5
+ # - exec for DDL + INSERT/UPDATE/DELETE
6
+ # - prepare_v2 / step / finalize + column accessors for SELECT
7
+ #
8
+ # Strings are passed inline into SQL; bind_text would also work but
9
+ # requires the SQLITE_TRANSIENT destructor sentinel which the Spinel FFI
10
+ # can't construct as a `:ptr` value yet. For string columns we escape
11
+ # single quotes ourselves (`Sql.q`).
12
+ module SQL
13
+ ffi_lib "sqlite3"
14
+
15
+ ffi_const :OK, 0
16
+ ffi_const :ROW, 100
17
+ ffi_const :DONE, 101
18
+
19
+ # Core API.
20
+ ffi_func :sqlite3_open, [:str, :ptr], :int
21
+ ffi_func :sqlite3_close, [:ptr], :int
22
+ ffi_func :sqlite3_exec, [:ptr, :str, :ptr, :ptr, :ptr], :int
23
+ ffi_func :sqlite3_prepare_v2, [:ptr, :str, :int, :ptr, :ptr], :int
24
+ ffi_func :sqlite3_step, [:ptr], :int
25
+ ffi_func :sqlite3_finalize, [:ptr], :int
26
+ ffi_func :sqlite3_column_int, [:ptr, :int], :int
27
+ ffi_func :sqlite3_column_text, [:ptr, :int], :str
28
+ ffi_func :sqlite3_column_count, [:ptr], :int
29
+ ffi_func :sqlite3_errmsg, [:ptr], :str
30
+ ffi_func :sqlite3_last_insert_rowid, [:ptr], :long
31
+ ffi_func :sqlite3_changes, [:ptr], :int
32
+
33
+ # Out-params — sqlite3_open writes the db handle here, prepare_v2
34
+ # writes the stmt handle.
35
+ ffi_buffer :db_out, 8
36
+ ffi_buffer :stmt_out, 8
37
+ ffi_read_ptr :read_ptr, 0
38
+ end
39
+
40
+ # Tiny helper module. Quote-escapes single quotes for inline SQL —
41
+ # good enough for the demo's well-known input strings.
42
+ module Sql
43
+ def self.q(s)
44
+ s.gsub("'", "''")
45
+ end
46
+ end