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.
- checksums.yaml +7 -0
- data/.gitmodules +3 -0
- data/CHANGELOG.md +9 -0
- data/LICENSE.txt +21 -0
- data/README.md +72 -0
- data/Rakefile +12 -0
- data/bin/rubyduino +186 -0
- data/examples/hello.rb +9 -0
- data/lib/rubyduino/arduino_entry.c +9 -0
- data/lib/rubyduino/sp_runtime.h +159 -0
- data/lib/rubyduino/spinel.rb +8 -0
- data/lib/rubyduino/spinel_arduino_codegen.rb +129 -0
- data/lib/rubyduino/version.rb +5 -0
- data/lib/rubyduino.rb +9 -0
- data/sig/rubyduino.rbs +4 -0
- data/vendor/spinel/AUTHORS +1 -0
- data/vendor/spinel/LICENSE +19 -0
- data/vendor/spinel/Makefile +406 -0
- data/vendor/spinel/POLY-AS-SET.md +217 -0
- data/vendor/spinel/README.md +409 -0
- data/vendor/spinel/benchmark/bm_ackermann.rb +12 -0
- data/vendor/spinel/benchmark/bm_ao_render.rb +323 -0
- data/vendor/spinel/benchmark/bm_attr_accessor.rb +41 -0
- data/vendor/spinel/benchmark/bm_bigint_fib.rb +10 -0
- data/vendor/spinel/benchmark/bm_binary_trees.rb +53 -0
- data/vendor/spinel/benchmark/bm_csv_process.rb +58 -0
- data/vendor/spinel/benchmark/bm_fannkuch.rb +88 -0
- data/vendor/spinel/benchmark/bm_fasta.rb +87 -0
- data/vendor/spinel/benchmark/bm_fib.rb +9 -0
- data/vendor/spinel/benchmark/bm_gcbench.rb +73 -0
- data/vendor/spinel/benchmark/bm_getivar.rb +34 -0
- data/vendor/spinel/benchmark/bm_getivar_module.rb +34 -0
- data/vendor/spinel/benchmark/bm_huffman.rb +141 -0
- data/vendor/spinel/benchmark/bm_inline.rb +68 -0
- data/vendor/spinel/benchmark/bm_io_wordcount.rb +57 -0
- data/vendor/spinel/benchmark/bm_json_parse.rb +157 -0
- data/vendor/spinel/benchmark/bm_keyword_args.rb +23 -0
- data/vendor/spinel/benchmark/bm_life.rb +70 -0
- data/vendor/spinel/benchmark/bm_linked_list.rb +75 -0
- data/vendor/spinel/benchmark/bm_loops_times.rb +16 -0
- data/vendor/spinel/benchmark/bm_mandel_term.rb +34 -0
- data/vendor/spinel/benchmark/bm_matmul.rb +42 -0
- data/vendor/spinel/benchmark/bm_nbody.rb +115 -0
- data/vendor/spinel/benchmark/bm_nested_loop.rb +29 -0
- data/vendor/spinel/benchmark/bm_nqueens.rb +46 -0
- data/vendor/spinel/benchmark/bm_object_new.rb +21 -0
- data/vendor/spinel/benchmark/bm_object_new_init.rb +21 -0
- data/vendor/spinel/benchmark/bm_object_new_no_escape.rb +28 -0
- data/vendor/spinel/benchmark/bm_partial_sums.rb +38 -0
- data/vendor/spinel/benchmark/bm_pidigits.rb +31 -0
- data/vendor/spinel/benchmark/bm_rbtree.rb +100 -0
- data/vendor/spinel/benchmark/bm_ruby_xor.rb +28 -0
- data/vendor/spinel/benchmark/bm_send_bmethod.rb +31 -0
- data/vendor/spinel/benchmark/bm_send_cfunc_block.rb +18 -0
- data/vendor/spinel/benchmark/bm_send_rubyfunc_block.rb +23 -0
- data/vendor/spinel/benchmark/bm_setivar.rb +33 -0
- data/vendor/spinel/benchmark/bm_setivar_object.rb +33 -0
- data/vendor/spinel/benchmark/bm_setivar_young.rb +37 -0
- data/vendor/spinel/benchmark/bm_sieve.rb +23 -0
- data/vendor/spinel/benchmark/bm_so_lists.rb +47 -0
- data/vendor/spinel/benchmark/bm_so_mandelbrot.rb +65 -0
- data/vendor/spinel/benchmark/bm_spectral_norm.rb +71 -0
- data/vendor/spinel/benchmark/bm_splay.rb +128 -0
- data/vendor/spinel/benchmark/bm_str_concat.rb +15 -0
- data/vendor/spinel/benchmark/bm_structaref.rb +25 -0
- data/vendor/spinel/benchmark/bm_structaset.rb +24 -0
- data/vendor/spinel/benchmark/bm_sudoku.rb +217 -0
- data/vendor/spinel/benchmark/bm_tak.rb +10 -0
- data/vendor/spinel/benchmark/bm_tarai.rb +10 -0
- data/vendor/spinel/benchmark/bm_template.rb +50 -0
- data/vendor/spinel/benchmark/bm_throw.rb +25 -0
- data/vendor/spinel/benchmark/bm_wordfreq.rb +43 -0
- data/vendor/spinel/docs/FFI.md +198 -0
- data/vendor/spinel/examples/ffi/libm/README.md +24 -0
- data/vendor/spinel/examples/ffi/libm/libm.rb +17 -0
- data/vendor/spinel/examples/ffi/sqlite/README.md +73 -0
- data/vendor/spinel/examples/ffi/sqlite/blog.rb +185 -0
- data/vendor/spinel/examples/ffi/sqlite/sqlite3_lib.rb +46 -0
- data/vendor/spinel/lib/erb.rb +19 -0
- data/vendor/spinel/lib/forwardable.rb +8 -0
- data/vendor/spinel/lib/mruby_shim.h +118 -0
- data/vendor/spinel/lib/optparse.rb +123 -0
- data/vendor/spinel/lib/regexp/re_compile.c +979 -0
- data/vendor/spinel/lib/regexp/re_exec.c +665 -0
- data/vendor/spinel/lib/regexp/re_internal.h +146 -0
- data/vendor/spinel/lib/regexp/re_utf8.c +76 -0
- data/vendor/spinel/lib/set.rb +12 -0
- data/vendor/spinel/lib/sp_bigint.c +5400 -0
- data/vendor/spinel/lib/sp_bigint.h +117 -0
- data/vendor/spinel/lib/sp_runtime.h +1361 -0
- data/vendor/spinel/lib/stringio.c +286 -0
- data/vendor/spinel/lib/stringio.rb +5 -0
- data/vendor/spinel/lib/strscan.c +170 -0
- data/vendor/spinel/lib/strscan.rb +55 -0
- data/vendor/spinel/spinel +191 -0
- data/vendor/spinel/spinel.bat +158 -0
- data/vendor/spinel/spinel_codegen.rb +39906 -0
- data/vendor/spinel/spinel_parse +0 -0
- data/vendor/spinel/spinel_parse.c +1586 -0
- data/vendor/spinel/test/alias_global.rb +16 -0
- data/vendor/spinel/test/alias_global.rb.expected +3 -0
- data/vendor/spinel/test/alias_method.rb +28 -0
- data/vendor/spinel/test/alias_method.rb.expected +5 -0
- data/vendor/spinel/test/and_node_poly_operand.rb +24 -0
- data/vendor/spinel/test/anon_block_forward.rb +47 -0
- data/vendor/spinel/test/anon_block_forward.rb.expected +4 -0
- data/vendor/spinel/test/array_3d_nested.rb +48 -0
- data/vendor/spinel/test/array_clear_typed.rb +40 -0
- data/vendor/spinel/test/array_clear_typed.rb.expected +7 -0
- data/vendor/spinel/test/array_concat.rb +18 -0
- data/vendor/spinel/test/array_concat.rb.expected +2 -0
- data/vendor/spinel/test/array_each_with_object.rb +17 -0
- data/vendor/spinel/test/array_each_with_object.rb.expected +2 -0
- data/vendor/spinel/test/array_fill_poly.rb +17 -0
- data/vendor/spinel/test/array_flat_map.rb +16 -0
- data/vendor/spinel/test/array_flat_map.rb.expected +2 -0
- data/vendor/spinel/test/array_keyed_hash_int_array_eql.rb +29 -0
- data/vendor/spinel/test/array_keyed_hash_int_array_eql.rb.expected +6 -0
- data/vendor/spinel/test/array_method_name_clash.rb +15 -0
- data/vendor/spinel/test/array_method_name_clash.rb.expected +1 -0
- data/vendor/spinel/test/array_new_block_typed_container.rb +37 -0
- data/vendor/spinel/test/array_new_block_typed_container.rb.expected +7 -0
- data/vendor/spinel/test/array_new_empty_inner_deferred.rb +47 -0
- data/vendor/spinel/test/array_new_empty_inner_deferred.rb.expected +8 -0
- data/vendor/spinel/test/array_partition_gc.rb +20 -0
- data/vendor/spinel/test/array_partition_gc.rb.expected +3 -0
- data/vendor/spinel/test/array_plus.rb +18 -0
- data/vendor/spinel/test/array_plus.rb.expected +2 -0
- data/vendor/spinel/test/array_rotate_bang.rb +54 -0
- data/vendor/spinel/test/array_rotate_bang.rb.expected +34 -0
- data/vendor/spinel/test/array_shuffle_ptr.rb +11 -0
- data/vendor/spinel/test/array_shuffle_ptr.rb.expected +1 -0
- data/vendor/spinel/test/array_slice_bang.rb +81 -0
- data/vendor/spinel/test/array_slice_bang.rb.expected +40 -0
- data/vendor/spinel/test/attr.rb +77 -0
- data/vendor/spinel/test/attr.rb.expected +9 -0
- data/vendor/spinel/test/attr_writer_poly_box.rb +24 -0
- data/vendor/spinel/test/attr_writer_poly_no_double_eval.rb +29 -0
- data/vendor/spinel/test/attr_writer_poly_no_double_eval.rb.expected +3 -0
- data/vendor/spinel/test/attr_writer_returns_rhs.rb +23 -0
- data/vendor/spinel/test/auto_unbox_keeps_int_slot.rb +38 -0
- data/vendor/spinel/test/auto_unbox_keeps_int_slot.rb.expected +3 -0
- data/vendor/spinel/test/auto_unbox_poly_to_int_local.rb +36 -0
- data/vendor/spinel/test/auto_unbox_poly_to_int_local.rb.expected +2 -0
- data/vendor/spinel/test/back_ref.rb +21 -0
- data/vendor/spinel/test/back_ref.rb.expected +6 -0
- data/vendor/spinel/test/bare_return_in_cls_method.rb +46 -0
- data/vendor/spinel/test/bare_return_in_cls_method.rb.expected +2 -0
- data/vendor/spinel/test/bare_return_in_initialize.rb +55 -0
- data/vendor/spinel/test/bare_return_in_initialize.rb.expected +4 -0
- data/vendor/spinel/test/bare_return_in_poly_method.rb +26 -0
- data/vendor/spinel/test/bare_return_in_poly_method.rb.expected +2 -0
- data/vendor/spinel/test/bigint_div_by_zero.rb +43 -0
- data/vendor/spinel/test/bigint_div_by_zero.rb.expected +3 -0
- data/vendor/spinel/test/block2.rb +31 -0
- data/vendor/spinel/test/block2.rb.expected +4 -0
- data/vendor/spinel/test/block_forward_block_arg.rb +60 -0
- data/vendor/spinel/test/block_forward_block_arg.rb.expected +4 -0
- data/vendor/spinel/test/block_forward_recv_typed.rb +82 -0
- data/vendor/spinel/test/block_forward_recv_typed.rb.expected +11 -0
- data/vendor/spinel/test/block_forward_self_call.rb +61 -0
- data/vendor/spinel/test/block_forward_self_call.rb.expected +6 -0
- data/vendor/spinel/test/block_given_block_param.rb +46 -0
- data/vendor/spinel/test/block_given_block_param.rb.expected +3 -0
- data/vendor/spinel/test/block_param_shadow.rb +246 -0
- data/vendor/spinel/test/block_param_shadow.rb.expected +71 -0
- data/vendor/spinel/test/bm_instance_eval.rb +209 -0
- data/vendor/spinel/test/bm_instance_eval.rb.expected +27 -0
- data/vendor/spinel/test/bound_method_array.rb +22 -0
- data/vendor/spinel/test/bound_method_array.rb.expected +4 -0
- data/vendor/spinel/test/bound_method_basic.rb +27 -0
- data/vendor/spinel/test/bound_method_basic.rb.expected +2 -0
- data/vendor/spinel/test/bound_method_gc.rb +30 -0
- data/vendor/spinel/test/bound_method_gc.rb.expected +1 -0
- data/vendor/spinel/test/bound_method_obj_recv.rb +41 -0
- data/vendor/spinel/test/bound_method_obj_recv.rb.expected +4 -0
- data/vendor/spinel/test/bound_method_single_eval.rb +37 -0
- data/vendor/spinel/test/bound_method_single_eval.rb.expected +4 -0
- data/vendor/spinel/test/box_pointer_to_poly.rb +27 -0
- data/vendor/spinel/test/box_pointer_to_poly.rb.expected +1 -0
- data/vendor/spinel/test/box_unbox_local_assign_cond.rb +22 -0
- data/vendor/spinel/test/box_unbox_local_assign_cond.rb.expected +2 -0
- data/vendor/spinel/test/bundle_array_a.rb +400 -0
- data/vendor/spinel/test/bundle_array_a.rb.expected +117 -0
- data/vendor/spinel/test/bundle_array_b.rb +369 -0
- data/vendor/spinel/test/bundle_array_b.rb.expected +136 -0
- data/vendor/spinel/test/bundle_array_c.rb +146 -0
- data/vendor/spinel/test/bundle_array_c.rb.expected +51 -0
- data/vendor/spinel/test/bundle_array_d.rb +181 -0
- data/vendor/spinel/test/bundle_array_d.rb.expected +66 -0
- data/vendor/spinel/test/bundle_hash.rb +328 -0
- data/vendor/spinel/test/bundle_hash.rb.expected +104 -0
- data/vendor/spinel/test/bundle_int_array.rb +125 -0
- data/vendor/spinel/test/bundle_int_array.rb.expected +24 -0
- data/vendor/spinel/test/bundle_integer.rb +248 -0
- data/vendor/spinel/test/bundle_integer.rb.expected +113 -0
- data/vendor/spinel/test/bundle_io_sys.rb +223 -0
- data/vendor/spinel/test/bundle_io_sys.rb.expected +62 -0
- data/vendor/spinel/test/bundle_misc_a.rb +462 -0
- data/vendor/spinel/test/bundle_misc_a.rb.expected +208 -0
- data/vendor/spinel/test/bundle_misc_b.rb +401 -0
- data/vendor/spinel/test/bundle_misc_b.rb.expected +120 -0
- data/vendor/spinel/test/bundle_poly.rb +145 -0
- data/vendor/spinel/test/bundle_poly.rb.expected +66 -0
- data/vendor/spinel/test/bundle_string_a.rb +278 -0
- data/vendor/spinel/test/bundle_string_a.rb.expected +93 -0
- data/vendor/spinel/test/bundle_string_b.rb +226 -0
- data/vendor/spinel/test/bundle_string_b.rb.expected +83 -0
- data/vendor/spinel/test/bundle_sym.rb +302 -0
- data/vendor/spinel/test/bundle_sym.rb.expected +117 -0
- data/vendor/spinel/test/call_and_write.rb +28 -0
- data/vendor/spinel/test/call_and_write.rb.expected +3 -0
- data/vendor/spinel/test/call_arg_int_to_obj_cast.rb +55 -0
- data/vendor/spinel/test/call_arg_int_to_obj_cast.rb.expected +1 -0
- data/vendor/spinel/test/call_op_write.rb +51 -0
- data/vendor/spinel/test/call_op_write.rb.expected +11 -0
- data/vendor/spinel/test/call_or_write.rb +35 -0
- data/vendor/spinel/test/call_or_write.rb.expected +3 -0
- data/vendor/spinel/test/case.rb +43 -0
- data/vendor/spinel/test/case.rb.expected +10 -0
- data/vendor/spinel/test/case_string_when_sym_no_match.rb +59 -0
- data/vendor/spinel/test/case_string_when_sym_no_match.rb.expected +7 -0
- data/vendor/spinel/test/case_when_class.rb +70 -0
- data/vendor/spinel/test/case_when_class.rb.expected +5 -0
- data/vendor/spinel/test/chained_attr_setter.rb +55 -0
- data/vendor/spinel/test/chained_ivar_op_assign_emits_inner_write.rb +28 -0
- data/vendor/spinel/test/chained_ivar_op_assign_emits_inner_write.rb.expected +3 -0
- data/vendor/spinel/test/chained_ivar_write_call_rhs.rb +30 -0
- data/vendor/spinel/test/chained_ivar_write_call_rhs.rb.expected +2 -0
- data/vendor/spinel/test/chained_ivar_write_split.rb +26 -0
- data/vendor/spinel/test/chained_ivar_write_split.rb.expected +3 -0
- data/vendor/spinel/test/chained_ivar_write_subclass.rb +26 -0
- data/vendor/spinel/test/chained_ivar_write_subclass.rb.expected +2 -0
- data/vendor/spinel/test/chained_or_assign_collection_array_nested.rb +32 -0
- data/vendor/spinel/test/chained_or_assign_collection_array_nested.rb.expected +3 -0
- data/vendor/spinel/test/chained_or_assign_collection_element.rb +29 -0
- data/vendor/spinel/test/chained_or_assign_collection_element.rb.expected +2 -0
- data/vendor/spinel/test/chained_or_assign_collection_poly_array.rb +25 -0
- data/vendor/spinel/test/chained_or_assign_collection_poly_array.rb.expected +3 -0
- data/vendor/spinel/test/chained_or_assign_collection_str_keys.rb +24 -0
- data/vendor/spinel/test/chained_or_assign_collection_str_keys.rb.expected +3 -0
- data/vendor/spinel/test/class_constant_path_read.rb +26 -0
- data/vendor/spinel/test/class_constant_path_read.rb.expected +4 -0
- data/vendor/spinel/test/class_constant_sym_array.rb +19 -0
- data/vendor/spinel/test/class_constant_sym_array.rb.expected +4 -0
- data/vendor/spinel/test/class_def_order.rb +66 -0
- data/vendor/spinel/test/class_def_order.rb.expected +4 -0
- data/vendor/spinel/test/class_method_open_class_call.rb +31 -0
- data/vendor/spinel/test/class_method_open_class_call.rb.expected +3 -0
- data/vendor/spinel/test/class_var_read.rb +113 -0
- data/vendor/spinel/test/class_var_read.rb.expected +8 -0
- data/vendor/spinel/test/class_var_write.rb +19 -0
- data/vendor/spinel/test/class_var_write.rb.expected +1 -0
- data/vendor/spinel/test/cls_ivar_type_parent_defer.rb +32 -0
- data/vendor/spinel/test/cls_method_object.rb +31 -0
- data/vendor/spinel/test/cls_method_object.rb.expected +2 -0
- data/vendor/spinel/test/codegen_class_in_module_with_explicit_parent.rb +15 -0
- data/vendor/spinel/test/codegen_class_in_module_with_explicit_parent.rb.expected +1 -0
- data/vendor/spinel/test/codegen_const_lookup_in_toplevel_method.rb +13 -0
- data/vendor/spinel/test/codegen_const_lookup_in_toplevel_method.rb.expected +1 -0
- data/vendor/spinel/test/comparable.rb +21 -0
- data/vendor/spinel/test/comparable.rb.expected +5 -0
- data/vendor/spinel/test/const_init_block_param_scan.rb +13 -0
- data/vendor/spinel/test/const_init_block_param_scan.rb.expected +2 -0
- data/vendor/spinel/test/constant_path.rb +102 -0
- data/vendor/spinel/test/constant_path.rb.expected +21 -0
- data/vendor/spinel/test/constants.rb +44 -0
- data/vendor/spinel/test/constants.rb.expected +13 -0
- data/vendor/spinel/test/control.rb +23 -0
- data/vendor/spinel/test/control.rb.expected +7 -0
- data/vendor/spinel/test/default_args.rb +108 -0
- data/vendor/spinel/test/default_args.rb.expected +13 -0
- data/vendor/spinel/test/default_argv_narrows_from_string_call_site.rb +32 -0
- data/vendor/spinel/test/default_argv_narrows_from_string_call_site.rb.expected +1 -0
- data/vendor/spinel/test/each_poly_recv_block_auto_splat.rb +43 -0
- data/vendor/spinel/test/each_poly_recv_block_auto_splat.rb.expected +2 -0
- data/vendor/spinel/test/each_with_object_seed_shadow.rb +14 -0
- data/vendor/spinel/test/each_with_object_seed_shadow.rb.expected +4 -0
- data/vendor/spinel/test/elsif_isa_chain.rb +56 -0
- data/vendor/spinel/test/elsif_isa_chain.rb.expected +6 -0
- data/vendor/spinel/test/embedded_var.rb +17 -0
- data/vendor/spinel/test/embedded_var.rb.expected +2 -0
- data/vendor/spinel/test/empty_array_param.rb +94 -0
- data/vendor/spinel/test/empty_array_param.rb.expected +18 -0
- data/vendor/spinel/test/empty_hash_ivar_string_value.rb +51 -0
- data/vendor/spinel/test/empty_hash_ivar_string_value.rb.expected +4 -0
- data/vendor/spinel/test/endless_method.rb +61 -0
- data/vendor/spinel/test/endless_method.rb.expected +11 -0
- data/vendor/spinel/test/endless_method_rescue.rb +33 -0
- data/vendor/spinel/test/endless_method_rescue.rb.expected +10 -0
- data/vendor/spinel/test/ensure_raise_overrides_body_raise.rb +19 -0
- data/vendor/spinel/test/ensure_raise_overrides_body_raise.rb.expected +1 -0
- data/vendor/spinel/test/ensure_runs_on_raise.rb +32 -0
- data/vendor/spinel/test/ensure_runs_on_raise.rb.expected +3 -0
- data/vendor/spinel/test/ensure_runs_on_raise_nested.rb +38 -0
- data/vendor/spinel/test/ensure_runs_on_raise_nested.rb.expected +4 -0
- data/vendor/spinel/test/ensure_runs_on_return.rb +61 -0
- data/vendor/spinel/test/ensure_runs_on_return.rb.expected +6 -0
- data/vendor/spinel/test/ensure_runs_on_return_from_rescue.rb +26 -0
- data/vendor/spinel/test/ensure_runs_on_return_from_rescue.rb.expected +2 -0
- data/vendor/spinel/test/ensure_runs_on_return_nested.rb +37 -0
- data/vendor/spinel/test/ensure_runs_on_return_nested.rb.expected +3 -0
- data/vendor/spinel/test/enumerable.rb +19 -0
- data/vendor/spinel/test/enumerable.rb.expected +2 -0
- data/vendor/spinel/test/env_string_inference.rb +37 -0
- data/vendor/spinel/test/env_string_inference.rb.expected +6 -0
- data/vendor/spinel/test/exception_object_methods.rb +99 -0
- data/vendor/spinel/test/exception_object_methods.rb.expected +15 -0
- data/vendor/spinel/test/exceptions.rb +34 -0
- data/vendor/spinel/test/exceptions.rb.expected +4 -0
- data/vendor/spinel/test/features.rb +32 -0
- data/vendor/spinel/test/features.rb.expected +9 -0
- data/vendor/spinel/test/ffi_buffer_reader.rb +23 -0
- data/vendor/spinel/test/ffi_buffer_reader.rb.expected +5 -0
- data/vendor/spinel/test/ffi_const.rb +12 -0
- data/vendor/spinel/test/ffi_const.rb.expected +5 -0
- data/vendor/spinel/test/ffi_libc_libm_basic.rb +16 -0
- data/vendor/spinel/test/ffi_libc_libm_basic.rb.expected +5 -0
- data/vendor/spinel/test/ffi_ptr_nil.rb +27 -0
- data/vendor/spinel/test/ffi_ptr_nil.rb.expected +2 -0
- data/vendor/spinel/test/ffi_void_return.rb +14 -0
- data/vendor/spinel/test/ffi_void_return.rb.expected +2 -0
- data/vendor/spinel/test/fiber_ivar_persists_across_yield.rb +22 -0
- data/vendor/spinel/test/fiber_ivar_persists_across_yield.rb.expected +3 -0
- data/vendor/spinel/test/fiber_yield_across_method_call.rb +28 -0
- data/vendor/spinel/test/fiber_yield_across_method_call.rb.expected +3 -0
- data/vendor/spinel/test/file_basename_gc.rb +59 -0
- data/vendor/spinel/test/file_basename_gc.rb.expected +2 -0
- data/vendor/spinel/test/forward_call_class_method_inherited_init.rb +36 -0
- data/vendor/spinel/test/forward_call_class_method_inherited_init.rb.expected +1 -0
- data/vendor/spinel/test/forward_call_class_method_inherited_init_int_array.rb +32 -0
- data/vendor/spinel/test/forward_call_class_method_inherited_init_int_array.rb.expected +1 -0
- data/vendor/spinel/test/forward_call_class_method_inherited_init_obj.rb +41 -0
- data/vendor/spinel/test/forward_call_class_method_inherited_init_obj.rb.expected +1 -0
- data/vendor/spinel/test/forward_call_class_method_int_array.rb +26 -0
- data/vendor/spinel/test/forward_call_class_method_int_array.rb.expected +1 -0
- data/vendor/spinel/test/forward_call_class_method_nested.rb +35 -0
- data/vendor/spinel/test/forward_call_class_method_nested.rb.expected +1 -0
- data/vendor/spinel/test/forward_call_class_method_obj.rb +36 -0
- data/vendor/spinel/test/forward_call_class_method_obj.rb.expected +1 -0
- data/vendor/spinel/test/forward_call_param_type_inference.rb +23 -0
- data/vendor/spinel/test/forward_call_param_type_inference.rb.expected +1 -0
- data/vendor/spinel/test/forward_call_param_type_int_array.rb +34 -0
- data/vendor/spinel/test/forward_call_param_type_int_array.rb.expected +1 -0
- data/vendor/spinel/test/forward_call_param_type_obj.rb +38 -0
- data/vendor/spinel/test/forward_call_param_type_obj.rb.expected +1 -0
- data/vendor/spinel/test/gc_root_ptr_array_literal.rb +63 -0
- data/vendor/spinel/test/gc_root_ptr_array_literal.rb.expected +1 -0
- data/vendor/spinel/test/gc_save_double_in_new.rb +13 -0
- data/vendor/spinel/test/gc_save_double_in_new.rb.expected +1 -0
- data/vendor/spinel/test/gc_scan_skip_inherited_ivar.rb +54 -0
- data/vendor/spinel/test/gc_scan_skip_inherited_ivar.rb.expected +2 -0
- data/vendor/spinel/test/global_var.rb +53 -0
- data/vendor/spinel/test/global_var.rb.expected +12 -0
- data/vendor/spinel/test/gvar.rb +22 -0
- data/vendor/spinel/test/gvar.rb.expected +4 -0
- data/vendor/spinel/test/hash_dig.rb +92 -0
- data/vendor/spinel/test/hash_dig.rb.expected +37 -0
- data/vendor/spinel/test/hash_keys_each_shadow.rb +40 -0
- data/vendor/spinel/test/hash_keys_each_shadow.rb.expected +9 -0
- data/vendor/spinel/test/hash_shorthand.rb +37 -0
- data/vendor/spinel/test/hash_shorthand.rb.expected +6 -0
- data/vendor/spinel/test/hash_shorthand_str.rb +48 -0
- data/vendor/spinel/test/hash_shorthand_str.rb.expected +19 -0
- data/vendor/spinel/test/heterogeneous_dispatch_int_return_narrow.rb +46 -0
- data/vendor/spinel/test/heterogeneous_dispatch_int_return_narrow.rb.expected +2 -0
- data/vendor/spinel/test/if_static_false_skips_dead_branch_compile.rb +50 -0
- data/vendor/spinel/test/if_static_false_skips_dead_branch_compile.rb.expected +3 -0
- data/vendor/spinel/test/implicit_self_param_poly.rb +17 -0
- data/vendor/spinel/test/implicit_self_param_poly.rb.expected +1 -0
- data/vendor/spinel/test/index_write.rb +106 -0
- data/vendor/spinel/test/index_write.rb.expected +30 -0
- data/vendor/spinel/test/inference_method_set.rb +35 -0
- data/vendor/spinel/test/inference_method_set.rb.expected +2 -0
- data/vendor/spinel/test/inherit.rb +52 -0
- data/vendor/spinel/test/inherit.rb.expected +7 -0
- data/vendor/spinel/test/inherited_method_param_widen.rb +49 -0
- data/vendor/spinel/test/inherited_method_param_widen.rb.expected +1 -0
- data/vendor/spinel/test/init_locals.rb +43 -0
- data/vendor/spinel/test/init_locals.rb.expected +3 -0
- data/vendor/spinel/test/initialize_param_poly_call_sites.rb +20 -0
- data/vendor/spinel/test/initialize_param_poly_call_sites.rb.expected +2 -0
- data/vendor/spinel/test/initialize_param_through_call.rb +15 -0
- data/vendor/spinel/test/initialize_param_through_call.rb.expected +1 -0
- data/vendor/spinel/test/initialize_void_wrapper_gc_save.rb +40 -0
- data/vendor/spinel/test/initialize_void_wrapper_gc_save.rb.expected +1 -0
- data/vendor/spinel/test/inspect.rb +86 -0
- data/vendor/spinel/test/inspect.rb.expected +52 -0
- data/vendor/spinel/test/instance_eval_trampoline.rb +88 -0
- data/vendor/spinel/test/instance_eval_trampoline.rb.expected +5 -0
- data/vendor/spinel/test/int_bracket_skip_sym_idx.rb +40 -0
- data/vendor/spinel/test/int_bracket_skip_sym_idx.rb.expected +5 -0
- data/vendor/spinel/test/int_keyed_hash_lookup_as_array.rb +19 -0
- data/vendor/spinel/test/int_keyed_hash_lookup_as_array.rb.expected +2 -0
- data/vendor/spinel/test/intarray_slice_assign_from_intarray_ptr_array_first.rb +25 -0
- data/vendor/spinel/test/intarray_slice_assign_from_intarray_ptr_array_first.rb.expected +1 -0
- data/vendor/spinel/test/integer_div.rb +21 -0
- data/vendor/spinel/test/integer_div.rb.expected +10 -0
- data/vendor/spinel/test/integer_div_by_zero.rb +80 -0
- data/vendor/spinel/test/integer_div_by_zero.rb.expected +10 -0
- data/vendor/spinel/test/interp_method_widening.rb +39 -0
- data/vendor/spinel/test/interp_method_widening.rb.expected +4 -0
- data/vendor/spinel/test/interp_symbol.rb +18 -0
- data/vendor/spinel/test/interp_symbol.rb.expected +3 -0
- data/vendor/spinel/test/introspect.rb +35 -0
- data/vendor/spinel/test/introspect.rb.expected +11 -0
- data/vendor/spinel/test/issue176_empty_hash_default.rb +34 -0
- data/vendor/spinel/test/issue176_empty_hash_default.rb.expected +3 -0
- data/vendor/spinel/test/issue203_string_new.rb +27 -0
- data/vendor/spinel/test/issue203_string_new.rb.expected +4 -0
- data/vendor/spinel/test/issue204_user_find_fetch.rb +25 -0
- data/vendor/spinel/test/issue204_user_find_fetch.rb.expected +5 -0
- data/vendor/spinel/test/issue207_factory_pattern.rb +35 -0
- data/vendor/spinel/test/issue207_factory_pattern.rb.expected +1 -0
- data/vendor/spinel/test/issue207_full_repro.rb +52 -0
- data/vendor/spinel/test/issue207_full_repro.rb.expected +1 -0
- data/vendor/spinel/test/issue208_inherited_class_method.rb +24 -0
- data/vendor/spinel/test/issue208_inherited_class_method.rb.expected +4 -0
- data/vendor/spinel/test/issue219_aref_chain.rb +36 -0
- data/vendor/spinel/test/issue219_aref_chain.rb.expected +5 -0
- data/vendor/spinel/test/issue224_bare_new_inherited.rb +66 -0
- data/vendor/spinel/test/issue224_bare_new_inherited.rb.expected +4 -0
- data/vendor/spinel/test/issue229_uncalled_cls_method.rb +76 -0
- data/vendor/spinel/test/issue229_uncalled_cls_method.rb.expected +3 -0
- data/vendor/spinel/test/issue235_chain_tail_widening.rb +48 -0
- data/vendor/spinel/test/issue235_chain_tail_widening.rb.expected +5 -0
- data/vendor/spinel/test/issue236_chain_empty_literal.rb +84 -0
- data/vendor/spinel/test/issue236_chain_empty_literal.rb.expected +7 -0
- data/vendor/spinel/test/issue239_cls_method_default_args.rb +41 -0
- data/vendor/spinel/test/issue239_cls_method_default_args.rb.expected +5 -0
- data/vendor/spinel/test/issue_266_def_length_inference.rb +63 -0
- data/vendor/spinel/test/issue_266_def_length_inference.rb.expected +1 -0
- data/vendor/spinel/test/ivar_and_write_basic.rb +34 -0
- data/vendor/spinel/test/ivar_and_write_basic.rb.expected +5 -0
- data/vendor/spinel/test/ivar_c_keyword.rb +14 -0
- data/vendor/spinel/test/ivar_c_keyword.rb.expected +1 -0
- data/vendor/spinel/test/ivar_float_array.rb +59 -0
- data/vendor/spinel/test/ivar_float_array.rb.expected +11 -0
- data/vendor/spinel/test/ivar_op_assign_bitwise_and_shift.rb +22 -0
- data/vendor/spinel/test/ivar_op_assign_bitwise_and_shift.rb.expected +6 -0
- data/vendor/spinel/test/ivar_or_write_basic.rb +57 -0
- data/vendor/spinel/test/ivar_or_write_basic.rb.expected +9 -0
- data/vendor/spinel/test/ivar_polymorphic.rb +87 -0
- data/vendor/spinel/test/ivar_polymorphic.rb.expected +12 -0
- data/vendor/spinel/test/ivar_ternary_mixed.rb +108 -0
- data/vendor/spinel/test/ivar_ternary_mixed.rb.expected +15 -0
- data/vendor/spinel/test/ivar_writer_heterogeneity.rb +34 -0
- data/vendor/spinel/test/ivar_writer_heterogeneity.rb.expected +2 -0
- data/vendor/spinel/test/known_constants.rb +25 -0
- data/vendor/spinel/test/known_constants.rb.expected +4 -0
- data/vendor/spinel/test/kw_nil_default_string_call.rb +6 -0
- data/vendor/spinel/test/kw_nil_default_string_call.rb.expected +2 -0
- data/vendor/spinel/test/kwargs.rb +21 -0
- data/vendor/spinel/test/kwargs.rb.expected +6 -0
- data/vendor/spinel/test/kwargs_param.rb +26 -0
- data/vendor/spinel/test/kwargs_param.rb.expected +2 -0
- data/vendor/spinel/test/kwargs_param_widen.rb +73 -0
- data/vendor/spinel/test/kwargs_param_widen.rb.expected +3 -0
- data/vendor/spinel/test/lrama_features.rb +142 -0
- data/vendor/spinel/test/lrama_features.rb.expected +38 -0
- data/vendor/spinel/test/map_array_block_result.rb +29 -0
- data/vendor/spinel/test/map_array_block_result.rb.expected +2 -0
- data/vendor/spinel/test/map_block_returns_nested_array.rb +53 -0
- data/vendor/spinel/test/map_empty_block.rb +26 -0
- data/vendor/spinel/test/map_empty_block.rb.expected +6 -0
- data/vendor/spinel/test/map_range_recv_array_block.rb +31 -0
- data/vendor/spinel/test/mega.rb +35 -0
- data/vendor/spinel/test/mega.rb.expected +7 -0
- data/vendor/spinel/test/method.rb +21 -0
- data/vendor/spinel/test/method.rb.expected +6 -0
- data/vendor/spinel/test/method_defined.rb +36 -0
- data/vendor/spinel/test/method_defined.rb.expected +17 -0
- data/vendor/spinel/test/method_dispatch_poly_array.rb +35 -0
- data/vendor/spinel/test/method_dispatch_poly_array.rb.expected +2 -0
- data/vendor/spinel/test/method_introspection.rb +24 -0
- data/vendor/spinel/test/method_introspection.rb.expected +6 -0
- data/vendor/spinel/test/method_param_unify_to_poly.rb +40 -0
- data/vendor/spinel/test/method_param_unify_to_poly.rb.expected +2 -0
- data/vendor/spinel/test/misc.rb +49 -0
- data/vendor/spinel/test/misc.rb.expected +7 -0
- data/vendor/spinel/test/mixin.rb +54 -0
- data/vendor/spinel/test/mixin.rb.expected +4 -0
- data/vendor/spinel/test/module_acc_dispatch_param_box.rb +46 -0
- data/vendor/spinel/test/module_acc_dispatch_param_box.rb.expected +2 -0
- data/vendor/spinel/test/module_class_new.rb +17 -0
- data/vendor/spinel/test/module_class_new.rb.expected +3 -0
- data/vendor/spinel/test/module_cls_method_string_return.rb +53 -0
- data/vendor/spinel/test/module_cls_method_string_return.rb.expected +5 -0
- data/vendor/spinel/test/module_const_array_widen.rb +36 -0
- data/vendor/spinel/test/module_const_array_widen.rb.expected +1 -0
- data/vendor/spinel/test/module_dispatch_param_widen.rb +55 -0
- data/vendor/spinel/test/module_dispatch_param_widen.rb.expected +1 -0
- data/vendor/spinel/test/module_function_namespace.rb +58 -0
- data/vendor/spinel/test/module_ivar_hash.rb +61 -0
- data/vendor/spinel/test/module_ivar_hash.rb.expected +7 -0
- data/vendor/spinel/test/module_relative_constant_path.rb +26 -0
- data/vendor/spinel/test/module_relative_constant_path.rb.expected +2 -0
- data/vendor/spinel/test/module_singleton_accessor.rb +65 -0
- data/vendor/spinel/test/module_singleton_accessor.rb.expected +3 -0
- data/vendor/spinel/test/module_singleton_accessor_poly.rb +62 -0
- data/vendor/spinel/test/module_singleton_accessor_poly.rb.expected +7 -0
- data/vendor/spinel/test/multi_arg_block_call.rb +56 -0
- data/vendor/spinel/test/multi_arg_block_call.rb.expected +5 -0
- data/vendor/spinel/test/multi_arg_yield.rb +70 -0
- data/vendor/spinel/test/multi_arg_yield.rb.expected +6 -0
- data/vendor/spinel/test/multi_assign_ivar.rb +33 -0
- data/vendor/spinel/test/multi_assign_ivar.rb.expected +1 -0
- data/vendor/spinel/test/multi_return.rb +35 -0
- data/vendor/spinel/test/multi_return.rb.expected +10 -0
- data/vendor/spinel/test/multi_return_bare.rb +77 -0
- data/vendor/spinel/test/multi_return_bare.rb.expected +16 -0
- data/vendor/spinel/test/multi_write_const.rb +36 -0
- data/vendor/spinel/test/multi_write_const.rb.expected +9 -0
- data/vendor/spinel/test/multi_write_from_poly_recv.rb +34 -0
- data/vendor/spinel/test/multi_write_from_poly_recv.rb.expected +1 -0
- data/vendor/spinel/test/multi_write_ivar.rb +34 -0
- data/vendor/spinel/test/multi_write_ivar.rb.expected +3 -0
- data/vendor/spinel/test/multi_write_ivar_const_from_array_rhs.rb +53 -0
- data/vendor/spinel/test/multi_write_ivar_const_from_array_rhs.rb.expected +6 -0
- data/vendor/spinel/test/multi_write_ivar_widening.rb +10 -0
- data/vendor/spinel/test/multi_write_ivar_widening.rb.expected +2 -0
- data/vendor/spinel/test/multi_write_map_block.rb +31 -0
- data/vendor/spinel/test/multi_write_map_block.rb.expected +7 -0
- data/vendor/spinel/test/multi_write_setter.rb +28 -0
- data/vendor/spinel/test/multi_write_setter.rb.expected +3 -0
- data/vendor/spinel/test/multi_write_typed_array_dispatch.rb +44 -0
- data/vendor/spinel/test/multi_write_typed_array_dispatch.rb.expected +3 -0
- data/vendor/spinel/test/nested_class_in_class.rb +38 -0
- data/vendor/spinel/test/nested_class_in_class.rb.expected +3 -0
- data/vendor/spinel/test/nested_class_module_const_resolution.rb +38 -0
- data/vendor/spinel/test/nested_class_module_const_resolution.rb.expected +2 -0
- data/vendor/spinel/test/nil_ivar.rb +44 -0
- data/vendor/spinel/test/nil_ivar.rb.expected +5 -0
- data/vendor/spinel/test/no_attr_write_shortcut_complex.rb +33 -0
- data/vendor/spinel/test/no_attr_write_shortcut_complex.rb.expected +3 -0
- data/vendor/spinel/test/no_attr_write_shortcut_multi.rb +38 -0
- data/vendor/spinel/test/no_attr_write_shortcut_multi.rb.expected +4 -0
- data/vendor/spinel/test/no_keywords_param.rb +15 -0
- data/vendor/spinel/test/no_keywords_param.rb.expected +2 -0
- data/vendor/spinel/test/nullable.rb +26 -0
- data/vendor/spinel/test/nullable.rb.expected +2 -0
- data/vendor/spinel/test/obj_array.rb +26 -0
- data/vendor/spinel/test/obj_array.rb.expected +6 -0
- data/vendor/spinel/test/object_new_sentinel.rb +18 -0
- data/vendor/spinel/test/object_new_sentinel.rb.expected +3 -0
- data/vendor/spinel/test/object_truthy.rb +31 -0
- data/vendor/spinel/test/object_truthy.rb.expected +5 -0
- data/vendor/spinel/test/op_assign_user_operator.rb +36 -0
- data/vendor/spinel/test/open_class.rb +27 -0
- data/vendor/spinel/test/open_class.rb.expected +4 -0
- data/vendor/spinel/test/optional_string_param_method.rb +11 -0
- data/vendor/spinel/test/optional_string_param_method.rb.expected +3 -0
- data/vendor/spinel/test/param_inference_if_predicate.rb +90 -0
- data/vendor/spinel/test/param_inference_if_predicate.rb.expected +3 -0
- data/vendor/spinel/test/param_narrow_from_body_call.rb +34 -0
- data/vendor/spinel/test/param_narrow_from_body_call.rb.expected +2 -0
- data/vendor/spinel/test/param_widens_when_body_assigns_string.rb +21 -0
- data/vendor/spinel/test/param_widens_when_body_assigns_string.rb.expected +6 -0
- data/vendor/spinel/test/pattern.rb +41 -0
- data/vendor/spinel/test/pattern.rb.expected +9 -0
- data/vendor/spinel/test/poly.rb +24 -0
- data/vendor/spinel/test/poly.rb.expected +9 -0
- data/vendor/spinel/test/poly2.rb +34 -0
- data/vendor/spinel/test/poly2.rb.expected +9 -0
- data/vendor/spinel/test/poly_arith.rb +34 -0
- data/vendor/spinel/test/poly_arith.rb.expected +10 -0
- data/vendor/spinel/test/poly_array_literal_callnode_typed_elem.rb +37 -0
- data/vendor/spinel/test/poly_array_literal_callnode_typed_elem.rb.expected +9 -0
- data/vendor/spinel/test/poly_array_slot_literal.rb +41 -0
- data/vendor/spinel/test/poly_array_slot_sized_default.rb +33 -0
- data/vendor/spinel/test/poly_box_int_array.rb +13 -0
- data/vendor/spinel/test/poly_box_int_array.rb.expected +2 -0
- data/vendor/spinel/test/poly_dispatch_args_ret.rb +45 -0
- data/vendor/spinel/test/poly_dispatch_args_ret.rb.expected +4 -0
- data/vendor/spinel/test/poly_dispatch_arity_padding.rb +36 -0
- data/vendor/spinel/test/poly_dispatch_arity_truncate.rb +45 -0
- data/vendor/spinel/test/poly_dispatch_attr_reader.rb +44 -0
- data/vendor/spinel/test/poly_dispatch_attr_reader.rb.expected +4 -0
- data/vendor/spinel/test/poly_dispatch_builtin.rb +16 -0
- data/vendor/spinel/test/poly_dispatch_builtin.rb.expected +2 -0
- data/vendor/spinel/test/poly_dispatch_builtin_all.rb +34 -0
- data/vendor/spinel/test/poly_dispatch_builtin_all.rb.expected +8 -0
- data/vendor/spinel/test/poly_dispatch_ptr_array.rb +57 -0
- data/vendor/spinel/test/poly_dispatch_ptr_array.rb.expected +6 -0
- data/vendor/spinel/test/poly_equality_mixed_sites.rb +40 -0
- data/vendor/spinel/test/poly_equality_mixed_sites.rb.expected +10 -0
- data/vendor/spinel/test/poly_gc.rb +39 -0
- data/vendor/spinel/test/poly_gc.rb.expected +3 -0
- data/vendor/spinel/test/poly_hash_literal_from_ivar.rb +47 -0
- data/vendor/spinel/test/poly_hash_literal_from_ivar.rb.expected +5 -0
- data/vendor/spinel/test/poly_hash_with_range.rb +36 -0
- data/vendor/spinel/test/poly_hash_with_range.rb.expected +10 -0
- data/vendor/spinel/test/poly_hash_with_time.rb +32 -0
- data/vendor/spinel/test/poly_hash_with_time.rb.expected +8 -0
- data/vendor/spinel/test/poly_int_arith_auto_unify.rb +26 -0
- data/vendor/spinel/test/poly_int_arith_auto_unify.rb.expected +4 -0
- data/vendor/spinel/test/poly_int_bit_index.rb +50 -0
- data/vendor/spinel/test/poly_int_bit_index.rb.expected +14 -0
- data/vendor/spinel/test/poly_int_bitops_auto_unify.rb +20 -0
- data/vendor/spinel/test/poly_int_bitops_auto_unify.rb.expected +5 -0
- data/vendor/spinel/test/poly_is_a.rb +47 -0
- data/vendor/spinel/test/poly_is_a.rb.expected +10 -0
- data/vendor/spinel/test/poly_keyed_hash_method_dedup.rb +37 -0
- data/vendor/spinel/test/poly_keyed_hash_method_dedup.rb.expected +4 -0
- data/vendor/spinel/test/poly_keyed_hash_pipeline.rb +40 -0
- data/vendor/spinel/test/poly_keyed_hash_pipeline.rb.expected +2 -0
- data/vendor/spinel/test/poly_method_args.rb +23 -0
- data/vendor/spinel/test/poly_method_args.rb.expected +2 -0
- data/vendor/spinel/test/poly_method_mixed_return.rb +23 -0
- data/vendor/spinel/test/poly_method_mixed_return.rb.expected +2 -0
- data/vendor/spinel/test/poly_or_returns_value.rb +13 -0
- data/vendor/spinel/test/poly_or_returns_value.rb.expected +4 -0
- data/vendor/spinel/test/poly_recv_aref_box_arm.rb +41 -0
- data/vendor/spinel/test/poly_recv_aref_box_arm.rb.expected +4 -0
- data/vendor/spinel/test/poly_recv_aref_str_key.rb +42 -0
- data/vendor/spinel/test/poly_recv_aref_str_key.rb.expected +2 -0
- data/vendor/spinel/test/poly_recv_bracket_assign.rb +31 -0
- data/vendor/spinel/test/poly_recv_bracket_assign.rb.expected +1 -0
- data/vendor/spinel/test/poly_recv_each.rb +35 -0
- data/vendor/spinel/test/poly_recv_each.rb.expected +7 -0
- data/vendor/spinel/test/poly_return_value_class.rb +66 -0
- data/vendor/spinel/test/poly_return_value_class.rb.expected +7 -0
- data/vendor/spinel/test/poly_self_deref.rb +28 -0
- data/vendor/spinel/test/poly_self_deref.rb.expected +2 -0
- data/vendor/spinel/test/poly_shl_array_push_dispatch.rb +35 -0
- data/vendor/spinel/test/poly_shl_array_push_dispatch.rb.expected +5 -0
- data/vendor/spinel/test/poly_slice_assign.rb +26 -0
- data/vendor/spinel/test/poly_slice_assign.rb.expected +3 -0
- data/vendor/spinel/test/poly_str_append.rb +40 -0
- data/vendor/spinel/test/poly_str_append.rb.expected +2 -0
- data/vendor/spinel/test/poly_to_i_via_str_poly_hash.rb +19 -0
- data/vendor/spinel/test/poly_to_i_via_str_poly_hash.rb.expected +1 -0
- data/vendor/spinel/test/post_execution.rb +17 -0
- data/vendor/spinel/test/post_execution.rb.expected +4 -0
- data/vendor/spinel/test/pre_execution.rb +18 -0
- data/vendor/spinel/test/pre_execution.rb.expected +4 -0
- data/vendor/spinel/test/primitive_method_shadow.rb +48 -0
- data/vendor/spinel/test/primitive_method_shadow.rb.expected +4 -0
- data/vendor/spinel/test/primitive_method_shadow_int_recv.rb +47 -0
- data/vendor/spinel/test/primitive_method_shadow_int_recv.rb.expected +1 -0
- data/vendor/spinel/test/proc.rb +42 -0
- data/vendor/spinel/test/proc.rb.expected +8 -0
- data/vendor/spinel/test/proc_closure.rb +44 -0
- data/vendor/spinel/test/proc_closure.rb.expected +8 -0
- data/vendor/spinel/test/proc_hash_value.rb +27 -0
- data/vendor/spinel/test/proc_hash_value.rb.expected +1 -0
- data/vendor/spinel/test/ptr_array.rb +107 -0
- data/vendor/spinel/test/ptr_array.rb.expected +23 -0
- data/vendor/spinel/test/range.rb +130 -0
- data/vendor/spinel/test/range.rb.expected +61 -0
- data/vendor/spinel/test/redo.rb +263 -0
- data/vendor/spinel/test/redo.rb.expected +71 -0
- data/vendor/spinel/test/reduce_acc_shadow.rb +31 -0
- data/vendor/spinel/test/reduce_acc_shadow.rb.expected +5 -0
- data/vendor/spinel/test/regex.rb +152 -0
- data/vendor/spinel/test/regex.rb.expected +43 -0
- data/vendor/spinel/test/regexp.rb +34 -0
- data/vendor/spinel/test/regexp.rb.expected +12 -0
- data/vendor/spinel/test/reopen_class.rb +33 -0
- data/vendor/spinel/test/reopen_class.rb.expected +5 -0
- data/vendor/spinel/test/require/lib/greeter.rb +9 -0
- data/vendor/spinel/test/require/main.rb +5 -0
- data/vendor/spinel/test/require_dedup/lib/data.rb +2 -0
- data/vendor/spinel/test/require_dedup/lib/types.rb +1 -0
- data/vendor/spinel/test/require_dedup/main.rb +8 -0
- data/vendor/spinel/test/rescue.rb +48 -0
- data/vendor/spinel/test/rescue.rb.expected +7 -0
- data/vendor/spinel/test/rescue_modifier_assign.rb +24 -0
- data/vendor/spinel/test/rescue_modifier_assign.rb.expected +4 -0
- data/vendor/spinel/test/rightward_assign.rb +36 -0
- data/vendor/spinel/test/rightward_assign.rb.expected +6 -0
- data/vendor/spinel/test/runtime_widen_int_to_poly_array.rb +27 -0
- data/vendor/spinel/test/runtime_widen_int_to_poly_array.rb.expected +3 -0
- data/vendor/spinel/test/sample_user_method.rb +20 -0
- data/vendor/spinel/test/scan_ivars_inherited_slot.rb +32 -0
- data/vendor/spinel/test/scan_new_calls_class_scope.rb +35 -0
- data/vendor/spinel/test/scan_new_calls_class_scope.rb.expected +1 -0
- data/vendor/spinel/test/send.rb +15 -0
- data/vendor/spinel/test/send.rb.expected +2 -0
- data/vendor/spinel/test/shareable_constant.rb +10 -0
- data/vendor/spinel/test/shareable_constant.rb.expected +2 -0
- data/vendor/spinel/test/sized_poly_array_nil_n.rb +37 -0
- data/vendor/spinel/test/sized_poly_array_nil_n.rb.expected +3 -0
- data/vendor/spinel/test/source_file.rb +37 -0
- data/vendor/spinel/test/source_file.rb.expected +8 -0
- data/vendor/spinel/test/splat_call.rb +72 -0
- data/vendor/spinel/test/splat_call.rb.expected +35 -0
- data/vendor/spinel/test/splat_destructure.rb +56 -0
- data/vendor/spinel/test/splat_destructure.rb.expected +36 -0
- data/vendor/spinel/test/splat_destructure_poly.rb +26 -0
- data/vendor/spinel/test/splat_destructure_poly.rb.expected +8 -0
- data/vendor/spinel/test/stdlib.rb +28 -0
- data/vendor/spinel/test/stdlib.rb.expected +5 -0
- data/vendor/spinel/test/stringio.rb +84 -0
- data/vendor/spinel/test/stringio.rb.expected +27 -0
- data/vendor/spinel/test/strip_nullable_int_cast.rb +24 -0
- data/vendor/spinel/test/strip_nullable_int_cast.rb.expected +1 -0
- data/vendor/spinel/test/struct.rb +25 -0
- data/vendor/spinel/test/struct.rb.expected +8 -0
- data/vendor/spinel/test/struct_inherit.rb +28 -0
- data/vendor/spinel/test/struct_inherit.rb.expected +7 -0
- data/vendor/spinel/test/struct_kw.rb +16 -0
- data/vendor/spinel/test/struct_kw.rb.expected +5 -0
- data/vendor/spinel/test/subclass_inherits_module_parent.rb +40 -0
- data/vendor/spinel/test/subclass_inherits_module_parent.rb.expected +3 -0
- data/vendor/spinel/test/super_arg_cross_class_cast.rb +39 -0
- data/vendor/spinel/test/super_arg_cross_class_cast.rb.expected +2 -0
- data/vendor/spinel/test/super_forwarding.rb +25 -0
- data/vendor/spinel/test/super_forwarding.rb.expected +3 -0
- data/vendor/spinel/test/sym_case.rb +15 -0
- data/vendor/spinel/test/sym_case.rb.expected +4 -0
- data/vendor/spinel/test/sym_poly_hash_merge.rb +47 -0
- data/vendor/spinel/test/sym_poly_hash_merge.rb.expected +11 -0
- data/vendor/spinel/test/symbol_ivar_reassign.rb +25 -0
- data/vendor/spinel/test/symbol_ivar_reassign.rb.expected +2 -0
- data/vendor/spinel/test/three_level_array_outer_index.rb +87 -0
- data/vendor/spinel/test/three_level_array_outer_index.rb.expected +17 -0
- data/vendor/spinel/test/toplevel_ivar_array.rb +19 -0
- data/vendor/spinel/test/toplevel_ivar_array.rb.expected +4 -0
- data/vendor/spinel/test/truncate_module_method.rb +46 -0
- data/vendor/spinel/test/truncate_module_method.rb.expected +6 -0
- data/vendor/spinel/test/unbox_poly_index_in_dispatch.rb +20 -0
- data/vendor/spinel/test/unbox_poly_index_in_dispatch.rb.expected +1 -0
- data/vendor/spinel/test/undef.rb +33 -0
- data/vendor/spinel/test/undef.rb.expected +2 -0
- data/vendor/spinel/test/user_method_named_like_mutator.rb +30 -0
- data/vendor/spinel/test/user_method_named_like_mutator.rb.expected +2 -0
- data/vendor/spinel/test/value_type_ctor_gc_save.rb +46 -0
- data/vendor/spinel/test/value_type_ctor_gc_save.rb.expected +3 -0
- data/vendor/spinel/test/widen_int_obj_to_poly.rb +29 -0
- data/vendor/spinel/test/yield.rb +67 -0
- data/vendor/spinel/test/yield.rb.expected +5 -0
- data/vendor/spinel/test/yield_method_call_in_method_body.rb +58 -0
- data/vendor/spinel/test/yield_method_call_in_method_body.rb.expected +4 -0
- metadata +778 -0
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
# Spinel -- Ruby AOT Compiler
|
|
2
|
+
|
|
3
|
+
Spinel compiles Ruby source code into standalone native executables.
|
|
4
|
+
It performs whole-program type inference and generates optimized C code,
|
|
5
|
+
achieving significant speedups over CRuby.
|
|
6
|
+
|
|
7
|
+
Spinel is **self-hosting**: the compiler backend is written in Ruby and
|
|
8
|
+
compiles itself into a native binary.
|
|
9
|
+
|
|
10
|
+
## How It Works
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
Ruby (.rb)
|
|
14
|
+
|
|
|
15
|
+
v
|
|
16
|
+
spinel_parse Parse with Prism (libprism), serialize AST
|
|
17
|
+
| (C binary, or CRuby + Prism gem as fallback)
|
|
18
|
+
v
|
|
19
|
+
AST text file
|
|
20
|
+
|
|
|
21
|
+
v
|
|
22
|
+
spinel_codegen Type inference + C code generation
|
|
23
|
+
| (self-hosted native binary)
|
|
24
|
+
v
|
|
25
|
+
C source (.c)
|
|
26
|
+
|
|
|
27
|
+
v
|
|
28
|
+
cc -O2 -Ilib -lm Standard C compiler + runtime header
|
|
29
|
+
|
|
|
30
|
+
v
|
|
31
|
+
Native binary Standalone, no runtime dependencies
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Quick Start
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
# Fetch libprism sources (from the prism gem on rubygems.org):
|
|
38
|
+
make deps
|
|
39
|
+
|
|
40
|
+
# Build everything:
|
|
41
|
+
make
|
|
42
|
+
|
|
43
|
+
# Write a Ruby program:
|
|
44
|
+
cat > hello.rb <<'RUBY'
|
|
45
|
+
def fib(n)
|
|
46
|
+
if n < 2
|
|
47
|
+
n
|
|
48
|
+
else
|
|
49
|
+
fib(n - 1) + fib(n - 2)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
puts fib(34)
|
|
54
|
+
RUBY
|
|
55
|
+
|
|
56
|
+
# Compile and run:
|
|
57
|
+
./spinel hello.rb
|
|
58
|
+
./hello # prints 5702887 (instantly)
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Options
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
./spinel app.rb # compiles to ./app
|
|
65
|
+
./spinel app.rb -o myapp # compiles to ./myapp
|
|
66
|
+
./spinel app.rb -c # generates app.c only
|
|
67
|
+
./spinel app.rb -S # prints C to stdout
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## Self-Hosting
|
|
71
|
+
|
|
72
|
+
Spinel compiles its own backend. The bootstrap chain:
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
CRuby + spinel_parse.rb → AST
|
|
76
|
+
CRuby + spinel_codegen.rb → gen1.c → bin1
|
|
77
|
+
bin1 + AST → gen2.c → bin2
|
|
78
|
+
bin2 + AST → gen3.c
|
|
79
|
+
gen2.c == gen3.c (bootstrap loop closed)
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## Benchmarks
|
|
83
|
+
|
|
84
|
+
290 tests pass. 52 benchmarks pass.
|
|
85
|
+
Geometric mean: **~11.6x faster** than miniruby (Ruby 4.1.0dev) across
|
|
86
|
+
the 28 benchmarks below. Baseline is the latest CRuby `miniruby` build
|
|
87
|
+
(without bundled gems), which is considerably faster than the system
|
|
88
|
+
`ruby` (3.2.3); Spinel's advantage is correspondingly smaller but still
|
|
89
|
+
substantial on computation-heavy workloads.
|
|
90
|
+
|
|
91
|
+
### Computation
|
|
92
|
+
|
|
93
|
+
| Benchmark | Spinel | miniruby | Speedup |
|
|
94
|
+
|---|---|---|---|
|
|
95
|
+
| life (Conway's GoL) | 20 ms | 1_733 ms | 86.7x |
|
|
96
|
+
| ackermann | 5 ms | 374 ms | 74.8x |
|
|
97
|
+
| mandelbrot | 25 ms | 1_453 ms | 58.1x |
|
|
98
|
+
| fib (recursive) | 17 ms | 581 ms | 34.2x |
|
|
99
|
+
| nqueens | 10 ms | 304 ms | 30.4x |
|
|
100
|
+
| tarai | 16 ms | 461 ms | 28.8x |
|
|
101
|
+
| tak | 22 ms | 532 ms | 24.2x |
|
|
102
|
+
| matmul | 13 ms | 313 ms | 24.1x |
|
|
103
|
+
| sudoku | 6 ms | 102 ms | 17.0x |
|
|
104
|
+
| partial_sums | 93 ms | 1_498 ms | 16.1x |
|
|
105
|
+
| fannkuch | 2 ms | 19 ms | 9.5x |
|
|
106
|
+
| sieve | 39 ms | 332 ms | 8.5x |
|
|
107
|
+
| fasta (DNA seq gen) | 3 ms | 21 ms | 7.0x |
|
|
108
|
+
|
|
109
|
+
### Data Structures & GC
|
|
110
|
+
|
|
111
|
+
| Benchmark | Spinel | miniruby | Speedup |
|
|
112
|
+
|---|---|---|---|
|
|
113
|
+
| rbtree (red-black tree) | 24 ms | 543 ms | 22.6x |
|
|
114
|
+
| splay tree | 14 ms | 195 ms | 13.9x |
|
|
115
|
+
| huffman (encoding) | 6 ms | 59 ms | 9.8x |
|
|
116
|
+
| so_lists | 76 ms | 410 ms | 5.4x |
|
|
117
|
+
| binary_trees | 11 ms | 40 ms | 3.6x |
|
|
118
|
+
| linked_list | 136 ms | 388 ms | 2.9x |
|
|
119
|
+
| gcbench | 1_845 ms | 3_641 ms | 2.0x |
|
|
120
|
+
|
|
121
|
+
### Real-World Programs
|
|
122
|
+
|
|
123
|
+
| Benchmark | Spinel | miniruby | Speedup |
|
|
124
|
+
|---|---|---|---|
|
|
125
|
+
| json_parse | 39 ms | 394 ms | 10.1x |
|
|
126
|
+
| bigint_fib (1000 digits) | 2 ms | 16 ms | 8.0x |
|
|
127
|
+
| ao_render (ray tracer) | 417 ms | 3_334 ms | 8.0x |
|
|
128
|
+
| pidigits (bigint) | 2 ms | 13 ms | 6.5x |
|
|
129
|
+
| str_concat | 2 ms | 13 ms | 6.5x |
|
|
130
|
+
| template engine | 152 ms | 936 ms | 6.2x |
|
|
131
|
+
| csv_process | 234 ms | 860 ms | 3.7x |
|
|
132
|
+
| io_wordcount | 33 ms | 97 ms | 2.9x |
|
|
133
|
+
|
|
134
|
+
## Supported Ruby Features
|
|
135
|
+
|
|
136
|
+
**Core**: Classes, inheritance, `super`, `include` (mixin), `attr_accessor`,
|
|
137
|
+
`Struct.new`, `alias`, module constants, open classes for built-in types.
|
|
138
|
+
|
|
139
|
+
**Control Flow**: `if`/`elsif`/`else`, `unless`, `case`/`when`,
|
|
140
|
+
`case`/`in` (pattern matching), `while`, `until`, `loop`, `for..in`
|
|
141
|
+
(range and array), `break`, `next`, `return`, `catch`/`throw`,
|
|
142
|
+
`&.` (safe navigation).
|
|
143
|
+
|
|
144
|
+
**Blocks**: `yield`, `block_given?`, `&block`, `proc {}`, `Proc.new`,
|
|
145
|
+
lambda `-> x { }`, `method(:name)`. Block methods: `each`,
|
|
146
|
+
`each_with_index`, `map`, `select`, `reject`, `reduce`, `sort_by`,
|
|
147
|
+
`any?`, `all?`, `none?`, `times`, `upto`, `downto`.
|
|
148
|
+
|
|
149
|
+
**Exceptions**: `begin`/`rescue`/`ensure`/`retry`, `raise`,
|
|
150
|
+
custom exception classes.
|
|
151
|
+
|
|
152
|
+
**Types**: Integer, Float, String (immutable + mutable), Array, Hash,
|
|
153
|
+
Range, Time, StringIO, File, Regexp, Bigint (auto-promoted), Fiber.
|
|
154
|
+
Polymorphic values via tagged unions. Nullable object types (`T?`)
|
|
155
|
+
for self-referential data structures (linked lists, trees).
|
|
156
|
+
|
|
157
|
+
**Inspect / `p`**: `Object#inspect` is implemented for all primitive
|
|
158
|
+
types (Integer, Float, String, Symbol, Boolean, nil), for typed
|
|
159
|
+
arrays (`int_array`, `float_array`, `str_array`, `sym_array`), and
|
|
160
|
+
for heterogeneous arrays (`poly_array`, e.g. `[1, "x", :y]`).
|
|
161
|
+
Scalar polymorphic values (the tagged-union values from the `Types`
|
|
162
|
+
section above) also inspect correctly.
|
|
163
|
+
`Array#to_s` is aliased to `Array#inspect`, matching CRuby.
|
|
164
|
+
`Kernel#p` dispatches through `compile_inspect_for` so `p obj`,
|
|
165
|
+
`obj.inspect`, `obj.to_s`, and `"#{obj.inspect}"` interpolation
|
|
166
|
+
all produce CRuby-byte-identical output. User-class instances
|
|
167
|
+
inside a polymorphic value currently render as the placeholder
|
|
168
|
+
`"#<Object>"` (the runtime has no class-name table yet); Hash,
|
|
169
|
+
Range, and Struct inspect are not yet implemented.
|
|
170
|
+
|
|
171
|
+
**Global Variables**: `$name` compiled to static C variables with
|
|
172
|
+
type-mismatch detection at compile time.
|
|
173
|
+
|
|
174
|
+
**Strings**: `<<` automatically promotes to mutable strings (`sp_String`)
|
|
175
|
+
for O(n) in-place append. `+`, interpolation, `tr`, `ljust`/`rjust`/`center`,
|
|
176
|
+
and all standard methods work on both. Character comparisons like
|
|
177
|
+
`s[i] == "c"` are optimized to direct char array access (zero allocation).
|
|
178
|
+
Chained concatenation (`a + b + c + d`) collapses to a single malloc
|
|
179
|
+
via `sp_str_concat4` / `sp_str_concat_arr` -- N-1 fewer allocations.
|
|
180
|
+
Loop-local `str.split(sep)` reuses the same `sp_StrArray` across
|
|
181
|
+
iterations (csv_process: 4 M allocations eliminated).
|
|
182
|
+
|
|
183
|
+
**Regexp**: Built-in NFA regexp engine (no external dependency).
|
|
184
|
+
`=~`, `$1`-`$9`, `match?`, `gsub(/re/, str)`, `sub(/re/, str)`,
|
|
185
|
+
`scan(/re/)`, `split(/re/)`.
|
|
186
|
+
|
|
187
|
+
**Bigint**: Arbitrary precision integers via mruby-bigint. Auto-promoted
|
|
188
|
+
from loop multiplication patterns (e.g. `q = q * k`). Linked as static
|
|
189
|
+
library -- only included when used.
|
|
190
|
+
|
|
191
|
+
**Fiber**: Cooperative concurrency via `ucontext_t`. `Fiber.new`,
|
|
192
|
+
`Fiber#resume`, `Fiber.yield` with value passing. Captures free
|
|
193
|
+
variables via heap-promoted cells.
|
|
194
|
+
|
|
195
|
+
**Memory**: Mark-and-sweep GC with size-segregated free lists, non-recursive
|
|
196
|
+
marking, and sticky mark bits. Small classes (≤8 scalar fields, no
|
|
197
|
+
inheritance, no mutation through parameters) are automatically
|
|
198
|
+
stack-allocated as **value types** -- 1M allocations of a 5-field class
|
|
199
|
+
drop from 85 ms to 2 ms. Programs using only value types emit no GC
|
|
200
|
+
runtime at all.
|
|
201
|
+
|
|
202
|
+
**Symbols**: Separate `sp_sym` type, distinct from strings (`:a != "a"`).
|
|
203
|
+
Symbol literals are interned at compile time (`SPS_name` constants);
|
|
204
|
+
`String#to_sym` uses a dynamic pool only when needed. Symbol-keyed
|
|
205
|
+
hashes (`{a: 1}`) use a dedicated `sp_SymIntHash` that stores
|
|
206
|
+
`sp_sym` (integer) keys directly rather than strings -- no strcmp, no
|
|
207
|
+
dynamic string allocation.
|
|
208
|
+
|
|
209
|
+
**I/O**: `puts`, `print`, `printf`, `p`, `gets`, `ARGV`, `ENV[]`,
|
|
210
|
+
`File.read/write/open` (with blocks), `system()`, backtick.
|
|
211
|
+
|
|
212
|
+
**FFI**: Direct C calls without an extension compiler. Declarations
|
|
213
|
+
(`ffi_func`, `ffi_lib`, `ffi_const`, `ffi_buffer`, `ffi_read_*`) live
|
|
214
|
+
inside a `module` body; the codegen emits externs and the `spinel`
|
|
215
|
+
wrapper picks up `-l` flags from marker comments. Scalars, strings,
|
|
216
|
+
opaque `:ptr`, integer constants, raw byte buffers, and struct-field
|
|
217
|
+
reads are covered. See [docs/FFI.md](docs/FFI.md) for the full spec
|
|
218
|
+
and [examples/ffi/](examples/ffi/) for runnable demos against libc/
|
|
219
|
+
libm and sqlite3.
|
|
220
|
+
|
|
221
|
+
## Optimizations
|
|
222
|
+
|
|
223
|
+
Whole-program type inference drives several compile-time optimizations:
|
|
224
|
+
|
|
225
|
+
- **Value-type promotion**: small immutable classes (≤8 scalar fields)
|
|
226
|
+
become C structs on the stack, eliminating GC overhead entirely.
|
|
227
|
+
- **Constant propagation**: simple literal constants (`N = 100`) are
|
|
228
|
+
inlined at use sites instead of going through `cst_N` runtime lookup.
|
|
229
|
+
- **Loop-invariant length hoisting**: `while i < arr.length` evaluates
|
|
230
|
+
`arr.length` once before the loop; `while i < str.length` hoists
|
|
231
|
+
`strlen`. Mutation of the receiver inside the body (e.g. `arr.push`)
|
|
232
|
+
correctly disables the hoist.
|
|
233
|
+
- **Method inlining**: short methods (≤3 statements, non-recursive)
|
|
234
|
+
get `static inline` so gcc can inline them at call sites.
|
|
235
|
+
- **String concat chain flattening**: `a + b + c + d` compiles to a
|
|
236
|
+
single `sp_str_concat4` / `sp_str_concat_arr` call -- one malloc
|
|
237
|
+
instead of N-1 intermediate strings.
|
|
238
|
+
- **Bigint auto-promotion**: loops with `x = x * y` or fibonacci-style
|
|
239
|
+
`c = a + b` self-referential addition auto-promote to bigint.
|
|
240
|
+
- **Bigint `to_s`**: divide-and-conquer O(n log²n) via mruby-bigint's
|
|
241
|
+
`mpz_get_str` instead of naive O(n²).
|
|
242
|
+
- **Static symbol interning**: `"literal".to_sym` resolves to a
|
|
243
|
+
compile-time `SPS_<name>` constant; the runtime dynamic pool is
|
|
244
|
+
only emitted when dynamic interning is actually used.
|
|
245
|
+
- **`strlen` caching in sub_range**: when a string's length is
|
|
246
|
+
hoisted, `str[i]` accesses use `sp_str_sub_range_len` to skip the
|
|
247
|
+
internal strlen call.
|
|
248
|
+
- **split reuse**: `fields = line.split(",")` inside a loop reuses
|
|
249
|
+
the existing `sp_StrArray` rather than allocating a new one.
|
|
250
|
+
- **Dead-code elimination**: compiled with `-ffunction-sections
|
|
251
|
+
-fdata-sections` and linked with `--gc-sections`; each unused
|
|
252
|
+
runtime function is stripped from the final binary.
|
|
253
|
+
- **Iterative inference early exit**: the param/return/ivar fixed-point
|
|
254
|
+
loop stops as soon as a signature of the three refined arrays stops
|
|
255
|
+
changing. Most programs converge in 1-2 iterations instead of the
|
|
256
|
+
full 4, cutting bootstrap time by ~14%.
|
|
257
|
+
- **`parse_id_list` byte walk**: the AST-field list parser (called
|
|
258
|
+
~120 K times during self-compile) walks bytes manually via
|
|
259
|
+
`s.bytes[i]` instead of `s.split(",")`, dropping N+1 allocations
|
|
260
|
+
per call to 2.
|
|
261
|
+
- **Warning-free build**: generated C compiles cleanly at the default
|
|
262
|
+
warning level across every test and benchmark; the harness uses
|
|
263
|
+
`-Werror` so regressions surface immediately.
|
|
264
|
+
|
|
265
|
+
## Architecture
|
|
266
|
+
|
|
267
|
+
```
|
|
268
|
+
spinel One-command wrapper script (POSIX shell)
|
|
269
|
+
spinel_parse.c C frontend: libprism → text AST (1_276 lines)
|
|
270
|
+
spinel_codegen.rb Compiler backend: AST → C code (30_795 lines)
|
|
271
|
+
lib/sp_runtime.h Runtime library header (1_089 lines)
|
|
272
|
+
lib/sp_bigint.c Arbitrary precision integers (5_394 lines)
|
|
273
|
+
lib/regexp/ Built-in regexp engine (1_866 lines)
|
|
274
|
+
test/ 290 feature tests
|
|
275
|
+
benchmark/ 52 benchmarks
|
|
276
|
+
Makefile Build automation
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
The compiler backend (`spinel_codegen.rb`) is written in a Ruby subset
|
|
280
|
+
that Spinel itself can compile: classes, `def`, `attr_accessor`,
|
|
281
|
+
`if`/`case`/`while`, `each`/`map`/`select`, `yield`, `begin`/`rescue`,
|
|
282
|
+
String/Array/Hash operations, File I/O.
|
|
283
|
+
|
|
284
|
+
No metaprogramming, no `eval`, no `require` in the backend.
|
|
285
|
+
|
|
286
|
+
The runtime (`lib/sp_runtime.h`) contains GC, array/hash/string
|
|
287
|
+
implementations, and all runtime support as a single header file.
|
|
288
|
+
Generated C includes this header, and the linker pulls only the
|
|
289
|
+
needed parts from `libspinel_rt.a` (bigint + regexp engine).
|
|
290
|
+
|
|
291
|
+
The parser has two implementations:
|
|
292
|
+
- **spinel_parse.c** links libprism directly (no CRuby needed)
|
|
293
|
+
- **spinel_parse.rb** uses the Prism gem (CRuby fallback)
|
|
294
|
+
|
|
295
|
+
Both produce identical AST output. The `spinel` wrapper prefers the
|
|
296
|
+
C binary if available. `require_relative` is resolved at parse time
|
|
297
|
+
by inlining the referenced file.
|
|
298
|
+
|
|
299
|
+
## Building
|
|
300
|
+
|
|
301
|
+
```bash
|
|
302
|
+
make deps # fetch libprism into vendor/prism (one-time)
|
|
303
|
+
make # build parser + regexp library + bootstrap compiler
|
|
304
|
+
make test # run 290 feature tests (requires bootstrap)
|
|
305
|
+
make bench # run 52 benchmarks (requires bootstrap)
|
|
306
|
+
make bootstrap # rebuild compiler from source
|
|
307
|
+
sudo make install # install to /usr/local (spinel in PATH)
|
|
308
|
+
make clean # remove build artifacts
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
Override install prefix: `make install PREFIX=$HOME/.local`
|
|
312
|
+
|
|
313
|
+
[Prism](https://github.com/ruby/prism) is the Ruby parser used by
|
|
314
|
+
`spinel_parse`. `make deps` downloads the prism gem tarball from
|
|
315
|
+
rubygems.org and extracts its C sources to `vendor/prism`. If you
|
|
316
|
+
already have the prism gem installed, the build auto-detects it; you
|
|
317
|
+
can also point at a custom location with `PRISM_DIR=/path/to/prism`.
|
|
318
|
+
|
|
319
|
+
CRuby is needed only for the initial bootstrap. After `make`, the
|
|
320
|
+
entire pipeline runs without Ruby.
|
|
321
|
+
|
|
322
|
+
## Portability
|
|
323
|
+
|
|
324
|
+
Spinel can emit C without invoking the C compiler — useful when you
|
|
325
|
+
want to build the Ruby program on one machine and ship the generated
|
|
326
|
+
sources to another:
|
|
327
|
+
|
|
328
|
+
```sh
|
|
329
|
+
spinel app.rb -c # writes app.c next to the source
|
|
330
|
+
spinel app.rb -c -o app.c # specify output path
|
|
331
|
+
spinel app.rb -S # print the C to stdout
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
The output is one self-contained `.c` file that compiles against
|
|
335
|
+
`lib/sp_runtime.h`. The two together are everything a downstream
|
|
336
|
+
consumer needs — no link to `libspinel`.
|
|
337
|
+
|
|
338
|
+
The runtime is POSIX-flavoured but covers every platform CI exercises:
|
|
339
|
+
|
|
340
|
+
| Platform | Status | Compiler |
|
|
341
|
+
|---|---|---|
|
|
342
|
+
| Linux (x86-64, arm64) | Supported | gcc, clang |
|
|
343
|
+
| macOS (Intel, Apple Silicon) | Supported | clang |
|
|
344
|
+
| *BSD | Expected to work; not in CI | clang |
|
|
345
|
+
| Windows | Supported via [MSYS2](https://www.msys2.org/) / MinGW | gcc |
|
|
346
|
+
| Windows native (MSVC) | Not supported | -- |
|
|
347
|
+
|
|
348
|
+
Every PR runs `ubuntu-latest / gcc`, `ubuntu-latest / clang`,
|
|
349
|
+
`macos-latest / clang`, and `windows-mingw` jobs end-to-end (parser
|
|
350
|
+
build, codegen build, fixed-point bootstrap, full test + benchmark
|
|
351
|
+
suites). MSVC isn't supported because the runtime relies on POSIX
|
|
352
|
+
assumptions (`<ucontext.h>` for `Fiber`, `<sys/mman.h>` for the
|
|
353
|
+
regexp engine's executable buffers, GCC's `__attribute__((cleanup))`
|
|
354
|
+
for the GC root stack); a port would either replace those or guard
|
|
355
|
+
them behind compile-time switches.
|
|
356
|
+
|
|
357
|
+
## Limitations
|
|
358
|
+
|
|
359
|
+
- **No eval**: `eval`, `instance_eval`, `class_eval`
|
|
360
|
+
- **No metaprogramming**: `send`, `method_missing`, `define_method` (dynamic)
|
|
361
|
+
- **No threads**: `Thread`, `Mutex` (Fiber is supported)
|
|
362
|
+
- **No encoding**: assumes UTF-8/ASCII
|
|
363
|
+
- **No general lambda calculus**: deeply nested `-> x { }` with `[]` calls
|
|
364
|
+
|
|
365
|
+
## Dependencies
|
|
366
|
+
|
|
367
|
+
- **Build time**: [libprism](https://github.com/ruby/prism) (C library),
|
|
368
|
+
CRuby (bootstrap only)
|
|
369
|
+
- **Run time**: None. Generated binaries need only libc + libm.
|
|
370
|
+
- **Regexp**: Built-in engine, no external library needed.
|
|
371
|
+
- **Bigint**: Built-in (from mruby-bigint), linked only when used.
|
|
372
|
+
|
|
373
|
+
## Contributing
|
|
374
|
+
|
|
375
|
+
Contributions are welcome. The issue tracker doubles as the roadmap —
|
|
376
|
+
anything open is fair game; the most useful entry points are
|
|
377
|
+
reproducer-shaped bug reports (a 5-line Ruby that fails in Spinel but
|
|
378
|
+
passes in CRuby) and codegen fixes that close one such report.
|
|
379
|
+
|
|
380
|
+
Workflow:
|
|
381
|
+
|
|
382
|
+
- Open a focused PR. Small and contained merges faster than sweeping
|
|
383
|
+
refactors.
|
|
384
|
+
- Make `make` close (`gen2.c == gen3.c`) and `make test` / `make bench`
|
|
385
|
+
pass before pushing.
|
|
386
|
+
- Add a regression test under `test/` for any fix or new feature; the
|
|
387
|
+
harness compares Spinel's output against CRuby on the same source,
|
|
388
|
+
so the test usually doesn't need to assert anything beyond `puts`.
|
|
389
|
+
- Reference issues with `Closes #N` / `Fixes #N` / `Refs #N` trailers
|
|
390
|
+
in the commit message.
|
|
391
|
+
- If the work was assisted by an AI, add a `Co-Authored-By:` trailer
|
|
392
|
+
for the assistant alongside any human co-authors. The maintainer's
|
|
393
|
+
own AI-assisted commits use `Co-Authored-By: Claude Opus 4.7`.
|
|
394
|
+
|
|
395
|
+
Adjacent ecosystem (community-built, not part of this repo):
|
|
396
|
+
|
|
397
|
+
- [rubocop_spinel](https://github.com/gurgeous/rubocop_spinel) —
|
|
398
|
+
a RuboCop custom cop that flags Ruby code Spinel doesn't yet
|
|
399
|
+
support.
|
|
400
|
+
|
|
401
|
+
## History
|
|
402
|
+
|
|
403
|
+
Spinel was originally implemented in C (18K lines, branch `c-version`),
|
|
404
|
+
then rewritten in Ruby (branch `ruby-v1`), and finally rewritten in a
|
|
405
|
+
self-hosting Ruby subset (current `master`).
|
|
406
|
+
|
|
407
|
+
## License
|
|
408
|
+
|
|
409
|
+
MIT License. See [LICENSE](LICENSE).
|