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