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,406 @@
|
|
|
1
|
+
# Spinel AOT Compiler - Makefile
|
|
2
|
+
#
|
|
3
|
+
# Usage:
|
|
4
|
+
# make Build everything (parser + bootstrap compiler)
|
|
5
|
+
# make parse Build C parser only
|
|
6
|
+
# make bootstrap Bootstrap the compiler backend
|
|
7
|
+
# make test Run feature tests (requires bootstrap first)
|
|
8
|
+
# make bench Run benchmarks (requires bootstrap first)
|
|
9
|
+
# make clean Remove built binaries
|
|
10
|
+
|
|
11
|
+
CC ?= cc
|
|
12
|
+
# Auto-wrap CC with sccache or ccache when present. Skip when CC is
|
|
13
|
+
# already wrapped — the substring guard catches both "ccache" and
|
|
14
|
+
# "sccache" since "ccache" is a substring of "sccache", so CI's
|
|
15
|
+
# `CC=sccache <cc>` env stays untouched. NO_CCACHE=1 opts out.
|
|
16
|
+
# `override` is required so that `make CC=gcc` (command-line CC) is
|
|
17
|
+
# also wrapped — without it, command-line CC takes precedence over
|
|
18
|
+
# Makefile assignments and the wrap is silently ignored.
|
|
19
|
+
ifeq (,$(findstring ccache,$(CC)))
|
|
20
|
+
ifeq (,$(NO_CCACHE))
|
|
21
|
+
CCACHE_BIN := $(shell command -v sccache 2>/dev/null || command -v ccache 2>/dev/null)
|
|
22
|
+
ifneq (,$(CCACHE_BIN))
|
|
23
|
+
override CC := $(CCACHE_BIN) $(CC)
|
|
24
|
+
endif
|
|
25
|
+
endif
|
|
26
|
+
endif
|
|
27
|
+
# `-Wno-alloc-size-larger-than` silences a gcc 13+ paranoia warning that
|
|
28
|
+
# fires on the inlined `h->cap *= 2` in sp_*Hash_grow when the inliner
|
|
29
|
+
# can't bound h->cap. The pattern is bounded in practice (cap doubles
|
|
30
|
+
# from a small power of two until memory runs out, never approaches
|
|
31
|
+
# 2^60), but gcc tracks signed-overflow UB conservatively. Clang
|
|
32
|
+
# doesn't have that warning; without `-Wno-unknown-warning-option`
|
|
33
|
+
# first, clang would turn the unknown -Wno- into a -Werror failure on
|
|
34
|
+
# every cc invocation in `make test` / `make bench`.
|
|
35
|
+
# Optimization level for the C compiles driven by the test/bench
|
|
36
|
+
# harness (each .rb gets parsed → codegen → cc'd → run). CI overrides
|
|
37
|
+
# this to -O0 to cut Windows cc time substantially; locally -O2 keeps
|
|
38
|
+
# the test binaries reasonable-speed for quicker run-after-compile.
|
|
39
|
+
OPT ?= -O2
|
|
40
|
+
CFLAGS = $(OPT) -Wno-all -Wno-unknown-warning-option -Wno-alloc-size-larger-than
|
|
41
|
+
# Bootstrap-only flags: spinel_codegen runs on the developer's machine
|
|
42
|
+
# only, so we can use -O3 -flto for ~5-10% extra wall-clock without
|
|
43
|
+
# constraining users (whose generated C is built with plain CFLAGS).
|
|
44
|
+
# Override with LTO=0 on toolchains without LTO support.
|
|
45
|
+
LTO ?= 1
|
|
46
|
+
ifeq ($(LTO),1)
|
|
47
|
+
BOOTSTRAP_CFLAGS = -O3 -flto=auto -Wno-all
|
|
48
|
+
else
|
|
49
|
+
BOOTSTRAP_CFLAGS = $(CFLAGS)
|
|
50
|
+
endif
|
|
51
|
+
# Per-function sections allow the linker to strip unused bigint/regexp
|
|
52
|
+
# functions from the final binary (supported since GCC 2.7 / binutils 2.17).
|
|
53
|
+
SEC_FLAGS = -ffunction-sections -fdata-sections
|
|
54
|
+
# Apple ld64 spells dead-code stripping --dead_strip; GNU ld uses --gc-sections.
|
|
55
|
+
ifeq ($(shell uname -s),Darwin)
|
|
56
|
+
GC_FLAGS = -Wl,-dead_strip
|
|
57
|
+
else
|
|
58
|
+
GC_FLAGS = -Wl,--gc-sections
|
|
59
|
+
endif
|
|
60
|
+
|
|
61
|
+
# MinGW gcc appends .exe to its output filename; reflect that in target
|
|
62
|
+
# names so Make's dependency tracking and install/clean match reality.
|
|
63
|
+
# Windows (MinGW) default stack is also only 1MB — far too small for the
|
|
64
|
+
# deeply recursive bootstrap compile (~75k frames of AST traversal).
|
|
65
|
+
ifeq ($(OS),Windows_NT)
|
|
66
|
+
EXE = .exe
|
|
67
|
+
LDFLAGS += -Wl,--stack,67108864
|
|
68
|
+
endif
|
|
69
|
+
|
|
70
|
+
# `timeout` is GNU coreutils — present by default on Linux but missing
|
|
71
|
+
# on macOS unless `brew install coreutils` is run (where it's named
|
|
72
|
+
# `gtimeout`). Without it test/bench would chain-fail at the very first
|
|
73
|
+
# `timeout` call with exit 127, reporting 0 pass / 0 fail. Detect both
|
|
74
|
+
# names; if neither is found, run without time limits (slow benches
|
|
75
|
+
# won't be auto-killed, but otherwise everything works).
|
|
76
|
+
TIMEOUT_BIN := $(shell command -v timeout 2>/dev/null || command -v gtimeout 2>/dev/null)
|
|
77
|
+
TIMEOUT10 := $(if $(TIMEOUT_BIN),$(TIMEOUT_BIN) 10,)
|
|
78
|
+
TIMEOUT60 := $(if $(TIMEOUT_BIN),$(TIMEOUT_BIN) 60,)
|
|
79
|
+
|
|
80
|
+
# Default -j to logical CPU count when MAKEFLAGS doesn't already
|
|
81
|
+
# carry a -j flag. The combined guard catches the three forms a user
|
|
82
|
+
# can supply -j in (per the GNU Make manual): `-j N` / `-jN` via
|
|
83
|
+
# filter, the short-flag-cluster form like `-kj` via findstring on
|
|
84
|
+
# the first word (the leading `-` makes firstword non-empty when
|
|
85
|
+
# MAKEFLAGS starts blank), and Make 4.x's `--jobserver-auth=…` long
|
|
86
|
+
# form. Note: GNU Make 3.81 (macOS system make) reports MAKEFLAGS
|
|
87
|
+
# as empty at parse time, so the guard always fires there; users on
|
|
88
|
+
# 3.81 wanting to override should pass `MAKEFLAGS=-jN make …`.
|
|
89
|
+
ifeq (,$(filter -j%,$(MAKEFLAGS))$(findstring j,$(firstword -$(MAKEFLAGS)))$(filter --jobserver%,$(MAKEFLAGS)))
|
|
90
|
+
MAKEFLAGS += -j$(shell getconf _NPROCESSORS_ONLN 2>/dev/null || echo 4)
|
|
91
|
+
endif
|
|
92
|
+
|
|
93
|
+
# Reference Ruby for `make test` / `make bench` output comparison.
|
|
94
|
+
# Defaults to `ruby` (the system CRuby), matching the historical
|
|
95
|
+
# behaviour. Override on the command line when a newer or differently-
|
|
96
|
+
# built interpreter is needed, e.g.
|
|
97
|
+
#
|
|
98
|
+
# REF_RUBY=miniruby make test
|
|
99
|
+
#
|
|
100
|
+
# to use a freshly-built bootstrap interpreter (Ruby's `miniruby`)
|
|
101
|
+
# that supports newer features like the `it` block param. The
|
|
102
|
+
# harness falls back to `ruby` per-file if `REF_RUBY` exits non-zero
|
|
103
|
+
# — covers tests that `require` extension libraries (stringio, etc.)
|
|
104
|
+
# which the bootstrap miniruby can't load.
|
|
105
|
+
REF_RUBY ?= ruby
|
|
106
|
+
|
|
107
|
+
# Prism library: prefer vendor/prism (fetched via `make deps`), then
|
|
108
|
+
# fall back to the Prism gem if one is installed. Override by setting
|
|
109
|
+
# PRISM_DIR=/path/to/prism on the command line.
|
|
110
|
+
PRISM_VERSION ?= 1.9.0
|
|
111
|
+
ifneq ($(wildcard vendor/prism/include/prism.h),)
|
|
112
|
+
PRISM_DIR ?= vendor/prism
|
|
113
|
+
else
|
|
114
|
+
PRISM_DIR ?= $(shell ruby -rprism -e 'puts $$LOADED_FEATURES.grep(/prism/).first.sub(%r{/lib/.*}, "")' 2>/dev/null)
|
|
115
|
+
endif
|
|
116
|
+
|
|
117
|
+
PRISM_INC = $(PRISM_DIR)/include
|
|
118
|
+
PRISM_SRC = $(wildcard $(PRISM_DIR)/src/*.c) $(wildcard $(PRISM_DIR)/src/util/*.c)
|
|
119
|
+
PRISM_OBJ = $(patsubst $(PRISM_DIR)/src/%.c,build/prism/%.o,$(PRISM_SRC))
|
|
120
|
+
PRISM_LIB = build/libprism.a
|
|
121
|
+
|
|
122
|
+
CODEGEN_STAMP := build/stamps/spinel_codegen.rb.stamp
|
|
123
|
+
PARSE_STAMP := build/stamps/spinel_parse.c.stamp
|
|
124
|
+
|
|
125
|
+
.PHONY: all parse bootstrap codegen test retest clean-test-results regen-expected bench clean install uninstall deps
|
|
126
|
+
|
|
127
|
+
all: parse regexp spinel_codegen$(EXE)
|
|
128
|
+
|
|
129
|
+
# ---- Dependencies ----
|
|
130
|
+
# Clone Prism into vendor/prism at the pinned version. Run this once
|
|
131
|
+
# after cloning Spinel if you don't have the Prism gem installed.
|
|
132
|
+
deps: vendor/prism/include/prism/diagnostic.h
|
|
133
|
+
|
|
134
|
+
# Download the pre-built Prism gem from rubygems.org and extract its C
|
|
135
|
+
# sources. We use the .gem tarball instead of a git clone because it
|
|
136
|
+
# ships with the generated headers (diagnostic.h, etc.) already in
|
|
137
|
+
# place — no rake/bundler needed.
|
|
138
|
+
vendor/prism/include/prism/diagnostic.h:
|
|
139
|
+
@mkdir -p vendor/prism
|
|
140
|
+
@echo "Fetching prism v$(PRISM_VERSION) from rubygems.org..."
|
|
141
|
+
curl -sL -o /tmp/prism-$(PRISM_VERSION).gem https://rubygems.org/gems/prism-$(PRISM_VERSION).gem
|
|
142
|
+
@tmpdir=$$(mktemp -d); \
|
|
143
|
+
tar -xf /tmp/prism-$(PRISM_VERSION).gem -C $$tmpdir data.tar.gz; \
|
|
144
|
+
tar -xzf $$tmpdir/data.tar.gz -C vendor/prism; \
|
|
145
|
+
rm -rf $$tmpdir /tmp/prism-$(PRISM_VERSION).gem
|
|
146
|
+
@test -f $@ && echo "prism v$(PRISM_VERSION) ready at vendor/prism"
|
|
147
|
+
|
|
148
|
+
# If PRISM_DIR ended up empty (no vendor/prism, no gem), halt with a
|
|
149
|
+
# clear message before trying to build anything that needs it.
|
|
150
|
+
ifeq ($(PRISM_DIR),)
|
|
151
|
+
parse bootstrap codegen regexp all: prism-missing
|
|
152
|
+
prism-missing:
|
|
153
|
+
@echo "Error: Prism not found."; \
|
|
154
|
+
echo " Run 'make deps' to fetch libprism into vendor/prism,"; \
|
|
155
|
+
echo " or install the prism gem (gem install prism),"; \
|
|
156
|
+
echo " or set PRISM_DIR=/path/to/prism manually."; \
|
|
157
|
+
exit 1
|
|
158
|
+
endif
|
|
159
|
+
|
|
160
|
+
# ---- Prism static library ----
|
|
161
|
+
|
|
162
|
+
build/libprism.a: $(PRISM_OBJ)
|
|
163
|
+
@mkdir -p build
|
|
164
|
+
ar rcs $@ $^
|
|
165
|
+
|
|
166
|
+
build/prism/%.o: $(PRISM_DIR)/src/%.c
|
|
167
|
+
@mkdir -p $(dir $@)
|
|
168
|
+
$(CC) -c -O2 -I$(PRISM_INC) -I$(PRISM_DIR)/src $< -o $@
|
|
169
|
+
|
|
170
|
+
# ---- Content stamps ----
|
|
171
|
+
# Content stamps: rules depend on `build/stamps/foo.stamp` instead of
|
|
172
|
+
# `foo` directly, so `touch foo` (or `git checkout` of an identical
|
|
173
|
+
# version) doesn't invalidate downstream targets. cmp-or-replace
|
|
174
|
+
# advances the stamp's mtime only on real content change.
|
|
175
|
+
build/stamps:
|
|
176
|
+
@mkdir -p $@
|
|
177
|
+
|
|
178
|
+
build/stamps/%.stamp: % | build/stamps
|
|
179
|
+
@cmp -s $< $@ 2>/dev/null || cp $< $@
|
|
180
|
+
|
|
181
|
+
# Without .PRECIOUS make would delete these as pattern-rule
|
|
182
|
+
# intermediates, recreating them with fresh mtimes next run.
|
|
183
|
+
.PRECIOUS: build/stamps/%.stamp
|
|
184
|
+
|
|
185
|
+
# ---- C Parser ----
|
|
186
|
+
|
|
187
|
+
parse: spinel_parse$(EXE)
|
|
188
|
+
|
|
189
|
+
spinel_parse$(EXE): $(PARSE_STAMP) $(PRISM_LIB)
|
|
190
|
+
$(CC) $(CFLAGS) -I$(PRISM_INC) spinel_parse.c $(PRISM_LIB) -lm -o $@
|
|
191
|
+
|
|
192
|
+
# ---- Runtime library (regexp + bigint) ----
|
|
193
|
+
|
|
194
|
+
RE_SRC = lib/regexp/re_compile.c lib/regexp/re_exec.c lib/regexp/re_utf8.c
|
|
195
|
+
RE_OBJ = $(patsubst lib/regexp/%.c,build/regexp/%.o,$(RE_SRC))
|
|
196
|
+
|
|
197
|
+
build/regexp/%.o: lib/regexp/%.c lib/regexp/re_internal.h
|
|
198
|
+
@mkdir -p build/regexp
|
|
199
|
+
$(CC) -c -O2 $(SEC_FLAGS) -Ilib/regexp $< -o $@
|
|
200
|
+
|
|
201
|
+
build/sp_bigint.o: lib/sp_bigint.c lib/sp_bigint.h lib/mruby_shim.h
|
|
202
|
+
@mkdir -p build
|
|
203
|
+
$(CC) -c -O2 -Wno-all $(SEC_FLAGS) -Ilib lib/sp_bigint.c -o build/sp_bigint.o
|
|
204
|
+
|
|
205
|
+
SP_RT_LIB = lib/libspinel_rt.a
|
|
206
|
+
|
|
207
|
+
$(SP_RT_LIB): $(RE_OBJ) build/sp_bigint.o
|
|
208
|
+
ar rcs $@ $^
|
|
209
|
+
|
|
210
|
+
regexp: $(SP_RT_LIB)
|
|
211
|
+
|
|
212
|
+
# ---- Build the codegen binary (fast path) ----
|
|
213
|
+
# `make spinel_codegen` (or the alias `make codegen`) compiles
|
|
214
|
+
# spinel_codegen.rb once via CRuby and links the result. This is
|
|
215
|
+
# enough to use the binary; for the full self-hosting fixed-point
|
|
216
|
+
# check (gen2.c == gen3.c), use `make bootstrap`.
|
|
217
|
+
|
|
218
|
+
codegen: spinel_codegen$(EXE)
|
|
219
|
+
|
|
220
|
+
spinel_codegen$(EXE): $(CODEGEN_STAMP) spinel_parse$(EXE)
|
|
221
|
+
./spinel_parse$(EXE) spinel_codegen.rb build/codegen.ast
|
|
222
|
+
ruby spinel_codegen.rb build/codegen.ast build/gen1.c
|
|
223
|
+
$(CC) $(BOOTSTRAP_CFLAGS) -Ilib build/gen1.c $(LDFLAGS) -lm -o spinel_codegen$(EXE)
|
|
224
|
+
|
|
225
|
+
# ---- Self-hosting verification (slow path) ----
|
|
226
|
+
# Re-runs the binary on its own AST to produce gen2.c, compiles bin2,
|
|
227
|
+
# re-runs bin2 to produce gen3.c, asserts gen2.c == gen3.c (the
|
|
228
|
+
# self-hosting fixed point). On success, replaces spinel_codegen with
|
|
229
|
+
# the verified bin2.
|
|
230
|
+
|
|
231
|
+
bootstrap: spinel_codegen$(EXE)
|
|
232
|
+
@echo "=== Bootstrap: gen2 (via spinel_codegen) ==="
|
|
233
|
+
./spinel_codegen$(EXE) build/codegen.ast build/gen2.c
|
|
234
|
+
$(CC) $(BOOTSTRAP_CFLAGS) -Ilib build/gen2.c $(LDFLAGS) -lm -o build/bin2$(EXE)
|
|
235
|
+
@echo "=== Bootstrap: gen3 (via bin2) - verify ==="
|
|
236
|
+
./build/bin2$(EXE) build/codegen.ast build/gen3.c
|
|
237
|
+
@diff build/gen2.c build/gen3.c > /dev/null && echo "gen2.c == gen3.c (bootstrap OK)" || (echo "BOOTSTRAP FAILED: gen2.c != gen3.c" && exit 1)
|
|
238
|
+
cp build/bin2$(EXE) spinel_codegen$(EXE)
|
|
239
|
+
|
|
240
|
+
# ---- Test ----
|
|
241
|
+
|
|
242
|
+
TESTS := $(wildcard test/*.rb)
|
|
243
|
+
TEST_TARGETS := $(patsubst test/%.rb,build/test-results/%.ok,$(TESTS))
|
|
244
|
+
|
|
245
|
+
# `make test` is incremental via mtime tracking on .ok files;
|
|
246
|
+
# `make retest` wipes them for a forced rerun.
|
|
247
|
+
test: $(TEST_TARGETS)
|
|
248
|
+
@if [ -z "$(TIMEOUT_BIN)" ]; then echo "Note: no 'timeout' command found; running without time limits."; fi
|
|
249
|
+
@if [ -t 1 ]; then printf '\n'; fi
|
|
250
|
+
@pass=$$(grep -l '^PASS' build/test-results/*.ok 2>/dev/null | wc -l); \
|
|
251
|
+
fail=$$(grep -l '^FAIL' build/test-results/*.ok 2>/dev/null | wc -l); \
|
|
252
|
+
err=$$(grep -l '^ERR' build/test-results/*.ok 2>/dev/null | wc -l); \
|
|
253
|
+
for f in build/test-results/*.ok; do \
|
|
254
|
+
bn=$$(basename "$$f" .ok); \
|
|
255
|
+
status=$$(cat "$$f"); \
|
|
256
|
+
if [ "$$status" = FAIL ]; then \
|
|
257
|
+
echo "FAIL: $$bn"; \
|
|
258
|
+
head -40 "$$f.diff"; \
|
|
259
|
+
elif [ "$$status" = ERR ]; then \
|
|
260
|
+
echo "ERR: $$bn"; \
|
|
261
|
+
fi; \
|
|
262
|
+
done; \
|
|
263
|
+
echo "Tests: $$pass pass, $$fail fail, $$err error"; \
|
|
264
|
+
if [ $$fail -ne 0 ] || [ $$err -ne 0 ]; then exit 1; fi
|
|
265
|
+
|
|
266
|
+
retest: clean-test-results
|
|
267
|
+
@$(MAKE) --no-print-directory test
|
|
268
|
+
|
|
269
|
+
# The .ok target is the test's stamp; mtime tracking gives per-test
|
|
270
|
+
# caching for free. Order-only spinel_parse$(EXE) / spinel_codegen$(EXE)
|
|
271
|
+
# stop a bootstrap relink from invalidating every test.
|
|
272
|
+
build/test-results/%.ok: test/%.rb $(SP_RT_LIB) $(CODEGEN_STAMP) $(PARSE_STAMP) | spinel_parse$(EXE) spinel_codegen$(EXE)
|
|
273
|
+
@mkdir -p build/test-results
|
|
274
|
+
@tmpdir=$$(mktemp -d /tmp/spinel-test.XXXXXX); \
|
|
275
|
+
ast=$$tmpdir/test.ast; \
|
|
276
|
+
cfile=$$tmpdir/test.c; \
|
|
277
|
+
bin=$$tmpdir/test_bin$(EXE); \
|
|
278
|
+
exp=$$tmpdir/expected; \
|
|
279
|
+
act=$$tmpdir/actual; \
|
|
280
|
+
rm -f "$@.diff"; \
|
|
281
|
+
./spinel_parse$(EXE) "$<" "$$ast" 2>/dev/null && \
|
|
282
|
+
./spinel_codegen$(EXE) "$$ast" "$$cfile" 2>/dev/null && \
|
|
283
|
+
$(CC) $(CFLAGS) -Werror $(SEC_FLAGS) -Ilib -c "$$cfile" -o "$$cfile.o" 2>/dev/null && \
|
|
284
|
+
$(CC) $(CFLAGS) "$$cfile.o" $(SP_RT_LIB) $(LDFLAGS) -lm $(GC_FLAGS) -o "$$bin" 2>/dev/null; \
|
|
285
|
+
if [ $$? -eq 0 ]; then \
|
|
286
|
+
if [ -f "$<.expected" ]; then \
|
|
287
|
+
LC_ALL=C sed 's/\r$$//' "$<.expected" >"$$exp.n"; \
|
|
288
|
+
else \
|
|
289
|
+
$(TIMEOUT10) $(REF_RUBY) "$<" >"$$exp" 2>/dev/null; \
|
|
290
|
+
ruby_rc=$$?; \
|
|
291
|
+
if [ $$ruby_rc -ne 0 ] && [ "$(REF_RUBY)" != "ruby" ]; then \
|
|
292
|
+
$(TIMEOUT10) ruby "$<" >"$$exp" 2>/dev/null; \
|
|
293
|
+
fi; \
|
|
294
|
+
LC_ALL=C sed 's/\r$$//' "$$exp" >"$$exp.n"; \
|
|
295
|
+
fi; \
|
|
296
|
+
$(TIMEOUT10) "$$bin" >"$$act" 2>/dev/null; \
|
|
297
|
+
LC_ALL=C sed 's/\r$$//' "$$act" >"$$act.n"; \
|
|
298
|
+
if cmp -s "$$exp.n" "$$act.n"; then \
|
|
299
|
+
echo PASS > "$@"; \
|
|
300
|
+
if [ -t 1 ]; then printf .; fi; \
|
|
301
|
+
else \
|
|
302
|
+
echo FAIL > "$@"; \
|
|
303
|
+
diff -u "$$exp.n" "$$act.n" > "$@.diff" 2>&1 || true; \
|
|
304
|
+
if [ -t 1 ]; then printf F; fi; \
|
|
305
|
+
fi; \
|
|
306
|
+
else \
|
|
307
|
+
echo ERR > "$@"; \
|
|
308
|
+
if [ -t 1 ]; then printf E; fi; \
|
|
309
|
+
fi; \
|
|
310
|
+
rm -rf "$$tmpdir"
|
|
311
|
+
|
|
312
|
+
clean-test-results:
|
|
313
|
+
@rm -rf build/test-results
|
|
314
|
+
|
|
315
|
+
# ---- Expected-output regeneration ----
|
|
316
|
+
# Capture each test's reference Ruby output into test/<name>.rb.expected.
|
|
317
|
+
# Once committed, the test target uses the .expected file directly and
|
|
318
|
+
# skips the per-test ruby invocation — useful in CI where ruby's startup
|
|
319
|
+
# (especially mingw64 ruby on Windows) adds up across hundreds of tests.
|
|
320
|
+
# Regenerate after adding or modifying tests; commit the result.
|
|
321
|
+
|
|
322
|
+
EXPECTED_FILES := $(patsubst test/%.rb,test/%.rb.expected,$(TESTS))
|
|
323
|
+
|
|
324
|
+
regen-expected: $(EXPECTED_FILES)
|
|
325
|
+
|
|
326
|
+
test/%.rb.expected: test/%.rb
|
|
327
|
+
@$(TIMEOUT10) $(REF_RUBY) $< >$@.tmp 2>/dev/null; \
|
|
328
|
+
rc=$$?; \
|
|
329
|
+
if [ $$rc -ne 0 ] && [ "$(REF_RUBY)" != "ruby" ]; then \
|
|
330
|
+
$(TIMEOUT10) ruby $< >$@.tmp 2>/dev/null; \
|
|
331
|
+
fi; \
|
|
332
|
+
LC_ALL=C sed 's/\r$$//' $@.tmp > $@; \
|
|
333
|
+
rm -f $@.tmp
|
|
334
|
+
|
|
335
|
+
bench: spinel_parse$(EXE) $(SP_RT_LIB) spinel_codegen$(EXE)
|
|
336
|
+
@if [ -z "$(TIMEOUT_BIN)" ]; then echo "Note: no 'timeout' command found; running without time limits."; fi
|
|
337
|
+
@total=$$(ls benchmark/*.rb | wc -l); \
|
|
338
|
+
if [ -t 1 ]; then tty=1; else tty=0; fi; \
|
|
339
|
+
pass=0; fail=0; err=0; skip=0; i=0; \
|
|
340
|
+
for f in benchmark/*.rb; do \
|
|
341
|
+
i=$$((i+1)); \
|
|
342
|
+
bn=$$(basename "$$f" .rb); \
|
|
343
|
+
if [ "$$tty" = 1 ]; then printf '\r\033[K [%d/%d] %s' "$$i" "$$total" "$$bn"; fi; \
|
|
344
|
+
$(TIMEOUT10) ./spinel_parse$(EXE) "$$f" /tmp/_sp_b.ast 2>/dev/null && \
|
|
345
|
+
$(TIMEOUT10) ./spinel_codegen$(EXE) /tmp/_sp_b.ast /tmp/_sp_b.c 2>/dev/null && \
|
|
346
|
+
$(CC) $(CFLAGS) -Werror $(SEC_FLAGS) -Ilib -c /tmp/_sp_b.c -o /tmp/_sp_b.c.o 2>/dev/null && \
|
|
347
|
+
$(CC) $(CFLAGS) /tmp/_sp_b.c.o $(SP_RT_LIB) $(LDFLAGS) -lm $(GC_FLAGS) -o /tmp/_sp_b_bin$(EXE) 2>/dev/null; \
|
|
348
|
+
if [ $$? -eq 0 ]; then \
|
|
349
|
+
$(TIMEOUT60) $(REF_RUBY) "$$f" >/tmp/_sp_b_exp 2>/dev/null; \
|
|
350
|
+
ruby_rc=$$?; \
|
|
351
|
+
if [ $$ruby_rc -ne 0 ] && [ "$(REF_RUBY)" != "ruby" ]; then \
|
|
352
|
+
$(TIMEOUT60) ruby "$$f" >/tmp/_sp_b_exp 2>/dev/null; \
|
|
353
|
+
ruby_rc=$$?; \
|
|
354
|
+
fi; \
|
|
355
|
+
if [ $$ruby_rc -eq 124 ]; then \
|
|
356
|
+
if [ "$$tty" = 1 ]; then printf '\r\033[K'; fi; \
|
|
357
|
+
echo "SKIP: $$bn (ruby timeout)"; skip=$$((skip+1)); \
|
|
358
|
+
else \
|
|
359
|
+
$(TIMEOUT60) /tmp/_sp_b_bin$(EXE) >/tmp/_sp_b_act 2>/dev/null; \
|
|
360
|
+
LC_ALL=C sed 's/\r$$//' /tmp/_sp_b_exp >/tmp/_sp_b_exp.n; \
|
|
361
|
+
LC_ALL=C sed 's/\r$$//' /tmp/_sp_b_act >/tmp/_sp_b_act.n; \
|
|
362
|
+
if cmp -s /tmp/_sp_b_exp.n /tmp/_sp_b_act.n; then \
|
|
363
|
+
pass=$$((pass+1)); \
|
|
364
|
+
else \
|
|
365
|
+
if [ "$$tty" = 1 ]; then printf '\r\033[K'; fi; \
|
|
366
|
+
echo "FAIL: $$bn"; \
|
|
367
|
+
diff -u /tmp/_sp_b_exp.n /tmp/_sp_b_act.n 2>&1 | head -40; \
|
|
368
|
+
fail=$$((fail+1)); \
|
|
369
|
+
fi; \
|
|
370
|
+
fi; \
|
|
371
|
+
else \
|
|
372
|
+
if [ "$$tty" = 1 ]; then printf '\r\033[K'; fi; \
|
|
373
|
+
echo "ERR: $$bn"; err=$$((err+1)); \
|
|
374
|
+
fi; \
|
|
375
|
+
done; \
|
|
376
|
+
if [ "$$tty" = 1 ]; then printf '\r\033[K'; fi; \
|
|
377
|
+
rm -f /tmp/_sp_b.ast /tmp/_sp_b.c /tmp/_sp_b.c.o /tmp/_sp_b_bin$(EXE) /tmp/_sp_b_exp /tmp/_sp_b_act /tmp/_sp_b_exp.n /tmp/_sp_b_act.n; \
|
|
378
|
+
echo "Benchmarks: $$pass pass, $$fail fail, $$err error, $$skip skip"; \
|
|
379
|
+
if [ $$fail -ne 0 ] || [ $$err -ne 0 ]; then exit 1; fi
|
|
380
|
+
|
|
381
|
+
# ---- Install ----
|
|
382
|
+
|
|
383
|
+
PREFIX ?= /usr/local
|
|
384
|
+
SPNLDIR = $(PREFIX)/lib/spinel
|
|
385
|
+
|
|
386
|
+
install: all
|
|
387
|
+
install -d $(SPNLDIR)/lib
|
|
388
|
+
install -m 755 spinel $(SPNLDIR)/
|
|
389
|
+
install -m 755 spinel_parse$(EXE) $(SPNLDIR)/
|
|
390
|
+
install -m 755 spinel_codegen$(EXE) $(SPNLDIR)/
|
|
391
|
+
install -m 644 spinel_codegen.rb $(SPNLDIR)/
|
|
392
|
+
install -m 644 lib/libspinel_rt.a $(SPNLDIR)/lib/
|
|
393
|
+
install -m 644 lib/sp_runtime.h $(SPNLDIR)/lib/
|
|
394
|
+
install -m 644 lib/*.rb $(SPNLDIR)/lib/
|
|
395
|
+
install -d $(PREFIX)/bin
|
|
396
|
+
ln -sf $(SPNLDIR)/spinel $(PREFIX)/bin/spinel
|
|
397
|
+
|
|
398
|
+
uninstall:
|
|
399
|
+
rm -f $(PREFIX)/bin/spinel
|
|
400
|
+
rm -rf $(SPNLDIR)
|
|
401
|
+
|
|
402
|
+
# ---- Clean ----
|
|
403
|
+
|
|
404
|
+
clean:
|
|
405
|
+
rm -rf build/
|
|
406
|
+
rm -f spinel_parse$(EXE) spinel_codegen$(EXE)
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
# Stage 2 設計案: poly-as-set 型表現
|
|
2
|
+
|
|
3
|
+
Stage 1 (`narrow_param_types_from_body_method_calls`、commit `0d10645`) の制約「呼ばれる全メソッドが**ただ1つ**のクラスにしかない」を外すための、内部型表現の拡張案。記録目的。実装は未着手。
|
|
4
|
+
|
|
5
|
+
## 動機
|
|
6
|
+
|
|
7
|
+
現状の "poly" は不透明な単一トークン。次の精度向上が手に入っていない:
|
|
8
|
+
|
|
9
|
+
1. **set-intersection narrowing** — 候補集合を観測ごとに intersect して絞る
|
|
10
|
+
```ruby
|
|
11
|
+
def render(model)
|
|
12
|
+
model.title # Article のみ → {Article}
|
|
13
|
+
model.body # Article + Comment → {Article, Comment}
|
|
14
|
+
# 交差 = {Article} → narrow できるはず
|
|
15
|
+
end
|
|
16
|
+
```
|
|
17
|
+
Stage 1 では `model.body` の信号がぼやけて捨てられる。
|
|
18
|
+
|
|
19
|
+
2. **else-arm 負の絞り込み** — `if x.is_a?(A); ... ; else; # x:NOT(A) ; end`
|
|
20
|
+
現在 scan_new_calls の comment にも明示:
|
|
21
|
+
> The else-arm walks unchanged (we don't currently model "type minus C")
|
|
22
|
+
|
|
23
|
+
3. **emit サイズ削減** — `compile_poly_method_call` の per-class arm が `@cls_names` を全列挙。候補集合に絞れば未到達 arm を消せる。
|
|
24
|
+
|
|
25
|
+
## 内部表現
|
|
26
|
+
|
|
27
|
+
### 文字列エンコード案
|
|
28
|
+
|
|
29
|
+
`"poly"` → `"poly{<sorted-class-name-list>}"` (集合を文字列でエンコード):
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
"poly" → 既存の "全クラス" 意味、互換維持のため keep
|
|
33
|
+
"poly{Article}" → 単一クラス、`obj_Article` と等価扱いで折り畳み可能
|
|
34
|
+
"poly{Article;Comment}" → 二項
|
|
35
|
+
"poly{Article;Comment;HWIA}" → 三項
|
|
36
|
+
"poly{Article;Comment;HWIA}?" → nullable版 (既存の `?` サフィックス慣習継承)
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
セパレータは `;` (既存の `@cls_meth_params` のクラス区切り `|` や param 区切り `,` と衝突しない、`@cls_meth_names` の method 区切りと一致)。
|
|
40
|
+
|
|
41
|
+
### 正規化ルール
|
|
42
|
+
|
|
43
|
+
- ソートして決定的なエンコードに (`{B;A}` ではなく `{A;B}`)
|
|
44
|
+
- 重複除去
|
|
45
|
+
- サイズ 1 → `obj_<C>` に折り畳み (representation lift; 集合表現を消す)
|
|
46
|
+
- 全クラスを含む → `"poly"` に折り畳み (degenerate case)
|
|
47
|
+
|
|
48
|
+
### 影響を受ける関数 (主要)
|
|
49
|
+
|
|
50
|
+
| 関数 | 既存ロジック | 必要な拡張 |
|
|
51
|
+
|------|-------------|------------|
|
|
52
|
+
| `base_type` | `"obj_C?"` → `"obj_C"` | `"poly{A;B}?"` → `"poly{A;B}"` |
|
|
53
|
+
| `is_obj_type` | `"obj_"` プレフィックス判定 | (poly-set は obj_ ではない、独立) |
|
|
54
|
+
| `is_value_type_obj` | obj_C の class lookup | poly-set は value-type 不可 (各候補は struct 化 NG) |
|
|
55
|
+
| `c_type` | `"poly"` → `"sp_RbVal"` | `"poly{...}"` も同じく `"sp_RbVal"` |
|
|
56
|
+
| `c_default_val` | `"poly"` → `"sp_box_nil()"` | 同 |
|
|
57
|
+
| `unify_call_types` | 二項 unify | set union (詳細下記) |
|
|
58
|
+
| `box_value_to_poly` | obj_C / 各種 → sp_box_* | set 経由は対象外、各 candidate ごとに caller 側で box済を期待 |
|
|
59
|
+
|
|
60
|
+
### unify_call_types の拡張
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
unify("poly{A;B}", "obj_A") = "poly{A;B}" (subset → 包含)
|
|
64
|
+
unify("poly{A;B}", "obj_C") = "poly{A;B;C}" (union)
|
|
65
|
+
unify("poly{A;B}", "poly{B;C}") = "poly{A;B;C}" (union)
|
|
66
|
+
unify("poly{A;B}", "poly{A;B}") = "poly{A;B}" (idempotent)
|
|
67
|
+
unify("poly{A;B}", "int") = "poly" (混合型は既存 poly に degrade)
|
|
68
|
+
unify("obj_A", "obj_B") = "poly{A;B}" (新ロジック; 現状は "poly")
|
|
69
|
+
unify("poly", any) = "poly" (degenerate keep)
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
ポイント: **混合型 (obj+primitive) は既存の不透明 `"poly"` に落とす**。これにより既存コードの `"poly"` 判定 (受け取り側のすべての場所) と互換が取れる。`"poly{...}"` は **すべて user obj** な集合に限定。
|
|
73
|
+
|
|
74
|
+
### intersection 演算 (Stage 1 を一般化)
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
intersect("poly{A;B;C}", "poly{B;C;D}") = "poly{B;C}"
|
|
78
|
+
intersect("poly{A;B}", "poly{C;D}") = "" (空 → 信号矛盾)
|
|
79
|
+
intersect("poly{A}", "obj_A") = "obj_A"
|
|
80
|
+
intersect("poly{A;B}", "obj_C") = "" (空)
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Stage 1 の `unify_param_class_from_observations` を集合演算で書き直す:
|
|
84
|
+
- 各観測 `param.<m>` で「`<m>` を定義する user class 集合 S(m)」を計算
|
|
85
|
+
- 各観測の S(m) で intersection を取る
|
|
86
|
+
- `is_primitive_shared_method(m)` は S に「全クラス + builtins」を意味するので intersection 中立 (skip)
|
|
87
|
+
- 最終 intersection が空でなければ narrow
|
|
88
|
+
|
|
89
|
+
### type minus 演算 (else-arm)
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
type_minus("poly{A;B;C}", "obj_A") = "poly{B;C}"
|
|
93
|
+
type_minus("poly{A;B}", "obj_A") = "obj_B" (size 1 折り畳み)
|
|
94
|
+
type_minus("poly{A}", "obj_A") = "" (空; unreachable)
|
|
95
|
+
type_minus("poly", "obj_A") = "poly" (不透明は触らない)
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
scan_new_calls の IfNode 処理に else-arm narrow を追加:
|
|
99
|
+
```ruby
|
|
100
|
+
# then-arm
|
|
101
|
+
if narrow_var != ""
|
|
102
|
+
push_type_narrow(narrow_var, narrow_t) # 既存
|
|
103
|
+
end
|
|
104
|
+
walk(then_body)
|
|
105
|
+
pop
|
|
106
|
+
|
|
107
|
+
# else-arm (新規)
|
|
108
|
+
else_narrow_t = type_minus(原型, narrow_t)
|
|
109
|
+
if else_narrow_t != ""
|
|
110
|
+
push_type_narrow(narrow_var, else_narrow_t)
|
|
111
|
+
end
|
|
112
|
+
walk(else_body)
|
|
113
|
+
pop
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## emit-side 変更
|
|
117
|
+
|
|
118
|
+
### compile_poly_method_call
|
|
119
|
+
|
|
120
|
+
```ruby
|
|
121
|
+
# 現状:
|
|
122
|
+
i = 0
|
|
123
|
+
while i < @cls_names.length
|
|
124
|
+
midx = cls_find_method_direct(i, mname)
|
|
125
|
+
if midx >= 0
|
|
126
|
+
# arm 出力
|
|
127
|
+
end
|
|
128
|
+
i += 1
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
# Stage 2:
|
|
132
|
+
candidates = poly_candidates(recv_type) # "poly{A;B}" → ["A", "B"]
|
|
133
|
+
# 候補が空 (= 不透明 "poly") なら現状通り全列挙
|
|
134
|
+
# 候補があれば限定列挙
|
|
135
|
+
candidates.each { |cn|
|
|
136
|
+
ci = find_class_idx(cn)
|
|
137
|
+
midx = cls_find_method_direct(ci, mname)
|
|
138
|
+
if midx >= 0
|
|
139
|
+
# arm 出力
|
|
140
|
+
end
|
|
141
|
+
}
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
emit 量削減: Roundhouse 規模 (~20 user class、平均候補3クラス) で arm 17 個 ÷ poly call sites 50-100 個 ≈ 1000-2000 行の C 削減 (runtime 動作に影響なし、cc 時間 + emit サイズのみ)。
|
|
145
|
+
|
|
146
|
+
### sp_RbVal タグの動作変化なし
|
|
147
|
+
|
|
148
|
+
ランタイムの sp_RbVal/cls_id 機構は変更不要。集合は **静的判定** だけの情報。runtime は cls_id で正しく分岐。
|
|
149
|
+
|
|
150
|
+
## 不動点の収束
|
|
151
|
+
|
|
152
|
+
Stage 2 では union (拡大) と intersection (縮小) の両方を扱う:
|
|
153
|
+
|
|
154
|
+
- caller→callee widening (scan_new_calls): union で拡大
|
|
155
|
+
- callee→caller (戻り値伝播): union で拡大
|
|
156
|
+
- body-side narrow (Stage 1 拡張): intersection で縮小
|
|
157
|
+
|
|
158
|
+
各 round 内の順序を:
|
|
159
|
+
1. union 系 (call-site 観測) を全部走らせて param ptype を膨らませる
|
|
160
|
+
2. その後で intersection 系 (body 観測) を走らせて絞る
|
|
161
|
+
|
|
162
|
+
→ "拡大→縮小" の順序が各 round で一定なら、実質単調に近づく。`inference_signature` で前回と等しくなったら stop。最大 round 数を上げる必要があるかもしれない (現状 4 → 6〜8 程度に)。
|
|
163
|
+
|
|
164
|
+
## 互換性 / 移行ステップ
|
|
165
|
+
|
|
166
|
+
Stage 2 を 1 PR で全部入れるのは bootstrap risk が高い。段階移行:
|
|
167
|
+
|
|
168
|
+
### 2a. 表現拡張 (no-op)
|
|
169
|
+
- `"poly{A;B}"` 文字列を内部で生成する経路を入れるが、すべて `"poly"` に折り畳んで返す
|
|
170
|
+
- `unify_call_types` などはまだ既存挙動
|
|
171
|
+
- すべての判定箇所が新表現を view できることを bootstrap で確認
|
|
172
|
+
|
|
173
|
+
### 2b. set-intersection narrow
|
|
174
|
+
- Stage 1 の単一クラス制約を外す
|
|
175
|
+
- `unify_param_class_from_observations` を set intersection で書き直す
|
|
176
|
+
- 既存の `"poly"` への混合型 degrade はそのまま
|
|
177
|
+
|
|
178
|
+
### 2c. else-arm 負の絞り込み
|
|
179
|
+
- IfNode の else-arm に type_minus 適用
|
|
180
|
+
- recursive scan のスコープ管理を慎重に (then と else で違う narrow)
|
|
181
|
+
|
|
182
|
+
### 2d. emit-side 列挙の限定
|
|
183
|
+
- `compile_poly_method_call` で候補集合があればそれを使う
|
|
184
|
+
- emit 出力差を 1 PR で分離 (review しやすさのため)
|
|
185
|
+
|
|
186
|
+
## リスクと観察ポイント
|
|
187
|
+
|
|
188
|
+
1. **bootstrap stability**: 型文字列処理の 1 箇所のミスで gen2 != gen3 → CI 全敗
|
|
189
|
+
- 各サブステップ後 `make bootstrap` 必須
|
|
190
|
+
- 表現変更前に既存 split/join ロジックの全数 grep し、新セパレータ衝突の有無を確認
|
|
191
|
+
|
|
192
|
+
2. **テスト盲点**:
|
|
193
|
+
- 集合サイズ 0 (空 = unreachable) のハンドリング
|
|
194
|
+
- サイズ 1 → obj_<C> 折り畳みの一貫性
|
|
195
|
+
- 全クラス集合と "poly" の等価扱い
|
|
196
|
+
|
|
197
|
+
3. **ROI 計測**:
|
|
198
|
+
- Stage 2a 完了時点で既存テスト + Roundhouse archive で no-op 確認
|
|
199
|
+
- Stage 2b 後、stage 1 で narrow できなかった param が集合 narrow できる事例を 1 つ以上見つける (見つからないなら投資中止判断材料)
|
|
200
|
+
- Stage 2c, 2d は 2b の効果を見て継続判断
|
|
201
|
+
|
|
202
|
+
## 着手判断条件
|
|
203
|
+
|
|
204
|
+
Stage 2 に踏み込むべきタイミング:
|
|
205
|
+
|
|
206
|
+
- `caller-side widening が届かない経路` 起源でない、**型精度**起源のバグが具体例で現れた時
|
|
207
|
+
- Roundhouse 移行が runtime 段階に入って "static dispatch ミス" が顕在化した時
|
|
208
|
+
- emit サイズ・cc 時間のボトルネックが計測で示された時 (現状は CI 11分問題は sccache miss 由来で、emit サイズではない)
|
|
209
|
+
|
|
210
|
+
それまでは Stage 1 で観察を継続。
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
参考:
|
|
215
|
+
- Stage 1: `narrow_param_types_from_body_method_calls` (`0d10645`)
|
|
216
|
+
- 関連コメント: `spinel_codegen.rb` の `scan_new_calls` IfNode 処理 ("we don't currently model 'type minus C'")
|
|
217
|
+
- 既存集合的ロジックの先例: `module_acc_resolved` のセミコロン区切りクラス候補リスト (#126)
|