summaryrefslogtreecommitdiff
path: root/lib/wsdl/xmlSchema/enumeration.rb
diff options
context:
space:
mode:
authorshyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-03-09 11:59:36 +0000
committershyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-03-09 11:59:36 +0000
commitfaace3e65cf801079e2fb5a6e524af16584cd8a5 (patch)
tree470adaf10f9a567c6da5180a60d17fbeb41ae46f /lib/wsdl/xmlSchema/enumeration.rb
parent46496ac9233eea196fa72ba305283570fe0f26f8 (diff)
add tag v1_8_7_150v1_8_7_150
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/tags/v1_8_7_150@22858 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/wsdl/xmlSchema/enumeration.rb')
0 files changed, 0 insertions, 0 deletions
e='width: 0.2%;'/> -rw-r--r--COPYING14
-rw-r--r--ChangeLog12187
-rw-r--r--LEGAL775
-rw-r--r--Makefile.in343
-rw-r--r--NEWS854
-rw-r--r--README.ja.md32
-rw-r--r--README.md76
-rw-r--r--aclocal.m484
-rw-r--r--addr2line.c1877
-rw-r--r--addr2line.h2
-rw-r--r--appveyor.yml145
-rw-r--r--array.c1958
-rw-r--r--ast.c760
-rwxr-xr-xbasictest/runner.rb33
-rwxr-xr-xbasictest/test.rb2367
-rw-r--r--benchmark/README.md72
-rw-r--r--benchmark/app_erb.yml23
-rw-r--r--benchmark/app_pentomino.rb130
-rw-r--r--benchmark/array_sample_100k_10.rb2
-rw-r--r--benchmark/array_sample_100k_11.rb2
-rw-r--r--benchmark/array_sample_100k__100.rb2
-rw-r--r--benchmark/array_sample_100k__1k.rb2
-rw-r--r--benchmark/array_sample_100k__6k.rb2
-rw-r--r--benchmark/array_sample_100k___10k.rb2
-rw-r--r--benchmark/array_sample_100k___50k.rb2
-rw-r--r--benchmark/array_small_and.rb17
-rw-r--r--benchmark/array_small_diff.rb17
-rw-r--r--benchmark/array_small_or.rb17
-rw-r--r--benchmark/array_sort_block.rb2
-rw-r--r--benchmark/array_sort_float.rb2
-rw-r--r--benchmark/array_values_at_int.rb2
-rw-r--r--benchmark/array_values_at_range.rb2
-rw-r--r--benchmark/bighash.rb1
-rw-r--r--benchmark/bm_app_answer.rb (renamed from benchmark/app_answer.rb)0
-rw-r--r--benchmark/bm_app_aobench.rb (renamed from benchmark/app_aobench.rb)0
-rw-r--r--benchmark/bm_app_erb.rb26
-rw-r--r--benchmark/bm_app_factorial.rb (renamed from benchmark/app_factorial.rb)0
-rw-r--r--benchmark/bm_app_fib.rb (renamed from benchmark/app_fib.rb)0
-rw-r--r--benchmark/bm_app_lc_fizzbuzz.rb (renamed from benchmark/app_lc_fizzbuzz.rb)0
-rw-r--r--benchmark/bm_app_mandelbrot.rb (renamed from benchmark/app_mandelbrot.rb)0
-rw-r--r--benchmark/bm_app_pentomino.rb259
-rw-r--r--benchmark/bm_app_raise.rb (renamed from benchmark/app_raise.rb)0
-rw-r--r--benchmark/bm_app_strconcat.rb (renamed from benchmark/app_strconcat.rb)0
-rw-r--r--benchmark/bm_app_tak.rb (renamed from benchmark/app_tak.rb)0
-rw-r--r--benchmark/bm_app_tarai.rb (renamed from benchmark/app_tarai.rb)0
-rw-r--r--benchmark/bm_app_uri.rb (renamed from benchmark/app_uri.rb)0
-rw-r--r--benchmark/bm_array_shift.rb (renamed from benchmark/array_shift.rb)0
-rw-r--r--benchmark/bm_hash_aref_dsym.rb (renamed from benchmark/hash_aref_dsym.rb)0
-rw-r--r--benchmark/bm_hash_aref_dsym_long.rb (renamed from benchmark/hash_aref_dsym_long.rb)0
-rw-r--r--benchmark/bm_hash_aref_fix.rb (renamed from benchmark/hash_aref_fix.rb)0
-rw-r--r--benchmark/bm_hash_aref_flo.rb (renamed from benchmark/hash_aref_flo.rb)0
-rw-r--r--benchmark/bm_hash_aref_miss.rb (renamed from benchmark/hash_aref_miss.rb)0
-rw-r--r--benchmark/bm_hash_aref_str.rb (renamed from benchmark/hash_aref_str.rb)0
-rw-r--r--benchmark/bm_hash_aref_sym.rb (renamed from benchmark/hash_aref_sym.rb)0
-rw-r--r--benchmark/bm_hash_aref_sym_long.rb (renamed from benchmark/hash_aref_sym_long.rb)0
-rw-r--r--benchmark/bm_hash_flatten.rb (renamed from benchmark/hash_flatten.rb)0
-rw-r--r--benchmark/bm_hash_ident_flo.rb (renamed from benchmark/hash_ident_flo.rb)0
-rw-r--r--benchmark/bm_hash_ident_num.rb (renamed from benchmark/hash_ident_num.rb)0
-rw-r--r--benchmark/bm_hash_ident_obj.rb (renamed from benchmark/hash_ident_obj.rb)0
-rw-r--r--benchmark/bm_hash_ident_str.rb (renamed from benchmark/hash_ident_str.rb)0
-rw-r--r--benchmark/bm_hash_ident_sym.rb (renamed from benchmark/hash_ident_sym.rb)0
-rw-r--r--benchmark/bm_hash_keys.rb (renamed from benchmark/hash_keys.rb)0
-rw-r--r--benchmark/bm_hash_shift.rb (renamed from benchmark/hash_shift.rb)0
-rw-r--r--benchmark/bm_hash_shift_u16.rb (renamed from benchmark/hash_shift_u16.rb)0
-rw-r--r--benchmark/bm_hash_shift_u24.rb (renamed from benchmark/hash_shift_u24.rb)0
-rw-r--r--benchmark/bm_hash_shift_u32.rb (renamed from benchmark/hash_shift_u32.rb)0
-rw-r--r--benchmark/bm_hash_to_proc.rb (renamed from benchmark/hash_to_proc.rb)0
-rw-r--r--benchmark/bm_hash_values.rb (renamed from benchmark/hash_values.rb)0
-rw-r--r--benchmark/bm_io_file_create.rb (renamed from benchmark/io_file_create.rb)0
-rw-r--r--benchmark/bm_io_file_read.rb (renamed from benchmark/io_file_read.rb)0
-rw-r--r--benchmark/bm_io_file_write.rb (renamed from benchmark/io_file_write.rb)0
-rw-r--r--benchmark/bm_io_nonblock_noex.rb (renamed from benchmark/io_nonblock_noex.rb)0
-rw-r--r--benchmark/bm_io_nonblock_noex2.rb (renamed from benchmark/io_nonblock_noex2.rb)0
-rw-r--r--benchmark/bm_io_select.rb (renamed from benchmark/io_select.rb)0
-rw-r--r--benchmark/bm_io_select2.rb (renamed from benchmark/io_select2.rb)0
-rw-r--r--benchmark/bm_io_select3.rb (renamed from benchmark/io_select3.rb)0
-rw-r--r--benchmark/bm_loop_for.rb (renamed from benchmark/loop_for.rb)0
-rw-r--r--benchmark/bm_loop_generator.rb (renamed from benchmark/loop_generator.rb)0
-rw-r--r--benchmark/bm_loop_times.rb (renamed from benchmark/loop_times.rb)0
-rw-r--r--benchmark/bm_loop_whileloop.rb (renamed from benchmark/loop_whileloop.rb)0
-rw-r--r--benchmark/bm_loop_whileloop2.rb (renamed from benchmark/loop_whileloop2.rb)0
-rw-r--r--benchmark/bm_marshal_dump_flo.rb (renamed from benchmark/marshal_dump_flo.rb)0
-rw-r--r--benchmark/bm_marshal_dump_load_geniv.rb (renamed from benchmark/marshal_dump_load_geniv.rb)0
-rw-r--r--benchmark/bm_marshal_dump_load_time.rb (renamed from benchmark/marshal_dump_load_time.rb)0
-rw-r--r--benchmark/bm_require.rb7
-rw-r--r--benchmark/bm_require_thread.rb15
-rw-r--r--benchmark/bm_securerandom.rb (renamed from benchmark/securerandom.rb)0
-rw-r--r--benchmark/bm_so_ackermann.rb (renamed from benchmark/so_ackermann.rb)0
-rw-r--r--benchmark/bm_so_array.rb (renamed from benchmark/so_array.rb)0
-rw-r--r--benchmark/bm_so_binary_trees.rb (renamed from benchmark/so_binary_trees.rb)0
-rw-r--r--benchmark/bm_so_concatenate.rb (renamed from benchmark/so_concatenate.rb)0
-rw-r--r--benchmark/bm_so_count_words.rb19
-rw-r--r--benchmark/bm_so_exception.rb (renamed from benchmark/so_exception.rb)0
-rw-r--r--benchmark/bm_so_fannkuch.rb (renamed from benchmark/so_fannkuch.rb)0
-rw-r--r--benchmark/bm_so_fasta.rb81
-rw-r--r--benchmark/bm_so_k_nucleotide.rb48
-rw-r--r--benchmark/bm_so_lists.rb (renamed from benchmark/so_lists.rb)0
-rw-r--r--benchmark/bm_so_mandelbrot.rb (renamed from benchmark/so_mandelbrot.rb)0
-rw-r--r--benchmark/bm_so_matrix.rb (renamed from benchmark/so_matrix.rb)0
-rw-r--r--benchmark/bm_so_meteor_contest.rb564
-rw-r--r--benchmark/bm_so_nbody.rb (renamed from benchmark/so_nbody.rb)0
-rw-r--r--benchmark/bm_so_nested_loop.rb (renamed from benchmark/so_nested_loop.rb)0
-rw-r--r--benchmark/bm_so_nsieve.rb (renamed from benchmark/so_nsieve.rb)0
-rw-r--r--benchmark/bm_so_nsieve_bits.rb (renamed from benchmark/so_nsieve_bits.rb)0
-rw-r--r--benchmark/bm_so_object.rb (renamed from benchmark/so_object.rb)0
-rw-r--r--benchmark/bm_so_partial_sums.rb (renamed from benchmark/so_partial_sums.rb)0
-rw-r--r--benchmark/bm_so_pidigits.rb92
-rw-r--r--benchmark/bm_so_random.rb (renamed from benchmark/so_random.rb)0
-rw-r--r--benchmark/bm_so_reverse_complement.rb30
-rw-r--r--benchmark/bm_so_sieve.rb (renamed from benchmark/so_sieve.rb)0
-rw-r--r--benchmark/bm_so_spectralnorm.rb (renamed from benchmark/so_spectralnorm.rb)0
-rw-r--r--benchmark/bm_vm1_attr_ivar.rb14
-rw-r--r--benchmark/bm_vm1_attr_ivar_set.rb14
-rw-r--r--benchmark/bm_vm1_block.rb10
-rw-r--r--benchmark/bm_vm1_const.rb8
-rw-r--r--benchmark/bm_vm1_ensure.rb11
-rw-r--r--benchmark/bm_vm1_float_simple.rb7
-rw-r--r--benchmark/bm_vm1_gc_short_lived.rb10
-rw-r--r--benchmark/bm_vm1_gc_short_with_complex_long.rb27
-rw-r--r--benchmark/bm_vm1_gc_short_with_long.rb13
-rw-r--r--benchmark/bm_vm1_gc_short_with_symbol.rb15
-rw-r--r--benchmark/bm_vm1_gc_wb_ary.rb12
-rw-r--r--benchmark/bm_vm1_gc_wb_ary_promoted.rb14
-rw-r--r--benchmark/bm_vm1_gc_wb_obj.rb15
-rw-r--r--benchmark/bm_vm1_gc_wb_obj_promoted.rb17
-rw-r--r--benchmark/bm_vm1_ivar.rb8
-rw-r--r--benchmark/bm_vm1_ivar_set.rb6
-rw-r--r--benchmark/bm_vm1_length.rb9
-rw-r--r--benchmark/bm_vm1_lvar_init.rb18
-rw-r--r--benchmark/bm_vm1_lvar_set.rb5
-rw-r--r--benchmark/bm_vm1_neq.rb8
-rw-r--r--benchmark/bm_vm1_not.rb7
-rw-r--r--benchmark/bm_vm1_rescue.rb7
-rw-r--r--benchmark/bm_vm1_simplereturn.rb9
-rw-r--r--benchmark/bm_vm1_swap.rb8
-rw-r--r--benchmark/bm_vm1_yield.rb10
-rw-r--r--benchmark/bm_vm2_array.rb5
-rw-r--r--benchmark/bm_vm2_bigarray.rb106
-rw-r--r--benchmark/bm_vm2_bighash.rb5
-rw-r--r--benchmark/bm_vm2_case.rb14
-rw-r--r--benchmark/bm_vm2_case_lit.rb19
-rw-r--r--benchmark/bm_vm2_defined_method.rb9
-rw-r--r--benchmark/bm_vm2_dstr.rb6
-rw-r--r--benchmark/bm_vm2_eval.rb6
-rw-r--r--benchmark/bm_vm2_method.rb9
-rw-r--r--benchmark/bm_vm2_method_missing.rb12
-rw-r--r--benchmark/bm_vm2_method_with_block.rb9
-rw-r--r--benchmark/bm_vm2_mutex.rb9
-rw-r--r--benchmark/bm_vm2_newlambda.rb5
-rw-r--r--benchmark/bm_vm2_poly_method.rb20
-rw-r--r--benchmark/bm_vm2_poly_method_ov.rb20
-rw-r--r--benchmark/bm_vm2_proc.rb14
-rw-r--r--benchmark/bm_vm2_raise1.rb18
-rw-r--r--benchmark/bm_vm2_raise2.rb18
-rw-r--r--benchmark/bm_vm2_regexp.rb6
-rw-r--r--benchmark/bm_vm2_send.rb12
-rw-r--r--benchmark/bm_vm2_string_literal.rb5
-rw-r--r--benchmark/bm_vm2_struct_big_aref_hi.rb7
-rw-r--r--benchmark/bm_vm2_struct_big_aref_lo.rb7
-rw-r--r--benchmark/bm_vm2_struct_big_aset.rb7
-rw-r--r--benchmark/bm_vm2_struct_big_href_hi.rb7
-rw-r--r--benchmark/bm_vm2_struct_big_href_lo.rb7
-rw-r--r--benchmark/bm_vm2_struct_big_hset.rb7
-rw-r--r--benchmark/bm_vm2_struct_small_aref.rb7
-rw-r--r--benchmark/bm_vm2_struct_small_aset.rb7
-rw-r--r--benchmark/bm_vm2_struct_small_href.rb7
-rw-r--r--benchmark/bm_vm2_struct_small_hset.rb7
-rw-r--r--benchmark/bm_vm2_super.rb20
-rw-r--r--benchmark/bm_vm2_unif1.rb8
-rw-r--r--benchmark/bm_vm2_zsuper.rb20
-rw-r--r--benchmark/bm_vm3_backtrace.rb (renamed from benchmark/vm3_backtrace.rb)0
-rw-r--r--benchmark/bm_vm3_clearmethodcache.rb (renamed from benchmark/vm3_clearmethodcache.rb)0
-rw-r--r--benchmark/bm_vm3_gc.rb (renamed from benchmark/vm3_gc.rb)0
-rw-r--r--benchmark/bm_vm_symbol_block_pass.rb (renamed from benchmark/vm_symbol_block_pass.rb)0
-rw-r--r--benchmark/bm_vm_thread_alive_check1.rb (renamed from benchmark/vm_thread_alive_check1.rb)0
-rw-r--r--benchmark/bm_vm_thread_close.rb (renamed from benchmark/vm_thread_close.rb)0
-rw-r--r--benchmark/bm_vm_thread_create_join.rb (renamed from benchmark/vm_thread_create_join.rb)0
-rw-r--r--benchmark/bm_vm_thread_mutex1.rb21
-rw-r--r--benchmark/bm_vm_thread_mutex2.rb21
-rw-r--r--benchmark/bm_vm_thread_mutex3.rb20
-rw-r--r--benchmark/bm_vm_thread_pass.rb (renamed from benchmark/vm_thread_pass.rb)0
-rw-r--r--benchmark/bm_vm_thread_pass_flood.rb8
-rw-r--r--benchmark/bm_vm_thread_pipe.rb (renamed from benchmark/vm_thread_pipe.rb)0
-rw-r--r--benchmark/bm_vm_thread_queue.rb18
-rw-r--r--benchmark/dir_empty_p.rb5
-rw-r--r--benchmark/driver.rb400
-rw-r--r--benchmark/enum_lazy_grep_v_100.rb4
-rw-r--r--benchmark/enum_lazy_grep_v_20.rb4
-rw-r--r--benchmark/enum_lazy_grep_v_50.rb4
-rw-r--r--benchmark/enum_lazy_uniq_100.rb4
-rw-r--r--benchmark/enum_lazy_uniq_20.rb4
-rw-r--r--benchmark/enum_lazy_uniq_50.rb4
-rw-r--r--benchmark/erb_render.yml24
-rwxr-xr-xbenchmark/fiber_chain.rb40
-rw-r--r--benchmark/file_chmod.rb9
-rw-r--r--benchmark/file_rename.rb11
-rw-r--r--benchmark/gc/aobench.rb2
-rw-r--r--benchmark/gc/binary_trees.rb2
-rw-r--r--benchmark/gc/gcbench.rb3
-rw-r--r--benchmark/gc/pentomino.rb2
-rw-r--r--benchmark/hash_literal_small2.rb3
-rw-r--r--benchmark/hash_literal_small4.rb3
-rw-r--r--benchmark/hash_literal_small8.rb3
-rw-r--r--benchmark/hash_long.rb4
-rw-r--r--benchmark/hash_small2.rb1
-rw-r--r--benchmark/hash_small4.rb1
-rw-r--r--benchmark/hash_small8.rb1
-rw-r--r--benchmark/int_quo.rb1
-rw-r--r--benchmark/io_copy_stream_write.rb24
-rw-r--r--benchmark/io_copy_stream_write_socket.rb35
-rw-r--r--benchmark/io_pipe_rw.rb13
-rw-r--r--benchmark/lib/benchmark_driver/output/driver.rb36
-rw-r--r--benchmark/lib/benchmark_driver/runner/cstime.rb22
-rw-r--r--benchmark/lib/benchmark_driver/runner/cutime.rb22
-rw-r--r--benchmark/lib/benchmark_driver/runner/peak.rb151
-rw-r--r--benchmark/lib/benchmark_driver/runner/size.rb25
-rw-r--r--benchmark/lib/benchmark_driver/runner/stime.rb22
-rw-r--r--benchmark/lib/benchmark_driver/runner/total.rb137
-rw-r--r--benchmark/lib/benchmark_driver/runner/utime.rb22
-rwxr-xr-xbenchmark/lib/load.rb2
-rw-r--r--benchmark/make_fasta_output.rb19
-rw-r--r--benchmark/prepare_require.rb25
-rw-r--r--benchmark/prepare_require_thread.rb2
-rw-r--r--benchmark/prepare_so_count_words.rb15
-rw-r--r--benchmark/prepare_so_k_nucleotide.rb2
-rw-r--r--benchmark/prepare_so_reverse_complement.rb2
-rw-r--r--benchmark/report.rb79
-rw-r--r--benchmark/require.yml36
-rw-r--r--benchmark/require_thread.yml44
-rw-r--r--benchmark/run.rb127
-rw-r--r--benchmark/runc.rb27
-rw-r--r--benchmark/so_count_words.yml66
-rw-r--r--benchmark/so_fasta.rb81
-rw-r--r--benchmark/so_k_nucleotide.yml155
-rw-r--r--benchmark/so_meteor_contest.rb563
-rw-r--r--benchmark/so_pidigits.rb92
-rw-r--r--benchmark/so_reverse_complement.yml137
-rw-r--r--benchmark/string_index.rb3
-rw-r--r--benchmark/string_scan_re.rb2
-rw-r--r--benchmark/string_scan_str.rb2
-rw-r--r--benchmark/time_subsec.rb2
-rw-r--r--benchmark/vm1_attr_ivar.yml14
-rw-r--r--benchmark/vm1_attr_ivar_set.yml14
-rw-r--r--benchmark/vm1_block.yml9
-rw-r--r--benchmark/vm1_blockparam.yml7
-rw-r--r--benchmark/vm1_blockparam_call.yml8
-rw-r--r--benchmark/vm1_blockparam_pass.yml12
-rw-r--r--benchmark/vm1_blockparam_yield.yml8
-rw-r--r--benchmark/vm1_const.yml7
-rw-r--r--benchmark/vm1_ensure.yml14
-rw-r--r--benchmark/vm1_float_simple.yml8
-rw-r--r--benchmark/vm1_gc_short_lived.yml9
-rw-r--r--benchmark/vm1_gc_short_with_complex_long.yml25
-rw-r--r--benchmark/vm1_gc_short_with_long.yml13
-rw-r--r--benchmark/vm1_gc_short_with_symbol.yml13
-rw-r--r--benchmark/vm1_gc_wb_ary.yml12
-rw-r--r--benchmark/vm1_gc_wb_ary_promoted.yml15
-rw-r--r--benchmark/vm1_gc_wb_obj.yml15
-rw-r--r--benchmark/vm1_gc_wb_obj_promoted.yml17
-rw-r--r--benchmark/vm1_ivar.yml6
-rw-r--r--benchmark/vm1_ivar_set.yml5
-rw-r--r--benchmark/vm1_length.yml8
-rw-r--r--benchmark/vm1_lvar_init.yml21
-rw-r--r--benchmark/vm1_lvar_set.yml4
-rw-r--r--benchmark/vm1_neq.yml7
-rw-r--r--benchmark/vm1_not.yml6
-rw-r--r--benchmark/vm1_rescue.yml6
-rw-r--r--benchmark/vm1_simplereturn.yml7
-rw-r--r--benchmark/vm1_swap.yml7
-rw-r--r--benchmark/vm1_yield.yml13
-rw-r--r--benchmark/vm2_array.yml4
-rw-r--r--benchmark/vm2_bigarray.yml105
-rw-r--r--benchmark/vm2_bighash.yml4
-rw-r--r--benchmark/vm2_case.yml13
-rw-r--r--benchmark/vm2_case_lit.yml23
-rw-r--r--benchmark/vm2_defined_method.yml8
-rw-r--r--benchmark/vm2_dstr.yml6
-rw-r--r--benchmark/vm2_eval.yml4
-rw-r--r--benchmark/vm2_fiber_switch.yml9
-rw-r--r--benchmark/vm2_freezestring.yml10
-rw-r--r--benchmark/vm2_method.yml8
-rw-r--r--benchmark/vm2_method_missing.yml11
-rw-r--r--benchmark/vm2_method_with_block.yml8
-rw-r--r--benchmark/vm2_module_ann_const_set.yml4
-rw-r--r--benchmark/vm2_module_const_set.yml8
-rw-r--r--benchmark/vm2_mutex.yml8
-rw-r--r--benchmark/vm2_newlambda.yml4
-rw-r--r--benchmark/vm2_poly_method.yml24
-rw-r--r--benchmark/vm2_poly_method_ov.yml24
-rw-r--r--benchmark/vm2_poly_singleton.yml18
-rw-r--r--benchmark/vm2_proc.yml12
-rw-r--r--benchmark/vm2_raise1.yml16
-rw-r--r--benchmark/vm2_raise2.yml16
-rw-r--r--benchmark/vm2_regexp.yml6
-rw-r--r--benchmark/vm2_send.yml11
-rw-r--r--benchmark/vm2_string_literal.yml4
-rw-r--r--benchmark/vm2_struct_big_aref_hi.yml7
-rw-r--r--benchmark/vm2_struct_big_aref_lo.yml7
-rw-r--r--benchmark/vm2_struct_big_aset.yml11
-rw-r--r--benchmark/vm2_struct_big_href_hi.yml7
-rw-r--r--benchmark/vm2_struct_big_href_lo.yml7
-rw-r--r--benchmark/vm2_struct_big_hset.yml11
-rw-r--r--benchmark/vm2_struct_small_aref.yml7
-rw-r--r--benchmark/vm2_struct_small_aset.yml11
-rw-r--r--benchmark/vm2_struct_small_href.yml7
-rw-r--r--benchmark/vm2_struct_small_hset.yml7
-rw-r--r--benchmark/vm2_super.yml17
-rw-r--r--benchmark/vm2_unif1.yml7
-rw-r--r--benchmark/vm2_zsuper.yml18
-rw-r--r--benchmark/vm3_gc_old_full.rb4
-rw-r--r--benchmark/vm3_gc_old_immediate.rb4
-rw-r--r--benchmark/vm3_gc_old_lazy.rb4
-rw-r--r--benchmark/vm_thread_condvar1.rb28
-rw-r--r--benchmark/vm_thread_condvar2.rb35
-rw-r--r--benchmark/vm_thread_mutex1.rb21
-rw-r--r--benchmark/vm_thread_mutex2.rb21
-rw-r--r--benchmark/vm_thread_mutex3.rb20
-rw-r--r--benchmark/vm_thread_pass_flood.rb10
-rw-r--r--benchmark/vm_thread_queue.rb18
-rw-r--r--benchmark/vm_thread_sized_queue.rb20
-rw-r--r--benchmark/vm_thread_sized_queue2.rb23
-rw-r--r--benchmark/vm_thread_sized_queue3.rb22
-rw-r--r--benchmark/vm_thread_sized_queue4.rb26
-rw-r--r--benchmark/wc.input.base25
-rw-r--r--bignum.c1442
-rwxr-xr-xbin/bundle27
-rwxr-xr-xbin/bundler27
-rwxr-xr-xbin/erb15
-rwxr-xr-xbin/irb28
-rwxr-xr-xbin/rdoc53
-rwxr-xr-xbin/ri31
-rwxr-xr-xbootstraptest/runner.rb52
-rw-r--r--bootstraptest/test_env.rb12
-rw-r--r--bootstraptest/test_eval.rb2
-rw-r--r--bootstraptest/test_exception.rb2
-rw-r--r--bootstraptest/test_flow.rb10
-rw-r--r--bootstraptest/test_fork.rb4
-rw-r--r--bootstraptest/test_insns.rb420
-rw-r--r--bootstraptest/test_io.rb4
-rw-r--r--bootstraptest/test_literal.rb40
-rw-r--r--bootstraptest/test_objectspace.rb2
-rw-r--r--bootstraptest/test_proc.rb4
-rw-r--r--bootstraptest/test_thread.rb34
-rw-r--r--ccan/list/list.h25
-rw-r--r--class.c461
-rw-r--r--common.mk1200
-rw-r--r--compar.c73
-rw-r--r--compile.c5777
-rw-r--r--complex.c977
-rw-r--r--configure.ac4061
-rw-r--r--configure.in4466
-rw-r--r--constant.h3
-rw-r--r--cont.c1302
-rw-r--r--coroutine/amd64/Context.S46
-rw-r--r--coroutine/amd64/Context.h59
-rw-r--r--coroutine/arm32/Context.S14
-rw-r--r--coroutine/arm32/Context.h56
-rw-r--r--coroutine/arm64/Context.S59
-rw-r--r--coroutine/arm64/Context.h57
-rw-r--r--coroutine/ppc64le/Context.S72
-rw-r--r--coroutine/ppc64le/Context.h54
-rw-r--r--coroutine/win32/Context.asm55
-rw-r--r--coroutine/win32/Context.h62
-rw-r--r--coroutine/win64/Context.S77
-rw-r--r--coroutine/win64/Context.asm79
-rw-r--r--coroutine/win64/Context.h72
-rw-r--r--coroutine/x86/Context.S43
-rw-r--r--coroutine/x86/Context.h59
-rw-r--r--cygwin/GNUmakefile.in32
-rw-r--r--debug.c119
-rw-r--r--debug_counter.c55
-rw-r--r--debug_counter.h283
-rw-r--r--defs/gmake.mk179
-rw-r--r--defs/id.def18
-rw-r--r--defs/keywords8
-rw-r--r--defs/known_errors.def251
-rw-r--r--defs/lex.c.src8
-rw-r--r--defs/opt_insn_unif.def2
-rw-r--r--defs/separated_version.mk38
-rw-r--r--defs/universal.mk5
-rw-r--r--dir.c1185
-rw-r--r--dln.c38
-rw-r--r--dln_find.c7
-rw-r--r--dmydln.c3
-rw-r--r--doc/.document1
-rw-r--r--doc/ChangeLog-0.60_to_1.110
-rw-r--r--doc/ChangeLog-1.8.08
-rw-r--r--doc/ChangeLog-1.9.344
-rw-r--r--doc/ChangeLog-2.1.02
-rw-r--r--doc/ChangeLog-2.3.012187
-rw-r--r--doc/ChangeLog-2.4.09492
-rw-r--r--doc/ChangeLog-20166
-rw-r--r--doc/ChangeLog-20176
-rw-r--r--doc/ChangeLog-YARV22
-rw-r--r--doc/NEWS-1.8.74
-rw-r--r--doc/NEWS-1.9.22
-rw-r--r--doc/NEWS-2.0.05
-rw-r--r--doc/NEWS-2.2.02
-rw-r--r--doc/NEWS-2.3.0404
-rw-r--r--doc/NEWS-2.4.0397
-rw-r--r--doc/NEWS-2.5.0567
-rw-r--r--doc/contributing.rdoc83
-rw-r--r--doc/contributors.rdoc19
-rw-r--r--doc/extension.ja.rdoc440
-rw-r--r--doc/extension.rdoc555
-rw-r--r--doc/globals.rdoc2
-rw-r--r--doc/irb/irb.rd.ja5
-rw-r--r--doc/maintainers.rdoc308
-rw-r--r--doc/marshal.rdoc4
-rw-r--r--doc/regexp.rdoc39
-rw-r--r--doc/security.rdoc6
-rw-r--r--doc/signals.rdoc106
-rw-r--r--doc/standard_library.rdoc102
-rw-r--r--doc/syntax/calling_methods.rdoc27
-rw-r--r--doc/syntax/control_expressions.rdoc4
-rw-r--r--doc/syntax/literals.rdoc30
-rw-r--r--doc/syntax/methods.rdoc30
-rw-r--r--doc/syntax/refinements.rdoc65
-rw-r--r--enc/Makefile.in8
-rw-r--r--enc/ascii.c8
-rw-r--r--enc/big5.c3
-rw-r--r--enc/cp949.c1
-rw-r--r--enc/depend176
-rw-r--r--enc/emacs_mule.c3
-rw-r--r--enc/euc_jp.c3
-rw-r--r--enc/euc_kr.c26
-rw-r--r--enc/euc_tw.c1
-rw-r--r--enc/gb18030.c2
-rw-r--r--enc/gbk.c1
-rw-r--r--enc/iso_8859.h1
-rw-r--r--enc/iso_8859_1.c55
-rw-r--r--enc/iso_8859_10.c58
-rw-r--r--enc/iso_8859_11.c1
-rw-r--r--enc/iso_8859_13.c70
-rw-r--r--enc/iso_8859_14.c67
-rw-r--r--enc/iso_8859_15.c64
-rw-r--r--enc/iso_8859_16.c66
-rw-r--r--enc/iso_8859_2.c53
-rw-r--r--enc/iso_8859_3.c67
-rw-r--r--enc/iso_8859_4.c56
-rw-r--r--enc/iso_8859_5.c33
-rw-r--r--enc/iso_8859_6.c1
-rw-r--r--enc/iso_8859_7.c65
-rw-r--r--enc/iso_8859_8.c1
-rw-r--r--enc/iso_8859_9.c79
-rw-r--r--enc/jis/props.h227
-rw-r--r--enc/jis/props.h.blt56
-rw-r--r--enc/jis/props.kwd6
-rw-r--r--enc/jis/props.src6
-rw-r--r--enc/koi8_r.c2
-rw-r--r--enc/koi8_u.c1
-rwxr-xr-xenc/make_encmake.rb12
-rw-r--r--enc/mktable.c42
-rw-r--r--enc/prelude.rb4
-rw-r--r--enc/shift_jis.c526
-rw-r--r--enc/shift_jis.h546
-rw-r--r--enc/trans/GB/GB12345%UCS.src61
-rw-r--r--enc/trans/GB/GB2312%UCS.src75
-rw-r--r--enc/trans/GB/UCS%GB12345.src61
-rw-r--r--enc/trans/GB/UCS%GB2312.src75
-rw-r--r--enc/trans/JIS/JISX0201-KANA%UCS.src51
-rw-r--r--enc/trans/JIS/JISX0208@1990%UCS.src54
-rw-r--r--enc/trans/JIS/JISX0212%UCS.src62
-rw-r--r--enc/trans/JIS/UCS%JISX0201-KANA.src52
-rw-r--r--enc/trans/JIS/UCS%JISX0208@1990.src53
-rw-r--r--enc/trans/JIS/UCS%JISX0212.src61
-rw-r--r--enc/trans/single_byte.trans9
-rw-r--r--enc/trans/windows-1255-tbl.rb3
-rw-r--r--enc/unicode.c319
-rw-r--r--enc/unicode/12.1.0/casefold.h7428
-rw-r--r--enc/unicode/12.1.0/name2ctype.h41810
-rwxr-xr-xenc/unicode/case-folding.rb258
-rw-r--r--enc/unicode/casefold.h6248
-rw-r--r--enc/unicode/name2ctype.h34027
-rw-r--r--enc/unicode/name2ctype.h.blt32679
-rw-r--r--enc/unicode/name2ctype.kwd26550
-rw-r--r--enc/unicode/name2ctype.src26550
-rw-r--r--enc/us_ascii.c8
-rw-r--r--enc/utf_16be.c4
-rw-r--r--enc/utf_16le.c4
-rw-r--r--enc/utf_32be.c23
-rw-r--r--enc/utf_32le.c22
-rw-r--r--enc/utf_8.c15
-rw-r--r--enc/windows_1250.c57
-rw-r--r--enc/windows_1251.c47
-rw-r--r--enc/windows_1252.c53
-rw-r--r--enc/windows_1253.c297
-rw-r--r--enc/windows_1254.c302
-rw-r--r--enc/windows_1257.c304
-rw-r--r--enc/windows_31j.c7
-rw-r--r--enc/x_emoji.h4
-rw-r--r--encindex.h2
-rw-r--r--encoding.c92
-rw-r--r--enum.c1060
-rw-r--r--enumerator.c1631
-rw-r--r--error.c1057
-rw-r--r--eval.c838
-rw-r--r--eval_error.c397
-rw-r--r--eval_intern.h121
-rw-r--r--eval_jump.c36
-rw-r--r--ext/-test-/arith_seq/extract/extconf.rb2
-rw-r--r--ext/-test-/arith_seq/extract/extract.c27
-rw-r--r--ext/-test-/array/resize/depend12
-rw-r--r--ext/-test-/auto_ext.rb10
-rw-r--r--ext/-test-/bignum/depend13
-rw-r--r--ext/-test-/bignum/extconf.rb9
-rw-r--r--ext/-test-/bignum/mul.c4
-rw-r--r--ext/-test-/bug-14834/bug-14384.c35
-rw-r--r--ext/-test-/bug-14834/depend13
-rw-r--r--ext/-test-/bug-14834/extconf.rb2
-rw-r--r--ext/-test-/bug-3571/bug.c2
-rw-r--r--ext/-test-/bug-3571/extconf.rb2
-rw-r--r--ext/-test-/bug-5832/bug.c2
-rw-r--r--ext/-test-/bug-5832/extconf.rb2
-rw-r--r--ext/-test-/bug_reporter/extconf.rb2
-rw-r--r--ext/-test-/class/depend23
-rw-r--r--ext/-test-/class/extconf.rb9
-rw-r--r--ext/-test-/debug/depend3
-rw-r--r--ext/-test-/debug/extconf.rb8
-rw-r--r--ext/-test-/dln/empty/depend3
-rw-r--r--ext/-test-/exception/depend5
-rw-r--r--ext/-test-/exception/enc_raise.c2
-rw-r--r--ext/-test-/exception/ensured.c14
-rw-r--r--ext/-test-/exception/extconf.rb8
-rw-r--r--ext/-test-/file/depend5
-rw-r--r--ext/-test-/file/extconf.rb10
-rw-r--r--ext/-test-/file/fs.c28
-rw-r--r--ext/-test-/float/extconf.rb9
-rw-r--r--ext/-test-/funcall/extconf.rb2
-rw-r--r--ext/-test-/funcall/funcall.c44
-rw-r--r--ext/-test-/funcall/passing_block.c30
-rw-r--r--ext/-test-/gvl/call_without_gvl/depend13
-rw-r--r--ext/-test-/hash/extconf.rb9
-rw-r--r--ext/-test-/integer/core_ext.c36
-rw-r--r--ext/-test-/integer/depend40
-rw-r--r--ext/-test-/integer/extconf.rb3
-rw-r--r--ext/-test-/integer/init.c11
-rw-r--r--ext/-test-/integer/my_integer.c16
-rw-r--r--ext/-test-/iseq_load/extconf.rb2
-rw-r--r--ext/-test-/iter/break.c4
-rw-r--r--ext/-test-/iter/extconf.rb9
-rw-r--r--ext/-test-/load/dot.dot/depend3
-rw-r--r--ext/-test-/load/dot.dot/extconf.rb2
-rw-r--r--ext/-test-/load/protect/extconf.rb1
-rw-r--r--ext/-test-/load/protect/protect.c19
-rw-r--r--ext/-test-/memory_status/extconf.rb12
-rw-r--r--ext/-test-/memory_status/memory_status.c69
-rw-r--r--ext/-test-/method/extconf.rb8
-rw-r--r--ext/-test-/notimplement/bug.c4
-rw-r--r--ext/-test-/num2int/extconf.rb2
-rw-r--r--ext/-test-/path_to_class/extconf.rb2
-rw-r--r--ext/-test-/printf/printf.c8
-rw-r--r--ext/-test-/proc/extconf.rb9
-rw-r--r--ext/-test-/rational/depend2
-rw-r--r--ext/-test-/regexp/extconf.rb3
-rw-r--r--ext/-test-/regexp/init.c11
-rw-r--r--ext/-test-/regexp/parse_depth_limit.c23
-rwxr-xr-xext/-test-/scan_args/extconf.rb1
-rw-r--r--ext/-test-/scan_args/scan_args.c286
-rw-r--r--ext/-test-/st/foreach/foreach.c12
-rw-r--r--ext/-test-/string/capacity.c17
-rw-r--r--ext/-test-/string/coderange.c4
-rw-r--r--ext/-test-/string/cstr.c68
-rw-r--r--ext/-test-/string/depend83
-rw-r--r--ext/-test-/string/ellipsize.c2
-rw-r--r--ext/-test-/string/enc_associate.c2
-rw-r--r--ext/-test-/string/enc_str_buf_cat.c2
-rw-r--r--ext/-test-/string/extconf.rb9
-rw-r--r--ext/-test-/string/fstring.c2
-rw-r--r--ext/-test-/string/init.c2
-rw-r--r--ext/-test-/string/modify.c2
-rw-r--r--ext/-test-/string/new.c21
-rw-r--r--ext/-test-/string/nofree.c2
-rw-r--r--ext/-test-/string/normalize.c2
-rw-r--r--ext/-test-/string/qsort.c2
-rw-r--r--ext/-test-/string/rb_str_dup.c35
-rw-r--r--ext/-test-/string/set_len.c2
-rw-r--r--ext/-test-/struct/depend46
-rw-r--r--ext/-test-/struct/duplicate.c24
-rw-r--r--ext/-test-/struct/extconf.rb9
-rw-r--r--ext/-test-/struct/len.c13
-rw-r--r--ext/-test-/symbol/extconf.rb8
-rw-r--r--ext/-test-/symbol/init.c8
-rw-r--r--ext/-test-/thread_fd_close/depend16
-rw-r--r--ext/-test-/thread_fd_close/extconf.rb2
-rw-r--r--ext/-test-/thread_fd_close/thread_fd_close.c14
-rw-r--r--ext/-test-/time/depend35
-rw-r--r--ext/-test-/time/extconf.rb9
-rw-r--r--ext/-test-/time/init.c2
-rw-r--r--ext/-test-/time/leap_second.c15
-rw-r--r--ext/-test-/time/new.c2
-rw-r--r--ext/-test-/tracepoint/depend2
-rw-r--r--ext/-test-/typeddata/extconf.rb2
-rw-r--r--ext/-test-/typeddata/typeddata.c24
-rw-r--r--ext/-test-/vm/at_exit.c44
-rw-r--r--ext/-test-/vm/depend13
-rw-r--r--ext/-test-/vm/extconf.rb1
-rw-r--r--ext/-test-/wait_for_single_fd/depend2
-rw-r--r--ext/-test-/wait_for_single_fd/extconf.rb4
-rw-r--r--ext/-test-/wait_for_single_fd/wait_for_single_fd.c64
-rw-r--r--ext/-test-/win32/console/attribute.c29
-rw-r--r--ext/-test-/win32/console/extconf.rb8
-rw-r--r--ext/-test-/win32/dln/depend4
-rw-r--r--ext/-test-/win32/dln/extconf.rb6
-rw-r--r--ext/.document26
-rw-r--r--ext/Setup5
-rw-r--r--ext/Setup.atheos1
-rw-r--r--ext/Setup.nacl46
-rw-r--r--ext/Setup.nt1
-rw-r--r--ext/bigdecimal/bigdecimal.c1172
-rw-r--r--ext/bigdecimal/bigdecimal.def3
-rw-r--r--ext/bigdecimal/bigdecimal.gemspec50
-rw-r--r--ext/bigdecimal/bigdecimal.h70
-rw-r--r--ext/bigdecimal/depend5
-rw-r--r--ext/bigdecimal/extconf.rb31
-rw-r--r--ext/bigdecimal/lib/bigdecimal.rb6
-rw-r--r--ext/bigdecimal/lib/bigdecimal/jacobian.rb3
-rw-r--r--ext/bigdecimal/lib/bigdecimal/math.rb18
-rw-r--r--ext/bigdecimal/lib/bigdecimal/util.rb128
-rw-r--r--ext/bigdecimal/sample/linear.rb21
-rw-r--r--ext/bigdecimal/sample/nlsolve.rb10
-rw-r--r--ext/bigdecimal/util/extconf.rb24
-rw-r--r--ext/bigdecimal/util/util.c9
-rw-r--r--ext/cgi/escape/depend16
-rw-r--r--ext/cgi/escape/escape.c327
-rw-r--r--ext/continuation/depend12
-rw-r--r--ext/coverage/coverage.c259
-rw-r--r--ext/coverage/depend4
-rw-r--r--ext/coverage/lib/coverage.rb14
-rw-r--r--ext/date/date.gemspec23
-rw-r--r--ext/date/date_core.c1383
-rw-r--r--ext/date/date_parse.c415
-rw-r--r--ext/date/date_strftime.c9
-rw-r--r--ext/date/date_strptime.c83
-rw-r--r--ext/date/date_tmx.h2
-rw-r--r--ext/date/depend10
-rw-r--r--ext/date/extconf.rb7
-rw-r--r--ext/date/lib/date.rb16
-rw-r--r--ext/date/prereq.mk8
-rw-r--r--ext/date/zonetab.h895
-rw-r--r--ext/date/zonetab.list181
-rw-r--r--ext/dbm/dbm.c78
-rw-r--r--ext/dbm/dbm.gemspec20
-rw-r--r--ext/dbm/depend13
-rw-r--r--ext/dbm/extconf.rb8
-rw-r--r--ext/digest/bubblebabble/bubblebabble.c3
-rw-r--r--ext/digest/bubblebabble/depend1
-rw-r--r--ext/digest/depend1
-rw-r--r--ext/digest/digest.c67
-rw-r--r--ext/digest/digest_conf.rb56
-rw-r--r--ext/digest/lib/digest.rb2
-rw-r--r--ext/digest/md5/depend4
-rw-r--r--ext/digest/md5/md5cc.h4
-rw-r--r--ext/digest/md5/md5init.c20
-rw-r--r--ext/digest/md5/md5ossl.h2
-rw-r--r--ext/digest/rmd160/depend16
-rw-r--r--ext/digest/rmd160/rmd160init.c20
-rw-r--r--ext/digest/sha1/depend14
-rw-r--r--ext/digest/sha1/sha1cc.h4
-rw-r--r--ext/digest/sha1/sha1init.c22
-rw-r--r--ext/digest/sha1/sha1ossl.h2
-rw-r--r--ext/digest/sha2/depend16
-rw-r--r--ext/digest/sha2/lib/sha2.rb44
-rw-r--r--ext/digest/sha2/sha2cc.h12
-rw-r--r--ext/digest/sha2/sha2ossl.h6
-rw-r--r--ext/etc/depend23
-rw-r--r--ext/etc/etc.c23
-rw-r--r--ext/etc/etc.gemspec40
-rw-r--r--ext/etc/extconf.rb14
-rw-r--r--ext/etc/mkconstants.rb18
-rwxr-xr-xext/extmk.rb342
-rw-r--r--ext/fcntl/depend13
-rw-r--r--ext/fcntl/extconf.rb2
-rw-r--r--ext/fcntl/fcntl.c2
-rw-r--r--ext/fcntl/fcntl.gemspec25
-rw-r--r--ext/fiber/depend1
-rw-r--r--ext/fiddle/closure.c3
-rw-r--r--ext/fiddle/depend121
-rw-r--r--ext/fiddle/extconf.rb25
-rw-r--r--ext/fiddle/extlibs5
-rw-r--r--ext/fiddle/fiddle.gemspec23
-rw-r--r--ext/fiddle/function.c4
-rw-r--r--ext/fiddle/lib/fiddle.rb2
-rw-r--r--ext/fiddle/lib/fiddle/closure.rb2
-rw-r--r--ext/fiddle/lib/fiddle/cparser.rb5
-rw-r--r--ext/fiddle/lib/fiddle/function.rb2
-rw-r--r--ext/fiddle/lib/fiddle/import.rb29
-rw-r--r--ext/fiddle/lib/fiddle/pack.rb25
-rw-r--r--ext/fiddle/lib/fiddle/struct.rb2
-rw-r--r--ext/fiddle/lib/fiddle/types.rb2
-rw-r--r--ext/fiddle/lib/fiddle/value.rb29
-rw-r--r--ext/fiddle/pointer.c3
-rwxr-xr-xext/fiddle/win32/libffi-config.rb2
-rw-r--r--ext/gdbm/depend13
-rw-r--r--ext/gdbm/gdbm.c48
-rw-r--r--ext/gdbm/gdbm.gemspec26
-rw-r--r--ext/io/console/console.c57
-rw-r--r--ext/io/console/depend24
-rw-r--r--ext/io/console/extconf.rb3
-rw-r--r--ext/io/console/io-console.gemspec13
-rw-r--r--ext/io/console/lib/console/size.rb2
-rw-r--r--ext/io/console/win32_vk.inc361
-rw-r--r--ext/io/console/win32_vk.list2
-rw-r--r--ext/io/nonblock/depend21
-rw-r--r--ext/io/nonblock/nonblock.c2
-rw-r--r--ext/io/wait/depend21
-rw-r--r--ext/io/wait/wait.c77
-rw-r--r--ext/json/extconf.rb2
-rw-r--r--ext/json/fbuffer/fbuffer.h3
-rw-r--r--ext/json/generator/depend2
-rw-r--r--ext/json/generator/extconf.rb1
-rw-r--r--ext/json/generator/generator.c106
-rw-r--r--ext/json/generator/generator.h9
-rw-r--r--ext/json/json.gemspec43
-rw-r--r--ext/json/lib/json.rb2
-rw-r--r--ext/json/lib/json/add/bigdecimal.rb2
-rw-r--r--ext/json/lib/json/add/complex.rb2
-rw-r--r--ext/json/lib/json/add/core.rb2
-rw-r--r--ext/json/lib/json/add/date.rb3
-rw-r--r--ext/json/lib/json/add/date_time.rb3
-rw-r--r--ext/json/lib/json/add/exception.rb3
-rw-r--r--ext/json/lib/json/add/ostruct.rb5
-rw-r--r--ext/json/lib/json/add/range.rb3
-rw-r--r--ext/json/lib/json/add/rational.rb2
-rw-r--r--ext/json/lib/json/add/regexp.rb3
-rw-r--r--ext/json/lib/json/add/struct.rb3
-rw-r--r--ext/json/lib/json/add/symbol.rb3
-rw-r--r--ext/json/lib/json/add/time.rb3
-rw-r--r--ext/json/lib/json/common.rb77
-rw-r--r--ext/json/lib/json/ext.rb7
-rw-r--r--ext/json/lib/json/generic_object.rb10
-rw-r--r--ext/json/lib/json/version.rb2
-rw-r--r--ext/json/parser/depend2
-rw-r--r--ext/json/parser/parser.c789
-rw-r--r--ext/json/parser/parser.h9
-rw-r--r--ext/json/parser/parser.rl272
-rw-r--r--ext/mathn/complex/complex.c7
-rw-r--r--ext/mathn/complex/extconf.rb4
-rw-r--r--ext/mathn/rational/extconf.rb4
-rw-r--r--ext/mathn/rational/rational.c7
-rw-r--r--ext/nkf/depend2
-rw-r--r--ext/nkf/nkf-utf8/nkf.c65
-rw-r--r--ext/nkf/nkf-utf8/utf8tbl.c158
-rw-r--r--ext/nkf/nkf.c9
-rw-r--r--ext/objspace/depend9
-rw-r--r--ext/objspace/extconf.rb2
-rw-r--r--ext/objspace/object_tracing.c40
-rw-r--r--ext/objspace/objspace.c59
-rw-r--r--ext/objspace/objspace_dump.c74
-rw-r--r--ext/openssl/History.md339
-rw-r--r--ext/openssl/depend193
-rw-r--r--ext/openssl/deprecation.rb11
-rw-r--r--ext/openssl/extconf.rb230
-rw-r--r--ext/openssl/lib/openssl.rb1
-rw-r--r--ext/openssl/lib/openssl/bn.rb3
-rw-r--r--ext/openssl/lib/openssl/buffering.rb76
-rw-r--r--ext/openssl/lib/openssl/cipher.rb38
-rw-r--r--ext/openssl/lib/openssl/config.rb23
-rw-r--r--ext/openssl/lib/openssl/digest.rb22
-rw-r--r--ext/openssl/lib/openssl/pkcs5.rb22
-rw-r--r--ext/openssl/lib/openssl/pkey.rb52
-rw-r--r--ext/openssl/lib/openssl/ssl.rb323
-rw-r--r--ext/openssl/lib/openssl/x509.rb41
-rw-r--r--ext/openssl/openssl.gemspec49
-rw-r--r--ext/openssl/openssl_missing.c376
-rw-r--r--ext/openssl/openssl_missing.h244
-rw-r--r--ext/openssl/ossl.c579
-rw-r--r--ext/openssl/ossl.h156
-rw-r--r--ext/openssl/ossl_asn1.c952
-rw-r--r--ext/openssl/ossl_asn1.h12
-rw-r--r--ext/openssl/ossl_bio.c73
-rw-r--r--ext/openssl/ossl_bio.h5
-rw-r--r--ext/openssl/ossl_bn.c405
-rw-r--r--ext/openssl/ossl_bn.h4
-rw-r--r--ext/openssl/ossl_cipher.c481
-rw-r--r--ext/openssl/ossl_cipher.h2
-rw-r--r--ext/openssl/ossl_config.c19
-rw-r--r--ext/openssl/ossl_config.h1
-rw-r--r--ext/openssl/ossl_digest.c89
-rw-r--r--ext/openssl/ossl_digest.h2
-rw-r--r--ext/openssl/ossl_engine.c231
-rw-r--r--ext/openssl/ossl_hmac.c170
-rw-r--r--ext/openssl/ossl_kdf.c319
-rw-r--r--ext/openssl/ossl_kdf.h6
-rw-r--r--ext/openssl/ossl_ns_spki.c58
-rw-r--r--ext/openssl/ossl_ocsp.c1122
-rw-r--r--ext/openssl/ossl_ocsp.h2
-rw-r--r--ext/openssl/ossl_pkcs12.c103
-rw-r--r--ext/openssl/ossl_pkcs5.c188
-rw-r--r--ext/openssl/ossl_pkcs5.h6
-rw-r--r--ext/openssl/ossl_pkcs7.c95
-rw-r--r--ext/openssl/ossl_pkey.c276
-rw-r--r--ext/openssl/ossl_pkey.h156
-rw-r--r--ext/openssl/ossl_pkey_dh.c251
-rw-r--r--ext/openssl/ossl_pkey_dsa.c288
-rw-r--r--ext/openssl/ossl_pkey_ec.c1275
-rw-r--r--ext/openssl/ossl_pkey_rsa.c521
-rw-r--r--ext/openssl/ossl_rand.c70
-rw-r--r--ext/openssl/ossl_ssl.c1782
-rw-r--r--ext/openssl/ossl_ssl.h8
-rw-r--r--ext/openssl/ossl_ssl_session.c164
-rw-r--r--ext/openssl/ossl_version.h2
-rw-r--r--ext/openssl/ossl_x509.c89
-rw-r--r--ext/openssl/ossl_x509.h26
-rw-r--r--ext/openssl/ossl_x509attr.c144
-rw-r--r--ext/openssl/ossl_x509cert.c164
-rw-r--r--ext/openssl/ossl_x509crl.c143
-rw-r--r--ext/openssl/ossl_x509ext.c151
-rw-r--r--ext/openssl/ossl_x509name.c207
-rw-r--r--ext/openssl/ossl_x509req.c119
-rw-r--r--ext/openssl/ossl_x509revoked.c87
-rw-r--r--ext/openssl/ossl_x509store.c448
-rw-r--r--ext/openssl/ruby_missing.h17
-rw-r--r--ext/pathname/depend19
-rw-r--r--ext/pathname/lib/pathname.rb18
-rw-r--r--ext/pathname/pathname.c388
-rw-r--r--ext/psych/.gitignore11
-rw-r--r--ext/psych/depend100
-rw-r--r--ext/psych/extconf.rb2
-rw-r--r--ext/psych/lib/psych.rb248
-rw-r--r--ext/psych/lib/psych/class_loader.rb2
-rw-r--r--ext/psych/lib/psych/coder.rb2
-rw-r--r--ext/psych/lib/psych/core_ext.rb21
-rw-r--r--ext/psych/lib/psych/deprecated.rb86
-rw-r--r--ext/psych/lib/psych/exception.rb2
-rw-r--r--ext/psych/lib/psych/handler.rb9
-rw-r--r--ext/psych/lib/psych/handlers/document_stream.rb2
-rw-r--r--ext/psych/lib/psych/handlers/recorder.rb2
-rw-r--r--ext/psych/lib/psych/json/ruby_events.rb2
-rw-r--r--ext/psych/lib/psych/json/stream.rb2
-rw-r--r--ext/psych/lib/psych/json/tree_builder.rb2
-rw-r--r--ext/psych/lib/psych/json/yaml_events.rb2
-rw-r--r--ext/psych/lib/psych/nodes.rb2
-rw-r--r--ext/psych/lib/psych/nodes/alias.rb4
-rw-r--r--ext/psych/lib/psych/nodes/document.rb4
-rw-r--r--ext/psych/lib/psych/nodes/mapping.rb4
-rw-r--r--ext/psych/lib/psych/nodes/node.rb21
-rw-r--r--ext/psych/lib/psych/nodes/scalar.rb4
-rw-r--r--ext/psych/lib/psych/nodes/sequence.rb4
-rw-r--r--ext/psych/lib/psych/nodes/stream.rb4
-rw-r--r--ext/psych/lib/psych/omap.rb2
-rw-r--r--ext/psych/lib/psych/parser.rb2
-rw-r--r--ext/psych/lib/psych/scalar_scanner.rb11
-rw-r--r--ext/psych/lib/psych/set.rb2
-rw-r--r--ext/psych/lib/psych/stream.rb2
-rw-r--r--ext/psych/lib/psych/streaming.rb2
-rw-r--r--ext/psych/lib/psych/syntax_error.rb2
-rw-r--r--ext/psych/lib/psych/tree_builder.rb50
-rw-r--r--ext/psych/lib/psych/versions.rb10
-rw-r--r--ext/psych/lib/psych/visitors.rb2
-rw-r--r--ext/psych/lib/psych/visitors/depth_first.rb2
-rw-r--r--ext/psych/lib/psych/visitors/emitter.rb2
-rw-r--r--ext/psych/lib/psych/visitors/json_tree.rb2
-rw-r--r--ext/psych/lib/psych/visitors/to_ruby.rb11
-rw-r--r--ext/psych/lib/psych/visitors/visitor.rb2
-rw-r--r--ext/psych/lib/psych/visitors/yaml_tree.rb79
-rw-r--r--ext/psych/lib/psych/y.rb2
-rw-r--r--ext/psych/lib/psych_jars.rb6
-rw-r--r--ext/psych/psych.gemspec88
-rw-r--r--ext/psych/psych.h3
-rw-r--r--ext/psych/psych_emitter.c47
-rw-r--r--ext/psych/psych_parser.c79
-rw-r--r--ext/psych/psych_to_ruby.c4
-rw-r--r--ext/psych/psych_yaml_tree.c2
-rw-r--r--ext/psych/yaml/LICENSE19
-rw-r--r--ext/psych/yaml/api.c104
-rw-r--r--ext/psych/yaml/config.h14
-rw-r--r--ext/psych/yaml/dumper.c4
-rw-r--r--ext/psych/yaml/emitter.c27
-rw-r--r--ext/psych/yaml/loader.c33
-rw-r--r--ext/psych/yaml/parser.c10
-rw-r--r--ext/psych/yaml/reader.c6
-rw-r--r--ext/psych/yaml/scanner.c54
-rw-r--r--ext/psych/yaml/yaml_private.h62
-rw-r--r--ext/pty/depend2
-rw-r--r--ext/pty/extconf.rb5
-rw-r--r--ext/pty/lib/expect.rb11
-rw-r--r--ext/pty/pty.c155
-rw-r--r--ext/racc/cparse/depend12
-rw-r--r--ext/rbconfig/sizeof/depend26
-rw-r--r--ext/rbconfig/sizeof/extconf.rb62
-rw-r--r--ext/readline/.gitignore1
-rw-r--r--ext/readline/depend3
-rw-r--r--ext/readline/extconf.rb10
-rw-r--r--ext/readline/readline.c199
-rw-r--r--ext/ripper/depend22
-rw-r--r--ext/ripper/eventids2.c21
-rw-r--r--ext/ripper/extconf.rb4
-rw-r--r--ext/ripper/lib/ripper.rb10
-rw-r--r--ext/ripper/lib/ripper/core.rb2
-rw-r--r--ext/ripper/lib/ripper/filter.rb12
-rw-r--r--ext/ripper/lib/ripper/lexer.rb78
-rw-r--r--ext/ripper/lib/ripper/sexp.rb14
-rw-r--r--ext/ripper/tools/dsl.rb86
-rwxr-xr-xext/ripper/tools/generate-param-macros.rb2
-rwxr-xr-xext/ripper/tools/generate.rb15
-rwxr-xr-xext/ripper/tools/preproc.rb45
-rwxr-xr-xext/ripper/tools/strip.rb9
-rw-r--r--ext/rubyvm/extconf.rb1
-rw-r--r--ext/rubyvm/lib/forwardable/impl.rb16
-rw-r--r--ext/sdbm/_sdbm.c56
-rw-r--r--ext/sdbm/depend6
-rw-r--r--ext/sdbm/init.c25
-rw-r--r--ext/sdbm/sdbm.gemspec21
-rw-r--r--ext/socket/ancdata.c2
-rw-r--r--ext/socket/basicsocket.c36
-rw-r--r--ext/socket/depend38
-rw-r--r--ext/socket/extconf.rb5
-rw-r--r--ext/socket/getaddrinfo.c2
-rw-r--r--ext/socket/getnameinfo.c19
-rw-r--r--ext/socket/ifaddr.c66
-rw-r--r--ext/socket/init.c186
-rw-r--r--ext/socket/ipsocket.c40
-rw-r--r--ext/socket/lib/socket.rb129
-rw-r--r--ext/socket/mkconstants.rb30
-rw-r--r--ext/socket/option.c54
-rw-r--r--ext/socket/raddrinfo.c66
-rw-r--r--ext/socket/rubysocket.h21
-rw-r--r--ext/socket/socket.c81
-rw-r--r--ext/socket/tcpsocket.c11
-rw-r--r--ext/socket/udpsocket.c2
-rw-r--r--ext/socket/unixserver.c2
-rw-r--r--ext/socket/unixsocket.c56
-rw-r--r--ext/stringio/README18
-rw-r--r--ext/stringio/README.md10
-rw-r--r--ext/stringio/depend21
-rw-r--r--ext/stringio/stringio.c264
-rw-r--r--ext/stringio/stringio.gemspec27
-rw-r--r--ext/strscan/depend2
-rw-r--r--ext/strscan/extconf.rb2
-rw-r--r--ext/strscan/strscan.c129
-rw-r--r--ext/strscan/strscan.gemspec19
-rw-r--r--ext/syslog/depend1
-rw-r--r--ext/syslog/syslog.c9
-rw-r--r--ext/thread/extconf.rb4
-rw-r--r--ext/thread/thread.c6
-rw-r--r--ext/tk/ChangeLog.tkextlib949
-rw-r--r--ext/tk/MANUAL_tcltklib.eng467
-rw-r--r--ext/tk/MANUAL_tcltklib.ja578
-rw-r--r--ext/tk/README.1st19
-rw-r--r--ext/tk/README.ActiveTcl62
-rw-r--r--ext/tk/README.fork34
-rw-r--r--ext/tk/README.macosx-aqua67
-rw-r--r--ext/tk/README.tcltklib152
-rw-r--r--ext/tk/config_list.in41
-rw-r--r--ext/tk/depend2
-rw-r--r--ext/tk/extconf.rb2097
-rw-r--r--ext/tk/lib/README30
-rw-r--r--ext/tk/lib/multi-tk.rb3743
-rw-r--r--ext/tk/lib/remote-tk.rb525
-rw-r--r--ext/tk/lib/tcltk.rb368
-rw-r--r--ext/tk/lib/tk.rb5758
-rw-r--r--ext/tk/lib/tk/after.rb7
-rw-r--r--ext/tk/lib/tk/autoload.rb763
-rw-r--r--ext/tk/lib/tk/bgerror.rb30
-rw-r--r--ext/tk/lib/tk/bindtag.rb139
-rw-r--r--ext/tk/lib/tk/busy.rb119
-rw-r--r--ext/tk/lib/tk/button.rb32
-rw-r--r--ext/tk/lib/tk/canvas.rb847
-rw-r--r--ext/tk/lib/tk/canvastag.rb460
-rw-r--r--ext/tk/lib/tk/checkbutton.rb33
-rw-r--r--ext/tk/lib/tk/clipboard.rb76
-rw-r--r--ext/tk/lib/tk/clock.rb72
-rw-r--r--ext/tk/lib/tk/composite.rb485
-rw-r--r--ext/tk/lib/tk/console.rb53
-rw-r--r--ext/tk/lib/tk/dialog.rb327
-rw-r--r--ext/tk/lib/tk/encodedstr.rb188
-rw-r--r--ext/tk/lib/tk/entry.rb121
-rw-r--r--ext/tk/lib/tk/event.rb563
-rw-r--r--ext/tk/lib/tk/font.rb2352
-rw-r--r--ext/tk/lib/tk/fontchooser.rb181
-rw-r--r--ext/tk/lib/tk/frame.rb133
-rw-r--r--ext/tk/lib/tk/grid.rb280
-rw-r--r--ext/tk/lib/tk/image.rb396
-rw-r--r--ext/tk/lib/tk/itemconfig.rb1222
-rw-r--r--ext/tk/lib/tk/itemfont.rb328
-rw-r--r--ext/tk/lib/tk/kinput.rb72
-rw-r--r--ext/tk/lib/tk/label.rb23
-rw-r--r--ext/tk/lib/tk/labelframe.rb32
-rw-r--r--ext/tk/lib/tk/listbox.rb285
-rw-r--r--ext/tk/lib/tk/macpkg.rb81
-rw-r--r--ext/tk/lib/tk/menu.rb719
-rw-r--r--ext/tk/lib/tk/menubar.rb138
-rw-r--r--ext/tk/lib/tk/menuspec.rb457
-rw-r--r--ext/tk/lib/tk/message.rb25
-rw-r--r--ext/tk/lib/tk/mngfocus.rb34
-rw-r--r--ext/tk/lib/tk/msgcat.rb300
-rw-r--r--ext/tk/lib/tk/namespace.rb547
-rw-r--r--ext/tk/lib/tk/optiondb.rb372
-rw-r--r--ext/tk/lib/tk/optionobj.rb213
-rw-r--r--ext/tk/lib/tk/pack.rb108
-rw-r--r--ext/tk/lib/tk/package.rb144
-rw-r--r--ext/tk/lib/tk/palette.rb56
-rw-r--r--ext/tk/lib/tk/panedwindow.rb261
-rw-r--r--ext/tk/lib/tk/place.rb129
-rw-r--r--ext/tk/lib/tk/radiobutton.rb74
-rw-r--r--ext/tk/lib/tk/root.rb96
-rw-r--r--ext/tk/lib/tk/scale.rb113
-rw-r--r--ext/tk/lib/tk/scrollable.rb83
-rw-r--r--ext/tk/lib/tk/scrollbar.rb184
-rw-r--r--ext/tk/lib/tk/scrollbox.rb40
-rw-r--r--ext/tk/lib/tk/selection.rb87
-rw-r--r--ext/tk/lib/tk/spinbox.rb145
-rw-r--r--ext/tk/lib/tk/tagfont.rb44
-rw-r--r--ext/tk/lib/tk/text.rb1605
-rw-r--r--ext/tk/lib/tk/textimage.rb89
-rw-r--r--ext/tk/lib/tk/textmark.rb205
-rw-r--r--ext/tk/lib/tk/texttag.rb322
-rw-r--r--ext/tk/lib/tk/textwindow.rb155
-rw-r--r--ext/tk/lib/tk/timer.rb666
-rw-r--r--ext/tk/lib/tk/tk_mac.rb159
-rw-r--r--ext/tk/lib/tk/toplevel.rb265
-rw-r--r--ext/tk/lib/tk/ttk_selector.rb99
-rw-r--r--ext/tk/lib/tk/txtwin_abst.rb40
-rw-r--r--ext/tk/lib/tk/validation.rb398
-rw-r--r--ext/tk/lib/tk/variable.rb1797
-rw-r--r--ext/tk/lib/tk/virtevent.rb140
-rw-r--r--ext/tk/lib/tk/winfo.rb393
-rw-r--r--ext/tk/lib/tk/winpkg.rb157
-rw-r--r--ext/tk/lib/tk/wm.rb553
-rw-r--r--ext/tk/lib/tk/xim.rb123
-rw-r--r--ext/tk/lib/tkafter.rb5
-rw-r--r--ext/tk/lib/tkbgerror.rb5
-rw-r--r--ext/tk/lib/tkcanvas.rb5
-rw-r--r--ext/tk/lib/tkclass.rb48
-rw-r--r--ext/tk/lib/tkconsole.rb5
-rw-r--r--ext/tk/lib/tkdialog.rb5
-rw-r--r--ext/tk/lib/tkentry.rb5
-rw-r--r--ext/tk/lib/tkextlib/ICONS.rb14
-rw-r--r--ext/tk/lib/tkextlib/ICONS/icons.rb130
-rw-r--r--ext/tk/lib/tkextlib/ICONS/setup.rb9
-rw-r--r--ext/tk/lib/tkextlib/SUPPORT_STATUS193
-rw-r--r--ext/tk/lib/tkextlib/blt.rb190
-rw-r--r--ext/tk/lib/tkextlib/blt/barchart.rb80
-rw-r--r--ext/tk/lib/tkextlib/blt/bitmap.rb113
-rw-r--r--ext/tk/lib/tkextlib/blt/busy.rb84
-rw-r--r--ext/tk/lib/tkextlib/blt/component.rb2219
-rw-r--r--ext/tk/lib/tkextlib/blt/container.rb29
-rw-r--r--ext/tk/lib/tkextlib/blt/cutbuffer.rb24
-rw-r--r--ext/tk/lib/tkextlib/blt/dragdrop.rb270
-rw-r--r--ext/tk/lib/tkextlib/blt/eps.rb33
-rw-r--r--ext/tk/lib/tkextlib/blt/graph.rb68
-rw-r--r--ext/tk/lib/tkextlib/blt/htext.rb113
-rw-r--r--ext/tk/lib/tkextlib/blt/setup.rb9
-rw-r--r--ext/tk/lib/tkextlib/blt/spline.rb24
-rw-r--r--ext/tk/lib/tkextlib/blt/stripchart.rb75
-rw-r--r--ext/tk/lib/tkextlib/blt/table.rb413
-rw-r--r--ext/tk/lib/tkextlib/blt/tabnotebook.rb111
-rw-r--r--ext/tk/lib/tkextlib/blt/tabset.rb505
-rw-r--r--ext/tk/lib/tkextlib/blt/ted.rb69
-rw-r--r--ext/tk/lib/tkextlib/blt/tile.rb26
-rw-r--r--ext/tk/lib/tkextlib/blt/tile/button.rb17
-rw-r--r--ext/tk/lib/tkextlib/blt/tile/checkbutton.rb18
-rw-r--r--ext/tk/lib/tkextlib/blt/tile/frame.rb17
-rw-r--r--ext/tk/lib/tkextlib/blt/tile/label.rb17
-rw-r--r--ext/tk/lib/tkextlib/blt/tile/radiobutton.rb18
-rw-r--r--ext/tk/lib/tkextlib/blt/tile/scrollbar.rb17
-rw-r--r--ext/tk/lib/tkextlib/blt/tile/toplevel.rb17
-rw-r--r--ext/tk/lib/tkextlib/blt/tree.rb1059
-rw-r--r--ext/tk/lib/tkextlib/blt/treeview.rb1288
-rw-r--r--ext/tk/lib/tkextlib/blt/unix_dnd.rb142
-rw-r--r--ext/tk/lib/tkextlib/blt/vector.rb257
-rw-r--r--ext/tk/lib/tkextlib/blt/watch.rb176
-rw-r--r--ext/tk/lib/tkextlib/blt/win_printer.rb62
-rw-r--r--ext/tk/lib/tkextlib/blt/winop.rb108
-rw-r--r--ext/tk/lib/tkextlib/bwidget.rb154
-rw-r--r--ext/tk/lib/tkextlib/bwidget/arrowbutton.rb22
-rw-r--r--ext/tk/lib/tkextlib/bwidget/bitmap.rb22
-rw-r--r--ext/tk/lib/tkextlib/bwidget/button.rb32
-rw-r--r--ext/tk/lib/tkextlib/bwidget/buttonbox.rb91
-rw-r--r--ext/tk/lib/tkextlib/bwidget/combobox.rb63
-rw-r--r--ext/tk/lib/tkextlib/bwidget/dialog.rb195
-rw-r--r--ext/tk/lib/tkextlib/bwidget/dragsite.rb32
-rw-r--r--ext/tk/lib/tkextlib/bwidget/dropsite.rb40
-rw-r--r--ext/tk/lib/tkextlib/bwidget/dynamichelp.rb64
-rw-r--r--ext/tk/lib/tkextlib/bwidget/entry.rb44
-rw-r--r--ext/tk/lib/tkextlib/bwidget/label.rb42
-rw-r--r--ext/tk/lib/tkextlib/bwidget/labelentry.rb81
-rw-r--r--ext/tk/lib/tkextlib/bwidget/labelframe.rb53
-rw-r--r--ext/tk/lib/tkextlib/bwidget/listbox.rb362
-rw-r--r--ext/tk/lib/tkextlib/bwidget/mainframe.rb133
-rw-r--r--ext/tk/lib/tkextlib/bwidget/messagedlg.rb193
-rw-r--r--ext/tk/lib/tkextlib/bwidget/notebook.rb167
-rw-r--r--ext/tk/lib/tkextlib/bwidget/pagesmanager.rb74
-rw-r--r--ext/tk/lib/tkextlib/bwidget/panedwindow.rb43
-rw-r--r--ext/tk/lib/tkextlib/bwidget/panelframe.rb68
-rw-r--r--ext/tk/lib/tkextlib/bwidget/passwddlg.rb45
-rw-r--r--ext/tk/lib/tkextlib/bwidget/progressbar.rb21
-rw-r--r--ext/tk/lib/tkextlib/bwidget/progressdlg.rb59
-rw-r--r--ext/tk/lib/tkextlib/bwidget/scrollableframe.rb41
-rw-r--r--ext/tk/lib/tkextlib/bwidget/scrolledwindow.rb49
-rw-r--r--ext/tk/lib/tkextlib/bwidget/scrollview.rb26
-rw-r--r--ext/tk/lib/tkextlib/bwidget/selectcolor.rb74
-rw-r--r--ext/tk/lib/tkextlib/bwidget/selectfont.rb92
-rw-r--r--ext/tk/lib/tkextlib/bwidget/separator.rb21
-rw-r--r--ext/tk/lib/tkextlib/bwidget/setup.rb9
-rw-r--r--ext/tk/lib/tkextlib/bwidget/spinbox.rb99
-rw-r--r--ext/tk/lib/tkextlib/bwidget/statusbar.rb63
-rw-r--r--ext/tk/lib/tkextlib/bwidget/titleframe.rb34
-rw-r--r--ext/tk/lib/tkextlib/bwidget/tree.rb501
-rw-r--r--ext/tk/lib/tkextlib/bwidget/widget.rb130
-rw-r--r--ext/tk/lib/tkextlib/itcl.rb14
-rw-r--r--ext/tk/lib/tkextlib/itcl/incr_tcl.rb179
-rw-r--r--ext/tk/lib/tkextlib/itcl/setup.rb14
-rw-r--r--ext/tk/lib/tkextlib/itk.rb14
-rw-r--r--ext/tk/lib/tkextlib/itk/incr_tk.rb447
-rw-r--r--ext/tk/lib/tkextlib/itk/setup.rb14
-rw-r--r--ext/tk/lib/tkextlib/iwidgets.rb95
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/buttonbox.rb122
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/calendar.rb126
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/canvasprintbox.rb54
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/canvasprintdialog.rb39
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/checkbox.rb131
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/combobox.rb105
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/dateentry.rb21
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/datefield.rb59
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/dialog.rb21
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/dialogshell.rb122
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/disjointlistbox.rb51
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/entryfield.rb186
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/extbutton.rb41
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/extfileselectionbox.rb47
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/extfileselectiondialog.rb34
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/feedback.rb36
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/fileselectionbox.rb47
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/fileselectiondialog.rb34
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/finddialog.rb43
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/hierarchy.rb366
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/hyperhelp.rb51
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/labeledframe.rb40
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/labeledwidget.rb46
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/mainwindow.rb68
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/menubar.rb213
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/messagebox.rb94
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/messagedialog.rb21
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/notebook.rb176
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/optionmenu.rb93
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/panedwindow.rb135
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/promptdialog.rb132
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/pushbutton.rb36
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/radiobox.rb122
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/scopedobject.rb25
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/scrolledcanvas.rb354
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/scrolledframe.rb60
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/scrolledhtml.rb59
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/scrolledlistbox.rb208
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/scrolledtext.rb569
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/scrolledwidget.rb21
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/selectionbox.rb103
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/selectiondialog.rb93
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/setup.rb9
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/shell.rb39
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/spindate.rb49
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/spinint.rb31
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/spinner.rb170
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/spintime.rb49
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/tabnotebook.rb182
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/tabset.rb146
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/timeentry.rb26
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/timefield.rb59
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/toolbar.rb113
-rw-r--r--ext/tk/lib/tkextlib/iwidgets/watch.rb57
-rwxr-xr-xext/tk/lib/tkextlib/pkg_checker.rb185
-rw-r--r--ext/tk/lib/tkextlib/setup.rb9
-rw-r--r--ext/tk/lib/tkextlib/tcllib.rb106
-rw-r--r--ext/tk/lib/tkextlib/tcllib/README135
-rw-r--r--ext/tk/lib/tkextlib/tcllib/autoscroll.rb159
-rw-r--r--ext/tk/lib/tkextlib/tcllib/calendar.rb56
-rw-r--r--ext/tk/lib/tkextlib/tcllib/canvas_sqmap.rb37
-rw-r--r--ext/tk/lib/tkextlib/tcllib/canvas_zoom.rb22
-rw-r--r--ext/tk/lib/tkextlib/tcllib/chatwidget.rb152
-rw-r--r--ext/tk/lib/tkextlib/tcllib/crosshair.rb118
-rw-r--r--ext/tk/lib/tkextlib/tcllib/ctext.rb161
-rw-r--r--ext/tk/lib/tkextlib/tcllib/cursor.rb98
-rw-r--r--ext/tk/lib/tkextlib/tcllib/dateentry.rb63
-rw-r--r--ext/tk/lib/tkextlib/tcllib/datefield.rb58
-rw-r--r--ext/tk/lib/tkextlib/tcllib/diagrams.rb225
-rw-r--r--ext/tk/lib/tkextlib/tcllib/dialog.rb85
-rw-r--r--ext/tk/lib/tkextlib/tcllib/getstring.rb135
-rw-r--r--ext/tk/lib/tkextlib/tcllib/history.rb74
-rw-r--r--ext/tk/lib/tkextlib/tcllib/ico.rb147
-rw-r--r--ext/tk/lib/tkextlib/tcllib/ip_entry.rb76
-rw-r--r--ext/tk/lib/tkextlib/tcllib/khim.rb69
-rw-r--r--ext/tk/lib/tkextlib/tcllib/menuentry.rb48
-rw-r--r--ext/tk/lib/tkextlib/tcllib/ntext.rb147
-rw-r--r--ext/tk/lib/tkextlib/tcllib/panelframe.rb79
-rw-r--r--ext/tk/lib/tkextlib/tcllib/plotchart.rb1405
-rw-r--r--ext/tk/lib/tkextlib/tcllib/ruler.rb66
-rw-r--r--ext/tk/lib/tkextlib/tcllib/screenruler.rb69
-rw-r--r--ext/tk/lib/tkextlib/tcllib/scrolledwindow.rb58
-rw-r--r--ext/tk/lib/tkextlib/tcllib/scrollwin.rb62
-rw-r--r--ext/tk/lib/tkextlib/tcllib/setup.rb9
-rw-r--r--ext/tk/lib/tkextlib/tcllib/statusbar.rb80
-rw-r--r--ext/tk/lib/tkextlib/tcllib/style.rb62
-rw-r--r--ext/tk/lib/tkextlib/tcllib/superframe.rb52
-rw-r--r--ext/tk/lib/tkextlib/tcllib/swaplist.rb151
-rw-r--r--ext/tk/lib/tkextlib/tcllib/tablelist.rb29
-rw-r--r--ext/tk/lib/tkextlib/tcllib/tablelist_core.rb1073
-rw-r--r--ext/tk/lib/tkextlib/tcllib/tablelist_tile.rb44
-rw-r--r--ext/tk/lib/tkextlib/tcllib/tkpiechart.rb315
-rw-r--r--ext/tk/lib/tkextlib/tcllib/toolbar.rb176
-rw-r--r--ext/tk/lib/tkextlib/tcllib/tooltip.rb105
-rw-r--r--ext/tk/lib/tkextlib/tcllib/validator.rb66
-rw-r--r--ext/tk/lib/tkextlib/tcllib/widget.rb83
-rw-r--r--ext/tk/lib/tkextlib/tclx.rb14
-rw-r--r--ext/tk/lib/tkextlib/tclx/setup.rb9
-rw-r--r--ext/tk/lib/tkextlib/tclx/tclx.rb75
-rw-r--r--ext/tk/lib/tkextlib/tile.rb450
-rw-r--r--ext/tk/lib/tkextlib/tile/dialog.rb103
-rw-r--r--ext/tk/lib/tkextlib/tile/setup.rb9
-rw-r--r--ext/tk/lib/tkextlib/tile/sizegrip.rb33
-rw-r--r--ext/tk/lib/tkextlib/tile/style.rb337
-rw-r--r--ext/tk/lib/tkextlib/tile/tbutton.rb35
-rw-r--r--ext/tk/lib/tkextlib/tile/tcheckbutton.rb39
-rw-r--r--ext/tk/lib/tkextlib/tile/tcombobox.rb56
-rw-r--r--ext/tk/lib/tkextlib/tile/tentry.rb50
-rw-r--r--ext/tk/lib/tkextlib/tile/tframe.rb35
-rw-r--r--ext/tk/lib/tkextlib/tile/tlabel.rb35
-rw-r--r--ext/tk/lib/tkextlib/tile/tlabelframe.rb39
-rw-r--r--ext/tk/lib/tkextlib/tile/tmenubutton.rb39
-rw-r--r--ext/tk/lib/tkextlib/tile/tnotebook.rb148
-rw-r--r--ext/tk/lib/tkextlib/tile/tpaned.rb246
-rw-r--r--ext/tk/lib/tkextlib/tile/tprogressbar.rb58
-rw-r--r--ext/tk/lib/tkextlib/tile/tradiobutton.rb39
-rw-r--r--ext/tk/lib/tkextlib/tile/treeview.rb1337
-rw-r--r--ext/tk/lib/tkextlib/tile/tscale.rb57
-rw-r--r--ext/tk/lib/tkextlib/tile/tscrollbar.rb64
-rw-r--r--ext/tk/lib/tkextlib/tile/tseparator.rb35
-rw-r--r--ext/tk/lib/tkextlib/tile/tspinbox.rb108
-rw-r--r--ext/tk/lib/tkextlib/tile/tsquare.rb31
-rw-r--r--ext/tk/lib/tkextlib/tkDND.rb19
-rw-r--r--ext/tk/lib/tkextlib/tkDND/setup.rb9
-rw-r--r--ext/tk/lib/tkextlib/tkDND/shape.rb126
-rw-r--r--ext/tk/lib/tkextlib/tkDND/tkdnd.rb183
-rw-r--r--ext/tk/lib/tkextlib/tkHTML.rb14
-rw-r--r--ext/tk/lib/tkextlib/tkHTML/htmlwidget.rb454
-rw-r--r--ext/tk/lib/tkextlib/tkHTML/setup.rb9
-rw-r--r--ext/tk/lib/tkextlib/tkimg.rb37
-rw-r--r--ext/tk/lib/tkextlib/tkimg/README26
-rw-r--r--ext/tk/lib/tkextlib/tkimg/bmp.rb34
-rw-r--r--ext/tk/lib/tkextlib/tkimg/dted.rb34
-rw-r--r--ext/tk/lib/tkextlib/tkimg/gif.rb34
-rw-r--r--ext/tk/lib/tkextlib/tkimg/ico.rb34
-rw-r--r--ext/tk/lib/tkextlib/tkimg/jpeg.rb34
-rw-r--r--ext/tk/lib/tkextlib/tkimg/pcx.rb34
-rw-r--r--ext/tk/lib/tkextlib/tkimg/pixmap.rb45
-rw-r--r--ext/tk/lib/tkextlib/tkimg/png.rb34
-rw-r--r--ext/tk/lib/tkextlib/tkimg/ppm.rb34
-rw-r--r--ext/tk/lib/tkextlib/tkimg/ps.rb34
-rw-r--r--ext/tk/lib/tkextlib/tkimg/raw.rb34
-rw-r--r--ext/tk/lib/tkextlib/tkimg/setup.rb9
-rw-r--r--ext/tk/lib/tkextlib/tkimg/sgi.rb34
-rw-r--r--ext/tk/lib/tkextlib/tkimg/sun.rb34
-rw-r--r--ext/tk/lib/tkextlib/tkimg/tga.rb34
-rw-r--r--ext/tk/lib/tkextlib/tkimg/tiff.rb34
-rw-r--r--ext/tk/lib/tkextlib/tkimg/window.rb34
-rw-r--r--ext/tk/lib/tkextlib/tkimg/xbm.rb34
-rw-r--r--ext/tk/lib/tkextlib/tkimg/xpm.rb34
-rw-r--r--ext/tk/lib/tkextlib/tktable.rb15
-rw-r--r--ext/tk/lib/tkextlib/tktable/setup.rb9
-rw-r--r--ext/tk/lib/tkextlib/tktable/tktable.rb967
-rw-r--r--ext/tk/lib/tkextlib/tktrans.rb15
-rw-r--r--ext/tk/lib/tkextlib/tktrans/setup.rb9
-rw-r--r--ext/tk/lib/tkextlib/tktrans/tktrans.rb65
-rw-r--r--ext/tk/lib/tkextlib/treectrl.rb14
-rw-r--r--ext/tk/lib/tkextlib/treectrl/setup.rb9
-rw-r--r--ext/tk/lib/tkextlib/treectrl/tktreectrl.rb2523
-rw-r--r--ext/tk/lib/tkextlib/trofs.rb14
-rw-r--r--ext/tk/lib/tkextlib/trofs/setup.rb9
-rw-r--r--ext/tk/lib/tkextlib/trofs/trofs.rb52
-rw-r--r--ext/tk/lib/tkextlib/version.rb7
-rw-r--r--ext/tk/lib/tkextlib/vu.rb49
-rw-r--r--ext/tk/lib/tkextlib/vu/bargraph.rb62
-rw-r--r--ext/tk/lib/tkextlib/vu/charts.rb54
-rw-r--r--ext/tk/lib/tkextlib/vu/dial.rb103
-rw-r--r--ext/tk/lib/tkextlib/vu/pie.rb287
-rw-r--r--ext/tk/lib/tkextlib/vu/setup.rb9
-rw-r--r--ext/tk/lib/tkextlib/vu/spinbox.rb23
-rw-r--r--ext/tk/lib/tkextlib/winico.rb15
-rw-r--r--ext/tk/lib/tkextlib/winico/setup.rb9
-rw-r--r--ext/tk/lib/tkextlib/winico/winico.rb225
-rw-r--r--ext/tk/lib/tkfont.rb5
-rw-r--r--ext/tk/lib/tkmacpkg.rb5
-rw-r--r--ext/tk/lib/tkmenubar.rb5
-rw-r--r--ext/tk/lib/tkmngfocus.rb5
-rw-r--r--ext/tk/lib/tkpalette.rb5
-rw-r--r--ext/tk/lib/tkscrollbox.rb5
-rw-r--r--ext/tk/lib/tktext.rb5
-rw-r--r--ext/tk/lib/tkvirtevent.rb5
-rw-r--r--ext/tk/lib/tkwinpkg.rb5
-rw-r--r--ext/tk/old-README.tcltklib.ja159
-rw-r--r--ext/tk/old-extconf.rb441
-rw-r--r--ext/tk/sample/24hr_clock.rb287
-rw-r--r--ext/tk/sample/binding_sample.rb88
-rw-r--r--ext/tk/sample/bindtag_sample.rb128
-rw-r--r--ext/tk/sample/binstr_usage.rb46
-rw-r--r--ext/tk/sample/btn_with_frame.rb21
-rw-r--r--ext/tk/sample/cd_timer.rb82
-rw-r--r--ext/tk/sample/cmd_res_test.rb18
-rw-r--r--ext/tk/sample/cmd_resource5
-rw-r--r--ext/tk/sample/demos-en/ChangeLog64
-rw-r--r--ext/tk/sample/demos-en/ChangeLog.prev9
-rw-r--r--ext/tk/sample/demos-en/README138
-rw-r--r--ext/tk/sample/demos-en/README.1st18
-rw-r--r--ext/tk/sample/demos-en/README.tkencoding29
-rw-r--r--ext/tk/sample/demos-en/anilabel.rb175
-rw-r--r--ext/tk/sample/demos-en/aniwave.rb119
-rw-r--r--ext/tk/sample/demos-en/arrow.rb250
-rw-r--r--ext/tk/sample/demos-en/bind.rb128
-rw-r--r--ext/tk/sample/demos-en/bitmap.rb76
-rw-r--r--ext/tk/sample/demos-en/browse163
-rw-r--r--ext/tk/sample/demos-en/browse282
-rw-r--r--ext/tk/sample/demos-en/button.rb85
-rw-r--r--ext/tk/sample/demos-en/check.rb73
-rw-r--r--ext/tk/sample/demos-en/check2.rb110
-rw-r--r--ext/tk/sample/demos-en/clrpick.rb88
-rw-r--r--ext/tk/sample/demos-en/colors.rb159
-rw-r--r--ext/tk/sample/demos-en/combo.rb97
-rw-r--r--ext/tk/sample/demos-en/cscroll.rb137
-rw-r--r--ext/tk/sample/demos-en/ctext.rb208
-rw-r--r--ext/tk/sample/demos-en/dialog1.rb39
-rw-r--r--ext/tk/sample/demos-en/dialog2.rb42
-rw-r--r--ext/tk/sample/demos-en/doc.org/README7
-rw-r--r--ext/tk/sample/demos-en/doc.org/README.JP14
-rw-r--r--ext/tk/sample/demos-en/doc.org/README.tk8046
-rw-r--r--ext/tk/sample/demos-en/doc.org/license.terms39
-rw-r--r--ext/tk/sample/demos-en/doc.org/license.terms.tk8039
-rw-r--r--ext/tk/sample/demos-en/entry1.rb59
-rw-r--r--ext/tk/sample/demos-en/entry2.rb94
-rw-r--r--ext/tk/sample/demos-en/entry3.rb221
-rw-r--r--ext/tk/sample/demos-en/filebox.rb103
-rw-r--r--ext/tk/sample/demos-en/floor.rb1724
-rw-r--r--ext/tk/sample/demos-en/floor2.rb1723
-rw-r--r--ext/tk/sample/demos-en/form.rb65
-rw-r--r--ext/tk/sample/demos-en/goldberg.rb2007
-rw-r--r--ext/tk/sample/demos-en/hello14
-rw-r--r--ext/tk/sample/demos-en/hscale.rb76
-rw-r--r--ext/tk/sample/demos-en/icon.rb106
-rw-r--r--ext/tk/sample/demos-en/image1.rb66
-rw-r--r--ext/tk/sample/demos-en/image2.rb108
-rw-r--r--ext/tk/sample/demos-en/image3.rb126
-rw-r--r--ext/tk/sample/demos-en/items.rb382
-rw-r--r--ext/tk/sample/demos-en/ixset333
-rw-r--r--ext/tk/sample/demos-en/ixset2367
-rw-r--r--ext/tk/sample/demos-en/knightstour.rb272
-rw-r--r--ext/tk/sample/demos-en/label.rb73
-rw-r--r--ext/tk/sample/demos-en/labelframe.rb96
-rw-r--r--ext/tk/sample/demos-en/mclist.rb118
-rw-r--r--ext/tk/sample/demos-en/menu.rb197
-rw-r--r--ext/tk/sample/demos-en/menu84.rb216
-rw-r--r--ext/tk/sample/demos-en/menubu.rb238
-rw-r--r--ext/tk/sample/demos-en/msgbox.rb91
-rw-r--r--ext/tk/sample/demos-en/msgbox2.rb92
-rw-r--r--ext/tk/sample/demos-en/paned1.rb48
-rw-r--r--ext/tk/sample/demos-en/paned2.rb95
-rw-r--r--ext/tk/sample/demos-en/pendulum.rb241
-rw-r--r--ext/tk/sample/demos-en/plot.rb125
-rw-r--r--ext/tk/sample/demos-en/puzzle.rb135
-rw-r--r--ext/tk/sample/demos-en/radio.rb87
-rw-r--r--ext/tk/sample/demos-en/radio2.rb110
-rw-r--r--ext/tk/sample/demos-en/radio3.rb118
-rw-r--r--ext/tk/sample/demos-en/rmt268
-rw-r--r--ext/tk/sample/demos-en/rolodex320
-rw-r--r--ext/tk/sample/demos-en/ruler.rb206
-rw-r--r--ext/tk/sample/demos-en/sayings.rb107
-rw-r--r--ext/tk/sample/demos-en/search.rb188
-rw-r--r--ext/tk/sample/demos-en/spin.rb66
-rw-r--r--ext/tk/sample/demos-en/square81
-rw-r--r--ext/tk/sample/demos-en/states.rb81
-rw-r--r--ext/tk/sample/demos-en/style.rb232
-rw-r--r--ext/tk/sample/demos-en/tcolor526
-rw-r--r--ext/tk/sample/demos-en/text.rb129
-rw-r--r--ext/tk/sample/demos-en/textpeer.rb77
-rw-r--r--ext/tk/sample/demos-en/timer136
-rw-r--r--ext/tk/sample/demos-en/tkencoding.rb43
-rw-r--r--ext/tk/sample/demos-en/toolbar.rb131
-rw-r--r--ext/tk/sample/demos-en/tree.rb120
-rw-r--r--ext/tk/sample/demos-en/ttkbut.rb140
-rw-r--r--ext/tk/sample/demos-en/ttkmenu.rb86
-rw-r--r--ext/tk/sample/demos-en/ttknote.rb90
-rw-r--r--ext/tk/sample/demos-en/ttkpane.rb214
-rw-r--r--ext/tk/sample/demos-en/ttkprogress.rb67
-rw-r--r--ext/tk/sample/demos-en/twind.rb292
-rw-r--r--ext/tk/sample/demos-en/twind2.rb385
-rw-r--r--ext/tk/sample/demos-en/unicodeout.rb115
-rw-r--r--ext/tk/sample/demos-en/vscale.rb80
-rw-r--r--ext/tk/sample/demos-en/widget1087
-rw-r--r--ext/tk/sample/demos-jp/README54
-rw-r--r--ext/tk/sample/demos-jp/README.1st20
-rw-r--r--ext/tk/sample/demos-jp/anilabel.rb178
-rw-r--r--ext/tk/sample/demos-jp/aniwave.rb121
-rw-r--r--ext/tk/sample/demos-jp/arrow.rb248
-rw-r--r--ext/tk/sample/demos-jp/bind.rb126
-rw-r--r--ext/tk/sample/demos-jp/bitmap.rb75
-rw-r--r--ext/tk/sample/demos-jp/browse163
-rw-r--r--ext/tk/sample/demos-jp/browse282
-rw-r--r--ext/tk/sample/demos-jp/button.rb84
-rw-r--r--ext/tk/sample/demos-jp/check.rb71
-rw-r--r--ext/tk/sample/demos-jp/check2.rb111
-rw-r--r--ext/tk/sample/demos-jp/clrpick.rb85
-rw-r--r--ext/tk/sample/demos-jp/colors.rb156
-rw-r--r--ext/tk/sample/demos-jp/combo.rb99
-rw-r--r--ext/tk/sample/demos-jp/cscroll.rb135
-rw-r--r--ext/tk/sample/demos-jp/ctext.rb205
-rw-r--r--ext/tk/sample/demos-jp/dialog1.rb40
-rw-r--r--ext/tk/sample/demos-jp/dialog2.rb44
-rw-r--r--ext/tk/sample/demos-jp/doc.org/README7
-rw-r--r--ext/tk/sample/demos-jp/doc.org/README.JP14
-rw-r--r--ext/tk/sample/demos-jp/doc.org/README.tk8046
-rw-r--r--ext/tk/sample/demos-jp/doc.org/license.terms39
-rw-r--r--ext/tk/sample/demos-jp/doc.org/license.terms.tk8039
-rw-r--r--ext/tk/sample/demos-jp/entry1.rb61
-rw-r--r--ext/tk/sample/demos-jp/entry2.rb92
-rw-r--r--ext/tk/sample/demos-jp/entry3.rb226
-rw-r--r--ext/tk/sample/demos-jp/filebox.rb103
-rw-r--r--ext/tk/sample/demos-jp/floor.rb1722
-rw-r--r--ext/tk/sample/demos-jp/floor2.rb1720
-rw-r--r--ext/tk/sample/demos-jp/form.rb67
-rw-r--r--ext/tk/sample/demos-jp/goldberg.rb2012
-rw-r--r--ext/tk/sample/demos-jp/hello10
-rw-r--r--ext/tk/sample/demos-jp/hscale.rb79
-rw-r--r--ext/tk/sample/demos-jp/icon.rb104
-rw-r--r--ext/tk/sample/demos-jp/image1.rb65
-rw-r--r--ext/tk/sample/demos-jp/image2.rb107
-rw-r--r--ext/tk/sample/demos-jp/image3.rb128
-rw-r--r--ext/tk/sample/demos-jp/items.rb380
-rw-r--r--ext/tk/sample/demos-jp/ixset333
-rw-r--r--ext/tk/sample/demos-jp/ixset2369
-rw-r--r--ext/tk/sample/demos-jp/knightstour.rb274
-rw-r--r--ext/tk/sample/demos-jp/label.rb70
-rw-r--r--ext/tk/sample/demos-jp/labelframe.rb103
-rw-r--r--ext/tk/sample/demos-jp/mclist.rb122
-rw-r--r--ext/tk/sample/demos-jp/menu.rb202
-rw-r--r--ext/tk/sample/demos-jp/menu84.rb214
-rw-r--r--ext/tk/sample/demos-jp/menu8x.rb234
-rw-r--r--ext/tk/sample/demos-jp/menubu.rb239
-rw-r--r--ext/tk/sample/demos-jp/msgbox.rb90
-rw-r--r--ext/tk/sample/demos-jp/msgbox2.rb91
-rw-r--r--ext/tk/sample/demos-jp/paned1.rb53
-rw-r--r--ext/tk/sample/demos-jp/paned2.rb101
-rw-r--r--ext/tk/sample/demos-jp/pendulum.rb243
-rw-r--r--ext/tk/sample/demos-jp/plot.rb127
-rw-r--r--ext/tk/sample/demos-jp/puzzle.rb132
-rw-r--r--ext/tk/sample/demos-jp/radio.rb85
-rw-r--r--ext/tk/sample/demos-jp/radio2.rb113
-rw-r--r--ext/tk/sample/demos-jp/radio3.rb120
-rw-r--r--ext/tk/sample/demos-jp/rmt268
-rw-r--r--ext/tk/sample/demos-jp/rolodex320
-rw-r--r--ext/tk/sample/demos-jp/rolodex-j300
-rw-r--r--ext/tk/sample/demos-jp/ruler.rb204
-rw-r--r--ext/tk/sample/demos-jp/sayings.rb104
-rw-r--r--ext/tk/sample/demos-jp/search.rb185
-rw-r--r--ext/tk/sample/demos-jp/spin.rb72
-rw-r--r--ext/tk/sample/demos-jp/square81
-rw-r--r--ext/tk/sample/demos-jp/states.rb75
-rw-r--r--ext/tk/sample/demos-jp/style.rb271
-rw-r--r--ext/tk/sample/demos-jp/tcolor534
-rw-r--r--ext/tk/sample/demos-jp/text.rb121
-rw-r--r--ext/tk/sample/demos-jp/textpeer.rb83
-rw-r--r--ext/tk/sample/demos-jp/timer136
-rw-r--r--ext/tk/sample/demos-jp/toolbar.rb137
-rw-r--r--ext/tk/sample/demos-jp/tree.rb121
-rw-r--r--ext/tk/sample/demos-jp/ttkbut.rb146
-rw-r--r--ext/tk/sample/demos-jp/ttkmenu.rb92
-rw-r--r--ext/tk/sample/demos-jp/ttknote.rb98
-rw-r--r--ext/tk/sample/demos-jp/ttkpane.rb217
-rw-r--r--ext/tk/sample/demos-jp/ttkprogress.rb72
-rw-r--r--ext/tk/sample/demos-jp/twind.rb293
-rw-r--r--ext/tk/sample/demos-jp/twind2.rb385
-rw-r--r--ext/tk/sample/demos-jp/unicodeout.rb120
-rw-r--r--ext/tk/sample/demos-jp/vscale.rb81
-rw-r--r--ext/tk/sample/demos-jp/widget1122
-rw-r--r--ext/tk/sample/editable_listbox.rb149
-rw-r--r--ext/tk/sample/encstr_usage.rb31
-rw-r--r--ext/tk/sample/figmemo_sample.rb457
-rw-r--r--ext/tk/sample/images/earth.gifbin0 -> 51712 bytes-rw-r--r--ext/tk/sample/images/earthris.gifbin0 -> 6343 bytes-rw-r--r--ext/tk/sample/images/face.xbm173
-rw-r--r--ext/tk/sample/images/flagdown.xbm27
-rw-r--r--ext/tk/sample/images/flagup.xbm27
-rw-r--r--ext/tk/sample/images/gray25.xbm6
-rw-r--r--ext/tk/sample/images/grey.256
-rw-r--r--ext/tk/sample/images/grey.56
-rw-r--r--ext/tk/sample/images/letters.xbm27
-rw-r--r--ext/tk/sample/images/noletter.xbm27
-rw-r--r--ext/tk/sample/images/pattern.xbm6
-rw-r--r--ext/tk/sample/images/tcllogo.gifbin0 -> 2341 bytes-rw-r--r--ext/tk/sample/images/teapot.ppm31
-rw-r--r--ext/tk/sample/irbtk.rb31
-rw-r--r--ext/tk/sample/irbtkw.rbw156
-rw-r--r--ext/tk/sample/iso2022-kr.txt2
-rw-r--r--ext/tk/sample/menubar1.rb52
-rw-r--r--ext/tk/sample/menubar2.rb57
-rw-r--r--ext/tk/sample/menubar3.rb73
-rw-r--r--ext/tk/sample/msgs_rb/README3
-rw-r--r--ext/tk/sample/msgs_rb/cs.msg84
-rw-r--r--ext/tk/sample/msgs_rb/de.msg88
-rw-r--r--ext/tk/sample/msgs_rb/el.msg98
-rw-r--r--ext/tk/sample/msgs_rb/en.msg83
-rw-r--r--ext/tk/sample/msgs_rb/en_gb.msg7
-rw-r--r--ext/tk/sample/msgs_rb/eo.msg87
-rw-r--r--ext/tk/sample/msgs_rb/es.msg84
-rw-r--r--ext/tk/sample/msgs_rb/fr.msg84
-rw-r--r--ext/tk/sample/msgs_rb/it.msg84
-rw-r--r--ext/tk/sample/msgs_rb/ja.msg13
-rw-r--r--ext/tk/sample/msgs_rb/nl.msg123
-rw-r--r--ext/tk/sample/msgs_rb/pl.msg87
-rw-r--r--ext/tk/sample/msgs_rb/ru.msg87
-rw-r--r--ext/tk/sample/msgs_rb2/README5
-rw-r--r--ext/tk/sample/msgs_rb2/de.msg88
-rw-r--r--ext/tk/sample/msgs_rb2/ja.msg85
-rw-r--r--ext/tk/sample/msgs_tk/README4
-rw-r--r--ext/tk/sample/msgs_tk/cs.msg84
-rw-r--r--ext/tk/sample/msgs_tk/de.msg88
-rw-r--r--ext/tk/sample/msgs_tk/el.msg103
-rw-r--r--ext/tk/sample/msgs_tk/en.msg83
-rw-r--r--ext/tk/sample/msgs_tk/en_gb.msg7
-rw-r--r--ext/tk/sample/msgs_tk/eo.msg87
-rw-r--r--ext/tk/sample/msgs_tk/es.msg84
-rw-r--r--ext/tk/sample/msgs_tk/fr.msg84
-rw-r--r--ext/tk/sample/msgs_tk/it.msg84
-rw-r--r--ext/tk/sample/msgs_tk/ja.msg13
-rw-r--r--ext/tk/sample/msgs_tk/license.terms39
-rw-r--r--ext/tk/sample/msgs_tk/nl.msg123
-rw-r--r--ext/tk/sample/msgs_tk/pl.msg87
-rw-r--r--ext/tk/sample/msgs_tk/ru.msg87
-rw-r--r--ext/tk/sample/multi-ip_sample.rb104
-rw-r--r--ext/tk/sample/multi-ip_sample2.rb30
-rw-r--r--ext/tk/sample/optobj_sample.rb68
-rw-r--r--ext/tk/sample/propagate.rb31
-rw-r--r--ext/tk/sample/remote-ip_sample.rb34
-rw-r--r--ext/tk/sample/remote-ip_sample2.rb57
-rw-r--r--ext/tk/sample/resource.en13
-rw-r--r--ext/tk/sample/resource.ja13
-rwxr-xr-xext/tk/sample/safe-tk.rb132
-rw-r--r--ext/tk/sample/scrollframe.rb250
-rw-r--r--ext/tk/sample/tcltklib/batsu.gifbin0 -> 538 bytes-rw-r--r--ext/tk/sample/tcltklib/lines0.tcl42
-rw-r--r--ext/tk/sample/tcltklib/lines1.rb51
-rw-r--r--ext/tk/sample/tcltklib/lines2.rb55
-rw-r--r--ext/tk/sample/tcltklib/lines3.rb55
-rw-r--r--ext/tk/sample/tcltklib/lines4.rb55
-rw-r--r--ext/tk/sample/tcltklib/maru.gifbin0 -> 481 bytes-rw-r--r--ext/tk/sample/tcltklib/safeTk.rb23
-rw-r--r--ext/tk/sample/tcltklib/sample0.rb40
-rw-r--r--ext/tk/sample/tcltklib/sample1.rb635
-rw-r--r--ext/tk/sample/tcltklib/sample2.rb452
-rw-r--r--ext/tk/sample/tkalignbox.rb236
-rw-r--r--ext/tk/sample/tkballoonhelp.rb221
-rw-r--r--ext/tk/sample/tkbiff.rb156
-rw-r--r--ext/tk/sample/tkbrowse.rb80
-rw-r--r--ext/tk/sample/tkcombobox.rb498
-rw-r--r--ext/tk/sample/tkdialog.rb62
-rw-r--r--ext/tk/sample/tkextlib/ICONS/Orig_LICENSE.txt61
-rw-r--r--ext/tk/sample/tkextlib/ICONS/tkIcons195
-rw-r--r--ext/tk/sample/tkextlib/ICONS/tkIcons-sample.kde658
-rw-r--r--ext/tk/sample/tkextlib/ICONS/tkIcons.kde195
-rw-r--r--ext/tk/sample/tkextlib/ICONS/viewIcons.rb330
-rw-r--r--ext/tk/sample/tkextlib/blt/barchart5.rb102
-rw-r--r--ext/tk/sample/tkextlib/blt/calendar.rb118
-rw-r--r--ext/tk/sample/tkextlib/blt/graph6.rb2223
-rw-r--r--ext/tk/sample/tkextlib/blt/graph7.rb41
-rw-r--r--ext/tk/sample/tkextlib/blt/graph7a.rb64
-rw-r--r--ext/tk/sample/tkextlib/blt/graph7b.rb42
-rw-r--r--ext/tk/sample/tkextlib/blt/graph7c.rb46
-rw-r--r--ext/tk/sample/tkextlib/blt/images/buckskin.gifbin0 -> 7561 bytes-rw-r--r--ext/tk/sample/tkextlib/blt/images/chalk.gifbin0 -> 4378 bytes-rw-r--r--ext/tk/sample/tkextlib/blt/images/qv100.t.gifbin0 -> 2694 bytes-rw-r--r--ext/tk/sample/tkextlib/blt/images/rain.gifbin0 -> 3785 bytes-rw-r--r--ext/tk/sample/tkextlib/blt/images/sample.gifbin0 -> 186103 bytes-rw-r--r--ext/tk/sample/tkextlib/blt/pareto.rb91
-rw-r--r--ext/tk/sample/tkextlib/blt/plot1.rb10
-rw-r--r--ext/tk/sample/tkextlib/blt/plot1b.rb11
-rw-r--r--ext/tk/sample/tkextlib/blt/readme.txt2
-rw-r--r--ext/tk/sample/tkextlib/blt/scripts/stipples.rb157
-rw-r--r--ext/tk/sample/tkextlib/blt/winop1.rb41
-rw-r--r--ext/tk/sample/tkextlib/blt/winop2.rb29
-rw-r--r--ext/tk/sample/tkextlib/bwidget/Orig_LICENSE.txt53
-rw-r--r--ext/tk/sample/tkextlib/bwidget/basic.rb199
-rw-r--r--ext/tk/sample/tkextlib/bwidget/bwidget.xbm46
-rw-r--r--ext/tk/sample/tkextlib/bwidget/demo.rb244
-rw-r--r--ext/tk/sample/tkextlib/bwidget/dnd.rb47
-rw-r--r--ext/tk/sample/tkextlib/bwidget/manager.rb151
-rw-r--r--ext/tk/sample/tkextlib/bwidget/select.rb83
-rw-r--r--ext/tk/sample/tkextlib/bwidget/tmpldlg.rb222
-rw-r--r--ext/tk/sample/tkextlib/bwidget/tree.rb290
-rw-r--r--ext/tk/sample/tkextlib/bwidget/x1.xbm2258
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/catalog_demo/Orig_LICENSE.txt42
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/box.xbm14
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/clear.gifbin0 -> 279 bytes-rw-r--r--ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/close.gifbin0 -> 249 bytes-rw-r--r--ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/copy.gifbin0 -> 269 bytes-rw-r--r--ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/cut.gifbin0 -> 179 bytes-rw-r--r--ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/exit.gifbin0 -> 396 bytes-rw-r--r--ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/find.gifbin0 -> 386 bytes-rw-r--r--ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/help.gifbin0 -> 591 bytes-rw-r--r--ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/line.xbm14
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/mag.gifbin0 -> 183 bytes-rw-r--r--ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/new.gifbin0 -> 212 bytes-rw-r--r--ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/open.gifbin0 -> 258 bytes-rw-r--r--ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/oval.xbm14
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/paste.gifbin0 -> 376 bytes-rw-r--r--ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/points.xbm14
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/poly.gifbin0 -> 141 bytes-rw-r--r--ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/print.gifbin0 -> 263 bytes-rw-r--r--ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/ruler.gifbin0 -> 174 bytes-rw-r--r--ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/save.gifbin0 -> 270 bytes-rw-r--r--ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/select.gifbin0 -> 124 bytes-rw-r--r--ext/tk/sample/tkextlib/iwidgets/catalog_demo/images/text.xbm14
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/buttonbox.rb23
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/calendar.rb11
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/canvasprintbox.rb9
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/canvasprintdialog.rb9
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/checkbox.rb13
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/combobox.rb33
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/dateentry.rb8
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/datefield.rb9
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/dialog.rb21
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/dialogshell.rb15
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/disjointlistbox.rb17
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/entryfield-1.rb40
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/entryfield-2.rb45
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/entryfield-3.rb41
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/extbutton.rb21
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/extfileselectionbox.rb9
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/extfileselectiondialog.rb30
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/feedback.rb11
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/fileselectionbox.rb9
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/fileselectiondialog.rb29
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/finddialog.rb16
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/hierarchy.rb26
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/hyperhelp.rb15
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/labeledframe.rb15
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/labeledwidget.rb14
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/mainwindow.rb65
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/menubar.rb125
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/menubar2.rb45
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/messagebox1.rb20
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/messagebox2.rb20
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/messagedialog.rb45
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/notebook.rb31
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/notebook2.rb31
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/optionmenu.rb15
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/panedwindow.rb23
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/panedwindow2.rb23
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/promptdialog.rb18
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/pushbutton.rb10
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/radiobox.rb14
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/scrolledcanvas.rb14
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/scrolledframe.rb19
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/scrolledhtml.rb16
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/scrolledlistbox.rb23
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/scrolledtext.rb12
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/selectionbox.rb20
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/selectiondialog.rb13
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/shell.rb18
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/spindate.rb8
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/spinint.rb11
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/spinner.rb34
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/spintime.rb8
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/tabnotebook.rb27
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/tabnotebook2.rb31
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/tabset.rb35
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/timeentry.rb8
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/timefield.rb9
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/toolbar.rb153
-rw-r--r--ext/tk/sample/tkextlib/iwidgets/sample/watch.rb19
-rw-r--r--ext/tk/sample/tkextlib/tcllib/Orig_LICENSE.txt46
-rw-r--r--ext/tk/sample/tkextlib/tcllib/datefield.rb30
-rw-r--r--ext/tk/sample/tkextlib/tcllib/plotdemos1.rb159
-rw-r--r--ext/tk/sample/tkextlib/tcllib/plotdemos2.rb72
-rw-r--r--ext/tk/sample/tkextlib/tcllib/plotdemos3.rb84
-rw-r--r--ext/tk/sample/tkextlib/tcllib/xyplot.rb18
-rw-r--r--ext/tk/sample/tkextlib/tile/Orig_LICENSE.txt30
-rw-r--r--ext/tk/sample/tkextlib/tile/demo.rb984
-rw-r--r--ext/tk/sample/tkextlib/tile/iconlib.tcl110
-rw-r--r--ext/tk/sample/tkextlib/tile/readme.txt2
-rw-r--r--ext/tk/sample/tkextlib/tile/repeater.tcl117
-rw-r--r--ext/tk/sample/tkextlib/tile/themes/blue/blue.tcl149
-rw-r--r--ext/tk/sample/tkextlib/tile/themes/blue/blue/arrowdown-h.gifbin0 -> 315 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/blue/blue/arrowdown-p.gifbin0 -> 312 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/blue/blue/arrowdown.gifbin0 -> 313 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/blue/blue/arrowleft-h.gifbin0 -> 329 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/blue/blue/arrowleft-p.gifbin0 -> 327 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/blue/blue/arrowleft.gifbin0 -> 323 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/blue/blue/arrowright-h.gifbin0 -> 330 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/blue/blue/arrowright-p.gifbin0 -> 327 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/blue/blue/arrowright.gifbin0 -> 324 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/blue/blue/arrowup-h.gifbin0 -> 309 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/blue/blue/arrowup-p.gifbin0 -> 313 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/blue/blue/arrowup.gifbin0 -> 314 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/blue/blue/button-h.gifbin0 -> 696 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/blue/blue/button-n.gifbin0 -> 770 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/blue/blue/button-n.xcfbin0 -> 1942 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/blue/blue/button-p.gifbin0 -> 769 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/blue/blue/check-hc.gifbin0 -> 254 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/blue/blue/check-hu.gifbin0 -> 234 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/blue/blue/check-nc.gifbin0 -> 249 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/blue/blue/check-nu.gifbin0 -> 229 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/blue/blue/radio-hc.gifbin0 -> 1098 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/blue/blue/radio-hu.gifbin0 -> 626 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/blue/blue/radio-nc.gifbin0 -> 389 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/blue/blue/radio-nu.gifbin0 -> 401 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/blue/blue/sb-thumb-p.gifbin0 -> 343 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/blue/blue/sb-thumb.gifbin0 -> 316 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/blue/blue/sb-vthumb-p.gifbin0 -> 333 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/blue/blue/sb-vthumb.gifbin0 -> 308 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/blue/blue/slider-p.gifbin0 -> 182 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/blue/blue/slider.gifbin0 -> 182 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/blue/blue/vslider-p.gifbin0 -> 183 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/blue/blue/vslider.gifbin0 -> 283 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/blue/pkgIndex.tcl6
-rw-r--r--ext/tk/sample/tkextlib/tile/themes/keramik/keramik.tcl194
-rw-r--r--ext/tk/sample/tkextlib/tile/themes/keramik/keramik/arrowdown-n.gifbin0 -> 273 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/keramik/keramik/arrowdown-p.gifbin0 -> 258 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/keramik/keramik/arrowleft-n.gifbin0 -> 292 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/keramik/keramik/arrowleft-p.gifbin0 -> 272 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/keramik/keramik/arrowright-n.gifbin0 -> 274 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/keramik/keramik/arrowright-p.gifbin0 -> 258 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/keramik/keramik/arrowup-n.gifbin0 -> 286 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/keramik/keramik/arrowup-p.gifbin0 -> 271 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/keramik/keramik/button-d.gifbin0 -> 1266 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/keramik/keramik/button-h.gifbin0 -> 896 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/keramik/keramik/button-n.gifbin0 -> 881 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/keramik/keramik/button-p.gifbin0 -> 625 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/keramik/keramik/button-s.gifbin0 -> 859 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/keramik/keramik/check-c.gifbin0 -> 434 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/keramik/keramik/check-u.gifbin0 -> 423 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/keramik/keramik/hsb-n.gifbin0 -> 401 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/keramik/keramik/hsb-p.gifbin0 -> 395 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/keramik/keramik/hslider-n.gifbin0 -> 592 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/keramik/keramik/mbut-a.gifbin0 -> 1116 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/keramik/keramik/mbut-arrow-n.gifbin0 -> 61 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/keramik/keramik/mbut-d.gifbin0 -> 1057 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/keramik/keramik/mbut-n.gifbin0 -> 1095 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/keramik/keramik/radio-c.gifbin0 -> 695 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/keramik/keramik/radio-u.gifbin0 -> 686 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/keramik/keramik/tab-n.gifbin0 -> 383 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/keramik/keramik/tab-p.gifbin0 -> 878 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/keramik/keramik/tbar-a.gifbin0 -> 907 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/keramik/keramik/tbar-n.gifbin0 -> 238 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/keramik/keramik/tbar-p.gifbin0 -> 927 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/keramik/keramik/vsb-n.gifbin0 -> 405 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/keramik/keramik/vsb-p.gifbin0 -> 399 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/keramik/keramik/vslider-n.gifbin0 -> 587 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/keramik/pkgIndex.tcl15
-rw-r--r--ext/tk/sample/tkextlib/tile/themes/kroc.rb227
-rw-r--r--ext/tk/sample/tkextlib/tile/themes/kroc/kroc.tcl163
-rw-r--r--ext/tk/sample/tkextlib/tile/themes/kroc/kroc/button-h.gifbin0 -> 522 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/kroc/kroc/button-n.gifbin0 -> 554 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/kroc/kroc/button-p.gifbin0 -> 548 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/kroc/kroc/check-hc.gifbin0 -> 281 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/kroc/kroc/check-hu.gifbin0 -> 273 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/kroc/kroc/check-nc.gifbin0 -> 303 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/kroc/kroc/check-nu.gifbin0 -> 294 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/kroc/kroc/radio-hc.gifbin0 -> 652 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/kroc/kroc/radio-hu.gifbin0 -> 644 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/kroc/kroc/radio-nc.gifbin0 -> 632 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/kroc/kroc/radio-nu.gifbin0 -> 621 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/kroc/pkgIndex.tcl15
-rw-r--r--ext/tk/sample/tkextlib/tile/themes/plastik/pkgIndex.tcl16
-rw-r--r--ext/tk/sample/tkextlib/tile/themes/plastik/plastik.tcl125
-rw-r--r--ext/tk/sample/tkextlib/tile/themes/plastik/plastik/arrowdown-n.gifbin0 -> 362 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/plastik/plastik/arrowdown-p.gifbin0 -> 250 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/plastik/plastik/arrowleft-n.gifbin0 -> 378 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/plastik/plastik/arrowleft-p.gifbin0 -> 267 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/plastik/plastik/arrowright-n.gifbin0 -> 379 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/plastik/plastik/arrowright-p.gifbin0 -> 266 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/plastik/plastik/arrowup-n.gifbin0 -> 363 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/plastik/plastik/arrowup-p.gifbin0 -> 251 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/plastik/plastik/button-h.gifbin0 -> 439 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/plastik/plastik/button-n.gifbin0 -> 443 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/plastik/plastik/button-p.gifbin0 -> 302 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/plastik/plastik/check-hc.gifbin0 -> 169 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/plastik/plastik/check-hu.gifbin0 -> 170 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/plastik/plastik/check-nc.gifbin0 -> 235 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/plastik/plastik/check-nu.gifbin0 -> 226 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/plastik/plastik/check-pc.gifbin0 -> 169 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/plastik/plastik/hsb-n.gifbin0 -> 269 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/plastik/plastik/hslider-n.gifbin0 -> 342 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/plastik/plastik/radio-hc.gifbin0 -> 178 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/plastik/plastik/radio-hu.gifbin0 -> 179 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/plastik/plastik/radio-nc.gifbin0 -> 236 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/plastik/plastik/radio-nu.gifbin0 -> 178 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/plastik/plastik/radio-pc.gifbin0 -> 178 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/plastik/plastik/vsb-n.gifbin0 -> 366 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/themes/plastik/plastik/vslider-n.gifbin0 -> 336 bytes-rw-r--r--ext/tk/sample/tkextlib/tile/toolbutton.tcl152
-rw-r--r--ext/tk/sample/tkextlib/tkHTML/Orig_COPYRIGHT.txt12
-rw-r--r--ext/tk/sample/tkextlib/tkHTML/README12
-rw-r--r--ext/tk/sample/tkextlib/tkHTML/hv.rb314
-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page1/image1bin0 -> 8995 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page1/image10bin0 -> 3095 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page1/image11bin0 -> 1425 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page1/image12bin0 -> 2468 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page1/image13bin0 -> 4073 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page1/image14bin0 -> 53 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page1/image2bin0 -> 42 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page1/image3bin0 -> 3473 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page1/image4bin0 -> 1988 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page1/image5bin0 -> 973 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page1/image6bin0 -> 2184 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page1/image7bin0 -> 2022 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page1/image8bin0 -> 1186 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page1/image9bin0 -> 139 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page1/index.html115
-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page2/image1bin0 -> 1966 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page2/image10bin0 -> 255 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page2/image11bin0 -> 590 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page2/image12bin0 -> 254 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page2/image13bin0 -> 493 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page2/image14bin0 -> 195 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page2/image15bin0 -> 68 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page2/image16bin0 -> 157 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page2/image17bin0 -> 81 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page2/image18bin0 -> 545 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page2/image19bin0 -> 53 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page2/image2bin0 -> 49 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page2/image20bin0 -> 533 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page2/image21bin0 -> 564 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page2/image22bin0 -> 81 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page2/image23bin0 -> 539 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page2/image24bin0 -> 151 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page2/image25bin0 -> 453 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page2/image26bin0 -> 520 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page2/image27bin0 -> 565 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page2/image28bin0 -> 416 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page2/image29bin0 -> 121 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page2/image3bin0 -> 10835 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page2/image30bin0 -> 663 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page2/image31bin0 -> 78 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page2/image32bin0 -> 556 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page2/image33bin0 -> 598 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page2/image34bin0 -> 496 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page2/image35bin0 -> 724 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page2/image36bin0 -> 404 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page2/image37bin0 -> 124 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page2/image38bin0 -> 8330 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page2/image39bin0 -> 369 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page2/image4bin0 -> 268 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page2/image5bin0 -> 492 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page2/image6bin0 -> 246 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page2/image7bin0 -> 551 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page2/image8bin0 -> 497 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page2/image9bin0 -> 492 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page2/index.html433
-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page3/image1bin0 -> 113 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page3/image10bin0 -> 5088 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page3/image11bin0 -> 4485 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page3/image12bin0 -> 3579 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page3/image13bin0 -> 5119 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page3/image14bin0 -> 3603 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page3/image2bin0 -> 74 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page3/image3bin0 -> 681 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page3/image4bin0 -> 3056 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page3/image5bin0 -> 2297 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page3/image6bin0 -> 79 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page3/image7bin0 -> 1613 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page3/image8bin0 -> 864 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page3/image9bin0 -> 2379 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page3/index.html2787
-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page4/image1bin0 -> 42 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page4/image2bin0 -> 14343 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page4/image3bin0 -> 17750 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page4/image4bin0 -> 61 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page4/image5bin0 -> 201 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page4/image6bin0 -> 214 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page4/image7bin0 -> 149 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page4/image8bin0 -> 203 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page4/image9bin0 -> 1504 bytes-rw-r--r--ext/tk/sample/tkextlib/tkHTML/page4/index.html768
-rw-r--r--ext/tk/sample/tkextlib/tkHTML/ss.rb437
-rw-r--r--ext/tk/sample/tkextlib/tkimg/demo.rb1479
-rw-r--r--ext/tk/sample/tkextlib/tkimg/license_terms_of_Img_extension41
-rw-r--r--ext/tk/sample/tkextlib/tkimg/readme.txt3
-rw-r--r--ext/tk/sample/tkextlib/tktable/Orig_LICENSE.txt52
-rw-r--r--ext/tk/sample/tkextlib/tktable/basic.rb61
-rw-r--r--ext/tk/sample/tkextlib/tktable/buttons.rb77
-rw-r--r--ext/tk/sample/tkextlib/tktable/command.rb90
-rw-r--r--ext/tk/sample/tkextlib/tktable/debug.rb102
-rw-r--r--ext/tk/sample/tkextlib/tktable/dynarows.rb100
-rw-r--r--ext/tk/sample/tkextlib/tktable/maxsize.rb68
-rw-r--r--ext/tk/sample/tkextlib/tktable/spreadsheet.rb138
-rw-r--r--ext/tk/sample/tkextlib/tktable/tcllogo.gifbin0 -> 2341 bytes-rw-r--r--ext/tk/sample/tkextlib/tktable/valid.rb89
-rw-r--r--ext/tk/sample/tkextlib/treectrl/bitmaps.rb77
-rw-r--r--ext/tk/sample/tkextlib/treectrl/demo.rb1306
-rw-r--r--ext/tk/sample/tkextlib/treectrl/explorer.rb431
-rw-r--r--ext/tk/sample/tkextlib/treectrl/help.rb405
-rw-r--r--ext/tk/sample/tkextlib/treectrl/imovie.rb131
-rw-r--r--ext/tk/sample/tkextlib/treectrl/layout.rb160
-rw-r--r--ext/tk/sample/tkextlib/treectrl/mailwasher.rb270
-rw-r--r--ext/tk/sample/tkextlib/treectrl/outlook-folders.rb125
-rw-r--r--ext/tk/sample/tkextlib/treectrl/outlook-newgroup.rb449
-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/big-dll.gifbin0 -> 437 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/big-exe.gifbin0 -> 368 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/big-file.gifbin0 -> 466 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/big-folder.gifbin0 -> 459 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/big-txt.gifbin0 -> 392 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/checked.gifbin0 -> 78 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/file.gifbin0 -> 279 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/folder-closed.gifbin0 -> 111 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/folder-open.gifbin0 -> 120 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/help-book-closed.gifbin0 -> 115 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/help-book-open.gifbin0 -> 128 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/help-page.gifbin0 -> 132 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/imovie-01.gifbin0 -> 5406 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/imovie-02.gifbin0 -> 5912 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/imovie-03.gifbin0 -> 4696 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/imovie-04.gifbin0 -> 5783 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/imovie-05.gifbin0 -> 3238 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/imovie-06.gifbin0 -> 3509 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/imovie-07.gifbin0 -> 2091 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/internet-check-off.gifbin0 -> 70 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/internet-check-on.gifbin0 -> 76 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/internet-print.gifbin0 -> 124 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/internet-radio-off.gifbin0 -> 68 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/internet-radio-on.gifbin0 -> 71 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/internet-search.gifbin0 -> 114 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/internet-security.gifbin0 -> 108 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/mac-collapse.gifbin0 -> 275 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/mac-expand.gifbin0 -> 277 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/outlook-arrow.gifbin0 -> 73 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/outlook-clip.gifbin0 -> 73 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/outlook-deleted.gifbin0 -> 138 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/outlook-draft.gifbin0 -> 134 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/outlook-folder.gifbin0 -> 133 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/outlook-group.gifbin0 -> 144 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/outlook-inbox.gifbin0 -> 133 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/outlook-local.gifbin0 -> 146 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/outlook-main.gifbin0 -> 174 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/outlook-outbox.gifbin0 -> 136 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/outlook-read-2.gifbin0 -> 343 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/outlook-read.gifbin0 -> 304 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/outlook-sent.gifbin0 -> 132 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/outlook-server.gifbin0 -> 163 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/outlook-unread.gifbin0 -> 303 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/outlook-watch.gifbin0 -> 98 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/sky.gifbin0 -> 6454 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/small-dll.gifbin0 -> 311 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/small-exe.gifbin0 -> 115 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/small-file.gifbin0 -> 338 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/small-folder.gifbin0 -> 307 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/small-txt.gifbin0 -> 302 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/pics/unchecked.gifbin0 -> 72 bytes-rw-r--r--ext/tk/sample/tkextlib/treectrl/random.rb509
-rw-r--r--ext/tk/sample/tkextlib/treectrl/readme.txt2
-rw-r--r--ext/tk/sample/tkextlib/treectrl/www-options.rb304
-rw-r--r--ext/tk/sample/tkextlib/vu/Orig_LICENSE.txt51
-rw-r--r--ext/tk/sample/tkextlib/vu/README.txt50
-rw-r--r--ext/tk/sample/tkextlib/vu/canvItems.rb91
-rw-r--r--ext/tk/sample/tkextlib/vu/canvSticker.rb83
-rw-r--r--ext/tk/sample/tkextlib/vu/canvSticker2.rb102
-rw-r--r--ext/tk/sample/tkextlib/vu/dial_demo.rb114
-rw-r--r--ext/tk/sample/tkextlib/vu/m128_000.xbm174
-rw-r--r--ext/tk/sample/tkextlib/vu/oscilloscope.rb69
-rw-r--r--ext/tk/sample/tkextlib/vu/pie.rb57
-rw-r--r--ext/tk/sample/tkextlib/vu/vu_demo.rb68
-rw-r--r--ext/tk/sample/tkfrom.rb133
-rw-r--r--ext/tk/sample/tkhello.rb11
-rw-r--r--ext/tk/sample/tkline.rb48
-rw-r--r--ext/tk/sample/tkmenubutton.rb136
-rw-r--r--ext/tk/sample/tkmsgcat-load_rb.rb103
-rw-r--r--ext/tk/sample/tkmsgcat-load_rb2.rb103
-rw-r--r--ext/tk/sample/tkmsgcat-load_tk.rb119
-rw-r--r--ext/tk/sample/tkmulticolumnlist.rb744
-rw-r--r--ext/tk/sample/tkmultilistbox.rb655
-rw-r--r--ext/tk/sample/tkmultilistframe.rb941
-rwxr-xr-xext/tk/sample/tkoptdb-safeTk.rb74
-rw-r--r--ext/tk/sample/tkoptdb.rb107
-rw-r--r--ext/tk/sample/tkrttimer.rb78
-rw-r--r--ext/tk/sample/tksleep_sample.rb30
-rw-r--r--ext/tk/sample/tktextframe.rb282
-rw-r--r--ext/tk/sample/tktextio.rb1061
-rw-r--r--ext/tk/sample/tktimer.rb51
-rw-r--r--ext/tk/sample/tktimer2.rb48
-rw-r--r--ext/tk/sample/tktimer3.rb60
-rw-r--r--ext/tk/sample/tktree.rb104
-rw-r--r--ext/tk/sample/tktree.tcl305
-rw-r--r--ext/tk/sample/ttk_wrapper.rb155
-rw-r--r--ext/tk/stubs.c592
-rw-r--r--ext/tk/stubs.h33
-rw-r--r--ext/tk/tcltklib.c11087
-rw-r--r--ext/tk/tkutil/depend1
-rw-r--r--ext/tk/tkutil/extconf.rb14
-rw-r--r--ext/tk/tkutil/tkutil.c1895
-rw-r--r--ext/win32/extconf.rb2
-rw-r--r--ext/win32/lib/Win32API.rb31
-rw-r--r--ext/win32/lib/win32/registry.rb20
-rw-r--r--ext/win32/lib/win32/resolv.rb323
-rw-r--r--ext/win32/lib/win32/resolv9x.rb253
-rw-r--r--ext/win32/lib/win32/sspi.rb2
-rw-r--r--ext/win32/resolv/extconf.rb3
-rw-r--r--ext/win32/resolv/resolv.c65
-rw-r--r--ext/win32ole/lib/win32ole.rb33
-rw-r--r--ext/win32ole/sample/excel1.rb4
-rw-r--r--ext/win32ole/sample/excel2.rb2
-rw-r--r--ext/win32ole/sample/excel3.rb2
-rw-r--r--ext/win32ole/sample/ie.rb2
-rw-r--r--ext/win32ole/sample/ienavi.rb6
-rw-r--r--ext/win32ole/win32ole.c314
-rw-r--r--ext/win32ole/win32ole.h12
-rw-r--r--ext/win32ole/win32ole_error.c1
-rw-r--r--ext/win32ole/win32ole_error.h3
-rw-r--r--ext/win32ole/win32ole_event.c27
-rw-r--r--ext/win32ole/win32ole_method.c38
-rw-r--r--ext/win32ole/win32ole_param.c2
-rw-r--r--ext/win32ole/win32ole_type.c8
-rw-r--r--ext/win32ole/win32ole_typelib.c4
-rw-r--r--ext/win32ole/win32ole_variable.c2
-rw-r--r--ext/win32ole/win32ole_variant.c27
-rw-r--r--ext/win32ole/win32ole_variant_m.c52
-rw-r--r--ext/zlib/.gitignore1
-rw-r--r--ext/zlib/depend23
-rw-r--r--ext/zlib/extconf.rb80
-rw-r--r--ext/zlib/zlib.c611
-rw-r--r--ext/zlib/zlib.gemspec28
-rw-r--r--file.c1235
-rw-r--r--gc.c2478
-rw-r--r--gc.h6
-rw-r--r--gem_prelude.rb3
-rw-r--r--gems/bundled_gems13
-rw-r--r--golf_prelude.rb7
-rw-r--r--goruby.c10
-rw-r--r--hash.c2650
-rw-r--r--hrtime.h168
-rw-r--r--ia64.s (renamed from ia64.S)0
-rw-r--r--id_table.c1365
-rw-r--r--id_table.h1
-rw-r--r--include/ruby/backward.h69
-rw-r--r--include/ruby/debug.h7
-rw-r--r--include/ruby/defines.h242
-rw-r--r--include/ruby/encoding.h46
-rw-r--r--include/ruby/intern.h227
-rw-r--r--include/ruby/io.h17
-rw-r--r--include/ruby/missing.h45
-rw-r--r--include/ruby/onigmo.h935
-rw-r--r--include/ruby/oniguruma.h841
-rw-r--r--include/ruby/ruby.h991
-rw-r--r--include/ruby/st.h78
-rw-r--r--include/ruby/util.h5
-rw-r--r--include/ruby/version.h4
-rw-r--r--include/ruby/vm.h2
-rw-r--r--include/ruby/win32.h93
-rw-r--r--inits.c6
-rw-r--r--insns.def1942
-rw-r--r--internal.h1426
-rw-r--r--io.c2462
-rw-r--r--iseq.c1945
-rw-r--r--iseq.h249
-rw-r--r--lex.c.blt121
-rw-r--r--lib/.document25
-rw-r--r--lib/English.rb6
-rw-r--r--lib/abbrev.rb2
-rw-r--r--lib/base64.rb6
-rw-r--r--lib/benchmark.rb15
-rw-r--r--lib/bundler.rb567
-rw-r--r--lib/bundler/build_metadata.rb53
-rw-r--r--lib/bundler/bundler.gemspec64
-rw-r--r--lib/bundler/capistrano.rb22
-rw-r--r--lib/bundler/cli.rb790
-rw-r--r--lib/bundler/cli/add.rb35
-rw-r--r--lib/bundler/cli/binstubs.rb49
-rw-r--r--lib/bundler/cli/cache.rb36
-rw-r--r--lib/bundler/cli/check.rb38
-rw-r--r--lib/bundler/cli/clean.rb25
-rw-r--r--lib/bundler/cli/common.rb102
-rw-r--r--lib/bundler/cli/config.rb119
-rw-r--r--lib/bundler/cli/console.rb43
-rw-r--r--lib/bundler/cli/doctor.rb140
-rw-r--r--lib/bundler/cli/exec.rb105
-rw-r--r--lib/bundler/cli/gem.rb252
-rw-r--r--lib/bundler/cli/info.rb50
-rw-r--r--lib/bundler/cli/init.rb47
-rw-r--r--lib/bundler/cli/inject.rb60
-rw-r--r--lib/bundler/cli/install.rb217
-rw-r--r--lib/bundler/cli/issue.rb40
-rw-r--r--lib/bundler/cli/list.rb58
-rw-r--r--lib/bundler/cli/lock.rb63
-rw-r--r--lib/bundler/cli/open.rb26
-rw-r--r--lib/bundler/cli/outdated.rb266
-rw-r--r--lib/bundler/cli/package.rb49
-rw-r--r--lib/bundler/cli/platform.rb46
-rw-r--r--lib/bundler/cli/plugin.rb24
-rw-r--r--lib/bundler/cli/pristine.rb47
-rw-r--r--lib/bundler/cli/remove.rb18
-rw-r--r--lib/bundler/cli/show.rb75
-rw-r--r--lib/bundler/cli/update.rb91
-rw-r--r--lib/bundler/cli/viz.rb31
-rw-r--r--lib/bundler/compact_index_client.rb109
-rw-r--r--lib/bundler/compact_index_client/cache.rb118
-rw-r--r--lib/bundler/compact_index_client/updater.rb116
-rw-r--r--lib/bundler/compatibility_guard.rb14
-rw-r--r--lib/bundler/constants.rb7
-rw-r--r--lib/bundler/current_ruby.rb93
-rw-r--r--lib/bundler/definition.rb993
-rw-r--r--lib/bundler/dep_proxy.rb48
-rw-r--r--lib/bundler/dependency.rb139
-rw-r--r--lib/bundler/deployment.rb69
-rw-r--r--lib/bundler/deprecate.rb44
-rw-r--r--lib/bundler/dsl.rb615
-rw-r--r--lib/bundler/endpoint_specification.rb141
-rw-r--r--lib/bundler/env.rb155
-rw-r--r--lib/bundler/environment_preserver.rb59
-rw-r--r--lib/bundler/errors.rb158
-rw-r--r--lib/bundler/feature_flag.rb74
-rw-r--r--lib/bundler/fetcher.rb312
-rw-r--r--lib/bundler/fetcher/base.rb52
-rw-r--r--lib/bundler/fetcher/compact_index.rb126
-rw-r--r--lib/bundler/fetcher/dependency.rb82
-rw-r--r--lib/bundler/fetcher/downloader.rb84
-rw-r--r--lib/bundler/fetcher/index.rb52
-rw-r--r--lib/bundler/friendly_errors.rb131
-rw-r--r--lib/bundler/gem_helper.rb202
-rw-r--r--lib/bundler/gem_helpers.rb101
-rw-r--r--lib/bundler/gem_remote_fetcher.rb43
-rw-r--r--lib/bundler/gem_tasks.rb7
-rw-r--r--lib/bundler/gem_version_promoter.rb190
-rw-r--r--lib/bundler/gemdeps.rb29
-rw-r--r--lib/bundler/graph.rb152
-rw-r--r--lib/bundler/index.rb213
-rw-r--r--lib/bundler/injector.rb253
-rw-r--r--lib/bundler/inline.rb74
-rw-r--r--lib/bundler/installer.rb318
-rw-r--r--lib/bundler/installer/gem_installer.rb85
-rw-r--r--lib/bundler/installer/parallel_installer.rb233
-rw-r--r--lib/bundler/installer/standalone.rb53
-rw-r--r--lib/bundler/lazy_specification.rb123
-rw-r--r--lib/bundler/lockfile_generator.rb95
-rw-r--r--lib/bundler/lockfile_parser.rb256
-rw-r--r--lib/bundler/match_platform.rb24
-rw-r--r--lib/bundler/mirror.rb223
-rw-r--r--lib/bundler/plugin.rb292
-rw-r--r--lib/bundler/plugin/api.rb81
-rw-r--r--lib/bundler/plugin/api/source.rb306
-rw-r--r--lib/bundler/plugin/dsl.rb53
-rw-r--r--lib/bundler/plugin/events.rb61
-rw-r--r--lib/bundler/plugin/index.rb162
-rw-r--r--lib/bundler/plugin/installer.rb96
-rw-r--r--lib/bundler/plugin/installer/git.rb38
-rw-r--r--lib/bundler/plugin/installer/rubygems.rb27
-rw-r--r--lib/bundler/plugin/source_list.rb27
-rw-r--r--lib/bundler/process_lock.rb24
-rw-r--r--lib/bundler/psyched_yaml.rb37
-rw-r--r--lib/bundler/remote_specification.rb114
-rw-r--r--lib/bundler/resolver.rb373
-rw-r--r--lib/bundler/resolver/spec_group.rb106
-rw-r--r--lib/bundler/retry.rb66
-rw-r--r--lib/bundler/ruby_dsl.rb18
-rw-r--r--lib/bundler/ruby_version.rb152
-rw-r--r--lib/bundler/rubygems_ext.rb210
-rw-r--r--lib/bundler/rubygems_gem_installer.rb99
-rw-r--r--lib/bundler/rubygems_integration.rb898
-rw-r--r--lib/bundler/runtime.rb322
-rw-r--r--lib/bundler/settings.rb463
-rw-r--r--lib/bundler/settings/validator.rb102
-rw-r--r--lib/bundler/setup.rb28
-rw-r--r--lib/bundler/shared_helpers.rb384
-rw-r--r--lib/bundler/similarity_detector.rb63
-rw-r--r--lib/bundler/source.rb94
-rw-r--r--lib/bundler/source/gemspec.rb18
-rw-r--r--lib/bundler/source/git.rb329
-rw-r--r--lib/bundler/source/git/git_proxy.rb262
-rw-r--r--lib/bundler/source/metadata.rb63
-rw-r--r--lib/bundler/source/path.rb249
-rw-r--r--lib/bundler/source/path/installer.rb74
-rw-r--r--lib/bundler/source/rubygems.rb539
-rw-r--r--lib/bundler/source/rubygems/remote.rb69
-rw-r--r--lib/bundler/source_list.rb186
-rw-r--r--lib/bundler/spec_set.rb192
-rw-r--r--lib/bundler/ssl_certs/.document1
-rw-r--r--lib/bundler/ssl_certs/certificate_manager.rb66
-rw-r--r--lib/bundler/ssl_certs/index.rubygems.org/GlobalSignRootCA.pem21
-rw-r--r--lib/bundler/stub_specification.rb108
-rw-r--r--lib/bundler/templates/.document1
-rw-r--r--lib/bundler/templates/Executable29
-rw-r--r--lib/bundler/templates/Executable.bundler105
-rw-r--r--lib/bundler/templates/Executable.standalone14
-rw-r--r--lib/bundler/templates/Gemfile7
-rw-r--r--lib/bundler/templates/gems.rb8
-rw-r--r--lib/bundler/templates/newgem/CODE_OF_CONDUCT.md.tt74
-rw-r--r--lib/bundler/templates/newgem/Gemfile.tt6
-rw-r--r--lib/bundler/templates/newgem/LICENSE.txt.tt21
-rw-r--r--lib/bundler/templates/newgem/README.md.tt47
-rw-r--r--lib/bundler/templates/newgem/Rakefile.tt29
-rw-r--r--lib/bundler/templates/newgem/bin/console.tt14
-rw-r--r--lib/bundler/templates/newgem/bin/setup.tt8
-rw-r--r--lib/bundler/templates/newgem/exe/newgem.tt3
-rw-r--r--lib/bundler/templates/newgem/ext/newgem/extconf.rb.tt3
-rw-r--r--lib/bundler/templates/newgem/ext/newgem/newgem.c.tt9
-rw-r--r--lib/bundler/templates/newgem/ext/newgem/newgem.h.tt6
-rw-r--r--lib/bundler/templates/newgem/gitignore.tt20
-rw-r--r--lib/bundler/templates/newgem/lib/newgem.rb.tt13
-rw-r--r--lib/bundler/templates/newgem/lib/newgem/version.rb.tt7
-rw-r--r--lib/bundler/templates/newgem/newgem.gemspec.tt55
-rw-r--r--lib/bundler/templates/newgem/rspec.tt3
-rw-r--r--lib/bundler/templates/newgem/spec/newgem_spec.rb.tt9
-rw-r--r--lib/bundler/templates/newgem/spec/spec_helper.rb.tt14
-rw-r--r--lib/bundler/templates/newgem/test/newgem_test.rb.tt11
-rw-r--r--lib/bundler/templates/newgem/test/test_helper.rb.tt4
-rw-r--r--lib/bundler/templates/newgem/travis.yml.tt7
-rw-r--r--lib/bundler/ui.rb9
-rw-r--r--lib/bundler/ui/rg_proxy.rb19
-rw-r--r--lib/bundler/ui/shell.rb146
-rw-r--r--lib/bundler/ui/silent.rb69
-rw-r--r--lib/bundler/uri_credentials_filter.rb37
-rw-r--r--lib/bundler/vendor/fileutils/lib/fileutils.rb1638
-rw-r--r--lib/bundler/vendor/molinillo/lib/molinillo.rb12
-rw-r--r--lib/bundler/vendor/molinillo/lib/molinillo/compatibility.rb26
-rw-r--r--lib/bundler/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb57
-rw-r--r--lib/bundler/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb81
-rw-r--r--lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph.rb223
-rw-r--r--lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/action.rb36
-rw-r--r--lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb66
-rw-r--r--lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb62
-rw-r--r--lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb63
-rw-r--r--lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb61
-rw-r--r--lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/log.rb126
-rw-r--r--lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb46
-rw-r--r--lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb36
-rw-r--r--lib/bundler/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb136
-rw-r--r--lib/bundler/vendor/molinillo/lib/molinillo/errors.rb143
-rw-r--r--lib/bundler/vendor/molinillo/lib/molinillo/gem_metadata.rb6
-rw-r--r--lib/bundler/vendor/molinillo/lib/molinillo/modules/specification_provider.rb101
-rw-r--r--lib/bundler/vendor/molinillo/lib/molinillo/modules/ui.rb67
-rw-r--r--lib/bundler/vendor/molinillo/lib/molinillo/resolution.rb837
-rw-r--r--lib/bundler/vendor/molinillo/lib/molinillo/resolver.rb46
-rw-r--r--lib/bundler/vendor/molinillo/lib/molinillo/state.rb58
-rw-r--r--lib/bundler/vendor/net-http-persistent/lib/net/http/faster.rb27
-rw-r--r--lib/bundler/vendor/net-http-persistent/lib/net/http/persistent.rb1233
-rw-r--r--lib/bundler/vendor/net-http-persistent/lib/net/http/persistent/ssl_reuse.rb129
-rw-r--r--lib/bundler/vendor/thor/lib/thor.rb509
-rw-r--r--lib/bundler/vendor/thor/lib/thor/actions.rb321
-rw-r--r--lib/bundler/vendor/thor/lib/thor/actions/create_file.rb104
-rw-r--r--lib/bundler/vendor/thor/lib/thor/actions/create_link.rb60
-rw-r--r--lib/bundler/vendor/thor/lib/thor/actions/directory.rb118
-rw-r--r--lib/bundler/vendor/thor/lib/thor/actions/empty_directory.rb143
-rw-r--r--lib/bundler/vendor/thor/lib/thor/actions/file_manipulation.rb364
-rw-r--r--lib/bundler/vendor/thor/lib/thor/actions/inject_into_file.rb109
-rw-r--r--lib/bundler/vendor/thor/lib/thor/base.rb679
-rw-r--r--lib/bundler/vendor/thor/lib/thor/command.rb135
-rw-r--r--lib/bundler/vendor/thor/lib/thor/core_ext/hash_with_indifferent_access.rb97
-rw-r--r--lib/bundler/vendor/thor/lib/thor/core_ext/io_binary_read.rb12
-rw-r--r--lib/bundler/vendor/thor/lib/thor/core_ext/ordered_hash.rb129
-rw-r--r--lib/bundler/vendor/thor/lib/thor/error.rb32
-rw-r--r--lib/bundler/vendor/thor/lib/thor/group.rb281
-rw-r--r--lib/bundler/vendor/thor/lib/thor/invocation.rb177
-rw-r--r--lib/bundler/vendor/thor/lib/thor/line_editor.rb17
-rw-r--r--lib/bundler/vendor/thor/lib/thor/line_editor/basic.rb37
-rw-r--r--lib/bundler/vendor/thor/lib/thor/line_editor/readline.rb88
-rw-r--r--lib/bundler/vendor/thor/lib/thor/parser.rb4
-rw-r--r--lib/bundler/vendor/thor/lib/thor/parser/argument.rb70
-rw-r--r--lib/bundler/vendor/thor/lib/thor/parser/arguments.rb175
-rw-r--r--lib/bundler/vendor/thor/lib/thor/parser/option.rb146
-rw-r--r--lib/bundler/vendor/thor/lib/thor/parser/options.rb221
-rw-r--r--lib/bundler/vendor/thor/lib/thor/rake_compat.rb71
-rw-r--r--lib/bundler/vendor/thor/lib/thor/runner.rb324
-rw-r--r--lib/bundler/vendor/thor/lib/thor/shell.rb81
-rw-r--r--lib/bundler/vendor/thor/lib/thor/shell/basic.rb437
-rw-r--r--lib/bundler/vendor/thor/lib/thor/shell/color.rb149
-rw-r--r--lib/bundler/vendor/thor/lib/thor/shell/html.rb126
-rw-r--r--lib/bundler/vendor/thor/lib/thor/util.rb268
-rw-r--r--lib/bundler/vendor/thor/lib/thor/version.rb3
-rw-r--r--lib/bundler/vendored_fileutils.rb9
-rw-r--r--lib/bundler/vendored_molinillo.rb4
-rw-r--r--lib/bundler/vendored_persistent.rb52
-rw-r--r--lib/bundler/vendored_thor.rb8
-rw-r--r--lib/bundler/version.rb28
-rw-r--r--lib/bundler/version_ranges.rb76
-rw-r--r--lib/bundler/vlad.rb17
-rw-r--r--lib/bundler/worker.rb106
-rw-r--r--lib/bundler/yaml_serializer.rb90
-rw-r--r--lib/cgi.rb2
-rw-r--r--lib/cgi/cookie.rb8
-rw-r--r--lib/cgi/core.rb43
-rw-r--r--lib/cgi/html.rb6
-rw-r--r--lib/cgi/session.rb10
-rw-r--r--lib/cgi/session/pstore.rb4
-rw-r--r--lib/cgi/util.rb51
-rw-r--r--lib/cmath.gemspec23
-rw-r--r--lib/cmath.rb4
-rw-r--r--lib/csv.rb1859
-rw-r--r--lib/csv/core_ext/array.rb9
-rw-r--r--lib/csv/core_ext/string.rb9
-rw-r--r--lib/csv/csv.gemspec44
-rw-r--r--lib/csv/delete_suffix.rb18
-rw-r--r--lib/csv/fields_converter.rb78
-rw-r--r--lib/csv/match_p.rb20
-rw-r--r--lib/csv/parser.rb1092
-rw-r--r--lib/csv/row.rb388
-rw-r--r--lib/csv/table.rb402
-rw-r--r--lib/csv/version.rb6
-rw-r--r--lib/csv/writer.rb156
-rw-r--r--lib/debug.rb4
-rw-r--r--lib/delegate.rb26
-rw-r--r--lib/drb/acl.rb10
-rw-r--r--lib/drb/drb.rb101
-rw-r--r--lib/drb/extserv.rb2
-rw-r--r--lib/drb/extservm.rb10
-rw-r--r--lib/drb/gw.rb2
-rw-r--r--lib/drb/ssl.rb12
-rw-r--r--lib/drb/timeridconv.rb67
-rw-r--r--lib/drb/unix.rb7
-rw-r--r--lib/e2mmap.gemspec26
-rw-r--r--lib/e2mmap.rb12
-rw-r--r--lib/e2mmap/version.rb3
-rw-r--r--lib/erb.rb311
-rw-r--r--lib/fileutils.rb692
-rw-r--r--lib/fileutils/fileutils.gemspec32
-rw-r--r--lib/fileutils/version.rb5
-rw-r--r--lib/find.rb7
-rw-r--r--lib/forwardable.rb107
-rw-r--r--lib/forwardable/forwardable.gemspec26
-rw-r--r--lib/forwardable/impl.rb16
-rw-r--r--lib/getoptlong.rb24
-rw-r--r--lib/ipaddr.gemspec28
-rw-r--r--lib/ipaddr.rb115
-rw-r--r--lib/irb.rb209
-rw-r--r--lib/irb/cmd/chws.rb8
-rw-r--r--lib/irb/cmd/fork.rb2
-rw-r--r--lib/irb/cmd/help.rb4
-rw-r--r--lib/irb/cmd/load.rb10
-rw-r--r--lib/irb/cmd/pushws.rb10
-rw-r--r--lib/irb/cmd/subirb.rb12
-rw-r--r--lib/irb/completion.rb40
-rw-r--r--lib/irb/context.rb15
-rw-r--r--lib/irb/ext/math-mode.rb48
-rw-r--r--lib/irb/ext/multi-irb.rb1
-rw-r--r--lib/irb/ext/save-history.rb1
-rw-r--r--lib/irb/ext/use-loader.rb4
-rw-r--r--lib/irb/extend-command.rb3
-rw-r--r--lib/irb/help.rb2
-rw-r--r--lib/irb/init.rb37
-rw-r--r--lib/irb/input-method.rb4
-rw-r--r--lib/irb/irb.gemspec26
-rw-r--r--lib/irb/lc/help-message1
-rw-r--r--lib/irb/lc/ja/help-message1
-rw-r--r--lib/irb/locale.rb2
-rw-r--r--lib/irb/magic-file.rb2
-rw-r--r--lib/irb/notifier.rb8
-rw-r--r--lib/irb/output-method.rb2
-rw-r--r--lib/irb/ruby-lex.rb23
-rw-r--r--lib/irb/slex.rb4
-rw-r--r--lib/irb/src_encoding.rb6
-rw-r--r--lib/irb/version.rb5
-rw-r--r--lib/irb/workspace.rb36
-rw-r--r--lib/irb/xmp.rb2
-rw-r--r--lib/logger.gemspec27
-rw-r--r--lib/logger.rb115
-rw-r--r--lib/mathn.rb192
-rw-r--r--lib/matrix.rb542
-rw-r--r--lib/matrix/eigenvalue_decomposition.rb23
-rw-r--r--lib/matrix/lup_decomposition.rb2
-rw-r--r--lib/matrix/matrix.gemspec21
-rw-r--r--lib/mkmf.rb192
-rw-r--r--lib/monitor.rb51
-rw-r--r--lib/mutex_m.gemspec27
-rw-r--r--lib/mutex_m.rb14
-rw-r--r--lib/net/ftp.rb268
-rw-r--r--lib/net/http.rb285
-rw-r--r--lib/net/http/exceptions.rb7
-rw-r--r--lib/net/http/generic_request.rb18
-rw-r--r--lib/net/http/header.rb109
-rw-r--r--lib/net/http/response.rb15
-rw-r--r--lib/net/http/responses.rb68
-rw-r--r--lib/net/http/status.rb84
-rw-r--r--lib/net/https.rb2
-rw-r--r--lib/net/imap.rb180
-rw-r--r--lib/net/pop.rb40
-rw-r--r--lib/net/protocol.rb144
-rw-r--r--lib/net/smtp.rb38
-rw-r--r--lib/observer.rb4
-rw-r--r--lib/open-uri.rb27
-rw-r--r--lib/open3.rb135
-rw-r--r--lib/optparse.rb342
-rw-r--r--lib/optparse/kwargs.rb17
-rw-r--r--lib/ostruct.gemspec21
-rw-r--r--lib/ostruct.rb272
-rw-r--r--lib/pp.rb103
-rw-r--r--lib/prime.gemspec27
-rw-r--r--lib/prime.rb29
-rw-r--r--lib/profile.rb2
-rw-r--r--lib/profiler.rb2
-rw-r--r--lib/pstore.rb22
-rw-r--r--lib/racc/rdoc/grammar.en.rdoc26
-rw-r--r--lib/rbconfig/.document1
-rw-r--r--lib/rbconfig/datadir.rb14
-rw-r--r--lib/rdoc.rb14
-rw-r--r--lib/rdoc/.document1
-rw-r--r--lib/rdoc/alias.rb2
-rw-r--r--lib/rdoc/anon_class.rb2
-rw-r--r--lib/rdoc/any_method.rb15
-rw-r--r--lib/rdoc/attr.rb2
-rw-r--r--lib/rdoc/class_module.rb6
-rw-r--r--lib/rdoc/code_object.rb15
-rw-r--r--lib/rdoc/code_objects.rb2
-rw-r--r--lib/rdoc/comment.rb31
-rw-r--r--lib/rdoc/constant.rb6
-rw-r--r--lib/rdoc/context.rb90
-rw-r--r--lib/rdoc/context/section.rb10
-rw-r--r--lib/rdoc/cross_reference.rb42
-rw-r--r--lib/rdoc/encoding.rb148
-rw-r--r--lib/rdoc/erb_partial.rb2
-rw-r--r--lib/rdoc/erbio.rb10
-rw-r--r--lib/rdoc/extend.rb2
-rw-r--r--lib/rdoc/generator.rb3
-rw-r--r--lib/rdoc/generator/darkfish.rb81
-rw-r--r--lib/rdoc/generator/json_index.rb14
-rw-r--r--lib/rdoc/generator/markup.rb16
-rw-r--r--lib/rdoc/generator/pot.rb8
-rw-r--r--lib/rdoc/generator/pot/message_extractor.rb2
-rw-r--r--lib/rdoc/generator/pot/po.rb6
-rw-r--r--lib/rdoc/generator/pot/po_entry.rb22
-rw-r--r--lib/rdoc/generator/ri.rb2
-rw-r--r--lib/rdoc/generator/template/darkfish/_footer.rhtml4
-rw-r--r--lib/rdoc/generator/template/darkfish/_head.rhtml10
-rw-r--r--lib/rdoc/generator/template/darkfish/class.rhtml4
-rw-r--r--lib/rdoc/generator/template/darkfish/css/fonts.css12
-rw-r--r--lib/rdoc/generator/template/darkfish/css/rdoc.css23
-rw-r--r--lib/rdoc/generator/template/darkfish/js/darkfish.js123
-rw-r--r--lib/rdoc/generator/template/darkfish/js/jquery.js4
-rw-r--r--lib/rdoc/generator/template/darkfish/js/search.js63
-rw-r--r--lib/rdoc/generator/template/json_index/js/navigation.js45
-rw-r--r--lib/rdoc/generator/template/json_index/js/searcher.js13
-rw-r--r--lib/rdoc/ghost_method.rb2
-rw-r--r--lib/rdoc/i18n.rb6
-rw-r--r--lib/rdoc/i18n/locale.rb4
-rw-r--r--lib/rdoc/i18n/text.rb10
-rw-r--r--lib/rdoc/include.rb2
-rw-r--r--lib/rdoc/known_classes.rb2
-rw-r--r--lib/rdoc/markdown.rb1333
-rw-r--r--lib/rdoc/markdown/entities.rb2
-rw-r--r--lib/rdoc/markdown/literals.rb417
-rw-r--r--lib/rdoc/markdown/literals_1_9.rb421
-rw-r--r--lib/rdoc/markup.rb28
-rw-r--r--lib/rdoc/markup/attr_changer.rb2
-rw-r--r--lib/rdoc/markup/attr_span.rb2
-rw-r--r--lib/rdoc/markup/attribute_manager.rb48
-rw-r--r--lib/rdoc/markup/attributes.rb14
-rw-r--r--lib/rdoc/markup/blank_line.rb2
-rw-r--r--lib/rdoc/markup/block_quote.rb2
-rw-r--r--lib/rdoc/markup/document.rb2
-rw-r--r--lib/rdoc/markup/formatter.rb49
-rw-r--r--lib/rdoc/markup/formatter_test_case.rb6
-rw-r--r--lib/rdoc/markup/hard_break.rb2
-rw-r--r--lib/rdoc/markup/heading.rb8
-rw-r--r--lib/rdoc/markup/include.rb2
-rw-r--r--lib/rdoc/markup/indented_paragraph.rb2
-rw-r--r--lib/rdoc/markup/inline.rb2
-rw-r--r--lib/rdoc/markup/list.rb2
-rw-r--r--lib/rdoc/markup/list_item.rb2
-rw-r--r--lib/rdoc/markup/paragraph.rb2
-rw-r--r--lib/rdoc/markup/parser.rb46
-rw-r--r--lib/rdoc/markup/pre_process.rb20
-rw-r--r--lib/rdoc/markup/raw.rb2
-rw-r--r--lib/rdoc/markup/regexp_handling.rb41
-rw-r--r--lib/rdoc/markup/rule.rb2
-rw-r--r--lib/rdoc/markup/special.rb41
-rw-r--r--lib/rdoc/markup/text_formatter_test_case.rb2
-rw-r--r--lib/rdoc/markup/to_ansi.rb2
-rw-r--r--lib/rdoc/markup/to_bs.rb10
-rw-r--r--lib/rdoc/markup/to_html.rb53
-rw-r--r--lib/rdoc/markup/to_html_crossref.rb47
-rw-r--r--lib/rdoc/markup/to_html_snippet.rb20
-rw-r--r--lib/rdoc/markup/to_joined_paragraph.rb38
-rw-r--r--lib/rdoc/markup/to_label.rb20
-rw-r--r--lib/rdoc/markup/to_markdown.rb18
-rw-r--r--lib/rdoc/markup/to_rdoc.rb14
-rw-r--r--lib/rdoc/markup/to_table_of_contents.rb2
-rw-r--r--lib/rdoc/markup/to_test.rb2
-rw-r--r--lib/rdoc/markup/to_tt_only.rb6
-rw-r--r--lib/rdoc/markup/verbatim.rb2
-rw-r--r--lib/rdoc/meta_method.rb2
-rw-r--r--lib/rdoc/method_attr.rb4
-rw-r--r--lib/rdoc/mixin.rb2
-rw-r--r--lib/rdoc/normal_class.rb6
-rw-r--r--lib/rdoc/normal_module.rb2
-rw-r--r--lib/rdoc/options.rb89
-rw-r--r--lib/rdoc/parser.rb56
-rw-r--r--lib/rdoc/parser/c.rb129
-rw-r--r--lib/rdoc/parser/changelog.rb17
-rw-r--r--lib/rdoc/parser/markdown.rb2
-rw-r--r--lib/rdoc/parser/rd.rb2
-rw-r--r--lib/rdoc/parser/ripper_state_lex.rb589
-rw-r--r--lib/rdoc/parser/ruby.rb1086
-rw-r--r--lib/rdoc/parser/ruby_tools.rb67
-rw-r--r--lib/rdoc/parser/simple.rb7
-rw-r--r--lib/rdoc/parser/text.rb2
-rw-r--r--lib/rdoc/rd.rb2
-rw-r--r--lib/rdoc/rd/block_parser.rb108
-rw-r--r--lib/rdoc/rd/inline.rb10
-rw-r--r--lib/rdoc/rd/inline_parser.rb332
-rw-r--r--lib/rdoc/rdoc.gemspec61
-rw-r--r--lib/rdoc/rdoc.rb77
-rw-r--r--lib/rdoc/require.rb2
-rw-r--r--lib/rdoc/ri.rb2
-rw-r--r--lib/rdoc/ri/driver.rb178
-rw-r--r--lib/rdoc/ri/formatter.rb2
-rw-r--r--lib/rdoc/ri/paths.rb5
-rw-r--r--lib/rdoc/ri/store.rb2
-rw-r--r--lib/rdoc/ri/task.rb3
-rw-r--r--lib/rdoc/ruby_lex.rb1378
-rw-r--r--lib/rdoc/ruby_token.rb461
-rw-r--r--lib/rdoc/rubygems_hook.rb14
-rw-r--r--lib/rdoc/servlet.rb15
-rw-r--r--lib/rdoc/single_class.rb2
-rw-r--r--lib/rdoc/stats.rb2
-rw-r--r--lib/rdoc/stats/normal.rb42
-rw-r--r--lib/rdoc/stats/quiet.rb2
-rw-r--r--lib/rdoc/stats/verbose.rb2
-rw-r--r--lib/rdoc/store.rb65
-rw-r--r--lib/rdoc/task.rb4
-rw-r--r--lib/rdoc/test_case.rb218
-rw-r--r--lib/rdoc/text.rb48
-rw-r--r--lib/rdoc/token_stream.rb78
-rw-r--r--lib/rdoc/tom_doc.rb16
-rw-r--r--lib/rdoc/top_level.rb12
-rw-r--r--lib/rdoc/version.rb8
-rw-r--r--lib/resolv.rb197
-rw-r--r--lib/rexml/attlistdecl.rb4
-rw-r--r--lib/rexml/attribute.rb6
-rw-r--r--lib/rexml/cdata.rb4
-rw-r--r--lib/rexml/child.rb2
-rw-r--r--lib/rexml/comment.rb4
-rw-r--r--lib/rexml/doctype.rb41
-rw-r--r--lib/rexml/document.rb28
-rw-r--r--lib/rexml/dtd/attlistdecl.rb2
-rw-r--r--lib/rexml/dtd/dtd.rb12
-rw-r--r--lib/rexml/dtd/elementdecl.rb2
-rw-r--r--lib/rexml/dtd/entitydecl.rb2
-rw-r--r--lib/rexml/dtd/notationdecl.rb2
-rw-r--r--lib/rexml/element.rb42
-rw-r--r--lib/rexml/entity.rb11
-rw-r--r--lib/rexml/formatters/default.rb14
-rw-r--r--lib/rexml/formatters/pretty.rb2
-rw-r--r--lib/rexml/formatters/transitive.rb2
-rw-r--r--lib/rexml/functions.rb92
-rw-r--r--lib/rexml/instruction.rb34
-rw-r--r--lib/rexml/light/node.rb2
-rw-r--r--lib/rexml/namespace.rb25
-rw-r--r--lib/rexml/node.rb8
-rw-r--r--lib/rexml/output.rb2
-rw-r--r--lib/rexml/parent.rb2
-rw-r--r--lib/rexml/parsers/baseparser.rb177
-rw-r--r--lib/rexml/parsers/lightparser.rb6
-rw-r--r--lib/rexml/parsers/pullparser.rb6
-rw-r--r--lib/rexml/parsers/sax2parser.rb8
-rw-r--r--lib/rexml/parsers/streamparser.rb10
-rw-r--r--lib/rexml/parsers/treeparser.rb4
-rw-r--r--lib/rexml/parsers/ultralightparser.rb4
-rw-r--r--lib/rexml/parsers/xpathparser.rb78
-rw-r--r--lib/rexml/quickpath.rb8
-rw-r--r--lib/rexml/rexml.gemspec85
-rw-r--r--lib/rexml/rexml.rb6
-rw-r--r--lib/rexml/source.rb3
-rw-r--r--lib/rexml/text.rb60
-rw-r--r--lib/rexml/undefinednamespaceexception.rb2
-rw-r--r--lib/rexml/validation/relaxng.rb4
-rw-r--r--lib/rexml/validation/validation.rb2
-rw-r--r--lib/rexml/xmldecl.rb39
-rw-r--r--lib/rexml/xpath.rb16
-rw-r--r--lib/rexml/xpath_parser.rb808
-rw-r--r--lib/rinda/rinda.rb1
-rw-r--r--lib/rinda/ring.rb11
-rw-r--r--lib/rinda/tuplespace.rb5
-rw-r--r--lib/rss/0.9.rb2
-rw-r--r--lib/rss/1.0.rb2
-rw-r--r--lib/rss/atom.rb261
-rw-r--r--lib/rss/content.rb2
-rw-r--r--lib/rss/converter.rb2
-rw-r--r--lib/rss/dublincore.rb4
-rw-r--r--lib/rss/dublincore/atom.rb2
-rw-r--r--lib/rss/image.rb2
-rw-r--r--lib/rss/itunes.rb2
-rw-r--r--lib/rss/maker.rb26
-rw-r--r--lib/rss/maker/0.9.rb4
-rw-r--r--lib/rss/maker/1.0.rb4
-rw-r--r--lib/rss/maker/2.0.rb4
-rw-r--r--lib/rss/maker/atom.rb4
-rw-r--r--lib/rss/maker/base.rb2
-rw-r--r--lib/rss/maker/content.rb6
-rw-r--r--lib/rss/maker/dublincore.rb4
-rw-r--r--lib/rss/maker/entry.rb4
-rw-r--r--lib/rss/maker/feed.rb2
-rw-r--r--lib/rss/maker/image.rb6
-rw-r--r--lib/rss/maker/itunes.rb12
-rw-r--r--lib/rss/maker/slash.rb4
-rw-r--r--lib/rss/maker/syndication.rb4
-rw-r--r--lib/rss/maker/taxonomy.rb6
-rw-r--r--lib/rss/maker/trackback.rb6
-rw-r--r--lib/rss/parser.rb26
-rw-r--r--lib/rss/rss.gemspec38
-rw-r--r--lib/rss/rss.rb35
-rw-r--r--lib/rss/taxonomy.rb2
-rw-r--r--lib/rss/utils.rb6
-rw-r--r--lib/rss/xml-stylesheet.rb2
-rw-r--r--lib/rss/xml.rb2
-rw-r--r--lib/rubygems.rb418
-rw-r--r--lib/rubygems/LICENSE.txt54
-rw-r--r--lib/rubygems/available_set.rb4
-rw-r--r--lib/rubygems/basic_specification.rb47
-rw-r--r--lib/rubygems/bundler_version_finder.rb99
-rw-r--r--lib/rubygems/command.rb62
-rw-r--r--lib/rubygems/command_manager.rb35
-rw-r--r--lib/rubygems/commands/build_command.rb41
-rw-r--r--lib/rubygems/commands/cert_command.rb84
-rw-r--r--lib/rubygems/commands/check_command.rb4
-rw-r--r--lib/rubygems/commands/cleanup_command.rb43
-rw-r--r--lib/rubygems/commands/contents_command.rb31
-rw-r--r--lib/rubygems/commands/dependency_command.rb40
-rw-r--r--lib/rubygems/commands/environment_command.rb28
-rw-r--r--lib/rubygems/commands/fetch_command.rb7
-rw-r--r--lib/rubygems/commands/generate_index_command.rb9
-rw-r--r--lib/rubygems/commands/help_command.rb29
-rw-r--r--lib/rubygems/commands/info_command.rb33
-rw-r--r--lib/rubygems/commands/install_command.rb92
-rw-r--r--lib/rubygems/commands/list_command.rb3
-rw-r--r--lib/rubygems/commands/lock_command.rb9
-rw-r--r--lib/rubygems/commands/mirror_command.rb2
-rw-r--r--lib/rubygems/commands/open_command.rb34
-rw-r--r--lib/rubygems/commands/outdated_command.rb2
-rw-r--r--lib/rubygems/commands/owner_command.rb40
-rw-r--r--lib/rubygems/commands/pristine_command.rb60
-rw-r--r--lib/rubygems/commands/push_command.rb77
-rw-r--r--lib/rubygems/commands/query_command.rb91
-rw-r--r--lib/rubygems/commands/rdoc_command.rb9
-rw-r--r--lib/rubygems/commands/search_command.rb3
-rw-r--r--lib/rubygems/commands/server_command.rb5
-rw-r--r--lib/rubygems/commands/setup_command.rb343
-rw-r--r--lib/rubygems/commands/signin_command.rb34
-rw-r--r--lib/rubygems/commands/signout_command.rb33
-rw-r--r--lib/rubygems/commands/sources_command.rb25
-rw-r--r--lib/rubygems/commands/specification_command.rb16
-rw-r--r--lib/rubygems/commands/stale_command.rb2
-rw-r--r--lib/rubygems/commands/uninstall_command.rb69
-rw-r--r--lib/rubygems/commands/unpack_command.rb47
-rw-r--r--lib/rubygems/commands/update_command.rb56
-rw-r--r--lib/rubygems/commands/which_command.rb13
-rw-r--r--lib/rubygems/commands/yank_command.rb43
-rw-r--r--lib/rubygems/compatibility.rb24
-rw-r--r--lib/rubygems/config_file.rb139
-rw-r--r--lib/rubygems/core_ext/kernel_gem.rb2
-rwxr-xr-xlib/rubygems/core_ext/kernel_require.rb53
-rwxr-xr-xlib/rubygems/core_ext/kernel_warn.rb45
-rw-r--r--lib/rubygems/defaults.rb61
-rw-r--r--lib/rubygems/dependency.rb66
-rw-r--r--lib/rubygems/dependency_installer.rb66
-rw-r--r--lib/rubygems/dependency_list.rb21
-rw-r--r--lib/rubygems/deprecate.rb7
-rw-r--r--lib/rubygems/doctor.rb13
-rw-r--r--lib/rubygems/errors.rb51
-rw-r--r--lib/rubygems/exceptions.rb32
-rw-r--r--lib/rubygems/ext.rb3
-rw-r--r--lib/rubygems/ext/build_error.rb3
-rw-r--r--lib/rubygems/ext/builder.rb79
-rw-r--r--lib/rubygems/ext/cmake_builder.rb6
-rw-r--r--lib/rubygems/ext/configure_builder.rb7
-rw-r--r--lib/rubygems/ext/ext_conf_builder.rb41
-rw-r--r--lib/rubygems/ext/rake_builder.rb36
-rw-r--r--lib/rubygems/gem_runner.rb12
-rw-r--r--lib/rubygems/gemcutter_utilities.rb74
-rw-r--r--lib/rubygems/indexer.rb42
-rw-r--r--lib/rubygems/install_default_message.rb3
-rw-r--r--lib/rubygems/install_message.rb3
-rw-r--r--lib/rubygems/install_update_options.rb117
-rw-r--r--lib/rubygems/installer.rb244
-rw-r--r--lib/rubygems/installer_test_case.rb17
-rw-r--r--lib/rubygems/local_remote_options.rb11
-rw-r--r--lib/rubygems/mock_gem_ui.rb9
-rw-r--r--lib/rubygems/name_tuple.rb12
-rw-r--r--lib/rubygems/package.rb194
-rw-r--r--lib/rubygems/package/digest_io.rb9
-rw-r--r--lib/rubygems/package/file_source.rb13
-rw-r--r--lib/rubygems/package/io_source.rb5
-rw-r--r--lib/rubygems/package/old.rb37
-rw-r--r--lib/rubygems/package/source.rb3
-rw-r--r--lib/rubygems/package/tar_header.rb34
-rw-r--r--lib/rubygems/package/tar_reader.rb9
-rw-r--r--lib/rubygems/package/tar_reader/entry.rb26
-rw-r--r--lib/rubygems/package/tar_test_case.rb12
-rw-r--r--lib/rubygems/package/tar_writer.rb55
-rw-r--r--lib/rubygems/package_task.rb3
-rw-r--r--lib/rubygems/path_support.rb65
-rw-r--r--lib/rubygems/platform.rb13
-rw-r--r--lib/rubygems/psych_additions.rb2
-rw-r--r--lib/rubygems/psych_tree.rb4
-rw-r--r--lib/rubygems/rdoc.rb313
-rw-r--r--lib/rubygems/remote_fetcher.rb113
-rw-r--r--lib/rubygems/request.rb79
-rw-r--r--lib/rubygems/request/connection_pools.rb39
-rw-r--r--lib/rubygems/request/http_pool.rb9
-rw-r--r--lib/rubygems/request/https_pool.rb6
-rw-r--r--lib/rubygems/request_set.rb158
-rw-r--r--lib/rubygems/request_set/gem_dependency_api.rb139
-rw-r--r--lib/rubygems/request_set/lockfile.rb33
-rw-r--r--lib/rubygems/request_set/lockfile/parser.rb39
-rw-r--r--lib/rubygems/request_set/lockfile/tokenizer.rb22
-rw-r--r--lib/rubygems/requirement.rb68
-rw-r--r--lib/rubygems/resolver.rb94
-rw-r--r--lib/rubygems/resolver/activation_request.rb36
-rw-r--r--lib/rubygems/resolver/api_set.rb13
-rw-r--r--lib/rubygems/resolver/api_specification.rb12
-rw-r--r--lib/rubygems/resolver/best_set.rb13
-rw-r--r--lib/rubygems/resolver/composed_set.rb13
-rw-r--r--lib/rubygems/resolver/conflict.rb12
-rw-r--r--lib/rubygems/resolver/current_set.rb5
-rw-r--r--lib/rubygems/resolver/dependency_request.rb10
-rw-r--r--lib/rubygems/resolver/git_set.rb13
-rw-r--r--lib/rubygems/resolver/git_specification.rb11
-rw-r--r--lib/rubygems/resolver/index_set.rb13
-rw-r--r--lib/rubygems/resolver/index_specification.rb9
-rw-r--r--lib/rubygems/resolver/installed_specification.rb9
-rw-r--r--lib/rubygems/resolver/installer_set.rb42
-rw-r--r--lib/rubygems/resolver/local_specification.rb5
-rw-r--r--lib/rubygems/resolver/lock_set.rb21
-rw-r--r--lib/rubygems/resolver/lock_specification.rb22
-rw-r--r--lib/rubygems/resolver/molinillo.rb2
-rw-r--r--lib/rubygems/resolver/molinillo/lib/molinillo.rb6
-rw-r--r--lib/rubygems/resolver/molinillo/lib/molinillo/delegates/resolution_state.rb50
-rw-r--r--lib/rubygems/resolver/molinillo/lib/molinillo/delegates/specification_provider.rb80
-rw-r--r--lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph.rb222
-rw-r--r--lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/action.rb35
-rw-r--r--lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb65
-rw-r--r--lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/add_vertex.rb61
-rw-r--r--lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/delete_edge.rb62
-rw-r--r--lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb60
-rw-r--r--lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/log.rb125
-rw-r--r--lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/set_payload.rb45
-rw-r--r--lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/tag.rb35
-rw-r--r--lib/rubygems/resolver/molinillo/lib/molinillo/dependency_graph/vertex.rb125
-rw-r--r--lib/rubygems/resolver/molinillo/lib/molinillo/errors.rb9
-rw-r--r--lib/rubygems/resolver/molinillo/lib/molinillo/gem_metadata.rb5
-rw-r--r--lib/rubygems/resolver/molinillo/lib/molinillo/modules/specification_provider.rb2
-rw-r--r--lib/rubygems/resolver/molinillo/lib/molinillo/modules/ui.rb7
-rw-r--r--lib/rubygems/resolver/molinillo/lib/molinillo/resolution.rb207
-rw-r--r--lib/rubygems/resolver/molinillo/lib/molinillo/resolver.rb5
-rw-r--r--lib/rubygems/resolver/molinillo/lib/molinillo/state.rb22
-rw-r--r--lib/rubygems/resolver/requirement_list.rb4
-rw-r--r--lib/rubygems/resolver/set.rb8
-rw-r--r--lib/rubygems/resolver/source_set.rb47
-rw-r--r--lib/rubygems/resolver/spec_specification.rb5
-rw-r--r--lib/rubygems/resolver/specification.rb19
-rw-r--r--lib/rubygems/resolver/stats.rb4
-rw-r--r--lib/rubygems/resolver/vendor_set.rb11
-rw-r--r--lib/rubygems/resolver/vendor_specification.rb7
-rw-r--r--lib/rubygems/safe_yaml.rb59
-rw-r--r--lib/rubygems/security.rb63
-rw-r--r--lib/rubygems/security/policies.rb5
-rw-r--r--lib/rubygems/security/policy.rb55
-rw-r--r--lib/rubygems/security/signer.rb100
-rw-r--r--lib/rubygems/security/trust_dir.rb22
-rw-r--r--lib/rubygems/security_option.rb43
-rw-r--r--lib/rubygems/server.rb123
-rw-r--r--lib/rubygems/source.rb58
-rw-r--r--lib/rubygems/source/git.rb24
-rw-r--r--lib/rubygems/source/installed.rb9
-rw-r--r--lib/rubygems/source/local.rb85
-rw-r--r--lib/rubygems/source/lock.rb15
-rw-r--r--lib/rubygems/source/specific_file.rb12
-rw-r--r--lib/rubygems/source/vendor.rb7
-rw-r--r--lib/rubygems/source_list.rb10
-rw-r--r--lib/rubygems/source_local.rb7
-rw-r--r--lib/rubygems/source_specific_file.rb7
-rw-r--r--lib/rubygems/spec_fetcher.rb15
-rw-r--r--lib/rubygems/specification.rb1144
-rw-r--r--lib/rubygems/specification_policy.rb407
-rw-r--r--lib/rubygems/ssl_certs/AddTrustExternalCARoot-2048.pem (renamed from lib/bundler/ssl_certs/rubygems.org/AddTrustExternalCARoot.pem)0
-rw-r--r--lib/rubygems/ssl_certs/AddTrustExternalCARoot.pem32
-rw-r--r--lib/rubygems/ssl_certs/Class3PublicPrimaryCertificationAuthority.pem14
-rw-r--r--lib/rubygems/ssl_certs/DigiCertHighAssuranceEVRootCA.pem (renamed from lib/bundler/ssl_certs/rubygems.global.ssl.fastly.net/DigiCertHighAssuranceEVRootCA.pem)0
-rw-r--r--lib/rubygems/ssl_certs/EntrustnetSecureServerCertificationAuthority.pem28
-rw-r--r--lib/rubygems/ssl_certs/GeoTrustGlobalCA.pem20
-rw-r--r--lib/rubygems/ssl_certs/index.rubygems.org/GlobalSignRootCA.pem21
-rw-r--r--lib/rubygems/ssl_certs/rubygems.global.ssl.fastly.net/DigiCertHighAssuranceEVRootCA.pem23
-rw-r--r--lib/rubygems/ssl_certs/rubygems.org/AddTrustExternalCARoot.pem25
-rw-r--r--lib/rubygems/stub_specification.rb45
-rw-r--r--lib/rubygems/syck_hack.rb2
-rw-r--r--lib/rubygems/test_case.rb305
-rw-r--r--lib/rubygems/test_utilities.rb61
-rw-r--r--lib/rubygems/text.rb30
-rw-r--r--lib/rubygems/uninstaller.rb65
-rw-r--r--lib/rubygems/uri_formatter.rb5
-rw-r--r--lib/rubygems/user_interaction.rb161
-rw-r--r--lib/rubygems/util.rb54
-rw-r--r--lib/rubygems/util/licenses.rb115
-rw-r--r--lib/rubygems/util/list.rb4
-rw-r--r--lib/rubygems/validator.rb17
-rw-r--r--lib/rubygems/version.rb99
-rw-r--r--lib/rubygems/version_option.rb14
-rw-r--r--lib/scanf.gemspec24
-rw-r--r--lib/scanf.rb20
-rw-r--r--lib/securerandom.rb241
-rw-r--r--lib/set.rb388
-rw-r--r--lib/shell.rb15
-rw-r--r--lib/shell/builtin-command.rb4
-rw-r--r--lib/shell/command-processor.rb12
-rw-r--r--lib/shell/filter.rb12
-rw-r--r--lib/shell/process-controller.rb20
-rw-r--r--lib/shell/shell.gemspec26
-rw-r--r--lib/shell/system-command.rb6
-rw-r--r--lib/shell/version.rb3
-rw-r--r--lib/shellwords.rb14
-rw-r--r--lib/singleton.rb3
-rw-r--r--lib/sync.gemspec27
-rw-r--r--lib/sync.rb13
-rw-r--r--lib/tempfile.rb59
-rw-r--r--lib/thwait.rb5
-rw-r--r--lib/thwait/thwait.gemspec26
-rw-r--r--lib/thwait/version.rb3
-rw-r--r--lib/time.rb244
-rw-r--r--lib/timeout.rb12
-rw-r--r--lib/tmpdir.rb43
-rw-r--r--lib/tracer.rb4
-rw-r--r--lib/tracer/tracer.gemspec26
-rw-r--r--lib/tracer/version.rb5
-rw-r--r--lib/ubygems.rb11
-rw-r--r--lib/un.rb30
-rw-r--r--lib/unicode_normalize.rb79
-rw-r--r--lib/unicode_normalize/normalize.rb22
-rw-r--r--lib/unicode_normalize/tables.rb10105
-rw-r--r--lib/uri.rb46
-rw-r--r--lib/uri/common.rb173
-rw-r--r--lib/uri/file.rb94
-rw-r--r--lib/uri/ftp.rb64
-rw-r--r--lib/uri/generic.rb478
-rw-r--r--lib/uri/http.rb73
-rw-r--r--lib/uri/https.rb2
-rw-r--r--lib/uri/ldap.rb80
-rw-r--r--lib/uri/ldaps.rb2
-rw-r--r--lib/uri/mailto.rb63
-rw-r--r--lib/uri/rfc2396_parser.rb50
-rw-r--r--lib/uri/rfc3986_parser.rb4
-rw-r--r--lib/weakref.rb51
-rw-r--r--lib/webrick/.document6
-rw-r--r--lib/webrick/cgi.rb10
-rw-r--r--lib/webrick/config.rb24
-rw-r--r--lib/webrick/cookie.rb4
-rw-r--r--lib/webrick/httpauth.rb10
-rw-r--r--lib/webrick/httpauth/basicauth.rb18
-rw-r--r--lib/webrick/httpauth/digestauth.rb18
-rw-r--r--lib/webrick/httpauth/htdigest.rb12
-rw-r--r--lib/webrick/httpauth/htgroup.rb15
-rw-r--r--lib/webrick/httpauth/htpasswd.rb47
-rw-r--r--lib/webrick/httpproxy.rb88
-rw-r--r--lib/webrick/httprequest.rb65
-rw-r--r--lib/webrick/httpresponse.rb157
-rw-r--r--lib/webrick/https.rb67
-rw-r--r--lib/webrick/httpserver.rb36
-rw-r--r--lib/webrick/httpservlet.rb10
-rw-r--r--lib/webrick/httpservlet/abstract.rb8
-rw-r--r--lib/webrick/httpservlet/cgi_runner.rb4
-rw-r--r--lib/webrick/httpservlet/cgihandler.rb9
-rw-r--r--lib/webrick/httpservlet/erbhandler.rb4
-rw-r--r--lib/webrick/httpservlet/filehandler.rb83
-rw-r--r--lib/webrick/httpservlet/prochandler.rb2
-rw-r--r--lib/webrick/httpstatus.rb7
-rw-r--r--lib/webrick/httputils.rb3
-rw-r--r--lib/webrick/log.rb6
-rw-r--r--lib/webrick/server.rb86
-rw-r--r--lib/webrick/ssl.rb34
-rw-r--r--lib/webrick/utils.rb50
-rw-r--r--lib/webrick/version.rb2
-rw-r--r--lib/webrick/webrick.gemspec33
-rw-r--r--lib/xmlrpc.rb312
-rw-r--r--lib/xmlrpc/base64.rb63
-rw-r--r--lib/xmlrpc/client.rb615
-rw-r--r--lib/xmlrpc/config.rb44
-rw-r--r--lib/xmlrpc/create.rb287
-rw-r--r--lib/xmlrpc/datetime.rb130
-rw-r--r--lib/xmlrpc/marshal.rb67
-rw-r--r--lib/xmlrpc/parser.rb871
-rw-r--r--lib/xmlrpc/server.rb708
-rw-r--r--lib/xmlrpc/utils.rb172
-rw-r--r--lib/yaml.rb13
-rw-r--r--lib/yaml/store.rb20
-rwxr-xr-xlibexec/bundle31
-rwxr-xr-xlibexec/bundle_ruby60
-rwxr-xr-xlibexec/bundler4
-rwxr-xr-xlibexec/irb11
-rwxr-xr-xlibexec/rdoc44
-rwxr-xr-xlibexec/ri12
-rw-r--r--load.c240
-rw-r--r--loadpath.c1
-rw-r--r--localeinit.c51
-rw-r--r--main.c6
-rw-r--r--man/bundle-add.158
-rw-r--r--man/bundle-add.1.txt52
-rw-r--r--man/bundle-add.ronn40
-rw-r--r--man/bundle-binstubs.140
-rw-r--r--man/bundle-binstubs.1.txt48
-rw-r--r--man/bundle-binstubs.ronn43
-rw-r--r--man/bundle-check.131
-rw-r--r--man/bundle-check.1.txt33
-rw-r--r--man/bundle-check.ronn26
-rw-r--r--man/bundle-clean.124
-rw-r--r--man/bundle-clean.1.txt26
-rw-r--r--man/bundle-clean.ronn18
-rw-r--r--man/bundle-config.1497
-rw-r--r--man/bundle-config.1.txt529
-rw-r--r--man/bundle-config.ronn397
-rw-r--r--man/bundle-doctor.144
-rw-r--r--man/bundle-doctor.1.txt44
-rw-r--r--man/bundle-doctor.ronn33
-rw-r--r--man/bundle-exec.1165
-rw-r--r--man/bundle-exec.1.txt178
-rw-r--r--man/bundle-exec.ronn152
-rw-r--r--man/bundle-gem.180
-rw-r--r--man/bundle-gem.1.txt91
-rw-r--r--man/bundle-gem.ronn78
-rw-r--r--man/bundle-info.120
-rw-r--r--man/bundle-info.1.txt21
-rw-r--r--man/bundle-info.ronn17
-rw-r--r--man/bundle-init.125
-rw-r--r--man/bundle-init.1.txt34
-rw-r--r--man/bundle-init.ronn29
-rw-r--r--man/bundle-inject.133
-rw-r--r--man/bundle-inject.1.txt32
-rw-r--r--man/bundle-inject.ronn22
-rw-r--r--man/bundle-install.1308
-rw-r--r--man/bundle-install.1.txt396
-rw-r--r--man/bundle-install.ronn378
-rw-r--r--man/bundle-list.150
-rw-r--r--man/bundle-list.1.txt43
-rw-r--r--man/bundle-list.ronn33
-rw-r--r--man/bundle-lock.184
-rw-r--r--man/bundle-lock.1.txt93
-rw-r--r--man/bundle-lock.ronn94
-rw-r--r--man/bundle-open.132
-rw-r--r--man/bundle-open.1.txt29
-rw-r--r--man/bundle-open.ronn19
-rw-r--r--man/bundle-outdated.1155
-rw-r--r--man/bundle-outdated.1.txt131
-rw-r--r--man/bundle-outdated.ronn111
-rw-r--r--man/bundle-package.155
-rw-r--r--man/bundle-package.1.txt79
-rw-r--r--man/bundle-package.ronn72
-rw-r--r--man/bundle-platform.161
-rw-r--r--man/bundle-platform.1.txt57
-rw-r--r--man/bundle-platform.ronn42
-rw-r--r--man/bundle-pristine.134
-rw-r--r--man/bundle-pristine.1.txt44
-rw-r--r--man/bundle-pristine.ronn34
-rw-r--r--man/bundle-remove.131
-rw-r--r--man/bundle-remove.1.txt34
-rw-r--r--man/bundle-remove.ronn23
-rw-r--r--man/bundle-show.123
-rw-r--r--man/bundle-show.1.txt27
-rw-r--r--man/bundle-show.ronn21
-rw-r--r--man/bundle-update.1394
-rw-r--r--man/bundle-update.1.txt391
-rw-r--r--man/bundle-update.ronn350
-rw-r--r--man/bundle-viz.139
-rw-r--r--man/bundle-viz.1.txt39
-rw-r--r--man/bundle-viz.ronn30
-rw-r--r--man/bundle.1132
-rw-r--r--man/bundle.1.txt113
-rw-r--r--man/bundle.ronn108
-rw-r--r--man/erb.125
-rw-r--r--man/gemfile.5689
-rw-r--r--man/gemfile.5.ronn521
-rw-r--r--man/gemfile.5.txt653
-rw-r--r--man/goruby.14
-rw-r--r--man/irb.127
-rw-r--r--man/ri.1244
-rw-r--r--man/ruby.197
-rw-r--r--marshal.c160
-rw-r--r--math.c217
-rw-r--r--method.h72
-rw-r--r--miniinit.c5
-rw-r--r--misc/README18
-rw-r--r--misc/inf-ruby.el418
-rwxr-xr-xmisc/lldb_cruby.py257
-rw-r--r--misc/rdoc-mode.el166
-rw-r--r--misc/ruby-additional.el131
-rw-r--r--misc/ruby-electric.el569
-rw-r--r--misc/ruby-mode.el1584
-rw-r--r--misc/ruby-style.el19
-rw-r--r--misc/rubydb2x.el104
-rw-r--r--misc/rubydb3x.el115
-rw-r--r--misc/test_lldb_cruby.rb36
-rw-r--r--missing/crypt.c546
-rw-r--r--missing/crypt.h248
-rw-r--r--missing/des_tables.c1616
-rw-r--r--missing/explicit_bzero.c7
-rw-r--r--missing/flock.c2
-rw-r--r--missing/lgamma_r.c2
-rw-r--r--missing/nan.c28
-rw-r--r--missing/setproctitle.c1
-rw-r--r--missing/stdbool.h20
-rw-r--r--missing/strerror.c2
-rw-r--r--missing/strlcat.c86
-rw-r--r--missing/strlcpy.c77
-rw-r--r--missing/strtol.c27
-rw-r--r--missing/tgamma.c55
-rw-r--r--mjit.c877
-rw-r--r--mjit.h148
-rw-r--r--mjit_compile.c254
-rw-r--r--mjit_worker.c1261
-rw-r--r--nacl/GNUmakefile.in100
-rw-r--r--nacl/README.nacl51
-rw-r--r--nacl/create_nmf.rb70
-rw-r--r--nacl/dirent.h15
-rw-r--r--nacl/example.html150
-rwxr-xr-xnacl/nacl-config.rb61
-rw-r--r--nacl/package.rb113
-rw-r--r--nacl/pepper_main.c732
-rw-r--r--nacl/resource.h8
-rw-r--r--nacl/select.h7
-rw-r--r--nacl/signal.h6
-rw-r--r--nacl/stat.h10
-rw-r--r--nacl/unistd.h9
-rw-r--r--nacl/utime.h11
-rw-r--r--node.c734
-rw-r--r--node.h447
-rw-r--r--numeric.c3156
-rw-r--r--object.c1359
-rw-r--r--pack.c833
-rw-r--r--parse.y9582
-rw-r--r--prelude.rb54
-rw-r--r--probes_helper.h23
-rw-r--r--proc.c1452
-rw-r--r--process.c1462
-rw-r--r--random.c557
-rw-r--r--range.c655
-rw-r--r--rational.c1683
-rw-r--r--re.c813
-rw-r--r--regcomp.c739
-rw-r--r--regenc.c75
-rw-r--r--regenc.h140
-rw-r--r--regerror.c70
-rw-r--r--regexec.c1105
-rw-r--r--regint.h429
-rw-r--r--regparse.c1373
-rw-r--r--regparse.h59
-rw-r--r--regsyntax.c15
-rw-r--r--ruby-runner.c98
-rw-r--r--ruby.c915
-rw-r--r--ruby_assert.h60
-rw-r--r--ruby_atomic.h17
-rw-r--r--rubystub.c60
-rw-r--r--safe.c37
-rw-r--r--sample/cbreak.rb8
-rw-r--r--sample/delegate.rb2
-rw-r--r--sample/dir.rb2
-rw-r--r--sample/drb/dchats.rb1
-rw-r--r--sample/drb/dhasen.rb3
-rw-r--r--sample/drb/dlogd.rb3
-rw-r--r--sample/drb/dqueue.rb3
-rw-r--r--sample/drb/http0serv.rb5
-rw-r--r--sample/drb/name.rb5
-rw-r--r--sample/drb/old_tuplespace.rb2
-rw-r--r--sample/drb/ring_echo.rb1
-rw-r--r--sample/drb/simpletuple.rb2
-rw-r--r--sample/dualstack-httpd.rb1
-rw-r--r--sample/export.rb2
-rw-r--r--sample/fib.py2
-rw-r--r--sample/iseq_loader.rb6
-rw-r--r--sample/observ.rb1
-rw-r--r--sample/openssl/cipher.rb4
-rw-r--r--sample/philos.rb3
-rw-r--r--sample/pty/expect_sample.rb14
-rw-r--r--sample/pty/script.rb2
-rw-r--r--sample/pty/shl.rb47
-rw-r--r--sample/ripper/ruby2html.rb6
-rwxr-xr-xsample/test.rb2371
-rw-r--r--sample/timeout.rb18
-rw-r--r--sample/trick2013/kinaba/remarks.markdown2
-rw-r--r--sample/trick2013/mame/music-box.mp4bin0 -> 580724 bytes-rw-r--r--sample/trick2013/yhara/entry.rb2
-rw-r--r--sample/trick2015/ksk_1/remarks.markdown2
-rw-r--r--sample/trick2018/01-kinaba/authors.markdown3
-rw-r--r--sample/trick2018/01-kinaba/entry.rb8
-rw-r--r--sample/trick2018/01-kinaba/remarks.markdown55
-rw-r--r--sample/trick2018/02-mame/authors.markdown3
-rw-r--r--sample/trick2018/02-mame/entry.rb15
-rw-r--r--sample/trick2018/02-mame/remarks.markdown16
-rw-r--r--sample/trick2018/03-tompng/Gemfile2
-rw-r--r--sample/trick2018/03-tompng/Gemfile.lock13
-rw-r--r--sample/trick2018/03-tompng/authors.markdown3
-rw-r--r--sample/trick2018/03-tompng/entry.rb31
-rw-r--r--sample/trick2018/03-tompng/output.txt44
-rw-r--r--sample/trick2018/03-tompng/remarks.markdown19
-rw-r--r--sample/trick2018/03-tompng/trick.pngbin5661 -> 0 bytes-rw-r--r--sample/trick2018/04-colin/authors.markdown3
-rw-r--r--sample/trick2018/04-colin/entry.rb2
-rw-r--r--sample/trick2018/04-colin/remarks.markdown62
-rw-r--r--sample/trick2018/05-tompng/authors.markdown3
-rw-r--r--sample/trick2018/05-tompng/entry.rb41
-rw-r--r--sample/trick2018/05-tompng/preview_of_output.pngbin66800 -> 0 bytes-rw-r--r--sample/trick2018/05-tompng/remarks.markdown31
-rw-r--r--sample/trick2018/README.md16
-rw-r--r--signal.c523
-rw-r--r--siphash.c12
-rw-r--r--siphash.h2
-rw-r--r--sparc.c2
-rw-r--r--spec/README31
-rw-r--r--spec/README.md100
-rw-r--r--spec/bundler/bundler/bundler_spec.rb490
-rw-r--r--spec/bundler/bundler/cli_spec.rb173
-rw-r--r--spec/bundler/bundler/compact_index_client/updater_spec.rb55
-rw-r--r--spec/bundler/bundler/definition_spec.rb360
-rw-r--r--spec/bundler/bundler/dep_proxy_spec.rb22
-rw-r--r--spec/bundler/bundler/dsl_spec.rb305
-rw-r--r--spec/bundler/bundler/endpoint_specification_spec.rb71
-rw-r--r--spec/bundler/bundler/env_spec.rb151
-rw-r--r--spec/bundler/bundler/environment_preserver_spec.rb79
-rw-r--r--spec/bundler/bundler/fetcher/base_spec.rb76
-rw-r--r--spec/bundler/bundler/fetcher/compact_index_spec.rb103
-rw-r--r--spec/bundler/bundler/fetcher/dependency_spec.rb287
-rw-r--r--spec/bundler/bundler/fetcher/downloader_spec.rb250
-rw-r--r--spec/bundler/bundler/fetcher/index_spec.rb99
-rw-r--r--spec/bundler/bundler/fetcher_spec.rb161
-rw-r--r--spec/bundler/bundler/friendly_errors_spec.rb270
-rw-r--r--spec/bundler/bundler/gem_helper_spec.rb351
-rw-r--r--spec/bundler/bundler/gem_version_promoter_spec.rb179
-rw-r--r--spec/bundler/bundler/index_spec.rb36
-rw-r--r--spec/bundler/bundler/installer/gem_installer_spec.rb29
-rw-r--r--spec/bundler/bundler/installer/parallel_installer_spec.rb47
-rw-r--r--spec/bundler/bundler/installer/spec_installation_spec.rb62
-rw-r--r--spec/bundler/bundler/lockfile_parser_spec.rb153
-rw-r--r--spec/bundler/bundler/mirror_spec.rb329
-rw-r--r--spec/bundler/bundler/plugin/api/source_spec.rb82
-rw-r--r--spec/bundler/bundler/plugin/api_spec.rb83
-rw-r--r--spec/bundler/bundler/plugin/dsl_spec.rb38
-rw-r--r--spec/bundler/bundler/plugin/events_spec.rb18
-rw-r--r--spec/bundler/bundler/plugin/index_spec.rb186
-rw-r--r--spec/bundler/bundler/plugin/installer_spec.rb104
-rw-r--r--spec/bundler/bundler/plugin/source_list_spec.rb25
-rw-r--r--spec/bundler/bundler/plugin_spec.rb309
-rw-r--r--spec/bundler/bundler/psyched_yaml_spec.rb9
-rw-r--r--spec/bundler/bundler/remote_specification_spec.rb187
-rw-r--r--spec/bundler/bundler/retry_spec.rb81
-rw-r--r--spec/bundler/bundler/ruby_dsl_spec.rb95
-rw-r--r--spec/bundler/bundler/ruby_version_spec.rb524
-rw-r--r--spec/bundler/bundler/rubygems_integration_spec.rb114
-rw-r--r--spec/bundler/bundler/settings/validator_spec.rb111
-rw-r--r--spec/bundler/bundler/settings_spec.rb326
-rw-r--r--spec/bundler/bundler/shared_helpers_spec.rb513
-rw-r--r--spec/bundler/bundler/source/git/git_proxy_spec.rb140
-rw-r--r--spec/bundler/bundler/source/git_spec.rb28
-rw-r--r--spec/bundler/bundler/source/path_spec.rb31
-rw-r--r--spec/bundler/bundler/source/rubygems/remote_spec.rb162
-rw-r--r--spec/bundler/bundler/source/rubygems_spec.rb33
-rw-r--r--spec/bundler/bundler/source_list_spec.rb463
-rw-r--r--spec/bundler/bundler/source_spec.rb154
-rw-r--r--spec/bundler/bundler/spec_set_spec.rb77
-rw-r--r--spec/bundler/bundler/ssl_certs/certificate_manager_spec.rb140
-rw-r--r--spec/bundler/bundler/stub_specification_spec.rb24
-rw-r--r--spec/bundler/bundler/ui/shell_spec.rb73
-rw-r--r--spec/bundler/bundler/ui_spec.rb41
-rw-r--r--spec/bundler/bundler/uri_credentials_filter_spec.rb127
-rw-r--r--spec/bundler/bundler/vendored_persistent_spec.rb78
-rw-r--r--spec/bundler/bundler/version_ranges_spec.rb37
-rw-r--r--spec/bundler/bundler/worker_spec.rb22
-rw-r--r--spec/bundler/bundler/yaml_serializer_spec.rb194
-rw-r--r--spec/bundler/cache/cache_path_spec.rb32
-rw-r--r--spec/bundler/cache/gems_spec.rb304
-rw-r--r--spec/bundler/cache/git_spec.rb214
-rw-r--r--spec/bundler/cache/path_spec.rb139
-rw-r--r--spec/bundler/cache/platform_spec.rb49
-rw-r--r--spec/bundler/commands/add_spec.rb217
-rw-r--r--spec/bundler/commands/binstubs_spec.rb453
-rw-r--r--spec/bundler/commands/check_spec.rb354
-rw-r--r--spec/bundler/commands/clean_spec.rb771
-rw-r--r--spec/bundler/commands/config_spec.rb384
-rw-r--r--spec/bundler/commands/console_spec.rb106
-rw-r--r--spec/bundler/commands/doctor_spec.rb110
-rw-r--r--spec/bundler/commands/exec_spec.rb858
-rw-r--r--spec/bundler/commands/help_spec.rb98
-rw-r--r--spec/bundler/commands/info_spec.rb57
-rw-r--r--spec/bundler/commands/init_spec.rb181
-rw-r--r--spec/bundler/commands/inject_spec.rb117
-rw-r--r--spec/bundler/commands/install_spec.rb587
-rw-r--r--spec/bundler/commands/issue_spec.rb16
-rw-r--r--spec/bundler/commands/licenses_spec.rb38
-rw-r--r--spec/bundler/commands/list_spec.rb131
-rw-r--r--spec/bundler/commands/lock_spec.rb322
-rw-r--r--spec/bundler/commands/newgem_spec.rb912
-rw-r--r--spec/bundler/commands/open_spec.rb92
-rw-r--r--spec/bundler/commands/outdated_spec.rb782
-rw-r--r--spec/bundler/commands/package_spec.rb306
-rw-r--r--spec/bundler/commands/pristine_spec.rb192
-rw-r--r--spec/bundler/commands/remove_spec.rb583
-rw-r--r--spec/bundler/commands/show_spec.rb244
-rw-r--r--spec/bundler/commands/update_spec.rb943
-rw-r--r--spec/bundler/commands/version_spec.rb39
-rw-r--r--spec/bundler/commands/viz_spec.rb149
-rw-r--r--spec/bundler/install/allow_offline_install_spec.rb92
-rw-r--r--spec/bundler/install/binstubs_spec.rb43
-rw-r--r--spec/bundler/install/bundler_spec.rb177
-rw-r--r--spec/bundler/install/deploy_spec.rb423
-rw-r--r--spec/bundler/install/failure_spec.rb125
-rw-r--r--spec/bundler/install/gemfile/eval_gemfile_spec.rb82
-rw-r--r--spec/bundler/install/gemfile/gemspec_spec.rb672
-rw-r--r--spec/bundler/install/gemfile/git_spec.rb1351
-rw-r--r--spec/bundler/install/gemfile/groups_spec.rb384
-rw-r--r--spec/bundler/install/gemfile/install_if.rb44
-rw-r--r--spec/bundler/install/gemfile/lockfile_spec.rb48
-rw-r--r--spec/bundler/install/gemfile/path_spec.rb630
-rw-r--r--spec/bundler/install/gemfile/platform_spec.rb426
-rw-r--r--spec/bundler/install/gemfile/ruby_spec.rb108
-rw-r--r--spec/bundler/install/gemfile/sources_spec.rb619
-rw-r--r--spec/bundler/install/gemfile/specific_platform_spec.rb114
-rw-r--r--spec/bundler/install/gemfile_spec.rb145
-rw-r--r--spec/bundler/install/gems/compact_index_spec.rb940
-rw-r--r--spec/bundler/install/gems/dependency_api_spec.rb760
-rw-r--r--spec/bundler/install/gems/env_spec.rb107
-rw-r--r--spec/bundler/install/gems/flex_spec.rb351
-rw-r--r--spec/bundler/install/gems/mirror_spec.rb39
-rw-r--r--spec/bundler/install/gems/native_extensions_spec.rb90
-rw-r--r--spec/bundler/install/gems/post_install_spec.rb150
-rw-r--r--spec/bundler/install/gems/resolving_spec.rb195
-rw-r--r--spec/bundler/install/gems/standalone_spec.rb337
-rw-r--r--spec/bundler/install/gems/sudo_spec.rb178
-rw-r--r--spec/bundler/install/gems/win32_spec.rb26
-rw-r--r--spec/bundler/install/gemspecs_spec.rb154
-rw-r--r--spec/bundler/install/git_spec.rb65
-rw-r--r--spec/bundler/install/global_cache_spec.rb235
-rw-r--r--spec/bundler/install/path_spec.rb256
-rw-r--r--spec/bundler/install/post_bundle_message_spec.rb206
-rw-r--r--spec/bundler/install/prereleases_spec.rb41
-rw-r--r--spec/bundler/install/process_lock_spec.rb35
-rw-r--r--spec/bundler/install/redownload_spec.rb92
-rw-r--r--spec/bundler/install/security_policy_spec.rb77
-rw-r--r--spec/bundler/install/yanked_spec.rb71
-rw-r--r--spec/bundler/lock/git_spec.rb34
-rw-r--r--spec/bundler/lock/lockfile_bundler_1_spec.rb1386
-rw-r--r--spec/bundler/lock/lockfile_spec.rb1425
-rw-r--r--spec/bundler/other/bundle_ruby_spec.rb155
-rw-r--r--spec/bundler/other/cli_dispatch_spec.rb29
-rw-r--r--spec/bundler/other/compatibility_guard_spec.rb25
-rw-r--r--spec/bundler/other/ext_spec.rb66
-rw-r--r--spec/bundler/other/major_deprecation_spec.rb282
-rw-r--r--spec/bundler/other/platform_spec.rb1312
-rw-r--r--spec/bundler/other/ssl_cert_spec.rb18
-rw-r--r--spec/bundler/plugins/command_spec.rb80
-rw-r--r--spec/bundler/plugins/hook_spec.rb109
-rw-r--r--spec/bundler/plugins/install_spec.rb257
-rw-r--r--spec/bundler/plugins/source/example_spec.rb505
-rw-r--r--spec/bundler/plugins/source_spec.rb108
-rw-r--r--spec/bundler/quality_spec.rb266
-rw-r--r--spec/bundler/realworld/dependency_api_spec.rb44
-rw-r--r--spec/bundler/realworld/double_check_spec.rb40
-rw-r--r--spec/bundler/realworld/edgecases_spec.rb382
-rw-r--r--spec/bundler/realworld/gemfile_source_header_spec.rb53
-rw-r--r--spec/bundler/realworld/mirror_probe_spec.rb144
-rw-r--r--spec/bundler/realworld/parallel_spec.rb74
-rw-r--r--spec/bundler/resolver/basic_spec.rb308
-rw-r--r--spec/bundler/resolver/platform_spec.rb100
-rw-r--r--spec/bundler/runtime/executable_spec.rb190
-rw-r--r--spec/bundler/runtime/gem_tasks_spec.rb44
-rw-r--r--spec/bundler/runtime/inline_spec.rb266
-rw-r--r--spec/bundler/runtime/load_spec.rb111
-rw-r--r--spec/bundler/runtime/platform_spec.rb150
-rw-r--r--spec/bundler/runtime/require_spec.rb452
-rw-r--r--spec/bundler/runtime/setup_spec.rb1445
-rw-r--r--spec/bundler/runtime/with_clean_env_spec.rb151
-rw-r--r--spec/bundler/spec_helper.rb170
-rw-r--r--spec/bundler/support/artifice/compact_index.rb122
-rw-r--r--spec/bundler/support/artifice/compact_index_api_missing.rb18
-rw-r--r--spec/bundler/support/artifice/compact_index_basic_authentication.rb15
-rw-r--r--spec/bundler/support/artifice/compact_index_checksum_mismatch.rb16
-rw-r--r--spec/bundler/support/artifice/compact_index_concurrent_download.rb32
-rw-r--r--spec/bundler/support/artifice/compact_index_creds_diff_host.rb39
-rw-r--r--spec/bundler/support/artifice/compact_index_extra.rb37
-rw-r--r--spec/bundler/support/artifice/compact_index_extra_api.rb52
-rw-r--r--spec/bundler/support/artifice/compact_index_extra_api_missing.rb17
-rw-r--r--spec/bundler/support/artifice/compact_index_extra_missing.rb17
-rw-r--r--spec/bundler/support/artifice/compact_index_forbidden.rb13
-rw-r--r--spec/bundler/support/artifice/compact_index_host_redirect.rb21
-rw-r--r--spec/bundler/support/artifice/compact_index_no_gem.rb13
-rw-r--r--spec/bundler/support/artifice/compact_index_partial_update.rb38
-rw-r--r--spec/bundler/support/artifice/compact_index_range_not_satisfiable.rb34
-rw-r--r--spec/bundler/support/artifice/compact_index_redirects.rb21
-rw-r--r--spec/bundler/support/artifice/compact_index_strict_basic_authentication.rb20
-rw-r--r--spec/bundler/support/artifice/compact_index_wrong_dependencies.rb17
-rw-r--r--spec/bundler/support/artifice/compact_index_wrong_gem_checksum.rb20
-rw-r--r--spec/bundler/support/artifice/endopint_marshal_fail_basic_authentication.rb15
-rw-r--r--spec/bundler/support/artifice/endpoint.rb100
-rw-r--r--spec/bundler/support/artifice/endpoint_500.rb19
-rw-r--r--spec/bundler/support/artifice/endpoint_api_forbidden.rb13
-rw-r--r--spec/bundler/support/artifice/endpoint_api_missing.rb18
-rw-r--r--spec/bundler/support/artifice/endpoint_basic_authentication.rb15
-rw-r--r--spec/bundler/support/artifice/endpoint_creds_diff_host.rb39
-rw-r--r--spec/bundler/support/artifice/endpoint_extra.rb33
-rw-r--r--spec/bundler/support/artifice/endpoint_extra_api.rb34
-rw-r--r--spec/bundler/support/artifice/endpoint_extra_missing.rb17
-rw-r--r--spec/bundler/support/artifice/endpoint_fallback.rb19
-rw-r--r--spec/bundler/support/artifice/endpoint_host_redirect.rb17
-rw-r--r--spec/bundler/support/artifice/endpoint_marshal_fail.rb13
-rw-r--r--spec/bundler/support/artifice/endpoint_mirror_source.rb15
-rw-r--r--spec/bundler/support/artifice/endpoint_redirect.rb17
-rw-r--r--spec/bundler/support/artifice/endpoint_strict_basic_authentication.rb20
-rw-r--r--spec/bundler/support/artifice/endpoint_timeout.rb15
-rw-r--r--spec/bundler/support/artifice/fail.rb39
-rw-r--r--spec/bundler/support/artifice/vcr.rb158
-rw-r--r--spec/bundler/support/artifice/windows.rb49
-rw-r--r--spec/bundler/support/builders.rb819
-rw-r--r--spec/bundler/support/code_climate.rb26
-rw-r--r--spec/bundler/support/command_execution.rb57
-rw-r--r--spec/bundler/support/hax.rb67
-rw-r--r--spec/bundler/support/helpers.rb600
-rw-r--r--spec/bundler/support/indexes.rb421
-rw-r--r--spec/bundler/support/less_than_proc.rb20
-rw-r--r--spec/bundler/support/manpages.rb14
-rw-r--r--spec/bundler/support/matchers.rb246
-rw-r--r--spec/bundler/support/path.rb126
-rw-r--r--spec/bundler/support/permissions.rb12
-rw-r--r--spec/bundler/support/platforms.rb116
-rw-r--r--spec/bundler/support/rubygems_ext.rb71
-rw-r--r--spec/bundler/support/silent_logger.rb10
-rw-r--r--spec/bundler/support/sometimes.rb57
-rw-r--r--spec/bundler/support/streams.rb19
-rw-r--r--spec/bundler/support/sudo.rb18
-rw-r--r--spec/bundler/support/the_bundle.rb37
-rw-r--r--spec/bundler/update/gemfile_spec.rb66
-rw-r--r--spec/bundler/update/gems/post_install_spec.rb76
-rw-r--r--spec/bundler/update/git_spec.rb374
-rw-r--r--spec/bundler/update/path_spec.rb18
-rw-r--r--spec/bundler/update/redownload_spec.rb36
-rw-r--r--spec/default.mspec58
-rw-r--r--spec/mspec/Gemfile4
-rw-r--r--spec/mspec/Gemfile.lock24
-rw-r--r--spec/mspec/LICENSE22
-rw-r--r--spec/mspec/README.md91
-rw-r--r--spec/mspec/Rakefile6
-rwxr-xr-xspec/mspec/bin/mkspec7
-rwxr-xr-xspec/mspec/bin/mkspec.bat1
-rwxr-xr-xspec/mspec/bin/mspec7
-rwxr-xr-xspec/mspec/bin/mspec-ci7
-rwxr-xr-xspec/mspec/bin/mspec-ci.bat1
-rwxr-xr-xspec/mspec/bin/mspec-run7
-rwxr-xr-xspec/mspec/bin/mspec-run.bat1
-rwxr-xr-xspec/mspec/bin/mspec-tag7
-rwxr-xr-xspec/mspec/bin/mspec-tag.bat1
-rwxr-xr-xspec/mspec/bin/mspec.bat1
-rw-r--r--spec/mspec/lib/mspec.rb20
-rwxr-xr-xspec/mspec/lib/mspec/commands/mkspec.rb155
-rw-r--r--spec/mspec/lib/mspec/commands/mspec-ci.rb78
-rw-r--r--spec/mspec/lib/mspec/commands/mspec-run.rb86
-rw-r--r--spec/mspec/lib/mspec/commands/mspec-tag.rb132
-rwxr-xr-xspec/mspec/lib/mspec/commands/mspec.rb119
-rw-r--r--spec/mspec/lib/mspec/expectations.rb2
-rw-r--r--spec/mspec/lib/mspec/expectations/expectations.rb21
-rw-r--r--spec/mspec/lib/mspec/expectations/should.rb29
-rw-r--r--spec/mspec/lib/mspec/guards.rb11
-rw-r--r--spec/mspec/lib/mspec/guards/block_device.rb16
-rw-r--r--spec/mspec/lib/mspec/guards/bug.rb28
-rw-r--r--spec/mspec/lib/mspec/guards/conflict.rb23
-rw-r--r--spec/mspec/lib/mspec/guards/endian.rb25
-rw-r--r--spec/mspec/lib/mspec/guards/feature.rb45
-rw-r--r--spec/mspec/lib/mspec/guards/guard.rb141
-rw-r--r--spec/mspec/lib/mspec/guards/platform.rb91
-rw-r--r--spec/mspec/lib/mspec/guards/quarantine.rb11
-rw-r--r--spec/mspec/lib/mspec/guards/superuser.rb15
-rw-r--r--spec/mspec/lib/mspec/guards/support.rb14
-rw-r--r--spec/mspec/lib/mspec/guards/version.rb37
-rw-r--r--spec/mspec/lib/mspec/helpers.rb14
-rw-r--r--spec/mspec/lib/mspec/helpers/argf.rb35
-rw-r--r--spec/mspec/lib/mspec/helpers/argv.rb44
-rw-r--r--spec/mspec/lib/mspec/helpers/datetime.rb47
-rw-r--r--spec/mspec/lib/mspec/helpers/fixture.rb24
-rw-r--r--spec/mspec/lib/mspec/helpers/flunk.rb3
-rw-r--r--spec/mspec/lib/mspec/helpers/frozen_error_class.rb17
-rw-r--r--spec/mspec/lib/mspec/helpers/fs.rb64
-rw-r--r--spec/mspec/lib/mspec/helpers/io.rb111
-rw-r--r--spec/mspec/lib/mspec/helpers/mock_to_path.rb6
-rw-r--r--spec/mspec/lib/mspec/helpers/numeric.rb70
-rw-r--r--spec/mspec/lib/mspec/helpers/ruby_exe.rb186
-rw-r--r--spec/mspec/lib/mspec/helpers/scratch.rb17
-rw-r--r--spec/mspec/lib/mspec/helpers/tmp.rb43
-rw-r--r--spec/mspec/lib/mspec/helpers/warning.rb7
-rw-r--r--spec/mspec/lib/mspec/matchers.rb36
-rw-r--r--spec/mspec/lib/mspec/matchers/base.rb107
-rw-r--r--spec/mspec/lib/mspec/matchers/be_an_instance_of.rb26
-rw-r--r--spec/mspec/lib/mspec/matchers/be_ancestor_of.rb24
-rw-r--r--spec/mspec/lib/mspec/matchers/be_close.rb27
-rw-r--r--spec/mspec/lib/mspec/matchers/be_computed_by.rb37
-rw-r--r--spec/mspec/lib/mspec/matchers/be_empty.rb20
-rw-r--r--spec/mspec/lib/mspec/matchers/be_false.rb20
-rw-r--r--spec/mspec/lib/mspec/matchers/be_kind_of.rb24
-rw-r--r--spec/mspec/lib/mspec/matchers/be_nan.rb20
-rw-r--r--spec/mspec/lib/mspec/matchers/be_nil.rb20
-rw-r--r--spec/mspec/lib/mspec/matchers/be_true.rb20
-rw-r--r--spec/mspec/lib/mspec/matchers/be_true_or_false.rb20
-rw-r--r--spec/mspec/lib/mspec/matchers/block_caller.rb37
-rw-r--r--spec/mspec/lib/mspec/matchers/complain.rb60
-rw-r--r--spec/mspec/lib/mspec/matchers/eql.rb26
-rw-r--r--spec/mspec/lib/mspec/matchers/equal.rb26
-rw-r--r--spec/mspec/lib/mspec/matchers/equal_element.rb78
-rw-r--r--spec/mspec/lib/mspec/matchers/have_class_variable.rb12
-rw-r--r--spec/mspec/lib/mspec/matchers/have_constant.rb12
-rw-r--r--spec/mspec/lib/mspec/matchers/have_instance_method.rb24
-rw-r--r--spec/mspec/lib/mspec/matchers/have_instance_variable.rb12
-rw-r--r--spec/mspec/lib/mspec/matchers/have_method.rb24
-rw-r--r--spec/mspec/lib/mspec/matchers/have_private_instance_method.rb24
-rw-r--r--spec/mspec/lib/mspec/matchers/have_private_method.rb24
-rw-r--r--spec/mspec/lib/mspec/matchers/have_protected_instance_method.rb24
-rw-r--r--spec/mspec/lib/mspec/matchers/have_public_instance_method.rb24
-rw-r--r--spec/mspec/lib/mspec/matchers/have_singleton_method.rb24
-rw-r--r--spec/mspec/lib/mspec/matchers/include.rb31
-rw-r--r--spec/mspec/lib/mspec/matchers/include_any_of.rb29
-rw-r--r--spec/mspec/lib/mspec/matchers/infinity.rb28
-rw-r--r--spec/mspec/lib/mspec/matchers/match_yaml.rb46
-rw-r--r--spec/mspec/lib/mspec/matchers/method.rb10
-rw-r--r--spec/mspec/lib/mspec/matchers/output.rb67
-rw-r--r--spec/mspec/lib/mspec/matchers/output_to_fd.rb71
-rw-r--r--spec/mspec/lib/mspec/matchers/raise_error.rb85
-rw-r--r--spec/mspec/lib/mspec/matchers/respond_to.rb24
-rw-r--r--spec/mspec/lib/mspec/matchers/signed_zero.rb28
-rw-r--r--spec/mspec/lib/mspec/matchers/variable.rb24
-rw-r--r--spec/mspec/lib/mspec/mocks.rb3
-rw-r--r--spec/mspec/lib/mspec/mocks/mock.rb212
-rw-r--r--spec/mspec/lib/mspec/mocks/object.rb28
-rw-r--r--spec/mspec/lib/mspec/mocks/proxy.rb186
-rw-r--r--spec/mspec/lib/mspec/runner.rb12
-rw-r--r--spec/mspec/lib/mspec/runner/actions.rb6
-rw-r--r--spec/mspec/lib/mspec/runner/actions/filter.rb40
-rw-r--r--spec/mspec/lib/mspec/runner/actions/leakchecker.rb301
-rw-r--r--spec/mspec/lib/mspec/runner/actions/tag.rb133
-rw-r--r--spec/mspec/lib/mspec/runner/actions/taglist.rb56
-rw-r--r--spec/mspec/lib/mspec/runner/actions/tagpurge.rb56
-rw-r--r--spec/mspec/lib/mspec/runner/actions/tally.rb133
-rw-r--r--spec/mspec/lib/mspec/runner/actions/timer.rb22
-rw-r--r--spec/mspec/lib/mspec/runner/context.rb239
-rw-r--r--spec/mspec/lib/mspec/runner/evaluate.rb54
-rw-r--r--spec/mspec/lib/mspec/runner/example.rb34
-rw-r--r--spec/mspec/lib/mspec/runner/exception.rb43
-rw-r--r--spec/mspec/lib/mspec/runner/filters.rb4
-rw-r--r--spec/mspec/lib/mspec/runner/filters/match.rb18
-rw-r--r--spec/mspec/lib/mspec/runner/filters/profile.rb54
-rw-r--r--spec/mspec/lib/mspec/runner/filters/regexp.rb23
-rw-r--r--spec/mspec/lib/mspec/runner/filters/tag.rb29
-rw-r--r--spec/mspec/lib/mspec/runner/formatters.rb12
-rw-r--r--spec/mspec/lib/mspec/runner/formatters/describe.rb24
-rw-r--r--spec/mspec/lib/mspec/runner/formatters/dotted.rb117
-rw-r--r--spec/mspec/lib/mspec/runner/formatters/file.rb19
-rw-r--r--spec/mspec/lib/mspec/runner/formatters/html.rb81
-rw-r--r--spec/mspec/lib/mspec/runner/formatters/junit.rb88
-rw-r--r--spec/mspec/lib/mspec/runner/formatters/method.rb93
-rw-r--r--spec/mspec/lib/mspec/runner/formatters/multi.rb40
-rw-r--r--spec/mspec/lib/mspec/runner/formatters/profile.rb70
-rw-r--r--spec/mspec/lib/mspec/runner/formatters/specdoc.rb41
-rw-r--r--spec/mspec/lib/mspec/runner/formatters/spinner.rb117
-rw-r--r--spec/mspec/lib/mspec/runner/formatters/summary.rb11
-rw-r--r--spec/mspec/lib/mspec/runner/formatters/unit.rb21
-rw-r--r--spec/mspec/lib/mspec/runner/formatters/yaml.rb42
-rw-r--r--spec/mspec/lib/mspec/runner/mspec.rb408
-rw-r--r--spec/mspec/lib/mspec/runner/object.rb26
-rw-r--r--spec/mspec/lib/mspec/runner/parallel.rb98
-rw-r--r--spec/mspec/lib/mspec/runner/shared.rb10
-rw-r--r--spec/mspec/lib/mspec/runner/tag.rb38
-rw-r--r--spec/mspec/lib/mspec/utils/deprecate.rb6
-rw-r--r--spec/mspec/lib/mspec/utils/name_map.rb121
-rw-r--r--spec/mspec/lib/mspec/utils/options.rb481
-rw-r--r--spec/mspec/lib/mspec/utils/script.rb278
-rw-r--r--spec/mspec/lib/mspec/utils/version.rb52
-rw-r--r--spec/mspec/lib/mspec/utils/warnings.rb61
-rw-r--r--spec/mspec/lib/mspec/version.rb5
-rw-r--r--spec/mspec/spec/commands/fixtures/four.txt0
-rw-r--r--spec/mspec/spec/commands/fixtures/level2/three_spec.rb1
-rw-r--r--spec/mspec/spec/commands/fixtures/one_spec.rb1
-rw-r--r--spec/mspec/spec/commands/fixtures/three.rb1
-rw-r--r--spec/mspec/spec/commands/fixtures/two_spec.rb1
-rw-r--r--spec/mspec/spec/commands/mkspec_spec.rb363
-rw-r--r--spec/mspec/spec/commands/mspec_ci_spec.rb150
-rw-r--r--spec/mspec/spec/commands/mspec_run_spec.rb173
-rw-r--r--spec/mspec/spec/commands/mspec_spec.rb207
-rw-r--r--spec/mspec/spec/commands/mspec_tag_spec.rb414
-rw-r--r--spec/mspec/spec/expectations/expectations_spec.rb29
-rw-r--r--spec/mspec/spec/expectations/should.rb73
-rw-r--r--spec/mspec/spec/expectations/should_spec.rb61
-rw-r--r--spec/mspec/spec/fixtures/a_spec.rb15
-rw-r--r--spec/mspec/spec/fixtures/b_spec.rb7
-rw-r--r--spec/mspec/spec/fixtures/chatty_spec.rb8
-rw-r--r--spec/mspec/spec/fixtures/config.mspec10
-rw-r--r--spec/mspec/spec/fixtures/die_spec.rb7
-rwxr-xr-xspec/mspec/spec/fixtures/my_ruby4
-rw-r--r--spec/mspec/spec/fixtures/object_methods_spec.rb8
-rw-r--r--spec/mspec/spec/fixtures/print_interpreter_spec.rb4
-rw-r--r--spec/mspec/spec/fixtures/tagging_spec.rb16
-rw-r--r--spec/mspec/spec/guards/block_device_spec.rb46
-rw-r--r--spec/mspec/spec/guards/bug_spec.rb151
-rw-r--r--spec/mspec/spec/guards/conflict_spec.rb53
-rw-r--r--spec/mspec/spec/guards/endian_spec.rb55
-rw-r--r--spec/mspec/spec/guards/feature_spec.rb120
-rw-r--r--spec/mspec/spec/guards/guard_spec.rb421
-rw-r--r--spec/mspec/spec/guards/platform_spec.rb328
-rw-r--r--spec/mspec/spec/guards/quarantine_spec.rb35
-rw-r--r--spec/mspec/spec/guards/superuser_spec.rb35
-rw-r--r--spec/mspec/spec/guards/support_spec.rb54
-rw-r--r--spec/mspec/spec/guards/user_spec.rb20
-rw-r--r--spec/mspec/spec/guards/version_spec.rb90
-rw-r--r--spec/mspec/spec/helpers/argf_spec.rb37
-rw-r--r--spec/mspec/spec/helpers/argv_spec.rb27
-rw-r--r--spec/mspec/spec/helpers/datetime_spec.rb44
-rw-r--r--spec/mspec/spec/helpers/fixture_spec.rb25
-rw-r--r--spec/mspec/spec/helpers/flunk_spec.rb20
-rw-r--r--spec/mspec/spec/helpers/fs_spec.rb195
-rw-r--r--spec/mspec/spec/helpers/io_spec.rb174
-rw-r--r--spec/mspec/spec/helpers/mock_to_path_spec.rb17
-rw-r--r--spec/mspec/spec/helpers/numeric_spec.rb25
-rw-r--r--spec/mspec/spec/helpers/ruby_exe_spec.rb197
-rw-r--r--spec/mspec/spec/helpers/scratch_spec.rb24
-rw-r--r--spec/mspec/spec/helpers/suppress_warning_spec.rb19
-rw-r--r--spec/mspec/spec/helpers/tmp_spec.rb27
-rw-r--r--spec/mspec/spec/integration/interpreter_spec.rb18
-rw-r--r--spec/mspec/spec/integration/object_methods_spec.rb18
-rw-r--r--spec/mspec/spec/integration/run_spec.rb68
-rw-r--r--spec/mspec/spec/integration/tag_spec.rb63
-rw-r--r--spec/mspec/spec/matchers/base_spec.rb225
-rw-r--r--spec/mspec/spec/matchers/be_an_instance_of_spec.rb50
-rw-r--r--spec/mspec/spec/matchers/be_ancestor_of_spec.rb28
-rw-r--r--spec/mspec/spec/matchers/be_close_spec.rb48
-rw-r--r--spec/mspec/spec/matchers/be_computed_by_spec.rb42
-rw-r--r--spec/mspec/spec/matchers/be_empty_spec.rb26
-rw-r--r--spec/mspec/spec/matchers/be_false_spec.rb28
-rw-r--r--spec/mspec/spec/matchers/be_kind_of_spec.rb31
-rw-r--r--spec/mspec/spec/matchers/be_nan_spec.rb28
-rw-r--r--spec/mspec/spec/matchers/be_nil_spec.rb27
-rw-r--r--spec/mspec/spec/matchers/be_true_or_false_spec.rb19
-rw-r--r--spec/mspec/spec/matchers/be_true_spec.rb28
-rw-r--r--spec/mspec/spec/matchers/block_caller_spec.rb13
-rw-r--r--spec/mspec/spec/matchers/complain_spec.rb52
-rw-r--r--spec/mspec/spec/matchers/eql_spec.rb33
-rw-r--r--spec/mspec/spec/matchers/equal_element_spec.rb75
-rw-r--r--spec/mspec/spec/matchers/equal_spec.rb32
-rw-r--r--spec/mspec/spec/matchers/have_class_variable_spec.rb49
-rw-r--r--spec/mspec/spec/matchers/have_constant_spec.rb37
-rw-r--r--spec/mspec/spec/matchers/have_instance_method_spec.rb53
-rw-r--r--spec/mspec/spec/matchers/have_instance_variable_spec.rb50
-rw-r--r--spec/mspec/spec/matchers/have_method_spec.rb55
-rw-r--r--spec/mspec/spec/matchers/have_private_instance_method_spec.rb57
-rw-r--r--spec/mspec/spec/matchers/have_private_method_spec.rb44
-rw-r--r--spec/mspec/spec/matchers/have_protected_instance_method_spec.rb57
-rw-r--r--spec/mspec/spec/matchers/have_public_instance_method_spec.rb53
-rw-r--r--spec/mspec/spec/matchers/have_singleton_method_spec.rb45
-rw-r--r--spec/mspec/spec/matchers/include_any_of_spec.rb42
-rw-r--r--spec/mspec/spec/matchers/include_spec.rb37
-rw-r--r--spec/mspec/spec/matchers/infinity_spec.rb34
-rw-r--r--spec/mspec/spec/matchers/match_yaml_spec.rb39
-rw-r--r--spec/mspec/spec/matchers/output_spec.rb74
-rw-r--r--spec/mspec/spec/matchers/output_to_fd_spec.rb44
-rw-r--r--spec/mspec/spec/matchers/raise_error_spec.rb120
-rw-r--r--spec/mspec/spec/matchers/respond_to_spec.rb33
-rw-r--r--spec/mspec/spec/matchers/signed_zero_spec.rb32
-rw-r--r--spec/mspec/spec/mocks/mock_spec.rb530
-rw-r--r--spec/mspec/spec/mocks/proxy_spec.rb405
-rw-r--r--spec/mspec/spec/runner/actions/filter_spec.rb84
-rw-r--r--spec/mspec/spec/runner/actions/tag_spec.rb315
-rw-r--r--spec/mspec/spec/runner/actions/taglist_spec.rb152
-rw-r--r--spec/mspec/spec/runner/actions/tagpurge_spec.rb154
-rw-r--r--spec/mspec/spec/runner/actions/tally_spec.rb352
-rw-r--r--spec/mspec/spec/runner/actions/timer_spec.rb44
-rw-r--r--spec/mspec/spec/runner/context_spec.rb1041
-rw-r--r--spec/mspec/spec/runner/example_spec.rb117
-rw-r--r--spec/mspec/spec/runner/exception_spec.rb146
-rw-r--r--spec/mspec/spec/runner/filters/a.yaml4
-rw-r--r--spec/mspec/spec/runner/filters/b.yaml11
-rw-r--r--spec/mspec/spec/runner/filters/match_spec.rb34
-rw-r--r--spec/mspec/spec/runner/filters/profile_spec.rb117
-rw-r--r--spec/mspec/spec/runner/filters/regexp_spec.rb31
-rw-r--r--spec/mspec/spec/runner/filters/tag_spec.rb92
-rw-r--r--spec/mspec/spec/runner/formatters/describe_spec.rb67
-rw-r--r--spec/mspec/spec/runner/formatters/dotted_spec.rb285
-rw-r--r--spec/mspec/spec/runner/formatters/file_spec.rb84
-rw-r--r--spec/mspec/spec/runner/formatters/html_spec.rb216
-rw-r--r--spec/mspec/spec/runner/formatters/junit_spec.rb147
-rw-r--r--spec/mspec/spec/runner/formatters/method_spec.rb178
-rw-r--r--spec/mspec/spec/runner/formatters/multi_spec.rb68
-rw-r--r--spec/mspec/spec/runner/formatters/specdoc_spec.rb106
-rw-r--r--spec/mspec/spec/runner/formatters/spinner_spec.rb83
-rw-r--r--spec/mspec/spec/runner/formatters/summary_spec.rb26
-rw-r--r--spec/mspec/spec/runner/formatters/unit_spec.rb74
-rw-r--r--spec/mspec/spec/runner/formatters/yaml_spec.rb125
-rw-r--r--spec/mspec/spec/runner/mspec_spec.rb595
-rw-r--r--spec/mspec/spec/runner/shared_spec.rb90
-rw-r--r--spec/mspec/spec/runner/tag_spec.rb123
-rw-r--r--spec/mspec/spec/runner/tags.txt4
-rw-r--r--spec/mspec/spec/spec_helper.rb55
-rw-r--r--spec/mspec/spec/utils/deprecate_spec.rb17
-rw-r--r--spec/mspec/spec/utils/name_map_spec.rb175
-rw-r--r--spec/mspec/spec/utils/options_spec.rb1285
-rw-r--r--spec/mspec/spec/utils/script_spec.rb475
-rw-r--r--spec/mspec/spec/utils/version_spec.rb45
-rwxr-xr-xspec/mspec/tool/find.rb10
-rwxr-xr-xspec/mspec/tool/pull-latest-mspec-spec19
-rw-r--r--spec/mspec/tool/remove_old_guards.rb41
-rw-r--r--spec/mspec/tool/sync/.gitignore4
-rw-r--r--spec/mspec/tool/sync/sync-rubyspec.rb229
-rw-r--r--spec/ruby/.gitignore5
-rw-r--r--spec/ruby/.rubocop.yml98
-rw-r--r--spec/ruby/.rubocop_todo.yml153
-rw-r--r--spec/ruby/.travis.yml30
-rw-r--r--spec/ruby/CHANGES.before-2008-05-1017796
-rw-r--r--spec/ruby/CONTRIBUTING.md243
-rw-r--r--spec/ruby/LICENSE22
-rw-r--r--spec/ruby/README.md108
-rw-r--r--spec/ruby/TODO8
-rw-r--r--spec/ruby/appveyor.yml34
-rw-r--r--spec/ruby/command_line/dash_a_spec.rb19
-rw-r--r--spec/ruby/command_line/dash_c_spec.rb13
-rw-r--r--spec/ruby/command_line/dash_d_spec.rb22
-rw-r--r--spec/ruby/command_line/dash_e_spec.rb41
-rw-r--r--spec/ruby/command_line/dash_encoding_spec.rb30
-rw-r--r--spec/ruby/command_line/dash_external_encoding_spec.rb15
-rw-r--r--spec/ruby/command_line/dash_internal_encoding_spec.rb15
-rw-r--r--spec/ruby/command_line/dash_n_spec.rb36
-rw-r--r--spec/ruby/command_line/dash_p_spec.rb19
-rw-r--r--spec/ruby/command_line/dash_r_spec.rb13
-rw-r--r--spec/ruby/command_line/dash_s_spec.rb52
-rw-r--r--spec/ruby/command_line/dash_upper_c_spec.rb23
-rw-r--r--spec/ruby/command_line/dash_upper_e_spec.rb36
-rw-r--r--spec/ruby/command_line/dash_upper_f_spec.rb13
-rw-r--r--spec/ruby/command_line/dash_upper_i_spec.rb51
-rw-r--r--spec/ruby/command_line/dash_upper_k_spec.rb65
-rw-r--r--spec/ruby/command_line/dash_upper_s_spec.rb29
-rw-r--r--spec/ruby/command_line/dash_upper_u_spec.rb43
-rw-r--r--spec/ruby/command_line/dash_upper_w_spec.rb20
-rw-r--r--spec/ruby/command_line/dash_v_spec.rb12
-rw-r--r--spec/ruby/command_line/dash_w_spec.rb6
-rw-r--r--spec/ruby/command_line/dash_x_spec.rb23
-rw-r--r--spec/ruby/command_line/error_message_spec.rb11
-rw-r--r--spec/ruby/command_line/fixtures/bad_syntax.rb1
-rw-r--r--spec/ruby/command_line/fixtures/bin/bad_embedded_ruby.txt3
-rw-r--r--spec/ruby/command_line/fixtures/bin/dash_s_fail1
-rw-r--r--spec/ruby/command_line/fixtures/bin/embedded_ruby.txt3
-rw-r--r--spec/ruby/command_line/fixtures/bin/hybrid_launcher.sh4
-rwxr-xr-xspec/ruby/command_line/fixtures/bin/launcher.rb2
-rw-r--r--spec/ruby/command_line/fixtures/conditional_range.txt5
-rw-r--r--spec/ruby/command_line/fixtures/dash_s_script.rb12
-rw-r--r--spec/ruby/command_line/fixtures/dash_upper_c_script.rb1
-rw-r--r--spec/ruby/command_line/fixtures/debug.rb10
-rw-r--r--spec/ruby/command_line/fixtures/debug_info.rb11
-rw-r--r--spec/ruby/command_line/fixtures/freeze_flag_across_files.rb3
-rw-r--r--spec/ruby/command_line/fixtures/freeze_flag_across_files_diff_enc.rb3
-rw-r--r--spec/ruby/command_line/fixtures/freeze_flag_one_literal.rb2
-rw-r--r--spec/ruby/command_line/fixtures/freeze_flag_required.rb1
-rw-r--r--spec/ruby/command_line/fixtures/freeze_flag_required_diff_enc.rbbin121 -> 0 bytes-rw-r--r--spec/ruby/command_line/fixtures/freeze_flag_two_literals.rb1
-rw-r--r--spec/ruby/command_line/fixtures/full_names.txt3
-rw-r--r--spec/ruby/command_line/fixtures/loadpath.rb1
-rw-r--r--spec/ruby/command_line/fixtures/names.txt3
-rw-r--r--spec/ruby/command_line/fixtures/passwd_file.txt3
-rw-r--r--spec/ruby/command_line/fixtures/require.rb1
-rw-r--r--spec/ruby/command_line/fixtures/rubyopt.rb1
-rw-r--r--spec/ruby/command_line/fixtures/test_file.rb1
-rw-r--r--spec/ruby/command_line/fixtures/verbose.rb1
-rw-r--r--spec/ruby/command_line/frozen_strings_spec.rb28
-rw-r--r--spec/ruby/command_line/rubylib_spec.rb68
-rw-r--r--spec/ruby/command_line/rubyopt_spec.rb167
-rw-r--r--spec/ruby/command_line/shared/verbose.rb9
-rw-r--r--spec/ruby/command_line/syntax_error_spec.rb13
-rw-r--r--spec/ruby/core/argf/argf_spec.rb11
-rw-r--r--spec/ruby/core/argf/argv_spec.rb19
-rw-r--r--spec/ruby/core/argf/binmode_spec.rb43
-rw-r--r--spec/ruby/core/argf/bytes_spec.rb6
-rw-r--r--spec/ruby/core/argf/chars_spec.rb6
-rw-r--r--spec/ruby/core/argf/close_spec.rb35
-rw-r--r--spec/ruby/core/argf/closed_spec.rb18
-rw-r--r--spec/ruby/core/argf/codepoints_spec.rb6
-rw-r--r--spec/ruby/core/argf/each_byte_spec.rb6
-rw-r--r--spec/ruby/core/argf/each_char_spec.rb6
-rw-r--r--spec/ruby/core/argf/each_codepoint_spec.rb6
-rw-r--r--spec/ruby/core/argf/each_line_spec.rb6
-rw-r--r--spec/ruby/core/argf/each_spec.rb6
-rw-r--r--spec/ruby/core/argf/eof_spec.rb10
-rw-r--r--spec/ruby/core/argf/file_spec.rb21
-rw-r--r--spec/ruby/core/argf/filename_spec.rb6
-rw-r--r--spec/ruby/core/argf/fileno_spec.rb6
-rw-r--r--spec/ruby/core/argf/fixtures/bin_file.txt2
-rw-r--r--spec/ruby/core/argf/fixtures/file1.txt2
-rw-r--r--spec/ruby/core/argf/fixtures/file2.txt2
-rw-r--r--spec/ruby/core/argf/fixtures/filename.rb3
-rw-r--r--spec/ruby/core/argf/fixtures/lineno.rb5
-rw-r--r--spec/ruby/core/argf/fixtures/rewind.rb5
-rw-r--r--spec/ruby/core/argf/fixtures/stdin.txt2
-rw-r--r--spec/ruby/core/argf/getc_spec.rb20
-rw-r--r--spec/ruby/core/argf/gets_spec.rb51
-rw-r--r--spec/ruby/core/argf/lineno_spec.rb30
-rw-r--r--spec/ruby/core/argf/lines_spec.rb6
-rw-r--r--spec/ruby/core/argf/path_spec.rb6
-rw-r--r--spec/ruby/core/argf/pos_spec.rb38
-rw-r--r--spec/ruby/core/argf/read_nonblock_spec.rb80
-rw-r--r--spec/ruby/core/argf/read_spec.rb87
-rw-r--r--spec/ruby/core/argf/readchar_spec.rb19
-rw-r--r--spec/ruby/core/argf/readline_spec.rb23
-rw-r--r--spec/ruby/core/argf/readlines_spec.rb6
-rw-r--r--spec/ruby/core/argf/readpartial_spec.rb75
-rw-r--r--spec/ruby/core/argf/rewind_spec.rb39
-rw-r--r--spec/ruby/core/argf/seek_spec.rb63
-rw-r--r--spec/ruby/core/argf/set_encoding_spec.rb41
-rw-r--r--spec/ruby/core/argf/shared/each_byte.rb58
-rw-r--r--spec/ruby/core/argf/shared/each_char.rb58
-rw-r--r--spec/ruby/core/argf/shared/each_codepoint.rb58
-rw-r--r--spec/ruby/core/argf/shared/each_line.rb62
-rw-r--r--spec/ruby/core/argf/shared/eof.rb24
-rw-r--r--spec/ruby/core/argf/shared/filename.rb28
-rw-r--r--spec/ruby/core/argf/shared/fileno.rb24
-rw-r--r--spec/ruby/core/argf/shared/getc.rb17
-rw-r--r--spec/ruby/core/argf/shared/gets.rb99
-rw-r--r--spec/ruby/core/argf/shared/pos.rb31
-rw-r--r--spec/ruby/core/argf/shared/read.rb58
-rw-r--r--spec/ruby/core/argf/shared/readlines.rb22
-rw-r--r--spec/ruby/core/argf/skip_spec.rb42
-rw-r--r--spec/ruby/core/argf/tell_spec.rb6
-rw-r--r--spec/ruby/core/argf/to_a_spec.rb6
-rw-r--r--spec/ruby/core/argf/to_i_spec.rb6
-rw-r--r--spec/ruby/core/argf/to_io_spec.rb23
-rw-r--r--spec/ruby/core/argf/to_s_spec.rb14
-rw-r--r--spec/ruby/core/array/allocate_spec.rb19
-rw-r--r--spec/ruby/core/array/any_spec.rb37
-rw-r--r--spec/ruby/core/array/append_spec.rb42
-rw-r--r--spec/ruby/core/array/array_spec.rb7
-rw-r--r--spec/ruby/core/array/assoc_spec.rb40
-rw-r--r--spec/ruby/core/array/at_spec.rb56
-rw-r--r--spec/ruby/core/array/bsearch_index_spec.rb85
-rw-r--r--spec/ruby/core/array/bsearch_spec.rb84
-rw-r--r--spec/ruby/core/array/clear_spec.rb48
-rw-r--r--spec/ruby/core/array/clone_spec.rb31
-rw-r--r--spec/ruby/core/array/collect_spec.rb11
-rw-r--r--spec/ruby/core/array/combination_spec.rb74
-rw-r--r--spec/ruby/core/array/compact_spec.rb77
-rw-r--r--spec/ruby/core/array/comparison_spec.rb97
-rw-r--r--spec/ruby/core/array/concat_spec.rb132
-rw-r--r--spec/ruby/core/array/constructor_spec.rb24
-rw-r--r--spec/ruby/core/array/count_spec.rb15
-rw-r--r--spec/ruby/core/array/cycle_spec.rb101
-rw-r--r--spec/ruby/core/array/delete_at_spec.rb61
-rw-r--r--spec/ruby/core/array/delete_if_spec.rb66
-rw-r--r--spec/ruby/core/array/delete_spec.rb66
-rw-r--r--spec/ruby/core/array/dig_spec.rb52
-rw-r--r--spec/ruby/core/array/drop_spec.rb33
-rw-r--r--spec/ruby/core/array/drop_while_spec.rb15
-rw-r--r--spec/ruby/core/array/dup_spec.rb31
-rw-r--r--spec/ruby/core/array/each_index_spec.rb42
-rw-r--r--spec/ruby/core/array/each_spec.rb32
-rw-r--r--spec/ruby/core/array/element_reference_spec.rb50
-rw-r--r--spec/ruby/core/array/element_set_spec.rb436
-rw-r--r--spec/ruby/core/array/empty_spec.rb10
-rw-r--r--spec/ruby/core/array/eql_spec.rb19
-rw-r--r--spec/ruby/core/array/equal_value_spec.rb51
-rw-r--r--spec/ruby/core/array/fetch_spec.rb55
-rw-r--r--spec/ruby/core/array/fill_spec.rb317
-rw-r--r--spec/ruby/core/array/filter_spec.rb16
-rw-r--r--spec/ruby/core/array/find_index_spec.rb6
-rw-r--r--spec/ruby/core/array/first_spec.rb93
-rw-r--r--spec/ruby/core/array/fixtures/classes.rb522
-rw-r--r--spec/ruby/core/array/fixtures/encoded_strings.rb69
-rw-r--r--spec/ruby/core/array/flatten_spec.rb284
-rw-r--r--spec/ruby/core/array/frozen_spec.rb16
-rw-r--r--spec/ruby/core/array/hash_spec.rb83
-rw-r--r--spec/ruby/core/array/include_spec.rb33
-rw-r--r--spec/ruby/core/array/index_spec.rb6
-rw-r--r--spec/ruby/core/array/initialize_spec.rb156
-rw-r--r--spec/ruby/core/array/insert_spec.rb78
-rw-r--r--spec/ruby/core/array/inspect_spec.rb7
-rw-r--r--spec/ruby/core/array/intersection_spec.rb87
-rw-r--r--spec/ruby/core/array/join_spec.rb48
-rw-r--r--spec/ruby/core/array/keep_if_spec.rb10
-rw-r--r--spec/ruby/core/array/last_spec.rb87
-rw-r--r--spec/ruby/core/array/length_spec.rb7
-rw-r--r--spec/ruby/core/array/map_spec.rb11
-rw-r--r--spec/ruby/core/array/max_spec.rb118
-rw-r--r--spec/ruby/core/array/min_spec.rb123
-rw-r--r--spec/ruby/core/array/minus_spec.rb87
-rw-r--r--spec/ruby/core/array/multiply_spec.rb132
-rw-r--r--spec/ruby/core/array/new_spec.rb122
-rw-r--r--spec/ruby/core/array/pack/a_spec.rb62
-rw-r--r--spec/ruby/core/array/pack/at_spec.rb30
-rw-r--r--spec/ruby/core/array/pack/b_spec.rb108
-rw-r--r--spec/ruby/core/array/pack/buffer_spec.rb52
-rw-r--r--spec/ruby/core/array/pack/c_spec.rb75
-rw-r--r--spec/ruby/core/array/pack/comment_spec.rb25
-rw-r--r--spec/ruby/core/array/pack/d_spec.rb39
-rw-r--r--spec/ruby/core/array/pack/e_spec.rb25
-rw-r--r--spec/ruby/core/array/pack/empty_spec.rb11
-rw-r--r--spec/ruby/core/array/pack/f_spec.rb39
-rw-r--r--spec/ruby/core/array/pack/g_spec.rb25
-rw-r--r--spec/ruby/core/array/pack/h_spec.rb200
-rw-r--r--spec/ruby/core/array/pack/i_spec.rb133
-rw-r--r--spec/ruby/core/array/pack/j_spec.rb217
-rw-r--r--spec/ruby/core/array/pack/l_spec.rb221
-rw-r--r--spec/ruby/core/array/pack/m_spec.rb309
-rw-r--r--spec/ruby/core/array/pack/n_spec.rb25
-rw-r--r--spec/ruby/core/array/pack/p_spec.rb58
-rw-r--r--spec/ruby/core/array/pack/percent_spec.rb7
-rw-r--r--spec/ruby/core/array/pack/q_spec.rb61
-rw-r--r--spec/ruby/core/array/pack/s_spec.rb133
-rw-r--r--spec/ruby/core/array/pack/shared/basic.rb65
-rw-r--r--spec/ruby/core/array/pack/shared/encodings.rb16
-rw-r--r--spec/ruby/core/array/pack/shared/float.rb249
-rw-r--r--spec/ruby/core/array/pack/shared/integer.rb381
-rw-r--r--spec/ruby/core/array/pack/shared/numeric_basic.rb44
-rw-r--r--spec/ruby/core/array/pack/shared/string.rb48
-rw-r--r--spec/ruby/core/array/pack/shared/taint.rb33
-rw-r--r--spec/ruby/core/array/pack/shared/unicode.rb94
-rw-r--r--spec/ruby/core/array/pack/u_spec.rb130
-rw-r--r--spec/ruby/core/array/pack/v_spec.rb25
-rw-r--r--spec/ruby/core/array/pack/w_spec.rb42
-rw-r--r--spec/ruby/core/array/pack/x_spec.rb64
-rw-r--r--spec/ruby/core/array/pack/z_spec.rb34
-rw-r--r--spec/ruby/core/array/partition_spec.rb43
-rw-r--r--spec/ruby/core/array/permutation_spec.rb138
-rw-r--r--spec/ruby/core/array/plus_spec.rb57
-rw-r--r--spec/ruby/core/array/pop_spec.rb168
-rw-r--r--spec/ruby/core/array/prepend_spec.rb9
-rw-r--r--spec/ruby/core/array/product_spec.rb68
-rw-r--r--spec/ruby/core/array/push_spec.rb7
-rw-r--r--spec/ruby/core/array/rassoc_spec.rb38
-rw-r--r--spec/ruby/core/array/reject_spec.rb145
-rw-r--r--spec/ruby/core/array/repeated_combination_spec.rb84
-rw-r--r--spec/ruby/core/array/repeated_permutation_spec.rb94
-rw-r--r--spec/ruby/core/array/replace_spec.rb7
-rw-r--r--spec/ruby/core/array/reverse_each_spec.rb43
-rw-r--r--spec/ruby/core/array/reverse_spec.rb42
-rw-r--r--spec/ruby/core/array/rindex_spec.rb80
-rw-r--r--spec/ruby/core/array/rotate_spec.rb129
-rw-r--r--spec/ruby/core/array/sample_spec.rb155
-rw-r--r--spec/ruby/core/array/select_spec.rb14
-rw-r--r--spec/ruby/core/array/shared/clone.rb42
-rw-r--r--spec/ruby/core/array/shared/collect.rb136
-rw-r--r--spec/ruby/core/array/shared/delete_if.rb13
-rw-r--r--spec/ruby/core/array/shared/enumeratorize.rb5
-rw-r--r--spec/ruby/core/array/shared/eql.rb92
-rw-r--r--spec/ruby/core/array/shared/index.rb37
-rw-r--r--spec/ruby/core/array/shared/inspect.rb131
-rw-r--r--spec/ruby/core/array/shared/join.rb161
-rw-r--r--spec/ruby/core/array/shared/keep_if.rb60
-rw-r--r--spec/ruby/core/array/shared/length.rb11
-rw-r--r--spec/ruby/core/array/shared/push.rb33
-rw-r--r--spec/ruby/core/array/shared/replace.rb60
-rw-r--r--spec/ruby/core/array/shared/select.rb32
-rw-r--r--spec/ruby/core/array/shared/slice.rb459
-rw-r--r--spec/ruby/core/array/shared/unshift.rb46
-rw-r--r--spec/ruby/core/array/shift_spec.rb134
-rw-r--r--spec/ruby/core/array/shuffle_spec.rb102
-rw-r--r--spec/ruby/core/array/size_spec.rb7
-rw-r--r--spec/ruby/core/array/slice_spec.rb160
-rw-r--r--spec/ruby/core/array/sort_by_spec.rb52
-rw-r--r--spec/ruby/core/array/sort_spec.rb252
-rw-r--r--spec/ruby/core/array/sum_spec.rb44
-rw-r--r--spec/ruby/core/array/take_spec.rb27
-rw-r--r--spec/ruby/core/array/take_while_spec.rb15
-rw-r--r--spec/ruby/core/array/to_a_spec.rb24
-rw-r--r--spec/ruby/core/array/to_ary_spec.rb20
-rw-r--r--spec/ruby/core/array/to_h_spec.rb44
-rw-r--r--spec/ruby/core/array/to_s_spec.rb8
-rw-r--r--spec/ruby/core/array/transpose_spec.rb53
-rw-r--r--spec/ruby/core/array/try_convert_spec.rb50
-rw-r--r--spec/ruby/core/array/union_spec.rb82
-rw-r--r--spec/ruby/core/array/uniq_spec.rb221
-rw-r--r--spec/ruby/core/array/unshift_spec.rb7
-rw-r--r--spec/ruby/core/array/values_at_spec.rb63
-rw-r--r--spec/ruby/core/array/zip_spec.rb65
-rw-r--r--spec/ruby/core/basicobject/__id__spec.rb6
-rw-r--r--spec/ruby/core/basicobject/__send___spec.rb10
-rw-r--r--spec/ruby/core/basicobject/basicobject_spec.rb87
-rw-r--r--spec/ruby/core/basicobject/equal_spec.rb52
-rw-r--r--spec/ruby/core/basicobject/equal_value_spec.rb10
-rw-r--r--spec/ruby/core/basicobject/fixtures/classes.rb33
-rw-r--r--spec/ruby/core/basicobject/fixtures/common.rb9
-rw-r--r--spec/ruby/core/basicobject/fixtures/remove_method_missing.rb9
-rw-r--r--spec/ruby/core/basicobject/fixtures/singleton_method.rb10
-rw-r--r--spec/ruby/core/basicobject/initialize_spec.rb13
-rw-r--r--spec/ruby/core/basicobject/instance_eval_spec.rb188
-rw-r--r--spec/ruby/core/basicobject/instance_exec_spec.rb107
-rw-r--r--spec/ruby/core/basicobject/method_missing_spec.rb39
-rw-r--r--spec/ruby/core/basicobject/not_equal_spec.rb53
-rw-r--r--spec/ruby/core/basicobject/not_spec.rb11
-rw-r--r--spec/ruby/core/basicobject/singleton_method_added_spec.rb86
-rw-r--r--spec/ruby/core/basicobject/singleton_method_removed_spec.rb24
-rw-r--r--spec/ruby/core/basicobject/singleton_method_undefined_spec.rb24
-rw-r--r--spec/ruby/core/binding/clone_spec.rb7
-rw-r--r--spec/ruby/core/binding/dup_spec.rb7
-rw-r--r--spec/ruby/core/binding/eval_spec.rb95
-rw-r--r--spec/ruby/core/binding/fixtures/classes.rb52
-rw-r--r--spec/ruby/core/binding/local_variable_defined_spec.rb46
-rw-r--r--spec/ruby/core/binding/local_variable_get_spec.rb56
-rw-r--r--spec/ruby/core/binding/local_variable_set_spec.rb71
-rw-r--r--spec/ruby/core/binding/local_variables_spec.rb35
-rw-r--r--spec/ruby/core/binding/receiver_spec.rb11
-rw-r--r--spec/ruby/core/binding/shared/clone.rb34
-rw-r--r--spec/ruby/core/builtin_constants/builtin_constants_spec.rb49
-rw-r--r--spec/ruby/core/class/allocate_spec.rb41
-rw-r--r--spec/ruby/core/class/dup_spec.rb64
-rw-r--r--spec/ruby/core/class/fixtures/classes.rb47
-rw-r--r--spec/ruby/core/class/inherited_spec.rb101
-rw-r--r--spec/ruby/core/class/initialize_spec.rb34
-rw-r--r--spec/ruby/core/class/new_spec.rb154
-rw-r--r--spec/ruby/core/class/superclass_spec.rb27
-rw-r--r--spec/ruby/core/class/to_s_spec.rb23
-rw-r--r--spec/ruby/core/comparable/between_spec.rb25
-rw-r--r--spec/ruby/core/comparable/clamp_spec.rb50
-rw-r--r--spec/ruby/core/comparable/equal_value_spec.rb114
-rw-r--r--spec/ruby/core/comparable/fixtures/classes.rb36
-rw-r--r--spec/ruby/core/comparable/gt_spec.rb43
-rw-r--r--spec/ruby/core/comparable/gte_spec.rb47
-rw-r--r--spec/ruby/core/comparable/lt_spec.rb43
-rw-r--r--spec/ruby/core/comparable/lte_spec.rb46
-rw-r--r--spec/ruby/core/complex/abs2_spec.rb9
-rw-r--r--spec/ruby/core/complex/abs_spec.rb6
-rw-r--r--spec/ruby/core/complex/angle_spec.rb6
-rw-r--r--spec/ruby/core/complex/arg_spec.rb6
-rw-r--r--spec/ruby/core/complex/coerce_spec.rb70
-rw-r--r--spec/ruby/core/complex/conj_spec.rb6
-rw-r--r--spec/ruby/core/complex/conjugate_spec.rb6
-rw-r--r--spec/ruby/core/complex/constants_spec.rb7
-rw-r--r--spec/ruby/core/complex/denominator_spec.rb13
-rw-r--r--spec/ruby/core/complex/divide_spec.rb6
-rw-r--r--spec/ruby/core/complex/eql_spec.rb31
-rw-r--r--spec/ruby/core/complex/equal_value_spec.rb93
-rw-r--r--spec/ruby/core/complex/exponent_spec.rb61
-rw-r--r--spec/ruby/core/complex/fdiv_spec.rb129
-rw-r--r--spec/ruby/core/complex/finite_spec.rb36
-rw-r--r--spec/ruby/core/complex/hash_spec.rb16
-rw-r--r--spec/ruby/core/complex/imag_spec.rb6
-rw-r--r--spec/ruby/core/complex/imaginary_spec.rb6
-rw-r--r--spec/ruby/core/complex/infinite_spec.rb34
-rw-r--r--spec/ruby/core/complex/inspect_spec.rb16
-rw-r--r--spec/ruby/core/complex/integer_spec.rb11
-rw-r--r--spec/ruby/core/complex/magnitude_spec.rb6
-rw-r--r--spec/ruby/core/complex/marshal_dump_spec.rb11
-rw-r--r--spec/ruby/core/complex/minus_spec.rb45
-rw-r--r--spec/ruby/core/complex/multiply_spec.rb49
-rw-r--r--spec/ruby/core/complex/negative_spec.rb13
-rw-r--r--spec/ruby/core/complex/numerator_spec.rb19
-rw-r--r--spec/ruby/core/complex/phase_spec.rb6
-rw-r--r--spec/ruby/core/complex/plus_spec.rb45
-rw-r--r--spec/ruby/core/complex/polar_spec.rb27
-rw-r--r--spec/ruby/core/complex/positive_spec.rb13
-rw-r--r--spec/ruby/core/complex/quo_spec.rb6
-rw-r--r--spec/ruby/core/complex/rationalize_spec.rb31
-rw-r--r--spec/ruby/core/complex/real_spec.rb28
-rw-r--r--spec/ruby/core/complex/rect_spec.rb10
-rw-r--r--spec/ruby/core/complex/rectangular_spec.rb10
-rw-r--r--spec/ruby/core/complex/shared/abs.rb10
-rw-r--r--spec/ruby/core/complex/shared/arg.rb9
-rw-r--r--spec/ruby/core/complex/shared/conjugate.rb8
-rw-r--r--spec/ruby/core/complex/shared/divide.rb82
-rw-r--r--spec/ruby/core/complex/shared/image.rb8
-rw-r--r--spec/ruby/core/complex/shared/rect.rb94
-rw-r--r--spec/ruby/core/complex/to_f_spec.rb41
-rw-r--r--spec/ruby/core/complex/to_i_spec.rb41
-rw-r--r--spec/ruby/core/complex/to_r_spec.rb41
-rw-r--r--spec/ruby/core/complex/to_s_spec.rb44
-rw-r--r--spec/ruby/core/complex/uminus_spec.rb11
-rw-r--r--spec/ruby/core/dir/chdir_spec.rb124
-rw-r--r--spec/ruby/core/dir/children_spec.rb72
-rw-r--r--spec/ruby/core/dir/chroot_spec.rb47
-rw-r--r--spec/ruby/core/dir/close_spec.rb19
-rw-r--r--spec/ruby/core/dir/delete_spec.rb15
-rw-r--r--spec/ruby/core/dir/dir_spec.rb7
-rw-r--r--spec/ruby/core/dir/each_child_spec.rb53
-rw-r--r--spec/ruby/core/dir/each_spec.rb64
-rw-r--r--spec/ruby/core/dir/element_reference_spec.rb33
-rw-r--r--spec/ruby/core/dir/empty_spec.rb33
-rw-r--r--spec/ruby/core/dir/entries_spec.rb70
-rw-r--r--spec/ruby/core/dir/exist_spec.rb15
-rw-r--r--spec/ruby/core/dir/exists_spec.rb15
-rw-r--r--spec/ruby/core/dir/fileno_spec.rb37
-rw-r--r--spec/ruby/core/dir/fixtures/common.rb169
-rw-r--r--spec/ruby/core/dir/foreach_spec.rb56
-rw-r--r--spec/ruby/core/dir/getwd_spec.rb15
-rw-r--r--spec/ruby/core/dir/glob_spec.rb168
-rw-r--r--spec/ruby/core/dir/home_spec.rb32
-rw-r--r--spec/ruby/core/dir/initialize_spec.rb23
-rw-r--r--spec/ruby/core/dir/inspect_spec.rb24
-rw-r--r--spec/ruby/core/dir/mkdir_spec.rb87
-rw-r--r--spec/ruby/core/dir/open_spec.rb15
-rw-r--r--spec/ruby/core/dir/path_spec.rb15
-rw-r--r--spec/ruby/core/dir/pos_spec.rb40
-rw-r--r--spec/ruby/core/dir/pwd_spec.rb39
-rw-r--r--spec/ruby/core/dir/read_spec.rb43
-rw-r--r--spec/ruby/core/dir/rewind_spec.rb36
-rw-r--r--spec/ruby/core/dir/rmdir_spec.rb15
-rw-r--r--spec/ruby/core/dir/seek_spec.rb19
-rw-r--r--spec/ruby/core/dir/shared/chroot.rb41
-rw-r--r--spec/ruby/core/dir/shared/closed.rb9
-rw-r--r--spec/ruby/core/dir/shared/delete.rb63
-rw-r--r--spec/ruby/core/dir/shared/exist.rb56
-rw-r--r--spec/ruby/core/dir/shared/glob.rb411
-rw-r--r--spec/ruby/core/dir/shared/open.rb63
-rw-r--r--spec/ruby/core/dir/shared/path.rb32
-rw-r--r--spec/ruby/core/dir/shared/pos.rb51
-rw-r--r--spec/ruby/core/dir/shared/pwd.rb49
-rw-r--r--spec/ruby/core/dir/tell_spec.rb18
-rw-r--r--spec/ruby/core/dir/to_path_spec.rb15
-rw-r--r--spec/ruby/core/dir/unlink_spec.rb15
-rw-r--r--spec/ruby/core/encoding/_dump_spec.rb5
-rw-r--r--spec/ruby/core/encoding/_load_spec.rb5
-rw-r--r--spec/ruby/core/encoding/aliases_spec.rb45
-rw-r--r--spec/ruby/core/encoding/ascii_compatible_spec.rb13
-rw-r--r--spec/ruby/core/encoding/compatible_spec.rb381
-rw-r--r--spec/ruby/core/encoding/converter/asciicompat_encoding_spec.rb39
-rw-r--r--spec/ruby/core/encoding/converter/constants_spec.rb133
-rw-r--r--spec/ruby/core/encoding/converter/convert_spec.rb47
-rw-r--r--spec/ruby/core/encoding/converter/convpath_spec.rb26
-rw-r--r--spec/ruby/core/encoding/converter/destination_encoding_spec.rb13
-rw-r--r--spec/ruby/core/encoding/converter/finish_spec.rb38
-rw-r--r--spec/ruby/core/encoding/converter/insert_output_spec.rb5
-rw-r--r--spec/ruby/core/encoding/converter/inspect_spec.rb13
-rw-r--r--spec/ruby/core/encoding/converter/last_error_spec.rb93
-rw-r--r--spec/ruby/core/encoding/converter/new_spec.rb121
-rw-r--r--spec/ruby/core/encoding/converter/primitive_convert_spec.rb213
-rw-r--r--spec/ruby/core/encoding/converter/primitive_errinfo_spec.rb70
-rw-r--r--spec/ruby/core/encoding/converter/putback_spec.rb49
-rw-r--r--spec/ruby/core/encoding/converter/replacement_spec.rb74
-rw-r--r--spec/ruby/core/encoding/converter/search_convpath_spec.rb34
-rw-r--r--spec/ruby/core/encoding/converter/source_encoding_spec.rb13
-rw-r--r--spec/ruby/core/encoding/default_external_spec.rb65
-rw-r--r--spec/ruby/core/encoding/default_internal_spec.rb76
-rw-r--r--spec/ruby/core/encoding/dummy_spec.rb16
-rw-r--r--spec/ruby/core/encoding/find_spec.rb84
-rw-r--r--spec/ruby/core/encoding/fixtures/classes.rb49
-rw-r--r--spec/ruby/core/encoding/inspect_spec.rb21
-rw-r--r--spec/ruby/core/encoding/invalid_byte_sequence_error/destination_encoding_name_spec.rb20
-rw-r--r--spec/ruby/core/encoding/invalid_byte_sequence_error/destination_encoding_spec.rb20
-rw-r--r--spec/ruby/core/encoding/invalid_byte_sequence_error/error_bytes_spec.rb32
-rw-r--r--spec/ruby/core/encoding/invalid_byte_sequence_error/incomplete_input_spec.rb31
-rw-r--r--spec/ruby/core/encoding/invalid_byte_sequence_error/readagain_bytes_spec.rb32
-rw-r--r--spec/ruby/core/encoding/invalid_byte_sequence_error/source_encoding_name_spec.rb30
-rw-r--r--spec/ruby/core/encoding/invalid_byte_sequence_error/source_encoding_spec.rb35
-rw-r--r--spec/ruby/core/encoding/list_spec.rb43
-rw-r--r--spec/ruby/core/encoding/locale_charmap_spec.rb47
-rw-r--r--spec/ruby/core/encoding/name_list_spec.rb25
-rw-r--r--spec/ruby/core/encoding/name_spec.rb7
-rw-r--r--spec/ruby/core/encoding/names_spec.rb37
-rw-r--r--spec/ruby/core/encoding/replicate_spec.rb48
-rw-r--r--spec/ruby/core/encoding/shared/name.rb15
-rw-r--r--spec/ruby/core/encoding/to_s_spec.rb7
-rw-r--r--spec/ruby/core/encoding/undefined_conversion_error/destination_encoding_name_spec.rb17
-rw-r--r--spec/ruby/core/encoding/undefined_conversion_error/destination_encoding_spec.rb17
-rw-r--r--spec/ruby/core/encoding/undefined_conversion_error/error_char_spec.rb29
-rw-r--r--spec/ruby/core/encoding/undefined_conversion_error/source_encoding_name_spec.rb30
-rw-r--r--spec/ruby/core/encoding/undefined_conversion_error/source_encoding_spec.rb31
-rw-r--r--spec/ruby/core/enumerable/all_spec.rb201
-rw-r--r--spec/ruby/core/enumerable/any_spec.rb214
-rw-r--r--spec/ruby/core/enumerable/chunk_spec.rb77
-rw-r--r--spec/ruby/core/enumerable/chunk_while_spec.rb42
-rw-r--r--spec/ruby/core/enumerable/collect_concat_spec.rb7
-rw-r--r--spec/ruby/core/enumerable/collect_spec.rb7
-rw-r--r--spec/ruby/core/enumerable/count_spec.rb59
-rw-r--r--spec/ruby/core/enumerable/cycle_spec.rb104
-rw-r--r--spec/ruby/core/enumerable/detect_spec.rb7
-rw-r--r--spec/ruby/core/enumerable/drop_spec.rb43
-rw-r--r--spec/ruby/core/enumerable/drop_while_spec.rb50
-rw-r--r--spec/ruby/core/enumerable/each_cons_spec.rb99
-rw-r--r--spec/ruby/core/enumerable/each_entry_spec.rb41
-rw-r--r--spec/ruby/core/enumerable/each_slice_spec.rb101
-rw-r--r--spec/ruby/core/enumerable/each_with_index_spec.rb53
-rw-r--r--spec/ruby/core/enumerable/each_with_object_spec.rb41
-rw-r--r--spec/ruby/core/enumerable/entries_spec.rb7
-rw-r--r--spec/ruby/core/enumerable/filter_spec.rb9
-rw-r--r--spec/ruby/core/enumerable/find_all_spec.rb7
-rw-r--r--spec/ruby/core/enumerable/find_index_spec.rb89
-rw-r--r--spec/ruby/core/enumerable/find_spec.rb7
-rw-r--r--spec/ruby/core/enumerable/first_spec.rb28
-rw-r--r--spec/ruby/core/enumerable/fixtures/classes.rb345
-rw-r--r--spec/ruby/core/enumerable/flat_map_spec.rb7
-rw-r--r--spec/ruby/core/enumerable/grep_spec.rb52
-rw-r--r--spec/ruby/core/enumerable/grep_v_spec.rb41
-rw-r--r--spec/ruby/core/enumerable/group_by_spec.rb45
-rw-r--r--spec/ruby/core/enumerable/include_spec.rb7
-rw-r--r--spec/ruby/core/enumerable/inject_spec.rb7
-rw-r--r--spec/ruby/core/enumerable/lazy_spec.rb10
-rw-r--r--spec/ruby/core/enumerable/map_spec.rb7
-rw-r--r--spec/ruby/core/enumerable/max_by_spec.rb81
-rw-r--r--spec/ruby/core/enumerable/max_spec.rb119
-rw-r--r--spec/ruby/core/enumerable/member_spec.rb7
-rw-r--r--spec/ruby/core/enumerable/min_by_spec.rb81
-rw-r--r--spec/ruby/core/enumerable/min_spec.rb123
-rw-r--r--spec/ruby/core/enumerable/minmax_by_spec.rb44
-rw-r--r--spec/ruby/core/enumerable/minmax_spec.rb44
-rw-r--r--spec/ruby/core/enumerable/none_spec.rb167
-rw-r--r--spec/ruby/core/enumerable/one_spec.rb169
-rw-r--r--spec/ruby/core/enumerable/partition_spec.rb20
-rw-r--r--spec/ruby/core/enumerable/reduce_spec.rb7
-rw-r--r--spec/ruby/core/enumerable/reject_spec.rb25
-rw-r--r--spec/ruby/core/enumerable/reverse_each_spec.rb26
-rw-r--r--spec/ruby/core/enumerable/select_spec.rb7
-rw-r--r--spec/ruby/core/enumerable/shared/collect.rb32
-rw-r--r--spec/ruby/core/enumerable/shared/collect_concat.rb54
-rw-r--r--spec/ruby/core/enumerable/shared/entries.rb24
-rw-r--r--spec/ruby/core/enumerable/shared/enumerable_enumeratorized.rb33
-rw-r--r--spec/ruby/core/enumerable/shared/enumeratorized.rb42
-rw-r--r--spec/ruby/core/enumerable/shared/find.rb73
-rw-r--r--spec/ruby/core/enumerable/shared/find_all.rb31
-rw-r--r--spec/ruby/core/enumerable/shared/include.rb34
-rw-r--r--spec/ruby/core/enumerable/shared/inject.rb69
-rw-r--r--spec/ruby/core/enumerable/shared/take.rb63
-rw-r--r--spec/ruby/core/enumerable/slice_after_spec.rb61
-rw-r--r--spec/ruby/core/enumerable/slice_before_spec.rb64
-rw-r--r--spec/ruby/core/enumerable/slice_when_spec.rb54
-rw-r--r--spec/ruby/core/enumerable/sort_by_spec.rb43
-rw-r--r--spec/ruby/core/enumerable/sort_spec.rb54
-rw-r--r--spec/ruby/core/enumerable/sum_spec.rb30
-rw-r--r--spec/ruby/core/enumerable/take_spec.rb13
-rw-r--r--spec/ruby/core/enumerable/take_while_spec.rb51
-rw-r--r--spec/ruby/core/enumerable/to_a_spec.rb7
-rw-r--r--spec/ruby/core/enumerable/to_h_spec.rb54
-rw-r--r--spec/ruby/core/enumerable/uniq_spec.rb94
-rw-r--r--spec/ruby/core/enumerable/zip_spec.rb41
-rw-r--r--spec/ruby/core/enumerator/each_spec.rb5
-rw-r--r--spec/ruby/core/enumerator/each_with_index_spec.rb38
-rw-r--r--spec/ruby/core/enumerator/each_with_object_spec.rb6
-rw-r--r--spec/ruby/core/enumerator/enum_for_spec.rb6
-rw-r--r--spec/ruby/core/enumerator/enumerator_spec.rb7
-rw-r--r--spec/ruby/core/enumerator/feed_spec.rb52
-rw-r--r--spec/ruby/core/enumerator/first_spec.rb7
-rw-r--r--spec/ruby/core/enumerator/fixtures/common.rb9
-rw-r--r--spec/ruby/core/enumerator/generator/each_spec.rb40
-rw-r--r--spec/ruby/core/enumerator/generator/initialize_spec.rb26
-rw-r--r--spec/ruby/core/enumerator/initialize_spec.rb61
-rw-r--r--spec/ruby/core/enumerator/inject_spec.rb15
-rw-r--r--spec/ruby/core/enumerator/inspect_spec.rb17
-rw-r--r--spec/ruby/core/enumerator/lazy/chunk_spec.rb71
-rw-r--r--spec/ruby/core/enumerator/lazy/collect_concat_spec.rb8
-rw-r--r--spec/ruby/core/enumerator/lazy/collect_spec.rb8
-rw-r--r--spec/ruby/core/enumerator/lazy/drop_spec.rb52
-rw-r--r--spec/ruby/core/enumerator/lazy/drop_while_spec.rb60
-rw-r--r--spec/ruby/core/enumerator/lazy/enum_for_spec.rb8
-rw-r--r--spec/ruby/core/enumerator/lazy/find_all_spec.rb8
-rw-r--r--spec/ruby/core/enumerator/lazy/fixtures/classes.rb54
-rw-r--r--spec/ruby/core/enumerator/lazy/flat_map_spec.rb8
-rw-r--r--spec/ruby/core/enumerator/lazy/force_spec.rb30
-rw-r--r--spec/ruby/core/enumerator/lazy/grep_spec.rb82
-rw-r--r--spec/ruby/core/enumerator/lazy/grep_v_spec.rb84
-rw-r--r--spec/ruby/core/enumerator/lazy/initialize_spec.rb63
-rw-r--r--spec/ruby/core/enumerator/lazy/lazy_spec.rb16
-rw-r--r--spec/ruby/core/enumerator/lazy/map_spec.rb12
-rw-r--r--spec/ruby/core/enumerator/lazy/reject_spec.rb60
-rw-r--r--spec/ruby/core/enumerator/lazy/select_spec.rb8
-rw-r--r--spec/ruby/core/enumerator/lazy/shared/collect.rb56
-rw-r--r--spec/ruby/core/enumerator/lazy/shared/collect_concat.rb72
-rw-r--r--spec/ruby/core/enumerator/lazy/shared/select.rb60
-rw-r--r--spec/ruby/core/enumerator/lazy/shared/to_enum.rb50
-rw-r--r--spec/ruby/core/enumerator/lazy/take_spec.rb66
-rw-r--r--spec/ruby/core/enumerator/lazy/take_while_spec.rb60
-rw-r--r--spec/ruby/core/enumerator/lazy/to_enum_spec.rb8
-rw-r--r--spec/ruby/core/enumerator/lazy/uniq_spec.rb76
-rw-r--r--spec/ruby/core/enumerator/lazy/zip_spec.rb74
-rw-r--r--spec/ruby/core/enumerator/new_spec.rb6
-rw-r--r--spec/ruby/core/enumerator/next_spec.rb6
-rw-r--r--spec/ruby/core/enumerator/next_values_spec.rb55
-rw-r--r--spec/ruby/core/enumerator/peek_spec.rb36
-rw-r--r--spec/ruby/core/enumerator/peek_values_spec.rb57
-rw-r--r--spec/ruby/core/enumerator/rewind_spec.rb38
-rw-r--r--spec/ruby/core/enumerator/size_spec.rb26
-rw-r--r--spec/ruby/core/enumerator/to_enum_spec.rb6
-rw-r--r--spec/ruby/core/enumerator/with_index_spec.rb72
-rw-r--r--spec/ruby/core/enumerator/with_object_spec.rb6
-rw-r--r--spec/ruby/core/enumerator/yielder/append_spec.rb24
-rw-r--r--spec/ruby/core/enumerator/yielder/initialize_spec.rb18
-rw-r--r--spec/ruby/core/enumerator/yielder/yield_spec.rb23
-rw-r--r--spec/ruby/core/env/assoc_spec.rb23
-rw-r--r--spec/ruby/core/env/clear_spec.rb20
-rw-r--r--spec/ruby/core/env/delete_if_spec.rb27
-rw-r--r--spec/ruby/core/env/delete_spec.rb24
-rw-r--r--spec/ruby/core/env/each_key_spec.rb32
-rw-r--r--spec/ruby/core/env/each_pair_spec.rb6
-rw-r--r--spec/ruby/core/env/each_spec.rb6
-rw-r--r--spec/ruby/core/env/each_value_spec.rb32
-rw-r--r--spec/ruby/core/env/element_reference_spec.rb66
-rw-r--r--spec/ruby/core/env/element_set_spec.rb6
-rw-r--r--spec/ruby/core/env/empty_spec.rb23
-rw-r--r--spec/ruby/core/env/fetch_spec.rb36
-rw-r--r--spec/ruby/core/env/has_key_spec.rb6
-rw-r--r--spec/ruby/core/env/has_value_spec.rb6
-rw-r--r--spec/ruby/core/env/include_spec.rb6
-rw-r--r--spec/ruby/core/env/index_spec.rb6
-rw-r--r--spec/ruby/core/env/indexes_spec.rb1
-rw-r--r--spec/ruby/core/env/indices_spec.rb1
-rw-r--r--spec/ruby/core/env/inspect_spec.rb11
-rw-r--r--spec/ruby/core/env/invert_spec.rb16
-rw-r--r--spec/ruby/core/env/keep_if_spec.rb33
-rw-r--r--spec/ruby/core/env/key_spec.rb11
-rw-r--r--spec/ruby/core/env/keys_spec.rb14
-rw-r--r--spec/ruby/core/env/length_spec.rb6
-rw-r--r--spec/ruby/core/env/member_spec.rb6
-rw-r--r--spec/ruby/core/env/rassoc_spec.rb23
-rw-r--r--spec/ruby/core/env/rehash_spec.rb1
-rw-r--r--spec/ruby/core/env/reject_spec.rb77
-rw-r--r--spec/ruby/core/env/replace_spec.rb15
-rw-r--r--spec/ruby/core/env/select_spec.rb39
-rw-r--r--spec/ruby/core/env/shared/each.rb65
-rw-r--r--spec/ruby/core/env/shared/include.rb11
-rw-r--r--spec/ruby/core/env/shared/key.rb13
-rw-r--r--spec/ruby/core/env/shared/length.rb13
-rw-r--r--spec/ruby/core/env/shared/store.rb56
-rw-r--r--spec/ruby/core/env/shared/to_hash.rb22
-rw-r--r--spec/ruby/core/env/shared/value.rb11
-rw-r--r--spec/ruby/core/env/shift_spec.rb59
-rw-r--r--spec/ruby/core/env/size_spec.rb6
-rw-r--r--spec/ruby/core/env/store_spec.rb6
-rw-r--r--spec/ruby/core/env/to_a_spec.rb19
-rw-r--r--spec/ruby/core/env/to_h_spec.rb19
-rw-r--r--spec/ruby/core/env/to_hash_spec.rb6
-rw-r--r--spec/ruby/core/env/to_s_spec.rb7
-rw-r--r--spec/ruby/core/env/update_spec.rb25
-rw-r--r--spec/ruby/core/env/value_spec.rb6
-rw-r--r--spec/ruby/core/env/values_at_spec.rb17
-rw-r--r--spec/ruby/core/env/values_spec.rb21
-rw-r--r--spec/ruby/core/exception/args_spec.rb5
-rw-r--r--spec/ruby/core/exception/arguments_spec.rb11
-rw-r--r--spec/ruby/core/exception/backtrace_locations_spec.rb39
-rw-r--r--spec/ruby/core/exception/backtrace_spec.rb68
-rw-r--r--spec/ruby/core/exception/case_compare_spec.rb5
-rw-r--r--spec/ruby/core/exception/cause_spec.rb19
-rw-r--r--spec/ruby/core/exception/destination_encoding_name_spec.rb9
-rw-r--r--spec/ruby/core/exception/destination_encoding_spec.rb9
-rw-r--r--spec/ruby/core/exception/dup_spec.rb61
-rw-r--r--spec/ruby/core/exception/equal_value_spec.rb68
-rw-r--r--spec/ruby/core/exception/errno_spec.rb48
-rw-r--r--spec/ruby/core/exception/error_bytes_spec.rb5
-rw-r--r--spec/ruby/core/exception/error_char_spec.rb5
-rw-r--r--spec/ruby/core/exception/exception_spec.rb83
-rw-r--r--spec/ruby/core/exception/exit_value_spec.rb5
-rw-r--r--spec/ruby/core/exception/fixtures/common.rb95
-rw-r--r--spec/ruby/core/exception/full_message_spec.rb38
-rw-r--r--spec/ruby/core/exception/incomplete_input_spec.rb5
-rw-r--r--spec/ruby/core/exception/initialize_spec.rb1
-rw-r--r--spec/ruby/core/exception/inspect_spec.rb20
-rw-r--r--spec/ruby/core/exception/interrupt_spec.rb41
-rw-r--r--spec/ruby/core/exception/io_error_spec.rb51
-rw-r--r--spec/ruby/core/exception/load_error_spec.rb21
-rw-r--r--spec/ruby/core/exception/message_spec.rb27
-rw-r--r--spec/ruby/core/exception/name_error_spec.rb13
-rw-r--r--spec/ruby/core/exception/name_spec.rb45
-rw-r--r--spec/ruby/core/exception/new_spec.rb7
-rw-r--r--spec/ruby/core/exception/no_method_error_spec.rb95
-rw-r--r--spec/ruby/core/exception/range_error_spec.rb7
-rw-r--r--spec/ruby/core/exception/readagain_bytes_spec.rb5
-rw-r--r--spec/ruby/core/exception/reason_spec.rb5
-rw-r--r--spec/ruby/core/exception/receiver_spec.rb60
-rw-r--r--spec/ruby/core/exception/result_spec.rb29
-rw-r--r--spec/ruby/core/exception/script_error_spec.rb15
-rw-r--r--spec/ruby/core/exception/set_backtrace_spec.rb56
-rw-r--r--spec/ruby/core/exception/shared/new.rb18
-rw-r--r--spec/ruby/core/exception/signal_exception_spec.rb74
-rw-r--r--spec/ruby/core/exception/signm_spec.rb5
-rw-r--r--spec/ruby/core/exception/signo_spec.rb5
-rw-r--r--spec/ruby/core/exception/source_encoding_name_spec.rb9
-rw-r--r--spec/ruby/core/exception/source_encoding_spec.rb9
-rw-r--r--spec/ruby/core/exception/standard_error_spec.rb56
-rw-r--r--spec/ruby/core/exception/status_spec.rb5
-rw-r--r--spec/ruby/core/exception/success_spec.rb5
-rw-r--r--spec/ruby/core/exception/system_call_error_spec.rb89
-rw-r--r--spec/ruby/core/exception/system_stack_error_spec.rb7
-rw-r--r--spec/ruby/core/exception/to_s_spec.rb23
-rw-r--r--spec/ruby/core/exception/uncaught_throw_error_spec.rb18
-rw-r--r--spec/ruby/core/false/and_spec.rb11
-rw-r--r--spec/ruby/core/false/dup_spec.rb9
-rw-r--r--spec/ruby/core/false/falseclass_spec.rb15
-rw-r--r--spec/ruby/core/false/inspect_spec.rb7
-rw-r--r--spec/ruby/core/false/or_spec.rb11
-rw-r--r--spec/ruby/core/false/to_s_spec.rb7
-rw-r--r--spec/ruby/core/false/xor_spec.rb11
-rw-r--r--spec/ruby/core/fiber/new_spec.rb41
-rw-r--r--spec/ruby/core/fiber/resume_spec.rb59
-rw-r--r--spec/ruby/core/fiber/yield_spec.rb51
-rw-r--r--spec/ruby/core/file/absolute_path_spec.rb37
-rw-r--r--spec/ruby/core/file/atime_spec.rb55
-rw-r--r--spec/ruby/core/file/basename_spec.rb170
-rw-r--r--spec/ruby/core/file/birthtime_spec.rb56
-rw-r--r--spec/ruby/core/file/blockdev_spec.rb6
-rw-r--r--spec/ruby/core/file/chardev_spec.rb6
-rw-r--r--spec/ruby/core/file/chmod_spec.rb185
-rw-r--r--spec/ruby/core/file/chown_spec.rb152
-rw-r--r--spec/ruby/core/file/constants/constants_spec.rb31
-rw-r--r--spec/ruby/core/file/constants_spec.rb141
-rw-r--r--spec/ruby/core/file/ctime_spec.rb51
-rw-r--r--spec/ruby/core/file/delete_spec.rb6
-rw-r--r--spec/ruby/core/file/directory_spec.rb10
-rw-r--r--spec/ruby/core/file/dirname_spec.rb108
-rw-r--r--spec/ruby/core/file/empty_spec.rb15
-rw-r--r--spec/ruby/core/file/executable_real_spec.rb7
-rw-r--r--spec/ruby/core/file/executable_spec.rb7
-rw-r--r--spec/ruby/core/file/exist_spec.rb6
-rw-r--r--spec/ruby/core/file/exists_spec.rb6
-rw-r--r--spec/ruby/core/file/expand_path_spec.rb261
-rw-r--r--spec/ruby/core/file/extname_spec.rb54
-rw-r--r--spec/ruby/core/file/file_spec.rb16
-rw-r--r--spec/ruby/core/file/fixtures/common.rb22
-rw-r--r--spec/ruby/core/file/fixtures/do_not_remove1
-rw-r--r--spec/ruby/core/file/fixtures/file_types.rb66
-rw-r--r--spec/ruby/core/file/flock_spec.rb106
-rw-r--r--spec/ruby/core/file/fnmatch_spec.rb10
-rw-r--r--spec/ruby/core/file/ftype_spec.rb73
-rw-r--r--spec/ruby/core/file/grpowned_spec.rb10
-rw-r--r--spec/ruby/core/file/identical_spec.rb6
-rw-r--r--spec/ruby/core/file/initialize_spec.rb23
-rw-r--r--spec/ruby/core/file/inspect_spec.rb17
-rw-r--r--spec/ruby/core/file/join_spec.rb139
-rw-r--r--spec/ruby/core/file/lchmod_spec.rb42
-rw-r--r--spec/ruby/core/file/lchown_spec.rb63
-rw-r--r--spec/ruby/core/file/link_spec.rb39
-rw-r--r--spec/ruby/core/file/lstat_spec.rb33
-rw-r--r--spec/ruby/core/file/mkfifo_spec.rb51
-rw-r--r--spec/ruby/core/file/mtime_spec.rb51
-rw-r--r--spec/ruby/core/file/new_spec.rb162
-rw-r--r--spec/ruby/core/file/null_spec.rb15
-rw-r--r--spec/ruby/core/file/open_spec.rb680
-rw-r--r--spec/ruby/core/file/owned_spec.rb35
-rw-r--r--spec/ruby/core/file/path_spec.rb40
-rw-r--r--spec/ruby/core/file/pipe_spec.rb32
-rw-r--r--spec/ruby/core/file/printf_spec.rb18
-rw-r--r--spec/ruby/core/file/read_spec.rb6
-rw-r--r--spec/ruby/core/file/readable_real_spec.rb7
-rw-r--r--spec/ruby/core/file/readable_spec.rb7
-rw-r--r--spec/ruby/core/file/readlink_spec.rb86
-rw-r--r--spec/ruby/core/file/realdirpath_spec.rb104
-rw-r--r--spec/ruby/core/file/realpath_spec.rb88
-rw-r--r--spec/ruby/core/file/rename_spec.rb37
-rw-r--r--spec/ruby/core/file/reopen_spec.rb32
-rw-r--r--spec/ruby/core/file/setgid_spec.rb36
-rw-r--r--spec/ruby/core/file/setuid_spec.rb38
-rw-r--r--spec/ruby/core/file/shared/fnmatch.rb241
-rw-r--r--spec/ruby/core/file/shared/open.rb12
-rw-r--r--spec/ruby/core/file/shared/path.rb80
-rw-r--r--spec/ruby/core/file/shared/read.rb15
-rw-r--r--spec/ruby/core/file/shared/stat.rb32
-rw-r--r--spec/ruby/core/file/shared/unlink.rb61
-rw-r--r--spec/ruby/core/file/size_spec.rb119
-rw-r--r--spec/ruby/core/file/socket_spec.rb42
-rw-r--r--spec/ruby/core/file/split_spec.rb63
-rw-r--r--spec/ruby/core/file/stat/atime_spec.rb18
-rw-r--r--spec/ruby/core/file/stat/birthtime_spec.rb27
-rw-r--r--spec/ruby/core/file/stat/blksize_spec.rb27
-rw-r--r--spec/ruby/core/file/stat/blockdev_spec.rb7
-rw-r--r--spec/ruby/core/file/stat/blocks_spec.rb27
-rw-r--r--spec/ruby/core/file/stat/chardev_spec.rb7
-rw-r--r--spec/ruby/core/file/stat/comparison_spec.rb66
-rw-r--r--spec/ruby/core/file/stat/ctime_spec.rb18
-rw-r--r--spec/ruby/core/file/stat/dev_major_spec.rb23
-rw-r--r--spec/ruby/core/file/stat/dev_minor_spec.rb23
-rw-r--r--spec/ruby/core/file/stat/dev_spec.rb15
-rw-r--r--spec/ruby/core/file/stat/directory_spec.rb7
-rw-r--r--spec/ruby/core/file/stat/executable_real_spec.rb7
-rw-r--r--spec/ruby/core/file/stat/executable_spec.rb7
-rw-r--r--spec/ruby/core/file/stat/file_spec.rb7
-rw-r--r--spec/ruby/core/file/stat/fixtures/classes.rb5
-rw-r--r--spec/ruby/core/file/stat/ftype_spec.rb68
-rw-r--r--spec/ruby/core/file/stat/gid_spec.rb19
-rw-r--r--spec/ruby/core/file/stat/grpowned_spec.rb7
-rw-r--r--spec/ruby/core/file/stat/ino_spec.rb28
-rw-r--r--spec/ruby/core/file/stat/inspect_spec.rb26
-rw-r--r--spec/ruby/core/file/stat/mode_spec.rb19
-rw-r--r--spec/ruby/core/file/stat/mtime_spec.rb18
-rw-r--r--spec/ruby/core/file/stat/new_spec.rb32
-rw-r--r--spec/ruby/core/file/stat/nlink_spec.rb21
-rw-r--r--spec/ruby/core/file/stat/owned_spec.rb33
-rw-r--r--spec/ruby/core/file/stat/pipe_spec.rb32
-rw-r--r--spec/ruby/core/file/stat/rdev_major_spec.rb31
-rw-r--r--spec/ruby/core/file/stat/rdev_minor_spec.rb31
-rw-r--r--spec/ruby/core/file/stat/rdev_spec.rb15
-rw-r--r--spec/ruby/core/file/stat/readable_real_spec.rb7
-rw-r--r--spec/ruby/core/file/stat/readable_spec.rb7
-rw-r--r--spec/ruby/core/file/stat/setgid_spec.rb11
-rw-r--r--spec/ruby/core/file/stat/setuid_spec.rb11
-rw-r--r--spec/ruby/core/file/stat/size_spec.rb21
-rw-r--r--spec/ruby/core/file/stat/socket_spec.rb11
-rw-r--r--spec/ruby/core/file/stat/sticky_spec.rb11
-rw-r--r--spec/ruby/core/file/stat/symlink_spec.rb7
-rw-r--r--spec/ruby/core/file/stat/uid_spec.rb18
-rw-r--r--spec/ruby/core/file/stat/world_readable_spec.rb11
-rw-r--r--spec/ruby/core/file/stat/world_writable_spec.rb11
-rw-r--r--spec/ruby/core/file/stat/writable_real_spec.rb7
-rw-r--r--spec/ruby/core/file/stat/writable_spec.rb7
-rw-r--r--spec/ruby/core/file/stat/zero_spec.rb7
-rw-r--r--spec/ruby/core/file/stat_spec.rb45
-rw-r--r--spec/ruby/core/file/sticky_spec.rb50
-rw-r--r--spec/ruby/core/file/symlink_spec.rb57
-rw-r--r--spec/ruby/core/file/to_path_spec.rb6
-rw-r--r--spec/ruby/core/file/truncate_spec.rb177
-rw-r--r--spec/ruby/core/file/umask_spec.rb57
-rw-r--r--spec/ruby/core/file/unlink_spec.rb6
-rw-r--r--spec/ruby/core/file/utime_spec.rb55
-rw-r--r--spec/ruby/core/file/world_readable_spec.rb12
-rw-r--r--spec/ruby/core/file/world_writable_spec.rb12
-rw-r--r--spec/ruby/core/file/writable_real_spec.rb7
-rw-r--r--spec/ruby/core/file/writable_spec.rb7
-rw-r--r--spec/ruby/core/file/zero_spec.rb13
-rw-r--r--spec/ruby/core/filetest/blockdev_spec.rb6
-rw-r--r--spec/ruby/core/filetest/chardev_spec.rb6
-rw-r--r--spec/ruby/core/filetest/directory_spec.rb10
-rw-r--r--spec/ruby/core/filetest/executable_real_spec.rb7
-rw-r--r--spec/ruby/core/filetest/executable_spec.rb7
-rw-r--r--spec/ruby/core/filetest/exist_spec.rb6
-rw-r--r--spec/ruby/core/filetest/exists_spec.rb6
-rw-r--r--spec/ruby/core/filetest/file_spec.rb10
-rw-r--r--spec/ruby/core/filetest/grpowned_spec.rb10
-rw-r--r--spec/ruby/core/filetest/identical_spec.rb6
-rw-r--r--spec/ruby/core/filetest/owned_spec.rb10
-rw-r--r--spec/ruby/core/filetest/pipe_spec.rb10
-rw-r--r--spec/ruby/core/filetest/readable_real_spec.rb7
-rw-r--r--spec/ruby/core/filetest/readable_spec.rb7
-rw-r--r--spec/ruby/core/filetest/setgid_spec.rb10
-rw-r--r--spec/ruby/core/filetest/setuid_spec.rb10
-rw-r--r--spec/ruby/core/filetest/size_spec.rb34
-rw-r--r--spec/ruby/core/filetest/socket_spec.rb10
-rw-r--r--spec/ruby/core/filetest/sticky_spec.rb7
-rw-r--r--spec/ruby/core/filetest/symlink_spec.rb10
-rw-r--r--spec/ruby/core/filetest/world_readable_spec.rb5
-rw-r--r--spec/ruby/core/filetest/world_writable_spec.rb5
-rw-r--r--spec/ruby/core/filetest/writable_real_spec.rb7
-rw-r--r--spec/ruby/core/filetest/writable_spec.rb7
-rw-r--r--spec/ruby/core/filetest/zero_spec.rb13
-rw-r--r--spec/ruby/core/float/abs_spec.rb6
-rw-r--r--spec/ruby/core/float/angle_spec.rb6
-rw-r--r--spec/ruby/core/float/arg_spec.rb6
-rw-r--r--spec/ruby/core/float/case_compare_spec.rb6
-rw-r--r--spec/ruby/core/float/ceil_spec.rb23
-rw-r--r--spec/ruby/core/float/coerce_spec.rb18
-rw-r--r--spec/ruby/core/float/comparison_spec.rb36
-rw-r--r--spec/ruby/core/float/constants_spec.rb55
-rw-r--r--spec/ruby/core/float/denominator_spec.rb29
-rw-r--r--spec/ruby/core/float/divide_spec.rb39
-rw-r--r--spec/ruby/core/float/divmod_spec.rb43
-rw-r--r--spec/ruby/core/float/dup_spec.rb10
-rw-r--r--spec/ruby/core/float/eql_spec.rb16
-rw-r--r--spec/ruby/core/float/equal_value_spec.rb6
-rw-r--r--spec/ruby/core/float/exponent_spec.rb15
-rw-r--r--spec/ruby/core/float/fdiv_spec.rb6
-rw-r--r--spec/ruby/core/float/finite_spec.rb19
-rw-r--r--spec/ruby/core/float/fixtures/classes.rb4
-rw-r--r--spec/ruby/core/float/fixtures/coerce.rb15
-rw-r--r--spec/ruby/core/float/float_spec.rb19
-rw-r--r--spec/ruby/core/float/floor_spec.rb23
-rw-r--r--spec/ruby/core/float/gt_spec.rb17
-rw-r--r--spec/ruby/core/float/gte_spec.rb17
-rw-r--r--spec/ruby/core/float/hash_spec.rb11
-rw-r--r--spec/ruby/core/float/infinite_spec.rb19
-rw-r--r--spec/ruby/core/float/lt_spec.rb17
-rw-r--r--spec/ruby/core/float/lte_spec.rb18
-rw-r--r--spec/ruby/core/float/magnitude_spec.rb5
-rw-r--r--spec/ruby/core/float/minus_spec.rb12
-rw-r--r--spec/ruby/core/float/modulo_spec.rb10
-rw-r--r--spec/ruby/core/float/multiply_spec.rb17
-rw-r--r--spec/ruby/core/float/nan_spec.rb9
-rw-r--r--spec/ruby/core/float/next_float_spec.rb49
-rw-r--r--spec/ruby/core/float/numerator_spec.rb39
-rw-r--r--spec/ruby/core/float/phase_spec.rb6
-rw-r--r--spec/ruby/core/float/plus_spec.rb12
-rw-r--r--spec/ruby/core/float/prev_float_spec.rb49
-rw-r--r--spec/ruby/core/float/quo_spec.rb6
-rw-r--r--spec/ruby/core/float/rationalize_spec.rb43
-rw-r--r--spec/ruby/core/float/round_spec.rb101
-rw-r--r--spec/ruby/core/float/shared/abs.rb21
-rw-r--r--spec/ruby/core/float/shared/arg.rb36
-rw-r--r--spec/ruby/core/float/shared/arithmetic_exception_in_coerce.rb33
-rw-r--r--spec/ruby/core/float/shared/comparison_exception_in_coerce.rb35
-rw-r--r--spec/ruby/core/float/shared/equal.rb17
-rw-r--r--spec/ruby/core/float/shared/modulo.rb48
-rw-r--r--spec/ruby/core/float/shared/quo.rb59
-rw-r--r--spec/ruby/core/float/shared/to_i.rb10
-rw-r--r--spec/ruby/core/float/to_f_spec.rb9
-rw-r--r--spec/ruby/core/float/to_i_spec.rb6
-rw-r--r--spec/ruby/core/float/to_int_spec.rb6
-rw-r--r--spec/ruby/core/float/to_r_spec.rb5
-rw-r--r--spec/ruby/core/float/to_s_spec.rb120
-rw-r--r--spec/ruby/core/float/truncate_spec.rb16
-rw-r--r--spec/ruby/core/float/uminus_spec.rb28
-rw-r--r--spec/ruby/core/float/uplus_spec.rb9
-rw-r--r--spec/ruby/core/float/zero_spec.rb9
-rw-r--r--spec/ruby/core/gc/count_spec.rb17
-rw-r--r--spec/ruby/core/gc/disable_spec.rb18
-rw-r--r--spec/ruby/core/gc/enable_spec.rb13
-rw-r--r--spec/ruby/core/gc/garbage_collect_spec.rb15
-rw-r--r--spec/ruby/core/gc/profiler/clear_spec.rb5
-rw-r--r--spec/ruby/core/gc/profiler/disable_spec.rb16
-rw-r--r--spec/ruby/core/gc/profiler/enable_spec.rb17
-rw-r--r--spec/ruby/core/gc/profiler/enabled_spec.rb21
-rw-r--r--spec/ruby/core/gc/profiler/report_spec.rb5
-rw-r--r--spec/ruby/core/gc/profiler/result_spec.rb7
-rw-r--r--spec/ruby/core/gc/profiler/total_time_spec.rb7
-rw-r--r--spec/ruby/core/gc/start_spec.rb8
-rw-r--r--spec/ruby/core/gc/stress_spec.rb27
-rw-r--r--spec/ruby/core/hash/allocate_spec.rb15
-rw-r--r--spec/ruby/core/hash/any_spec.rb30
-rw-r--r--spec/ruby/core/hash/assoc_spec.rb50
-rw-r--r--spec/ruby/core/hash/clear_spec.rb32
-rw-r--r--spec/ruby/core/hash/clone_spec.rb12
-rw-r--r--spec/ruby/core/hash/compact_spec.rb61
-rw-r--r--spec/ruby/core/hash/compare_by_identity_spec.rb140
-rw-r--r--spec/ruby/core/hash/constructor_spec.rb110
-rw-r--r--spec/ruby/core/hash/default_proc_spec.rb80
-rw-r--r--spec/ruby/core/hash/default_spec.rb46
-rw-r--r--spec/ruby/core/hash/delete_if_spec.rb44
-rw-r--r--spec/ruby/core/hash/delete_spec.rb44
-rw-r--r--spec/ruby/core/hash/dig_spec.rb66
-rw-r--r--spec/ruby/core/hash/each_key_spec.rb23
-rw-r--r--spec/ruby/core/hash/each_pair_spec.rb11
-rw-r--r--spec/ruby/core/hash/each_spec.rb11
-rw-r--r--spec/ruby/core/hash/each_value_spec.rb23
-rw-r--r--spec/ruby/core/hash/element_reference_spec.rb120
-rw-r--r--spec/ruby/core/hash/element_set_spec.rb7
-rw-r--r--spec/ruby/core/hash/empty_spec.rb15
-rw-r--r--spec/ruby/core/hash/eql_spec.rb9
-rw-r--r--spec/ruby/core/hash/equal_value_spec.rb18
-rw-r--r--spec/ruby/core/hash/fetch_spec.rb38
-rw-r--r--spec/ruby/core/hash/fetch_values_spec.rb31
-rw-r--r--spec/ruby/core/hash/filter_spec.rb12
-rw-r--r--spec/ruby/core/hash/fixtures/classes.rb75
-rw-r--r--spec/ruby/core/hash/flatten_spec.rb62
-rw-r--r--spec/ruby/core/hash/gt_spec.rb42
-rw-r--r--spec/ruby/core/hash/gte_spec.rb42
-rw-r--r--spec/ruby/core/hash/has_key_spec.rb7
-rw-r--r--spec/ruby/core/hash/has_value_spec.rb7
-rw-r--r--spec/ruby/core/hash/hash_spec.rb36
-rw-r--r--spec/ruby/core/hash/include_spec.rb7
-rw-r--r--spec/ruby/core/hash/index_spec.rb7
-rw-r--r--spec/ruby/core/hash/initialize_spec.rb61
-rw-r--r--spec/ruby/core/hash/inspect_spec.rb7
-rw-r--r--spec/ruby/core/hash/invert_spec.rb27
-rw-r--r--spec/ruby/core/hash/keep_if_spec.rb37
-rw-r--r--spec/ruby/core/hash/key_spec.rb12
-rw-r--r--spec/ruby/core/hash/keys_spec.rb23
-rw-r--r--spec/ruby/core/hash/length_spec.rb7
-rw-r--r--spec/ruby/core/hash/lt_spec.rb42
-rw-r--r--spec/ruby/core/hash/lte_spec.rb42
-rw-r--r--spec/ruby/core/hash/member_spec.rb7
-rw-r--r--spec/ruby/core/hash/merge_spec.rb77
-rw-r--r--spec/ruby/core/hash/new_spec.rb36
-rw-r--r--spec/ruby/core/hash/rassoc_spec.rb42
-rw-r--r--spec/ruby/core/hash/rehash_spec.rb57
-rw-r--r--spec/ruby/core/hash/reject_spec.rb100
-rw-r--r--spec/ruby/core/hash/replace_spec.rb7
-rw-r--r--spec/ruby/core/hash/select_spec.rb10
-rw-r--r--spec/ruby/core/hash/shared/comparison.rb15
-rw-r--r--spec/ruby/core/hash/shared/each.rb68
-rw-r--r--spec/ruby/core/hash/shared/eql.rb216
-rw-r--r--spec/ruby/core/hash/shared/equal.rb90
-rw-r--r--spec/ruby/core/hash/shared/greater_than.rb23
-rw-r--r--spec/ruby/core/hash/shared/index.rb27
-rw-r--r--spec/ruby/core/hash/shared/iteration.rb19
-rw-r--r--spec/ruby/core/hash/shared/key.rb38
-rw-r--r--spec/ruby/core/hash/shared/length.rb12
-rw-r--r--spec/ruby/core/hash/shared/less_than.rb23
-rw-r--r--spec/ruby/core/hash/shared/replace.rb51
-rw-r--r--spec/ruby/core/hash/shared/select.rb91
-rw-r--r--spec/ruby/core/hash/shared/store.rb98
-rw-r--r--spec/ruby/core/hash/shared/to_s.rb96
-rw-r--r--spec/ruby/core/hash/shared/update.rb59
-rw-r--r--spec/ruby/core/hash/shared/value.rb14
-rw-r--r--spec/ruby/core/hash/shared/values_at.rb9
-rw-r--r--spec/ruby/core/hash/shift_spec.rb79
-rw-r--r--spec/ruby/core/hash/size_spec.rb7
-rw-r--r--spec/ruby/core/hash/slice_spec.rb55
-rw-r--r--spec/ruby/core/hash/sort_spec.rb17
-rw-r--r--spec/ruby/core/hash/store_spec.rb7
-rw-r--r--spec/ruby/core/hash/to_a_spec.rb37
-rw-r--r--spec/ruby/core/hash/to_h_spec.rb40
-rw-r--r--spec/ruby/core/hash/to_hash_spec.rb14
-rw-r--r--spec/ruby/core/hash/to_proc_spec.rb87
-rw-r--r--spec/ruby/core/hash/to_s_spec.rb7
-rw-r--r--spec/ruby/core/hash/transform_keys_spec.rb132
-rw-r--r--spec/ruby/core/hash/transform_values_spec.rb99
-rw-r--r--spec/ruby/core/hash/try_convert_spec.rb50
-rw-r--r--spec/ruby/core/hash/update_spec.rb7
-rw-r--r--spec/ruby/core/hash/value_spec.rb7
-rw-r--r--spec/ruby/core/hash/values_at_spec.rb7
-rw-r--r--spec/ruby/core/hash/values_spec.rb10
-rw-r--r--spec/ruby/core/integer/abs_spec.rb6
-rw-r--r--spec/ruby/core/integer/allbits_spec.rb39
-rw-r--r--spec/ruby/core/integer/anybits_spec.rb38
-rw-r--r--spec/ruby/core/integer/bit_and_spec.rb97
-rw-r--r--spec/ruby/core/integer/bit_length_spec.rb76
-rw-r--r--spec/ruby/core/integer/bit_or_spec.rb68
-rw-r--r--spec/ruby/core/integer/bit_xor_spec.rb72
-rw-r--r--spec/ruby/core/integer/case_compare_spec.rb6
-rw-r--r--spec/ruby/core/integer/ceil_spec.rb21
-rw-r--r--spec/ruby/core/integer/chr_spec.rb243
-rw-r--r--spec/ruby/core/integer/coerce_spec.rb105
-rw-r--r--spec/ruby/core/integer/comparison_spec.rb189
-rw-r--r--spec/ruby/core/integer/complement_spec.rb20
-rw-r--r--spec/ruby/core/integer/denominator_spec.rb20
-rw-r--r--spec/ruby/core/integer/digits_spec.rb34
-rw-r--r--spec/ruby/core/integer/div_spec.rb138
-rw-r--r--spec/ruby/core/integer/divide_spec.rb95
-rw-r--r--spec/ruby/core/integer/divmod_spec.rb117
-rw-r--r--spec/ruby/core/integer/downto_spec.rb69
-rw-r--r--spec/ruby/core/integer/dup_spec.rb15
-rw-r--r--spec/ruby/core/integer/element_reference_spec.rb111
-rw-r--r--spec/ruby/core/integer/equal_value_spec.rb6
-rw-r--r--spec/ruby/core/integer/even_spec.rb40
-rw-r--r--spec/ruby/core/integer/exponent_spec.rb7
-rw-r--r--spec/ruby/core/integer/fdiv_spec.rb49
-rw-r--r--spec/ruby/core/integer/fixtures/classes.rb4
-rw-r--r--spec/ruby/core/integer/floor_spec.rb21
-rw-r--r--spec/ruby/core/integer/gcd_spec.rb69
-rw-r--r--spec/ruby/core/integer/gcdlcm_spec.rb53
-rw-r--r--spec/ruby/core/integer/gt_spec.rb49
-rw-r--r--spec/ruby/core/integer/gte_spec.rb49
-rw-r--r--spec/ruby/core/integer/integer_spec.rb22
-rw-r--r--spec/ruby/core/integer/lcm_spec.rb58
-rw-r--r--spec/ruby/core/integer/left_shift_spec.rb165
-rw-r--r--spec/ruby/core/integer/lt_spec.rb51
-rw-r--r--spec/ruby/core/integer/lte_spec.rb54
-rw-r--r--spec/ruby/core/integer/magnitude_spec.rb6
-rw-r--r--spec/ruby/core/integer/minus_spec.rb49
-rw-r--r--spec/ruby/core/integer/modulo_spec.rb10
-rw-r--r--spec/ruby/core/integer/multiply_spec.rb51
-rw-r--r--spec/ruby/core/integer/next_spec.rb6
-rw-r--r--spec/ruby/core/integer/nobits_spec.rb38
-rw-r--r--spec/ruby/core/integer/numerator_spec.rb18
-rw-r--r--spec/ruby/core/integer/odd_spec.rb38
-rw-r--r--spec/ruby/core/integer/ord_spec.rb17
-rw-r--r--spec/ruby/core/integer/plus_spec.rb49
-rw-r--r--spec/ruby/core/integer/pow_spec.rb51
-rw-r--r--spec/ruby/core/integer/pred_spec.rb11
-rw-r--r--spec/ruby/core/integer/rationalize_spec.rb39
-rw-r--r--spec/ruby/core/integer/remainder_spec.rb51
-rw-r--r--spec/ruby/core/integer/right_shift_spec.rb191
-rw-r--r--spec/ruby/core/integer/round_spec.rb95
-rw-r--r--spec/ruby/core/integer/shared/abs.rb18
-rw-r--r--spec/ruby/core/integer/shared/arithmetic_coerce.rb31
-rw-r--r--spec/ruby/core/integer/shared/comparison_coerce.rb33
-rw-r--r--spec/ruby/core/integer/shared/equal.rb58
-rw-r--r--spec/ruby/core/integer/shared/exponent.rb118
-rw-r--r--spec/ruby/core/integer/shared/integer_rounding.rb31
-rw-r--r--spec/ruby/core/integer/shared/modulo.rb74
-rw-r--r--spec/ruby/core/integer/shared/next.rb25
-rw-r--r--spec/ruby/core/integer/shared/to_i.rb8
-rw-r--r--spec/ruby/core/integer/size_spec.rb34
-rw-r--r--spec/ruby/core/integer/sqrt_spec.rb33
-rw-r--r--spec/ruby/core/integer/succ_spec.rb6
-rw-r--r--spec/ruby/core/integer/times_spec.rb79
-rw-r--r--spec/ruby/core/integer/to_f_spec.rb23
-rw-r--r--spec/ruby/core/integer/to_i_spec.rb6
-rw-r--r--spec/ruby/core/integer/to_int_spec.rb6
-rw-r--r--spec/ruby/core/integer/to_r_spec.rb26
-rw-r--r--spec/ruby/core/integer/to_s_spec.rb99
-rw-r--r--spec/ruby/core/integer/truncate_spec.rb21
-rw-r--r--spec/ruby/core/integer/uminus_spec.rb28
-rw-r--r--spec/ruby/core/integer/upto_spec.rb69
-rw-r--r--spec/ruby/core/io/advise_spec.rb97
-rw-r--r--spec/ruby/core/io/binmode_spec.rb60
-rw-r--r--spec/ruby/core/io/binread_spec.rb47
-rw-r--r--spec/ruby/core/io/binwrite_spec.rb8
-rw-r--r--spec/ruby/core/io/bytes_spec.rb43
-rw-r--r--spec/ruby/core/io/chars_spec.rb12
-rw-r--r--spec/ruby/core/io/close_on_exec_spec.rb80
-rw-r--r--spec/ruby/core/io/close_read_spec.rb60
-rw-r--r--spec/ruby/core/io/close_spec.rb97
-rw-r--r--spec/ruby/core/io/close_write_spec.rb64
-rw-r--r--spec/ruby/core/io/closed_spec.rb20
-rw-r--r--spec/ruby/core/io/codepoints_spec.rb25
-rw-r--r--spec/ruby/core/io/constants_spec.rb19
-rw-r--r--spec/ruby/core/io/copy_stream_spec.rb282
-rw-r--r--spec/ruby/core/io/dup_spec.rb69
-rw-r--r--spec/ruby/core/io/each_byte_spec.rb57
-rw-r--r--spec/ruby/core/io/each_char_spec.rb12
-rw-r--r--spec/ruby/core/io/each_codepoint_spec.rb43
-rw-r--r--spec/ruby/core/io/each_line_spec.rb11
-rw-r--r--spec/ruby/core/io/each_spec.rb11
-rw-r--r--spec/ruby/core/io/eof_spec.rb107
-rw-r--r--spec/ruby/core/io/external_encoding_spec.rb218
-rw-r--r--spec/ruby/core/io/fcntl_spec.rb8
-rw-r--r--spec/ruby/core/io/fdatasync_spec.rb5
-rw-r--r--spec/ruby/core/io/fileno_spec.rb12
-rw-r--r--spec/ruby/core/io/fixtures/bom_UTF-16BE.txtbin20 -> 0 bytes-rw-r--r--spec/ruby/core/io/fixtures/bom_UTF-16LE.txtbin20 -> 0 bytes-rw-r--r--spec/ruby/core/io/fixtures/bom_UTF-32BE.txtbin40 -> 0 bytes-rw-r--r--spec/ruby/core/io/fixtures/bom_UTF-32LE.txtbin40 -> 0 bytes-rw-r--r--spec/ruby/core/io/fixtures/bom_UTF-8.txt1
-rw-r--r--spec/ruby/core/io/fixtures/classes.rb189
-rw-r--r--spec/ruby/core/io/fixtures/copy_stream.txt6
-rw-r--r--spec/ruby/core/io/fixtures/empty.txt0
-rw-r--r--spec/ruby/core/io/fixtures/incomplete.txt1
-rw-r--r--spec/ruby/core/io/fixtures/lines.txt9
-rw-r--r--spec/ruby/core/io/fixtures/no_bom_UTF-8.txt1
-rw-r--r--spec/ruby/core/io/fixtures/numbered_lines.txt5
-rw-r--r--spec/ruby/core/io/fixtures/one_byte.txt1
-rw-r--r--spec/ruby/core/io/fixtures/read_binary.txt1
-rw-r--r--spec/ruby/core/io/fixtures/read_euc_jp.txt1
-rw-r--r--spec/ruby/core/io/fixtures/read_text.txt1
-rw-r--r--spec/ruby/core/io/fixtures/reopen_stdout.rb3
-rw-r--r--spec/ruby/core/io/flush_spec.rb8
-rw-r--r--spec/ruby/core/io/for_fd_spec.rb10
-rw-r--r--spec/ruby/core/io/foreach_spec.rb81
-rw-r--r--spec/ruby/core/io/fsync_spec.rb24
-rw-r--r--spec/ruby/core/io/getbyte_spec.rb42
-rw-r--r--spec/ruby/core/io/getc_spec.rb42
-rw-r--r--spec/ruby/core/io/gets_spec.rb321
-rw-r--r--spec/ruby/core/io/initialize_spec.rb57
-rw-r--r--spec/ruby/core/io/inspect_spec.rb23
-rw-r--r--spec/ruby/core/io/internal_encoding_spec.rb140
-rw-r--r--spec/ruby/core/io/io_spec.rb11
-rw-r--r--spec/ruby/core/io/ioctl_spec.rb32
-rw-r--r--spec/ruby/core/io/isatty_spec.rb6
-rw-r--r--spec/ruby/core/io/lineno_spec.rb95
-rw-r--r--spec/ruby/core/io/lines_spec.rb42
-rw-r--r--spec/ruby/core/io/new_spec.rb10
-rw-r--r--spec/ruby/core/io/open_spec.rb86
-rw-r--r--spec/ruby/core/io/output_spec.rb27
-rw-r--r--spec/ruby/core/io/pid_spec.rb35
-rw-r--r--spec/ruby/core/io/pipe_spec.rb214
-rw-r--r--spec/ruby/core/io/popen_spec.rb286
-rw-r--r--spec/ruby/core/io/pos_spec.rb11
-rw-r--r--spec/ruby/core/io/pread_spec.rb52
-rw-r--r--spec/ruby/core/io/print_spec.rb53
-rw-r--r--spec/ruby/core/io/printf_spec.rb32
-rw-r--r--spec/ruby/core/io/putc_spec.rb11
-rw-r--r--spec/ruby/core/io/puts_spec.rb141
-rw-r--r--spec/ruby/core/io/pwrite_spec.rb45
-rw-r--r--spec/ruby/core/io/read_nonblock_spec.rb92
-rw-r--r--spec/ruby/core/io/read_spec.rb620
-rw-r--r--spec/ruby/core/io/readbyte_spec.rb26
-rw-r--r--spec/ruby/core/io/readchar_spec.rb44
-rw-r--r--spec/ruby/core/io/readline_spec.rb53
-rw-r--r--spec/ruby/core/io/readlines_spec.rb210
-rw-r--r--spec/ruby/core/io/readpartial_spec.rb96
-rw-r--r--spec/ruby/core/io/reopen_spec.rb306
-rw-r--r--spec/ruby/core/io/rewind_spec.rb38
-rw-r--r--spec/ruby/core/io/seek_spec.rb79
-rw-r--r--spec/ruby/core/io/select_spec.rb120
-rw-r--r--spec/ruby/core/io/set_encoding_spec.rb193
-rw-r--r--spec/ruby/core/io/shared/binwrite.rb78
-rw-r--r--spec/ruby/core/io/shared/chars.rb73
-rw-r--r--spec/ruby/core/io/shared/codepoints.rb54
-rw-r--r--spec/ruby/core/io/shared/each.rb185
-rw-r--r--spec/ruby/core/io/shared/gets_ascii.rb19
-rw-r--r--spec/ruby/core/io/shared/new.rb378
-rw-r--r--spec/ruby/core/io/shared/pos.rb72
-rw-r--r--spec/ruby/core/io/shared/readlines.rb211
-rw-r--r--spec/ruby/core/io/shared/tty.rb25
-rw-r--r--spec/ruby/core/io/shared/write.rb93
-rw-r--r--spec/ruby/core/io/stat_spec.rb24
-rw-r--r--spec/ruby/core/io/sync_spec.rb64
-rw-r--r--spec/ruby/core/io/sysopen_spec.rb50
-rw-r--r--spec/ruby/core/io/sysread_spec.rb98
-rw-r--r--spec/ruby/core/io/sysseek_spec.rb44
-rw-r--r--spec/ruby/core/io/syswrite_spec.rb71
-rw-r--r--spec/ruby/core/io/tell_spec.rb7
-rw-r--r--spec/ruby/core/io/to_i_spec.rb12
-rw-r--r--spec/ruby/core/io/to_io_spec.rb21
-rw-r--r--spec/ruby/core/io/try_convert_spec.rb49
-rw-r--r--spec/ruby/core/io/tty_spec.rb6
-rw-r--r--spec/ruby/core/io/ungetbyte_spec.rb73
-rw-r--r--spec/ruby/core/io/ungetc_spec.rb135
-rw-r--r--spec/ruby/core/io/write_nonblock_spec.rb83
-rw-r--r--spec/ruby/core/io/write_spec.rb168
-rw-r--r--spec/ruby/core/kernel/Array_spec.rb97
-rw-r--r--spec/ruby/core/kernel/Complex_spec.rb141
-rw-r--r--spec/ruby/core/kernel/Float_spec.rb316
-rw-r--r--spec/ruby/core/kernel/Hash_spec.rb63
-rw-r--r--spec/ruby/core/kernel/Integer_spec.rb715
-rw-r--r--spec/ruby/core/kernel/Rational_spec.rb6
-rw-r--r--spec/ruby/core/kernel/String_spec.rb106
-rw-r--r--spec/ruby/core/kernel/__callee___spec.rb48
-rw-r--r--spec/ruby/core/kernel/__dir___spec.rb20
-rw-r--r--spec/ruby/core/kernel/__method___spec.rb40
-rw-r--r--spec/ruby/core/kernel/abort_spec.rb15
-rw-r--r--spec/ruby/core/kernel/at_exit_spec.rb44
-rw-r--r--spec/ruby/core/kernel/autoload_spec.rb160
-rw-r--r--spec/ruby/core/kernel/backtick_spec.rb80
-rw-r--r--spec/ruby/core/kernel/binding_spec.rb51
-rw-r--r--spec/ruby/core/kernel/block_given_spec.rb38
-rw-r--r--spec/ruby/core/kernel/caller_locations_spec.rb32
-rw-r--r--spec/ruby/core/kernel/caller_spec.rb46
-rw-r--r--spec/ruby/core/kernel/case_compare_spec.rb135
-rw-r--r--spec/ruby/core/kernel/catch_spec.rb127
-rw-r--r--spec/ruby/core/kernel/chomp_spec.rb67
-rw-r--r--spec/ruby/core/kernel/chop_spec.rb55
-rw-r--r--spec/ruby/core/kernel/class_spec.rb26
-rw-r--r--spec/ruby/core/kernel/clone_spec.rb118
-rw-r--r--spec/ruby/core/kernel/comparison_spec.rb31
-rw-r--r--spec/ruby/core/kernel/define_singleton_method_spec.rb99
-rw-r--r--spec/ruby/core/kernel/display_spec.rb6
-rw-r--r--spec/ruby/core/kernel/dup_spec.rb67
-rw-r--r--spec/ruby/core/kernel/enum_for_spec.rb5
-rw-r--r--spec/ruby/core/kernel/eql_spec.rb10
-rw-r--r--spec/ruby/core/kernel/equal_value_spec.rb15
-rw-r--r--spec/ruby/core/kernel/eval_spec.rb345
-rw-r--r--spec/ruby/core/kernel/exec_spec.rb18
-rw-r--r--spec/ruby/core/kernel/exit_spec.rb27
-rw-r--r--spec/ruby/core/kernel/extend_spec.rb79
-rw-r--r--spec/ruby/core/kernel/fail_spec.rb43
-rw-r--r--spec/ruby/core/kernel/fixtures/__callee__.rb34
-rw-r--r--spec/ruby/core/kernel/fixtures/__method__.rb34
-rw-r--r--spec/ruby/core/kernel/fixtures/autoload_b.rb5
-rw-r--r--spec/ruby/core/kernel/fixtures/autoload_d.rb5
-rw-r--r--spec/ruby/core/kernel/fixtures/autoload_from_included_module.rb9
-rw-r--r--spec/ruby/core/kernel/fixtures/autoload_from_included_module2.rb9
-rw-r--r--spec/ruby/core/kernel/fixtures/autoload_frozen.rb7
-rw-r--r--spec/ruby/core/kernel/fixtures/caller.rb7
-rw-r--r--spec/ruby/core/kernel/fixtures/caller_at_exit.rb7
-rw-r--r--spec/ruby/core/kernel/fixtures/caller_locations.rb7
-rw-r--r--spec/ruby/core/kernel/fixtures/chomp.rb4
-rw-r--r--spec/ruby/core/kernel/fixtures/chomp_f.rb4
-rw-r--r--spec/ruby/core/kernel/fixtures/chop.rb4
-rw-r--r--spec/ruby/core/kernel/fixtures/chop_f.rb4
-rw-r--r--spec/ruby/core/kernel/fixtures/classes.rb465
-rw-r--r--spec/ruby/core/kernel/fixtures/eval_locals.rb6
-rw-r--r--spec/ruby/core/kernel/fixtures/eval_return_with_lambda.rb12
-rw-r--r--spec/ruby/core/kernel/fixtures/eval_return_without_lambda.rb14
-rw-r--r--spec/ruby/core/kernel/fixtures/singleton_methods.rb13
-rw-r--r--spec/ruby/core/kernel/fixtures/test.rb362
-rw-r--r--spec/ruby/core/kernel/fork_spec.rb15
-rw-r--r--spec/ruby/core/kernel/format_spec.rb14
-rw-r--r--spec/ruby/core/kernel/freeze_spec.rb85
-rw-r--r--spec/ruby/core/kernel/frozen_spec.rb78
-rw-r--r--spec/ruby/core/kernel/gets_spec.rb17
-rw-r--r--spec/ruby/core/kernel/global_variables_spec.rb26
-rw-r--r--spec/ruby/core/kernel/gsub_spec.rb96
-rw-r--r--spec/ruby/core/kernel/inspect_spec.rb31
-rw-r--r--spec/ruby/core/kernel/instance_of_spec.rb40
-rw-r--r--spec/ruby/core/kernel/instance_variable_defined_spec.rb41
-rw-r--r--spec/ruby/core/kernel/instance_variable_get_spec.rb105
-rw-r--r--spec/ruby/core/kernel/instance_variable_set_spec.rb93
-rw-r--r--spec/ruby/core/kernel/instance_variables_spec.rb27
-rw-r--r--spec/ruby/core/kernel/is_a_spec.rb6
-rw-r--r--spec/ruby/core/kernel/iterator_spec.rb12
-rw-r--r--spec/ruby/core/kernel/itself_spec.rb9
-rw-r--r--spec/ruby/core/kernel/kind_of_spec.rb6
-rw-r--r--spec/ruby/core/kernel/lambda_spec.rb100
-rw-r--r--spec/ruby/core/kernel/load_spec.rb40
-rw-r--r--spec/ruby/core/kernel/local_variables_spec.rb37
-rw-r--r--spec/ruby/core/kernel/loop_spec.rb79
-rw-r--r--spec/ruby/core/kernel/match_spec.rb14
-rw-r--r--spec/ruby/core/kernel/method_spec.rb37
-rw-r--r--spec/ruby/core/kernel/methods_spec.rb101
-rw-r--r--spec/ruby/core/kernel/nil_spec.rb6
-rw-r--r--spec/ruby/core/kernel/not_match_spec.rb21
-rw-r--r--spec/ruby/core/kernel/object_id_spec.rb6
-rw-r--r--spec/ruby/core/kernel/open_spec.rb142
-rw-r--r--spec/ruby/core/kernel/p_spec.rb79
-rw-r--r--spec/ruby/core/kernel/print_spec.rb12
-rw-r--r--spec/ruby/core/kernel/printf_spec.rb60
-rw-r--r--spec/ruby/core/kernel/private_methods_spec.rb69
-rw-r--r--spec/ruby/core/kernel/proc_spec.rb50
-rw-r--r--spec/ruby/core/kernel/protected_methods_spec.rb69
-rw-r--r--spec/ruby/core/kernel/public_method_spec.rb32
-rw-r--r--spec/ruby/core/kernel/public_methods_spec.rb76
-rw-r--r--spec/ruby/core/kernel/public_send_spec.rb108
-rw-r--r--spec/ruby/core/kernel/putc_spec.rb39
-rw-r--r--spec/ruby/core/kernel/puts_spec.rb29
-rw-r--r--spec/ruby/core/kernel/raise_spec.rb17
-rw-r--r--spec/ruby/core/kernel/rand_spec.rb139
-rw-r--r--spec/ruby/core/kernel/readline_spec.rb12
-rw-r--r--spec/ruby/core/kernel/readlines_spec.rb12
-rw-r--r--spec/ruby/core/kernel/remove_instance_variable_spec.rb59
-rw-r--r--spec/ruby/core/kernel/require_relative_spec.rb431
-rw-r--r--spec/ruby/core/kernel/require_spec.rb34
-rw-r--r--spec/ruby/core/kernel/respond_to_missing_spec.rb100
-rw-r--r--spec/ruby/core/kernel/respond_to_spec.rb73
-rw-r--r--spec/ruby/core/kernel/select_spec.rb20
-rw-r--r--spec/ruby/core/kernel/send_spec.rb68
-rw-r--r--spec/ruby/core/kernel/set_trace_func_spec.rb12
-rw-r--r--spec/ruby/core/kernel/shared/dup_clone.rb149
-rw-r--r--spec/ruby/core/kernel/shared/kind_of.rb55
-rw-r--r--spec/ruby/core/kernel/shared/lambda.rb9
-rw-r--r--spec/ruby/core/kernel/shared/load.rb139
-rw-r--r--spec/ruby/core/kernel/shared/method.rb50
-rw-r--r--spec/ruby/core/kernel/shared/require.rb765
-rw-r--r--spec/ruby/core/kernel/shared/sprintf.rb877
-rw-r--r--spec/ruby/core/kernel/shared/sprintf_encoding.rb28
-rw-r--r--spec/ruby/core/kernel/shared/then.rb20
-rw-r--r--spec/ruby/core/kernel/singleton_class_spec.rb27
-rw-r--r--spec/ruby/core/kernel/singleton_method_spec.rb41
-rw-r--r--spec/ruby/core/kernel/singleton_methods_spec.rb192
-rw-r--r--spec/ruby/core/kernel/sleep_spec.rb52
-rw-r--r--spec/ruby/core/kernel/spawn_spec.rb25
-rw-r--r--spec/ruby/core/kernel/sprintf_spec.rb24
-rw-r--r--spec/ruby/core/kernel/srand_spec.rb61
-rw-r--r--spec/ruby/core/kernel/sub_spec.rb26
-rw-r--r--spec/ruby/core/kernel/syscall_spec.rb12
-rw-r--r--spec/ruby/core/kernel/system_spec.rb117
-rw-r--r--spec/ruby/core/kernel/taint_spec.rb45
-rw-r--r--spec/ruby/core/kernel/tainted_spec.rb12
-rw-r--r--spec/ruby/core/kernel/tap_spec.rb13
-rw-r--r--spec/ruby/core/kernel/test_spec.rb109
-rw-r--r--spec/ruby/core/kernel/then_spec.rb8
-rw-r--r--spec/ruby/core/kernel/throw_spec.rb80
-rw-r--r--spec/ruby/core/kernel/to_enum_spec.rb5
-rw-r--r--spec/ruby/core/kernel/to_s_spec.rb16
-rw-r--r--spec/ruby/core/kernel/trace_var_spec.rb54
-rw-r--r--spec/ruby/core/kernel/trap_spec.rb12
-rw-r--r--spec/ruby/core/kernel/trust_spec.rb25
-rw-r--r--spec/ruby/core/kernel/untaint_spec.rb25
-rw-r--r--spec/ruby/core/kernel/untrace_var_spec.rb12
-rw-r--r--spec/ruby/core/kernel/untrust_spec.rb25
-rw-r--r--spec/ruby/core/kernel/untrusted_spec.rb28
-rw-r--r--spec/ruby/core/kernel/warn_spec.rb135
-rw-r--r--spec/ruby/core/kernel/yield_self_spec.rb8
-rw-r--r--spec/ruby/core/main/define_method_spec.rb28
-rw-r--r--spec/ruby/core/main/fixtures/classes.rb18
-rw-r--r--spec/ruby/core/main/fixtures/string_refinement.rb7
-rw-r--r--spec/ruby/core/main/fixtures/string_refinement_user.rb11
-rw-r--r--spec/ruby/core/main/fixtures/wrapped_include.rb1
-rw-r--r--spec/ruby/core/main/include_spec.rb16
-rw-r--r--spec/ruby/core/main/private_spec.rb23
-rw-r--r--spec/ruby/core/main/public_spec.rb23
-rw-r--r--spec/ruby/core/main/to_s_spec.rb7
-rw-r--r--spec/ruby/core/main/using_spec.rb132
-rw-r--r--spec/ruby/core/marshal/dump_spec.rb597
-rw-r--r--spec/ruby/core/marshal/fixtures/marshal_data.rb420
-rw-r--r--spec/ruby/core/marshal/fixtures/random.dumpbin2520 -> 0 bytes-rw-r--r--spec/ruby/core/marshal/float_spec.rb77
-rw-r--r--spec/ruby/core/marshal/load_spec.rb6
-rw-r--r--spec/ruby/core/marshal/major_version_spec.rb7
-rw-r--r--spec/ruby/core/marshal/minor_version_spec.rb7
-rw-r--r--spec/ruby/core/marshal/restore_spec.rb6
-rw-r--r--spec/ruby/core/marshal/shared/load.rb830
-rw-r--r--spec/ruby/core/matchdata/begin_spec.rb30
-rw-r--r--spec/ruby/core/matchdata/captures_spec.rb7
-rw-r--r--spec/ruby/core/matchdata/element_reference_spec.rb87
-rw-r--r--spec/ruby/core/matchdata/end_spec.rb30
-rw-r--r--spec/ruby/core/matchdata/eql_spec.rb6
-rw-r--r--spec/ruby/core/matchdata/equal_value_spec.rb6
-rw-r--r--spec/ruby/core/matchdata/hash_spec.rb5
-rw-r--r--spec/ruby/core/matchdata/inspect_spec.rb23
-rw-r--r--spec/ruby/core/matchdata/length_spec.rb6
-rw-r--r--spec/ruby/core/matchdata/named_captures_spec.rb13
-rw-r--r--spec/ruby/core/matchdata/names_spec.rb33
-rw-r--r--spec/ruby/core/matchdata/offset_spec.rb30
-rw-r--r--spec/ruby/core/matchdata/post_match_spec.rb36
-rw-r--r--spec/ruby/core/matchdata/pre_match_spec.rb36
-rw-r--r--spec/ruby/core/matchdata/regexp_spec.rb13
-rw-r--r--spec/ruby/core/matchdata/shared/eql.rb26
-rw-r--r--spec/ruby/core/matchdata/shared/length.rb5
-rw-r--r--spec/ruby/core/matchdata/size_spec.rb6
-rw-r--r--spec/ruby/core/matchdata/string_spec.rb14
-rw-r--r--spec/ruby/core/matchdata/to_a_spec.rb7
-rw-r--r--spec/ruby/core/matchdata/to_s_spec.rb7
-rw-r--r--spec/ruby/core/matchdata/values_at_spec.rb23
-rw-r--r--spec/ruby/core/math/acos_spec.rb56
-rw-r--r--spec/ruby/core/math/acosh_spec.rb41
-rw-r--r--spec/ruby/core/math/asin_spec.rb48
-rw-r--r--spec/ruby/core/math/asinh_spec.rb42
-rw-r--r--spec/ruby/core/math/atan2_spec.rb54
-rw-r--r--spec/ruby/core/math/atan_spec.rb40
-rw-r--r--spec/ruby/core/math/atanh_spec.rb14
-rw-r--r--spec/ruby/core/math/cbrt_spec.rb27
-rw-r--r--spec/ruby/core/math/constants_spec.rb22
-rw-r--r--spec/ruby/core/math/cos_spec.rb42
-rw-r--r--spec/ruby/core/math/cosh_spec.rb37
-rw-r--r--spec/ruby/core/math/erf_spec.rb44
-rw-r--r--spec/ruby/core/math/erfc_spec.rb43
-rw-r--r--spec/ruby/core/math/exp_spec.rb37
-rw-r--r--spec/ruby/core/math/fixtures/classes.rb28
-rw-r--r--spec/ruby/core/math/frexp_spec.rb37
-rw-r--r--spec/ruby/core/math/gamma_spec.rb69
-rw-r--r--spec/ruby/core/math/hypot_spec.rb41
-rw-r--r--spec/ruby/core/math/ldexp_spec.rb54
-rw-r--r--spec/ruby/core/math/lgamma_spec.rb56
-rw-r--r--spec/ruby/core/math/log10_spec.rb43
-rw-r--r--spec/ruby/core/math/log2_spec.rb41
-rw-r--r--spec/ruby/core/math/log_spec.rb57
-rw-r--r--spec/ruby/core/math/sin_spec.rb39
-rw-r--r--spec/ruby/core/math/sinh_spec.rb37
-rw-r--r--spec/ruby/core/math/sqrt_spec.rb36
-rw-r--r--spec/ruby/core/math/tan_spec.rb42
-rw-r--r--spec/ruby/core/math/tanh_spec.rb39
-rw-r--r--spec/ruby/core/method/arity_spec.rb222
-rw-r--r--spec/ruby/core/method/call_spec.rb7
-rw-r--r--spec/ruby/core/method/case_compare_spec.rb9
-rw-r--r--spec/ruby/core/method/clone_spec.rb14
-rw-r--r--spec/ruby/core/method/curry_spec.rb36
-rw-r--r--spec/ruby/core/method/element_reference_spec.rb7
-rw-r--r--spec/ruby/core/method/eql_spec.rb6
-rw-r--r--spec/ruby/core/method/equal_value_spec.rb6
-rw-r--r--spec/ruby/core/method/fixtures/classes.rb184
-rw-r--r--spec/ruby/core/method/hash_spec.rb17
-rw-r--r--spec/ruby/core/method/inspect_spec.rb6
-rw-r--r--spec/ruby/core/method/name_spec.rb22
-rw-r--r--spec/ruby/core/method/owner_spec.rb26
-rw-r--r--spec/ruby/core/method/parameters_spec.rb244
-rw-r--r--spec/ruby/core/method/receiver_spec.rb22
-rw-r--r--spec/ruby/core/method/shared/call.rb51
-rw-r--r--spec/ruby/core/method/shared/eql.rb94
-rw-r--r--spec/ruby/core/method/shared/to_s.rb34
-rw-r--r--spec/ruby/core/method/source_location_spec.rb95
-rw-r--r--spec/ruby/core/method/super_method_spec.rb45
-rw-r--r--spec/ruby/core/method/to_proc_spec.rb93
-rw-r--r--spec/ruby/core/method/to_s_spec.rb6
-rw-r--r--spec/ruby/core/method/unbind_spec.rb37
-rw-r--r--spec/ruby/core/module/alias_method_spec.rb157
-rw-r--r--spec/ruby/core/module/allocate_spec.rb14
-rw-r--r--spec/ruby/core/module/ancestors_spec.rb70
-rw-r--r--spec/ruby/core/module/append_features_spec.rb73
-rw-r--r--spec/ruby/core/module/attr_accessor_spec.rb97
-rw-r--r--spec/ruby/core/module/attr_reader_spec.rb71
-rw-r--r--spec/ruby/core/module/attr_spec.rb156
-rw-r--r--spec/ruby/core/module/attr_writer_spec.rb71
-rw-r--r--spec/ruby/core/module/autoload_spec.rb829
-rw-r--r--spec/ruby/core/module/case_compare_spec.rb31
-rw-r--r--spec/ruby/core/module/class_eval_spec.rb7
-rw-r--r--spec/ruby/core/module/class_exec_spec.rb7
-rw-r--r--spec/ruby/core/module/class_variable_defined_spec.rb72
-rw-r--r--spec/ruby/core/module/class_variable_get_spec.rb76
-rw-r--r--spec/ruby/core/module/class_variable_set_spec.rb62
-rw-r--r--spec/ruby/core/module/class_variables_spec.rb26
-rw-r--r--spec/ruby/core/module/comparison_spec.rb36
-rw-r--r--spec/ruby/core/module/const_defined_spec.rb144
-rw-r--r--spec/ruby/core/module/const_get_spec.rb229
-rw-r--r--spec/ruby/core/module/const_missing_spec.rb36
-rw-r--r--spec/ruby/core/module/const_set_spec.rb86
-rw-r--r--spec/ruby/core/module/constants_spec.rb91
-rw-r--r--spec/ruby/core/module/define_method_spec.rb656
-rw-r--r--spec/ruby/core/module/define_singleton_method_spec.rb17
-rw-r--r--spec/ruby/core/module/deprecate_constant_spec.rb50
-rw-r--r--spec/ruby/core/module/eql_spec.rb7
-rw-r--r--spec/ruby/core/module/equal_spec.rb7
-rw-r--r--spec/ruby/core/module/equal_value_spec.rb7
-rw-r--r--spec/ruby/core/module/extend_object_spec.rb68
-rw-r--r--spec/ruby/core/module/extended_spec.rb44
-rw-r--r--spec/ruby/core/module/fixtures/autoload.rb1
-rw-r--r--spec/ruby/core/module/fixtures/autoload_abc.rb11
-rw-r--r--spec/ruby/core/module/fixtures/autoload_c.rb11
-rw-r--r--spec/ruby/core/module/fixtures/autoload_callback.rb2
-rw-r--r--spec/ruby/core/module/fixtures/autoload_concur.rb9
-rw-r--r--spec/ruby/core/module/fixtures/autoload_d.rb11
-rw-r--r--spec/ruby/core/module/fixtures/autoload_during_autoload.rb7
-rw-r--r--spec/ruby/core/module/fixtures/autoload_during_require.rb4
-rw-r--r--spec/ruby/core/module/fixtures/autoload_e.rb7
-rw-r--r--spec/ruby/core/module/fixtures/autoload_empty.rb1
-rw-r--r--spec/ruby/core/module/fixtures/autoload_ex1.rb16
-rw-r--r--spec/ruby/core/module/fixtures/autoload_exception.rb3
-rw-r--r--spec/ruby/core/module/fixtures/autoload_f.rb7
-rw-r--r--spec/ruby/core/module/fixtures/autoload_g.rb7
-rw-r--r--spec/ruby/core/module/fixtures/autoload_h.rb7
-rw-r--r--spec/ruby/core/module/fixtures/autoload_i.rb5
-rw-r--r--spec/ruby/core/module/fixtures/autoload_j.rb3
-rw-r--r--spec/ruby/core/module/fixtures/autoload_k.rb7
-rw-r--r--spec/ruby/core/module/fixtures/autoload_lm.rb4
-rw-r--r--spec/ruby/core/module/fixtures/autoload_nested.rb8
-rw-r--r--spec/ruby/core/module/fixtures/autoload_never_set.rb1
-rw-r--r--spec/ruby/core/module/fixtures/autoload_o.rb2
-rw-r--r--spec/ruby/core/module/fixtures/autoload_r.rb4
-rw-r--r--spec/ruby/core/module/fixtures/autoload_raise.rb2
-rw-r--r--spec/ruby/core/module/fixtures/autoload_required_directly.rb7
-rw-r--r--spec/ruby/core/module/fixtures/autoload_required_directly_nested.rb1
-rw-r--r--spec/ruby/core/module/fixtures/autoload_s.rb5
-rw-r--r--spec/ruby/core/module/fixtures/autoload_subclass.rb11
-rw-r--r--spec/ruby/core/module/fixtures/autoload_t.rb3
-rw-r--r--spec/ruby/core/module/fixtures/autoload_v.rb7
-rw-r--r--spec/ruby/core/module/fixtures/autoload_w.rb2
-rw-r--r--spec/ruby/core/module/fixtures/autoload_w2.rb1
-rw-r--r--spec/ruby/core/module/fixtures/autoload_x.rb3
-rw-r--r--spec/ruby/core/module/fixtures/autoload_z.rb5
-rw-r--r--spec/ruby/core/module/fixtures/classes.rb605
-rw-r--r--spec/ruby/core/module/fixtures/constant_unicode.rb5
-rw-r--r--spec/ruby/core/module/fixtures/constants_autoload.rb6
-rw-r--r--spec/ruby/core/module/fixtures/constants_autoload_a.rb2
-rw-r--r--spec/ruby/core/module/fixtures/constants_autoload_b.rb2
-rw-r--r--spec/ruby/core/module/fixtures/constants_autoload_c.rb3
-rw-r--r--spec/ruby/core/module/fixtures/constants_autoload_d.rb4
-rw-r--r--spec/ruby/core/module/fixtures/module.rb4
-rw-r--r--spec/ruby/core/module/fixtures/name.rb10
-rw-r--r--spec/ruby/core/module/fixtures/path1/load_path.rb9
-rw-r--r--spec/ruby/core/module/fixtures/path2/load_path.rb1
-rw-r--r--spec/ruby/core/module/fixtures/refine.rb13
-rw-r--r--spec/ruby/core/module/fixtures/repeated_concurrent_autoload.rb8
-rw-r--r--spec/ruby/core/module/freeze_spec.rb6
-rw-r--r--spec/ruby/core/module/gt_spec.rb36
-rw-r--r--spec/ruby/core/module/gte_spec.rb33
-rw-r--r--spec/ruby/core/module/include_spec.rb270
-rw-r--r--spec/ruby/core/module/included_modules_spec.rb12
-rw-r--r--spec/ruby/core/module/included_spec.rb44
-rw-r--r--spec/ruby/core/module/initialize_copy_spec.rb18
-rw-r--r--spec/ruby/core/module/initialize_spec.rb18
-rw-r--r--spec/ruby/core/module/instance_method_spec.rb85
-rw-r--r--spec/ruby/core/module/instance_methods_spec.rb61
-rw-r--r--spec/ruby/core/module/lt_spec.rb36
-rw-r--r--spec/ruby/core/module/lte_spec.rb33
-rw-r--r--spec/ruby/core/module/method_added_spec.rb62
-rw-r--r--spec/ruby/core/module/method_defined_spec.rb49
-rw-r--r--spec/ruby/core/module/method_removed_spec.rb33
-rw-r--r--spec/ruby/core/module/method_undefined_spec.rb33
-rw-r--r--spec/ruby/core/module/module_eval_spec.rb7
-rw-r--r--spec/ruby/core/module/module_exec_spec.rb7
-rw-r--r--spec/ruby/core/module/module_function_spec.rb269
-rw-r--r--spec/ruby/core/module/name_spec.rb68
-rw-r--r--spec/ruby/core/module/nesting_spec.rb31
-rw-r--r--spec/ruby/core/module/new_spec.rb31
-rw-r--r--spec/ruby/core/module/prepend_features_spec.rb76
-rw-r--r--spec/ruby/core/module/prepend_spec.rb373
-rw-r--r--spec/ruby/core/module/prepended_spec.rb25
-rw-r--r--spec/ruby/core/module/private_class_method_spec.rb81
-rw-r--r--spec/ruby/core/module/private_constant_spec.rb32
-rw-r--r--spec/ruby/core/module/private_instance_methods_spec.rb54
-rw-r--r--spec/ruby/core/module/private_method_defined_spec.rb72
-rw-r--r--spec/ruby/core/module/private_spec.rb95
-rw-r--r--spec/ruby/core/module/protected_instance_methods_spec.rb57
-rw-r--r--spec/ruby/core/module/protected_method_defined_spec.rb72
-rw-r--r--spec/ruby/core/module/protected_spec.rb55
-rw-r--r--spec/ruby/core/module/public_class_method_spec.rb80
-rw-r--r--spec/ruby/core/module/public_constant_spec.rb38
-rw-r--r--spec/ruby/core/module/public_instance_method_spec.rb65
-rw-r--r--spec/ruby/core/module/public_instance_methods_spec.rb61
-rw-r--r--spec/ruby/core/module/public_method_defined_spec.rb72
-rw-r--r--spec/ruby/core/module/public_spec.rb44
-rw-r--r--spec/ruby/core/module/refine_spec.rb735
-rw-r--r--spec/ruby/core/module/remove_class_variable_spec.rb44
-rw-r--r--spec/ruby/core/module/remove_const_spec.rb84
-rw-r--r--spec/ruby/core/module/remove_method_spec.rb116
-rw-r--r--spec/ruby/core/module/shared/class_eval.rb115
-rw-r--r--spec/ruby/core/module/shared/class_exec.rb29
-rw-r--r--spec/ruby/core/module/shared/equal_value.rb14
-rw-r--r--spec/ruby/core/module/shared/set_visibility.rb135
-rw-r--r--spec/ruby/core/module/singleton_class_spec.rb27
-rw-r--r--spec/ruby/core/module/to_s_spec.rb18
-rw-r--r--spec/ruby/core/module/undef_method_spec.rb159
-rw-r--r--spec/ruby/core/module/using_spec.rb287
-rw-r--r--spec/ruby/core/mutex/lock_spec.rb34
-rw-r--r--spec/ruby/core/mutex/locked_spec.rb36
-rw-r--r--spec/ruby/core/mutex/owned_spec.rb43
-rw-r--r--spec/ruby/core/mutex/sleep_spec.rb95
-rw-r--r--spec/ruby/core/mutex/synchronize_spec.rb66
-rw-r--r--spec/ruby/core/mutex/try_lock_spec.rb32
-rw-r--r--spec/ruby/core/mutex/unlock_spec.rb38
-rw-r--r--spec/ruby/core/nil/and_spec.rb11
-rw-r--r--spec/ruby/core/nil/dup_spec.rb9
-rw-r--r--spec/ruby/core/nil/inspect_spec.rb7
-rw-r--r--spec/ruby/core/nil/nil_spec.rb7
-rw-r--r--spec/ruby/core/nil/nilclass_spec.rb15
-rw-r--r--spec/ruby/core/nil/or_spec.rb11
-rw-r--r--spec/ruby/core/nil/rationalize_spec.rb16
-rw-r--r--spec/ruby/core/nil/to_a_spec.rb7
-rw-r--r--spec/ruby/core/nil/to_c_spec.rb7
-rw-r--r--spec/ruby/core/nil/to_f_spec.rb11
-rw-r--r--spec/ruby/core/nil/to_h_spec.rb8
-rw-r--r--spec/ruby/core/nil/to_i_spec.rb11
-rw-r--r--spec/ruby/core/nil/to_r_spec.rb7
-rw-r--r--spec/ruby/core/nil/to_s_spec.rb7
-rw-r--r--spec/ruby/core/nil/xor_spec.rb11
-rw-r--r--spec/ruby/core/numeric/abs2_spec.rb34
-rw-r--r--spec/ruby/core/numeric/abs_spec.rb6
-rw-r--r--spec/ruby/core/numeric/angle_spec.rb6
-rw-r--r--spec/ruby/core/numeric/arg_spec.rb6
-rw-r--r--spec/ruby/core/numeric/ceil_spec.rb15
-rw-r--r--spec/ruby/core/numeric/coerce_spec.rb59
-rw-r--r--spec/ruby/core/numeric/comparison_spec.rb48
-rw-r--r--spec/ruby/core/numeric/conj_spec.rb6
-rw-r--r--spec/ruby/core/numeric/conjugate_spec.rb6
-rw-r--r--spec/ruby/core/numeric/denominator_spec.rb24
-rw-r--r--spec/ruby/core/numeric/div_spec.rb22
-rw-r--r--spec/ruby/core/numeric/divmod_spec.rb15
-rw-r--r--spec/ruby/core/numeric/eql_spec.rb22
-rw-r--r--spec/ruby/core/numeric/fdiv_spec.rb32
-rw-r--r--spec/ruby/core/numeric/finite_spec.rb10
-rw-r--r--spec/ruby/core/numeric/fixtures/classes.rb17
-rw-r--r--spec/ruby/core/numeric/floor_spec.rb14
-rw-r--r--spec/ruby/core/numeric/i_spec.rb15
-rw-r--r--spec/ruby/core/numeric/imag_spec.rb6
-rw-r--r--spec/ruby/core/numeric/imaginary_spec.rb6
-rw-r--r--spec/ruby/core/numeric/infinite_spec.rb10
-rw-r--r--spec/ruby/core/numeric/integer_spec.rb8
-rw-r--r--spec/ruby/core/numeric/magnitude_spec.rb5
-rw-r--r--spec/ruby/core/numeric/modulo_spec.rb24
-rw-r--r--spec/ruby/core/numeric/negative_spec.rb41
-rw-r--r--spec/ruby/core/numeric/nonzero_spec.rb18
-rw-r--r--spec/ruby/core/numeric/numerator_spec.rb33
-rw-r--r--spec/ruby/core/numeric/numeric_spec.rb7
-rw-r--r--spec/ruby/core/numeric/phase_spec.rb6
-rw-r--r--spec/ruby/core/numeric/polar_spec.rb50
-rw-r--r--spec/ruby/core/numeric/positive_spec.rb41
-rw-r--r--spec/ruby/core/numeric/quo_spec.rb55
-rw-r--r--spec/ruby/core/numeric/real_spec.rb37
-rw-r--r--spec/ruby/core/numeric/rect_spec.rb6
-rw-r--r--spec/ruby/core/numeric/rectangular_spec.rb6
-rw-r--r--spec/ruby/core/numeric/remainder_spec.rb67
-rw-r--r--spec/ruby/core/numeric/round_spec.rb14
-rw-r--r--spec/ruby/core/numeric/shared/abs.rb19
-rw-r--r--spec/ruby/core/numeric/shared/arg.rb38
-rw-r--r--spec/ruby/core/numeric/shared/conj.rb20
-rw-r--r--spec/ruby/core/numeric/shared/imag.rb26
-rw-r--r--spec/ruby/core/numeric/shared/quo.rb7
-rw-r--r--spec/ruby/core/numeric/shared/rect.rb48
-rw-r--r--spec/ruby/core/numeric/shared/step.rb430
-rw-r--r--spec/ruby/core/numeric/singleton_method_added_spec.rb41
-rw-r--r--spec/ruby/core/numeric/step_spec.rb182
-rw-r--r--spec/ruby/core/numeric/to_c_spec.rb45
-rw-r--r--spec/ruby/core/numeric/to_int_spec.rb10
-rw-r--r--spec/ruby/core/numeric/truncate_spec.rb14
-rw-r--r--spec/ruby/core/numeric/uminus_spec.rb31
-rw-r--r--spec/ruby/core/numeric/uplus_spec.rb9
-rw-r--r--spec/ruby/core/numeric/zero_spec.rb18
-rw-r--r--spec/ruby/core/objectspace/_id2ref_spec.rb25
-rw-r--r--spec/ruby/core/objectspace/add_finalizer_spec.rb5
-rw-r--r--spec/ruby/core/objectspace/call_finalizer_spec.rb5
-rw-r--r--spec/ruby/core/objectspace/count_objects_spec.rb5
-rw-r--r--spec/ruby/core/objectspace/define_finalizer_spec.rb101
-rw-r--r--spec/ruby/core/objectspace/each_object_spec.rb214
-rw-r--r--spec/ruby/core/objectspace/finalizers_spec.rb5
-rw-r--r--spec/ruby/core/objectspace/fixtures/classes.rb64
-rw-r--r--spec/ruby/core/objectspace/garbage_collect_spec.rb22
-rw-r--r--spec/ruby/core/objectspace/remove_finalizer_spec.rb5
-rw-r--r--spec/ruby/core/objectspace/undefine_finalizer_spec.rb5
-rw-r--r--spec/ruby/core/proc/allocate_spec.rb9
-rw-r--r--spec/ruby/core/proc/arity_spec.rb640
-rw-r--r--spec/ruby/core/proc/binding_spec.rb21
-rw-r--r--spec/ruby/core/proc/block_pass_spec.rb41
-rw-r--r--spec/ruby/core/proc/call_spec.rb16
-rw-r--r--spec/ruby/core/proc/case_compare_spec.rb16
-rw-r--r--spec/ruby/core/proc/clone_spec.rb6
-rw-r--r--spec/ruby/core/proc/curry_spec.rb180
-rw-r--r--spec/ruby/core/proc/dup_spec.rb6
-rw-r--r--spec/ruby/core/proc/element_reference_spec.rb29
-rw-r--r--spec/ruby/core/proc/eql_spec.rb6
-rw-r--r--spec/ruby/core/proc/equal_value_spec.rb6
-rw-r--r--spec/ruby/core/proc/fixtures/common.rb51
-rw-r--r--spec/ruby/core/proc/fixtures/proc_aref.rb9
-rw-r--r--spec/ruby/core/proc/fixtures/proc_aref_frozen.rb10
-rw-r--r--spec/ruby/core/proc/fixtures/source_location.rb55
-rw-r--r--spec/ruby/core/proc/hash_spec.rb17
-rw-r--r--spec/ruby/core/proc/inspect_spec.rb6
-rw-r--r--spec/ruby/core/proc/lambda_spec.rb60
-rw-r--r--spec/ruby/core/proc/new_spec.rb190
-rw-r--r--spec/ruby/core/proc/parameters_spec.rb95
-rw-r--r--spec/ruby/core/proc/shared/call.rb96
-rw-r--r--spec/ruby/core/proc/shared/call_arguments.rb7
-rw-r--r--spec/ruby/core/proc/shared/dup.rb10
-rw-r--r--spec/ruby/core/proc/shared/equal.rb100
-rw-r--r--spec/ruby/core/proc/shared/to_s.rb45
-rw-r--r--spec/ruby/core/proc/source_location_spec.rb86
-rw-r--r--spec/ruby/core/proc/to_proc_spec.rb9
-rw-r--r--spec/ruby/core/proc/to_s_spec.rb6
-rw-r--r--spec/ruby/core/proc/yield_spec.rb16
-rw-r--r--spec/ruby/core/process/abort_spec.rb6
-rw-r--r--spec/ruby/core/process/clock_gettime_spec.rb35
-rw-r--r--spec/ruby/core/process/constants_spec.rb63
-rw-r--r--spec/ruby/core/process/daemon_spec.rb123
-rw-r--r--spec/ruby/core/process/detach_spec.rb46
-rw-r--r--spec/ruby/core/process/egid_spec.rb19
-rw-r--r--spec/ruby/core/process/euid_spec.rb59
-rw-r--r--spec/ruby/core/process/exec_spec.rb218
-rw-r--r--spec/ruby/core/process/exit_spec.rb10
-rw-r--r--spec/ruby/core/process/fixtures/common.rb84
-rw-r--r--spec/ruby/core/process/fixtures/daemon.rb111
-rw-r--r--spec/ruby/core/process/fixtures/kill.rb45
-rw-r--r--spec/ruby/core/process/fixtures/map_fd.rb9
-rw-r--r--spec/ruby/core/process/fixtures/setpriority.rb12
-rw-r--r--spec/ruby/core/process/fork_spec.rb6
-rw-r--r--spec/ruby/core/process/getpgid_spec.rb17
-rw-r--r--spec/ruby/core/process/getpgrp_spec.rb7
-rw-r--r--spec/ruby/core/process/getpriority_spec.rb23
-rw-r--r--spec/ruby/core/process/getrlimit_spec.rb91
-rw-r--r--spec/ruby/core/process/gid/change_privilege_spec.rb5
-rw-r--r--spec/ruby/core/process/gid/eid_spec.rb9
-rw-r--r--spec/ruby/core/process/gid/grant_privilege_spec.rb5
-rw-r--r--spec/ruby/core/process/gid/re_exchange_spec.rb5
-rw-r--r--spec/ruby/core/process/gid/re_exchangeable_spec.rb5
-rw-r--r--spec/ruby/core/process/gid/rid_spec.rb5
-rw-r--r--spec/ruby/core/process/gid/sid_available_spec.rb5
-rw-r--r--spec/ruby/core/process/gid/switch_spec.rb5
-rw-r--r--spec/ruby/core/process/gid_spec.rb22
-rw-r--r--spec/ruby/core/process/groups_spec.rb63
-rw-r--r--spec/ruby/core/process/initgroups_spec.rb22
-rw-r--r--spec/ruby/core/process/kill_spec.rb128
-rw-r--r--spec/ruby/core/process/last_status_spec.rb20
-rw-r--r--spec/ruby/core/process/maxgroups_spec.rb19
-rw-r--r--spec/ruby/core/process/pid_spec.rb9
-rw-r--r--spec/ruby/core/process/ppid_spec.rb23
-rw-r--r--spec/ruby/core/process/set_proctitle_spec.rb23
-rw-r--r--spec/ruby/core/process/setpgid_spec.rb28
-rw-r--r--spec/ruby/core/process/setpgrp_spec.rb37
-rw-r--r--spec/ruby/core/process/setpriority_spec.rb41
-rw-r--r--spec/ruby/core/process/setrlimit_spec.rb232
-rw-r--r--spec/ruby/core/process/setsid_spec.rb37
-rw-r--r--spec/ruby/core/process/spawn_spec.rb636
-rw-r--r--spec/ruby/core/process/status/bit_and_spec.rb5
-rw-r--r--spec/ruby/core/process/status/coredump_spec.rb5
-rw-r--r--spec/ruby/core/process/status/equal_value_spec.rb5
-rw-r--r--spec/ruby/core/process/status/exited_spec.rb37
-rw-r--r--spec/ruby/core/process/status/exitstatus_spec.rb25
-rw-r--r--spec/ruby/core/process/status/inspect_spec.rb5
-rw-r--r--spec/ruby/core/process/status/pid_spec.rb15
-rw-r--r--spec/ruby/core/process/status/right_shift_spec.rb5
-rw-r--r--spec/ruby/core/process/status/signaled_spec.rb35
-rw-r--r--spec/ruby/core/process/status/stopped_spec.rb5
-rw-r--r--spec/ruby/core/process/status/stopsig_spec.rb5
-rw-r--r--spec/ruby/core/process/status/success_spec.rb51
-rw-r--r--spec/ruby/core/process/status/termsig_spec.rb51
-rw-r--r--spec/ruby/core/process/status/to_i_spec.rb5
-rw-r--r--spec/ruby/core/process/status/to_int_spec.rb5
-rw-r--r--spec/ruby/core/process/status/to_s_spec.rb5
-rw-r--r--spec/ruby/core/process/sys/getegid_spec.rb5
-rw-r--r--spec/ruby/core/process/sys/geteuid_spec.rb5
-rw-r--r--spec/ruby/core/process/sys/getgid_spec.rb5
-rw-r--r--spec/ruby/core/process/sys/getuid_spec.rb5
-rw-r--r--spec/ruby/core/process/sys/issetugid_spec.rb5
-rw-r--r--spec/ruby/core/process/sys/setegid_spec.rb5
-rw-r--r--spec/ruby/core/process/sys/seteuid_spec.rb5
-rw-r--r--spec/ruby/core/process/sys/setgid_spec.rb5
-rw-r--r--spec/ruby/core/process/sys/setregid_spec.rb5
-rw-r--r--spec/ruby/core/process/sys/setresgid_spec.rb5
-rw-r--r--spec/ruby/core/process/sys/setresuid_spec.rb5
-rw-r--r--spec/ruby/core/process/sys/setreuid_spec.rb5
-rw-r--r--spec/ruby/core/process/sys/setrgid_spec.rb5
-rw-r--r--spec/ruby/core/process/sys/setruid_spec.rb5
-rw-r--r--spec/ruby/core/process/sys/setuid_spec.rb5
-rw-r--r--spec/ruby/core/process/times_spec.rb27
-rw-r--r--spec/ruby/core/process/tms/cstime_spec.rb9
-rw-r--r--spec/ruby/core/process/tms/cutime_spec.rb9
-rw-r--r--spec/ruby/core/process/tms/element_reference_spec.rb5
-rw-r--r--spec/ruby/core/process/tms/members_spec.rb5
-rw-r--r--spec/ruby/core/process/tms/new_spec.rb5
-rw-r--r--spec/ruby/core/process/tms/stime_spec.rb9
-rw-r--r--spec/ruby/core/process/tms/utime_spec.rb9
-rw-r--r--spec/ruby/core/process/uid/change_privilege_spec.rb5
-rw-r--r--spec/ruby/core/process/uid/eid_spec.rb9
-rw-r--r--spec/ruby/core/process/uid/grant_privilege_spec.rb5
-rw-r--r--spec/ruby/core/process/uid/re_exchange_spec.rb5
-rw-r--r--spec/ruby/core/process/uid/re_exchangeable_spec.rb5
-rw-r--r--spec/ruby/core/process/uid/rid_spec.rb5
-rw-r--r--spec/ruby/core/process/uid/sid_available_spec.rb5
-rw-r--r--spec/ruby/core/process/uid/switch_spec.rb5
-rw-r--r--spec/ruby/core/process/uid_spec.rb84
-rw-r--r--spec/ruby/core/process/wait2_spec.rb40
-rw-r--r--spec/ruby/core/process/wait_spec.rb94
-rw-r--r--spec/ruby/core/process/waitall_spec.rb48
-rw-r--r--spec/ruby/core/process/waitpid2_spec.rb5
-rw-r--r--spec/ruby/core/process/waitpid_spec.rb15
-rw-r--r--spec/ruby/core/queue/append_spec.rb6
-rw-r--r--spec/ruby/core/queue/clear_spec.rb6
-rw-r--r--spec/ruby/core/queue/close_spec.rb6
-rw-r--r--spec/ruby/core/queue/closed_spec.rb6
-rw-r--r--spec/ruby/core/queue/deq_spec.rb6
-rw-r--r--spec/ruby/core/queue/empty_spec.rb6
-rw-r--r--spec/ruby/core/queue/enq_spec.rb6
-rw-r--r--spec/ruby/core/queue/length_spec.rb6
-rw-r--r--spec/ruby/core/queue/num_waiting_spec.rb6
-rw-r--r--spec/ruby/core/queue/pop_spec.rb6
-rw-r--r--spec/ruby/core/queue/push_spec.rb6
-rw-r--r--spec/ruby/core/queue/shift_spec.rb6
-rw-r--r--spec/ruby/core/queue/size_spec.rb6
-rw-r--r--spec/ruby/core/random/bytes_spec.rb32
-rw-r--r--spec/ruby/core/random/default_spec.rb7
-rw-r--r--spec/ruby/core/random/equal_value_spec.rb37
-rw-r--r--spec/ruby/core/random/new_seed_spec.rb24
-rw-r--r--spec/ruby/core/random/new_spec.rb37
-rw-r--r--spec/ruby/core/random/rand_spec.rb216
-rw-r--r--spec/ruby/core/random/raw_seed_spec.rb9
-rw-r--r--spec/ruby/core/random/seed_spec.rb29
-rw-r--r--spec/ruby/core/random/shared/bytes.rb17
-rw-r--r--spec/ruby/core/random/shared/urandom.rb23
-rw-r--r--spec/ruby/core/random/srand_spec.rb39
-rw-r--r--spec/ruby/core/random/urandom_spec.rb9
-rw-r--r--spec/ruby/core/range/begin_spec.rb6
-rw-r--r--spec/ruby/core/range/bsearch_spec.rb137
-rw-r--r--spec/ruby/core/range/case_compare_spec.rb20
-rw-r--r--spec/ruby/core/range/cover_spec.rb9
-rw-r--r--spec/ruby/core/range/dup_spec.rb15
-rw-r--r--spec/ruby/core/range/each_spec.rb66
-rw-r--r--spec/ruby/core/range/end_spec.rb6
-rw-r--r--spec/ruby/core/range/eql_spec.rb10
-rw-r--r--spec/ruby/core/range/equal_value_spec.rb10
-rw-r--r--spec/ruby/core/range/exclude_end_spec.rb19
-rw-r--r--spec/ruby/core/range/first_spec.rb49
-rw-r--r--spec/ruby/core/range/fixtures/classes.rb68
-rw-r--r--spec/ruby/core/range/hash_spec.rb24
-rw-r--r--spec/ruby/core/range/include_spec.rb10
-rw-r--r--spec/ruby/core/range/initialize_spec.rb41
-rw-r--r--spec/ruby/core/range/inspect_spec.rb26
-rw-r--r--spec/ruby/core/range/last_spec.rb49
-rw-r--r--spec/ruby/core/range/max_spec.rb82
-rw-r--r--spec/ruby/core/range/member_spec.rb10
-rw-r--r--spec/ruby/core/range/min_spec.rb75
-rw-r--r--spec/ruby/core/range/new_spec.rb45
-rw-r--r--spec/ruby/core/range/range_spec.rb7
-rw-r--r--spec/ruby/core/range/shared/begin.rb10
-rw-r--r--spec/ruby/core/range/shared/cover.rb93
-rw-r--r--spec/ruby/core/range/shared/cover_and_include.rb66
-rw-r--r--spec/ruby/core/range/shared/end.rb10
-rw-r--r--spec/ruby/core/range/shared/equal_value.rb45
-rw-r--r--spec/ruby/core/range/shared/include.rb91
-rw-r--r--spec/ruby/core/range/size_spec.rb31
-rw-r--r--spec/ruby/core/range/step_spec.rb368
-rw-r--r--spec/ruby/core/range/to_a_spec.rb22
-rw-r--r--spec/ruby/core/range/to_s_spec.rb25
-rw-r--r--spec/ruby/core/rational/abs_spec.rb5
-rw-r--r--spec/ruby/core/rational/ceil_spec.rb5
-rw-r--r--spec/ruby/core/rational/coerce_spec.rb5
-rw-r--r--spec/ruby/core/rational/comparison_spec.rb22
-rw-r--r--spec/ruby/core/rational/denominator_spec.rb5
-rw-r--r--spec/ruby/core/rational/div_spec.rb17
-rw-r--r--spec/ruby/core/rational/divide_spec.rb19
-rw-r--r--spec/ruby/core/rational/divmod_spec.rb13
-rw-r--r--spec/ruby/core/rational/equal_value_spec.rb17
-rw-r--r--spec/ruby/core/rational/exponent_spec.rb5
-rw-r--r--spec/ruby/core/rational/fdiv_spec.rb5
-rw-r--r--spec/ruby/core/rational/floor_spec.rb5
-rw-r--r--spec/ruby/core/rational/hash_spec.rb5
-rw-r--r--spec/ruby/core/rational/inspect_spec.rb5
-rw-r--r--spec/ruby/core/rational/integer_spec.rb12
-rw-r--r--spec/ruby/core/rational/magnitude_spec.rb5
-rw-r--r--spec/ruby/core/rational/marshal_dump_spec.rb11
-rw-r--r--spec/ruby/core/rational/minus_spec.rb7
-rw-r--r--spec/ruby/core/rational/modulo_spec.rb5
-rw-r--r--spec/ruby/core/rational/multiply_spec.rb19
-rw-r--r--spec/ruby/core/rational/numerator_spec.rb5
-rw-r--r--spec/ruby/core/rational/plus_spec.rb18
-rw-r--r--spec/ruby/core/rational/quo_spec.rb5
-rw-r--r--spec/ruby/core/rational/rational_spec.rb7
-rw-r--r--spec/ruby/core/rational/rationalize_spec.rb36
-rw-r--r--spec/ruby/core/rational/remainder_spec.rb5
-rw-r--r--spec/ruby/core/rational/round_spec.rb5
-rw-r--r--spec/ruby/core/rational/to_f_spec.rb5
-rw-r--r--spec/ruby/core/rational/to_i_spec.rb5
-rw-r--r--spec/ruby/core/rational/to_r_spec.rb20
-rw-r--r--spec/ruby/core/rational/to_s_spec.rb5
-rw-r--r--spec/ruby/core/rational/truncate_spec.rb5
-rw-r--r--spec/ruby/core/rational/zero_spec.rb13
-rw-r--r--spec/ruby/core/regexp/case_compare_spec.rb25
-rw-r--r--spec/ruby/core/regexp/casefold_spec.rb8
-rw-r--r--spec/ruby/core/regexp/compile_spec.rb18
-rw-r--r--spec/ruby/core/regexp/encoding_spec.rb58
-rw-r--r--spec/ruby/core/regexp/eql_spec.rb6
-rw-r--r--spec/ruby/core/regexp/equal_value_spec.rb6
-rw-r--r--spec/ruby/core/regexp/escape_spec.rb6
-rw-r--r--spec/ruby/core/regexp/fixed_encoding_spec.rb36
-rw-r--r--spec/ruby/core/regexp/hash_spec.rb20
-rw-r--r--spec/ruby/core/regexp/initialize_spec.rb15
-rw-r--r--spec/ruby/core/regexp/inspect_spec.rb44
-rw-r--r--spec/ruby/core/regexp/last_match_spec.rb14
-rw-r--r--spec/ruby/core/regexp/match_spec.rb148
-rw-r--r--spec/ruby/core/regexp/named_captures_spec.rb35
-rw-r--r--spec/ruby/core/regexp/names_spec.rb29
-rw-r--r--spec/ruby/core/regexp/new_spec.rb30
-rw-r--r--spec/ruby/core/regexp/options_spec.rb54
-rw-r--r--spec/ruby/core/regexp/quote_spec.rb6
-rw-r--r--spec/ruby/core/regexp/shared/equal_value.rb31
-rw-r--r--spec/ruby/core/regexp/shared/new_ascii.rb464
-rw-r--r--spec/ruby/core/regexp/shared/new_ascii_8bit.rb553
-rw-r--r--spec/ruby/core/regexp/shared/quote.rb31
-rw-r--r--spec/ruby/core/regexp/source_spec.rb29
-rw-r--r--spec/ruby/core/regexp/to_s_spec.rb62
-rw-r--r--spec/ruby/core/regexp/try_convert_spec.rb21
-rw-r--r--spec/ruby/core/regexp/union_spec.rb149
-rw-r--r--spec/ruby/core/signal/fixtures/trap_all.rb8
-rw-r--r--spec/ruby/core/signal/list_spec.rb68
-rw-r--r--spec/ruby/core/signal/signame_spec.rb22
-rw-r--r--spec/ruby/core/signal/trap_spec.rb203
-rw-r--r--spec/ruby/core/sizedqueue/append_spec.rb11
-rw-r--r--spec/ruby/core/sizedqueue/clear_spec.rb6
-rw-r--r--spec/ruby/core/sizedqueue/close_spec.rb6
-rw-r--r--spec/ruby/core/sizedqueue/closed_spec.rb6
-rw-r--r--spec/ruby/core/sizedqueue/deq_spec.rb6
-rw-r--r--spec/ruby/core/sizedqueue/empty_spec.rb6
-rw-r--r--spec/ruby/core/sizedqueue/enq_spec.rb11
-rw-r--r--spec/ruby/core/sizedqueue/length_spec.rb6
-rw-r--r--spec/ruby/core/sizedqueue/max_spec.rb10
-rw-r--r--spec/ruby/core/sizedqueue/new_spec.rb6
-rw-r--r--spec/ruby/core/sizedqueue/num_waiting_spec.rb6
-rw-r--r--spec/ruby/core/sizedqueue/pop_spec.rb6
-rw-r--r--spec/ruby/core/sizedqueue/push_spec.rb11
-rw-r--r--spec/ruby/core/sizedqueue/shift_spec.rb6
-rw-r--r--spec/ruby/core/sizedqueue/size_spec.rb6
-rw-r--r--spec/ruby/core/string/allocate_spec.rb19
-rw-r--r--spec/ruby/core/string/append_spec.rb8
-rw-r--r--spec/ruby/core/string/ascii_only_spec.rb85
-rw-r--r--spec/ruby/core/string/b_spec.rb24
-rw-r--r--spec/ruby/core/string/bytes_spec.rb57
-rw-r--r--spec/ruby/core/string/bytesize_spec.rb37
-rw-r--r--spec/ruby/core/string/byteslice_spec.rb29
-rw-r--r--spec/ruby/core/string/capitalize_spec.rb197
-rw-r--r--spec/ruby/core/string/case_compare_spec.rb8
-rw-r--r--spec/ruby/core/string/casecmp_spec.rb216
-rw-r--r--spec/ruby/core/string/center_spec.rb133
-rw-r--r--spec/ruby/core/string/chars_spec.rb10
-rw-r--r--spec/ruby/core/string/chomp_spec.rb387
-rw-r--r--spec/ruby/core/string/chop_spec.rb128
-rw-r--r--spec/ruby/core/string/chr_spec.rb44
-rw-r--r--spec/ruby/core/string/clear_spec.rb39
-rw-r--r--spec/ruby/core/string/clone_spec.rb57
-rw-r--r--spec/ruby/core/string/codepoints_spec.rb20
-rw-r--r--spec/ruby/core/string/comparison_spec.rb108
-rw-r--r--spec/ruby/core/string/concat_spec.rb28
-rw-r--r--spec/ruby/core/string/count_spec.rb105
-rw-r--r--spec/ruby/core/string/crypt_spec.rb73
-rw-r--r--spec/ruby/core/string/delete_prefix_spec.rb81
-rw-r--r--spec/ruby/core/string/delete_spec.rb119
-rw-r--r--spec/ruby/core/string/delete_suffix_spec.rb81
-rw-r--r--spec/ruby/core/string/downcase_spec.rb200
-rw-r--r--spec/ruby/core/string/dump_spec.rb439
-rw-r--r--spec/ruby/core/string/dup_spec.rb52
-rw-r--r--spec/ruby/core/string/each_byte_spec.rb61
-rw-r--r--spec/ruby/core/string/each_char_spec.rb7
-rw-r--r--spec/ruby/core/string/each_codepoint_spec.rb10
-rw-r--r--spec/ruby/core/string/each_grapheme_cluster_spec.rb11
-rw-r--r--spec/ruby/core/string/each_line_spec.rb9
-rw-r--r--spec/ruby/core/string/element_reference_spec.rb35
-rw-r--r--spec/ruby/core/string/element_set_spec.rb612
-rw-r--r--spec/ruby/core/string/empty_spec.rb12
-rw-r--r--spec/ruby/core/string/encode_spec.rb159
-rw-r--r--spec/ruby/core/string/encoding_spec.rb189
-rw-r--r--spec/ruby/core/string/end_with_spec.rb50
-rw-r--r--spec/ruby/core/string/eql_spec.rb21
-rw-r--r--spec/ruby/core/string/equal_value_spec.rb8
-rw-r--r--spec/ruby/core/string/fixtures/classes.rb49
-rw-r--r--spec/ruby/core/string/fixtures/freeze_magic_comment.rb3
-rw-r--r--spec/ruby/core/string/fixtures/iso-8859-9-encoding.rb9
-rw-r--r--spec/ruby/core/string/fixtures/utf-8-encoding.rb7
-rw-r--r--spec/ruby/core/string/force_encoding_spec.rb73
-rw-r--r--spec/ruby/core/string/freeze_spec.rb17
-rw-r--r--spec/ruby/core/string/getbyte_spec.rb69
-rw-r--r--spec/ruby/core/string/grapheme_clusters_spec.rb15
-rw-r--r--spec/ruby/core/string/gsub_spec.rb696
-rw-r--r--spec/ruby/core/string/hash_spec.rb9
-rw-r--r--spec/ruby/core/string/hex_spec.rb49
-rw-r--r--spec/ruby/core/string/include_spec.rb35
-rw-r--r--spec/ruby/core/string/index_spec.rb316
-rw-r--r--spec/ruby/core/string/initialize_spec.rb26
-rw-r--r--spec/ruby/core/string/insert_spec.rb84
-rw-r--r--spec/ruby/core/string/inspect_spec.rb492
-rw-r--r--spec/ruby/core/string/intern_spec.rb7
-rw-r--r--spec/ruby/core/string/length_spec.rb7
-rw-r--r--spec/ruby/core/string/lines_spec.rb22
-rw-r--r--spec/ruby/core/string/ljust_spec.rb116
-rw-r--r--spec/ruby/core/string/lstrip_spec.rb50
-rw-r--r--spec/ruby/core/string/match_spec.rb175
-rw-r--r--spec/ruby/core/string/modulo_spec.rb807
-rw-r--r--spec/ruby/core/string/multiply_spec.rb7
-rw-r--r--spec/ruby/core/string/new_spec.rb63
-rw-r--r--spec/ruby/core/string/next_spec.rb11
-rw-r--r--spec/ruby/core/string/oct_spec.rb88
-rw-r--r--spec/ruby/core/string/ord_spec.rb30
-rw-r--r--spec/ruby/core/string/partition_spec.rb38
-rw-r--r--spec/ruby/core/string/percent_spec.rb13
-rw-r--r--spec/ruby/core/string/plus_spec.rb47
-rw-r--r--spec/ruby/core/string/prepend_spec.rb64
-rw-r--r--spec/ruby/core/string/replace_spec.rb7
-rw-r--r--spec/ruby/core/string/reverse_spec.rb52
-rw-r--r--spec/ruby/core/string/rindex_spec.rb368
-rw-r--r--spec/ruby/core/string/rjust_spec.rb116
-rw-r--r--spec/ruby/core/string/rpartition_spec.rb33
-rw-r--r--spec/ruby/core/string/rstrip_spec.rb52
-rw-r--r--spec/ruby/core/string/scan_spec.rb192
-rw-r--r--spec/ruby/core/string/scrub_spec.rb101
-rw-r--r--spec/ruby/core/string/setbyte_spec.rb105
-rw-r--r--spec/ruby/core/string/shared/chars.rb80
-rw-r--r--spec/ruby/core/string/shared/codepoints.rb56
-rw-r--r--spec/ruby/core/string/shared/concat.rb160
-rw-r--r--spec/ruby/core/string/shared/each_char_without_block.rb26
-rw-r--r--spec/ruby/core/string/shared/each_codepoint_without_block.rb33
-rw-r--r--spec/ruby/core/string/shared/each_line.rb165
-rw-r--r--spec/ruby/core/string/shared/each_line_without_block.rb17
-rw-r--r--spec/ruby/core/string/shared/encode.rb247
-rw-r--r--spec/ruby/core/string/shared/eql.rb34
-rw-r--r--spec/ruby/core/string/shared/equal_value.rb29
-rw-r--r--spec/ruby/core/string/shared/grapheme_clusters.rb16
-rw-r--r--spec/ruby/core/string/shared/length.rb28
-rw-r--r--spec/ruby/core/string/shared/replace.rb75
-rw-r--r--spec/ruby/core/string/shared/slice.rb557
-rw-r--r--spec/ruby/core/string/shared/succ.rb88
-rw-r--r--spec/ruby/core/string/shared/to_a.rb9
-rw-r--r--spec/ruby/core/string/shared/to_s.rb18
-rw-r--r--spec/ruby/core/string/shared/to_sym.rb63
-rw-r--r--spec/ruby/core/string/size_spec.rb7
-rw-r--r--spec/ruby/core/string/slice_spec.rb476
-rw-r--r--spec/ruby/core/string/split_spec.rb415
-rw-r--r--spec/ruby/core/string/squeeze_spec.rb113
-rw-r--r--spec/ruby/core/string/start_with_spec.rb76
-rw-r--r--spec/ruby/core/string/string_spec.rb7
-rw-r--r--spec/ruby/core/string/strip_spec.rb60
-rw-r--r--spec/ruby/core/string/sub_spec.rb571
-rw-r--r--spec/ruby/core/string/succ_spec.rb11
-rw-r--r--spec/ruby/core/string/sum_spec.rb22
-rw-r--r--spec/ruby/core/string/swapcase_spec.rb183
-rw-r--r--spec/ruby/core/string/to_c_spec.rb99
-rw-r--r--spec/ruby/core/string/to_f_spec.rb69
-rw-r--r--spec/ruby/core/string/to_i_spec.rb337
-rw-r--r--spec/ruby/core/string/to_r_spec.rb58
-rw-r--r--spec/ruby/core/string/to_s_spec.rb7
-rw-r--r--spec/ruby/core/string/to_str_spec.rb7
-rw-r--r--spec/ruby/core/string/to_sym_spec.rb7
-rw-r--r--spec/ruby/core/string/tr_s_spec.rb136
-rw-r--r--spec/ruby/core/string/tr_spec.rb131
-rw-r--r--spec/ruby/core/string/try_convert_spec.rb50
-rw-r--r--spec/ruby/core/string/uminus_spec.rb57
-rw-r--r--spec/ruby/core/string/undump_spec.rb451
-rw-r--r--spec/ruby/core/string/unicode_normalize_spec.rb115
-rw-r--r--spec/ruby/core/string/unicode_normalized_spec.rb74
-rw-r--r--spec/ruby/core/string/unpack/a_spec.rb66
-rw-r--r--spec/ruby/core/string/unpack/at_spec.rb29
-rw-r--r--spec/ruby/core/string/unpack/b_spec.rb193
-rw-r--r--spec/ruby/core/string/unpack/c_spec.rb63
-rw-r--r--spec/ruby/core/string/unpack/comment_spec.rb25
-rw-r--r--spec/ruby/core/string/unpack/d_spec.rb28
-rw-r--r--spec/ruby/core/string/unpack/e_spec.rb14
-rw-r--r--spec/ruby/core/string/unpack/f_spec.rb28
-rw-r--r--spec/ruby/core/string/unpack/g_spec.rb14
-rw-r--r--spec/ruby/core/string/unpack/h_spec.rb127
-rw-r--r--spec/ruby/core/string/unpack/i_spec.rb152
-rw-r--r--spec/ruby/core/string/unpack/j_spec.rb272
-rw-r--r--spec/ruby/core/string/unpack/l_spec.rb265
-rw-r--r--spec/ruby/core/string/unpack/m_spec.rb173
-rw-r--r--spec/ruby/core/string/unpack/n_spec.rb18
-rw-r--r--spec/ruby/core/string/unpack/p_spec.rb52
-rw-r--r--spec/ruby/core/string/unpack/percent_spec.rb7
-rw-r--r--spec/ruby/core/string/unpack/q_spec.rb64
-rw-r--r--spec/ruby/core/string/unpack/s_spec.rb152
-rw-r--r--spec/ruby/core/string/unpack/shared/basic.rb29
-rw-r--r--spec/ruby/core/string/unpack/shared/float.rb271
-rw-r--r--spec/ruby/core/string/unpack/shared/integer.rb339
-rw-r--r--spec/ruby/core/string/unpack/shared/string.rb51
-rw-r--r--spec/ruby/core/string/unpack/shared/taint.rb81
-rw-r--r--spec/ruby/core/string/unpack/shared/unicode.rb60
-rw-r--r--spec/ruby/core/string/unpack/u_spec.rb97
-rw-r--r--spec/ruby/core/string/unpack/v_spec.rb18
-rw-r--r--spec/ruby/core/string/unpack/w_spec.rb25
-rw-r--r--spec/ruby/core/string/unpack/x_spec.rb62
-rw-r--r--spec/ruby/core/string/unpack/z_spec.rb23
-rw-r--r--spec/ruby/core/string/unpack1_spec.rb12
-rw-r--r--spec/ruby/core/string/upcase_spec.rb184
-rw-r--r--spec/ruby/core/string/uplus_spec.rb22
-rw-r--r--spec/ruby/core/string/upto_spec.rb98
-rw-r--r--spec/ruby/core/string/valid_encoding_spec.rb129
-rw-r--r--spec/ruby/core/struct/dig_spec.rb42
-rw-r--r--spec/ruby/core/struct/dup_spec.rb20
-rw-r--r--spec/ruby/core/struct/each_pair_spec.rb33
-rw-r--r--spec/ruby/core/struct/each_spec.rb27
-rw-r--r--spec/ruby/core/struct/element_reference_spec.rb52
-rw-r--r--spec/ruby/core/struct/element_set_spec.rb29
-rw-r--r--spec/ruby/core/struct/eql_spec.rb13
-rw-r--r--spec/ruby/core/struct/equal_value_spec.rb7
-rw-r--r--spec/ruby/core/struct/filter_spec.rb12
-rw-r--r--spec/ruby/core/struct/fixtures/classes.rb26
-rw-r--r--spec/ruby/core/struct/hash_spec.rb46
-rw-r--r--spec/ruby/core/struct/initialize_spec.rb43
-rw-r--r--spec/ruby/core/struct/inspect_spec.rb15
-rw-r--r--spec/ruby/core/struct/instance_variables_spec.rb16
-rw-r--r--spec/ruby/core/struct/length_spec.rb12
-rw-r--r--spec/ruby/core/struct/members_spec.rb13
-rw-r--r--spec/ruby/core/struct/new_spec.rb194
-rw-r--r--spec/ruby/core/struct/select_spec.rb10
-rw-r--r--spec/ruby/core/struct/shared/accessor.rb7
-rw-r--r--spec/ruby/core/struct/shared/equal_value.rb37
-rw-r--r--spec/ruby/core/struct/shared/inspect.rb5
-rw-r--r--spec/ruby/core/struct/shared/select.rb26
-rw-r--r--spec/ruby/core/struct/size_spec.rb11
-rw-r--r--spec/ruby/core/struct/struct_spec.rb43
-rw-r--r--spec/ruby/core/struct/to_a_spec.rb12
-rw-r--r--spec/ruby/core/struct/to_h_spec.rb23
-rw-r--r--spec/ruby/core/struct/to_s_spec.rb12
-rw-r--r--spec/ruby/core/struct/values_at_spec.rb16
-rw-r--r--spec/ruby/core/struct/values_spec.rb11
-rw-r--r--spec/ruby/core/symbol/all_symbols_spec.rb14
-rw-r--r--spec/ruby/core/symbol/capitalize_spec.rb56
-rw-r--r--spec/ruby/core/symbol/case_compare_spec.rb11
-rw-r--r--spec/ruby/core/symbol/casecmp_spec.rb146
-rw-r--r--spec/ruby/core/symbol/comparison_spec.rb51
-rw-r--r--spec/ruby/core/symbol/downcase_spec.rb33
-rw-r--r--spec/ruby/core/symbol/dup_spec.rb9
-rw-r--r--spec/ruby/core/symbol/element_reference_spec.rb6
-rw-r--r--spec/ruby/core/symbol/empty_spec.rb11
-rw-r--r--spec/ruby/core/symbol/encoding_spec.rb23
-rw-r--r--spec/ruby/core/symbol/equal_value_spec.rb14
-rw-r--r--spec/ruby/core/symbol/fixtures/classes.rb3
-rw-r--r--spec/ruby/core/symbol/id2name_spec.rb6
-rw-r--r--spec/ruby/core/symbol/inspect_spec.rb105
-rw-r--r--spec/ruby/core/symbol/intern_spec.rb11
-rw-r--r--spec/ruby/core/symbol/length_spec.rb6
-rw-r--r--spec/ruby/core/symbol/match_spec.rb70
-rw-r--r--spec/ruby/core/symbol/next_spec.rb6
-rw-r--r--spec/ruby/core/symbol/shared/id2name.rb9
-rw-r--r--spec/ruby/core/symbol/shared/length.rb23
-rw-r--r--spec/ruby/core/symbol/shared/slice.rb278
-rw-r--r--spec/ruby/core/symbol/shared/succ.rb18
-rw-r--r--spec/ruby/core/symbol/size_spec.rb6
-rw-r--r--spec/ruby/core/symbol/slice_spec.rb6
-rw-r--r--spec/ruby/core/symbol/succ_spec.rb6
-rw-r--r--spec/ruby/core/symbol/swapcase_spec.rb41
-rw-r--r--spec/ruby/core/symbol/symbol_spec.rb19
-rw-r--r--spec/ruby/core/symbol/to_proc_spec.rb41
-rw-r--r--spec/ruby/core/symbol/to_s_spec.rb6
-rw-r--r--spec/ruby/core/symbol/to_sym_spec.rb9
-rw-r--r--spec/ruby/core/symbol/upcase_spec.rb29
-rw-r--r--spec/ruby/core/systemexit/initialize_spec.rb26
-rw-r--r--spec/ruby/core/systemexit/success_spec.rb13
-rw-r--r--spec/ruby/core/thread/abort_on_exception_spec.rb106
-rw-r--r--spec/ruby/core/thread/add_trace_func_spec.rb5
-rw-r--r--spec/ruby/core/thread/alive_spec.rb58
-rw-r--r--spec/ruby/core/thread/allocate_spec.rb9
-rw-r--r--spec/ruby/core/thread/backtrace/location/absolute_path_spec.rb61
-rw-r--r--spec/ruby/core/thread/backtrace/location/base_label_spec.rb22
-rw-r--r--spec/ruby/core/thread/backtrace/location/fixtures/absolute_path.rb4
-rw-r--r--spec/ruby/core/thread/backtrace/location/fixtures/absolute_path_method_added.rb10
-rw-r--r--spec/ruby/core/thread/backtrace/location/fixtures/classes.rb17
-rw-r--r--spec/ruby/core/thread/backtrace/location/fixtures/main.rb5
-rw-r--r--spec/ruby/core/thread/backtrace/location/inspect_spec.rb13
-rw-r--r--spec/ruby/core/thread/backtrace/location/label_spec.rb20
-rw-r--r--spec/ruby/core/thread/backtrace/location/lineno_spec.rb13
-rw-r--r--spec/ruby/core/thread/backtrace/location/path_spec.rb89
-rw-r--r--spec/ruby/core/thread/backtrace/location/to_s_spec.rb13
-rw-r--r--spec/ruby/core/thread/backtrace_spec.rb35
-rw-r--r--spec/ruby/core/thread/current_spec.rb31
-rw-r--r--spec/ruby/core/thread/element_reference_spec.rb44
-rw-r--r--spec/ruby/core/thread/element_set_spec.rb51
-rw-r--r--spec/ruby/core/thread/exclusive_spec.rb42
-rw-r--r--spec/ruby/core/thread/exit_spec.rb15
-rw-r--r--spec/ruby/core/thread/fetch_spec.rb38
-rw-r--r--spec/ruby/core/thread/fixtures/classes.rb303
-rw-r--r--spec/ruby/core/thread/fork_spec.rb9
-rw-r--r--spec/ruby/core/thread/group_spec.rb5
-rw-r--r--spec/ruby/core/thread/initialize_spec.rb27
-rw-r--r--spec/ruby/core/thread/inspect_spec.rb44
-rw-r--r--spec/ruby/core/thread/join_spec.rb65
-rw-r--r--spec/ruby/core/thread/key_spec.rb53
-rw-r--r--spec/ruby/core/thread/keys_spec.rb44
-rw-r--r--spec/ruby/core/thread/kill_spec.rb25
-rw-r--r--spec/ruby/core/thread/list_spec.rb42
-rw-r--r--spec/ruby/core/thread/main_spec.rb10
-rw-r--r--spec/ruby/core/thread/name_spec.rb54
-rw-r--r--spec/ruby/core/thread/new_spec.rb56
-rw-r--r--spec/ruby/core/thread/pass_spec.rb8
-rw-r--r--spec/ruby/core/thread/priority_spec.rb72
-rw-r--r--spec/ruby/core/thread/raise_spec.rb205
-rw-r--r--spec/ruby/core/thread/report_on_exception_spec.rb120
-rw-r--r--spec/ruby/core/thread/run_spec.rb8
-rw-r--r--spec/ruby/core/thread/set_trace_func_spec.rb5
-rw-r--r--spec/ruby/core/thread/shared/exit.rb182
-rw-r--r--spec/ruby/core/thread/shared/start.rb41
-rw-r--r--spec/ruby/core/thread/shared/wakeup.rb61
-rw-r--r--spec/ruby/core/thread/start_spec.rb9
-rw-r--r--spec/ruby/core/thread/status_spec.rb60
-rw-r--r--spec/ruby/core/thread/stop_spec.rb54
-rw-r--r--spec/ruby/core/thread/terminate_spec.rb7
-rw-r--r--spec/ruby/core/thread/thread_variable_get_spec.rb25
-rw-r--r--spec/ruby/core/thread/thread_variable_set_spec.rb26
-rw-r--r--spec/ruby/core/thread/thread_variable_spec.rb21
-rw-r--r--spec/ruby/core/thread/thread_variables_spec.rb29
-rw-r--r--spec/ruby/core/thread/value_spec.rb21
-rw-r--r--spec/ruby/core/thread/wakeup_spec.rb7
-rw-r--r--spec/ruby/core/threadgroup/add_spec.rb40
-rw-r--r--spec/ruby/core/threadgroup/default_spec.rb11
-rw-r--r--spec/ruby/core/threadgroup/enclose_spec.rb25
-rw-r--r--spec/ruby/core/threadgroup/enclosed_spec.rb14
-rw-r--r--spec/ruby/core/threadgroup/fixtures/classes.rb6
-rw-r--r--spec/ruby/core/threadgroup/list_spec.rb24
-rw-r--r--spec/ruby/core/time/_dump_spec.rb55
-rw-r--r--spec/ruby/core/time/_load_spec.rb54
-rw-r--r--spec/ruby/core/time/asctime_spec.rb6
-rw-r--r--spec/ruby/core/time/at_spec.rb201
-rw-r--r--spec/ruby/core/time/comparison_spec.rb104
-rw-r--r--spec/ruby/core/time/ctime_spec.rb6
-rw-r--r--spec/ruby/core/time/day_spec.rb6
-rw-r--r--spec/ruby/core/time/dst_spec.rb6
-rw-r--r--spec/ruby/core/time/dup_spec.rb46
-rw-r--r--spec/ruby/core/time/eql_spec.rb29
-rw-r--r--spec/ruby/core/time/fixtures/classes.rb26
-rw-r--r--spec/ruby/core/time/friday_spec.rb11
-rw-r--r--spec/ruby/core/time/getgm_spec.rb6
-rw-r--r--spec/ruby/core/time/getlocal_spec.rb114
-rw-r--r--spec/ruby/core/time/getutc_spec.rb6
-rw-r--r--spec/ruby/core/time/gm_spec.rb10
-rw-r--r--spec/ruby/core/time/gmt_offset_spec.rb6
-rw-r--r--spec/ruby/core/time/gmt_spec.rb8
-rw-r--r--spec/ruby/core/time/gmtime_spec.rb6
-rw-r--r--spec/ruby/core/time/gmtoff_spec.rb6
-rw-r--r--spec/ruby/core/time/hash_spec.rb11
-rw-r--r--spec/ruby/core/time/hour_spec.rb17
-rw-r--r--spec/ruby/core/time/inspect_spec.rb6
-rw-r--r--spec/ruby/core/time/isdst_spec.rb6
-rw-r--r--spec/ruby/core/time/local_spec.rb11
-rw-r--r--spec/ruby/core/time/localtime_spec.rb140
-rw-r--r--spec/ruby/core/time/mday_spec.rb6
-rw-r--r--spec/ruby/core/time/min_spec.rb17
-rw-r--r--spec/ruby/core/time/minus_spec.rb103
-rw-r--r--spec/ruby/core/time/mktime_spec.rb11
-rw-r--r--spec/ruby/core/time/mon_spec.rb6
-rw-r--r--spec/ruby/core/time/monday_spec.rb11
-rw-r--r--spec/ruby/core/time/month_spec.rb6
-rw-r--r--spec/ruby/core/time/new_spec.rb127
-rw-r--r--spec/ruby/core/time/now_spec.rb6
-rw-r--r--spec/ruby/core/time/nsec_spec.rb31
-rw-r--r--spec/ruby/core/time/plus_spec.rb113
-rw-r--r--spec/ruby/core/time/round_spec.rb35
-rw-r--r--spec/ruby/core/time/saturday_spec.rb11
-rw-r--r--spec/ruby/core/time/sec_spec.rb7
-rw-r--r--spec/ruby/core/time/shared/asctime.rb6
-rw-r--r--spec/ruby/core/time/shared/day.rb15
-rw-r--r--spec/ruby/core/time/shared/getgm.rb9
-rw-r--r--spec/ruby/core/time/shared/gm.rb70
-rw-r--r--spec/ruby/core/time/shared/gmt_offset.rb53
-rw-r--r--spec/ruby/core/time/shared/gmtime.rb33
-rw-r--r--spec/ruby/core/time/shared/inspect.rb23
-rw-r--r--spec/ruby/core/time/shared/isdst.rb8
-rw-r--r--spec/ruby/core/time/shared/local.rb45
-rw-r--r--spec/ruby/core/time/shared/month.rb15
-rw-r--r--spec/ruby/core/time/shared/now.rb20
-rw-r--r--spec/ruby/core/time/shared/time_params.rb262
-rw-r--r--spec/ruby/core/time/shared/to_i.rb9
-rw-r--r--spec/ruby/core/time/strftime_spec.rb52
-rw-r--r--spec/ruby/core/time/subsec_spec.rb27
-rw-r--r--spec/ruby/core/time/succ_spec.rb19
-rw-r--r--spec/ruby/core/time/sunday_spec.rb11
-rw-r--r--spec/ruby/core/time/thursday_spec.rb11
-rw-r--r--spec/ruby/core/time/time_spec.rb7
-rw-r--r--spec/ruby/core/time/to_a_spec.rb12
-rw-r--r--spec/ruby/core/time/to_f_spec.rb7
-rw-r--r--spec/ruby/core/time/to_i_spec.rb6
-rw-r--r--spec/ruby/core/time/to_r_spec.rb11
-rw-r--r--spec/ruby/core/time/to_s_spec.rb6
-rw-r--r--spec/ruby/core/time/tuesday_spec.rb11
-rw-r--r--spec/ruby/core/time/tv_nsec_spec.rb5
-rw-r--r--spec/ruby/core/time/tv_sec_spec.rb6
-rw-r--r--spec/ruby/core/time/tv_usec_spec.rb5
-rw-r--r--spec/ruby/core/time/usec_spec.rb43
-rw-r--r--spec/ruby/core/time/utc_offset_spec.rb6
-rw-r--r--spec/ruby/core/time/utc_spec.rb21
-rw-r--r--spec/ruby/core/time/wday_spec.rb9
-rw-r--r--spec/ruby/core/time/wednesday_spec.rb11
-rw-r--r--spec/ruby/core/time/yday_spec.rb21
-rw-r--r--spec/ruby/core/time/year_spec.rb17
-rw-r--r--spec/ruby/core/time/zone_spec.rb90
-rw-r--r--spec/ruby/core/tracepoint/binding_spec.rb19
-rw-r--r--spec/ruby/core/tracepoint/callee_id_spec.rb19
-rw-r--r--spec/ruby/core/tracepoint/defined_class_spec.rb26
-rw-r--r--spec/ruby/core/tracepoint/disable_spec.rb73
-rw-r--r--spec/ruby/core/tracepoint/enable_spec.rb102
-rw-r--r--spec/ruby/core/tracepoint/enabled_spec.rb14
-rw-r--r--spec/ruby/core/tracepoint/event_spec.rb21
-rw-r--r--spec/ruby/core/tracepoint/fixtures/classes.rb34
-rw-r--r--spec/ruby/core/tracepoint/inspect_spec.rb8
-rw-r--r--spec/ruby/core/tracepoint/lineno_spec.rb10
-rw-r--r--spec/ruby/core/tracepoint/method_id_spec.rb13
-rw-r--r--spec/ruby/core/tracepoint/new_spec.rb68
-rw-r--r--spec/ruby/core/tracepoint/parameters_spec.rb23
-rw-r--r--spec/ruby/core/tracepoint/path_spec.rb18
-rw-r--r--spec/ruby/core/tracepoint/raised_exception_spec.rb16
-rw-r--r--spec/ruby/core/tracepoint/return_value_spec.rb13
-rw-r--r--spec/ruby/core/tracepoint/self_spec.rb10
-rw-r--r--spec/ruby/core/tracepoint/trace_spec.rb9
-rw-r--r--spec/ruby/core/true/and_spec.rb11
-rw-r--r--spec/ruby/core/true/dup_spec.rb9
-rw-r--r--spec/ruby/core/true/inspect_spec.rb7
-rw-r--r--spec/ruby/core/true/or_spec.rb11
-rw-r--r--spec/ruby/core/true/to_s_spec.rb7
-rw-r--r--spec/ruby/core/true/trueclass_spec.rb15
-rw-r--r--spec/ruby/core/true/xor_spec.rb11
-rw-r--r--spec/ruby/core/unboundmethod/arity_spec.rb207
-rw-r--r--spec/ruby/core/unboundmethod/bind_spec.rb51
-rw-r--r--spec/ruby/core/unboundmethod/clone_spec.rb12
-rw-r--r--spec/ruby/core/unboundmethod/eql_spec.rb5
-rw-r--r--spec/ruby/core/unboundmethod/equal_value_spec.rb101
-rw-r--r--spec/ruby/core/unboundmethod/fixtures/classes.rb86
-rw-r--r--spec/ruby/core/unboundmethod/hash_spec.rb17
-rw-r--r--spec/ruby/core/unboundmethod/inspect_spec.rb7
-rw-r--r--spec/ruby/core/unboundmethod/name_spec.rb15
-rw-r--r--spec/ruby/core/unboundmethod/owner_spec.rb26
-rw-r--r--spec/ruby/core/unboundmethod/parameters_spec.rb5
-rw-r--r--spec/ruby/core/unboundmethod/shared/to_s.rb25
-rw-r--r--spec/ruby/core/unboundmethod/source_location_spec.rb52
-rw-r--r--spec/ruby/core/unboundmethod/super_method_spec.rb28
-rw-r--r--spec/ruby/core/unboundmethod/to_s_spec.rb7
-rw-r--r--spec/ruby/core/warning/warn_spec.rb68
-rw-r--r--spec/ruby/default.mspec58
-rw-r--r--spec/ruby/fixtures/basicobject/method_missing.rb55
-rw-r--r--spec/ruby/fixtures/class.rb136
-rw-r--r--spec/ruby/fixtures/class_variables.rb58
-rw-r--r--spec/ruby/fixtures/code/a/load_fixture.bundle1
-rw-r--r--spec/ruby/fixtures/code/a/load_fixture.dll1
-rw-r--r--spec/ruby/fixtures/code/a/load_fixture.so1
-rw-r--r--spec/ruby/fixtures/code/b/load_fixture.rb1
-rw-r--r--spec/ruby/fixtures/code/concurrent.rb12
-rw-r--r--spec/ruby/fixtures/code/concurrent2.rb8
-rw-r--r--spec/ruby/fixtures/code/concurrent3.rb2
-rw-r--r--spec/ruby/fixtures/code/file_fixture.rb1
-rw-r--r--spec/ruby/fixtures/code/gem/load_fixture.rb1
-rw-r--r--spec/ruby/fixtures/code/line_fixture.rb5
-rw-r--r--spec/ruby/fixtures/code/load_ext_fixture.rb1
-rw-r--r--spec/ruby/fixtures/code/load_fixture1
-rw-r--r--spec/ruby/fixtures/code/load_fixture.bundle1
-rw-r--r--spec/ruby/fixtures/code/load_fixture.dll1
-rw-r--r--spec/ruby/fixtures/code/load_fixture.ext1
-rw-r--r--spec/ruby/fixtures/code/load_fixture.ext.bundle1
-rw-r--r--spec/ruby/fixtures/code/load_fixture.ext.dll1
-rw-r--r--spec/ruby/fixtures/code/load_fixture.ext.rb1
-rw-r--r--spec/ruby/fixtures/code/load_fixture.ext.so1
-rw-r--r--spec/ruby/fixtures/code/load_fixture.rb1
-rw-r--r--spec/ruby/fixtures/code/load_fixture.so1
-rw-r--r--spec/ruby/fixtures/code/load_fixture_and__FILE__.rb1
-rw-r--r--spec/ruby/fixtures/code/load_wrap_method_fixture.rb9
-rw-r--r--spec/ruby/fixtures/code/methods_fixture.rb364
-rw-r--r--spec/ruby/fixtures/code/raise_fixture.rb1
-rw-r--r--spec/ruby/fixtures/code/recursive_load_fixture.rb5
-rw-r--r--spec/ruby/fixtures/code/recursive_require_fixture.rb3
-rw-r--r--spec/ruby/fixtures/code/symlink/symlink1.rb1
-rw-r--r--spec/ruby/fixtures/code/symlink/symlink2/symlink2.rb1
-rw-r--r--spec/ruby/fixtures/code/wrap_fixture.rb3
-rw-r--r--spec/ruby/fixtures/code_loading.rb26
-rw-r--r--spec/ruby/fixtures/constants.rb288
-rw-r--r--spec/ruby/fixtures/enumerator/classes.rb15
-rw-r--r--spec/ruby/fixtures/math/common.rb3
-rw-r--r--spec/ruby/fixtures/rational.rb14
-rw-r--r--spec/ruby/fixtures/reflection.rb352
-rw-r--r--spec/ruby/language/BEGIN_spec.rb36
-rw-r--r--spec/ruby/language/README30
-rw-r--r--spec/ruby/language/alias_spec.rb246
-rw-r--r--spec/ruby/language/and_spec.rb80
-rw-r--r--spec/ruby/language/array_spec.rb162
-rw-r--r--spec/ruby/language/block_spec.rb865
-rw-r--r--spec/ruby/language/break_spec.rb365
-rw-r--r--spec/ruby/language/case_spec.rb427
-rw-r--r--spec/ruby/language/class_spec.rb328
-rw-r--r--spec/ruby/language/class_variable_spec.rb84
-rw-r--r--spec/ruby/language/constants_spec.rb715
-rw-r--r--spec/ruby/language/def_spec.rb761
-rw-r--r--spec/ruby/language/defined_spec.rb1132
-rw-r--r--spec/ruby/language/encoding_spec.rb36
-rw-r--r--spec/ruby/language/ensure_spec.rb333
-rw-r--r--spec/ruby/language/execution_spec.rb15
-rw-r--r--spec/ruby/language/file_spec.rb29
-rw-r--r--spec/ruby/language/fixtures/argv_encoding.rb1
-rw-r--r--spec/ruby/language/fixtures/array.rb32
-rw-r--r--spec/ruby/language/fixtures/begin_file.rb3
-rw-r--r--spec/ruby/language/fixtures/binary_symbol.rb4
-rw-r--r--spec/ruby/language/fixtures/block.rb57
-rw-r--r--spec/ruby/language/fixtures/break.rb291
-rw-r--r--spec/ruby/language/fixtures/break_lambda_toplevel.rb9
-rw-r--r--spec/ruby/language/fixtures/break_lambda_toplevel_block.rb23
-rw-r--r--spec/ruby/language/fixtures/break_lambda_toplevel_method.rb17
-rw-r--r--spec/ruby/language/fixtures/bytes_magic_comment.rb2
-rw-r--r--spec/ruby/language/fixtures/case_magic_comment.rb2
-rw-r--r--spec/ruby/language/fixtures/classes.rb31
-rw-r--r--spec/ruby/language/fixtures/coding_us_ascii.rb11
-rw-r--r--spec/ruby/language/fixtures/coding_utf_8.rb11
-rw-r--r--spec/ruby/language/fixtures/constant_visibility.rb98
-rw-r--r--spec/ruby/language/fixtures/constants_sclass.rb54
-rw-r--r--spec/ruby/language/fixtures/def.rb14
-rw-r--r--spec/ruby/language/fixtures/defined.rb303
-rw-r--r--spec/ruby/language/fixtures/dollar_zero.rb6
-rw-r--r--spec/ruby/language/fixtures/emacs_magic_comment.rb2
-rw-r--r--spec/ruby/language/fixtures/ensure.rb121
-rw-r--r--spec/ruby/language/fixtures/file.rb1
-rw-r--r--spec/ruby/language/fixtures/freeze_magic_comment_across_files.rb5
-rw-r--r--spec/ruby/language/fixtures/freeze_magic_comment_across_files_diff_enc.rb5
-rw-r--r--spec/ruby/language/fixtures/freeze_magic_comment_across_files_no_comment.rb5
-rw-r--r--spec/ruby/language/fixtures/freeze_magic_comment_one_literal.rb4
-rw-r--r--spec/ruby/language/fixtures/freeze_magic_comment_required.rb3
-rw-r--r--spec/ruby/language/fixtures/freeze_magic_comment_required_diff_enc.rbbin181 -> 0 bytes-rw-r--r--spec/ruby/language/fixtures/freeze_magic_comment_required_no_comment.rb1
-rw-r--r--spec/ruby/language/fixtures/freeze_magic_comment_two_literals.rb3
-rw-r--r--spec/ruby/language/fixtures/hash_strings_ascii8bit.rb7
-rw-r--r--spec/ruby/language/fixtures/hash_strings_usascii.rb7
-rw-r--r--spec/ruby/language/fixtures/hash_strings_utf8.rb7
-rw-r--r--spec/ruby/language/fixtures/magic_comment.rb2
-rw-r--r--spec/ruby/language/fixtures/match_operators.rb9
-rw-r--r--spec/ruby/language/fixtures/metaclass.rb33
-rw-r--r--spec/ruby/language/fixtures/module.rb24
-rw-r--r--spec/ruby/language/fixtures/next.rb134
-rw-r--r--spec/ruby/language/fixtures/no_magic_comment.rb1
-rw-r--r--spec/ruby/language/fixtures/precedence.rb16
-rw-r--r--spec/ruby/language/fixtures/print_magic_comment_result_at_exit.rb3
-rw-r--r--spec/ruby/language/fixtures/private.rb59
-rw-r--r--spec/ruby/language/fixtures/rescue.rb67
-rw-r--r--spec/ruby/language/fixtures/return.rb139
-rw-r--r--spec/ruby/language/fixtures/second_line_magic_comment.rb3
-rw-r--r--spec/ruby/language/fixtures/second_token_magic_comment.rb2
-rw-r--r--spec/ruby/language/fixtures/send.rb140
-rwxr-xr-xspec/ruby/language/fixtures/shebang_magic_comment.rb3
-rw-r--r--spec/ruby/language/fixtures/squiggly_heredoc.rb39
-rw-r--r--spec/ruby/language/fixtures/super.rb696
-rw-r--r--spec/ruby/language/fixtures/utf16-be-nobom.rbbin68 -> 0 bytes-rw-r--r--spec/ruby/language/fixtures/utf16-le-nobom.rbbin69 -> 0 bytes-rw-r--r--spec/ruby/language/fixtures/utf8-bom.rb2
-rw-r--r--spec/ruby/language/fixtures/utf8-nobom.rb2
-rw-r--r--spec/ruby/language/fixtures/variables.rb85
-rw-r--r--spec/ruby/language/fixtures/vim_magic_comment.rb2
-rw-r--r--spec/ruby/language/fixtures/yield.rb37
-rw-r--r--spec/ruby/language/for_spec.rb177
-rw-r--r--spec/ruby/language/hash_spec.rb154
-rw-r--r--spec/ruby/language/heredoc_spec.rb85
-rw-r--r--spec/ruby/language/if_spec.rb376
-rw-r--r--spec/ruby/language/lambda_spec.rb573
-rw-r--r--spec/ruby/language/line_spec.rb45
-rw-r--r--spec/ruby/language/loop_spec.rb67
-rw-r--r--spec/ruby/language/magic_comment_spec.rb92
-rw-r--r--spec/ruby/language/match_spec.rb74
-rw-r--r--spec/ruby/language/metaclass_spec.rb143
-rw-r--r--spec/ruby/language/method_spec.rb1322
-rw-r--r--spec/ruby/language/module_spec.rb91
-rw-r--r--spec/ruby/language/next_spec.rb410
-rw-r--r--spec/ruby/language/not_spec.rb51
-rw-r--r--spec/ruby/language/numbers_spec.rb97
-rw-r--r--spec/ruby/language/optional_assignments_spec.rb298
-rw-r--r--spec/ruby/language/or_spec.rb90
-rw-r--r--spec/ruby/language/order_spec.rb75
-rw-r--r--spec/ruby/language/precedence_spec.rb449
-rw-r--r--spec/ruby/language/predefined/data_spec.rb48
-rw-r--r--spec/ruby/language/predefined/fixtures/data1.rb4
-rw-r--r--spec/ruby/language/predefined/fixtures/data2.rb3
-rw-r--r--spec/ruby/language/predefined/fixtures/data3.rb6
-rw-r--r--spec/ruby/language/predefined/fixtures/data4.rb4
-rw-r--r--spec/ruby/language/predefined/fixtures/data5.rb5
-rw-r--r--spec/ruby/language/predefined/fixtures/data_offset.rb12
-rw-r--r--spec/ruby/language/predefined/fixtures/data_only.rb2
-rw-r--r--spec/ruby/language/predefined/fixtures/empty_data.rb3
-rw-r--r--spec/ruby/language/predefined/fixtures/print_data.rb3
-rw-r--r--spec/ruby/language/predefined/fixtures/toplevel_binding_dynamic.rb4
-rw-r--r--spec/ruby/language/predefined/fixtures/toplevel_binding_dynamic_required.rb2
-rw-r--r--spec/ruby/language/predefined/fixtures/toplevel_binding_id.rb4
-rw-r--r--spec/ruby/language/predefined/fixtures/toplevel_binding_id_required.rb1
-rw-r--r--spec/ruby/language/predefined/fixtures/toplevel_binding_required_before.rb2
-rw-r--r--spec/ruby/language/predefined/fixtures/toplevel_binding_values.rb9
-rw-r--r--spec/ruby/language/predefined/fixtures/toplevel_binding_variables.rb4
-rw-r--r--spec/ruby/language/predefined/fixtures/toplevel_binding_variables_required.rb2
-rw-r--r--spec/ruby/language/predefined/toplevel_binding_spec.rb34
-rw-r--r--spec/ruby/language/predefined_spec.rb1267
-rw-r--r--spec/ruby/language/private_spec.rb67
-rw-r--r--spec/ruby/language/proc_spec.rb220
-rw-r--r--spec/ruby/language/redo_spec.rb66
-rw-r--r--spec/ruby/language/regexp/anchors_spec.rb179
-rw-r--r--spec/ruby/language/regexp/back-references_spec.rb53
-rw-r--r--spec/ruby/language/regexp/character_classes_spec.rb633
-rw-r--r--spec/ruby/language/regexp/encoding_spec.rb103
-rw-r--r--spec/ruby/language/regexp/escapes_spec.rb81
-rw-r--r--spec/ruby/language/regexp/grouping_spec.rb23
-rw-r--r--spec/ruby/language/regexp/interpolation_spec.rb58
-rw-r--r--spec/ruby/language/regexp/modifiers_spec.rb117
-rw-r--r--spec/ruby/language/regexp/repetition_spec.rb57
-rw-r--r--spec/ruby/language/regexp_spec.rb197
-rw-r--r--spec/ruby/language/rescue_spec.rb493
-rw-r--r--spec/ruby/language/retry_spec.rb52
-rw-r--r--spec/ruby/language/return_spec.rb483
-rw-r--r--spec/ruby/language/safe_navigator_spec.rb99
-rw-r--r--spec/ruby/language/safe_spec.rb97
-rw-r--r--spec/ruby/language/send_spec.rb552
-rw-r--r--spec/ruby/language/shared/__FILE__.rb23
-rw-r--r--spec/ruby/language/shared/__LINE__.rb15
-rw-r--r--spec/ruby/language/singleton_class_spec.rb293
-rw-r--r--spec/ruby/language/source_encoding_spec.rb61
-rw-r--r--spec/ruby/language/string_spec.rb289
-rw-r--r--spec/ruby/language/super_spec.rb369
-rw-r--r--spec/ruby/language/symbol_spec.rb106
-rw-r--r--spec/ruby/language/throw_spec.rb81
-rw-r--r--spec/ruby/language/undef_spec.rb72
-rw-r--r--spec/ruby/language/unless_spec.rb43
-rw-r--r--spec/ruby/language/until_spec.rb234
-rw-r--r--spec/ruby/language/variables_spec.rb760
-rw-r--r--spec/ruby/language/while_spec.rb344
-rw-r--r--spec/ruby/language/yield_spec.rb179
-rw-r--r--spec/ruby/library/English/English_spec.rb171
-rw-r--r--spec/ruby/library/abbrev/abbrev_spec.rb31
-rw-r--r--spec/ruby/library/base64/decode64_spec.rb9
-rw-r--r--spec/ruby/library/base64/encode64_spec.rb14
-rw-r--r--spec/ruby/library/base64/urlsafe_decode64_spec.rb19
-rw-r--r--spec/ruby/library/base64/urlsafe_encode64_spec.rb20
-rw-r--r--spec/ruby/library/bigdecimal/BigDecimal_spec.rb132
-rw-r--r--spec/ruby/library/bigdecimal/abs_spec.rb50
-rw-r--r--spec/ruby/library/bigdecimal/add_spec.rb179
-rw-r--r--spec/ruby/library/bigdecimal/case_compare_spec.rb7
-rw-r--r--spec/ruby/library/bigdecimal/ceil_spec.rb104
-rw-r--r--spec/ruby/library/bigdecimal/coerce_spec.rb26
-rw-r--r--spec/ruby/library/bigdecimal/comparison_spec.rb81
-rw-r--r--spec/ruby/library/bigdecimal/div_spec.rb102
-rw-r--r--spec/ruby/library/bigdecimal/divide_spec.rb7
-rw-r--r--spec/ruby/library/bigdecimal/divmod_spec.rb180
-rw-r--r--spec/ruby/library/bigdecimal/double_fig_spec.rb9
-rw-r--r--spec/ruby/library/bigdecimal/eql_spec.rb6
-rw-r--r--spec/ruby/library/bigdecimal/equal_value_spec.rb7
-rw-r--r--spec/ruby/library/bigdecimal/exponent_spec.rb38
-rw-r--r--spec/ruby/library/bigdecimal/finite_spec.rb34
-rw-r--r--spec/ruby/library/bigdecimal/fix_spec.rb57
-rw-r--r--spec/ruby/library/bigdecimal/fixtures/classes.rb17
-rw-r--r--spec/ruby/library/bigdecimal/floor_spec.rb100
-rw-r--r--spec/ruby/library/bigdecimal/frac_spec.rb48
-rw-r--r--spec/ruby/library/bigdecimal/gt_spec.rb98
-rw-r--r--spec/ruby/library/bigdecimal/gte_spec.rb102
-rw-r--r--spec/ruby/library/bigdecimal/infinite_spec.rb32
-rw-r--r--spec/ruby/library/bigdecimal/inspect_spec.rb47
-rw-r--r--spec/ruby/library/bigdecimal/limit_spec.rb55
-rw-r--r--spec/ruby/library/bigdecimal/lt_spec.rb96
-rw-r--r--spec/ruby/library/bigdecimal/lte_spec.rb102
-rw-r--r--spec/ruby/library/bigdecimal/minus_spec.rb58
-rw-r--r--spec/ruby/library/bigdecimal/mode_spec.rb36
-rw-r--r--spec/ruby/library/bigdecimal/modulo_spec.rb12
-rw-r--r--spec/ruby/library/bigdecimal/mult_spec.rb24
-rw-r--r--spec/ruby/library/bigdecimal/multiply_spec.rb26
-rw-r--r--spec/ruby/library/bigdecimal/nan_spec.rb23
-rw-r--r--spec/ruby/library/bigdecimal/nonzero_spec.rb29
-rw-r--r--spec/ruby/library/bigdecimal/plus_spec.rb47
-rw-r--r--spec/ruby/library/bigdecimal/power_spec.rb6
-rw-r--r--spec/ruby/library/bigdecimal/precs_spec.rb48
-rw-r--r--spec/ruby/library/bigdecimal/quo_spec.rb12
-rw-r--r--spec/ruby/library/bigdecimal/remainder_spec.rb84
-rw-r--r--spec/ruby/library/bigdecimal/round_spec.rb202
-rw-r--r--spec/ruby/library/bigdecimal/shared/eql.rb61
-rw-r--r--spec/ruby/library/bigdecimal/shared/modulo.rb116
-rw-r--r--spec/ruby/library/bigdecimal/shared/mult.rb97
-rw-r--r--spec/ruby/library/bigdecimal/shared/power.rb72
-rw-r--r--spec/ruby/library/bigdecimal/shared/quo.rb59
-rw-r--r--spec/ruby/library/bigdecimal/shared/to_int.rb16
-rw-r--r--spec/ruby/library/bigdecimal/sign_spec.rb46
-rw-r--r--spec/ruby/library/bigdecimal/split_spec.rb86
-rw-r--r--spec/ruby/library/bigdecimal/sqrt_spec.rb112
-rw-r--r--spec/ruby/library/bigdecimal/sub_spec.rb53
-rw-r--r--spec/ruby/library/bigdecimal/to_f_spec.rb54
-rw-r--r--spec/ruby/library/bigdecimal/to_i_spec.rb7
-rw-r--r--spec/ruby/library/bigdecimal/to_int_spec.rb8
-rw-r--r--spec/ruby/library/bigdecimal/to_r_spec.rb16
-rw-r--r--spec/ruby/library/bigdecimal/to_s_spec.rb82
-rw-r--r--spec/ruby/library/bigdecimal/truncate_spec.rb81
-rw-r--r--spec/ruby/library/bigdecimal/uminus_spec.rb58
-rw-r--r--spec/ruby/library/bigdecimal/uplus_spec.rb17
-rw-r--r--spec/ruby/library/bigdecimal/zero_spec.rb27
-rw-r--r--spec/ruby/library/bigmath/log_spec.rb10
-rw-r--r--spec/ruby/library/cgi/cookie/domain_spec.rb23
-rw-r--r--spec/ruby/library/cgi/cookie/expires_spec.rb23
-rw-r--r--spec/ruby/library/cgi/cookie/initialize_spec.rb147
-rw-r--r--spec/ruby/library/cgi/cookie/name_spec.rb23
-rw-r--r--spec/ruby/library/cgi/cookie/parse_spec.rb39
-rw-r--r--spec/ruby/library/cgi/cookie/path_spec.rb23
-rw-r--r--spec/ruby/library/cgi/cookie/secure_spec.rb70
-rw-r--r--spec/ruby/library/cgi/cookie/to_s_spec.rb42
-rw-r--r--spec/ruby/library/cgi/cookie/value_spec.rb76
-rw-r--r--spec/ruby/library/cgi/escapeElement_spec.rb20
-rw-r--r--spec/ruby/library/cgi/escapeHTML_spec.rb13
-rw-r--r--spec/ruby/library/cgi/escape_spec.rb26
-rw-r--r--spec/ruby/library/cgi/htmlextension/a_spec.rb49
-rw-r--r--spec/ruby/library/cgi/htmlextension/base_spec.rb33
-rw-r--r--spec/ruby/library/cgi/htmlextension/blockquote_spec.rb33
-rw-r--r--spec/ruby/library/cgi/htmlextension/br_spec.rb22
-rw-r--r--spec/ruby/library/cgi/htmlextension/caption_spec.rb33
-rw-r--r--spec/ruby/library/cgi/htmlextension/checkbox_group_spec.rb76
-rw-r--r--spec/ruby/library/cgi/htmlextension/checkbox_spec.rb77
-rw-r--r--spec/ruby/library/cgi/htmlextension/doctype_spec.rb27
-rw-r--r--spec/ruby/library/cgi/htmlextension/file_field_spec.rb72
-rw-r--r--spec/ruby/library/cgi/htmlextension/fixtures/common.rb15
-rw-r--r--spec/ruby/library/cgi/htmlextension/form_spec.rb58
-rw-r--r--spec/ruby/library/cgi/htmlextension/frame_spec.rb14
-rw-r--r--spec/ruby/library/cgi/htmlextension/frameset_spec.rb14
-rw-r--r--spec/ruby/library/cgi/htmlextension/hidden_spec.rb59
-rw-r--r--spec/ruby/library/cgi/htmlextension/html_spec.rb66
-rw-r--r--spec/ruby/library/cgi/htmlextension/image_button_spec.rb69
-rw-r--r--spec/ruby/library/cgi/htmlextension/img_spec.rb83
-rw-r--r--spec/ruby/library/cgi/htmlextension/multipart_form_spec.rb64
-rw-r--r--spec/ruby/library/cgi/htmlextension/password_field_spec.rb84
-rw-r--r--spec/ruby/library/cgi/htmlextension/popup_menu_spec.rb8
-rw-r--r--spec/ruby/library/cgi/htmlextension/radio_button_spec.rb77
-rw-r--r--spec/ruby/library/cgi/htmlextension/radio_group_spec.rb77
-rw-r--r--spec/ruby/library/cgi/htmlextension/reset_spec.rb57
-rw-r--r--spec/ruby/library/cgi/htmlextension/scrolling_list_spec.rb8
-rw-r--r--spec/ruby/library/cgi/htmlextension/shared/popup_menu.rb94
-rw-r--r--spec/ruby/library/cgi/htmlextension/submit_spec.rb57
-rw-r--r--spec/ruby/library/cgi/htmlextension/text_field_spec.rb84
-rw-r--r--spec/ruby/library/cgi/htmlextension/textarea_spec.rb73
-rw-r--r--spec/ruby/library/cgi/http_header_spec.rb8
-rw-r--r--spec/ruby/library/cgi/initialize_spec.rb133
-rw-r--r--spec/ruby/library/cgi/out_spec.rb51
-rw-r--r--spec/ruby/library/cgi/parse_spec.rb24
-rw-r--r--spec/ruby/library/cgi/pretty_spec.rb24
-rw-r--r--spec/ruby/library/cgi/print_spec.rb26
-rw-r--r--spec/ruby/library/cgi/queryextension/accept_charset_spec.rb22
-rw-r--r--spec/ruby/library/cgi/queryextension/accept_encoding_spec.rb22
-rw-r--r--spec/ruby/library/cgi/queryextension/accept_language_spec.rb22
-rw-r--r--spec/ruby/library/cgi/queryextension/accept_spec.rb22
-rw-r--r--spec/ruby/library/cgi/queryextension/auth_type_spec.rb22
-rw-r--r--spec/ruby/library/cgi/queryextension/cache_control_spec.rb22
-rw-r--r--spec/ruby/library/cgi/queryextension/content_length_spec.rb26
-rw-r--r--spec/ruby/library/cgi/queryextension/content_type_spec.rb22
-rw-r--r--spec/ruby/library/cgi/queryextension/cookies_spec.rb10
-rw-r--r--spec/ruby/library/cgi/queryextension/element_reference_spec.rb27
-rw-r--r--spec/ruby/library/cgi/queryextension/from_spec.rb22
-rw-r--r--spec/ruby/library/cgi/queryextension/gateway_interface_spec.rb22
-rw-r--r--spec/ruby/library/cgi/queryextension/has_key_spec.rb7
-rw-r--r--spec/ruby/library/cgi/queryextension/host_spec.rb22
-rw-r--r--spec/ruby/library/cgi/queryextension/include_spec.rb7
-rw-r--r--spec/ruby/library/cgi/queryextension/key_spec.rb7
-rw-r--r--spec/ruby/library/cgi/queryextension/keys_spec.rb20
-rw-r--r--spec/ruby/library/cgi/queryextension/multipart_spec.rb40
-rw-r--r--spec/ruby/library/cgi/queryextension/negotiate_spec.rb22
-rw-r--r--spec/ruby/library/cgi/queryextension/params_spec.rb37
-rw-r--r--spec/ruby/library/cgi/queryextension/path_info_spec.rb22
-rw-r--r--spec/ruby/library/cgi/queryextension/path_translated_spec.rb22
-rw-r--r--spec/ruby/library/cgi/queryextension/pragma_spec.rb22
-rw-r--r--spec/ruby/library/cgi/queryextension/query_string_spec.rb22
-rw-r--r--spec/ruby/library/cgi/queryextension/raw_cookie2_spec.rb22
-rw-r--r--spec/ruby/library/cgi/queryextension/raw_cookie_spec.rb22
-rw-r--r--spec/ruby/library/cgi/queryextension/referer_spec.rb22
-rw-r--r--spec/ruby/library/cgi/queryextension/remote_addr_spec.rb22
-rw-r--r--spec/ruby/library/cgi/queryextension/remote_host_spec.rb22
-rw-r--r--spec/ruby/library/cgi/queryextension/remote_ident_spec.rb22
-rw-r--r--spec/ruby/library/cgi/queryextension/remote_user_spec.rb22
-rw-r--r--spec/ruby/library/cgi/queryextension/request_method_spec.rb22
-rw-r--r--spec/ruby/library/cgi/queryextension/script_name_spec.rb22
-rw-r--r--spec/ruby/library/cgi/queryextension/server_name_spec.rb22
-rw-r--r--spec/ruby/library/cgi/queryextension/server_port_spec.rb26
-rw-r--r--spec/ruby/library/cgi/queryextension/server_protocol_spec.rb22
-rw-r--r--spec/ruby/library/cgi/queryextension/server_software_spec.rb22
-rw-r--r--spec/ruby/library/cgi/queryextension/shared/has_key.rb19
-rw-r--r--spec/ruby/library/cgi/queryextension/user_agent_spec.rb22
-rw-r--r--spec/ruby/library/cgi/rfc1123_date_spec.rb10
-rw-r--r--spec/ruby/library/cgi/shared/http_header.rb112
-rw-r--r--spec/ruby/library/cgi/unescapeElement_spec.rb20
-rw-r--r--spec/ruby/library/cgi/unescapeHTML_spec.rb39
-rw-r--r--spec/ruby/library/cgi/unescape_spec.rb15
-rw-r--r--spec/ruby/library/complex/math/acos_spec.rb15
-rw-r--r--spec/ruby/library/complex/math/acosh_spec.rb15
-rw-r--r--spec/ruby/library/complex/math/asin_spec.rb15
-rw-r--r--spec/ruby/library/complex/math/asinh_spec.rb15
-rw-r--r--spec/ruby/library/complex/math/atan2_spec.rb15
-rw-r--r--spec/ruby/library/complex/math/atan_spec.rb15
-rw-r--r--spec/ruby/library/complex/math/atanh_spec.rb17
-rw-r--r--spec/ruby/library/complex/math/cos_spec.rb15
-rw-r--r--spec/ruby/library/complex/math/cosh_spec.rb15
-rw-r--r--spec/ruby/library/complex/math/exp_spec.rb15
-rw-r--r--spec/ruby/library/complex/math/fixtures/classes.rb4
-rw-r--r--spec/ruby/library/complex/math/log10_spec.rb15
-rw-r--r--spec/ruby/library/complex/math/log_spec.rb15
-rw-r--r--spec/ruby/library/complex/math/shared/acos.rb41
-rw-r--r--spec/ruby/library/complex/math/shared/acosh.rb37
-rw-r--r--spec/ruby/library/complex/math/shared/asin.rb47
-rw-r--r--spec/ruby/library/complex/math/shared/asinh.rb32
-rw-r--r--spec/ruby/library/complex/math/shared/atan.rb32
-rw-r--r--spec/ruby/library/complex/math/shared/atan2.rb34
-rw-r--r--spec/ruby/library/complex/math/shared/atanh.rb30
-rw-r--r--spec/ruby/library/complex/math/shared/cos.rb30
-rw-r--r--spec/ruby/library/complex/math/shared/cosh.rb28
-rw-r--r--spec/ruby/library/complex/math/shared/exp.rb28
-rw-r--r--spec/ruby/library/complex/math/shared/log.rb39
-rw-r--r--spec/ruby/library/complex/math/shared/log10.rb41
-rw-r--r--spec/ruby/library/complex/math/shared/sin.rb30
-rw-r--r--spec/ruby/library/complex/math/shared/sinh.rb28
-rw-r--r--spec/ruby/library/complex/math/shared/sqrt.rb34
-rw-r--r--spec/ruby/library/complex/math/shared/tan.rb28
-rw-r--r--spec/ruby/library/complex/math/shared/tanh.rb32
-rw-r--r--spec/ruby/library/complex/math/sin_spec.rb15
-rw-r--r--spec/ruby/library/complex/math/sinh_spec.rb15
-rw-r--r--spec/ruby/library/complex/math/sqrt_spec.rb15
-rw-r--r--spec/ruby/library/complex/math/tan_spec.rb15
-rw-r--r--spec/ruby/library/complex/math/tanh_spec.rb15
-rw-r--r--spec/ruby/library/complex/numeric/im_spec.rb3
-rw-r--r--spec/ruby/library/conditionvariable/broadcast_spec.rb67
-rw-r--r--spec/ruby/library/conditionvariable/marshal_dump_spec.rb9
-rw-r--r--spec/ruby/library/conditionvariable/signal_spec.rb69
-rw-r--r--spec/ruby/library/conditionvariable/wait_spec.rb123
-rw-r--r--spec/ruby/library/coverage/fixtures/second_class.rb5
-rw-r--r--spec/ruby/library/coverage/fixtures/some_class.rb16
-rw-r--r--spec/ruby/library/coverage/fixtures/spec_helper.rb11
-rw-r--r--spec/ruby/library/coverage/fixtures/start_coverage.rb3
-rw-r--r--spec/ruby/library/coverage/peek_result_spec.rb65
-rw-r--r--spec/ruby/library/coverage/result_spec.rb78
-rw-r--r--spec/ruby/library/coverage/start_spec.rb6
-rw-r--r--spec/ruby/library/csv/basicwriter/close_on_terminate_spec.rb6
-rw-r--r--spec/ruby/library/csv/basicwriter/initialize_spec.rb6
-rw-r--r--spec/ruby/library/csv/basicwriter/terminate_spec.rb6
-rw-r--r--spec/ruby/library/csv/cell/data_spec.rb6
-rw-r--r--spec/ruby/library/csv/cell/initialize_spec.rb6
-rw-r--r--spec/ruby/library/csv/fixtures/one_line.csv1
-rw-r--r--spec/ruby/library/csv/foreach_spec.rb6
-rw-r--r--spec/ruby/library/csv/generate_line_spec.rb30
-rw-r--r--spec/ruby/library/csv/generate_row_spec.rb6
-rw-r--r--spec/ruby/library/csv/generate_spec.rb32
-rw-r--r--spec/ruby/library/csv/iobuf/close_spec.rb6
-rw-r--r--spec/ruby/library/csv/iobuf/initialize_spec.rb6
-rw-r--r--spec/ruby/library/csv/iobuf/read_spec.rb6
-rw-r--r--spec/ruby/library/csv/iobuf/terminate_spec.rb6
-rw-r--r--spec/ruby/library/csv/ioreader/close_on_terminate_spec.rb6
-rw-r--r--spec/ruby/library/csv/ioreader/get_row_spec.rb6
-rw-r--r--spec/ruby/library/csv/ioreader/initialize_spec.rb6
-rw-r--r--spec/ruby/library/csv/ioreader/terminate_spec.rb6
-rw-r--r--spec/ruby/library/csv/liberal_parsing_spec.rb21
-rw-r--r--spec/ruby/library/csv/open_spec.rb6
-rw-r--r--spec/ruby/library/csv/parse_spec.rb95
-rw-r--r--spec/ruby/library/csv/read_spec.rb6
-rw-r--r--spec/ruby/library/csv/readlines_spec.rb37
-rw-r--r--spec/ruby/library/csv/streambuf/add_buf_spec.rb6
-rw-r--r--spec/ruby/library/csv/streambuf/buf_size_spec.rb6
-rw-r--r--spec/ruby/library/csv/streambuf/drop_spec.rb6
-rw-r--r--spec/ruby/library/csv/streambuf/element_reference_spec.rb6
-rw-r--r--spec/ruby/library/csv/streambuf/get_spec.rb6
-rw-r--r--spec/ruby/library/csv/streambuf/idx_is_eos_spec.rb6
-rw-r--r--spec/ruby/library/csv/streambuf/initialize_spec.rb6
-rw-r--r--spec/ruby/library/csv/streambuf/is_eos_spec.rb6
-rw-r--r--spec/ruby/library/csv/streambuf/read_spec.rb6
-rw-r--r--spec/ruby/library/csv/streambuf/rel_buf_spec.rb6
-rw-r--r--spec/ruby/library/csv/streambuf/terminate_spec.rb6
-rw-r--r--spec/ruby/library/csv/stringreader/get_row_spec.rb6
-rw-r--r--spec/ruby/library/csv/stringreader/initialize_spec.rb6
-rw-r--r--spec/ruby/library/csv/writer/add_row_spec.rb6
-rw-r--r--spec/ruby/library/csv/writer/append_spec.rb6
-rw-r--r--spec/ruby/library/csv/writer/close_spec.rb6
-rw-r--r--spec/ruby/library/csv/writer/create_spec.rb6
-rw-r--r--spec/ruby/library/csv/writer/generate_spec.rb6
-rw-r--r--spec/ruby/library/csv/writer/initialize_spec.rb6
-rw-r--r--spec/ruby/library/csv/writer/terminate_spec.rb6
-rw-r--r--spec/ruby/library/date/accessor_spec.rb91
-rw-r--r--spec/ruby/library/date/add_month_spec.rb38
-rw-r--r--spec/ruby/library/date/add_spec.rb30
-rw-r--r--spec/ruby/library/date/ajd_spec.rb6
-rw-r--r--spec/ruby/library/date/ajd_to_amjd_spec.rb6
-rw-r--r--spec/ruby/library/date/ajd_to_jd_spec.rb6
-rw-r--r--spec/ruby/library/date/amjd_spec.rb6
-rw-r--r--spec/ruby/library/date/amjd_to_ajd_spec.rb6
-rw-r--r--spec/ruby/library/date/append_spec.rb6
-rw-r--r--spec/ruby/library/date/asctime_spec.rb6
-rw-r--r--spec/ruby/library/date/boat_spec.rb24
-rw-r--r--spec/ruby/library/date/case_compare_spec.rb6
-rw-r--r--spec/ruby/library/date/civil_spec.rb12
-rw-r--r--spec/ruby/library/date/commercial_spec.rb17
-rw-r--r--spec/ruby/library/date/commercial_to_jd_spec.rb6
-rw-r--r--spec/ruby/library/date/comparison_spec.rb6
-rw-r--r--spec/ruby/library/date/constants_spec.rb48
-rw-r--r--spec/ruby/library/date/conversions_spec.rb43
-rw-r--r--spec/ruby/library/date/ctime_spec.rb6
-rw-r--r--spec/ruby/library/date/cwday_spec.rb6
-rw-r--r--spec/ruby/library/date/cweek_spec.rb6
-rw-r--r--spec/ruby/library/date/cwyear_spec.rb6
-rw-r--r--spec/ruby/library/date/day_fraction_spec.rb6
-rw-r--r--spec/ruby/library/date/day_fraction_to_time_spec.rb6
-rw-r--r--spec/ruby/library/date/day_spec.rb9
-rw-r--r--spec/ruby/library/date/downto_spec.rb18
-rw-r--r--spec/ruby/library/date/england_spec.rb6
-rw-r--r--spec/ruby/library/date/eql_spec.rb12
-rw-r--r--spec/ruby/library/date/format/bag/method_missing_spec.rb6
-rw-r--r--spec/ruby/library/date/format/bag/to_hash_spec.rb6
-rw-r--r--spec/ruby/library/date/friday_spec.rb12
-rw-r--r--spec/ruby/library/date/gregorian_leap_spec.rb15
-rw-r--r--spec/ruby/library/date/gregorian_spec.rb16
-rw-r--r--spec/ruby/library/date/hash_spec.rb8
-rw-r--r--spec/ruby/library/date/infinity/abs_spec.rb6
-rw-r--r--spec/ruby/library/date/infinity/coerce_spec.rb6
-rw-r--r--spec/ruby/library/date/infinity/comparison_spec.rb6
-rw-r--r--spec/ruby/library/date/infinity/d_spec.rb6
-rw-r--r--spec/ruby/library/date/infinity/finite_spec.rb6
-rw-r--r--spec/ruby/library/date/infinity/infinite_spec.rb6
-rw-r--r--spec/ruby/library/date/infinity/nan_spec.rb6
-rw-r--r--spec/ruby/library/date/infinity/uminus_spec.rb6
-rw-r--r--spec/ruby/library/date/infinity/uplus_spec.rb6
-rw-r--r--spec/ruby/library/date/infinity/zero_spec.rb6
-rw-r--r--spec/ruby/library/date/infinity_spec.rb67
-rw-r--r--spec/ruby/library/date/inspect_spec.rb6
-rw-r--r--spec/ruby/library/date/iso8601_spec.rb37
-rw-r--r--spec/ruby/library/date/italy_spec.rb6
-rw-r--r--spec/ruby/library/date/jd_spec.rb15
-rw-r--r--spec/ruby/library/date/jd_to_ajd_spec.rb6
-rw-r--r--spec/ruby/library/date/jd_to_civil_spec.rb6
-rw-r--r--spec/ruby/library/date/jd_to_commercial_spec.rb6
-rw-r--r--spec/ruby/library/date/jd_to_ld_spec.rb6
-rw-r--r--spec/ruby/library/date/jd_to_mjd_spec.rb6
-rw-r--r--spec/ruby/library/date/jd_to_ordinal_spec.rb6
-rw-r--r--spec/ruby/library/date/jd_to_wday_spec.rb6
-rw-r--r--spec/ruby/library/date/julian_leap_spec.rb15
-rw-r--r--spec/ruby/library/date/julian_spec.rb16
-rw-r--r--spec/ruby/library/date/ld_spec.rb6
-rw-r--r--spec/ruby/library/date/ld_to_jd_spec.rb6
-rw-r--r--spec/ruby/library/date/leap_spec.rb10
-rw-r--r--spec/ruby/library/date/mday_spec.rb6
-rw-r--r--spec/ruby/library/date/minus_month_spec.rb23
-rw-r--r--spec/ruby/library/date/minus_spec.rb30
-rw-r--r--spec/ruby/library/date/mjd_spec.rb6
-rw-r--r--spec/ruby/library/date/mjd_to_jd_spec.rb6
-rw-r--r--spec/ruby/library/date/mon_spec.rb6
-rw-r--r--spec/ruby/library/date/monday_spec.rb8
-rw-r--r--spec/ruby/library/date/month_spec.rb9
-rw-r--r--spec/ruby/library/date/new_spec.rb8
-rw-r--r--spec/ruby/library/date/new_start_spec.rb6
-rw-r--r--spec/ruby/library/date/next_day_spec.rb14
-rw-r--r--spec/ruby/library/date/next_month_spec.rb29
-rw-r--r--spec/ruby/library/date/next_spec.rb6
-rw-r--r--spec/ruby/library/date/next_year_spec.rb12
-rw-r--r--spec/ruby/library/date/ordinal_spec.rb7
-rw-r--r--spec/ruby/library/date/ordinal_to_jd_spec.rb6
-rw-r--r--spec/ruby/library/date/parse_spec.rb142
-rw-r--r--spec/ruby/library/date/plus_spec.rb20
-rw-r--r--spec/ruby/library/date/prev_day_spec.rb14
-rw-r--r--spec/ruby/library/date/prev_month_spec.rb29
-rw-r--r--spec/ruby/library/date/prev_year_spec.rb12
-rw-r--r--spec/ruby/library/date/relationship_spec.rb20
-rw-r--r--spec/ruby/library/date/right_shift_spec.rb6
-rw-r--r--spec/ruby/library/date/saturday_spec.rb8
-rw-r--r--spec/ruby/library/date/shared/civil.rb57
-rw-r--r--spec/ruby/library/date/shared/commercial.rb39
-rw-r--r--spec/ruby/library/date/shared/jd.rb14
-rw-r--r--spec/ruby/library/date/shared/new_bang.rb14
-rw-r--r--spec/ruby/library/date/shared/ordinal.rb22
-rw-r--r--spec/ruby/library/date/shared/parse.rb54
-rw-r--r--spec/ruby/library/date/shared/parse_eu.rb37
-rw-r--r--spec/ruby/library/date/shared/parse_us.rb36
-rw-r--r--spec/ruby/library/date/shared/valid_civil.rb36
-rw-r--r--spec/ruby/library/date/shared/valid_commercial.rb34
-rw-r--r--spec/ruby/library/date/shared/valid_jd.rb15
-rw-r--r--spec/ruby/library/date/shared/valid_ordinal.rb26
-rw-r--r--spec/ruby/library/date/start_spec.rb6
-rw-r--r--spec/ruby/library/date/step_spec.rb56
-rw-r--r--spec/ruby/library/date/strftime_spec.rb40
-rw-r--r--spec/ruby/library/date/strptime_spec.rb149
-rw-r--r--spec/ruby/library/date/succ_spec.rb6
-rw-r--r--spec/ruby/library/date/sunday_spec.rb8
-rw-r--r--spec/ruby/library/date/thursday_spec.rb8
-rw-r--r--spec/ruby/library/date/time_to_day_fraction_spec.rb6
-rw-r--r--spec/ruby/library/date/to_s_spec.rb6
-rw-r--r--spec/ruby/library/date/today_spec.rb14
-rw-r--r--spec/ruby/library/date/tuesday_spec.rb8
-rw-r--r--spec/ruby/library/date/upto_spec.rb16
-rw-r--r--spec/ruby/library/date/valid_civil_spec.rb9
-rw-r--r--spec/ruby/library/date/valid_commercial_spec.rb8
-rw-r--r--spec/ruby/library/date/valid_date_spec.rb7
-rw-r--r--spec/ruby/library/date/valid_jd_spec.rb9
-rw-r--r--spec/ruby/library/date/valid_ordinal_spec.rb9
-rw-r--r--spec/ruby/library/date/valid_time_spec.rb6
-rw-r--r--spec/ruby/library/date/wday_spec.rb9
-rw-r--r--spec/ruby/library/date/wednesday_spec.rb8
-rw-r--r--spec/ruby/library/date/yday_spec.rb6
-rw-r--r--spec/ruby/library/date/year_spec.rb9
-rw-r--r--spec/ruby/library/date/zone_to_diff_spec.rb6
-rw-r--r--spec/ruby/library/datetime/_strptime_spec.rb6
-rw-r--r--spec/ruby/library/datetime/add_spec.rb9
-rw-r--r--spec/ruby/library/datetime/civil_spec.rb6
-rw-r--r--spec/ruby/library/datetime/commercial_spec.rb6
-rw-r--r--spec/ruby/library/datetime/hour_spec.rb47
-rw-r--r--spec/ruby/library/datetime/httpdate_spec.rb6
-rw-r--r--spec/ruby/library/datetime/iso8601_spec.rb10
-rw-r--r--spec/ruby/library/datetime/jd_spec.rb6
-rw-r--r--spec/ruby/library/datetime/jisx0301_spec.rb10
-rw-r--r--spec/ruby/library/datetime/min_spec.rb6
-rw-r--r--spec/ruby/library/datetime/minute_spec.rb6
-rw-r--r--spec/ruby/library/datetime/new_offset_spec.rb6
-rw-r--r--spec/ruby/library/datetime/new_spec.rb52
-rw-r--r--spec/ruby/library/datetime/now_spec.rb25
-rw-r--r--spec/ruby/library/datetime/offset_spec.rb6
-rw-r--r--spec/ruby/library/datetime/ordinal_spec.rb6
-rw-r--r--spec/ruby/library/datetime/parse_spec.rb127
-rw-r--r--spec/ruby/library/datetime/rfc2822_spec.rb6
-rw-r--r--spec/ruby/library/datetime/rfc3339_spec.rb10
-rw-r--r--spec/ruby/library/datetime/rfc822_spec.rb6
-rw-r--r--spec/ruby/library/datetime/sec_fraction_spec.rb6
-rw-r--r--spec/ruby/library/datetime/sec_spec.rb6
-rw-r--r--spec/ruby/library/datetime/second_fraction_spec.rb6
-rw-r--r--spec/ruby/library/datetime/second_spec.rb6
-rw-r--r--spec/ruby/library/datetime/shared/min.rb40
-rw-r--r--spec/ruby/library/datetime/shared/sec.rb45
-rw-r--r--spec/ruby/library/datetime/strftime_spec.rb51
-rw-r--r--spec/ruby/library/datetime/strptime_spec.rb6
-rw-r--r--spec/ruby/library/datetime/subtract_spec.rb9
-rw-r--r--spec/ruby/library/datetime/to_date_spec.rb37
-rw-r--r--spec/ruby/library/datetime/to_datetime_spec.rb9
-rw-r--r--spec/ruby/library/datetime/to_s_spec.rb17
-rw-r--r--spec/ruby/library/datetime/to_time_spec.rb38
-rw-r--r--spec/ruby/library/datetime/xmlschema_spec.rb10
-rw-r--r--spec/ruby/library/datetime/zone_spec.rb6
-rw-r--r--spec/ruby/library/delegate/delegate_class/instance_method_spec.rb52
-rw-r--r--spec/ruby/library/delegate/delegate_class/instance_methods_spec.rb26
-rw-r--r--spec/ruby/library/delegate/delegate_class/private_instance_methods_spec.rb23
-rw-r--r--spec/ruby/library/delegate/delegate_class/protected_instance_methods_spec.rb29
-rw-r--r--spec/ruby/library/delegate/delegate_class/public_instance_methods_spec.rb25
-rw-r--r--spec/ruby/library/delegate/delegate_class/respond_to_missing_spec.rb23
-rw-r--r--spec/ruby/library/delegate/delegator/case_compare_spec.rb11
-rw-r--r--spec/ruby/library/delegate/delegator/compare_spec.rb11
-rw-r--r--spec/ruby/library/delegate/delegator/complement_spec.rb11
-rw-r--r--spec/ruby/library/delegate/delegator/eql_spec.rb46
-rw-r--r--spec/ruby/library/delegate/delegator/equal_spec.rb13
-rw-r--r--spec/ruby/library/delegate/delegator/equal_value_spec.rb24
-rw-r--r--spec/ruby/library/delegate/delegator/frozen_spec.rb39
-rw-r--r--spec/ruby/library/delegate/delegator/hash_spec.rb11
-rw-r--r--spec/ruby/library/delegate/delegator/marshal_spec.rb21
-rw-r--r--spec/ruby/library/delegate/delegator/method_spec.rb69
-rw-r--r--spec/ruby/library/delegate/delegator/methods_spec.rb37
-rw-r--r--spec/ruby/library/delegate/delegator/not_equal_spec.rb24
-rw-r--r--spec/ruby/library/delegate/delegator/not_spec.rb11
-rw-r--r--spec/ruby/library/delegate/delegator/private_methods_spec.rb20
-rw-r--r--spec/ruby/library/delegate/delegator/protected_methods_spec.rb18
-rw-r--r--spec/ruby/library/delegate/delegator/public_methods_spec.rb18
-rw-r--r--spec/ruby/library/delegate/delegator/send_spec.rb26
-rw-r--r--spec/ruby/library/delegate/delegator/taint_spec.rb23
-rw-r--r--spec/ruby/library/delegate/delegator/tap_spec.rb16
-rw-r--r--spec/ruby/library/delegate/delegator/trust_spec.rb22
-rw-r--r--spec/ruby/library/delegate/delegator/untaint_spec.rb24
-rw-r--r--spec/ruby/library/delegate/delegator/untrust_spec.rb23
-rw-r--r--spec/ruby/library/delegate/fixtures/classes.rb60
-rw-r--r--spec/ruby/library/digest/bubblebabble_spec.rb29
-rw-r--r--spec/ruby/library/digest/hexencode_spec.rb31
-rw-r--r--spec/ruby/library/digest/md5/append_spec.rb7
-rw-r--r--spec/ruby/library/digest/md5/block_length_spec.rb11
-rw-r--r--spec/ruby/library/digest/md5/digest_bang_spec.rb13
-rw-r--r--spec/ruby/library/digest/md5/digest_length_spec.rb11
-rw-r--r--spec/ruby/library/digest/md5/digest_spec.rb32
-rw-r--r--spec/ruby/library/digest/md5/equal_spec.rb37
-rw-r--r--spec/ruby/library/digest/md5/file_spec.rb43
-rw-r--r--spec/ruby/library/digest/md5/hexdigest_bang_spec.rb14
-rw-r--r--spec/ruby/library/digest/md5/hexdigest_spec.rb32
-rw-r--r--spec/ruby/library/digest/md5/inspect_spec.rb11
-rw-r--r--spec/ruby/library/digest/md5/length_spec.rb7
-rw-r--r--spec/ruby/library/digest/md5/reset_spec.rb14
-rw-r--r--spec/ruby/library/digest/md5/shared/constants.rb16
-rw-r--r--spec/ruby/library/digest/md5/shared/length.rb8
-rw-r--r--spec/ruby/library/digest/md5/shared/sample.rb17
-rw-r--r--spec/ruby/library/digest/md5/shared/update.rb7
-rw-r--r--spec/ruby/library/digest/md5/size_spec.rb7
-rw-r--r--spec/ruby/library/digest/md5/to_s_spec.rb24
-rw-r--r--spec/ruby/library/digest/md5/update_spec.rb7
-rw-r--r--spec/ruby/library/digest/sha1/digest_spec.rb20
-rw-r--r--spec/ruby/library/digest/sha1/file_spec.rb43
-rw-r--r--spec/ruby/library/digest/sha1/shared/constants.rb17
-rw-r--r--spec/ruby/library/digest/sha256/append_spec.rb7
-rw-r--r--spec/ruby/library/digest/sha256/block_length_spec.rb11
-rw-r--r--spec/ruby/library/digest/sha256/digest_bang_spec.rb13
-rw-r--r--spec/ruby/library/digest/sha256/digest_length_spec.rb11
-rw-r--r--spec/ruby/library/digest/sha256/digest_spec.rb32
-rw-r--r--spec/ruby/library/digest/sha256/equal_spec.rb36
-rw-r--r--spec/ruby/library/digest/sha256/file_spec.rb43
-rw-r--r--spec/ruby/library/digest/sha256/hexdigest_bang_spec.rb14
-rw-r--r--spec/ruby/library/digest/sha256/hexdigest_spec.rb32
-rw-r--r--spec/ruby/library/digest/sha256/inspect_spec.rb11
-rw-r--r--spec/ruby/library/digest/sha256/length_spec.rb7
-rw-r--r--spec/ruby/library/digest/sha256/reset_spec.rb14
-rw-r--r--spec/ruby/library/digest/sha256/shared/constants.rb17
-rw-r--r--spec/ruby/library/digest/sha256/shared/length.rb8
-rw-r--r--spec/ruby/library/digest/sha256/shared/update.rb7
-rw-r--r--spec/ruby/library/digest/sha256/size_spec.rb7
-rw-r--r--spec/ruby/library/digest/sha256/to_s_spec.rb21
-rw-r--r--spec/ruby/library/digest/sha256/update_spec.rb7
-rw-r--r--spec/ruby/library/digest/sha384/append_spec.rb7
-rw-r--r--spec/ruby/library/digest/sha384/block_length_spec.rb11
-rw-r--r--spec/ruby/library/digest/sha384/digest_bang_spec.rb13
-rw-r--r--spec/ruby/library/digest/sha384/digest_length_spec.rb11
-rw-r--r--spec/ruby/library/digest/sha384/digest_spec.rb32
-rw-r--r--spec/ruby/library/digest/sha384/equal_spec.rb36
-rw-r--r--spec/ruby/library/digest/sha384/file_spec.rb43
-rw-r--r--spec/ruby/library/digest/sha384/hexdigest_bang_spec.rb14
-rw-r--r--spec/ruby/library/digest/sha384/hexdigest_spec.rb32
-rw-r--r--spec/ruby/library/digest/sha384/inspect_spec.rb11
-rw-r--r--spec/ruby/library/digest/sha384/length_spec.rb7
-rw-r--r--spec/ruby/library/digest/sha384/reset_spec.rb14
-rw-r--r--spec/ruby/library/digest/sha384/shared/constants.rb18
-rw-r--r--spec/ruby/library/digest/sha384/shared/length.rb8
-rw-r--r--spec/ruby/library/digest/sha384/shared/update.rb7
-rw-r--r--spec/ruby/library/digest/sha384/size_spec.rb7
-rw-r--r--spec/ruby/library/digest/sha384/to_s_spec.rb21
-rw-r--r--spec/ruby/library/digest/sha384/update_spec.rb7
-rw-r--r--spec/ruby/library/digest/sha512/append_spec.rb7
-rw-r--r--spec/ruby/library/digest/sha512/block_length_spec.rb11
-rw-r--r--spec/ruby/library/digest/sha512/digest_bang_spec.rb13
-rw-r--r--spec/ruby/library/digest/sha512/digest_length_spec.rb11
-rw-r--r--spec/ruby/library/digest/sha512/digest_spec.rb32
-rw-r--r--spec/ruby/library/digest/sha512/equal_spec.rb36
-rw-r--r--spec/ruby/library/digest/sha512/file_spec.rb43
-rw-r--r--spec/ruby/library/digest/sha512/hexdigest_bang_spec.rb14
-rw-r--r--spec/ruby/library/digest/sha512/hexdigest_spec.rb32
-rw-r--r--spec/ruby/library/digest/sha512/inspect_spec.rb11
-rw-r--r--spec/ruby/library/digest/sha512/length_spec.rb7
-rw-r--r--spec/ruby/library/digest/sha512/reset_spec.rb14
-rw-r--r--spec/ruby/library/digest/sha512/shared/constants.rb17
-rw-r--r--spec/ruby/library/digest/sha512/shared/length.rb8
-rw-r--r--spec/ruby/library/digest/sha512/shared/update.rb7
-rw-r--r--spec/ruby/library/digest/sha512/size_spec.rb7
-rw-r--r--spec/ruby/library/digest/sha512/to_s_spec.rb21
-rw-r--r--spec/ruby/library/digest/sha512/update_spec.rb7
-rw-r--r--spec/ruby/library/drb/fixtures/test_server.rb8
-rw-r--r--spec/ruby/library/drb/start_service_spec.rb28
-rw-r--r--spec/ruby/library/erb/def_class_spec.rb29
-rw-r--r--spec/ruby/library/erb/def_method_spec.rb26
-rw-r--r--spec/ruby/library/erb/def_module_spec.rb27
-rw-r--r--spec/ruby/library/erb/defmethod/def_erb_method_spec.rb64
-rw-r--r--spec/ruby/library/erb/filename_spec.rb40
-rw-r--r--spec/ruby/library/erb/fixtures/classes.rb9
-rw-r--r--spec/ruby/library/erb/new_spec.rb148
-rw-r--r--spec/ruby/library/erb/result_spec.rb86
-rw-r--r--spec/ruby/library/erb/run_spec.rb96
-rw-r--r--spec/ruby/library/erb/src_spec.rb33
-rw-r--r--spec/ruby/library/erb/util/h_spec.rb7
-rw-r--r--spec/ruby/library/erb/util/html_escape_spec.rb7
-rw-r--r--spec/ruby/library/erb/util/shared/html_escape.rb42
-rw-r--r--spec/ruby/library/erb/util/shared/url_encode.rb50
-rw-r--r--spec/ruby/library/erb/util/u_spec.rb7
-rw-r--r--spec/ruby/library/erb/util/url_encode_spec.rb7
-rw-r--r--spec/ruby/library/etc/confstr_spec.rb14
-rw-r--r--spec/ruby/library/etc/endgrent_spec.rb7
-rw-r--r--spec/ruby/library/etc/endpwent_spec.rb7
-rw-r--r--spec/ruby/library/etc/getgrent_spec.rb7
-rw-r--r--spec/ruby/library/etc/getgrgid_spec.rb76
-rw-r--r--spec/ruby/library/etc/getgrnam_spec.rb30
-rw-r--r--spec/ruby/library/etc/getlogin_spec.rb43
-rw-r--r--spec/ruby/library/etc/getpwent_spec.rb7
-rw-r--r--spec/ruby/library/etc/getpwnam_spec.rb28
-rw-r--r--spec/ruby/library/etc/getpwuid_spec.rb36
-rw-r--r--spec/ruby/library/etc/group_spec.rb27
-rw-r--r--spec/ruby/library/etc/nprocessors_spec.rb9
-rw-r--r--spec/ruby/library/etc/passwd_spec.rb15
-rw-r--r--spec/ruby/library/etc/shared/windows.rb7
-rw-r--r--spec/ruby/library/etc/struct_group_spec.rb35
-rw-r--r--spec/ruby/library/etc/struct_passwd_spec.rb43
-rw-r--r--spec/ruby/library/etc/sysconf_spec.rb22
-rw-r--r--spec/ruby/library/etc/sysconfdir_spec.rb8
-rw-r--r--spec/ruby/library/etc/systmpdir_spec.rb8
-rw-r--r--spec/ruby/library/expect/expect_spec.rb62
-rw-r--r--spec/ruby/library/fiber/alive_spec.rb48
-rw-r--r--spec/ruby/library/fiber/current_spec.rb53
-rw-r--r--spec/ruby/library/fiber/resume_spec.rb14
-rw-r--r--spec/ruby/library/fiber/transfer_spec.rb88
-rw-r--r--spec/ruby/library/find/find_spec.rb30
-rw-r--r--spec/ruby/library/find/fixtures/common.rb174
-rw-r--r--spec/ruby/library/find/prune_spec.rb12
-rw-r--r--spec/ruby/library/getoptlong/each_option_spec.rb7
-rw-r--r--spec/ruby/library/getoptlong/each_spec.rb7
-rw-r--r--spec/ruby/library/getoptlong/error_message_spec.rb23
-rw-r--r--spec/ruby/library/getoptlong/get_option_spec.rb7
-rw-r--r--spec/ruby/library/getoptlong/get_spec.rb7
-rw-r--r--spec/ruby/library/getoptlong/initialize_spec.rb28
-rw-r--r--spec/ruby/library/getoptlong/ordering_spec.rb38
-rw-r--r--spec/ruby/library/getoptlong/set_options_spec.rb98
-rw-r--r--spec/ruby/library/getoptlong/shared/each.rb18
-rw-r--r--spec/ruby/library/getoptlong/shared/get.rb64
-rw-r--r--spec/ruby/library/getoptlong/terminate_spec.rb30
-rw-r--r--spec/ruby/library/getoptlong/terminated_spec.rb17
-rw-r--r--spec/ruby/library/ipaddr/hton_spec.rb30
-rw-r--r--spec/ruby/library/ipaddr/ipv4_conversion_spec.rb44
-rw-r--r--spec/ruby/library/ipaddr/new_spec.rb93
-rw-r--r--spec/ruby/library/ipaddr/operator_spec.rb87
-rw-r--r--spec/ruby/library/ipaddr/reverse_spec.rb27
-rw-r--r--spec/ruby/library/ipaddr/to_s_spec.rb20
-rw-r--r--spec/ruby/library/logger/device/close_spec.rb22
-rw-r--r--spec/ruby/library/logger/device/new_spec.rb47
-rw-r--r--spec/ruby/library/logger/device/write_spec.rb42
-rw-r--r--spec/ruby/library/logger/fixtures/common.rb9
-rw-r--r--spec/ruby/library/logger/logger/add_spec.rb81
-rw-r--r--spec/ruby/library/logger/logger/close_spec.rb20
-rw-r--r--spec/ruby/library/logger/logger/datetime_format_spec.rb60
-rw-r--r--spec/ruby/library/logger/logger/debug_spec.rb52
-rw-r--r--spec/ruby/library/logger/logger/error_spec.rb53
-rw-r--r--spec/ruby/library/logger/logger/fatal_spec.rb53
-rw-r--r--spec/ruby/library/logger/logger/info_spec.rb53
-rw-r--r--spec/ruby/library/logger/logger/new_spec.rb120
-rw-r--r--spec/ruby/library/logger/logger/unknown_spec.rb36
-rw-r--r--spec/ruby/library/logger/logger/warn_spec.rb53
-rw-r--r--spec/ruby/library/logger/severity_spec.rb13
-rw-r--r--spec/ruby/library/mathn/bignum/exponent_spec.rb21
-rw-r--r--spec/ruby/library/mathn/complex/Complex_spec.rb14
-rw-r--r--spec/ruby/library/mathn/fixnum/exponent_spec.rb17
-rw-r--r--spec/ruby/library/mathn/float/exponent_spec.rb17
-rw-r--r--spec/ruby/library/mathn/integer/from_prime_division_spec.rb11
-rw-r--r--spec/ruby/library/mathn/integer/prime_division_spec.rb21
-rw-r--r--spec/ruby/library/mathn/math/fixtures/classes.rb3
-rw-r--r--spec/ruby/library/mathn/math/rsqrt_spec.rb17
-rw-r--r--spec/ruby/library/mathn/math/shared/rsqrt.rb21
-rw-r--r--spec/ruby/library/mathn/math/shared/sqrt.rb25
-rw-r--r--spec/ruby/library/mathn/math/sqrt_spec.rb17
-rw-r--r--spec/ruby/library/mathn/mathn_spec.rb9
-rw-r--r--spec/ruby/library/mathn/rational/Rational_spec.rb14
-rw-r--r--spec/ruby/library/mathn/rational/inspect_spec.rb15
-rw-r--r--spec/ruby/library/matrix/I_spec.rb6
-rw-r--r--spec/ruby/library/matrix/antisymmetric_spec.rb37
-rw-r--r--spec/ruby/library/matrix/build_spec.rb73
-rw-r--r--spec/ruby/library/matrix/clone_spec.rb25
-rw-r--r--spec/ruby/library/matrix/coerce_spec.rb10
-rw-r--r--spec/ruby/library/matrix/collect_spec.rb6
-rw-r--r--spec/ruby/library/matrix/column_size_spec.rb13
-rw-r--r--spec/ruby/library/matrix/column_spec.rb35
-rw-r--r--spec/ruby/library/matrix/column_vector_spec.rb25
-rw-r--r--spec/ruby/library/matrix/column_vectors_spec.rb26
-rw-r--r--spec/ruby/library/matrix/columns_spec.rb42
-rw-r--r--spec/ruby/library/matrix/conj_spec.rb6
-rw-r--r--spec/ruby/library/matrix/conjugate_spec.rb6
-rw-r--r--spec/ruby/library/matrix/constructor_spec.rb65
-rw-r--r--spec/ruby/library/matrix/det_spec.rb7
-rw-r--r--spec/ruby/library/matrix/determinant_spec.rb7
-rw-r--r--spec/ruby/library/matrix/diagonal_spec.rb72
-rw-r--r--spec/ruby/library/matrix/divide_spec.rb54
-rw-r--r--spec/ruby/library/matrix/each_spec.rb74
-rw-r--r--spec/ruby/library/matrix/each_with_index_spec.rb81
-rw-r--r--spec/ruby/library/matrix/eigenvalue_decomposition/eigenvalue_matrix_spec.rb9
-rw-r--r--spec/ruby/library/matrix/eigenvalue_decomposition/eigenvalues_spec.rb22
-rw-r--r--spec/ruby/library/matrix/eigenvalue_decomposition/eigenvector_matrix_spec.rb20
-rw-r--r--spec/ruby/library/matrix/eigenvalue_decomposition/eigenvectors_spec.rb22
-rw-r--r--spec/ruby/library/matrix/eigenvalue_decomposition/initialize_spec.rb24
-rw-r--r--spec/ruby/library/matrix/eigenvalue_decomposition/to_a_spec.rb18
-rw-r--r--spec/ruby/library/matrix/element_reference_spec.rb23
-rw-r--r--spec/ruby/library/matrix/empty_spec.rb68
-rw-r--r--spec/ruby/library/matrix/eql_spec.rb11
-rw-r--r--spec/ruby/library/matrix/equal_value_spec.rb11
-rw-r--r--spec/ruby/library/matrix/exponent_spec.rb51
-rw-r--r--spec/ruby/library/matrix/find_index_spec.rb146
-rw-r--r--spec/ruby/library/matrix/fixtures/classes.rb7
-rw-r--r--spec/ruby/library/matrix/hash_spec.rb15
-rw-r--r--spec/ruby/library/matrix/hermitian_spec.rb34
-rw-r--r--spec/ruby/library/matrix/identity_spec.rb6
-rw-r--r--spec/ruby/library/matrix/imag_spec.rb6
-rw-r--r--spec/ruby/library/matrix/imaginary_spec.rb6
-rw-r--r--spec/ruby/library/matrix/inspect_spec.rb27
-rw-r--r--spec/ruby/library/matrix/inv_spec.rb7
-rw-r--r--spec/ruby/library/matrix/inverse_from_spec.rb6
-rw-r--r--spec/ruby/library/matrix/inverse_spec.rb7
-rw-r--r--spec/ruby/library/matrix/lower_triangular_spec.rb24
-rw-r--r--spec/ruby/library/matrix/lup_decomposition/determinant_spec.rb21
-rw-r--r--spec/ruby/library/matrix/lup_decomposition/initialize_spec.rb13
-rw-r--r--spec/ruby/library/matrix/lup_decomposition/l_spec.rb18
-rw-r--r--spec/ruby/library/matrix/lup_decomposition/p_spec.rb18
-rw-r--r--spec/ruby/library/matrix/lup_decomposition/solve_spec.rb53
-rw-r--r--spec/ruby/library/matrix/lup_decomposition/to_a_spec.rb33
-rw-r--r--spec/ruby/library/matrix/lup_decomposition/u_spec.rb18
-rw-r--r--spec/ruby/library/matrix/map_spec.rb6
-rw-r--r--spec/ruby/library/matrix/minor_spec.rb85
-rw-r--r--spec/ruby/library/matrix/minus_spec.rb42
-rw-r--r--spec/ruby/library/matrix/multiply_spec.rb68
-rw-r--r--spec/ruby/library/matrix/new_spec.rb8
-rw-r--r--spec/ruby/library/matrix/normal_spec.rb26
-rw-r--r--spec/ruby/library/matrix/orthogonal_spec.rb26
-rw-r--r--spec/ruby/library/matrix/permutation_spec.rb32
-rw-r--r--spec/ruby/library/matrix/plus_spec.rb42
-rw-r--r--spec/ruby/library/matrix/rank_spec.rb19
-rw-r--r--spec/ruby/library/matrix/real_spec.rb43
-rw-r--r--spec/ruby/library/matrix/rect_spec.rb6
-rw-r--r--spec/ruby/library/matrix/rectangular_spec.rb6
-rw-r--r--spec/ruby/library/matrix/regular_spec.rb31
-rw-r--r--spec/ruby/library/matrix/round_spec.rb21
-rw-r--r--spec/ruby/library/matrix/row_size_spec.rb13
-rw-r--r--spec/ruby/library/matrix/row_spec.rb36
-rw-r--r--spec/ruby/library/matrix/row_vector_spec.rb24
-rw-r--r--spec/ruby/library/matrix/row_vectors_spec.rb26
-rw-r--r--spec/ruby/library/matrix/rows_spec.rb41
-rw-r--r--spec/ruby/library/matrix/scalar/Fail_spec.rb6
-rw-r--r--spec/ruby/library/matrix/scalar/Raise_spec.rb6
-rw-r--r--spec/ruby/library/matrix/scalar/divide_spec.rb6
-rw-r--r--spec/ruby/library/matrix/scalar/exponent_spec.rb6
-rw-r--r--spec/ruby/library/matrix/scalar/included_spec.rb6
-rw-r--r--spec/ruby/library/matrix/scalar/initialize_spec.rb6
-rw-r--r--spec/ruby/library/matrix/scalar/minus_spec.rb6
-rw-r--r--spec/ruby/library/matrix/scalar/multiply_spec.rb6
-rw-r--r--spec/ruby/library/matrix/scalar/plus_spec.rb6
-rw-r--r--spec/ruby/library/matrix/scalar_spec.rb67
-rw-r--r--spec/ruby/library/matrix/shared/collect.rb26
-rw-r--r--spec/ruby/library/matrix/shared/conjugate.rb20
-rw-r--r--spec/ruby/library/matrix/shared/determinant.rb38
-rw-r--r--spec/ruby/library/matrix/shared/equal_value.rb33
-rw-r--r--spec/ruby/library/matrix/shared/identity.rb19
-rw-r--r--spec/ruby/library/matrix/shared/imaginary.rb20
-rw-r--r--spec/ruby/library/matrix/shared/inverse.rb38
-rw-r--r--spec/ruby/library/matrix/shared/rectangular.rb18
-rw-r--r--spec/ruby/library/matrix/shared/trace.rb12
-rw-r--r--spec/ruby/library/matrix/shared/transpose.rb19
-rw-r--r--spec/ruby/library/matrix/singular_spec.rb31
-rw-r--r--spec/ruby/library/matrix/spec_helper.rb35
-rw-r--r--spec/ruby/library/matrix/square_spec.rb28
-rw-r--r--spec/ruby/library/matrix/symmetric_spec.rb29
-rw-r--r--spec/ruby/library/matrix/t_spec.rb6
-rw-r--r--spec/ruby/library/matrix/to_a_spec.rb11
-rw-r--r--spec/ruby/library/matrix/to_s_spec.rb6
-rw-r--r--spec/ruby/library/matrix/tr_spec.rb7
-rw-r--r--spec/ruby/library/matrix/trace_spec.rb7
-rw-r--r--spec/ruby/library/matrix/transpose_spec.rb6
-rw-r--r--spec/ruby/library/matrix/unit_spec.rb6
-rw-r--r--spec/ruby/library/matrix/unitary_spec.rb28
-rw-r--r--spec/ruby/library/matrix/upper_triangular_spec.rb24
-rw-r--r--spec/ruby/library/matrix/vector/cross_product_spec.rb14
-rw-r--r--spec/ruby/library/matrix/vector/each2_spec.rb49
-rw-r--r--spec/ruby/library/matrix/vector/eql_spec.rb16
-rw-r--r--spec/ruby/library/matrix/vector/inner_product_spec.rb22
-rw-r--r--spec/ruby/library/matrix/vector/normalize_spec.rb18
-rw-r--r--spec/ruby/library/matrix/zero_spec.rb52
-rw-r--r--spec/ruby/library/monitor/mon_initialize_spec.rb31
-rw-r--r--spec/ruby/library/net/FTPError_spec.rb8
-rw-r--r--spec/ruby/library/net/FTPPermError_spec.rb12
-rw-r--r--spec/ruby/library/net/FTPProtoError_spec.rb12
-rw-r--r--spec/ruby/library/net/FTPReplyError_spec.rb12
-rw-r--r--spec/ruby/library/net/FTPTempError_spec.rb12
-rw-r--r--spec/ruby/library/net/ftp/abort_spec.rb62
-rw-r--r--spec/ruby/library/net/ftp/acct_spec.rb58
-rw-r--r--spec/ruby/library/net/ftp/binary_spec.rb24
-rw-r--r--spec/ruby/library/net/ftp/chdir_spec.rb99
-rw-r--r--spec/ruby/library/net/ftp/close_spec.rb30
-rw-r--r--spec/ruby/library/net/ftp/closed_spec.rb21
-rw-r--r--spec/ruby/library/net/ftp/connect_spec.rb49
-rw-r--r--spec/ruby/library/net/ftp/debug_mode_spec.rb23
-rw-r--r--spec/ruby/library/net/ftp/default_passive_spec.rb8
-rw-r--r--spec/ruby/library/net/ftp/delete_spec.rb59
-rw-r--r--spec/ruby/library/net/ftp/dir_spec.rb8
-rw-r--r--spec/ruby/library/net/ftp/fixtures/default_passive.rb3
-rw-r--r--spec/ruby/library/net/ftp/fixtures/passive.rb2
-rw-r--r--spec/ruby/library/net/ftp/fixtures/putbinaryfile3
-rw-r--r--spec/ruby/library/net/ftp/fixtures/puttextfile3
-rw-r--r--spec/ruby/library/net/ftp/fixtures/server.rb277
-rw-r--r--spec/ruby/library/net/ftp/get_spec.rb21
-rw-r--r--spec/ruby/library/net/ftp/getbinaryfile_spec.rb8
-rw-r--r--spec/ruby/library/net/ftp/getdir_spec.rb7
-rw-r--r--spec/ruby/library/net/ftp/gettextfile_spec.rb8
-rw-r--r--spec/ruby/library/net/ftp/help_spec.rb66
-rw-r--r--spec/ruby/library/net/ftp/initialize_spec.rb409
-rw-r--r--spec/ruby/library/net/ftp/last_response_code_spec.rb8
-rw-r--r--spec/ruby/library/net/ftp/last_response_spec.rb25
-rw-r--r--spec/ruby/library/net/ftp/lastresp_spec.rb8
-rw-r--r--spec/ruby/library/net/ftp/list_spec.rb8
-rw-r--r--spec/ruby/library/net/ftp/login_spec.rb195
-rw-r--r--spec/ruby/library/net/ftp/ls_spec.rb8
-rw-r--r--spec/ruby/library/net/ftp/mdtm_spec.rb38
-rw-r--r--spec/ruby/library/net/ftp/mkdir_spec.rb61
-rw-r--r--spec/ruby/library/net/ftp/mtime_spec.rb50
-rw-r--r--spec/ruby/library/net/ftp/nlst_spec.rb92
-rw-r--r--spec/ruby/library/net/ftp/noop_spec.rb38
-rw-r--r--spec/ruby/library/net/ftp/open_spec.rb55
-rw-r--r--spec/ruby/library/net/ftp/passive_spec.rb28
-rw-r--r--spec/ruby/library/net/ftp/put_spec.rb21
-rw-r--r--spec/ruby/library/net/ftp/putbinaryfile_spec.rb8
-rw-r--r--spec/ruby/library/net/ftp/puttextfile_spec.rb8
-rw-r--r--spec/ruby/library/net/ftp/pwd_spec.rb53
-rw-r--r--spec/ruby/library/net/ftp/quit_spec.rb33
-rw-r--r--spec/ruby/library/net/ftp/rename_spec.rb94
-rw-r--r--spec/ruby/library/net/ftp/resume_spec.rb23
-rw-r--r--spec/ruby/library/net/ftp/retrbinary_spec.rb30
-rw-r--r--spec/ruby/library/net/ftp/retrlines_spec.rb34
-rw-r--r--spec/ruby/library/net/ftp/return_code_spec.rb24
-rw-r--r--spec/ruby/library/net/ftp/rmdir_spec.rb58
-rw-r--r--spec/ruby/library/net/ftp/sendcmd_spec.rb54
-rw-r--r--spec/ruby/library/net/ftp/set_socket_spec.rb8
-rw-r--r--spec/ruby/library/net/ftp/shared/getbinaryfile.rb150
-rw-r--r--spec/ruby/library/net/ftp/shared/gettextfile.rb100
-rw-r--r--spec/ruby/library/net/ftp/shared/last_response_code.rb25
-rw-r--r--spec/ruby/library/net/ftp/shared/list.rb104
-rw-r--r--spec/ruby/library/net/ftp/shared/putbinaryfile.rb167
-rw-r--r--spec/ruby/library/net/ftp/shared/puttextfile.rb120
-rw-r--r--spec/ruby/library/net/ftp/shared/pwd.rb3
-rw-r--r--spec/ruby/library/net/ftp/site_spec.rb53
-rw-r--r--spec/ruby/library/net/ftp/size_spec.rb48
-rw-r--r--spec/ruby/library/net/ftp/spec_helper.rb5
-rw-r--r--spec/ruby/library/net/ftp/status_spec.rb69
-rw-r--r--spec/ruby/library/net/ftp/storbinary_spec.rb48
-rw-r--r--spec/ruby/library/net/ftp/storlines_spec.rb43
-rw-r--r--spec/ruby/library/net/ftp/system_spec.rb48
-rw-r--r--spec/ruby/library/net/ftp/voidcmd_spec.rb54
-rw-r--r--spec/ruby/library/net/ftp/welcome_spec.rb25
-rw-r--r--spec/ruby/library/net/http/HTTPBadResponse_spec.rb8
-rw-r--r--spec/ruby/library/net/http/HTTPClientExcepton_spec.rb14
-rw-r--r--spec/ruby/library/net/http/HTTPError_spec.rb12
-rw-r--r--spec/ruby/library/net/http/HTTPFatalError_spec.rb12
-rw-r--r--spec/ruby/library/net/http/HTTPHeaderSyntaxError_spec.rb8
-rw-r--r--spec/ruby/library/net/http/HTTPRetriableError_spec.rb12
-rw-r--r--spec/ruby/library/net/http/HTTPServerException_spec.rb26
-rw-r--r--spec/ruby/library/net/http/http/Proxy_spec.rb35
-rw-r--r--spec/ruby/library/net/http/http/active_spec.rb8
-rw-r--r--spec/ruby/library/net/http/http/address_spec.rb9
-rw-r--r--spec/ruby/library/net/http/http/close_on_empty_response_spec.rb10
-rw-r--r--spec/ruby/library/net/http/http/copy_spec.rb21
-rw-r--r--spec/ruby/library/net/http/http/default_port_spec.rb8
-rw-r--r--spec/ruby/library/net/http/http/delete_spec.rb21
-rw-r--r--spec/ruby/library/net/http/http/finish_spec.rb29
-rw-r--r--spec/ruby/library/net/http/http/fixtures/http_server.rb105
-rw-r--r--spec/ruby/library/net/http/http/get2_spec.rb8
-rw-r--r--spec/ruby/library/net/http/http/get_print_spec.rb30
-rw-r--r--spec/ruby/library/net/http/http/get_response_spec.rb30
-rw-r--r--spec/ruby/library/net/http/http/get_spec.rb26
-rw-r--r--spec/ruby/library/net/http/http/head2_spec.rb8
-rw-r--r--spec/ruby/library/net/http/http/head_spec.rb25
-rw-r--r--spec/ruby/library/net/http/http/http_default_port_spec.rb8
-rw-r--r--spec/ruby/library/net/http/http/https_default_port_spec.rb8
-rw-r--r--spec/ruby/library/net/http/http/initialize_spec.rb46
-rw-r--r--spec/ruby/library/net/http/http/inspect_spec.rb24
-rw-r--r--spec/ruby/library/net/http/http/is_version_1_1_spec.rb7
-rw-r--r--spec/ruby/library/net/http/http/is_version_1_2_spec.rb7
-rw-r--r--spec/ruby/library/net/http/http/lock_spec.rb21
-rw-r--r--spec/ruby/library/net/http/http/mkcol_spec.rb21
-rw-r--r--spec/ruby/library/net/http/http/move_spec.rb25
-rw-r--r--spec/ruby/library/net/http/http/new_spec.rb86
-rw-r--r--spec/ruby/library/net/http/http/newobj_spec.rb48
-rw-r--r--spec/ruby/library/net/http/http/open_timeout_spec.rb24
-rw-r--r--spec/ruby/library/net/http/http/options_spec.rb25
-rw-r--r--spec/ruby/library/net/http/http/port_spec.rb9
-rw-r--r--spec/ruby/library/net/http/http/post2_spec.rb8
-rw-r--r--spec/ruby/library/net/http/http/post_form_spec.rb22
-rw-r--r--spec/ruby/library/net/http/http/post_spec.rb76
-rw-r--r--spec/ruby/library/net/http/http/propfind_spec.rb24
-rw-r--r--spec/ruby/library/net/http/http/proppatch_spec.rb24
-rw-r--r--spec/ruby/library/net/http/http/proxy_address_spec.rb31
-rw-r--r--spec/ruby/library/net/http/http/proxy_class_spec.rb9
-rw-r--r--spec/ruby/library/net/http/http/proxy_pass_spec.rb39
-rw-r--r--spec/ruby/library/net/http/http/proxy_port_spec.rb39
-rw-r--r--spec/ruby/library/net/http/http/proxy_user_spec.rb39
-rw-r--r--spec/ruby/library/net/http/http/put2_spec.rb8
-rw-r--r--spec/ruby/library/net/http/http/put_spec.rb24
-rw-r--r--spec/ruby/library/net/http/http/read_timeout_spec.rb24
-rw-r--r--spec/ruby/library/net/http/http/request_get_spec.rb8
-rw-r--r--spec/ruby/library/net/http/http/request_head_spec.rb8
-rw-r--r--spec/ruby/library/net/http/http/request_post_spec.rb8
-rw-r--r--spec/ruby/library/net/http/http/request_put_spec.rb8
-rw-r--r--spec/ruby/library/net/http/http/request_spec.rb109
-rw-r--r--spec/ruby/library/net/http/http/request_types_spec.rb254
-rw-r--r--spec/ruby/library/net/http/http/send_request_spec.rb61
-rw-r--r--spec/ruby/library/net/http/http/set_debug_output_spec.rb33
-rw-r--r--spec/ruby/library/net/http/http/shared/request_get.rb41
-rw-r--r--spec/ruby/library/net/http/http/shared/request_head.rb41
-rw-r--r--spec/ruby/library/net/http/http/shared/request_post.rb41
-rw-r--r--spec/ruby/library/net/http/http/shared/request_put.rb41
-rw-r--r--spec/ruby/library/net/http/http/shared/started.rb26
-rw-r--r--spec/ruby/library/net/http/http/shared/version_1_1.rb6
-rw-r--r--spec/ruby/library/net/http/http/shared/version_1_2.rb6
-rw-r--r--spec/ruby/library/net/http/http/socket_type_spec.rb8
-rw-r--r--spec/ruby/library/net/http/http/start_spec.rb111
-rw-r--r--spec/ruby/library/net/http/http/started_spec.rb8
-rw-r--r--spec/ruby/library/net/http/http/trace_spec.rb24
-rw-r--r--spec/ruby/library/net/http/http/unlock_spec.rb24
-rw-r--r--spec/ruby/library/net/http/http/use_ssl_spec.rb9
-rw-r--r--spec/ruby/library/net/http/http/version_1_1_spec.rb7
-rw-r--r--spec/ruby/library/net/http/http/version_1_2_spec.rb20
-rw-r--r--spec/ruby/library/net/http/httpexceptions/fixtures/classes.rb5
-rw-r--r--spec/ruby/library/net/http/httpexceptions/initialize_spec.rb17
-rw-r--r--spec/ruby/library/net/http/httpexceptions/response_spec.rb10
-rw-r--r--spec/ruby/library/net/http/httpgenericrequest/body_exist_spec.rb22
-rw-r--r--spec/ruby/library/net/http/httpgenericrequest/body_spec.rb30
-rw-r--r--spec/ruby/library/net/http/httpgenericrequest/body_stream_spec.rb32
-rw-r--r--spec/ruby/library/net/http/httpgenericrequest/exec_spec.rb131
-rw-r--r--spec/ruby/library/net/http/httpgenericrequest/inspect_spec.rb25
-rw-r--r--spec/ruby/library/net/http/httpgenericrequest/method_spec.rb15
-rw-r--r--spec/ruby/library/net/http/httpgenericrequest/path_spec.rb12
-rw-r--r--spec/ruby/library/net/http/httpgenericrequest/request_body_permitted_spec.rb12
-rw-r--r--spec/ruby/library/net/http/httpgenericrequest/response_body_permitted_spec.rb12
-rw-r--r--spec/ruby/library/net/http/httpgenericrequest/set_body_internal_spec.rb21
-rw-r--r--spec/ruby/library/net/http/httpheader/add_field_spec.rb31
-rw-r--r--spec/ruby/library/net/http/httpheader/basic_auth_spec.rb14
-rw-r--r--spec/ruby/library/net/http/httpheader/canonical_each_spec.rb8
-rw-r--r--spec/ruby/library/net/http/httpheader/chunked_spec.rb22
-rw-r--r--spec/ruby/library/net/http/httpheader/content_length_spec.rb54
-rw-r--r--spec/ruby/library/net/http/httpheader/content_range_spec.rb32
-rw-r--r--spec/ruby/library/net/http/httpheader/content_type_spec.rb26
-rw-r--r--spec/ruby/library/net/http/httpheader/delete_spec.rb30
-rw-r--r--spec/ruby/library/net/http/httpheader/each_capitalized_name_spec.rb35
-rw-r--r--spec/ruby/library/net/http/httpheader/each_capitalized_spec.rb8
-rw-r--r--spec/ruby/library/net/http/httpheader/each_header_spec.rb8
-rw-r--r--spec/ruby/library/net/http/httpheader/each_key_spec.rb8
-rw-r--r--spec/ruby/library/net/http/httpheader/each_name_spec.rb8
-rw-r--r--spec/ruby/library/net/http/httpheader/each_spec.rb8
-rw-r--r--spec/ruby/library/net/http/httpheader/each_value_spec.rb35
-rw-r--r--spec/ruby/library/net/http/httpheader/element_reference_spec.rb39
-rw-r--r--spec/ruby/library/net/http/httpheader/element_set_spec.rb41
-rw-r--r--spec/ruby/library/net/http/httpheader/fetch_spec.rb68
-rw-r--r--spec/ruby/library/net/http/httpheader/fixtures/classes.rb11
-rw-r--r--spec/ruby/library/net/http/httpheader/form_data_spec.rb8
-rw-r--r--spec/ruby/library/net/http/httpheader/get_fields_spec.rb39
-rw-r--r--spec/ruby/library/net/http/httpheader/initialize_http_header_spec.rb22
-rw-r--r--spec/ruby/library/net/http/httpheader/key_spec.rb21
-rw-r--r--spec/ruby/library/net/http/httpheader/length_spec.rb8
-rw-r--r--spec/ruby/library/net/http/httpheader/main_type_spec.rb24
-rw-r--r--spec/ruby/library/net/http/httpheader/proxy_basic_auth_spec.rb14
-rw-r--r--spec/ruby/library/net/http/httpheader/range_length_spec.rb32
-rw-r--r--spec/ruby/library/net/http/httpheader/range_spec.rb48
-rw-r--r--spec/ruby/library/net/http/httpheader/set_content_type_spec.rb8
-rw-r--r--spec/ruby/library/net/http/httpheader/set_form_data_spec.rb8
-rw-r--r--spec/ruby/library/net/http/httpheader/set_range_spec.rb8
-rw-r--r--spec/ruby/library/net/http/httpheader/shared/each_capitalized.rb31
-rw-r--r--spec/ruby/library/net/http/httpheader/shared/each_header.rb31
-rw-r--r--spec/ruby/library/net/http/httpheader/shared/each_name.rb31
-rw-r--r--spec/ruby/library/net/http/httpheader/shared/set_content_type.rb18
-rw-r--r--spec/ruby/library/net/http/httpheader/shared/set_form_data.rb27
-rw-r--r--spec/ruby/library/net/http/httpheader/shared/set_range.rb89
-rw-r--r--spec/ruby/library/net/http/httpheader/shared/size.rb18
-rw-r--r--spec/ruby/library/net/http/httpheader/size_spec.rb8
-rw-r--r--spec/ruby/library/net/http/httpheader/sub_type_spec.rb32
-rw-r--r--spec/ruby/library/net/http/httpheader/to_hash_spec.rb25
-rw-r--r--spec/ruby/library/net/http/httpheader/type_params_spec.rb24
-rw-r--r--spec/ruby/library/net/http/httprequest/initialize_spec.rb45
-rw-r--r--spec/ruby/library/net/http/httpresponse/body_permitted_spec.rb13
-rw-r--r--spec/ruby/library/net/http/httpresponse/body_spec.rb7
-rw-r--r--spec/ruby/library/net/http/httpresponse/code_spec.rb24
-rw-r--r--spec/ruby/library/net/http/httpresponse/code_type_spec.rb24
-rw-r--r--spec/ruby/library/net/http/httpresponse/entity_spec.rb7
-rw-r--r--spec/ruby/library/net/http/httpresponse/error_spec.rb29
-rw-r--r--spec/ruby/library/net/http/httpresponse/error_type_spec.rb29
-rw-r--r--spec/ruby/library/net/http/httpresponse/exception_type_spec.rb18
-rw-r--r--spec/ruby/library/net/http/httpresponse/header_spec.rb9
-rw-r--r--spec/ruby/library/net/http/httpresponse/http_version_spec.rb12
-rw-r--r--spec/ruby/library/net/http/httpresponse/initialize_spec.rb11
-rw-r--r--spec/ruby/library/net/http/httpresponse/inspect_spec.rb15
-rw-r--r--spec/ruby/library/net/http/httpresponse/message_spec.rb9
-rw-r--r--spec/ruby/library/net/http/httpresponse/msg_spec.rb9
-rw-r--r--spec/ruby/library/net/http/httpresponse/read_body_spec.rb85
-rw-r--r--spec/ruby/library/net/http/httpresponse/read_header_spec.rb9
-rw-r--r--spec/ruby/library/net/http/httpresponse/read_new_spec.rb22
-rw-r--r--spec/ruby/library/net/http/httpresponse/reading_body_spec.rb58
-rw-r--r--spec/ruby/library/net/http/httpresponse/response_spec.rb9
-rw-r--r--spec/ruby/library/net/http/httpresponse/shared/body.rb18
-rw-r--r--spec/ruby/library/net/http/httpresponse/value_spec.rb29
-rw-r--r--spec/ruby/library/observer/add_observer_spec.rb23
-rw-r--r--spec/ruby/library/observer/count_observers_spec.rb23
-rw-r--r--spec/ruby/library/observer/delete_observer_spec.rb19
-rw-r--r--spec/ruby/library/observer/delete_observers_spec.rb19
-rw-r--r--spec/ruby/library/observer/fixtures/classes.rb17
-rw-r--r--spec/ruby/library/observer/notify_observers_spec.rb31
-rw-r--r--spec/ruby/library/open3/capture2_spec.rb6
-rw-r--r--spec/ruby/library/open3/capture2e_spec.rb6
-rw-r--r--spec/ruby/library/open3/capture3_spec.rb6
-rw-r--r--spec/ruby/library/open3/pipeline_r_spec.rb6
-rw-r--r--spec/ruby/library/open3/pipeline_rw_spec.rb6
-rw-r--r--spec/ruby/library/open3/pipeline_spec.rb6
-rw-r--r--spec/ruby/library/open3/pipeline_start_spec.rb6
-rw-r--r--spec/ruby/library/open3/pipeline_w_spec.rb6
-rw-r--r--spec/ruby/library/open3/popen2_spec.rb6
-rw-r--r--spec/ruby/library/open3/popen2e_spec.rb6
-rw-r--r--spec/ruby/library/open3/popen3_spec.rb43
-rw-r--r--spec/ruby/library/openssl/cipher_spec.rb9
-rw-r--r--spec/ruby/library/openssl/config/freeze_spec.rb20
-rw-r--r--spec/ruby/library/openssl/hmac/digest_spec.rb16
-rw-r--r--spec/ruby/library/openssl/hmac/hexdigest_spec.rb16
-rw-r--r--spec/ruby/library/openssl/random/pseudo_bytes_spec.rb8
-rw-r--r--spec/ruby/library/openssl/random/random_bytes_spec.rb6
-rw-r--r--spec/ruby/library/openssl/random/shared/random_bytes.rb29
-rw-r--r--spec/ruby/library/openssl/shared/constants.rb11
-rw-r--r--spec/ruby/library/openssl/x509/name/parse_spec.rb48
-rw-r--r--spec/ruby/library/openstruct/delete_field_spec.rb19
-rw-r--r--spec/ruby/library/openstruct/element_reference_spec.rb13
-rw-r--r--spec/ruby/library/openstruct/element_set_spec.rb13
-rw-r--r--spec/ruby/library/openstruct/equal_value_spec.rb28
-rw-r--r--spec/ruby/library/openstruct/fixtures/classes.rb4
-rw-r--r--spec/ruby/library/openstruct/frozen_spec.rb38
-rw-r--r--spec/ruby/library/openstruct/initialize_spec.rb8
-rw-r--r--spec/ruby/library/openstruct/inspect_spec.rb8
-rw-r--r--spec/ruby/library/openstruct/marshal_dump_spec.rb9
-rw-r--r--spec/ruby/library/openstruct/marshal_load_spec.rb12
-rw-r--r--spec/ruby/library/openstruct/method_missing_spec.rb47
-rw-r--r--spec/ruby/library/openstruct/new_spec.rb20
-rw-r--r--spec/ruby/library/openstruct/shared/inspect.rb20
-rw-r--r--spec/ruby/library/openstruct/to_h_spec.rb36
-rw-r--r--spec/ruby/library/openstruct/to_s_spec.rb8
-rw-r--r--spec/ruby/library/optionparser/order_spec.rb32
-rw-r--r--spec/ruby/library/optionparser/parse_spec.rb32
-rw-r--r--spec/ruby/library/pathname/absolute_spec.rb22
-rw-r--r--spec/ruby/library/pathname/empty_spec.rb34
-rw-r--r--spec/ruby/library/pathname/equal_value_spec.rb14
-rw-r--r--spec/ruby/library/pathname/hash_spec.rb14
-rw-r--r--spec/ruby/library/pathname/join_spec.rb40
-rw-r--r--spec/ruby/library/pathname/new_spec.rb28
-rw-r--r--spec/ruby/library/pathname/parent_spec.rb18
-rw-r--r--spec/ruby/library/pathname/realdirpath_spec.rb10
-rw-r--r--spec/ruby/library/pathname/realpath_spec.rb10
-rw-r--r--spec/ruby/library/pathname/relative_path_from_spec.rb51
-rw-r--r--spec/ruby/library/pathname/relative_spec.rb22
-rw-r--r--spec/ruby/library/pathname/root_spec.rb26
-rw-r--r--spec/ruby/library/pathname/sub_spec.rb15
-rw-r--r--spec/ruby/library/pp/pp_spec.rb25
-rw-r--r--spec/ruby/library/prime/each_spec.rb167
-rw-r--r--spec/ruby/library/prime/instance_spec.rb21
-rw-r--r--spec/ruby/library/prime/int_from_prime_division_spec.rb13
-rw-r--r--spec/ruby/library/prime/integer/each_prime_spec.rb13
-rw-r--r--spec/ruby/library/prime/integer/from_prime_division_spec.rb13
-rw-r--r--spec/ruby/library/prime/integer/prime_division_spec.rb19
-rw-r--r--spec/ruby/library/prime/integer/prime_spec.rb17
-rw-r--r--spec/ruby/library/prime/next_spec.rb7
-rw-r--r--spec/ruby/library/prime/prime_division_spec.rb25
-rw-r--r--spec/ruby/library/prime/prime_spec.rb17
-rw-r--r--spec/ruby/library/prime/shared/next.rb8
-rw-r--r--spec/ruby/library/prime/succ_spec.rb7
-rw-r--r--spec/ruby/library/rbconfig/rbconfig_spec.rb11
-rw-r--r--spec/ruby/library/rbconfig/sizeof/sizeof_spec.rb30
-rw-r--r--spec/ruby/library/readline/basic_quote_characters_spec.rb18
-rw-r--r--spec/ruby/library/readline/basic_word_break_characters_spec.rb16
-rw-r--r--spec/ruby/library/readline/completer_quote_characters_spec.rb16
-rw-r--r--spec/ruby/library/readline/completer_word_break_characters_spec.rb16
-rw-r--r--spec/ruby/library/readline/completion_append_character_spec.rb16
-rw-r--r--spec/ruby/library/readline/completion_case_fold_spec.rb18
-rw-r--r--spec/ruby/library/readline/completion_proc_spec.rb22
-rw-r--r--spec/ruby/library/readline/constants_spec.rb18
-rw-r--r--spec/ruby/library/readline/emacs_editing_mode_spec.rb11
-rw-r--r--spec/ruby/library/readline/filename_quote_characters_spec.rb18
-rw-r--r--spec/ruby/library/readline/history/append_spec.rb28
-rw-r--r--spec/ruby/library/readline/history/delete_at_spec.rb45
-rw-r--r--spec/ruby/library/readline/history/each_spec.rb29
-rw-r--r--spec/ruby/library/readline/history/element_reference_spec.rb40
-rw-r--r--spec/ruby/library/readline/history/element_set_spec.rb35
-rw-r--r--spec/ruby/library/readline/history/empty_spec.rb13
-rw-r--r--spec/ruby/library/readline/history/history_spec.rb9
-rw-r--r--spec/ruby/library/readline/history/length_spec.rb9
-rw-r--r--spec/ruby/library/readline/history/pop_spec.rb30
-rw-r--r--spec/ruby/library/readline/history/push_spec.rb26
-rw-r--r--spec/ruby/library/readline/history/shared/size.rb14
-rw-r--r--spec/ruby/library/readline/history/shift_spec.rb30
-rw-r--r--spec/ruby/library/readline/history/size_spec.rb9
-rw-r--r--spec/ruby/library/readline/history/to_s_spec.rb9
-rw-r--r--spec/ruby/library/readline/readline_spec.rb31
-rw-r--r--spec/ruby/library/readline/spec_helper.rb11
-rw-r--r--spec/ruby/library/readline/vi_editing_mode_spec.rb11
-rw-r--r--spec/ruby/library/resolv/get_address_spec.rb21
-rw-r--r--spec/ruby/library/resolv/get_addresses_spec.rb14
-rw-r--r--spec/ruby/library/resolv/get_name_spec.rb19
-rw-r--r--spec/ruby/library/resolv/get_names_spec.rb14
-rw-r--r--spec/ruby/library/rexml/attribute/clone_spec.rb11
-rw-r--r--spec/ruby/library/rexml/attribute/element_spec.rb23
-rw-r--r--spec/ruby/library/rexml/attribute/equal_value_spec.rb18
-rw-r--r--spec/ruby/library/rexml/attribute/hash_spec.rb13
-rw-r--r--spec/ruby/library/rexml/attribute/initialize_spec.rb29
-rw-r--r--spec/ruby/library/rexml/attribute/inspect_spec.rb19
-rw-r--r--spec/ruby/library/rexml/attribute/namespace_spec.rb24
-rw-r--r--spec/ruby/library/rexml/attribute/node_type_spec.rb10
-rw-r--r--spec/ruby/library/rexml/attribute/prefix_spec.rb18
-rw-r--r--spec/ruby/library/rexml/attribute/remove_spec.rb20
-rw-r--r--spec/ruby/library/rexml/attribute/to_s_spec.rb14
-rw-r--r--spec/ruby/library/rexml/attribute/to_string_spec.rb14
-rw-r--r--spec/ruby/library/rexml/attribute/value_spec.rb14
-rw-r--r--spec/ruby/library/rexml/attribute/write_spec.rb23
-rw-r--r--spec/ruby/library/rexml/attribute/xpath_spec.rb19
-rw-r--r--spec/ruby/library/rexml/attributes/add_spec.rb7
-rw-r--r--spec/ruby/library/rexml/attributes/append_spec.rb7
-rw-r--r--spec/ruby/library/rexml/attributes/delete_all_spec.rb31
-rw-r--r--spec/ruby/library/rexml/attributes/delete_spec.rb27
-rw-r--r--spec/ruby/library/rexml/attributes/each_attribute_spec.rb22
-rw-r--r--spec/ruby/library/rexml/attributes/each_spec.rb23
-rw-r--r--spec/ruby/library/rexml/attributes/element_reference_spec.rb18
-rw-r--r--spec/ruby/library/rexml/attributes/element_set_spec.rb25
-rw-r--r--spec/ruby/library/rexml/attributes/get_attribute_ns_spec.rb14
-rw-r--r--spec/ruby/library/rexml/attributes/get_attribute_spec.rb29
-rw-r--r--spec/ruby/library/rexml/attributes/initialize_spec.rb18
-rw-r--r--spec/ruby/library/rexml/attributes/length_spec.rb7
-rw-r--r--spec/ruby/library/rexml/attributes/namespaces_spec.rb6
-rw-r--r--spec/ruby/library/rexml/attributes/prefixes_spec.rb24
-rw-r--r--spec/ruby/library/rexml/attributes/shared/add.rb17
-rw-r--r--spec/ruby/library/rexml/attributes/shared/length.rb13
-rw-r--r--spec/ruby/library/rexml/attributes/size_spec.rb7
-rw-r--r--spec/ruby/library/rexml/attributes/to_a_spec.rb19
-rw-r--r--spec/ruby/library/rexml/cdata/clone_spec.rb10
-rw-r--r--spec/ruby/library/rexml/cdata/initialize_spec.rb24
-rw-r--r--spec/ruby/library/rexml/cdata/shared/to_s.rb11
-rw-r--r--spec/ruby/library/rexml/cdata/to_s_spec.rb7
-rw-r--r--spec/ruby/library/rexml/cdata/value_spec.rb7
-rw-r--r--spec/ruby/library/rexml/document/add_element_spec.rb31
-rw-r--r--spec/ruby/library/rexml/document/add_spec.rb57
-rw-r--r--spec/ruby/library/rexml/document/clone_spec.rb20
-rw-r--r--spec/ruby/library/rexml/document/doctype_spec.rb15
-rw-r--r--spec/ruby/library/rexml/document/encoding_spec.rb22
-rw-r--r--spec/ruby/library/rexml/document/expanded_name_spec.rb16
-rw-r--r--spec/ruby/library/rexml/document/new_spec.rb36
-rw-r--r--spec/ruby/library/rexml/document/node_type_spec.rb8
-rw-r--r--spec/ruby/library/rexml/document/root_spec.rb12
-rw-r--r--spec/ruby/library/rexml/document/stand_alone_spec.rb19
-rw-r--r--spec/ruby/library/rexml/document/version_spec.rb14
-rw-r--r--spec/ruby/library/rexml/document/write_spec.rb35
-rw-r--r--spec/ruby/library/rexml/document/xml_decl_spec.rb15
-rw-r--r--spec/ruby/library/rexml/element/add_attribute_spec.rb41
-rw-r--r--spec/ruby/library/rexml/element/add_attributes_spec.rb22
-rw-r--r--spec/ruby/library/rexml/element/add_element_spec.rb39
-rw-r--r--spec/ruby/library/rexml/element/add_namespace_spec.rb23
-rw-r--r--spec/ruby/library/rexml/element/add_text_spec.rb24
-rw-r--r--spec/ruby/library/rexml/element/attribute_spec.rb17
-rw-r--r--spec/ruby/library/rexml/element/attributes_spec.rb19
-rw-r--r--spec/ruby/library/rexml/element/cdatas_spec.rb24
-rw-r--r--spec/ruby/library/rexml/element/clone_spec.rb29
-rw-r--r--spec/ruby/library/rexml/element/comments_spec.rb20
-rw-r--r--spec/ruby/library/rexml/element/delete_attribute_spec.rb39
-rw-r--r--spec/ruby/library/rexml/element/delete_element_spec.rb49
-rw-r--r--spec/ruby/library/rexml/element/delete_namespace_spec.rb25
-rw-r--r--spec/ruby/library/rexml/element/document_spec.rb16
-rw-r--r--spec/ruby/library/rexml/element/each_element_with_attribute_spec.rb35
-rw-r--r--spec/ruby/library/rexml/element/each_element_with_text_spec.rb31
-rw-r--r--spec/ruby/library/rexml/element/element_reference_spec.rb22
-rw-r--r--spec/ruby/library/rexml/element/get_text_spec.rb18
-rw-r--r--spec/ruby/library/rexml/element/has_attributes_spec.rb17
-rw-r--r--spec/ruby/library/rexml/element/has_elements_spec.rb18
-rw-r--r--spec/ruby/library/rexml/element/has_text_spec.rb16
-rw-r--r--spec/ruby/library/rexml/element/inspect_spec.rb27
-rw-r--r--spec/ruby/library/rexml/element/instructions_spec.rb21
-rw-r--r--spec/ruby/library/rexml/element/namespace_spec.rb27
-rw-r--r--spec/ruby/library/rexml/element/namespaces_spec.rb32
-rw-r--r--spec/ruby/library/rexml/element/new_spec.rb35
-rw-r--r--spec/ruby/library/rexml/element/next_element_spec.rb19
-rw-r--r--spec/ruby/library/rexml/element/node_type_spec.rb8
-rw-r--r--spec/ruby/library/rexml/element/prefixes_spec.rb23
-rw-r--r--spec/ruby/library/rexml/element/previous_element_spec.rb20
-rw-r--r--spec/ruby/library/rexml/element/raw_spec.rb24
-rw-r--r--spec/ruby/library/rexml/element/root_spec.rb28
-rw-r--r--spec/ruby/library/rexml/element/text_spec.rb46
-rw-r--r--spec/ruby/library/rexml/element/texts_spec.rb16
-rw-r--r--spec/ruby/library/rexml/element/whitespace_spec.rb23
-rw-r--r--spec/ruby/library/rexml/node/each_recursive_spec.rb21
-rw-r--r--spec/ruby/library/rexml/node/find_first_recursive_spec.rb25
-rw-r--r--spec/ruby/library/rexml/node/index_in_parent_spec.rb15
-rw-r--r--spec/ruby/library/rexml/node/next_sibling_node_spec.rb21
-rw-r--r--spec/ruby/library/rexml/node/parent_spec.rb20
-rw-r--r--spec/ruby/library/rexml/node/previous_sibling_node_spec.rb21
-rw-r--r--spec/ruby/library/rexml/shared/each_element.rb36
-rw-r--r--spec/ruby/library/rexml/shared/elements_to_a.rb34
-rw-r--r--spec/ruby/library/rexml/text/append_spec.rb10
-rw-r--r--spec/ruby/library/rexml/text/clone_spec.rb10
-rw-r--r--spec/ruby/library/rexml/text/comparison_spec.rb25
-rw-r--r--spec/ruby/library/rexml/text/empty_spec.rb12
-rw-r--r--spec/ruby/library/rexml/text/indent_text_spec.rb23
-rw-r--r--spec/ruby/library/rexml/text/inspect_spec.rb8
-rw-r--r--spec/ruby/library/rexml/text/new_spec.rb48
-rw-r--r--spec/ruby/library/rexml/text/node_type_spec.rb8
-rw-r--r--spec/ruby/library/rexml/text/normalize_spec.rb8
-rw-r--r--spec/ruby/library/rexml/text/read_with_substitution_spec.rb12
-rw-r--r--spec/ruby/library/rexml/text/to_s_spec.rb17
-rw-r--r--spec/ruby/library/rexml/text/unnormalize_spec.rb8
-rw-r--r--spec/ruby/library/rexml/text/value_spec.rb37
-rw-r--r--spec/ruby/library/rexml/text/wrap_spec.rb20
-rw-r--r--spec/ruby/library/rexml/text/write_with_substitution_spec.rb33
-rw-r--r--spec/ruby/library/scanf/io/block_scanf_spec.rb7
-rw-r--r--spec/ruby/library/scanf/io/fixtures/date.txt4
-rw-r--r--spec/ruby/library/scanf/io/fixtures/helloworld.txt1
-rw-r--r--spec/ruby/library/scanf/io/scanf_spec.rb35
-rw-r--r--spec/ruby/library/scanf/io/shared/block_scanf.rb28
-rw-r--r--spec/ruby/library/scanf/string/block_scanf_spec.rb7
-rw-r--r--spec/ruby/library/scanf/string/scanf_spec.rb53
-rw-r--r--spec/ruby/library/scanf/string/shared/block_scanf.rb25
-rw-r--r--spec/ruby/library/securerandom/base64_spec.rb55
-rw-r--r--spec/ruby/library/securerandom/hex_spec.rb54
-rw-r--r--spec/ruby/library/securerandom/random_bytes_spec.rb50
-rw-r--r--spec/ruby/library/securerandom/random_number_spec.rb93
-rw-r--r--spec/ruby/library/set/add_spec.rb27
-rw-r--r--spec/ruby/library/set/append_spec.rb7
-rw-r--r--spec/ruby/library/set/case_compare_spec.rb14
-rw-r--r--spec/ruby/library/set/case_equality_spec.rb9
-rw-r--r--spec/ruby/library/set/classify_spec.rb27
-rw-r--r--spec/ruby/library/set/clear_spec.rb17
-rw-r--r--spec/ruby/library/set/collect_spec.rb7
-rw-r--r--spec/ruby/library/set/compare_by_identity_spec.rb147
-rw-r--r--spec/ruby/library/set/constructor_spec.rb15
-rw-r--r--spec/ruby/library/set/delete_if_spec.rb38
-rw-r--r--spec/ruby/library/set/delete_spec.rb37
-rw-r--r--spec/ruby/library/set/difference_spec.rb7
-rw-r--r--spec/ruby/library/set/divide_spec.rb34
-rw-r--r--spec/ruby/library/set/each_spec.rb26
-rw-r--r--spec/ruby/library/set/empty_spec.rb10
-rw-r--r--spec/ruby/library/set/enumerable/to_set_spec.rb19
-rw-r--r--spec/ruby/library/set/eql_spec.rb15
-rw-r--r--spec/ruby/library/set/equal_value_spec.rb26
-rw-r--r--spec/ruby/library/set/exclusion_spec.rb18
-rw-r--r--spec/ruby/library/set/filter_spec.rb8
-rw-r--r--spec/ruby/library/set/flatten_merge_spec.rb23
-rw-r--r--spec/ruby/library/set/flatten_spec.rb40
-rw-r--r--spec/ruby/library/set/hash_spec.rb13
-rw-r--r--spec/ruby/library/set/include_spec.rb7
-rw-r--r--spec/ruby/library/set/initialize_spec.rb48
-rw-r--r--spec/ruby/library/set/inspect_spec.rb7
-rw-r--r--spec/ruby/library/set/intersection_spec.rb11
-rw-r--r--spec/ruby/library/set/keep_if_spec.rb38
-rw-r--r--spec/ruby/library/set/length_spec.rb7
-rw-r--r--spec/ruby/library/set/map_spec.rb7
-rw-r--r--spec/ruby/library/set/member_spec.rb7
-rw-r--r--spec/ruby/library/set/merge_spec.rb19
-rw-r--r--spec/ruby/library/set/minus_spec.rb7
-rw-r--r--spec/ruby/library/set/plus_spec.rb7
-rw-r--r--spec/ruby/library/set/pretty_print_cycle_spec.rb10
-rw-r--r--spec/ruby/library/set/pretty_print_spec.rb17
-rw-r--r--spec/ruby/library/set/proper_subset_spec.rb34
-rw-r--r--spec/ruby/library/set/proper_superset_spec.rb34
-rw-r--r--spec/ruby/library/set/reject_spec.rb42
-rw-r--r--spec/ruby/library/set/replace_spec.rb17
-rw-r--r--spec/ruby/library/set/select_spec.rb6
-rw-r--r--spec/ruby/library/set/shared/add.rb14
-rw-r--r--spec/ruby/library/set/shared/collect.rb20
-rw-r--r--spec/ruby/library/set/shared/difference.rb15
-rw-r--r--spec/ruby/library/set/shared/include.rb29
-rw-r--r--spec/ruby/library/set/shared/inspect.rb15
-rw-r--r--spec/ruby/library/set/shared/intersection.rb15
-rw-r--r--spec/ruby/library/set/shared/length.rb6
-rw-r--r--spec/ruby/library/set/shared/select.rb42
-rw-r--r--spec/ruby/library/set/shared/union.rb15
-rw-r--r--spec/ruby/library/set/size_spec.rb7
-rw-r--r--spec/ruby/library/set/sortedset/add_spec.rb39
-rw-r--r--spec/ruby/library/set/sortedset/append_spec.rb7
-rw-r--r--spec/ruby/library/set/sortedset/case_equality_spec.rb9
-rw-r--r--spec/ruby/library/set/sortedset/classify_spec.rb27
-rw-r--r--spec/ruby/library/set/sortedset/clear_spec.rb17
-rw-r--r--spec/ruby/library/set/sortedset/collect_spec.rb7
-rw-r--r--spec/ruby/library/set/sortedset/constructor_spec.rb15
-rw-r--r--spec/ruby/library/set/sortedset/delete_if_spec.rb38
-rw-r--r--spec/ruby/library/set/sortedset/delete_spec.rb37
-rw-r--r--spec/ruby/library/set/sortedset/difference_spec.rb7
-rw-r--r--spec/ruby/library/set/sortedset/divide_spec.rb34
-rw-r--r--spec/ruby/library/set/sortedset/each_spec.rb26
-rw-r--r--spec/ruby/library/set/sortedset/empty_spec.rb10
-rw-r--r--spec/ruby/library/set/sortedset/eql_spec.rb16
-rw-r--r--spec/ruby/library/set/sortedset/equal_value_spec.rb13
-rw-r--r--spec/ruby/library/set/sortedset/exclusion_spec.rb18
-rw-r--r--spec/ruby/library/set/sortedset/filter_spec.rb9
-rw-r--r--spec/ruby/library/set/sortedset/flatten_merge_spec.rb8
-rw-r--r--spec/ruby/library/set/sortedset/flatten_spec.rb44
-rw-r--r--spec/ruby/library/set/sortedset/hash_spec.rb13
-rw-r--r--spec/ruby/library/set/sortedset/include_spec.rb7
-rw-r--r--spec/ruby/library/set/sortedset/initialize_spec.rb30
-rw-r--r--spec/ruby/library/set/sortedset/inspect_spec.rb10
-rw-r--r--spec/ruby/library/set/sortedset/intersection_spec.rb11
-rw-r--r--spec/ruby/library/set/sortedset/keep_if_spec.rb31
-rw-r--r--spec/ruby/library/set/sortedset/length_spec.rb7
-rw-r--r--spec/ruby/library/set/sortedset/map_spec.rb7
-rw-r--r--spec/ruby/library/set/sortedset/member_spec.rb7
-rw-r--r--spec/ruby/library/set/sortedset/merge_spec.rb19
-rw-r--r--spec/ruby/library/set/sortedset/minus_spec.rb7
-rw-r--r--spec/ruby/library/set/sortedset/plus_spec.rb7
-rw-r--r--spec/ruby/library/set/sortedset/pretty_print_cycle_spec.rb10
-rw-r--r--spec/ruby/library/set/sortedset/pretty_print_spec.rb17
-rw-r--r--spec/ruby/library/set/sortedset/proper_subset_spec.rb33
-rw-r--r--spec/ruby/library/set/sortedset/proper_superset_spec.rb33
-rw-r--r--spec/ruby/library/set/sortedset/reject_spec.rb42
-rw-r--r--spec/ruby/library/set/sortedset/replace_spec.rb17
-rw-r--r--spec/ruby/library/set/sortedset/select_spec.rb7
-rw-r--r--spec/ruby/library/set/sortedset/shared/add.rb14
-rw-r--r--spec/ruby/library/set/sortedset/shared/collect.rb20
-rw-r--r--spec/ruby/library/set/sortedset/shared/difference.rb15
-rw-r--r--spec/ruby/library/set/sortedset/shared/include.rb7
-rw-r--r--spec/ruby/library/set/sortedset/shared/intersection.rb15
-rw-r--r--spec/ruby/library/set/sortedset/shared/length.rb6
-rw-r--r--spec/ruby/library/set/sortedset/shared/select.rb35
-rw-r--r--spec/ruby/library/set/sortedset/shared/union.rb15
-rw-r--r--spec/ruby/library/set/sortedset/size_spec.rb7
-rw-r--r--spec/ruby/library/set/sortedset/subset_spec.rb33
-rw-r--r--spec/ruby/library/set/sortedset/subtract_spec.rb17
-rw-r--r--spec/ruby/library/set/sortedset/superset_spec.rb33
-rw-r--r--spec/ruby/library/set/sortedset/to_a_spec.rb17
-rw-r--r--spec/ruby/library/set/sortedset/union_spec.rb11
-rw-r--r--spec/ruby/library/set/subset_spec.rb34
-rw-r--r--spec/ruby/library/set/subtract_spec.rb17
-rw-r--r--spec/ruby/library/set/superset_spec.rb34
-rw-r--r--spec/ruby/library/set/to_a_spec.rb8
-rw-r--r--spec/ruby/library/set/to_s_spec.rb13
-rw-r--r--spec/ruby/library/set/union_spec.rb11
-rw-r--r--spec/ruby/library/shellwords/shellwords_spec.rb36
-rw-r--r--spec/ruby/library/singleton/allocate_spec.rb8
-rw-r--r--spec/ruby/library/singleton/clone_spec.rb8
-rw-r--r--spec/ruby/library/singleton/dump_spec.rb14
-rw-r--r--spec/ruby/library/singleton/dup_spec.rb8
-rw-r--r--spec/ruby/library/singleton/fixtures/classes.rb18
-rw-r--r--spec/ruby/library/singleton/instance_spec.rb30
-rw-r--r--spec/ruby/library/singleton/load_spec.rb21
-rw-r--r--spec/ruby/library/singleton/new_spec.rb8
-rw-r--r--spec/ruby/library/socket/addrinfo/afamily_spec.rb37
-rw-r--r--spec/ruby/library/socket/addrinfo/bind_spec.rb28
-rw-r--r--spec/ruby/library/socket/addrinfo/canonname_spec.rb27
-rw-r--r--spec/ruby/library/socket/addrinfo/connect_from_spec.rb75
-rw-r--r--spec/ruby/library/socket/addrinfo/connect_spec.rb35
-rw-r--r--spec/ruby/library/socket/addrinfo/connect_to_spec.rb75
-rw-r--r--spec/ruby/library/socket/addrinfo/family_addrinfo_spec.rb115
-rw-r--r--spec/ruby/library/socket/addrinfo/foreach_spec.rb9
-rw-r--r--spec/ruby/library/socket/addrinfo/getaddrinfo_spec.rb91
-rw-r--r--spec/ruby/library/socket/addrinfo/getnameinfo_spec.rb40
-rw-r--r--spec/ruby/library/socket/addrinfo/initialize_spec.rb587
-rw-r--r--spec/ruby/library/socket/addrinfo/inspect_sockaddr_spec.rb50
-rw-r--r--spec/ruby/library/socket/addrinfo/inspect_spec.rb65
-rw-r--r--spec/ruby/library/socket/addrinfo/ip_address_spec.rb85
-rw-r--r--spec/ruby/library/socket/addrinfo/ip_port_spec.rb35
-rw-r--r--spec/ruby/library/socket/addrinfo/ip_spec.rb64
-rw-r--r--spec/ruby/library/socket/addrinfo/ip_unpack_spec.rb35
-rw-r--r--spec/ruby/library/socket/addrinfo/ipv4_loopback_spec.rb43
-rw-r--r--spec/ruby/library/socket/addrinfo/ipv4_multicast_spec.rb29
-rw-r--r--spec/ruby/library/socket/addrinfo/ipv4_private_spec.rb47
-rw-r--r--spec/ruby/library/socket/addrinfo/ipv4_spec.rb35
-rw-r--r--spec/ruby/library/socket/addrinfo/ipv6_linklocal_spec.rb23
-rw-r--r--spec/ruby/library/socket/addrinfo/ipv6_loopback_spec.rb45
-rw-r--r--spec/ruby/library/socket/addrinfo/ipv6_mc_global_spec.rb20
-rw-r--r--spec/ruby/library/socket/addrinfo/ipv6_mc_linklocal_spec.rb19
-rw-r--r--spec/ruby/library/socket/addrinfo/ipv6_mc_nodelocal_spec.rb18
-rw-r--r--spec/ruby/library/socket/addrinfo/ipv6_mc_orglocal_spec.rb18
-rw-r--r--spec/ruby/library/socket/addrinfo/ipv6_mc_sitelocal_spec.rb18
-rw-r--r--spec/ruby/library/socket/addrinfo/ipv6_multicast_spec.rb48
-rw-r--r--spec/ruby/library/socket/addrinfo/ipv6_sitelocal_spec.rb23
-rw-r--r--spec/ruby/library/socket/addrinfo/ipv6_spec.rb35
-rw-r--r--spec/ruby/library/socket/addrinfo/ipv6_to_ipv4_spec.rb71
-rw-r--r--spec/ruby/library/socket/addrinfo/ipv6_unique_local_spec.rb18
-rw-r--r--spec/ruby/library/socket/addrinfo/ipv6_unspecified_spec.rb15
-rw-r--r--spec/ruby/library/socket/addrinfo/ipv6_v4compat_spec.rb20
-rw-r--r--spec/ruby/library/socket/addrinfo/ipv6_v4mapped_spec.rb20
-rw-r--r--spec/ruby/library/socket/addrinfo/listen_spec.rb34
-rw-r--r--spec/ruby/library/socket/addrinfo/marshal_dump_spec.rb84
-rw-r--r--spec/ruby/library/socket/addrinfo/marshal_load_spec.rb35
-rw-r--r--spec/ruby/library/socket/addrinfo/pfamily_spec.rb43
-rw-r--r--spec/ruby/library/socket/addrinfo/protocol_spec.rb24
-rw-r--r--spec/ruby/library/socket/addrinfo/shared/to_sockaddr.rb51
-rw-r--r--spec/ruby/library/socket/addrinfo/socktype_spec.rb23
-rw-r--r--spec/ruby/library/socket/addrinfo/tcp_spec.rb34
-rw-r--r--spec/ruby/library/socket/addrinfo/to_s_spec.rb6
-rw-r--r--spec/ruby/library/socket/addrinfo/to_sockaddr_spec.rb6
-rw-r--r--spec/ruby/library/socket/addrinfo/udp_spec.rb36
-rw-r--r--spec/ruby/library/socket/addrinfo/unix_path_spec.rb37
-rw-r--r--spec/ruby/library/socket/addrinfo/unix_spec.rb71
-rw-r--r--spec/ruby/library/socket/ancillarydata/cmsg_is_spec.rb33
-rw-r--r--spec/ruby/library/socket/ancillarydata/data_spec.rb9
-rw-r--r--spec/ruby/library/socket/ancillarydata/family_spec.rb9
-rw-r--r--spec/ruby/library/socket/ancillarydata/initialize_spec.rb284
-rw-r--r--spec/ruby/library/socket/ancillarydata/int_spec.rb43
-rw-r--r--spec/ruby/library/socket/ancillarydata/ip_pktinfo_spec.rb145
-rw-r--r--spec/ruby/library/socket/ancillarydata/ipv6_pktinfo_addr_spec.rb11
-rw-r--r--spec/ruby/library/socket/ancillarydata/ipv6_pktinfo_ifindex_spec.rb11
-rw-r--r--spec/ruby/library/socket/ancillarydata/ipv6_pktinfo_spec.rb89
-rw-r--r--spec/ruby/library/socket/ancillarydata/level_spec.rb9
-rw-r--r--spec/ruby/library/socket/ancillarydata/type_spec.rb9
-rw-r--r--spec/ruby/library/socket/ancillarydata/unix_rights_spec.rb61
-rw-r--r--spec/ruby/library/socket/basicsocket/close_read_spec.rb43
-rw-r--r--spec/ruby/library/socket/basicsocket/close_write_spec.rb48
-rw-r--r--spec/ruby/library/socket/basicsocket/connect_address_spec.rb154
-rw-r--r--spec/ruby/library/socket/basicsocket/do_not_reverse_lookup_spec.rb39
-rw-r--r--spec/ruby/library/socket/basicsocket/for_fd_spec.rb38
-rw-r--r--spec/ruby/library/socket/basicsocket/getpeereid_spec.rb36
-rw-r--r--spec/ruby/library/socket/basicsocket/getpeername_spec.rb25
-rw-r--r--spec/ruby/library/socket/basicsocket/getsockname_spec.rb28
-rw-r--r--spec/ruby/library/socket/basicsocket/getsockopt_spec.rb188
-rw-r--r--spec/ruby/library/socket/basicsocket/ioctl_spec.rb42
-rw-r--r--spec/ruby/library/socket/basicsocket/recv_nonblock_spec.rb65
-rw-r--r--spec/ruby/library/socket/basicsocket/recv_spec.rb159
-rw-r--r--spec/ruby/library/socket/basicsocket/recvmsg_nonblock_spec.rb205
-rw-r--r--spec/ruby/library/socket/basicsocket/recvmsg_spec.rb197
-rw-r--r--spec/ruby/library/socket/basicsocket/send_spec.rb212
-rw-r--r--spec/ruby/library/socket/basicsocket/sendmsg_nonblock_spec.rb104
-rw-r--r--spec/ruby/library/socket/basicsocket/sendmsg_spec.rb111
-rw-r--r--spec/ruby/library/socket/basicsocket/setsockopt_spec.rb336
-rw-r--r--spec/ruby/library/socket/basicsocket/shutdown_spec.rb155
-rw-r--r--spec/ruby/library/socket/constants/constants_spec.rb108
-rw-r--r--spec/ruby/library/socket/fixtures/classes.rb148
-rw-r--r--spec/ruby/library/socket/fixtures/send_io.txt1
-rw-r--r--spec/ruby/library/socket/ipsocket/addr_spec.rb105
-rw-r--r--spec/ruby/library/socket/ipsocket/getaddress_spec.rb27
-rw-r--r--spec/ruby/library/socket/ipsocket/peeraddr_spec.rb117
-rw-r--r--spec/ruby/library/socket/ipsocket/recvfrom_spec.rb123
-rw-r--r--spec/ruby/library/socket/option/bool_spec.rb27
-rw-r--r--spec/ruby/library/socket/option/initialize_spec.rb83
-rw-r--r--spec/ruby/library/socket/option/inspect_spec.rb19
-rw-r--r--spec/ruby/library/socket/option/int_spec.rb43
-rw-r--r--spec/ruby/library/socket/option/linger_spec.rb76
-rw-r--r--spec/ruby/library/socket/option/new_spec.rb35
-rw-r--r--spec/ruby/library/socket/shared/pack_sockaddr.rb99
-rw-r--r--spec/ruby/library/socket/shared/partially_closable_sockets.rb13
-rw-r--r--spec/ruby/library/socket/shared/socketpair.rb138
-rw-r--r--spec/ruby/library/socket/socket/accept_loop_spec.rb84
-rw-r--r--spec/ruby/library/socket/socket/accept_nonblock_spec.rb138
-rw-r--r--spec/ruby/library/socket/socket/accept_spec.rb122
-rw-r--r--spec/ruby/library/socket/socket/bind_spec.rb144
-rw-r--r--spec/ruby/library/socket/socket/connect_nonblock_spec.rb149
-rw-r--r--spec/ruby/library/socket/socket/connect_spec.rb56
-rw-r--r--spec/ruby/library/socket/socket/for_fd_spec.rb30
-rw-r--r--spec/ruby/library/socket/socket/getaddrinfo_spec.rb373
-rw-r--r--spec/ruby/library/socket/socket/gethostbyaddr_spec.rb124
-rw-r--r--spec/ruby/library/socket/socket/gethostbyname_spec.rb135
-rw-r--r--spec/ruby/library/socket/socket/gethostname_spec.rb8
-rw-r--r--spec/ruby/library/socket/socket/getifaddrs_spec.rb117
-rw-r--r--spec/ruby/library/socket/socket/getnameinfo_spec.rb147
-rw-r--r--spec/ruby/library/socket/socket/getservbyname_spec.rb32
-rw-r--r--spec/ruby/library/socket/socket/getservbyport_spec.rb23
-rw-r--r--spec/ruby/library/socket/socket/initialize_spec.rb87
-rw-r--r--spec/ruby/library/socket/socket/ip_address_list_spec.rb50
-rw-r--r--spec/ruby/library/socket/socket/ipv6only_bang_spec.rb20
-rw-r--r--spec/ruby/library/socket/socket/listen_spec.rb64
-rw-r--r--spec/ruby/library/socket/socket/local_address_spec.rb43
-rw-r--r--spec/ruby/library/socket/socket/new_spec.rb2
-rw-r--r--spec/ruby/library/socket/socket/pack_sockaddr_in_spec.rb7
-rw-r--r--spec/ruby/library/socket/socket/pack_sockaddr_un_spec.rb7
-rw-r--r--spec/ruby/library/socket/socket/pair_spec.rb7
-rw-r--r--spec/ruby/library/socket/socket/recvfrom_nonblock_spec.rb114
-rw-r--r--spec/ruby/library/socket/socket/recvfrom_spec.rb92
-rw-r--r--spec/ruby/library/socket/socket/remote_address_spec.rb54
-rw-r--r--spec/ruby/library/socket/socket/sockaddr_in_spec.rb7
-rw-r--r--spec/ruby/library/socket/socket/sockaddr_un_spec.rb7
-rw-r--r--spec/ruby/library/socket/socket/socket_spec.rb38
-rw-r--r--spec/ruby/library/socket/socket/socketpair_spec.rb7
-rw-r--r--spec/ruby/library/socket/socket/sysaccept_spec.rb93
-rw-r--r--spec/ruby/library/socket/socket/tcp_server_loop_spec.rb47
-rw-r--r--spec/ruby/library/socket/socket/tcp_server_sockets_spec.rb39
-rw-r--r--spec/ruby/library/socket/socket/tcp_spec.rb70
-rw-r--r--spec/ruby/library/socket/socket/udp_server_loop_on_spec.rb47
-rw-r--r--spec/ruby/library/socket/socket/udp_server_loop_spec.rb47
-rw-r--r--spec/ruby/library/socket/socket/udp_server_recv_spec.rb38
-rw-r--r--spec/ruby/library/socket/socket/udp_server_sockets_spec.rb39
-rw-r--r--spec/ruby/library/socket/socket/unix_server_loop_spec.rb51
-rw-r--r--spec/ruby/library/socket/socket/unix_server_socket_spec.rb48
-rw-r--r--spec/ruby/library/socket/socket/unix_spec.rb45
-rw-r--r--spec/ruby/library/socket/socket/unpack_sockaddr_in_spec.rb46
-rw-r--r--spec/ruby/library/socket/socket/unpack_sockaddr_un_spec.rb26
-rw-r--r--spec/ruby/library/socket/spec_helper.rb17
-rw-r--r--spec/ruby/library/socket/tcpserver/accept_nonblock_spec.rb84
-rw-r--r--spec/ruby/library/socket/tcpserver/accept_spec.rb99
-rw-r--r--spec/ruby/library/socket/tcpserver/gets_spec.rb16
-rw-r--r--spec/ruby/library/socket/tcpserver/initialize_spec.rb101
-rw-r--r--spec/ruby/library/socket/tcpserver/listen_spec.rb22
-rw-r--r--spec/ruby/library/socket/tcpserver/new_spec.rb96
-rw-r--r--spec/ruby/library/socket/tcpserver/sysaccept_spec.rb66
-rw-r--r--spec/ruby/library/socket/tcpsocket/gethostbyname_spec.rb111
-rw-r--r--spec/ruby/library/socket/tcpsocket/initialize_spec.rb61
-rw-r--r--spec/ruby/library/socket/tcpsocket/local_address_spec.rb73
-rw-r--r--spec/ruby/library/socket/tcpsocket/new_spec.rb5
-rw-r--r--spec/ruby/library/socket/tcpsocket/open_spec.rb5
-rw-r--r--spec/ruby/library/socket/tcpsocket/partially_closable_spec.rb21
-rw-r--r--spec/ruby/library/socket/tcpsocket/recv_nonblock_spec.rb34
-rw-r--r--spec/ruby/library/socket/tcpsocket/recv_spec.rb28
-rw-r--r--spec/ruby/library/socket/tcpsocket/remote_address_spec.rb72
-rw-r--r--spec/ruby/library/socket/tcpsocket/setsockopt_spec.rb45
-rw-r--r--spec/ruby/library/socket/tcpsocket/shared/new.rb79
-rw-r--r--spec/ruby/library/socket/udpsocket/bind_spec.rb83
-rw-r--r--spec/ruby/library/socket/udpsocket/connect_spec.rb35
-rw-r--r--spec/ruby/library/socket/udpsocket/initialize_spec.rb36
-rw-r--r--spec/ruby/library/socket/udpsocket/inspect_spec.rb25
-rw-r--r--spec/ruby/library/socket/udpsocket/local_address_spec.rb80
-rw-r--r--spec/ruby/library/socket/udpsocket/new_spec.rb34
-rw-r--r--spec/ruby/library/socket/udpsocket/open_spec.rb13
-rw-r--r--spec/ruby/library/socket/udpsocket/recvfrom_nonblock_spec.rb90
-rw-r--r--spec/ruby/library/socket/udpsocket/remote_address_spec.rb79
-rw-r--r--spec/ruby/library/socket/udpsocket/send_spec.rb154
-rw-r--r--spec/ruby/library/socket/udpsocket/write_spec.rb21
-rw-r--r--spec/ruby/library/socket/unixserver/accept_nonblock_spec.rb92
-rw-r--r--spec/ruby/library/socket/unixserver/accept_spec.rb117
-rw-r--r--spec/ruby/library/socket/unixserver/for_fd_spec.rb23
-rw-r--r--spec/ruby/library/socket/unixserver/initialize_spec.rb28
-rw-r--r--spec/ruby/library/socket/unixserver/listen_spec.rb21
-rw-r--r--spec/ruby/library/socket/unixserver/new_spec.rb6
-rw-r--r--spec/ruby/library/socket/unixserver/open_spec.rb26
-rw-r--r--spec/ruby/library/socket/unixserver/shared/new.rb22
-rw-r--r--spec/ruby/library/socket/unixserver/sysaccept_spec.rb52
-rw-r--r--spec/ruby/library/socket/unixsocket/addr_spec.rb36
-rw-r--r--spec/ruby/library/socket/unixsocket/initialize_spec.rb38
-rw-r--r--spec/ruby/library/socket/unixsocket/inspect_spec.rb17
-rw-r--r--spec/ruby/library/socket/unixsocket/local_address_spec.rb49
-rw-r--r--spec/ruby/library/socket/unixsocket/new_spec.rb6
-rw-r--r--spec/ruby/library/socket/unixsocket/open_spec.rb28
-rw-r--r--spec/ruby/library/socket/unixsocket/pair_spec.rb39
-rw-r--r--spec/ruby/library/socket/unixsocket/partially_closable_spec.rb25
-rw-r--r--spec/ruby/library/socket/unixsocket/path_spec.rb28
-rw-r--r--spec/ruby/library/socket/unixsocket/peeraddr_spec.rb30
-rw-r--r--spec/ruby/library/socket/unixsocket/recv_io_spec.rb87
-rw-r--r--spec/ruby/library/socket/unixsocket/recvfrom_spec.rb98
-rw-r--r--spec/ruby/library/socket/unixsocket/remote_address_spec.rb45
-rw-r--r--spec/ruby/library/socket/unixsocket/send_io_spec.rb58
-rw-r--r--spec/ruby/library/socket/unixsocket/shared/new.rb24
-rw-r--r--spec/ruby/library/socket/unixsocket/socketpair_spec.rb40
-rw-r--r--spec/ruby/library/stringio/append_spec.rb84
-rw-r--r--spec/ruby/library/stringio/binmode_spec.rb9
-rw-r--r--spec/ruby/library/stringio/bytes_spec.rb11
-rw-r--r--spec/ruby/library/stringio/chars_spec.rb11
-rw-r--r--spec/ruby/library/stringio/close_read_spec.rb31
-rw-r--r--spec/ruby/library/stringio/close_spec.rb23
-rw-r--r--spec/ruby/library/stringio/close_write_spec.rb31
-rw-r--r--spec/ruby/library/stringio/closed_read_spec.rb12
-rw-r--r--spec/ruby/library/stringio/closed_spec.rb16
-rw-r--r--spec/ruby/library/stringio/closed_write_spec.rb12
-rw-r--r--spec/ruby/library/stringio/codepoints_spec.rb9
-rw-r--r--spec/ruby/library/stringio/each_byte_spec.rb11
-rw-r--r--spec/ruby/library/stringio/each_char_spec.rb11
-rw-r--r--spec/ruby/library/stringio/each_codepoint_spec.rb9
-rw-r--r--spec/ruby/library/stringio/each_line_spec.rb21
-rw-r--r--spec/ruby/library/stringio/each_spec.rb21
-rw-r--r--spec/ruby/library/stringio/eof_spec.rb11
-rw-r--r--spec/ruby/library/stringio/external_encoding_spec.rb25
-rw-r--r--spec/ruby/library/stringio/fcntl_spec.rb8
-rw-r--r--spec/ruby/library/stringio/fileno_spec.rb9
-rw-r--r--spec/ruby/library/stringio/fixtures/classes.rb15
-rw-r--r--spec/ruby/library/stringio/flush_spec.rb9
-rw-r--r--spec/ruby/library/stringio/fsync_spec.rb9
-rw-r--r--spec/ruby/library/stringio/getbyte_spec.rb19
-rw-r--r--spec/ruby/library/stringio/getc_spec.rb19
-rw-r--r--spec/ruby/library/stringio/getch_spec.rb46
-rw-r--r--spec/ruby/library/stringio/gets_spec.rb247
-rw-r--r--spec/ruby/library/stringio/initialize_spec.rb185
-rw-r--r--spec/ruby/library/stringio/internal_encoding_spec.rb10
-rw-r--r--spec/ruby/library/stringio/isatty_spec.rb7
-rw-r--r--spec/ruby/library/stringio/length_spec.rb7
-rw-r--r--spec/ruby/library/stringio/lineno_spec.rb30
-rw-r--r--spec/ruby/library/stringio/lines_spec.rb21
-rw-r--r--spec/ruby/library/stringio/open_spec.rb207
-rw-r--r--spec/ruby/library/stringio/path_spec.rb8
-rw-r--r--spec/ruby/library/stringio/pid_spec.rb8
-rw-r--r--spec/ruby/library/stringio/pos_spec.rb28
-rw-r--r--spec/ruby/library/stringio/print_spec.rb100
-rw-r--r--spec/ruby/library/stringio/printf_spec.rb70
-rw-r--r--spec/ruby/library/stringio/putc_spec.rb88
-rw-r--r--spec/ruby/library/stringio/puts_spec.rb159
-rw-r--r--spec/ruby/library/stringio/read_nonblock_spec.rb29
-rw-r--r--spec/ruby/library/stringio/read_spec.rb62
-rw-r--r--spec/ruby/library/stringio/readbyte_spec.rb20
-rw-r--r--spec/ruby/library/stringio/readchar_spec.rb20
-rw-r--r--spec/ruby/library/stringio/readline_spec.rb131
-rw-r--r--spec/ruby/library/stringio/readlines_spec.rb101
-rw-r--r--spec/ruby/library/stringio/readpartial_spec.rb80
-rw-r--r--spec/ruby/library/stringio/reopen_spec.rb288
-rw-r--r--spec/ruby/library/stringio/rewind_spec.rb24
-rw-r--r--spec/ruby/library/stringio/seek_spec.rb67
-rw-r--r--spec/ruby/library/stringio/set_encoding_spec.rb10
-rw-r--r--spec/ruby/library/stringio/shared/codepoints.rb45
-rw-r--r--spec/ruby/library/stringio/shared/each.rb114
-rw-r--r--spec/ruby/library/stringio/shared/each_byte.rb48
-rw-r--r--spec/ruby/library/stringio/shared/each_char.rb36
-rw-r--r--spec/ruby/library/stringio/shared/eof.rb24
-rw-r--r--spec/ruby/library/stringio/shared/getc.rb43
-rw-r--r--spec/ruby/library/stringio/shared/isatty.rb5
-rw-r--r--spec/ruby/library/stringio/shared/length.rb5
-rw-r--r--spec/ruby/library/stringio/shared/read.rb121
-rw-r--r--spec/ruby/library/stringio/shared/readchar.rb29
-rw-r--r--spec/ruby/library/stringio/shared/sysread.rb15
-rw-r--r--spec/ruby/library/stringio/shared/tell.rb12
-rw-r--r--spec/ruby/library/stringio/shared/write.rb87
-rw-r--r--spec/ruby/library/stringio/size_spec.rb7
-rw-r--r--spec/ruby/library/stringio/string_spec.rb50
-rw-r--r--spec/ruby/library/stringio/stringio_spec.rb8
-rw-r--r--spec/ruby/library/stringio/sync_spec.rb19
-rw-r--r--spec/ruby/library/stringio/sysread_spec.rb48
-rw-r--r--spec/ruby/library/stringio/syswrite_spec.rb19
-rw-r--r--spec/ruby/library/stringio/tell_spec.rb7
-rw-r--r--spec/ruby/library/stringio/truncate_spec.rb70
-rw-r--r--spec/ruby/library/stringio/tty_spec.rb7
-rw-r--r--spec/ruby/library/stringio/ungetbyte_spec.rb6
-rw-r--r--spec/ruby/library/stringio/ungetc_spec.rb72
-rw-r--r--spec/ruby/library/stringio/write_nonblock_spec.rb19
-rw-r--r--spec/ruby/library/stringio/write_spec.rb19
-rw-r--r--spec/ruby/library/stringscanner/append_spec.rb11
-rw-r--r--spec/ruby/library/stringscanner/beginning_of_line_spec.rb7
-rw-r--r--spec/ruby/library/stringscanner/bol_spec.rb7
-rw-r--r--spec/ruby/library/stringscanner/check_spec.rb16
-rw-r--r--spec/ruby/library/stringscanner/check_until_spec.rb15
-rw-r--r--spec/ruby/library/stringscanner/clear_spec.rb20
-rw-r--r--spec/ruby/library/stringscanner/concat_spec.rb11
-rw-r--r--spec/ruby/library/stringscanner/dup_spec.rb39
-rw-r--r--spec/ruby/library/stringscanner/element_reference_spec.rb60
-rw-r--r--spec/ruby/library/stringscanner/empty_spec.rb20
-rw-r--r--spec/ruby/library/stringscanner/eos_spec.rb7
-rw-r--r--spec/ruby/library/stringscanner/exist_spec.rb24
-rw-r--r--spec/ruby/library/stringscanner/get_byte_spec.rb7
-rw-r--r--spec/ruby/library/stringscanner/getbyte_spec.rb23
-rw-r--r--spec/ruby/library/stringscanner/getch_spec.rb35
-rw-r--r--spec/ruby/library/stringscanner/initialize_spec.rb28
-rw-r--r--spec/ruby/library/stringscanner/inspect_spec.rb20
-rw-r--r--spec/ruby/library/stringscanner/match_spec.rb28
-rw-r--r--spec/ruby/library/stringscanner/matched_size_spec.rb7
-rw-r--r--spec/ruby/library/stringscanner/matched_spec.rb41
-rw-r--r--spec/ruby/library/stringscanner/must_C_version_spec.rb8
-rw-r--r--spec/ruby/library/stringscanner/peek_spec.rb7
-rw-r--r--spec/ruby/library/stringscanner/peep_spec.rb20
-rw-r--r--spec/ruby/library/stringscanner/pointer_spec.rb11
-rw-r--r--spec/ruby/library/stringscanner/pos_spec.rb11
-rw-r--r--spec/ruby/library/stringscanner/post_match_spec.rb28
-rw-r--r--spec/ruby/library/stringscanner/pre_match_spec.rb41
-rw-r--r--spec/ruby/library/stringscanner/reset_spec.rb15
-rw-r--r--spec/ruby/library/stringscanner/rest_size_spec.rb7
-rw-r--r--spec/ruby/library/stringscanner/rest_spec.rb48
-rw-r--r--spec/ruby/library/stringscanner/restsize_spec.rb20
-rw-r--r--spec/ruby/library/stringscanner/scan_full_spec.rb30
-rw-r--r--spec/ruby/library/stringscanner/scan_spec.rb43
-rw-r--r--spec/ruby/library/stringscanner/scan_until_spec.rb23
-rw-r--r--spec/ruby/library/stringscanner/search_full_spec.rb30
-rw-r--r--spec/ruby/library/stringscanner/shared/bol.rb25
-rw-r--r--spec/ruby/library/stringscanner/shared/concat.rb30
-rw-r--r--spec/ruby/library/stringscanner/shared/eos.rb17
-rw-r--r--spec/ruby/library/stringscanner/shared/extract_range.rb22
-rw-r--r--spec/ruby/library/stringscanner/shared/extract_range_matched.rb22
-rw-r--r--spec/ruby/library/stringscanner/shared/get_byte.rb29
-rw-r--r--spec/ruby/library/stringscanner/shared/matched_size.rb21
-rw-r--r--spec/ruby/library/stringscanner/shared/peek.rb47
-rw-r--r--spec/ruby/library/stringscanner/shared/pos.rb52
-rw-r--r--spec/ruby/library/stringscanner/shared/rest_size.rb18
-rw-r--r--spec/ruby/library/stringscanner/shared/terminate.rb8
-rw-r--r--spec/ruby/library/stringscanner/skip_spec.rb18
-rw-r--r--spec/ruby/library/stringscanner/skip_until_spec.rb18
-rw-r--r--spec/ruby/library/stringscanner/string_spec.rb40
-rw-r--r--spec/ruby/library/stringscanner/terminate_spec.rb7
-rw-r--r--spec/ruby/library/stringscanner/unscan_spec.rb28
-rw-r--r--spec/ruby/library/syslog/alert_spec.rb10
-rw-r--r--spec/ruby/library/syslog/close_spec.rb58
-rw-r--r--spec/ruby/library/syslog/constants_spec.rb41
-rw-r--r--spec/ruby/library/syslog/crit_spec.rb10
-rw-r--r--spec/ruby/library/syslog/debug_spec.rb10
-rw-r--r--spec/ruby/library/syslog/emerg_spec.rb16
-rw-r--r--spec/ruby/library/syslog/err_spec.rb10
-rw-r--r--spec/ruby/library/syslog/facility_spec.rb48
-rw-r--r--spec/ruby/library/syslog/ident_spec.rb35
-rw-r--r--spec/ruby/library/syslog/info_spec.rb10
-rw-r--r--spec/ruby/library/syslog/inspect_spec.rb39
-rw-r--r--spec/ruby/library/syslog/instance_spec.rb13
-rw-r--r--spec/ruby/library/syslog/log_spec.rb56
-rw-r--r--spec/ruby/library/syslog/mask_spec.rb113
-rw-r--r--spec/ruby/library/syslog/notice_spec.rb10
-rw-r--r--spec/ruby/library/syslog/open_spec.rb92
-rw-r--r--spec/ruby/library/syslog/opened_spec.rb39
-rw-r--r--spec/ruby/library/syslog/options_spec.rb48
-rw-r--r--spec/ruby/library/syslog/reopen_spec.rb10
-rw-r--r--spec/ruby/library/syslog/shared/log.rb40
-rw-r--r--spec/ruby/library/syslog/shared/reopen.rb40
-rw-r--r--spec/ruby/library/syslog/warning_spec.rb10
-rw-r--r--spec/ruby/library/tempfile/_close_spec.rb21
-rw-r--r--spec/ruby/library/tempfile/callback_spec.rb6
-rw-r--r--spec/ruby/library/tempfile/close_spec.rb57
-rw-r--r--spec/ruby/library/tempfile/delete_spec.rb7
-rw-r--r--spec/ruby/library/tempfile/initialize_spec.rb41
-rw-r--r--spec/ruby/library/tempfile/length_spec.rb7
-rw-r--r--spec/ruby/library/tempfile/open_spec.rb89
-rw-r--r--spec/ruby/library/tempfile/path_spec.rb26
-rw-r--r--spec/ruby/library/tempfile/shared/length.rb21
-rw-r--r--spec/ruby/library/tempfile/shared/unlink.rb12
-rw-r--r--spec/ruby/library/tempfile/size_spec.rb7
-rw-r--r--spec/ruby/library/tempfile/unlink_spec.rb7
-rw-r--r--spec/ruby/library/thread/queue_spec.rb8
-rw-r--r--spec/ruby/library/thread/sizedqueue_spec.rb8
-rw-r--r--spec/ruby/library/time/httpdate_spec.rb21
-rw-r--r--spec/ruby/library/time/iso8601_spec.rb7
-rw-r--r--spec/ruby/library/time/rfc2822_spec.rb7
-rw-r--r--spec/ruby/library/time/rfc822_spec.rb7
-rw-r--r--spec/ruby/library/time/shared/rfc2822.rb65
-rw-r--r--spec/ruby/library/time/shared/xmlschema.rb53
-rw-r--r--spec/ruby/library/time/to_date_spec.rb42
-rw-r--r--spec/ruby/library/time/to_datetime_spec.rb27
-rw-r--r--spec/ruby/library/time/to_time_spec.rb17
-rw-r--r--spec/ruby/library/time/xmlschema_spec.rb7
-rw-r--r--spec/ruby/library/timeout/error_spec.rb8
-rw-r--r--spec/ruby/library/timeout/timeout_spec.rb37
-rw-r--r--spec/ruby/library/tmpdir/dir/mktmpdir_spec.rb117
-rw-r--r--spec/ruby/library/tmpdir/dir/tmpdir_spec.rb10
-rw-r--r--spec/ruby/library/uri/decode_www_form_component_spec.rb6
-rw-r--r--spec/ruby/library/uri/decode_www_form_spec.rb6
-rw-r--r--spec/ruby/library/uri/encode_www_form_component_spec.rb6
-rw-r--r--spec/ruby/library/uri/encode_www_form_spec.rb6
-rw-r--r--spec/ruby/library/uri/eql_spec.rb10
-rw-r--r--spec/ruby/library/uri/equality_spec.rb46
-rw-r--r--spec/ruby/library/uri/escape/decode_spec.rb6
-rw-r--r--spec/ruby/library/uri/escape/encode_spec.rb6
-rw-r--r--spec/ruby/library/uri/escape/escape_spec.rb6
-rw-r--r--spec/ruby/library/uri/escape/unescape_spec.rb6
-rw-r--r--spec/ruby/library/uri/extract_spec.rb86
-rw-r--r--spec/ruby/library/uri/fixtures/classes.rb11
-rw-r--r--spec/ruby/library/uri/fixtures/normalization.rb54
-rw-r--r--spec/ruby/library/uri/ftp/build_spec.rb6
-rw-r--r--spec/ruby/library/uri/ftp/merge_spec.rb6
-rw-r--r--spec/ruby/library/uri/ftp/new2_spec.rb6
-rw-r--r--spec/ruby/library/uri/ftp/path_spec.rb26
-rw-r--r--spec/ruby/library/uri/ftp/set_typecode_spec.rb6
-rw-r--r--spec/ruby/library/uri/ftp/to_s_spec.rb15
-rw-r--r--spec/ruby/library/uri/ftp/typecode_spec.rb10
-rw-r--r--spec/ruby/library/uri/generic/absolute_spec.rb10
-rw-r--r--spec/ruby/library/uri/generic/build2_spec.rb6
-rw-r--r--spec/ruby/library/uri/generic/build_spec.rb6
-rw-r--r--spec/ruby/library/uri/generic/coerce_spec.rb6
-rw-r--r--spec/ruby/library/uri/generic/component_ary_spec.rb6
-rw-r--r--spec/ruby/library/uri/generic/component_spec.rb10
-rw-r--r--spec/ruby/library/uri/generic/default_port_spec.rb10
-rw-r--r--spec/ruby/library/uri/generic/eql_spec.rb6
-rw-r--r--spec/ruby/library/uri/generic/equal_value_spec.rb6
-rw-r--r--spec/ruby/library/uri/generic/fragment_spec.rb10
-rw-r--r--spec/ruby/library/uri/generic/hash_spec.rb6
-rw-r--r--spec/ruby/library/uri/generic/hierarchical_spec.rb6
-rw-r--r--spec/ruby/library/uri/generic/host_spec.rb10
-rw-r--r--spec/ruby/library/uri/generic/inspect_spec.rb6
-rw-r--r--spec/ruby/library/uri/generic/merge_spec.rb10
-rw-r--r--spec/ruby/library/uri/generic/minus_spec.rb6
-rw-r--r--spec/ruby/library/uri/generic/normalize_spec.rb10
-rw-r--r--spec/ruby/library/uri/generic/opaque_spec.rb10
-rw-r--r--spec/ruby/library/uri/generic/password_spec.rb10
-rw-r--r--spec/ruby/library/uri/generic/path_spec.rb10
-rw-r--r--spec/ruby/library/uri/generic/plus_spec.rb6
-rw-r--r--spec/ruby/library/uri/generic/port_spec.rb10
-rw-r--r--spec/ruby/library/uri/generic/query_spec.rb10
-rw-r--r--spec/ruby/library/uri/generic/registry_spec.rb10
-rw-r--r--spec/ruby/library/uri/generic/relative_spec.rb6
-rw-r--r--spec/ruby/library/uri/generic/route_from_spec.rb6
-rw-r--r--spec/ruby/library/uri/generic/route_to_spec.rb6
-rw-r--r--spec/ruby/library/uri/generic/scheme_spec.rb10
-rw-r--r--spec/ruby/library/uri/generic/select_spec.rb6
-rw-r--r--spec/ruby/library/uri/generic/set_fragment_spec.rb6
-rw-r--r--spec/ruby/library/uri/generic/set_host_spec.rb6
-rw-r--r--spec/ruby/library/uri/generic/set_opaque_spec.rb6
-rw-r--r--spec/ruby/library/uri/generic/set_password_spec.rb6
-rw-r--r--spec/ruby/library/uri/generic/set_path_spec.rb6
-rw-r--r--spec/ruby/library/uri/generic/set_port_spec.rb6
-rw-r--r--spec/ruby/library/uri/generic/set_query_spec.rb6
-rw-r--r--spec/ruby/library/uri/generic/set_registry_spec.rb6
-rw-r--r--spec/ruby/library/uri/generic/set_scheme_spec.rb6
-rw-r--r--spec/ruby/library/uri/generic/set_user_spec.rb6
-rw-r--r--spec/ruby/library/uri/generic/set_userinfo_spec.rb6
-rw-r--r--spec/ruby/library/uri/generic/to_s_spec.rb6
-rw-r--r--spec/ruby/library/uri/generic/use_registry_spec.rb6
-rw-r--r--spec/ruby/library/uri/generic/user_spec.rb10
-rw-r--r--spec/ruby/library/uri/generic/userinfo_spec.rb10
-rw-r--r--spec/ruby/library/uri/http/build_spec.rb6
-rw-r--r--spec/ruby/library/uri/http/request_uri_spec.rb16
-rw-r--r--spec/ruby/library/uri/join_spec.rb59
-rw-r--r--spec/ruby/library/uri/ldap/attributes_spec.rb10
-rw-r--r--spec/ruby/library/uri/ldap/build_spec.rb6
-rw-r--r--spec/ruby/library/uri/ldap/dn_spec.rb10
-rw-r--r--spec/ruby/library/uri/ldap/extensions_spec.rb10
-rw-r--r--spec/ruby/library/uri/ldap/filter_spec.rb10
-rw-r--r--spec/ruby/library/uri/ldap/hierarchical_spec.rb6
-rw-r--r--spec/ruby/library/uri/ldap/scope_spec.rb10
-rw-r--r--spec/ruby/library/uri/ldap/set_attributes_spec.rb6
-rw-r--r--spec/ruby/library/uri/ldap/set_dn_spec.rb6
-rw-r--r--spec/ruby/library/uri/ldap/set_extensions_spec.rb6
-rw-r--r--spec/ruby/library/uri/ldap/set_filter_spec.rb6
-rw-r--r--spec/ruby/library/uri/ldap/set_scope_spec.rb6
-rw-r--r--spec/ruby/library/uri/mailto/build_spec.rb98
-rw-r--r--spec/ruby/library/uri/mailto/headers_spec.rb10
-rw-r--r--spec/ruby/library/uri/mailto/set_headers_spec.rb6
-rw-r--r--spec/ruby/library/uri/mailto/set_to_spec.rb6
-rw-r--r--spec/ruby/library/uri/mailto/to_mailtext_spec.rb6
-rw-r--r--spec/ruby/library/uri/mailto/to_rfc822text_spec.rb6
-rw-r--r--spec/ruby/library/uri/mailto/to_s_spec.rb6
-rw-r--r--spec/ruby/library/uri/mailto/to_spec.rb10
-rw-r--r--spec/ruby/library/uri/merge_spec.rb20
-rw-r--r--spec/ruby/library/uri/normalize_spec.rb35
-rw-r--r--spec/ruby/library/uri/parse_spec.rb203
-rw-r--r--spec/ruby/library/uri/parser/escape_spec.rb6
-rw-r--r--spec/ruby/library/uri/parser/extract_spec.rb7
-rw-r--r--spec/ruby/library/uri/parser/inspect_spec.rb6
-rw-r--r--spec/ruby/library/uri/parser/join_spec.rb7
-rw-r--r--spec/ruby/library/uri/parser/make_regexp_spec.rb6
-rw-r--r--spec/ruby/library/uri/parser/parse_spec.rb7
-rw-r--r--spec/ruby/library/uri/parser/split_spec.rb6
-rw-r--r--spec/ruby/library/uri/parser/unescape_spec.rb6
-rw-r--r--spec/ruby/library/uri/plus_spec.rb459
-rw-r--r--spec/ruby/library/uri/regexp_spec.rb18
-rw-r--r--spec/ruby/library/uri/route_from_spec.rb23
-rw-r--r--spec/ruby/library/uri/route_to_spec.rb26
-rw-r--r--spec/ruby/library/uri/select_spec.rb31
-rw-r--r--spec/ruby/library/uri/set_component_spec.rb45
-rw-r--r--spec/ruby/library/uri/shared/eql.rb17
-rw-r--r--spec/ruby/library/uri/shared/extract.rb83
-rw-r--r--spec/ruby/library/uri/shared/join.rb56
-rw-r--r--spec/ruby/library/uri/shared/parse.rb199
-rw-r--r--spec/ruby/library/uri/split_spec.rb6
-rw-r--r--spec/ruby/library/uri/uri_spec.rb29
-rw-r--r--spec/ruby/library/uri/util/make_components_hash_spec.rb6
-rw-r--r--spec/ruby/library/weakref/__getobj___spec.rb17
-rw-r--r--spec/ruby/library/weakref/allocate_spec.rb8
-rw-r--r--spec/ruby/library/weakref/fixtures/classes.rb24
-rw-r--r--spec/ruby/library/weakref/new_spec.rb13
-rw-r--r--spec/ruby/library/weakref/send_spec.rb37
-rw-r--r--spec/ruby/library/weakref/weakref_alive_spec.rb15
-rw-r--r--spec/ruby/library/win32ole/fixtures/classes.rb22
-rw-r--r--spec/ruby/library/win32ole/fixtures/event.xml4
-rw-r--r--spec/ruby/library/win32ole/win32ole/_getproperty_spec.rb14
-rw-r--r--spec/ruby/library/win32ole/win32ole/_invoke_spec.rb21
-rw-r--r--spec/ruby/library/win32ole/win32ole/codepage_spec.rb13
-rw-r--r--spec/ruby/library/win32ole/win32ole/connect_spec.rb15
-rw-r--r--spec/ruby/library/win32ole/win32ole/const_load_spec.rb32
-rw-r--r--spec/ruby/library/win32ole/win32ole/constants_spec.rb42
-rw-r--r--spec/ruby/library/win32ole/win32ole/create_guid_spec.rb9
-rw-r--r--spec/ruby/library/win32ole/win32ole/invoke_spec.rb14
-rw-r--r--spec/ruby/library/win32ole/win32ole/locale_spec.rb29
-rw-r--r--spec/ruby/library/win32ole/win32ole/new_spec.rb25
-rw-r--r--spec/ruby/library/win32ole/win32ole/ole_func_methods_spec.rb21
-rw-r--r--spec/ruby/library/win32ole/win32ole/ole_get_methods_spec.rb16
-rw-r--r--spec/ruby/library/win32ole/win32ole/ole_method_help_spec.rb10
-rw-r--r--spec/ruby/library/win32ole/win32ole/ole_method_spec.rb10
-rw-r--r--spec/ruby/library/win32ole/win32ole/ole_methods_spec.rb21
-rw-r--r--spec/ruby/library/win32ole/win32ole/ole_obj_help_spec.rb18
-rw-r--r--spec/ruby/library/win32ole/win32ole/ole_put_methods_spec.rb21
-rw-r--r--spec/ruby/library/win32ole/win32ole/setproperty_spec.rb10
-rw-r--r--spec/ruby/library/win32ole/win32ole/shared/ole_method.rb19
-rw-r--r--spec/ruby/library/win32ole/win32ole/shared/setproperty.rb23
-rw-r--r--spec/ruby/library/win32ole/win32ole_event/new_spec.rb33
-rw-r--r--spec/ruby/library/win32ole/win32ole_event/on_event_spec.rb70
-rw-r--r--spec/ruby/library/win32ole/win32ole_method/dispid_spec.rb20
-rw-r--r--spec/ruby/library/win32ole/win32ole_method/event_interface_spec.rb28
-rw-r--r--spec/ruby/library/win32ole/win32ole_method/event_spec.rb22
-rw-r--r--spec/ruby/library/win32ole/win32ole_method/helpcontext_spec.rb26
-rw-r--r--spec/ruby/library/win32ole/win32ole_method/helpfile_spec.rb20
-rw-r--r--spec/ruby/library/win32ole/win32ole_method/helpstring_spec.rb20
-rw-r--r--spec/ruby/library/win32ole/win32ole_method/invkind_spec.rb20
-rw-r--r--spec/ruby/library/win32ole/win32ole_method/invoke_kind_spec.rb20
-rw-r--r--spec/ruby/library/win32ole/win32ole_method/name_spec.rb11
-rw-r--r--spec/ruby/library/win32ole/win32ole_method/new_spec.rb33
-rw-r--r--spec/ruby/library/win32ole/win32ole_method/offset_vtbl_spec.rb21
-rw-r--r--spec/ruby/library/win32ole/win32ole_method/params_spec.rb28
-rw-r--r--spec/ruby/library/win32ole/win32ole_method/return_type_detail_spec.rb21
-rw-r--r--spec/ruby/library/win32ole/win32ole_method/return_type_spec.rb20
-rw-r--r--spec/ruby/library/win32ole/win32ole_method/return_vtype_spec.rb20
-rw-r--r--spec/ruby/library/win32ole/win32ole_method/shared/name.rb20
-rw-r--r--spec/ruby/library/win32ole/win32ole_method/size_opt_params_spec.rb20
-rw-r--r--spec/ruby/library/win32ole/win32ole_method/size_params_spec.rb20
-rw-r--r--spec/ruby/library/win32ole/win32ole_method/to_s_spec.rb11
-rw-r--r--spec/ruby/library/win32ole/win32ole_method/visible_spec.rb20
-rw-r--r--spec/ruby/library/win32ole/win32ole_param/default_spec.rb31
-rw-r--r--spec/ruby/library/win32ole/win32ole_param/input_spec.rb21
-rw-r--r--spec/ruby/library/win32ole/win32ole_param/name_spec.rb11
-rw-r--r--spec/ruby/library/win32ole/win32ole_param/ole_type_detail_spec.rb21
-rw-r--r--spec/ruby/library/win32ole/win32ole_param/ole_type_spec.rb21
-rw-r--r--spec/ruby/library/win32ole/win32ole_param/optional_spec.rb21
-rw-r--r--spec/ruby/library/win32ole/win32ole_param/retval_spec.rb21
-rw-r--r--spec/ruby/library/win32ole/win32ole_param/shared/name.rb21
-rw-r--r--spec/ruby/library/win32ole/win32ole_param/to_s_spec.rb11
-rw-r--r--spec/ruby/library/win32ole/win32ole_type/guid_spec.rb18
-rw-r--r--spec/ruby/library/win32ole/win32ole_type/helpcontext_spec.rb18
-rw-r--r--spec/ruby/library/win32ole/win32ole_type/helpfile_spec.rb18
-rw-r--r--spec/ruby/library/win32ole/win32ole_type/helpstring_spec.rb18
-rw-r--r--spec/ruby/library/win32ole/win32ole_type/major_version_spec.rb18
-rw-r--r--spec/ruby/library/win32ole/win32ole_type/minor_version_spec.rb18
-rw-r--r--spec/ruby/library/win32ole/win32ole_type/name_spec.rb11
-rw-r--r--spec/ruby/library/win32ole/win32ole_type/new_spec.rb37
-rw-r--r--spec/ruby/library/win32ole/win32ole_type/ole_classes_spec.rb18
-rw-r--r--spec/ruby/library/win32ole/win32ole_type/ole_methods_spec.rb18
-rw-r--r--spec/ruby/library/win32ole/win32ole_type/ole_type_spec.rb18
-rw-r--r--spec/ruby/library/win32ole/win32ole_type/progid_spec.rb18
-rw-r--r--spec/ruby/library/win32ole/win32ole_type/progids_spec.rb14
-rw-r--r--spec/ruby/library/win32ole/win32ole_type/shared/name.rb19
-rw-r--r--spec/ruby/library/win32ole/win32ole_type/src_type_spec.rb18
-rw-r--r--spec/ruby/library/win32ole/win32ole_type/to_s_spec.rb11
-rw-r--r--spec/ruby/library/win32ole/win32ole_type/typekind_spec.rb18
-rw-r--r--spec/ruby/library/win32ole/win32ole_type/typelibs_spec.rb22
-rw-r--r--spec/ruby/library/win32ole/win32ole_type/variables_spec.rb18
-rw-r--r--spec/ruby/library/win32ole/win32ole_type/visible_spec.rb18
-rw-r--r--spec/ruby/library/win32ole/win32ole_variable/name_spec.rb11
-rw-r--r--spec/ruby/library/win32ole/win32ole_variable/ole_type_detail_spec.rb19
-rw-r--r--spec/ruby/library/win32ole/win32ole_variable/ole_type_spec.rb18
-rw-r--r--spec/ruby/library/win32ole/win32ole_variable/shared/name.rb18
-rw-r--r--spec/ruby/library/win32ole/win32ole_variable/to_s_spec.rb11
-rw-r--r--spec/ruby/library/win32ole/win32ole_variable/value_spec.rb19
-rw-r--r--spec/ruby/library/win32ole/win32ole_variable/variable_kind_spec.rb19
-rw-r--r--spec/ruby/library/win32ole/win32ole_variable/varkind_spec.rb19
-rw-r--r--spec/ruby/library/win32ole/win32ole_variable/visible_spec.rb18
-rw-r--r--spec/ruby/library/yaml/add_builtin_type_spec.rb2
-rw-r--r--spec/ruby/library/yaml/add_domain_type_spec.rb2
-rw-r--r--spec/ruby/library/yaml/add_private_type_spec.rb2
-rw-r--r--spec/ruby/library/yaml/add_ruby_type_spec.rb2
-rw-r--r--spec/ruby/library/yaml/detect_implicit_spec.rb2
-rw-r--r--spec/ruby/library/yaml/dump_spec.rb51
-rw-r--r--spec/ruby/library/yaml/dump_stream_spec.rb8
-rw-r--r--spec/ruby/library/yaml/each_node_spec.rb2
-rw-r--r--spec/ruby/library/yaml/emitter_spec.rb2
-rw-r--r--spec/ruby/library/yaml/fixtures/common.rb10
-rw-r--r--spec/ruby/library/yaml/fixtures/example_class.rb5
-rw-r--r--spec/ruby/library/yaml/fixtures/strings.rb36
-rw-r--r--spec/ruby/library/yaml/fixtures/test_yaml.yml2
-rw-r--r--spec/ruby/library/yaml/generic_parser_spec.rb2
-rw-r--r--spec/ruby/library/yaml/load_documents_spec.rb10
-rw-r--r--spec/ruby/library/yaml/load_file_spec.rb13
-rw-r--r--spec/ruby/library/yaml/load_spec.rb137
-rw-r--r--spec/ruby/library/yaml/load_stream_spec.rb8
-rw-r--r--spec/ruby/library/yaml/object_maker_spec.rb2
-rw-r--r--spec/ruby/library/yaml/parse_documents_spec.rb2
-rw-r--r--spec/ruby/library/yaml/parse_file_spec.rb10
-rw-r--r--spec/ruby/library/yaml/parse_spec.rb22
-rw-r--r--spec/ruby/library/yaml/parser_spec.rb2
-rw-r--r--spec/ruby/library/yaml/quick_emit_spec.rb2
-rw-r--r--spec/ruby/library/yaml/read_type_class_spec.rb2
-rw-r--r--spec/ruby/library/yaml/shared/each_document.rb18
-rw-r--r--spec/ruby/library/yaml/tagurize_spec.rb11
-rw-r--r--spec/ruby/library/yaml/to_yaml_spec.rb99
-rw-r--r--spec/ruby/library/yaml/transfer_spec.rb2
-rw-r--r--spec/ruby/library/yaml/try_implicit_spec.rb2
-rw-r--r--spec/ruby/library/zlib/adler32_spec.rb46
-rw-r--r--spec/ruby/library/zlib/crc32_spec.rb54
-rw-r--r--spec/ruby/library/zlib/crc_table_spec.rb75
-rw-r--r--spec/ruby/library/zlib/deflate/append_spec.rb1
-rw-r--r--spec/ruby/library/zlib/deflate/deflate_spec.rb128
-rw-r--r--spec/ruby/library/zlib/deflate/flush_spec.rb1
-rw-r--r--spec/ruby/library/zlib/deflate/new_spec.rb1
-rw-r--r--spec/ruby/library/zlib/deflate/params_spec.rb17
-rw-r--r--spec/ruby/library/zlib/deflate/set_dictionary_spec.rb14
-rw-r--r--spec/ruby/library/zlib/deflate_spec.rb8
-rw-r--r--spec/ruby/library/zlib/gzipfile/close_spec.rb21
-rw-r--r--spec/ruby/library/zlib/gzipfile/closed_spec.rb16
-rw-r--r--spec/ruby/library/zlib/gzipfile/comment_spec.rb26
-rw-r--r--spec/ruby/library/zlib/gzipfile/crc_spec.rb1
-rw-r--r--spec/ruby/library/zlib/gzipfile/finish_spec.rb1
-rw-r--r--spec/ruby/library/zlib/gzipfile/level_spec.rb1
-rw-r--r--spec/ruby/library/zlib/gzipfile/mtime_spec.rb1
-rw-r--r--spec/ruby/library/zlib/gzipfile/orig_name_spec.rb26
-rw-r--r--spec/ruby/library/zlib/gzipfile/os_code_spec.rb1
-rw-r--r--spec/ruby/library/zlib/gzipfile/sync_spec.rb1
-rw-r--r--spec/ruby/library/zlib/gzipfile/to_io_spec.rb1
-rw-r--r--spec/ruby/library/zlib/gzipfile/wrap_spec.rb1
-rw-r--r--spec/ruby/library/zlib/gzipreader/each_byte_spec.rb51
-rw-r--r--spec/ruby/library/zlib/gzipreader/each_line_spec.rb5
-rw-r--r--spec/ruby/library/zlib/gzipreader/each_spec.rb5
-rw-r--r--spec/ruby/library/zlib/gzipreader/eof_spec.rb56
-rw-r--r--spec/ruby/library/zlib/gzipreader/getc_spec.rb41
-rw-r--r--spec/ruby/library/zlib/gzipreader/gets_spec.rb22
-rw-r--r--spec/ruby/library/zlib/gzipreader/lineno_spec.rb1
-rw-r--r--spec/ruby/library/zlib/gzipreader/new_spec.rb1
-rw-r--r--spec/ruby/library/zlib/gzipreader/open_spec.rb1
-rw-r--r--spec/ruby/library/zlib/gzipreader/pos_spec.rb26
-rw-r--r--spec/ruby/library/zlib/gzipreader/read_spec.rb68
-rw-r--r--spec/ruby/library/zlib/gzipreader/readchar_spec.rb1
-rw-r--r--spec/ruby/library/zlib/gzipreader/readline_spec.rb1
-rw-r--r--spec/ruby/library/zlib/gzipreader/readlines_spec.rb1
-rw-r--r--spec/ruby/library/zlib/gzipreader/readpartial_spec.rb17
-rw-r--r--spec/ruby/library/zlib/gzipreader/rewind_spec.rb48
-rw-r--r--spec/ruby/library/zlib/gzipreader/shared/each.rb51
-rw-r--r--spec/ruby/library/zlib/gzipreader/tell_spec.rb1
-rw-r--r--spec/ruby/library/zlib/gzipreader/ungetbyte_spec.rb122
-rw-r--r--spec/ruby/library/zlib/gzipreader/ungetc_spec.rb292
-rw-r--r--spec/ruby/library/zlib/gzipreader/unused_spec.rb1
-rw-r--r--spec/ruby/library/zlib/gzipwriter/append_spec.rb17
-rw-r--r--spec/ruby/library/zlib/gzipwriter/comment_spec.rb1
-rw-r--r--spec/ruby/library/zlib/gzipwriter/flush_spec.rb1
-rw-r--r--spec/ruby/library/zlib/gzipwriter/mtime_spec.rb38
-rw-r--r--spec/ruby/library/zlib/gzipwriter/new_spec.rb1
-rw-r--r--spec/ruby/library/zlib/gzipwriter/open_spec.rb1
-rw-r--r--spec/ruby/library/zlib/gzipwriter/orig_name_spec.rb1
-rw-r--r--spec/ruby/library/zlib/gzipwriter/pos_spec.rb1
-rw-r--r--spec/ruby/library/zlib/gzipwriter/print_spec.rb1
-rw-r--r--spec/ruby/library/zlib/gzipwriter/printf_spec.rb1
-rw-r--r--spec/ruby/library/zlib/gzipwriter/putc_spec.rb1
-rw-r--r--spec/ruby/library/zlib/gzipwriter/puts_spec.rb1
-rw-r--r--spec/ruby/library/zlib/gzipwriter/tell_spec.rb1
-rw-r--r--spec/ruby/library/zlib/gzipwriter/write_spec.rb36
-rw-r--r--spec/ruby/library/zlib/inflate/append_spec.rb60
-rw-r--r--spec/ruby/library/zlib/inflate/finish_spec.rb28
-rw-r--r--spec/ruby/library/zlib/inflate/inflate_spec.rb152
-rw-r--r--spec/ruby/library/zlib/inflate/new_spec.rb1
-rw-r--r--spec/ruby/library/zlib/inflate/set_dictionary_spec.rb20
-rw-r--r--spec/ruby/library/zlib/inflate/sync_point_spec.rb1
-rw-r--r--spec/ruby/library/zlib/inflate/sync_spec.rb1
-rw-r--r--spec/ruby/library/zlib/inflate_spec.rb8
-rw-r--r--spec/ruby/library/zlib/zlib_version_spec.rb1
-rw-r--r--spec/ruby/library/zlib/zstream/adler_spec.rb11
-rw-r--r--spec/ruby/library/zlib/zstream/avail_in_spec.rb9
-rw-r--r--spec/ruby/library/zlib/zstream/avail_out_spec.rb9
-rw-r--r--spec/ruby/library/zlib/zstream/close_spec.rb1
-rw-r--r--spec/ruby/library/zlib/zstream/closed_spec.rb1
-rw-r--r--spec/ruby/library/zlib/zstream/data_type_spec.rb9
-rw-r--r--spec/ruby/library/zlib/zstream/end_spec.rb1
-rw-r--r--spec/ruby/library/zlib/zstream/ended_spec.rb1
-rw-r--r--spec/ruby/library/zlib/zstream/finish_spec.rb1
-rw-r--r--spec/ruby/library/zlib/zstream/finished_spec.rb1
-rw-r--r--spec/ruby/library/zlib/zstream/flush_next_in_spec.rb1
-rw-r--r--spec/ruby/library/zlib/zstream/flush_next_out_spec.rb14
-rw-r--r--spec/ruby/library/zlib/zstream/reset_spec.rb1
-rw-r--r--spec/ruby/library/zlib/zstream/stream_end_spec.rb1
-rw-r--r--spec/ruby/library/zlib/zstream/total_in_spec.rb1
-rw-r--r--spec/ruby/library/zlib/zstream/total_out_spec.rb1
-rw-r--r--spec/ruby/optional/capi/README16
-rw-r--r--spec/ruby/optional/capi/array_spec.rb463
-rw-r--r--spec/ruby/optional/capi/bignum_spec.rb214
-rw-r--r--spec/ruby/optional/capi/boolean_spec.rb33
-rw-r--r--spec/ruby/optional/capi/class_spec.rb376
-rw-r--r--spec/ruby/optional/capi/complex_spec.rb45
-rw-r--r--spec/ruby/optional/capi/constants_spec.rb270
-rw-r--r--spec/ruby/optional/capi/data_spec.rb41
-rw-r--r--spec/ruby/optional/capi/encoding_spec.rb479
-rw-r--r--spec/ruby/optional/capi/enumerator_spec.rb66
-rw-r--r--spec/ruby/optional/capi/exception_spec.rb58
-rw-r--r--spec/ruby/optional/capi/ext/.gitignore9
-rw-r--r--spec/ruby/optional/capi/ext/array_spec.c452
-rw-r--r--spec/ruby/optional/capi/ext/bignum_spec.c149
-rw-r--r--spec/ruby/optional/capi/ext/boolean_spec.c34
-rw-r--r--spec/ruby/optional/capi/ext/class_id_under_autoload_spec.c5
-rw-r--r--spec/ruby/optional/capi/ext/class_spec.c261
-rw-r--r--spec/ruby/optional/capi/ext/class_under_autoload_spec.c5
-rw-r--r--spec/ruby/optional/capi/ext/complex_spec.c76
-rw-r--r--spec/ruby/optional/capi/ext/constants_spec.c646
-rw-r--r--spec/ruby/optional/capi/ext/data_spec.c90
-rw-r--r--spec/ruby/optional/capi/ext/encoding_spec.c417
-rw-r--r--spec/ruby/optional/capi/ext/enumerator_spec.c42
-rw-r--r--spec/ruby/optional/capi/ext/exception_spec.c72
-rw-r--r--spec/ruby/optional/capi/ext/file_spec.c44
-rw-r--r--spec/ruby/optional/capi/ext/fixnum_spec.c52
-rw-r--r--spec/ruby/optional/capi/ext/float_spec.c54
-rw-r--r--spec/ruby/optional/capi/ext/gc_spec.c72
-rw-r--r--spec/ruby/optional/capi/ext/globals_spec.c199
-rw-r--r--spec/ruby/optional/capi/ext/hash_spec.c218
-rw-r--r--spec/ruby/optional/capi/ext/integer_spec.c40
-rw-r--r--spec/ruby/optional/capi/ext/io_spec.c327
-rw-r--r--spec/ruby/optional/capi/ext/kernel_spec.c461
-rw-r--r--spec/ruby/optional/capi/ext/marshal_spec.c36
-rw-r--r--spec/ruby/optional/capi/ext/module_spec.c262
-rw-r--r--spec/ruby/optional/capi/ext/module_under_autoload_spec.c7
-rw-r--r--spec/ruby/optional/capi/ext/mutex_spec.c91
-rw-r--r--spec/ruby/optional/capi/ext/numeric_spec.c217
-rw-r--r--spec/ruby/optional/capi/ext/object_spec.c646
-rw-r--r--spec/ruby/optional/capi/ext/proc_spec.c85
-rw-r--r--spec/ruby/optional/capi/ext/range_spec.c66
-rw-r--r--spec/ruby/optional/capi/ext/rational_spec.c95
-rw-r--r--spec/ruby/optional/capi/ext/regexp_spec.c84
-rw-r--r--spec/ruby/optional/capi/ext/rubyspec.h624
-rw-r--r--spec/ruby/optional/capi/ext/st_spec.c93
-rw-r--r--spec/ruby/optional/capi/ext/string_spec.c750
-rw-r--r--spec/ruby/optional/capi/ext/struct_spec.c131
-rw-r--r--spec/ruby/optional/capi/ext/symbol_spec.c138
-rw-r--r--spec/ruby/optional/capi/ext/thread_spec.c188
-rw-r--r--spec/ruby/optional/capi/ext/time_spec.c127
-rw-r--r--spec/ruby/optional/capi/ext/typed_data_spec.c170
-rw-r--r--spec/ruby/optional/capi/ext/util_spec.c95
-rw-r--r--spec/ruby/optional/capi/file_spec.rb89
-rw-r--r--spec/ruby/optional/capi/fixnum_spec.rb124
-rw-r--r--spec/ruby/optional/capi/fixtures/class.rb91
-rw-r--r--spec/ruby/optional/capi/fixtures/const_get.rb5
-rw-r--r--spec/ruby/optional/capi/fixtures/const_get_at.rb5
-rw-r--r--spec/ruby/optional/capi/fixtures/const_get_from.rb5
-rw-r--r--spec/ruby/optional/capi/fixtures/const_get_object.rb3
-rw-r--r--spec/ruby/optional/capi/fixtures/encoding.rb3
-rw-r--r--spec/ruby/optional/capi/fixtures/foo.rb1
-rw-r--r--spec/ruby/optional/capi/fixtures/module.rb35
-rw-r--r--spec/ruby/optional/capi/fixtures/module_autoload.rb4
-rw-r--r--spec/ruby/optional/capi/fixtures/path_to_class.rb6
-rw-r--r--spec/ruby/optional/capi/fixtures/proc.rb20
-rw-r--r--spec/ruby/optional/capi/float_spec.rb30
-rw-r--r--spec/ruby/optional/capi/gc_spec.rb54
-rw-r--r--spec/ruby/optional/capi/globals_spec.rb224
-rw-r--r--spec/ruby/optional/capi/hash_spec.rb252
-rw-r--r--spec/ruby/optional/capi/integer_spec.rb275
-rw-r--r--spec/ruby/optional/capi/io_spec.rb347
-rw-r--r--spec/ruby/optional/capi/kernel_spec.rb539
-rw-r--r--spec/ruby/optional/capi/marshal_spec.rb46
-rw-r--r--spec/ruby/optional/capi/module_spec.rb373
-rw-r--r--spec/ruby/optional/capi/mutex_spec.rb88
-rw-r--r--spec/ruby/optional/capi/numeric_spec.rb489
-rw-r--r--spec/ruby/optional/capi/object_spec.rb857
-rw-r--r--spec/ruby/optional/capi/proc_spec.rb112
-rw-r--r--spec/ruby/optional/capi/rake_helper.rb22
-rw-r--r--spec/ruby/optional/capi/range_spec.rb95
-rw-r--r--spec/ruby/optional/capi/rational_spec.rb57
-rw-r--r--spec/ruby/optional/capi/regexp_spec.rb71
-rw-r--r--spec/ruby/optional/capi/spec_helper.rb132
-rw-r--r--spec/ruby/optional/capi/st_spec.rb41
-rw-r--r--spec/ruby/optional/capi/string_spec.rb887
-rw-r--r--spec/ruby/optional/capi/struct_spec.rb213
-rw-r--r--spec/ruby/optional/capi/symbol_spec.rb133
-rw-r--r--spec/ruby/optional/capi/thread_spec.rb149
-rw-r--r--spec/ruby/optional/capi/time_spec.rb300
-rw-r--r--spec/ruby/optional/capi/typed_data_spec.rb51
-rw-r--r--spec/ruby/optional/capi/util_spec.rb201
-rw-r--r--spec/ruby/security/cve_2010_1330_spec.rb21
-rw-r--r--spec/ruby/security/cve_2011_4815_spec.rb49
-rw-r--r--spec/ruby/security/cve_2013_4164_spec.rb19
-rw-r--r--spec/ruby/security/cve_2014_8080_spec.rb32
-rw-r--r--spec/ruby/security/cve_2017_17742_spec.rb34
-rw-r--r--spec/ruby/security/cve_2018_16396_spec.rb21
-rw-r--r--spec/ruby/security/cve_2018_6914_spec.rb56
-rw-r--r--spec/ruby/security/cve_2018_8778_spec.rb12
-rw-r--r--spec/ruby/security/cve_2018_8779_spec.rb30
-rw-r--r--spec/ruby/security/cve_2018_8780_spec.rb47
-rw-r--r--spec/ruby/shared/basicobject/method_missing.rb124
-rw-r--r--spec/ruby/shared/basicobject/send.rb117
-rw-r--r--spec/ruby/shared/enumerator/each.rb89
-rw-r--r--spec/ruby/shared/enumerator/enum_cons.rb12
-rw-r--r--spec/ruby/shared/enumerator/enum_for.rb50
-rw-r--r--spec/ruby/shared/enumerator/new.rb42
-rw-r--r--spec/ruby/shared/enumerator/next.rb28
-rw-r--r--spec/ruby/shared/enumerator/rewind.rb39
-rw-r--r--spec/ruby/shared/enumerator/with_index.rb32
-rw-r--r--spec/ruby/shared/enumerator/with_object.rb42
-rw-r--r--spec/ruby/shared/fiber/resume.rb79
-rw-r--r--spec/ruby/shared/file/blockdev.rb9
-rw-r--r--spec/ruby/shared/file/chardev.rb9
-rw-r--r--spec/ruby/shared/file/directory.rb66
-rw-r--r--spec/ruby/shared/file/executable.rb48
-rw-r--r--spec/ruby/shared/file/executable_real.rb46
-rw-r--r--spec/ruby/shared/file/exist.rb24
-rw-r--r--spec/ruby/shared/file/file.rb45
-rw-r--r--spec/ruby/shared/file/grpowned.rb40
-rw-r--r--spec/ruby/shared/file/identical.rb47
-rw-r--r--spec/ruby/shared/file/owned.rb3
-rw-r--r--spec/ruby/shared/file/pipe.rb3
-rw-r--r--spec/ruby/shared/file/readable.rb30
-rw-r--r--spec/ruby/shared/file/readable_real.rb23
-rw-r--r--spec/ruby/shared/file/setgid.rb2
-rw-r--r--spec/ruby/shared/file/setuid.rb2
-rw-r--r--spec/ruby/shared/file/size.rb124
-rw-r--r--spec/ruby/shared/file/socket.rb3
-rw-r--r--spec/ruby/shared/file/sticky.rb29
-rw-r--r--spec/ruby/shared/file/symlink.rb46
-rw-r--r--spec/ruby/shared/file/world_readable.rb49
-rw-r--r--spec/ruby/shared/file/world_writable.rb49
-rw-r--r--spec/ruby/shared/file/writable.rb28
-rw-r--r--spec/ruby/shared/file/writable_real.rb33
-rw-r--r--spec/ruby/shared/file/zero.rb68
-rw-r--r--spec/ruby/shared/hash/key_error.rb25
-rw-r--r--spec/ruby/shared/io/putc.rb57
-rw-r--r--spec/ruby/shared/kernel/equal.rb54
-rw-r--r--spec/ruby/shared/kernel/object_id.rb80
-rw-r--r--spec/ruby/shared/kernel/raise.rb85
-rw-r--r--spec/ruby/shared/math/atanh.rb44
-rw-r--r--spec/ruby/shared/process/abort.rb36
-rw-r--r--spec/ruby/shared/process/exit.rb94
-rw-r--r--spec/ruby/shared/process/fork.rb90
-rw-r--r--spec/ruby/shared/queue/clear.rb12
-rw-r--r--spec/ruby/shared/queue/close.rb14
-rw-r--r--spec/ruby/shared/queue/closed.rb12
-rw-r--r--spec/ruby/shared/queue/deque.rb85
-rw-r--r--spec/ruby/shared/queue/empty.rb12
-rw-r--r--spec/ruby/shared/queue/enque.rb18
-rw-r--r--spec/ruby/shared/queue/length.rb9
-rw-r--r--spec/ruby/shared/queue/num_waiting.rb16
-rw-r--r--spec/ruby/shared/rational/Rational.rb103
-rw-r--r--spec/ruby/shared/rational/abs.rb11
-rw-r--r--spec/ruby/shared/rational/arithmetic_exception_in_coerce.rb33
-rw-r--r--spec/ruby/shared/rational/ceil.rb45
-rw-r--r--spec/ruby/shared/rational/coerce.rb21
-rw-r--r--spec/ruby/shared/rational/comparison.rb117
-rw-r--r--spec/ruby/shared/rational/denominator.rb14
-rw-r--r--spec/ruby/shared/rational/div.rb54
-rw-r--r--spec/ruby/shared/rational/divide.rb71
-rw-r--r--spec/ruby/shared/rational/divmod.rb42
-rw-r--r--spec/ruby/shared/rational/equal_value.rb39
-rw-r--r--spec/ruby/shared/rational/exponent.rb178
-rw-r--r--spec/ruby/shared/rational/fdiv.rb5
-rw-r--r--spec/ruby/shared/rational/floor.rb45
-rw-r--r--spec/ruby/shared/rational/hash.rb9
-rw-r--r--spec/ruby/shared/rational/inspect.rb14
-rw-r--r--spec/ruby/shared/rational/marshal_dump.rb5
-rw-r--r--spec/ruby/shared/rational/marshal_load.rb5
-rw-r--r--spec/ruby/shared/rational/minus.rb48
-rw-r--r--spec/ruby/shared/rational/modulo.rb43
-rw-r--r--spec/ruby/shared/rational/multiply.rb62
-rw-r--r--spec/ruby/shared/rational/numerator.rb10
-rw-r--r--spec/ruby/shared/rational/plus.rb48
-rw-r--r--spec/ruby/shared/rational/quo.rb5
-rw-r--r--spec/ruby/shared/rational/remainder.rb5
-rw-r--r--spec/ruby/shared/rational/round.rb99
-rw-r--r--spec/ruby/shared/rational/to_f.rb10
-rw-r--r--spec/ruby/shared/rational/to_i.rb12
-rw-r--r--spec/ruby/shared/rational/to_r.rb11
-rw-r--r--spec/ruby/shared/rational/to_s.rb14
-rw-r--r--spec/ruby/shared/rational/truncate.rb45
-rw-r--r--spec/ruby/shared/sizedqueue/enque.rb50
-rw-r--r--spec/ruby/shared/sizedqueue/max.rb47
-rw-r--r--spec/ruby/shared/sizedqueue/new.rb18
-rw-r--r--spec/ruby/shared/sizedqueue/num_waiting.rb12
-rw-r--r--spec/ruby/shared/string/times.rb64
-rw-r--r--spec/ruby/shared/time/strftime_for_date.rb275
-rw-r--r--spec/ruby/shared/time/strftime_for_time.rb173
-rw-r--r--spec/ruby/spec_helper.rb32
-rw-r--r--sprintf.c321
-rw-r--r--st.c2928
-rw-r--r--strftime.c292
-rw-r--r--string.c3448
-rw-r--r--struct.c343
-rw-r--r--symbol.c110
-rw-r--r--symbol.h14
-rw-r--r--template/Doxyfile.tmpl74
-rw-r--r--template/GNUmakefile.in7
-rw-r--r--template/configure-ext.mk.tmpl44
-rw-r--r--template/encdb.h.tmpl31
-rw-r--r--template/extinit.c.tmpl17
-rw-r--r--template/exts.mk.tmpl159
-rw-r--r--template/fake.rb.in20
-rw-r--r--template/id.h.tmpl28
-rw-r--r--template/insns.inc.tmpl20
-rw-r--r--template/insns_info.inc.tmpl83
-rw-r--r--template/limits.c.tmpl97
-rw-r--r--template/minsns.inc.tmpl14
-rw-r--r--template/opt_sc.inc.tmpl32
-rw-r--r--template/optinsn.inc.tmpl30
-rw-r--r--template/optunifs.inc.tmpl35
-rw-r--r--template/prelude.c.tmpl86
-rw-r--r--template/ruby-runner.c.in37
-rw-r--r--template/ruby-runner.h.in9
-rw-r--r--template/ruby.pc.in5
-rw-r--r--template/sizes.c.tmpl26
-rw-r--r--template/transdb.h.tmpl21
-rw-r--r--template/unicode_norm_gen.tmpl30
-rw-r--r--template/verconf.h.tmpl6
-rw-r--r--template/vm.inc.tmpl29
-rw-r--r--template/vmtc.inc.tmpl18
-rw-r--r--template/yarvarch.en (renamed from doc/yarvarch.en)0
-rw-r--r--template/yarvarch.ja (renamed from doc/yarvarch.ja)0
-rw-r--r--template/yasmdata.rb.tmpl20
-rw-r--r--test/-ext-/arith_seq/test_arith_seq_extract.rb40
-rw-r--r--test/-ext-/array/test_resize.rb2
-rw-r--r--test/-ext-/bignum/test_big2str.rb6
-rw-r--r--test/-ext-/bignum/test_bigzero.rb8
-rw-r--r--test/-ext-/bignum/test_div.rb6
-rw-r--r--test/-ext-/bignum/test_mul.rb14
-rw-r--r--test/-ext-/bignum/test_pack.rb2
-rw-r--r--test/-ext-/bignum/test_str2big.rb6
-rw-r--r--test/-ext-/bug_reporter/test_bug_reporter.rb6
-rw-r--r--test/-ext-/debug/test_debug.rb16
-rw-r--r--test/-ext-/exception/test_data_error.rb2
-rw-r--r--test/-ext-/exception/test_enc_raise.rb2
-rw-r--r--test/-ext-/exception/test_ensured.rb2
-rw-r--r--test/-ext-/exception/test_exception_at_throwing.rb18
-rw-r--r--test/-ext-/float/test_nextafter.rb13
-rw-r--r--test/-ext-/funcall/test_funcall.rb11
-rw-r--r--test/-ext-/funcall/test_passing_block.rb2
-rw-r--r--test/-ext-/gvl/test_last_thread.rb1
-rw-r--r--test/-ext-/hash/test_delete.rb2
-rw-r--r--test/-ext-/integer/test_integer.rb26
-rw-r--r--test/-ext-/integer/test_my_integer.rb48
-rw-r--r--test/-ext-/iseq_load/test_iseq_load.rb83
-rw-r--r--test/-ext-/iter/test_yield_block.rb12
-rw-r--r--test/-ext-/load/script.rb2
-rw-r--r--test/-ext-/load/test_dot_dot.rb2
-rw-r--r--test/-ext-/load/test_protect.rb14
-rw-r--r--test/-ext-/method/test_arity.rb4
-rw-r--r--test/-ext-/num2int/test_num2int.rb45
-rw-r--r--test/-ext-/path_to_class/test_path_to_class.rb2
-rw-r--r--test/-ext-/postponed_job/test_postponed_job.rb1
-rw-r--r--test/-ext-/proc/test_bmethod.rb4
-rw-r--r--test/-ext-/string/test_capacity.rb40
-rw-r--r--test/-ext-/string/test_cstr.rb12
-rw-r--r--test/-ext-/string/test_enc_associate.rb4
-rw-r--r--test/-ext-/string/test_external_new.rb17
-rw-r--r--test/-ext-/string/test_fstring.rb9
-rw-r--r--test/-ext-/string/test_modify_expand.rb11
-rw-r--r--test/-ext-/string/test_rb_str_dup.rb16
-rw-r--r--test/-ext-/string/test_set_len.rb9
-rw-r--r--test/-ext-/struct/test_duplicate.rb22
-rw-r--r--test/-ext-/struct/test_len.rb10
-rw-r--r--test/-ext-/struct/test_member.rb4
-rw-r--r--test/-ext-/symbol/noninterned_name.rb15
-rw-r--r--test/-ext-/symbol/test_inadvertent_creation.rb31
-rw-r--r--test/-ext-/symbol/test_type.rb20
-rw-r--r--test/-ext-/test_bug-14834.rb12
-rw-r--r--test/-ext-/test_bug-3571.rb2
-rw-r--r--test/-ext-/test_bug-5832.rb2
-rw-r--r--test/-ext-/test_notimplement.rb24
-rw-r--r--test/-ext-/test_printf.rb6
-rw-r--r--test/-ext-/test_scan_args.rb231
-rw-r--r--test/-ext-/thread_fd_close/test_thread_fd_close.rb25
-rw-r--r--test/-ext-/time/test_new.rb6
-rw-r--r--test/-ext-/typeddata/test_typeddata.rb13
-rw-r--r--test/-ext-/vm/test_at_exit.rb19
-rw-r--r--test/-ext-/wait_for_single_fd/test_wait_for_single_fd.rb35
-rw-r--r--test/-ext-/win32/test_console_attr.rb17
-rw-r--r--test/-ext-/win32/test_dln.rb14
-rw-r--r--test/base64/test_base64.rb2
-rw-r--r--test/benchmark/test_benchmark.rb2
-rw-r--r--test/bigdecimal/test_bigdecimal.rb830
-rw-r--r--test/bigdecimal/test_bigdecimal_util.rb42
-rw-r--r--test/cgi/test_cgi_cookie.rb13
-rw-r--r--test/cgi/test_cgi_core.rb12
-rw-r--r--test/cgi/test_cgi_header.rb14
-rw-r--r--test/cgi/test_cgi_modruby.rb2
-rw-r--r--test/cgi/test_cgi_multipart.rb12
-rw-r--r--test/cgi/test_cgi_session.rb10
-rw-r--r--test/cgi/test_cgi_tag_helper.rb2
-rw-r--r--test/cgi/test_cgi_util.rb95
-rw-r--r--test/coverage/test_coverage.rb685
-rw-r--r--test/csv/base.rb9
-rw-r--r--test/csv/helper.rb18
-rw-r--r--test/csv/interface/test_delegation.rb47
-rw-r--r--test/csv/interface/test_read.rb277
-rw-r--r--test/csv/interface/test_read_write.rb51
-rw-r--r--test/csv/interface/test_write.rb174
-rw-r--r--test/csv/parse/test_column_separator.rb40
-rw-r--r--test/csv/parse/test_convert.rb110
-rw-r--r--test/csv/parse/test_each.rb23
-rw-r--r--test/csv/parse/test_general.rb245
-rw-r--r--test/csv/parse/test_header.rb335
-rw-r--r--test/csv/parse/test_invalid.rb36
-rw-r--r--test/csv/parse/test_liberal_parsing.rb160
-rw-r--r--test/csv/parse/test_quote_char_nil.rb93
-rw-r--r--test/csv/parse/test_rewind.rb40
-rw-r--r--test/csv/parse/test_row_separator.rb16
-rw-r--r--test/csv/parse/test_skip_lines.rb105
-rw-r--r--test/csv/parse/test_strip.rb48
-rw-r--r--test/csv/parse/test_unconverted_fields.rb117
-rwxr-xr-xtest/csv/test_csv_parsing.rb222
-rwxr-xr-xtest/csv/test_csv_writing.rb98
-rwxr-xr-xtest/csv/test_data_converters.rb234
-rwxr-xr-xtest/csv/test_encodings.rb34
-rwxr-xr-xtest/csv/test_features.rb167
-rwxr-xr-xtest/csv/test_headers.rb298
-rwxr-xr-xtest/csv/test_interface.rb369
-rwxr-xr-xtest/csv/test_row.rb111
-rwxr-xr-xtest/csv/test_table.rb282
-rw-r--r--test/csv/ts_all.rb21
-rw-r--r--test/csv/write/test_converters.rb53
-rw-r--r--test/csv/write/test_general.rb228
-rw-r--r--test/csv/write/test_quote_empty.rb70
-rw-r--r--test/date/test_date.rb6
-rw-r--r--test/date/test_date_arith.rb31
-rw-r--r--test/date/test_date_attr.rb25
-rw-r--r--test/date/test_date_base.rb443
-rw-r--r--test/date/test_date_compat.rb2
-rw-r--r--test/date/test_date_conv.rb27
-rw-r--r--test/date/test_date_marshal.rb16
-rw-r--r--test/date/test_date_new.rb40
-rw-r--r--test/date/test_date_parse.rb95
-rw-r--r--test/date/test_date_strftime.rb17
-rw-r--r--test/date/test_date_strptime.rb2
-rw-r--r--test/date/test_switch_hitter.rb53
-rw-r--r--test/dbm/test_dbm.rb11
-rw-r--r--test/digest/test_digest.rb17
-rw-r--r--test/drb/drbtest.rb108
-rw-r--r--test/drb/test_acl.rb101
-rw-r--r--test/drb/test_drb.rb178
-rw-r--r--test/drb/test_drbssl.rb56
-rw-r--r--test/drb/test_drbunix.rb26
-rw-r--r--test/drb/ut_array_drbssl.rb2
-rw-r--r--test/drb/ut_drb_drbssl.rb2
-rw-r--r--test/drb/ut_eval.rb37
-rw-r--r--test/drb/ut_large.rb26
-rw-r--r--test/drb/ut_timerholder.rb102
-rw-r--r--test/dtrace/helper.rb123
-rw-r--r--test/dtrace/test_array_create.rb8
-rw-r--r--test/dtrace/test_function_entry.rb9
-rw-r--r--test/dtrace/test_hash_create.rb6
-rw-r--r--test/dtrace/test_method_cache.rb8
-rw-r--r--test/dtrace/test_singleton_function.rb9
-rw-r--r--test/dtrace/test_string.rb6
-rw-r--r--test/erb/test_erb.rb318
-rw-r--r--test/erb/test_erb_command.rb18
-rw-r--r--test/erb/test_erb_m17n.rb2
-rw-r--r--test/etc/test_etc.rb8
-rw-r--r--test/excludes/TestException.rb3
-rw-r--r--test/excludes/TestISeq.rb1
-rw-r--r--test/excludes/_appveyor/TestArray.rb7
-rw-r--r--test/excludes/_travis/osx/IMAPTest.rb3
-rw-r--r--test/excludes/_travis/osx/TestGemRemoteFetcher.rb4
-rw-r--r--test/excludes/_travis/osx/TestWEBrickUtils.rb3
-rw-r--r--test/excludes/_wercker/jit-wait/TestDelegateClass.rb2
-rw-r--r--test/excludes/_wercker/jit-wait/TestGemRemoteFetcher.rb4
-rw-r--r--test/excludes/_wercker/jit-wait/TestParallel/TestParallel.rb2
-rw-r--r--test/excludes/_wercker/jit-wait/TestThreadQueue.rb2
-rw-r--r--test/excludes/_wercker/jit/TestThreadQueue.rb2
-rw-r--r--test/fiddle/helper.rb9
-rw-r--r--test/fiddle/test_c_struct_entry.rb2
-rw-r--r--test/fiddle/test_c_union_entity.rb2
-rw-r--r--test/fiddle/test_closure.rb8
-rw-r--r--test/fiddle/test_cparser.rb16
-rw-r--r--test/fiddle/test_fiddle.rb2
-rw-r--r--test/fiddle/test_func.rb18
-rw-r--r--test/fiddle/test_function.rb31
-rw-r--r--test/fiddle/test_handle.rb34
-rw-r--r--test/fiddle/test_import.rb16
-rw-r--r--test/fiddle/test_pointer.rb14
-rw-r--r--test/fileutils/clobber.rb2
-rw-r--r--test/fileutils/fileasserts.rb2
-rw-r--r--test/fileutils/test_dryrun.rb4
-rw-r--r--test/fileutils/test_fileutils.rb278
-rw-r--r--test/fileutils/test_nowrite.rb4
-rw-r--r--test/fileutils/test_verbose.rb4
-rw-r--r--test/fileutils/visibility_tests.rb6
-rw-r--r--test/gdbm/test_gdbm.rb12
-rw-r--r--test/io/console/test_io_console.rb154
-rw-r--r--test/io/nonblock/test_flush.rb20
-rw-r--r--test/io/wait/test_io_wait.rb56
-rw-r--r--test/io/wait/test_io_wait_uncommon.rb78
-rw-r--r--test/irb/test_context.rb76
-rw-r--r--test/irb/test_init.rb31
-rw-r--r--test/irb/test_ruby-lex.rb108
-rw-r--r--test/irb/test_workspace.rb94
-rw-r--r--test/json/fixtures/fail1.json1
-rw-r--r--test/json/fixtures/obsolete_fail1.json1
-rw-r--r--test/json/json_addition_test.rb193
-rw-r--r--test/json/json_common_interface_test.rb126
-rw-r--r--test/json/json_encoding_test.rb107
-rw-r--r--test/json/json_ext_parser_test.rb15
-rw-r--r--test/json/json_fixtures_test.rb32
-rw-r--r--test/json/json_generator_test.rb377
-rw-r--r--test/json/json_generic_object_test.rb82
-rw-r--r--test/json/json_parser_test.rb472
-rw-r--r--test/json/json_string_matching_test.rb38
-rw-r--r--test/json/setup_variant.rb12
-rw-r--r--test/json/test_helper.rb21
-rwxr-xr-xtest/json/test_json.rb577
-rw-r--r--test/json/test_json_addition.rb197
-rw-r--r--test/json/test_json_encoding.rb66
-rw-r--r--test/json/test_json_fixtures.rb36
-rw-r--r--test/json/test_json_generate.rb361
-rw-r--r--test/json/test_json_generic_object.rb76
-rw-r--r--test/json/test_json_string_matching.rb40
-rw-r--r--test/json/test_json_unicode.rb73
-rw-r--r--test/lib/-test-/integer.rb14
-rw-r--r--test/lib/envutil.rb101
-rw-r--r--test/lib/find_executable.rb2
-rw-r--r--test/lib/iseq_loader_checker.rb8
-rw-r--r--test/lib/jit_support.rb65
-rw-r--r--test/lib/leakchecker.rb51
-rw-r--r--test/lib/memory_status.rb43
-rw-r--r--test/lib/minitest/autorun.rb2
-rw-r--r--test/lib/minitest/benchmark.rb2
-rw-r--r--test/lib/minitest/mock.rb2
-rw-r--r--test/lib/minitest/unit.rb56
-rw-r--r--test/lib/profile_test_all.rb2
-rw-r--r--test/lib/test/unit.rb292
-rw-r--r--test/lib/test/unit/assertions.rb254
-rw-r--r--test/lib/test/unit/parallel.rb25
-rw-r--r--test/lib/test/unit/testcase.rb2
-rw-r--r--test/lib/tracepointchecker.rb17
-rw-r--r--test/lib/with_different_ofs.rb2
-rw-r--r--test/lib/zombie_hunter.rb3
-rw-r--r--test/logger/test_logdevice.rb411
-rw-r--r--test/logger/test_logger.rb53
-rw-r--r--test/matrix/test_matrix.rb180
-rw-r--r--test/matrix/test_vector.rb115
-rw-r--r--test/minitest/test_minitest_mock.rb4
-rw-r--r--test/minitest/test_minitest_unit.rb19
-rw-r--r--test/misc/test_ruby_mode.rb16
-rw-r--r--test/mkmf/base.rb14
-rw-r--r--test/mkmf/test_find_executable.rb33
-rw-r--r--test/mkmf/test_framework.rb6
-rw-r--r--test/mkmf/test_have_func.rb2
-rw-r--r--test/monitor/test_monitor.rb54
-rw-r--r--test/net/fixtures/cacert.pem24
-rw-r--r--test/net/fixtures/dhparams.pem29
-rw-r--r--test/net/fixtures/server.crt82
-rw-r--r--test/net/fixtures/server.key28
-rw-r--r--test/net/ftp/test_buffered_socket.rb6
-rw-r--r--test/net/ftp/test_ftp.rb1034
-rw-r--r--test/net/http/test_http.rb248
-rw-r--r--test/net/http/test_http_request.rb32
-rw-r--r--test/net/http/test_httpheader.rb89
-rw-r--r--test/net/http/test_httpresponse.rb74
-rw-r--r--test/net/http/test_https.rb102
-rw-r--r--test/net/http/utils.rb3
-rw-r--r--test/net/imap/cacert.pem66
-rw-r--r--test/net/imap/server.crt48
-rw-r--r--test/net/imap/server.key15
-rw-r--r--test/net/imap/test_imap.rb245
-rw-r--r--test/net/imap/test_imap_response_parser.rb34
-rw-r--r--test/net/pop/test_pop.rb31
-rw-r--r--test/net/protocol/test_protocol.rb103
-rw-r--r--test/net/smtp/test_response.rb2
-rw-r--r--test/net/smtp/test_smtp.rb147
-rw-r--r--test/net/smtp/test_ssl_socket.rb7
-rw-r--r--test/nkf/test_kconv.rb8
-rw-r--r--test/objspace/test_objspace.rb238
-rw-r--r--test/open-uri/test_open-uri.rb66
-rw-r--r--test/open-uri/test_ssl.rb418
-rw-r--r--test/openssl/fixtures/pkey/dh-1.pem13
-rw-r--r--test/openssl/fixtures/pkey/dh1024.pem5
-rw-r--r--test/openssl/fixtures/pkey/dsa1024.pem12
-rw-r--r--test/openssl/fixtures/pkey/dsa256.pem8
-rw-r--r--test/openssl/fixtures/pkey/dsa512.pem8
-rw-r--r--test/openssl/fixtures/pkey/p256.pem5
-rw-r--r--test/openssl/fixtures/pkey/rsa-1.pem51
-rw-r--r--test/openssl/fixtures/pkey/rsa-2.pem51
-rw-r--r--test/openssl/fixtures/pkey/rsa-3.pem51
-rw-r--r--test/openssl/fixtures/pkey/rsa1024.pem15
-rw-r--r--test/openssl/fixtures/pkey/rsa2048.pem27
-rw-r--r--test/openssl/test_asn1.rb799
-rw-r--r--test/openssl/test_bn.rb299
-rw-r--r--test/openssl/test_buffering.rb16
-rw-r--r--test/openssl/test_cipher.rb478
-rw-r--r--test/openssl/test_config.rb20
-rw-r--r--test/openssl/test_digest.rb96
-rw-r--r--test/openssl/test_engine.rb115
-rw-r--r--test/openssl/test_fips.rb21
-rw-r--r--test/openssl/test_hmac.rb54
-rw-r--r--test/openssl/test_kdf.rb183
-rw-r--r--test/openssl/test_ns_spki.rb9
-rw-r--r--test/openssl/test_ocsp.rb306
-rw-r--r--test/openssl/test_pair.rb458
-rw-r--r--test/openssl/test_partial_record_read.rb35
-rw-r--r--test/openssl/test_pkcs12.rb161
-rw-r--r--test/openssl/test_pkcs5.rb98
-rw-r--r--test/openssl/test_pkcs7.rb33
-rw-r--r--test/openssl/test_pkey_dh.rb81
-rw-r--r--test/openssl/test_pkey_dsa.rb303
-rw-r--r--test/openssl/test_pkey_ec.rb461
-rw-r--r--test/openssl/test_pkey_rsa.rb396
-rw-r--r--test/openssl/test_random.rb16
-rw-r--r--test/openssl/test_ssl.rb1498
-rw-r--r--test/openssl/test_ssl_session.rb452
-rw-r--r--test/openssl/test_x509attr.rb84
-rw-r--r--test/openssl/test_x509cert.rb154
-rw-r--r--test/openssl/test_x509crl.rb100
-rw-r--r--test/openssl/test_x509ext.rb49
-rw-r--r--test/openssl/test_x509name.rb160
-rw-r--r--test/openssl/test_x509req.rb44
-rw-r--r--test/openssl/test_x509store.rb93
-rw-r--r--test/openssl/ut_eof.rb133
-rw-r--r--test/openssl/utils.rb462
-rw-r--r--test/optparse/test_acceptable.rb15
-rw-r--r--test/optparse/test_autoconf.rb2
-rw-r--r--test/optparse/test_bash_completion.rb5
-rw-r--r--test/optparse/test_cclass.rb18
-rw-r--r--test/optparse/test_kwargs.rb40
-rw-r--r--test/optparse/test_noarg.rb21
-rw-r--r--test/optparse/test_optarg.rb13
-rw-r--r--test/optparse/test_optparse.rb13
-rw-r--r--test/optparse/test_placearg.rb13
-rw-r--r--test/optparse/test_reqarg.rb17
-rw-r--r--test/optparse/test_summary.rb11
-rw-r--r--test/ostruct/test_ostruct.rb76
-rw-r--r--test/pathname/test_pathname.rb62
-rw-r--r--test/psych/handlers/test_recorder.rb2
-rw-r--r--test/psych/helper.rb20
-rw-r--r--test/psych/json/test_stream.rb2
-rw-r--r--test/psych/nodes/test_enumerable.rb2
-rw-r--r--test/psych/test_alias_and_anchor.rb2
-rw-r--r--test/psych/test_array.rb12
-rw-r--r--test/psych/test_boolean.rb2
-rw-r--r--test/psych/test_class.rb2
-rw-r--r--test/psych/test_coder.rb2
-rw-r--r--test/psych/test_date_time.rb35
-rw-r--r--test/psych/test_deprecated.rb128
-rw-r--r--test/psych/test_document.rb2
-rw-r--r--test/psych/test_emitter.rb6
-rw-r--r--test/psych/test_encoding.rb14
-rw-r--r--test/psych/test_exception.rb47
-rw-r--r--test/psych/test_hash.rb2
-rw-r--r--test/psych/test_json_tree.rb2
-rw-r--r--test/psych/test_marshalable.rb2
-rw-r--r--test/psych/test_merge_keys.rb2
-rw-r--r--test/psych/test_nil.rb2
-rw-r--r--test/psych/test_null.rb2
-rw-r--r--test/psych/test_numeric.rb2
-rw-r--r--test/psych/test_object.rb2
-rw-r--r--test/psych/test_object_references.rb2
-rw-r--r--test/psych/test_omap.rb2
-rw-r--r--test/psych/test_parser.rb64
-rw-r--r--test/psych/test_psych.rb159
-rw-r--r--test/psych/test_safe_load.rb93
-rw-r--r--test/psych/test_scalar.rb7
-rw-r--r--test/psych/test_scalar_scanner.rb18
-rw-r--r--test/psych/test_serialize_subclasses.rb2
-rw-r--r--test/psych/test_set.rb2
-rw-r--r--test/psych/test_stream.rb18
-rw-r--r--test/psych/test_string.rb38
-rw-r--r--test/psych/test_struct.rb2
-rw-r--r--test/psych/test_symbol.rb2
-rw-r--r--test/psych/test_tainted.rb4
-rw-r--r--test/psych/test_to_yaml_properties.rb64
-rw-r--r--test/psych/test_tree_builder.rb16
-rw-r--r--test/psych/test_yaml.rb6
-rw-r--r--test/psych/test_yaml_special_cases.rb130
-rw-r--r--test/psych/test_yamldbm.rb2
-rw-r--r--test/psych/test_yamlstore.rb2
-rw-r--r--test/psych/visitors/test_depth_first.rb2
-rw-r--r--test/psych/visitors/test_emitter.rb2
-rw-r--r--test/psych/visitors/test_to_ruby.rb2
-rw-r--r--test/psych/visitors/test_yaml_tree.rb35
-rw-r--r--test/rdoc/MarkdownTest_1.0.3/Markdown Documentation - Basics.text2
-rw-r--r--test/rdoc/MarkdownTest_1.0.3/Markdown Documentation - Syntax.text2
-rw-r--r--test/rdoc/minitest_helper.rb204
-rw-r--r--test/rdoc/test_rdoc_alias.rb2
-rw-r--r--test/rdoc/test_rdoc_any_method.rb66
-rw-r--r--test/rdoc/test_rdoc_attr.rb7
-rw-r--r--test/rdoc/test_rdoc_class_module.rb18
-rw-r--r--test/rdoc/test_rdoc_code_object.rb19
-rw-r--r--test/rdoc/test_rdoc_comment.rb23
-rw-r--r--test/rdoc/test_rdoc_constant.rb10
-rw-r--r--test/rdoc/test_rdoc_context.rb111
-rw-r--r--test/rdoc/test_rdoc_context_section.rb28
-rw-r--r--test/rdoc/test_rdoc_cross_reference.rb34
-rw-r--r--test/rdoc/test_rdoc_encoding.rb96
-rw-r--r--test/rdoc/test_rdoc_extend.rb2
-rw-r--r--test/rdoc/test_rdoc_generator_darkfish.rb38
-rw-r--r--test/rdoc/test_rdoc_generator_json_index.rb40
-rw-r--r--test/rdoc/test_rdoc_generator_markup.rb4
-rw-r--r--test/rdoc/test_rdoc_generator_pot.rb4
-rw-r--r--test/rdoc/test_rdoc_generator_pot_po.rb4
-rw-r--r--test/rdoc/test_rdoc_generator_pot_po_entry.rb4
-rw-r--r--test/rdoc/test_rdoc_generator_ri.rb13
-rw-r--r--test/rdoc/test_rdoc_i18n_locale.rb4
-rw-r--r--test/rdoc/test_rdoc_i18n_text.rb6
-rw-r--r--test/rdoc/test_rdoc_include.rb2
-rw-r--r--test/rdoc/test_rdoc_markdown.rb43
-rw-r--r--test/rdoc/test_rdoc_markdown_test.rb10
-rw-r--r--test/rdoc/test_rdoc_markup.rb4
-rw-r--r--test/rdoc/test_rdoc_markup_attribute_manager.rb46
-rw-r--r--test/rdoc/test_rdoc_markup_attributes.rb12
-rw-r--r--test/rdoc/test_rdoc_markup_document.rb4
-rw-r--r--test/rdoc/test_rdoc_markup_formatter.rb61
-rw-r--r--test/rdoc/test_rdoc_markup_hard_break.rb4
-rw-r--r--test/rdoc/test_rdoc_markup_heading.rb4
-rw-r--r--test/rdoc/test_rdoc_markup_include.rb4
-rw-r--r--test/rdoc/test_rdoc_markup_indented_paragraph.rb4
-rw-r--r--test/rdoc/test_rdoc_markup_paragraph.rb4
-rw-r--r--test/rdoc/test_rdoc_markup_parser.rb58
-rw-r--r--test/rdoc/test_rdoc_markup_pre_process.rb23
-rw-r--r--test/rdoc/test_rdoc_markup_raw.rb4
-rw-r--r--test/rdoc/test_rdoc_markup_to_ansi.rb4
-rw-r--r--test/rdoc/test_rdoc_markup_to_bs.rb19
-rw-r--r--test/rdoc/test_rdoc_markup_to_html.rb164
-rw-r--r--test/rdoc/test_rdoc_markup_to_html_crossref.rb99
-rw-r--r--test/rdoc/test_rdoc_markup_to_html_snippet.rb25
-rw-r--r--test/rdoc/test_rdoc_markup_to_joined_paragraph.rb4
-rw-r--r--test/rdoc/test_rdoc_markup_to_label.rb4
-rw-r--r--test/rdoc/test_rdoc_markup_to_markdown.rb4
-rw-r--r--test/rdoc/test_rdoc_markup_to_rdoc.rb4
-rw-r--r--test/rdoc/test_rdoc_markup_to_table_of_contents.rb4
-rw-r--r--test/rdoc/test_rdoc_markup_to_tt_only.rb4
-rw-r--r--test/rdoc/test_rdoc_markup_verbatim.rb4
-rw-r--r--test/rdoc/test_rdoc_method_attr.rb2
-rw-r--r--test/rdoc/test_rdoc_normal_class.rb2
-rw-r--r--test/rdoc/test_rdoc_normal_module.rb2
-rw-r--r--test/rdoc/test_rdoc_options.rb15
-rw-r--r--test/rdoc/test_rdoc_parser.rb29
-rw-r--r--test/rdoc/test_rdoc_parser_c.rb100
-rw-r--r--test/rdoc/test_rdoc_parser_changelog.rb8
-rw-r--r--test/rdoc/test_rdoc_parser_markdown.rb4
-rw-r--r--test/rdoc/test_rdoc_parser_rd.rb4
-rw-r--r--test/rdoc/test_rdoc_parser_ruby.rb1219
-rw-r--r--test/rdoc/test_rdoc_parser_simple.rb4
-rw-r--r--test/rdoc/test_rdoc_rd.rb4
-rw-r--r--test/rdoc/test_rdoc_rd_block_parser.rb6
-rw-r--r--test/rdoc/test_rdoc_rd_inline.rb4
-rw-r--r--test/rdoc/test_rdoc_rd_inline_parser.rb4
-rw-r--r--test/rdoc/test_rdoc_rdoc.rb143
-rw-r--r--test/rdoc/test_rdoc_require.rb8
-rw-r--r--test/rdoc/test_rdoc_ri_driver.rb160
-rw-r--r--test/rdoc/test_rdoc_ri_paths.rb6
-rw-r--r--test/rdoc/test_rdoc_ruby_lex.rb422
-rw-r--r--test/rdoc/test_rdoc_ruby_token.rb20
-rw-r--r--test/rdoc/test_rdoc_rubygems_hook.rb12
-rw-r--r--test/rdoc/test_rdoc_servlet.rb26
-rw-r--r--test/rdoc/test_rdoc_single_class.rb4
-rw-r--r--test/rdoc/test_rdoc_stats.rb4
-rw-r--r--test/rdoc/test_rdoc_store.rb54
-rw-r--r--test/rdoc/test_rdoc_task.rb4
-rw-r--r--test/rdoc/test_rdoc_text.rb64
-rw-r--r--test/rdoc/test_rdoc_token_stream.rb41
-rw-r--r--test/rdoc/test_rdoc_tom_doc.rb68
-rw-r--r--test/rdoc/test_rdoc_top_level.rb4
-rw-r--r--test/rdoc/xref_data.rb60
-rw-r--r--test/rdoc/xref_test_case.rb23
-rw-r--r--test/readline/test_readline.rb169
-rw-r--r--test/resolv/test_addr.rb11
-rw-r--r--test/resolv/test_dns.rb52
-rw-r--r--test/resolv/test_mdns.rb27
-rw-r--r--test/resolv/test_resource.rb4
-rw-r--r--test/rexml/data/t75.xml2
-rw-r--r--test/rexml/formatter/test_default.rb19
-rw-r--r--test/rexml/parse/test_element.rb38
-rw-r--r--test/rexml/parse/test_processing_instruction.rb25
-rw-r--r--test/rexml/parser/test_stream.rb32
-rw-r--r--test/rexml/parser/test_tree.rb2
-rw-r--r--test/rexml/parser/test_ultra_light.rb2
-rw-r--r--test/rexml/rexml_test_utils.rb5
-rw-r--r--test/rexml/test_attribute.rb14
-rw-r--r--test/rexml/test_core.rb35
-rw-r--r--test/rexml/test_doctype.rb134
-rw-r--r--test/rexml/test_element.rb18
-rw-r--r--test/rexml/test_functions.rb13
-rw-r--r--test/rexml/test_instruction.rb14
-rw-r--r--test/rexml/test_jaxen.rb189
-rw-r--r--test/rexml/test_martin_fowler.rb2
-rw-r--r--test/rexml/test_stream.rb4
-rw-r--r--test/rexml/test_text.rb55
-rw-r--r--test/rexml/test_xml_declaration.rb12
-rw-r--r--test/rexml/xpath/test_base.rb121
-rw-r--r--test/rexml/xpath/test_text.rb4
-rw-r--r--test/rinda/test_rinda.rb191
-rw-r--r--test/ripper/dummyparser.rb67
-rw-r--r--test/ripper/test_files.rb48
-rw-r--r--test/ripper/test_filter.rb13
-rw-r--r--test/ripper/test_lexer.rb98
-rw-r--r--test/ripper/test_parser_events.rb217
-rw-r--r--test/ripper/test_ripper.rb82
-rw-r--r--test/ripper/test_scanner_events.rb139
-rw-r--r--test/ripper/test_sexp.rb60
-rw-r--r--test/rss/test_itunes.rb6
-rw-r--r--test/rss/test_maker_0.9.rb2
-rw-r--r--test/rss/test_maker_1.0.rb2
-rw-r--r--test/rss/test_maker_2.0.rb6
-rw-r--r--test/rss/test_maker_itunes.rb14
-rw-r--r--test/rss/test_parser.rb56
-rw-r--r--test/rss/test_to_s.rb24
-rw-r--r--test/ruby/bug-11928.rb14
-rw-r--r--test/ruby/bug-13526.rb22
-rw-r--r--test/ruby/enc/test_case_comprehensive.rb307
-rw-r--r--test/ruby/enc/test_case_mapping.rb221
-rw-r--r--test/ruby/enc/test_case_options.rb81
-rw-r--r--test/ruby/enc/test_emoji_breaks.rb119
-rw-r--r--test/ruby/enc/test_grapheme_breaks.rb92
-rw-r--r--test/ruby/enc/test_iso_8859.rb6
-rw-r--r--test/ruby/enc/test_regex_casefold.rb120
-rw-r--r--test/ruby/enc/test_utf16.rb112
-rw-r--r--test/ruby/enc/test_utf32.rb68
-rw-r--r--test/ruby/lbtest.rb5
-rw-r--r--test/ruby/marshaltestlib.rb4
-rw-r--r--test/ruby/test_alias.rb36
-rw-r--r--test/ruby/test_argf.rb793
-rw-r--r--test/ruby/test_arithmetic_sequence.rb459
-rw-r--r--test/ruby/test_array.rb640
-rw-r--r--test/ruby/test_assignment.rb40
-rw-r--r--test/ruby/test_ast.rb272
-rw-r--r--test/ruby/test_autoload.rb118
-rw-r--r--test/ruby/test_backtrace.rb41
-rw-r--r--test/ruby/test_basicinstructions.rb33
-rw-r--r--test/ruby/test_beginendblock.rb70
-rw-r--r--test/ruby/test_bignum.rb223
-rw-r--r--test/ruby/test_call.rb20
-rw-r--r--test/ruby/test_case.rb2
-rw-r--r--test/ruby/test_class.rb75
-rw-r--r--test/ruby/test_clone.rb35
-rw-r--r--test/ruby/test_comparable.rb14
-rw-r--r--test/ruby/test_complex.rb297
-rw-r--r--test/ruby/test_complexrational.rb18
-rw-r--r--test/ruby/test_const.rb10
-rw-r--r--test/ruby/test_continuation.rb26
-rw-r--r--test/ruby/test_default_gems.rb15
-rw-r--r--test/ruby/test_defined.rb8
-rw-r--r--test/ruby/test_dir.rb158
-rw-r--r--test/ruby/test_dir_m17n.rb37
-rw-r--r--test/ruby/test_encoding.rb5
-rw-r--r--test/ruby/test_enum.rb401
-rw-r--r--test/ruby/test_enumerator.rb163
-rw-r--r--test/ruby/test_env.rb103
-rw-r--r--test/ruby/test_eval.rb95
-rw-r--r--test/ruby/test_exception.rb663
-rw-r--r--test/ruby/test_extlibs.rb87
-rw-r--r--test/ruby/test_fiber.rb101
-rw-r--r--test/ruby/test_file.rb69
-rw-r--r--test/ruby/test_file_exhaustive.rb573
-rw-r--r--test/ruby/test_fixnum.rb21
-rw-r--r--test/ruby/test_flip.rb46
-rw-r--r--test/ruby/test_float.rb258
-rw-r--r--test/ruby/test_fnmatch.rb31
-rw-r--r--test/ruby/test_gc.rb69
-rw-r--r--test/ruby/test_hash.rb361
-rw-r--r--test/ruby/test_ifunless.rb2
-rw-r--r--test/ruby/test_integer.rb471
-rw-r--r--test/ruby/test_integer_comb.rb94
-rw-r--r--test/ruby/test_io.rb715
-rw-r--r--test/ruby/test_io_m17n.rb91
-rw-r--r--test/ruby/test_iseq.rb371
-rw-r--r--test/ruby/test_iterator.rb22
-rw-r--r--test/ruby/test_jit.rb966
-rw-r--r--test/ruby/test_key_error.rb42
-rw-r--r--test/ruby/test_keyword.rb168
-rw-r--r--test/ruby/test_lambda.rb65
-rw-r--r--test/ruby/test_lazy_enumerator.rb43
-rw-r--r--test/ruby/test_literal.rb124
-rw-r--r--test/ruby/test_m17n.rb59
-rw-r--r--test/ruby/test_m17n_comb.rb2
-rw-r--r--test/ruby/test_marshal.rb73
-rw-r--r--test/ruby/test_math.rb34
-rw-r--r--test/ruby/test_method.rb188
-rw-r--r--test/ruby/test_mixed_unicode_escapes.rb8
-rw-r--r--test/ruby/test_module.rb315
-rw-r--r--test/ruby/test_not.rb2
-rw-r--r--test/ruby/test_notimp.rb2
-rw-r--r--test/ruby/test_numeric.rb138
-rw-r--r--test/ruby/test_object.rb93
-rw-r--r--test/ruby/test_objectspace.rb46
-rw-r--r--test/ruby/test_optimization.rb584
-rw-r--r--test/ruby/test_pack.rb79
-rw-r--r--test/ruby/test_parse.rb372
-rw-r--r--test/ruby/test_pipe.rb19
-rw-r--r--test/ruby/test_primitive.rb2
-rw-r--r--test/ruby/test_proc.rb185
-rw-r--r--test/ruby/test_process.rb264
-rw-r--r--test/ruby/test_rand.rb68
-rw-r--r--test/ruby/test_range.rb397
-rw-r--r--test/ruby/test_rational.rb389
-rw-r--r--test/ruby/test_refinement.rb701
-rw-r--r--test/ruby/test_regexp.rb207
-rw-r--r--test/ruby/test_require.rb263
-rw-r--r--test/ruby/test_rubyoptions.rb424
-rw-r--r--test/ruby/test_rubyvm.rb2
-rw-r--r--test/ruby/test_rubyvm_mjit.rb75
-rw-r--r--test/ruby/test_settracefunc.rb725
-rw-r--r--test/ruby/test_signal.rb122
-rw-r--r--test/ruby/test_sprintf.rb129
-rw-r--r--test/ruby/test_string.rb999
-rw-r--r--test/ruby/test_struct.rb44
-rw-r--r--test/ruby/test_super.rb38
-rw-r--r--test/ruby/test_symbol.rb221
-rw-r--r--test/ruby/test_syntax.rb720
-rw-r--r--test/ruby/test_system.rb41
-rw-r--r--test/ruby/test_thread.rb518
-rw-r--r--test/ruby/test_thread_cv.rb245
-rw-r--r--test/ruby/test_thread_queue.rb619
-rw-r--r--test/ruby/test_threadgroup.rb1
-rw-r--r--test/ruby/test_time.rb129
-rw-r--r--test/ruby/test_time_tz.rb295
-rw-r--r--test/ruby/test_transcode.rb128
-rw-r--r--test/ruby/test_undef.rb2
-rw-r--r--test/ruby/test_unicode_escape.rb19
-rw-r--r--test/ruby/test_variable.rb34
-rw-r--r--test/ruby/test_vm_dump.rb21
-rw-r--r--test/ruby/test_weakmap.rb18
-rw-r--r--test/ruby/test_whileuntil.rb2
-rw-r--r--test/ruby/test_yield.rb2
-rw-r--r--test/rubygems/alternate_cert.pem19
-rw-r--r--test/rubygems/alternate_cert_32.pem19
-rw-r--r--test/rubygems/bad_rake.rb2
-rw-r--r--test/rubygems/bogussources.rb2
-rw-r--r--test/rubygems/ca_cert.pem139
-rw-r--r--test/rubygems/child_cert.pem20
-rw-r--r--test/rubygems/child_cert_32.pem20
-rw-r--r--test/rubygems/client.pem148
-rw-r--r--test/rubygems/encrypted_private_key.pem52
-rw-r--r--test/rubygems/expired_cert.pem17
-rw-r--r--test/rubygems/fake_certlib/openssl.rb2
-rw-r--r--test/rubygems/fix_openssl_warnings.rb13
-rw-r--r--test/rubygems/foo/discover.rb2
-rw-r--r--test/rubygems/future_cert.pem17
-rw-r--r--test/rubygems/future_cert_32.pem17
-rw-r--r--test/rubygems/good_rake.rb2
-rw-r--r--test/rubygems/grandchild_cert.pem20
-rw-r--r--test/rubygems/grandchild_cert_32.pem20
-rw-r--r--test/rubygems/invalid_issuer_cert.pem20
-rw-r--r--test/rubygems/invalid_issuer_cert_32.pem20
-rw-r--r--test/rubygems/invalid_signer_cert.pem19
-rw-r--r--test/rubygems/invalid_signer_cert_32.pem19
-rw-r--r--test/rubygems/invalidchild_cert.pem20
-rw-r--r--test/rubygems/invalidchild_cert_32.pem20
-rw-r--r--test/rubygems/plugin/exception/rubygems_plugin.rb2
-rw-r--r--test/rubygems/plugin/load/rubygems_plugin.rb2
-rw-r--r--test/rubygems/plugin/standarderror/rubygems_plugin.rb2
-rw-r--r--test/rubygems/private3072_key.pem40
-rw-r--r--test/rubygems/public3072_cert.pem25
-rw-r--r--test/rubygems/public_cert.pem20
-rw-r--r--test/rubygems/public_cert_32.pem19
-rw-r--r--test/rubygems/rubygems/commands/crash_command.rb2
-rw-r--r--test/rubygems/rubygems_plugin.rb7
-rw-r--r--test/rubygems/sff/discover.rb2
-rw-r--r--test/rubygems/simple_gem.rb4
-rw-r--r--test/rubygems/specifications/foo-0.0.1.gemspecbin0 -> 269 bytes-rw-r--r--test/rubygems/ssl_cert.pem95
-rw-r--r--test/rubygems/ssl_key.pem38
-rw-r--r--test/rubygems/test_bundled_ca.rb84
-rw-r--r--test/rubygems/test_config.rb13
-rw-r--r--test/rubygems/test_deprecate.rb2
-rw-r--r--test/rubygems/test_gem.rb632
-rw-r--r--test/rubygems/test_gem_available_set.rb2
-rw-r--r--test/rubygems/test_gem_bundler_version_finder.rb126
-rw-r--r--test/rubygems/test_gem_command.rb13
-rw-r--r--test/rubygems/test_gem_command_manager.rb17
-rw-r--r--test/rubygems/test_gem_commands_build_command.rb262
-rw-r--r--test/rubygems/test_gem_commands_cert_command.rb139
-rw-r--r--test/rubygems/test_gem_commands_check_command.rb4
-rw-r--r--test/rubygems/test_gem_commands_cleanup_command.rb105
-rw-r--r--test/rubygems/test_gem_commands_contents_command.rb5
-rw-r--r--test/rubygems/test_gem_commands_dependency_command.rb69
-rw-r--r--test/rubygems/test_gem_commands_environment_command.rb5
-rw-r--r--test/rubygems/test_gem_commands_fetch_command.rb3
-rw-r--r--test/rubygems/test_gem_commands_generate_index_command.rb3
-rw-r--r--test/rubygems/test_gem_commands_help_command.rb13
-rw-r--r--test/rubygems/test_gem_commands_info_command.rb44
-rw-r--r--test/rubygems/test_gem_commands_install_command.rb170
-rw-r--r--test/rubygems/test_gem_commands_list_command.rb2
-rw-r--r--test/rubygems/test_gem_commands_lock_command.rb3
-rw-r--r--test/rubygems/test_gem_commands_mirror.rb2
-rw-r--r--test/rubygems/test_gem_commands_open_command.rb53
-rw-r--r--test/rubygems/test_gem_commands_outdated_command.rb3
-rw-r--r--test/rubygems/test_gem_commands_owner_command.rb176
-rw-r--r--test/rubygems/test_gem_commands_pristine_command.rb99
-rw-r--r--test/rubygems/test_gem_commands_push_command.rb148
-rw-r--r--test/rubygems/test_gem_commands_query_command.rb368
-rw-r--r--test/rubygems/test_gem_commands_search_command.rb3
-rw-r--r--test/rubygems/test_gem_commands_server_command.rb3
-rw-r--r--test/rubygems/test_gem_commands_setup_command.rb202
-rw-r--r--test/rubygems/test_gem_commands_signin_command.rb98
-rw-r--r--test/rubygems/test_gem_commands_signout_command.rb37
-rw-r--r--test/rubygems/test_gem_commands_sources_command.rb55
-rw-r--r--test/rubygems/test_gem_commands_specification_command.rb7
-rw-r--r--test/rubygems/test_gem_commands_stale_command.rb7
-rw-r--r--test/rubygems/test_gem_commands_uninstall_command.rb108
-rw-r--r--test/rubygems/test_gem_commands_unpack_command.rb20
-rw-r--r--test/rubygems/test_gem_commands_update_command.rb31
-rw-r--r--test/rubygems/test_gem_commands_which_command.rb9
-rw-r--r--test/rubygems/test_gem_commands_yank_command.rb25
-rw-r--r--test/rubygems/test_gem_config_file.rb34
-rw-r--r--test/rubygems/test_gem_dependency.rb35
-rw-r--r--test/rubygems/test_gem_dependency_installer.rb17
-rw-r--r--test/rubygems/test_gem_dependency_list.rb15
-rw-r--r--test/rubygems/test_gem_dependency_resolution_error.rb3
-rw-r--r--test/rubygems/test_gem_doctor.rb9
-rw-r--r--test/rubygems/test_gem_ext_builder.rb47
-rw-r--r--test/rubygems/test_gem_ext_cmake_builder.rb15
-rw-r--r--test/rubygems/test_gem_ext_configure_builder.rb10
-rw-r--r--test/rubygems/test_gem_ext_ext_conf_builder.rb40
-rw-r--r--test/rubygems/test_gem_ext_rake_builder.rb68
-rw-r--r--test/rubygems/test_gem_gem_runner.rb3
-rw-r--r--test/rubygems/test_gem_gemcutter_utilities.rb52
-rw-r--r--test/rubygems/test_gem_impossible_dependencies_error.rb3
-rw-r--r--test/rubygems/test_gem_indexer.rb8
-rw-r--r--test/rubygems/test_gem_install_update_options.rb42
-rw-r--r--test/rubygems/test_gem_installer.rb465
-rw-r--r--test/rubygems/test_gem_local_remote_options.rb8
-rw-r--r--test/rubygems/test_gem_name_tuple.rb3
-rw-r--r--test/rubygems/test_gem_package.rb301
-rw-r--r--test/rubygems/test_gem_package_old.rb5
-rw-r--r--test/rubygems/test_gem_package_tar_header.rb24
-rw-r--r--test/rubygems/test_gem_package_tar_reader.rb3
-rw-r--r--test/rubygems/test_gem_package_tar_reader_entry.rb15
-rw-r--r--test/rubygems/test_gem_package_tar_writer.rb76
-rw-r--r--test/rubygems/test_gem_package_task.rb6
-rw-r--r--test/rubygems/test_gem_path_support.rb77
-rw-r--r--test/rubygems/test_gem_platform.rb11
-rw-r--r--test/rubygems/test_gem_rdoc.rb7
-rw-r--r--test/rubygems/test_gem_remote_fetcher.rb276
-rw-r--r--test/rubygems/test_gem_request.rb147
-rw-r--r--test/rubygems/test_gem_request_connection_pools.rb42
-rw-r--r--test/rubygems/test_gem_request_set.rb30
-rw-r--r--test/rubygems/test_gem_request_set_gem_dependency_api.rb95
-rw-r--r--test/rubygems/test_gem_request_set_lockfile.rb13
-rw-r--r--test/rubygems/test_gem_request_set_lockfile_parser.rb12
-rw-r--r--test/rubygems/test_gem_request_set_lockfile_tokenizer.rb6
-rw-r--r--test/rubygems/test_gem_requirement.rb42
-rw-r--r--test/rubygems/test_gem_resolver.rb66
-rw-r--r--test/rubygems/test_gem_resolver_activation_request.rb3
-rw-r--r--test/rubygems/test_gem_resolver_api_set.rb3
-rw-r--r--test/rubygems/test_gem_resolver_api_specification.rb27
-rw-r--r--test/rubygems/test_gem_resolver_best_set.rb3
-rw-r--r--test/rubygems/test_gem_resolver_composed_set.rb3
-rw-r--r--test/rubygems/test_gem_resolver_conflict.rb5
-rw-r--r--test/rubygems/test_gem_resolver_dependency_request.rb3
-rw-r--r--test/rubygems/test_gem_resolver_git_set.rb3
-rw-r--r--test/rubygems/test_gem_resolver_git_specification.rb5
-rw-r--r--test/rubygems/test_gem_resolver_index_set.rb3
-rw-r--r--test/rubygems/test_gem_resolver_index_specification.rb3
-rw-r--r--test/rubygems/test_gem_resolver_installed_specification.rb3
-rw-r--r--test/rubygems/test_gem_resolver_installer_set.rb9
-rw-r--r--test/rubygems/test_gem_resolver_local_specification.rb3
-rw-r--r--test/rubygems/test_gem_resolver_lock_set.rb3
-rw-r--r--test/rubygems/test_gem_resolver_lock_specification.rb15
-rw-r--r--test/rubygems/test_gem_resolver_requirement_list.rb3
-rw-r--r--test/rubygems/test_gem_resolver_specification.rb5
-rw-r--r--test/rubygems/test_gem_resolver_vendor_set.rb3
-rw-r--r--test/rubygems/test_gem_resolver_vendor_specification.rb3
-rw-r--r--test/rubygems/test_gem_security.rb11
-rw-r--r--test/rubygems/test_gem_security_policy.rb67
-rw-r--r--test/rubygems/test_gem_security_signer.rb29
-rw-r--r--test/rubygems/test_gem_security_trust_dir.rb9
-rw-r--r--test/rubygems/test_gem_server.rb224
-rw-r--r--test/rubygems/test_gem_silent_ui.rb2
-rw-r--r--test/rubygems/test_gem_source.rb30
-rw-r--r--test/rubygems/test_gem_source_fetch_problem.rb11
-rw-r--r--test/rubygems/test_gem_source_git.rb5
-rw-r--r--test/rubygems/test_gem_source_installed.rb3
-rw-r--r--test/rubygems/test_gem_source_list.rb8
-rw-r--r--test/rubygems/test_gem_source_local.rb2
-rw-r--r--test/rubygems/test_gem_source_lock.rb3
-rw-r--r--test/rubygems/test_gem_source_specific_file.rb2
-rw-r--r--test/rubygems/test_gem_source_vendor.rb3
-rw-r--r--test/rubygems/test_gem_spec_fetcher.rb23
-rw-r--r--test/rubygems/test_gem_specification.rb912
-rw-r--r--test/rubygems/test_gem_stream_ui.rb49
-rw-r--r--test/rubygems/test_gem_stub_specification.rb93
-rw-r--r--test/rubygems/test_gem_text.rb22
-rw-r--r--test/rubygems/test_gem_uninstaller.rb24
-rw-r--r--test/rubygems/test_gem_unsatisfiable_dependency_error.rb3
-rw-r--r--test/rubygems/test_gem_uri_formatter.rb3
-rw-r--r--test/rubygems/test_gem_util.rb46
-rw-r--r--test/rubygems/test_gem_validator.rb3
-rw-r--r--test/rubygems/test_gem_version.rb113
-rw-r--r--test/rubygems/test_gem_version_option.rb18
-rw-r--r--test/rubygems/test_kernel.rb39
-rw-r--r--test/rubygems/test_remote_fetch_error.rb20
-rw-r--r--test/rubygems/test_require.rb251
-rw-r--r--test/rubygems/wrong_key_cert.pem19
-rw-r--r--test/rubygems/wrong_key_cert_32.pem19
-rw-r--r--test/runner.rb9
-rw-r--r--test/scanf/test_scanf.rb1
-rw-r--r--test/sdbm/test_sdbm.rb4
-rw-r--r--test/shell/test_command_processor.rb14
-rw-r--r--test/socket/test_addrinfo.rb41
-rw-r--r--test/socket/test_basicsocket.rb105
-rw-r--r--test/socket/test_socket.rb64
-rw-r--r--test/socket/test_sockopt.rb13
-rw-r--r--test/socket/test_tcp.rb9
-rw-r--r--test/socket/test_udp.rb15
-rw-r--r--test/socket/test_unix.rb13
-rw-r--r--test/stringio/test_stringio.rb152
-rw-r--r--test/strscan/test_stringscanner.rb90
-rw-r--r--test/test_abbrev.rb2
-rw-r--r--test/test_cmath.rb44
-rw-r--r--test/test_delegate.rb26
-rw-r--r--test/test_extlibs.rb83
-rw-r--r--test/test_find.rb34
-rw-r--r--test/test_forwardable.rb219
-rw-r--r--test/test_ipaddr.rb117
-rw-r--r--test/test_mathn.rb120
-rw-r--r--test/test_mutex_m.rb3
-rw-r--r--test/test_observer.rb2
-rw-r--r--test/test_open3.rb51
-rw-r--r--test/test_pp.rb9
-rw-r--r--test/test_prime.rb114
-rw-r--r--test/test_pstore.rb25
-rw-r--r--test/test_pty.rb7
-rw-r--r--test/test_securerandom.rb75
-rw-r--r--test/test_set.rb203
-rw-r--r--test/test_shellwords.rb22
-rw-r--r--test/test_sync.rb69
-rw-r--r--test/test_tempfile.rb97
-rw-r--r--test/test_time.rb47
-rw-r--r--test/test_timeout.rb8
-rw-r--r--test/test_tmpdir.rb29
-rw-r--r--test/test_unicode_normalize.rb47
-rw-r--r--test/test_weakref.rb2
-rw-r--r--test/test_win32api.rb3
-rw-r--r--test/testunit/test_assertion.rb20
-rw-r--r--test/testunit/test_hideskip.rb6
-rw-r--r--test/testunit/test_parallel.rb55
-rw-r--r--test/thread/test_cv.rb222
-rw-r--r--test/thread/test_queue.rb544
-rw-r--r--test/thread/test_sync.rb64
-rw-r--r--test/uri/test_file.rb67
-rw-r--r--test/uri/test_generic.rb251
-rw-r--r--test/uri/test_http.rb5
-rw-r--r--test/uri/test_mailto.rb73
-rw-r--r--test/uri/test_parser.rb8
-rw-r--r--test/webrick/test_cgi.rb19
-rw-r--r--test/webrick/test_config.rb17
-rw-r--r--test/webrick/test_cookie.rb9
-rw-r--r--test/webrick/test_filehandler.rb56
-rw-r--r--test/webrick/test_htgroup.rb19
-rw-r--r--test/webrick/test_httpauth.rb246
-rw-r--r--test/webrick/test_httpproxy.rb162
-rw-r--r--test/webrick/test_httprequest.rb24
-rw-r--r--test/webrick/test_httpresponse.rb76
-rw-r--r--test/webrick/test_https.rb112
-rw-r--r--test/webrick/test_httpserver.rb132
-rw-r--r--test/webrick/test_server.rb1
-rw-r--r--test/webrick/test_ssl_server.rb67
-rw-r--r--test/webrick/test_utils.rb7
-rw-r--r--test/webrick/utils.rb5
-rw-r--r--test/webrick/webrick.cgi4
-rw-r--r--test/webrick/webrick.rhtml4
-rw-r--r--test/win32ole/available_ole.rb41
-rw-r--r--test/win32ole/test_ole_methods.rb2
-rw-r--r--test/win32ole/test_thread.rb2
-rw-r--r--test/win32ole/test_win32ole.rb25
-rw-r--r--test/win32ole/test_win32ole_event.rb43
-rw-r--r--test/win32ole/test_win32ole_method.rb13
-rw-r--r--test/win32ole/test_win32ole_method_event.rb36
-rw-r--r--test/win32ole/test_win32ole_param.rb53
-rw-r--r--test/win32ole/test_win32ole_param_event.rb30
-rw-r--r--test/win32ole/test_win32ole_record.rb18
-rw-r--r--test/win32ole/test_win32ole_type.rb52
-rw-r--r--test/win32ole/test_win32ole_type_event.rb44
-rw-r--r--test/win32ole/test_win32ole_variant.rb4
-rw-r--r--test/win32ole/test_word.rb9
-rw-r--r--test/xmlrpc/data/blog.xml18
-rw-r--r--test/xmlrpc/data/bug_bool.expected3
-rw-r--r--test/xmlrpc/data/bug_bool.xml8
-rw-r--r--test/xmlrpc/data/bug_cdata.expected3
-rw-r--r--test/xmlrpc/data/bug_cdata.xml8
-rw-r--r--test/xmlrpc/data/bug_covert.expected10
-rw-r--r--test/xmlrpc/data/bug_covert.xml6
-rw-r--r--test/xmlrpc/data/datetime_iso8601.xml8
-rw-r--r--test/xmlrpc/data/fault.xml16
-rw-r--r--test/xmlrpc/data/value.expected7
-rw-r--r--test/xmlrpc/data/value.xml22
-rw-r--r--test/xmlrpc/data/xml1.expected243
-rw-r--r--test/xmlrpc/data/xml1.xml1
-rw-r--r--test/xmlrpc/htpasswd2
-rw-r--r--test/xmlrpc/test_client.rb318
-rw-r--r--test/xmlrpc/test_cookie.rb97
-rw-r--r--test/xmlrpc/test_datetime.rb162
-rw-r--r--test/xmlrpc/test_features.rb51
-rw-r--r--test/xmlrpc/test_marshal.rb111
-rw-r--r--test/xmlrpc/test_parser.rb94
-rw-r--r--test/xmlrpc/test_webrick_server.rb136
-rw-r--r--test/xmlrpc/webrick_testing.rb56
-rw-r--r--test/yaml/test_store.rb180
-rw-r--r--test/zlib/test_zlib.rb139
-rw-r--r--thread.c2345
-rw-r--r--thread_pthread.c1907
-rw-r--r--thread_pthread.h49
-rw-r--r--thread_sync.c902
-rw-r--r--thread_win32.c221
-rw-r--r--time.c1947
-rw-r--r--timev.h29
-rw-r--r--tool/asm_parse.rb2
-rwxr-xr-xtool/bisect.sh42
-rwxr-xr-xtool/change_maker.rb17
-rwxr-xr-xtool/checksum.rb2
-rw-r--r--tool/colorize.rb41
-rwxr-xr-xtool/darwin-cc6
-rw-r--r--tool/downloader.rb294
-rw-r--r--tool/enc-emoji-citrus-gen.rb2
-rwxr-xr-xtool/enc-unicode.rb280
-rw-r--r--tool/eval.rb5
-rwxr-xr-xtool/expand-config.rb4
-rwxr-xr-xtool/extlibs.rb273
-rw-r--r--tool/fake.rb35
-rwxr-xr-xtool/fetch-bundled_gems.rb27
-rwxr-xr-xtool/file2lastrev.rb6
-rwxr-xr-xtool/gem-unpack.rb6
-rwxr-xr-xtool/gen_dummy_probes.rb24
-rwxr-xr-xtool/gen_ruby_tapset.rb14
-rw-r--r--tool/generate-backport-changelog.rb99
-rw-r--r--tool/generic_erb.rb39
-rwxr-xr-xtool/git-refresh46
-rw-r--r--tool/gperf.sed22
-rwxr-xr-xtool/id2token.rb3
-rwxr-xr-xtool/ifchange31
-rwxr-xr-xtool/insns2vm.rb18
-rw-r--r--tool/install-sh6
-rwxr-xr-xtool/instruction.rb1346
-rw-r--r--tool/jisx0208.rb2
-rw-r--r--tool/m4/_colorize_result_prepare.m433
-rw-r--r--tool/m4/ac_msg_result.m45
-rw-r--r--tool/m4/colorize_result.m49
-rw-r--r--tool/m4/ruby_append_option.m45
-rw-r--r--tool/m4/ruby_append_options.m47
-rw-r--r--tool/m4/ruby_check_builtin_func.m410
-rw-r--r--tool/m4/ruby_check_builtin_setjmp.m427
-rw-r--r--tool/m4/ruby_check_printf_prefix.m430
-rw-r--r--tool/m4/ruby_check_setjmp.m417
-rw-r--r--tool/m4/ruby_check_signedness.m45
-rw-r--r--tool/m4/ruby_check_sizeof.m4108
-rw-r--r--tool/m4/ruby_check_sysconf.m413
-rw-r--r--tool/m4/ruby_cppoutfile.m418
-rw-r--r--tool/m4/ruby_decl_attribute.m445
-rw-r--r--tool/m4/ruby_default_arch.m411
-rw-r--r--tool/m4/ruby_define_if.m412
-rw-r--r--tool/m4/ruby_defint.m440
-rw-r--r--tool/m4/ruby_dtrace_available.m420
-rw-r--r--tool/m4/ruby_dtrace_postprocess.m430
-rw-r--r--tool/m4/ruby_func_attribute.m47
-rw-r--r--tool/m4/ruby_mingw32.m424
-rw-r--r--tool/m4/ruby_prepend_option.m45
-rw-r--r--tool/m4/ruby_prog_gnu_ld.m410
-rw-r--r--tool/m4/ruby_replace_type.m458
-rw-r--r--tool/m4/ruby_rm_recursive.m418
-rw-r--r--tool/m4/ruby_setjmp_type.m452
-rw-r--r--tool/m4/ruby_stack_grow_direction.m430
-rw-r--r--tool/m4/ruby_try_cflags.m412
-rw-r--r--tool/m4/ruby_try_ldflags.m415
-rw-r--r--tool/m4/ruby_type_attribute.m48
-rw-r--r--tool/m4/ruby_universal_arch.m487
-rw-r--r--tool/m4/ruby_werror_flag.m418
-rwxr-xr-xtool/make-snapshot217
-rwxr-xr-xtool/mdoc2man.rb52
-rwxr-xr-xtool/merger.rb69
-rw-r--r--tool/mjit_archflag.sh40
-rw-r--r--tool/mk_call_iseq_optimized.rb23
-rwxr-xr-xtool/mkconfig.rb131
-rwxr-xr-xtool/mkrunnable.rb28
-rwxr-xr-xtool/node_name.rb12
-rw-r--r--tool/parse.rb3
-rw-r--r--tool/prereq.status43
-rwxr-xr-xtool/rbinstall.rb328
-rwxr-xr-xtool/rbuninstall.rb4
-rwxr-xr-xtool/redmine-backporter.rb56
-rwxr-xr-xtool/release.sh2
-rwxr-xr-xtool/rmdirs3
-rw-r--r--tool/ruby_vm/controllers/application_controller.rb25
-rw-r--r--tool/ruby_vm/helpers/c_escape.rb128
-rw-r--r--tool/ruby_vm/helpers/dumper.rb112
-rw-r--r--tool/ruby_vm/helpers/scanner.rb52
-rw-r--r--tool/ruby_vm/loaders/insns_def.rb92
-rw-r--r--tool/ruby_vm/loaders/opt_insn_unif_def.rb34
-rw-r--r--tool/ruby_vm/loaders/opt_operand_def.rb56
-rw-r--r--tool/ruby_vm/loaders/vm_opts_h.rb37
-rw-r--r--tool/ruby_vm/models/attribute.rb54
-rwxr-xr-xtool/ruby_vm/models/bare_instructions.rb207
-rw-r--r--tool/ruby_vm/models/c_expr.rb41
-rw-r--r--tool/ruby_vm/models/instructions.rb22
-rw-r--r--tool/ruby_vm/models/instructions_unifications.rb43
-rw-r--r--tool/ruby_vm/models/operands_unifications.rb137
-rw-r--r--tool/ruby_vm/models/trace_instructions.rb71
-rw-r--r--tool/ruby_vm/models/typemap.rb62
-rw-r--r--tool/ruby_vm/scripts/converter.rb29
-rw-r--r--tool/ruby_vm/scripts/insns2vm.rb93
-rw-r--r--tool/ruby_vm/tests/.gitkeep0
-rw-r--r--tool/ruby_vm/views/_attributes.erb35
-rw-r--r--tool/ruby_vm/views/_c_expr.erb17
-rw-r--r--tool/ruby_vm/views/_copyright.erb31
-rw-r--r--tool/ruby_vm/views/_insn_entry.erb60
-rw-r--r--tool/ruby_vm/views/_insn_len_info.erb23
-rw-r--r--tool/ruby_vm/views/_insn_name_info.erb50
-rw-r--r--tool/ruby_vm/views/_insn_operand_info.erb59
-rw-r--r--tool/ruby_vm/views/_insn_stack_increase.erb52
-rw-r--r--tool/ruby_vm/views/_insn_type_chars.erb12
-rw-r--r--tool/ruby_vm/views/_leaf_helpers.erb105
-rw-r--r--tool/ruby_vm/views/_mjit_compile_insn.erb86
-rw-r--r--tool/ruby_vm/views/_mjit_compile_insn_body.erb105
-rw-r--r--tool/ruby_vm/views/_mjit_compile_ivar.erb54
-rw-r--r--tool/ruby_vm/views/_mjit_compile_pc_and_sp.erb36
-rw-r--r--tool/ruby_vm/views/_mjit_compile_send.erb94
-rw-r--r--tool/ruby_vm/views/_notice.erb22
-rw-r--r--tool/ruby_vm/views/_trace_instruction.erb16
-rw-r--r--tool/ruby_vm/views/insns.inc.erb26
-rw-r--r--tool/ruby_vm/views/insns_info.inc.erb20
-rw-r--r--tool/ruby_vm/views/mjit_compile.inc.erb77
-rw-r--r--tool/ruby_vm/views/opt_sc.inc.erb40
-rw-r--r--tool/ruby_vm/views/optinsn.inc.erb71
-rw-r--r--tool/ruby_vm/views/optunifs.inc.erb21
-rw-r--r--tool/ruby_vm/views/vm.inc.erb30
-rw-r--r--tool/ruby_vm/views/vmtc.inc.erb21
-rwxr-xr-xtool/rubytest.rb30
-rw-r--r--tool/run-gcov.rb54
-rw-r--r--tool/run-lcov.rb164
-rwxr-xr-xtool/runruby.rb101
-rwxr-xr-xtool/strip-rdoc.rb3
-rw-r--r--tool/sync_default_gems.rb258
-rw-r--r--tool/test-coverage.rb118
-rw-r--r--tool/transcode-tblgen.rb34
-rw-r--r--tool/transform_mjit_header.rb298
-rwxr-xr-xtool/update-deps41
-rw-r--r--tool/vcs.rb258
-rw-r--r--tool/vtlh.rb2
-rwxr-xr-xtool/ytab.sed62
-rw-r--r--transcode.c76
-rw-r--r--transient_heap.c872
-rw-r--r--transient_heap.h60
-rw-r--r--util.c97
-rw-r--r--variable.c1080
-rw-r--r--version.c46
-rw-r--r--version.h38
-rw-r--r--vm.c2023
-rw-r--r--vm_args.c406
-rw-r--r--vm_backtrace.c207
-rw-r--r--vm_core.h1382
-rw-r--r--vm_dump.c326
-rw-r--r--vm_eval.c1121
-rw-r--r--vm_exec.c33
-rw-r--r--vm_exec.h46
-rw-r--r--vm_insnhelper.c2687
-rw-r--r--vm_insnhelper.h203
-rw-r--r--vm_method.c482
-rw-r--r--vm_opts.h21
-rw-r--r--vm_trace.c965
-rw-r--r--vsnprintf.c22
-rw-r--r--wercker.yml282
-rw-r--r--win32/.document1
-rw-r--r--win32/Makefile.sub458
-rw-r--r--win32/README.win329
-rwxr-xr-xwin32/configure.bat103
-rw-r--r--win32/dir.h1
-rw-r--r--win32/file.c179
-rw-r--r--win32/file.h3
-rwxr-xr-xwin32/ifchange.bat35
-rwxr-xr-xwin32/mkexports.rb11
-rwxr-xr-xwin32/resource.rb1
-rw-r--r--[-rwxr-xr-x]win32/rtname.cmd0
-rw-r--r--win32/setup.mak145
-rw-r--r--win32/stub.c48
-rw-r--r--win32/win32.c1776
9275 files changed, 398541 insertions, 605600 deletions
diff --git a/.document b/.document
index 2116ca6d26..fb27ba325d 100644
--- a/.document
+++ b/.document
@@ -5,13 +5,10 @@
# Process all the C source files
*.c
-*.y
# prelude
prelude.rb
-rbconfig.rb
-
# the lib/ directory (which has its own .document file)
lib
@@ -19,18 +16,11 @@ lib
ext
# rdoc files
+ChangeLog
+
NEWS
README.md
README.ja.md
-COPYING
-COPYING.ja
-CONTRIBUTING.md
-
-LEGAL
-
-# win32/README.win32 linked from README.md
-win32
-
doc
diff --git a/.editorconfig b/.editorconfig
index cb2729fff9..67abf4b978 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -2,26 +2,15 @@ root = true
[*]
end_of_line = lf
-indent_size = 4
-indent_style = space
insert_final_newline = true
-tab_width = 8
trim_trailing_whitespace = true
+tab_width = 8
+indent_style = tab
+indent_size = 4
-[*.bat]
+[**.bat]
end_of_line = crlf
-[*.gemspec]
-indent_size = 2
-
-[*.rb]
-indent_size = 2
-
-[*.yml]
-indent_size = 2
-
-[{*[Mm]akefile*,*.mak,*.mk,depend}]
-indent_style = tab
-
-[reg*.[ch]]
+[**.rb]
+indent_style = space
indent_size = 2
diff --git a/.gdbinit b/.gdbinit
index 1806196a42..03c2b653cb 100644
--- a/.gdbinit
+++ b/.gdbinit
@@ -1,5 +1,3 @@
-set startup-with-shell off
-
define hook-run
set $color_type = 0
set $color_highlite = 0
@@ -65,15 +63,7 @@ define rp
else
if ($flags & RUBY_T_MASK) == RUBY_T_OBJECT
printf "%sT_OBJECT%s: ", $color_type, $color_end
- print ((struct RObject *)($arg0))->basic
- if ($flags & ROBJECT_EMBED)
- print/x *((VALUE*)((struct RObject*)($arg0))->as.ary) @ (ROBJECT_EMBED_LEN_MAX+0)
- else
- print (((struct RObject *)($arg0))->as.heap)
- if (((struct RObject*)($arg0))->as.heap.numiv) > 0
- print/x *(((struct RObject*)($arg0))->as.heap.ivptr) @ (((struct RObject*)($arg0))->as.heap.numiv)
- end
- end
+ print (struct RObject *)($arg0)
else
if ($flags & RUBY_T_MASK) == RUBY_T_CLASS
printf "%sT_CLASS%s%s: ", $color_type, ($flags & RUBY_FL_SINGLETON) ? "*" : "", $color_end
@@ -99,15 +89,14 @@ define rp
set $regsrc = ((struct RRegexp*)($arg0))->src
set $rsflags = ((struct RBasic*)$regsrc)->flags
printf "%sT_REGEXP%s: ", $color_type, $color_end
- set $len = ($rsflags & RUBY_FL_USER1) ? \
- ((struct RString*)$regsrc)->as.heap.len : \
- (($rsflags & (RUBY_FL_USER2|RUBY_FL_USER3|RUBY_FL_USER4|RUBY_FL_USER5|RUBY_FL_USER6)) >> RUBY_FL_USHIFT+2)
set print address off
- output *(char *)(($rsflags & RUBY_FL_USER1) ? \
+ output (char *)(($rsflags & RUBY_FL_USER1) ? \
((struct RString*)$regsrc)->as.heap.ptr : \
- ((struct RString*)$regsrc)->as.ary) @ $len
+ ((struct RString*)$regsrc)->as.ary)
set print address on
- printf " len:%ld ", $len
+ printf " len:%ld ", ($rsflags & RUBY_FL_USER1) ? \
+ ((struct RString*)$regsrc)->as.heap.len : \
+ (($rsflags & (RUBY_FL_USER2|RUBY_FL_USER3|RUBY_FL_USER4|RUBY_FL_USER5|RUBY_FL_USER6)) >> RUBY_FL_USHIFT+2)
if $flags & RUBY_FL_USER6
printf "(none) "
end
@@ -128,7 +117,7 @@ define rp
if ($len == 0)
printf "{(empty)} "
else
- print/x *((VALUE*)((struct RArray*)($arg0))->as.ary) @ $len
+ output/x *((VALUE*)((struct RArray*)($arg0))->as.ary) @ $len
printf " "
end
else
@@ -144,7 +133,7 @@ define rp
if ($len == 0)
printf "{(empty)} "
else
- print/x *((VALUE*)((struct RArray*)($arg0))->as.heap.ptr) @ $len
+ output/x *((VALUE*)((struct RArray*)($arg0))->as.heap.ptr) @ $len
printf " "
end
end
@@ -156,27 +145,34 @@ define rp
else
if ($flags & RUBY_T_MASK) == RUBY_T_HASH
printf "%sT_HASH%s: ", $color_type, $color_end,
- if (((struct RHash *)($arg0))->basic->flags & RHASH_ST_TABLE_FLAG)
- printf "st len=%ld ", ((struct RHash *)($arg0))->as.st->num_entries
- else
- printf "li len=%ld bound=%ld ", \
- ((((struct RHash *)($arg0))->basic->flags & RHASH_ARRAY_LEN_MASK) >> RHASH_ARRAY_LEN_SHIFT), \
- ((((struct RHash *)($arg0))->basic->flags & RHASH_ARRAY_BOUND_MASK) >> RHASH_ARRAY_BOUND_SHIFT)
+ if ((struct RHash *)($arg0))->ntbl
+ printf "len=%ld ", ((struct RHash *)($arg0))->ntbl->num_entries
end
print (struct RHash *)($arg0)
else
if ($flags & RUBY_T_MASK) == RUBY_T_STRUCT
- set $len = (($flags & (RUBY_FL_USER1|RUBY_FL_USER2)) ? \
+ printf "%sT_STRUCT%s: len=%ld ", $color_type, $color_end, \
+ (($flags & (RUBY_FL_USER1|RUBY_FL_USER2)) ? \
($flags & (RUBY_FL_USER1|RUBY_FL_USER2)) >> (RUBY_FL_USHIFT+1) : \
((struct RStruct *)($arg0))->as.heap.len)
- printf "%sT_STRUCT%s: len=%ld ", $color_type, $color_end, $len
print (struct RStruct *)($arg0)
- output/x *(($flags & (RUBY_FL_USER1|RUBY_FL_USER2)) ? \
- ((struct RStruct *)($arg0))->as.ary : \
- ((struct RStruct *)($arg0))->as.heap.ptr) @ $len
+ x/xw (($flags & (RUBY_FL_USER1|RUBY_FL_USER2)) ? \
+ ((struct RStruct *)($arg0))->as.ary : \
+ ((struct RStruct *)($arg0))->as.heap.ptr)
else
if ($flags & RUBY_T_MASK) == RUBY_T_BIGNUM
- rp_bignum $arg0
+ printf "%sT_BIGNUM%s: sign=%d len=%ld ", $color_type, $color_end, \
+ (($flags & RUBY_FL_USER1) != 0), \
+ (($flags & RUBY_FL_USER2) ? \
+ ($flags & (RUBY_FL_USER5|RUBY_FL_USER4|RUBY_FL_USER3)) >> (RUBY_FL_USHIFT+3) : \
+ ((struct RBignum*)($arg0))->as.heap.len)
+ if $flags & RUBY_FL_USER2
+ printf "(embed) "
+ end
+ print (struct RBignum *)($arg0)
+ x/xw (($flags & RUBY_FL_USER2) ? \
+ ((struct RBignum*)($arg0))->as.ary : \
+ ((struct RBignum*)($arg0))->as.heap.digits)
else
if ($flags & RUBY_T_MASK) == RUBY_T_RATIONAL
printf "%sT_RATIONAL%s: ", $color_type, $color_end
@@ -251,7 +247,7 @@ define rp
else
if ($flags & RUBY_T_MASK) == RUBY_T_IMEMO
printf "%sT_IMEMO%s(", $color_type, $color_end
- output (enum imemo_type)(($flags>>RUBY_FL_USHIFT)&RUBY_IMEMO_MASK)
+ output (enum imemo_type)(($flags>>RUBY_FL_USHIFT)&imemo_mask)
printf "): "
rp_imemo $arg0
else
@@ -331,9 +327,6 @@ define rp_id
if $id == idLTLT
printf "(:<<)\n"
else
- if $id == idGTGT
- printf "(:>>)\n"
- else
if $id == idLE
printf "(:<=)\n"
else
@@ -361,18 +354,6 @@ define rp_id
if $id == idASET
printf "(:[]=)\n"
else
- if $id == idCOLON2
- printf "(:'::')\n"
- else
- if $id == idANDOP
- printf "(:&&)\n"
- else
- if $id == idOROP
- printf "(:||)\n"
- else
- if $id == idANDDOT
- printf "(:&.)\n"
- else
if $id <= tLAST_OP_ID
printf "O"
else
@@ -404,13 +385,12 @@ define rp_id
end
end
printf "(%ld): ", $id
- print_id $id
- echo \n
- end
- end
- end
- end
- end
+ set $str = lookup_id_str($id)
+ if $str
+ rp_string $str
+ else
+ echo undef\n
+ end
end
end
end
@@ -433,35 +413,16 @@ document rp_id
Print an ID.
end
-define output_string
+define rp_string
set $flags = ((struct RBasic*)($arg0))->flags
- set $len = ($flags & RUBY_FL_USER1) ? \
- ((struct RString*)($arg0))->as.heap.len : \
- (($flags & (RUBY_FL_USER2|RUBY_FL_USER3|RUBY_FL_USER4|RUBY_FL_USER5|RUBY_FL_USER6)) >> RUBY_FL_USHIFT+2)
- if $len > 0
- output *(char *)(($flags & RUBY_FL_USER1) ? \
+ set print address off
+ output (char *)(($flags & RUBY_FL_USER1) ? \
((struct RString*)($arg0))->as.heap.ptr : \
- ((struct RString*)($arg0))->as.ary) @ $len
- else
- output ""
- end
-end
-
-define print_string
- set $flags = ((struct RBasic*)($arg0))->flags
- set $len = ($flags & RUBY_FL_USER1) ? \
+ ((struct RString*)($arg0))->as.ary)
+ set print address on
+ printf " bytesize:%ld ", ($flags & RUBY_FL_USER1) ? \
((struct RString*)($arg0))->as.heap.len : \
(($flags & (RUBY_FL_USER2|RUBY_FL_USER3|RUBY_FL_USER4|RUBY_FL_USER5|RUBY_FL_USER6)) >> RUBY_FL_USHIFT+2)
- if $len > 0
- printf "%s", *(char *)(($flags & RUBY_FL_USER1) ? \
- ((struct RString*)($arg0))->as.heap.ptr : \
- ((struct RString*)($arg0))->as.ary) @ $len
- end
-end
-
-define rp_string
- output_string $arg0
- printf " bytesize:%ld ", $len
if !($flags & RUBY_FL_USER1)
printf "(embed) "
else
@@ -492,51 +453,6 @@ document rp_string
Print the content of a String.
end
-define rp_bignum
- set $flags = ((struct RBignum*)($arg0))->basic.flags
- set $len = (($flags & RUBY_FL_USER2) ? \
- ($flags & (RUBY_FL_USER5|RUBY_FL_USER4|RUBY_FL_USER3)) >> (RUBY_FL_USHIFT+3) : \
- ((struct RBignum*)($arg0))->as.heap.len)
- printf "%sT_BIGNUM%s: sign=%d len=%ld ", $color_type, $color_end, \
- (($flags & RUBY_FL_USER1) != 0), $len
- if $flags & RUBY_FL_USER2
- printf "(embed) "
- end
- print (struct RBignum *)($arg0)
- set $ptr = (($flags & RUBY_FL_USER2) ? \
- ((struct RBignum*)($arg0))->as.ary : \
- ((struct RBignum*)($arg0))->as.heap.digits)
- set $len = $len-1
- printf "0x%x", $ptr[$len]
- while $len > 0
- set $len = $len-1
- set $val = $ptr[$len]
- set $w = sizeof($ptr[0])
- printf "_"
- if $w > 8
- printf "%.32x", $val
- else
- if $w > 4
- printf "%.16x", $val
- else
- if $w > 2
- printf "%.8x", $val
- else
- if $w > 1
- printf "%.4x", $val
- else
- printf "%.2x", $val
- end
- end
- end
- end
- end
- printf "\n"
-end
-document rp_bignum
- Print the content of a Bignum.
-end
-
define rp_class
printf "(struct RClass *) %p", (void*)$arg0
if ((struct RClass *)($arg0))->ptr.origin_ != $arg0
@@ -544,7 +460,7 @@ define rp_class
end
printf "\n"
rb_classname $arg0
- print/x *(struct RClass *)($arg0)
+ print *(struct RClass *)($arg0)
print *((struct RClass *)($arg0))->ptr
end
document rp_class
@@ -552,7 +468,7 @@ document rp_class
end
define rp_imemo
- set $flags = (enum imemo_type)((((struct RBasic *)($arg0))->flags >> RUBY_FL_USHIFT) & RUBY_IMEMO_MASK)
+ set $flags = (((struct RBasic *)($arg0))->flags >> RUBY_FL_USHIFT) & imemo_mask
if $flags == imemo_cref
printf "(rb_cref_t *) %p\n", (void*)$arg0
print *(rb_cref_t *)$arg0
@@ -573,14 +489,6 @@ define rp_imemo
printf "(struct MEMO *) %p\n", (void*)$arg0
print *(struct MEMO *)$arg0
else
- if $flags == imemo_ment
- printf "(rb_method_entry_t *) %p\n", (void*)$arg0
- print *(rb_method_entry_t *)$arg0
- else
- if $flags == imemo_iseq
- printf "(rb_iseq_t *) %p\n", (void*)$arg0
- print *(rb_iseq_t *)$arg0
- else
printf "(struct RIMemo *) %p\n", (void*)$arg0
print *(struct RIMemo *)$arg0
end
@@ -588,8 +496,6 @@ define rp_imemo
end
end
end
- end
- end
end
document rp_imemo
Print the content of a memo
@@ -704,6 +610,12 @@ define nd_cval
rp ($arg0).u3.value
end
+
+define nd_cnt
+ printf "%su3.cnt%s: ", $color_highlite, $color_end
+ p ($arg0).u3.cnt
+end
+
define nd_tbl
printf "%su1.tbl%s: ", $color_highlite, $color_end
p ($arg0).u1.tbl
@@ -742,6 +654,12 @@ define nd_lit
rp ($arg0).u1.value
end
+
+define nd_frml
+ printf "%su1.node%s: ", $color_highlite, $color_end
+ rp ($arg0).u1.node
+end
+
define nd_rest
printf "%su2.argc%s: ", $color_highlite, $color_end
p ($arg0).u2.argc
@@ -768,6 +686,12 @@ define nd_args
rp ($arg0).u3.node
end
+
+define nd_noex
+ printf "%su1.id%s: ", $color_highlite, $color_end
+ p ($arg0).u1.id
+end
+
define nd_defn
printf "%su3.node%s: ", $color_highlite, $color_end
rp ($arg0).u3.node
@@ -785,6 +709,17 @@ define nd_new
end
+define nd_cfnc
+ printf "%su1.cfunc%s: ", $color_highlite, $color_end
+ p ($arg0).u1.cfunc
+end
+
+define nd_argc
+ printf "%su2.argc%s: ", $color_highlite, $color_end
+ p ($arg0).u2.argc
+end
+
+
define nd_cname
printf "%su1.id%s: ", $color_highlite, $color_end
p ($arg0).u1.id
@@ -846,7 +781,7 @@ end
define nd_tree
set $buf = (struct RString *)rb_str_buf_new(0)
- call dump_node((VALUE)($buf), rb_str_tmp_new(0), 0, ($arg0))
+ call dump_node((VALUE)($buf), rb_str_new(0, 0), 0, ($arg0))
printf "%s\n", $buf->as.heap.ptr
end
@@ -917,7 +852,8 @@ end
define rb_classname
# up to 128bit int
- set $rb_classname = rb_mod_name($arg0)
+ set $rb_classname_permanent = "0123456789ABCDEF"
+ set $rb_classname = classname($arg0, $rb_classname_permanent)
if $rb_classname != RUBY_Qnil
rp $rb_classname
else
@@ -966,7 +902,7 @@ define iseq
end
define rb_ps
- rb_ps_vm ruby_current_vm_ptr
+ rb_ps_vm ruby_current_vm
end
document rb_ps
Dump all threads and their callstacks
@@ -990,288 +926,11 @@ document rb_ps_vm
Dump all threads in a (rb_vm_t*) and their callstacks
end
-define print_lineno
- set $cfp = $arg0
- set $iseq = $cfp->iseq
- set $pos = $cfp->pc - $iseq->body->iseq_encoded
- if $pos != 0
- set $pos = $pos - 1
- end
-
- set $index = 0
- set $size = $iseq->body->insns_info.size
- set $table = $iseq->body->insns_info.body
- set $positions = $iseq->body->insns_info.positions
- #printf "size: %d\n", $size
- if $size == 0
- else
- if $size == 1
- printf "%d", $table[0].line_no
- else
- if $positions
- # get_insn_info_linear_search
- set $index = 1
- while $index < $size
- #printf "table[%d]: position: %d, line: %d, pos: %d\n", $i, $positions[$i], $table[$i].line_no, $pos
- if $positions[$index] > $pos
- loop_break
- end
- set $index = $index + 1
- if $positions[$index] == $pos
- loop_break
- end
- end
- else
- # get_insn_info_succinct_bitvector
- set $sd = $iseq->body->insns_info.succ_index_table
- set $immediate_table_size = sizeof($sd->imm_part) / sizeof(uint64_t) * 9
- if $pos < $immediate_table_size
- set $i = $pos / 9
- set $j = $pos % 9
- set $index = ((int)($sd->imm_part[$i] >> ($j * 7))) & 0x7f
- else
- set $block_index = ($pos - $immediate_table_size) / 512
- set $block = &$sd->succ_part[$block_index]
- set $block_bit_index = ($pos - $immediate_table_size) % 512
- set $small_block_index = $block_bit_index / 64
- set $small_block_popcount = $small_block_index == 0 ? 0 : (((int)($block->small_block_ranks >> (($small_block_index - 1) * 9))) & 0x1ff)
- set $x = $block->bits[$small_block_index] << (63 - $block_bit_index % 64)
- set $x = ($x & 0x5555555555555555) + ($x >> 1 & 0x5555555555555555)
- set $x = ($x & 0x3333333333333333) + ($x >> 2 & 0x3333333333333333)
- set $x = ($x & 0x0707070707070707) + ($x >> 4 & 0x0707070707070707)
- set $x = ($x & 0x001f001f001f001f) + ($x >> 8 & 0x001f001f001f001f)
- set $x = ($x & 0x0000003f0000003f) + ($x >>16 & 0x0000003f0000003f)
- set $popcnt = ($x & 0x7f) + ($x >>32 & 0x7f)
- set $index = $block->rank + $small_block_popcount + $popcnt
- end
- end
- printf "%d", $table[$index-1].line_no
- end
- end
-end
-
-define check_method_entry
- set $imemo = (struct RBasic *)$arg0
- if $imemo != RUBY_Qfalse
- set $type = ($imemo->flags >> 12) & 0x07
- if $type == imemo_ment
- set $me = (rb_callable_method_entry_t *)$imemo
- else
- if $type == imemo_svar
- set $imemo = ((struct vm_svar *)$imemo)->cref_or_me
- check_method_entry $imemo
- end
- end
- end
-end
-
-define print_id
- set $id = $arg0
- # rb_id_to_serial
- if $id > tLAST_OP_ID
- set $serial = (rb_id_serial_t)($id >> RUBY_ID_SCOPE_SHIFT)
- else
- set $serial = (rb_id_serial_t)$id
- end
- if $serial && $serial <= global_symbols.last_id
- set $idx = $serial / ID_ENTRY_UNIT
- set $ids = (struct RArray *)global_symbols.ids
- set $flags = $ids->basic.flags
- if ($flags & RUBY_FL_USER1)
- set $idsptr = $ids->as.ary
- set $idslen = (($flags & (RUBY_FL_USER3|RUBY_FL_USER4)) >> (RUBY_FL_USHIFT+3))
- else
- set $idsptr = $ids->as.heap.ptr
- set $idslen = $ids->as.heap.len
- end
- if $idx < $idslen
- set $t = 0
- set $ary = (struct RArray *)$idsptr[$idx]
- if $ary != RUBY_Qnil
- set $flags = $ary->basic.flags
- if ($flags & RUBY_FL_USER1)
- set $aryptr = $ary->as.ary
- set $arylen = (($flags & (RUBY_FL_USER3|RUBY_FL_USER4)) >> (RUBY_FL_USHIFT+3))
- else
- set $aryptr = $ary->as.heap.ptr
- set $arylen = $ary->as.heap.len
- end
- set $result = $aryptr[($serial % ID_ENTRY_UNIT) * ID_ENTRY_SIZE + $t]
- if $result != RUBY_Qnil
- print_string $result
- else
- echo undef
- end
- end
- end
- end
-end
-
-define print_pathobj
- set $flags = ((struct RBasic*)($arg0))->flags
- if ($flags & RUBY_T_MASK) == RUBY_T_STRING
- print_string $arg0
- end
- if ($flags & RUBY_T_MASK) == RUBY_T_ARRAY
- if $flags & RUBY_FL_USER1
- set $str = ((struct RArray*)($arg0))->as.ary[0]
- else
- set $str = ((struct RArray*)($arg0))->as.heap.ptr[0]
- end
- print_string $str
- end
-end
-
define rb_ps_thread
set $ps_thread = (struct RTypedData*)$arg0
set $ps_thread_th = (rb_thread_t*)$ps_thread->data
printf "* #<Thread:%p rb_thread_t:%p native_thread:%p>\n", \
$ps_thread, $ps_thread_th, $ps_thread_th->thread_id
- set $cfp = $ps_thread_th->ec->cfp
- set $cfpend = (rb_control_frame_t *)($ps_thread_th->ec->vm_stack + $ps_thread_th->ec->vm_stack_size)-1
- while $cfp < $cfpend
- if $cfp->iseq
- if !((VALUE)$cfp->iseq & RUBY_IMMEDIATE_MASK) && (((imemo_ifunc << RUBY_FL_USHIFT) | RUBY_T_IMEMO)==$cfp->iseq->flags & ((RUBY_IMEMO_MASK << RUBY_FL_USHIFT) | RUBY_T_MASK))
- printf "%d:ifunc ", $cfpend-$cfp
- set print symbol-filename on
- output/a $cfp->iseq.body
- set print symbol-filename off
- printf "\n"
- else
- if $cfp->pc
- set $location = $cfp->iseq->body->location
- printf "%d:", $cfpend-$cfp
- print_pathobj $location.pathobj
- printf ":"
- print_lineno $cfp
- printf ":in `"
- print_string $location.label
- printf "'\n"
- else
- printf "%d: ???.rb:???:in `???'\n", $cfpend-$cfp
- end
- end
- else
- # if VM_FRAME_TYPE($cfp->flag) == VM_FRAME_MAGIC_CFUNC
- set $ep = $cfp->ep
- if ($ep[0] & 0xffff0001) == 0x55550001
- #define VM_ENV_FLAG_LOCAL 0x02
- #define VM_ENV_PREV_EP(ep) GC_GUARDED_PTR_REF(ep[VM_ENV_DATA_INDEX_SPECVAL])
- set $me = 0
- set $env_specval = $ep[-1]
- set $env_me_cref = $ep[-2]
- while ($env_specval & 0x02) != 0
- check_method_entry $env_me_cref
- if $me != 0
- loop_break
- end
- set $ep = $ep[0]
- set $env_specval = $ep[-1]
- set $env_me_cref = $ep[-2]
- end
- if $me == 0
- check_method_entry $env_me_cref
- end
- printf "%d:", $cfpend-$cfp
- set print symbol-filename on
- output/a $me->def->body.cfunc.func
- set print symbol-filename off
- set $mid = $me->def->original_id
- printf ":in `"
- print_id $mid
- printf "'\n"
- else
- printf "%d:unknown_frame:???:in `???'\n", $cfpend-$cfp
- end
- end
- set $cfp = $cfp + 1
- end
-end
-
-define rb_count_objects
- set $objspace = ruby_current_vm_ptr->objspace
- set $counts_00 = 0
- set $counts_01 = 0
- set $counts_02 = 0
- set $counts_03 = 0
- set $counts_04 = 0
- set $counts_05 = 0
- set $counts_06 = 0
- set $counts_07 = 0
- set $counts_08 = 0
- set $counts_09 = 0
- set $counts_0a = 0
- set $counts_0b = 0
- set $counts_0c = 0
- set $counts_0d = 0
- set $counts_0e = 0
- set $counts_0f = 0
- set $counts_10 = 0
- set $counts_11 = 0
- set $counts_12 = 0
- set $counts_13 = 0
- set $counts_14 = 0
- set $counts_15 = 0
- set $counts_16 = 0
- set $counts_17 = 0
- set $counts_18 = 0
- set $counts_19 = 0
- set $counts_1a = 0
- set $counts_1b = 0
- set $counts_1c = 0
- set $counts_1d = 0
- set $counts_1e = 0
- set $counts_1f = 0
- set $total = 0
- set $i = 0
- while $i < $objspace->heap_pages.allocated_pages
- printf "\rcounting... %d/%d", $i, $objspace->heap_pages.allocated_pages
- set $page = $objspace->heap_pages.sorted[$i]
- set $p = $page->start
- set $pend = $p + $page->total_slots
- while $p < $pend
- set $flags = $p->as.basic.flags & 0x1f
- eval "set $counts_%02x = $counts_%02x + 1", $flags, $flags
- set $p = $p + 1
- end
- set $total = $total + $page->total_slots
- set $i = $i + 1
- end
- printf "\rTOTAL: %d, FREE: %d\n", $total, $counts_00
- printf "T_OBJECT: %d\n", $counts_01
- printf "T_CLASS: %d\n", $counts_02
- printf "T_MODULE: %d\n", $counts_03
- printf "T_FLOAT: %d\n", $counts_04
- printf "T_STRING: %d\n", $counts_05
- printf "T_REGEXP: %d\n", $counts_06
- printf "T_ARRAY: %d\n", $counts_07
- printf "T_HASH: %d\n", $counts_08
- printf "T_STRUCT: %d\n", $counts_09
- printf "T_BIGNUM: %d\n", $counts_0a
- printf "T_FILE: %d\n", $counts_0b
- printf "T_DATA: %d\n", $counts_0c
- printf "T_MATCH: %d\n", $counts_0d
- printf "T_COMPLEX: %d\n", $counts_0e
- printf "T_RATIONAL: %d\n", $counts_0f
- #printf "UNKNOWN_10: %d\n", $counts_10
- printf "T_NIL: %d\n", $counts_11
- printf "T_TRUE: %d\n", $counts_12
- printf "T_FALSE: %d\n", $counts_13
- printf "T_SYMBOL: %d\n", $counts_14
- printf "T_FIXNUM: %d\n", $counts_15
- printf "T_UNDEF: %d\n", $counts_16
- #printf "UNKNOWN_17: %d\n", $counts_17
- #printf "UNKNOWN_18: %d\n", $counts_18
- #printf "UNKNOWN_19: %d\n", $counts_19
- printf "T_IMEMO: %d\n", $counts_1a
- printf "T_NODE: %d\n", $counts_1b
- printf "T_ICLASS: %d\n", $counts_1c
- printf "T_ZOMBIE: %d\n", $counts_1d
- #printf "UNKNOWN_1E: %d\n", $counts_1e
- printf "T_MASK: %d\n", $counts_1f
-end
-document rb_count_objects
- Counts all objects grouped by type.
end
# Details: https://bugs.ruby-lang.org/projects/ruby-trunk/wiki/MachineInstructionsTraceWithGDB
@@ -1305,42 +964,3 @@ define rbi
end
end
end
-
-define dump_node
- set $str = rb_parser_dump_tree($arg0, 0)
- set $flags = ((struct RBasic*)($str))->flags
- printf "%s", (char *)(($flags & RUBY_FL_USER1) ? \
- ((struct RString*)$str)->as.heap.ptr : \
- ((struct RString*)$str)->as.ary)
-end
-
-define print_flags
- printf "RUBY_FL_WB_PROTECTED: %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_WB_PROTECTED ? "1" : "0"
- printf "RUBY_FL_PROMOTED0 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_PROMOTED0 ? "1" : "0"
- printf "RUBY_FL_PROMOTED1 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_PROMOTED1 ? "1" : "0"
- printf "RUBY_FL_FINALIZE : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_FINALIZE ? "1" : "0"
- printf "RUBY_FL_TAINT : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_TAINT ? "1" : "0"
- printf "RUBY_FL_UNTRUSTED : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_UNTRUSTED ? "1" : "0"
- printf "RUBY_FL_EXIVAR : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_EXIVAR ? "1" : "0"
- printf "RUBY_FL_FREEZE : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_FREEZE ? "1" : "0"
-
- printf "RUBY_FL_USER0 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_USER0 ? "1" : "0"
- printf "RUBY_FL_USER1 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_USER1 ? "1" : "0"
- printf "RUBY_FL_USER2 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_USER2 ? "1" : "0"
- printf "RUBY_FL_USER3 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_USER3 ? "1" : "0"
- printf "RUBY_FL_USER4 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_USER4 ? "1" : "0"
- printf "RUBY_FL_USER5 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_USER5 ? "1" : "0"
- printf "RUBY_FL_USER6 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_USER6 ? "1" : "0"
- printf "RUBY_FL_USER7 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_USER7 ? "1" : "0"
- printf "RUBY_FL_USER8 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_USER8 ? "1" : "0"
- printf "RUBY_FL_USER9 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_USER9 ? "1" : "0"
- printf "RUBY_FL_USER10 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_USER10 ? "1" : "0"
- printf "RUBY_FL_USER11 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_USER11 ? "1" : "0"
- printf "RUBY_FL_USER12 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_USER12 ? "1" : "0"
- printf "RUBY_FL_USER13 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_USER13 ? "1" : "0"
- printf "RUBY_FL_USER14 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_USER14 ? "1" : "0"
- printf "RUBY_FL_USER15 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_USER15 ? "1" : "0"
- printf "RUBY_FL_USER16 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_USER16 ? "1" : "0"
- printf "RUBY_FL_USER17 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_USER17 ? "1" : "0"
- printf "RUBY_FL_USER18 : %s\n", ((struct RBasic*)($arg0))->flags & RUBY_FL_USER18 ? "1" : "0"
-end
diff --git a/.gitattributes b/.gitattributes
index 6ca2f89462..d9785fad00 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1,6 +1,5 @@
*.gemspec diff=ruby
*.rb diff=ruby
-bin svn-properties=svn:ignore=ruby
bin/* diff=ruby
tool/update-deps diff=ruby
tool/make-snapshot diff=ruby
diff --git a/.gitignore b/.gitignore
index 50bf27f28a..80c12594dd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,26 +3,18 @@
*-*-*.lib
*.a
*.bak
-*.bc
-*.bundle
*.dSYM
*.dmyh
*.dylib
*.elc
-*.i
*.inc
*.log
*.o
*.obj
-*.old
*.orig
-*.pch
*.pdb
*.rej
-*.s
*.sav
-*.sl
-*.so
*.swp
*.yarb
*~
@@ -30,21 +22,17 @@
.*.list
.*.time
.DS_Store
-.bundle
.ccmalloc
.ext
.pc
.ppack
.svn
Makefile
+Makefile.old
cygruby*.def
extconf.h
y.output
y.tab.c
-*.gcda
-*.gcno
-*.gcov
-lcov*.info
# /
/*-fake.rb
@@ -55,8 +43,12 @@ lcov*.info
/*.rc
/*_prelude.c
/COPYING.LIB
+/ChangeLog-*
+/ChangeLog.pre-alpha
+/ChangeLog.pre1_1
/Doxyfile
/GNUmakefile
+/GNUmakefile.old
/README.atheos
/README.fat-patch
/README.v6
@@ -64,7 +56,6 @@ lcov*.info
/archive
/autom4te*.cache
/automake
-/benchmark/benchmark-driver
/beos
/bmlog-*
/breakpoints.gdb
@@ -88,9 +79,6 @@ lcov*.info
/goruby
/id.[ch]
/largefile.h
-/lcov-c-out
-/lcov-rb-out
-/lcov-out
/lex.c
/libruby*.*
/miniprelude.c
@@ -106,7 +94,6 @@ lcov*.info
/ppack
/prelude.c
/preview
-/probes.dmyh
/probes.h
/rbconfig.rb
/rename2.h
@@ -116,12 +103,10 @@ lcov*.info
/rubicon
/ruby
/ruby-runner
-/ruby-runner.h
+/ruby-runner.c
/ruby-man.rd.gz
-/run.gdb
/sizes.c
/test.rb
-/test-coverage.dat
/tmp
/transdb.h
/uncommon.mk
@@ -131,7 +116,6 @@ lcov*.info
/yasmdata.rb
# /benchmark/
-/benchmark/bm_require.data
/benchmark/bmx_*.rb
/benchmark/fasta.output.*
/benchmark/wc.input
@@ -139,13 +123,8 @@ lcov*.info
/enc/*.def
/enc/*.exp
/enc/*.lib
-/enc/jis/props.h
/enc/unicode/data
-# /coroutine/
-!/coroutine/**/*.s
-/coroutine/**/.time
-
# /enc/trans/
/enc/trans/*.c
/enc/trans/*.def
@@ -153,21 +132,17 @@ lcov*.info
/enc/trans/*.lib
/enc/trans/.time
-# /exe/
-/exe/goruby
-/exe/ruby
-/exe/.time
-
# /ext/
/ext/extinit.c
-/ext/configure-ext.mk
-/ext/*/exts.mk
# /ext/-test-/win32/dln/
-/ext/-test-/win32/dln/dlntest.dll
/ext/-test-/win32/dln/dlntest.exp
/ext/-test-/win32/dln/dlntest.lib
+# /ext/dl/callback/
+/ext/dl/callback/callback-*.c
+/ext/dl/callback/callback.c
+
# /ext/etc/
/ext/etc/constdefs.h
@@ -176,7 +151,6 @@ lcov*.info
# /ext/rbconfig/
/ext/rbconfig/sizeof/sizes.c
-/ext/rbconfig/sizeof/limits.c
# /ext/ripper/
/ext/ripper/eventids1.c
@@ -190,13 +164,15 @@ lcov*.info
/ext/socket/constdefs.h
/ext/socket/constdefs.c
+# /ext/tk/
+/ext/tk/config_list
+
# /gems
/gems/*.gem
-/gems/src
-/gems/*-*
-# /spec/bundler
-/.rspec_status
+# /spec/
+/spec/mspec
+/spec/rubyspec
# /tool/
/tool/config.guess
@@ -205,8 +181,3 @@ lcov*.info
# /win32/
/win32/*.ico
/win32/.time
-
-# MJIT
-/rb_mjit_header.h
-/mjit_config.h
-/include/ruby-*/*/rb_mjit_min_header-*.h
diff --git a/.travis.yml b/.travis.yml
index f860bb79b4..3f07bb6e94 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -16,365 +16,93 @@
#
# is also a good place to look at.
+# Language specification.
language: c
-dist: xenial
-
-git:
- quiet: true
-
-addons:
- apt:
- config:
- retries: true
- update: true
- sources:
- - ubuntu-toolchain-r-test
- packages:
- - gcc-8
- - libffi-dev
- - libgdbm-dev
- - libgmp-dev
- - libjemalloc-dev
- - libncurses5-dev
- - libncursesw5-dev
- - libreadline6-dev
- - libssl-dev
- - libyaml-dev
- - openssl
- - valgrind
- - zlib1g-dev
- homebrew:
- update: true
- packages:
- - gdbm
- - gmp
- - libffi
- - openssl@1.1
- - zlib
- - ccache
-
-cache:
- ccache: true
- directories:
- - $HOME/config_2nd
- - $HOME/.downloaded-cache
-
-env:
- global:
- - CONFIGURE_TTY=no
- - CCACHE_COMPILERCHECK=none
- - CCACHE_NOCOMPRESS=1
- - CCACHE_MAXSIZE=512Mi
- - >-
- NPROC="`case ${TRAVIS_OS_NAME} in
- osx) sysctl -n hw.activecpu ;;
- linux) nproc ;;
- esac`"
- # JOBS and SETARCH are overridden when necessary; see below.
- - JOBS=-j$((1+${NPROC}))
- - SETARCH=
- - RUBY_PREFIX=/tmp/ruby-prefix
- - GEMS_FOR_TEST='timezone tzinfo'
-
-.org.ruby-lang.ci.matrix-definitions:
-
- - &cron-only
- if: (type = cron) AND (branch = trunk) AND (fork = false)
-
- - &make-test-only
- script:
- - $SETARCH make -s test TESTOPTS="${TESTOPTS=$JOBS -q --tty=no}"
-
- - &linux
- os: linux
- compiler: gcc-8
-
- - &osx
- os: osx
- compiler: clang
- before_install:
- - /usr/local/opt/openssl@1.1/bin/openssl version
-
- # --------
-
- - &x86_64-linux
- name: x86_64-linux
- <<: *linux
-
- - &jemalloc
- name: --with-jemalloc
- <<: *linux
- <<: *cron-only
- env:
- - CONFIG_FLAG='--with-gmp --with-jemalloc --with-valgrind'
-
- - &VM_CHECK_MODE
- name: VM_CHECK_MODE=3
- <<: *linux
- <<: *cron-only
- <<: *make-test-only
- env:
- - cppflags=-DVM_CHECK_MODE=0x0003
-
- - &FIBER_USE_sjlj
- name: FIBER_USE_NATIVE=0
- <<: *linux
- <<: *cron-only
- env:
- - cppflags=-DFIBER_USE_NATIVE=0
-
- - &TOKEN_THREADED_CODE
- name: TOKEN_THREADED_CODE
- <<: *linux
- <<: *cron-only
- <<: *make-test-only
- env:
- - cppflags=-DOPT_THREADED_CODE=1
-
- - &CALL_THREADED_CODE
- name: CALL_THREADED_CODE
- <<: *linux
- <<: *cron-only
- <<: *make-test-only
- env:
- - cppflags=-DOPT_THREADED_CODE=2
-
- - &NO_THREADED_CODE
- name: NO_THREADED_CODE
- <<: *linux
- <<: *cron-only
- <<: *make-test-only
- env:
- - cppflags=-DOPT_THREADED_CODE=3
-
- - &ASAN
- name: -fsanitize=address
- <<: *linux
- #<<: *cron-only
- <<: *make-test-only
- compiler: clang
- env:
- - ASAN_OPTIONS=detect_leaks=0
- - cflags='-march=native -fsanitize=address -fno-omit-frame-pointer'
- - debugflags=-ggdb3
- - optflags=-O1
- - LD=clang
- - LDFLAGS=-fsanitize=address
-
- - &MSAN
- name: -fsanitize=memory
- <<: *linux
- #<<: *cron-only
- <<: *make-test-only
- compiler: clang
- env:
- - cflags='-fsanitize=memory -fsanitize-memory-track-origins=2 -fno-omit-frame-pointer'
- - optflags=-O1
- - LD=clang
- - LDFLAGS=-fsanitize=memory
- - CONFIG_FLAG=--with-out-ext=openssl
-
- - &UBSAN
- name: -fsanitize=undefined
- <<: *linux
- #<<: *cron-only
- <<: *make-test-only
- compiler: clang
- env:
- - cflags='-fsanitize=undefined,integer,nullability -fno-omit-frame-pointer'
- - cppflags=-DUNALIGNED_WORD_ACCESS=0
- - debugflags=-ggdb3
- - optflags='-O1 -march=native'
- - LD=clang
- - LDFLAGS=-fsanitize=undefined,integer,nullability
-
- - &i686-linux
- name: i686-linux
- <<: *linux
- env:
- - GCC_FLAGS=-m32
- - debugflags=-g0
- - SETARCH='setarch i686 --verbose --3gb'
- addons:
- apt:
- config:
- retries: true
- update: true
- sources:
- - ubuntu-toolchain-r-test
- packages:
- - gcc-8-multilib
- - libffi-dev:i386
- - libffi6:i386
- - libgdbm-dev:i386
- - libgdbm3:i386
- - libncurses5-dev:i386
- - libncurses5:i386
- - libncursesw5-dev:i386
- - libreadline6-dev:i386
- - libreadline6:i386
- - libssl-dev:i386
- - libssl1.0.0:i386
- - linux-libc-dev:i386
- - zlib1g-dev:i386
- - zlib1g:i386
-
- - &rubyspec
- name: ruby/spec on Ruby 2.3 # to ensure version guards are correctly added
- <<: *linux
- language: ruby
- rvm: 2.3.8
- addons:
- apt:
- packages:
- before_install:
- install:
- before_script: chmod -R u+w spec/ruby
- # -j randomly hangs. Using -fs to make sure we can know problematic spec on failure.
- script: ruby -C spec/ruby ../mspec/bin/mspec -fs .
-
- - &x86_64-darwin17
- name: x86_64-darwin17
- osx_image: xcode10.1
- <<: *osx
- env:
- - CONFIG_FLAG=--with-opt-dir=/usr/local/opt/openssl@1.1:/usr/local/opt/zlib
- - TEST_ALL_OPTS="--tty=no --excludes=\$(TESTSDIR)/excludes/_travis/osx"
- # Disabling -j3 because it seems to cause a hang on building Ruby: https://travis-ci.org/ruby/ruby/jobs/471021727
- - JOBS=
-
- - &x86_64-darwin18
- name: x86_64-darwin18
- osx_image: xcode11
- <<: *osx
- env:
- - CONFIG_FLAG=--with-opt-dir=/usr/local/opt/openssl@1.1:/usr/local/opt/zlib
- - TEST_ALL_OPTS="--tty=no --excludes=\$(TESTSDIR)/excludes/_travis/osx"
- # Disabling -j3 because it seems to cause a hang on building Ruby: https://travis-ci.org/ruby/ruby/jobs/471021727
- - JOBS=
-
- - &universal-darwin17
- name: uinversal.x86_64h-darwin17
- osx_image: xcode10.1
- <<: *osx
- <<: *cron-only
- <<: *make-test-only
- env:
- - CONFIG_FLAG=--with-arch=x86_64h,x86_64,i386
- - TEST_ALL_OPTS="$JOBS -q --tty=no --excludes=\$(TESTSDIR)/excludes/_travis/osx"
-
-matrix:
- include:
- # to reduce time for finishing all jobs, run the slowest osx build first.
- - <<: *x86_64-darwin18
- - <<: *x86_64-linux
- - <<: *i686-linux
- - <<: *jemalloc
- - <<: *ASAN
- - <<: *MSAN
- - <<: *UBSAN
- - <<: *VM_CHECK_MODE
- - <<: *FIBER_USE_sjlj
- - <<: *TOKEN_THREADED_CODE
- - <<: *CALL_THREADED_CODE
- - <<: *NO_THREADED_CODE
- - <<: *rubyspec
- allow_failures:
- - name: uinversal.x86_64h-darwin17
- - name: -fsanitize=address
- - name: -fsanitize=memory
- - name: -fsanitize=undefined
- fast_finish: true
-
+# Compilers. Several compilers are provided in Travis, so we try them all.
+# The value set here is visible via $CC environment variable.
+compiler:
+ - gcc
+ - clang
+
+os:
+ - linux
+ - osx
+
+# Dependencies. Some header files are missing in a Travis' worker VM, so we
+# have to install them. The "1.9.1" here is OK. It is the most adopted
+# version string for Debian/Ubuntu, and no dependencies have been changed so
+# far since the 1.9.1 release.
+before_install:
+ - "CONFIG_FLAG="
+ - "if [[ $TRAVIS_OS_NAME = 'linux' ]]; then sudo apt-get -qq update; fi"
+ # Travis ships an outdated, broken version of libssl by default
+ - "if [[ $TRAVIS_OS_NAME = 'linux' ]]; then sudo apt-get -qq --only-upgrade install '^libssl.*'; fi"
+ - "if [[ $TRAVIS_OS_NAME = 'linux' ]]; then sudo apt-get -qq install $CC; fi" # upgrade if any
+ - "if [[ $TRAVIS_OS_NAME = 'linux' ]]; then JOBS='-j'; fi"
+ - "if [[ $TRAVIS_OS_NAME = 'osx' ]]; then brew install autoconf gdbm openssl; fi"
+ - "if [[ $TRAVIS_OS_NAME = 'osx' ]]; then CONFIG_FLAG=\"$CONFIG_FLAG --with-gdbm-dir=`brew --prefix gdbm`\"; fi"
+ - "if [[ $TRAVIS_OS_NAME = 'osx' ]]; then CONFIG_FLAG=\"$CONFIG_FLAG --with-openssl-dir=`brew --prefix openssl`\"; fi"
+ - "if [[ $TRAVIS_OS_NAME = 'osx' && $CC = 'gcc' ]]; then CC='gcc-4.9'; fi"
+install: "if [[ $TRAVIS_OS_NAME = 'linux' ]]; then sudo apt-get -qq build-dep ruby1.9.1 2>/dev/null; fi"
+
+# Script is where the test runs. Note we just do "make test", not other tests
+# like test-all, test-rubyspec. This is because they take too much time,
+# enough for Travis to shut down the VM as being stalled.
before_script:
- - echo JOBS=${JOBS} SETARCH=${SETARCH}
- - $SETARCH uname -a
- - $SETARCH uname -r
- - rm -fr .ext autom4te.cache
- - echo $TERM
- - |-
- [ -d ~/.downloaded-cache ] ||
- mkdir ~/.downloaded-cache
- - ln -s ~/.downloaded-cache
- - "> config.status"
- - sed -f tool/prereq.status Makefile.in common.mk > Makefile
- - make -s $JOBS update-download
- - make -s $JOBS srcs
- - rm config.status Makefile rbconfig.rb .rbconfig.time
- - |-
- if [ -d ~/config_2nd ]; then
- cp -pr ~/config_2nd build
- else
- mkdir build
- fi
- - mkdir config_1st config_2nd
- - chmod -R a-w .
- - chmod -R u+w build config_1st config_2nd
- - cd build
- - ccache --show-stats
- - |-
- case "$CC" in
- gcc*) CC="ccache $CC${GCC_FLAGS:+ }$GCC_FLAGS -fno-diagnostics-color";;
- clang*) CC="ccache $CC${GCC_FLAGS:+ }$GCC_FLAGS -fno-color-diagnostics";;
- esac
- - |-
- [ ! -f config.cache ] ||
- [ "$CC" = "`sed -n s/^ac_cv_prog_CC=//p config.cache`" ] ||
- (set -x; exec rm config.cache)
- - $SETARCH ../configure -C --disable-install-doc --prefix=$RUBY_PREFIX $CONFIG_FLAG
- - cp -pr config.cache config.status .ext/include ../config_1st
- - $SETARCH make reconfig
- - cp -pr config.cache config.status .ext/include ../config_2nd
- - (cd .. && exec diff -ru config_1st config_2nd)
- - chmod u+w ..
- - rm -rf ~/config_2nd
- - mv ../config_2nd ~
- - chmod u-w ..
- - $SETARCH make -s $JOBS && make install
- - ccache --show-stats
- - |-
- [ -z "${GEMS_FOR_TEST}" ] ||
- $RUBY_PREFIX/bin/gem install --no-document $GEMS_FOR_TEST
-
+ - "if [[ $TRAVIS_OS_NAME = 'osx' ]]; then rm -f ~/Library/Logs/DiagnosticReports/ruby_*.crash; fi"
+ - "uname -a"
+ - "uname -r"
+ - "rm -fr .ext autom4te.cache"
+ - "make -f common.mk BASERUBY=ruby MAKEDIRS='mkdir -p' srcdir=. update-config_files"
+ - "autoconf"
+ - "mkdir config_1st config_2nd"
+ - "./configure -C --disable-install-doc --with-gcc=$CC $CONFIG_FLAG"
+ - "cp -pr config.status .ext/include config_1st"
+ - "make reconfig"
+ - "cp -pr config.status .ext/include config_2nd"
+ - "diff -ru config_1st config_2nd"
+ - "make after-update BASERUBY=ruby"
+ - "make -s $JOBS encs"
+ - "make -s $JOBS exts"
+ - "make update-rubyspec"
+ - "if [[ $TRAVIS_OS_NAME = 'osx' ]]; then echo 'exclude :test_deadlock_by_signal_at_forking, \"under investigation\"' >> test/excludes/TestProcess.rb; fi"
script:
- - $SETARCH make -s test TESTOPTS="${TESTOPTS=$JOBS -q --tty=no}"
- - travis_wait 30 $SETARCH make -s test-all -o exts TESTOPTS="${TEST_ALL_OPTS=$TESTOPTS}"
- - $SETARCH make -s test-spec MSPECOPT=-ff # not using `-j` because sometimes `mspec -j` silently dies
+ - "make test"
+ - "make test-all TESTOPTS='-q -j2'"
+ - "make test-rubyspec"
+after_failure:
+ - "if [[ $TRAVIS_OS_NAME = 'osx' ]]; then find ~/Library/Logs/DiagnosticReports -type f -name ruby_\\*.crash -ls -execdir cat {} \\; -delete; fi"
# Branch matrix. Not all branches are Travis-ready so we limit branches here.
branches:
only:
- trunk
- - ruby_2_3
- - ruby_2_4
- - ruby_2_5
- - ruby_2_6
- - /^feature\//
- - /^bug\//
- - /^travis-/
+ - ruby_2_0_0
+ - ruby_2_1
+ - ruby_2_2
# We want to be notified when something happens.
notifications:
irc:
channels:
- - "chat.freenode.net#ruby-core"
- - "chat.freenode.net#ruby-ja"
+ - "irc.freenode.org#ruby-core"
+ - "irc.freenode.org#ruby-ja"
on_success: change # [always|never|change] # default: always
- on_failure: always # [always|never|change] # default: always
+ on_failure: change # [always|never|change] # default: always
template:
- "%{message} by @%{author}: See %{build_url}"
- slack:
- rooms:
- - secure: i1GLETSKye85ea6dGNA3MxI/5myChmMFiZtBd5C69xK+s1sBFqEgOSbaSf9KHc0CYrHVyNhQMaZRruieV7xS+6Pfs0Zvxf1DO6QQTWC2KhkqwFDLvZncAzjoyASdR90hbr+iRPOngQ+HJuE94zemALAwEqNAinzA74PMiJXktqY= # ruby:<token>#commits
- - secure: ah7UEHBvncXT7bM5mvYIQAO+tIyV/wl7nXLb7wQD16dO2v8Gragy0mWjB79Q09hrrMGmp6H9bCDpdGS80boIA5EHaHoG4QaP0i9bsSt8U2AMWgZtfyIgQKJ4H2kXkGlrjO+AXTgnIkP7LNjdgAVUUTGQPb26T3QmoN2Splt+fIQ= # ruby:<token>#alerts
- on_pull_requests: false
- on_success: change
- on_failure: always
+ # Update ruby-head installed on Travis CI so other projects can test against it.
+ webhooks:
+ urls:
+ - "https://rubies.travis-ci.org/rebuild/ruby-head"
+ on_success: always
+ on_failure: never
email:
- ko1c-failure@atdot.net
+ - shibata.hiroshi@gmail.com
# Local Variables:
# mode: YAML
diff --git a/COPYING b/COPYING
index f06056fb45..a1f19ff99d 100644
--- a/COPYING
+++ b/COPYING
@@ -11,8 +11,8 @@ You can redistribute it and/or modify it under either the terms of the
a) place your modifications in the Public Domain or otherwise
make them Freely Available, such as by posting said
- modifications to Usenet or an equivalent medium, or by allowing
- the author to include your modifications in the software.
+ modifications to Usenet or an equivalent medium, or by allowing
+ the author to include your modifications in the software.
b) use the modified software only within your corporation or
organization.
@@ -26,11 +26,11 @@ You can redistribute it and/or modify it under either the terms of the
provided that you do at least ONE of the following:
a) distribute the binaries and library files of the software,
- together with instructions (in the manual page or equivalent)
- on where to get the original distribution.
+ together with instructions (in the manual page or equivalent)
+ on where to get the original distribution.
b) accompany the distribution with the machine-readable source of
- the software.
+ the software.
c) give non-standard binaries non-standard names, with
instructions on where to get the original software distribution.
@@ -44,9 +44,9 @@ You can redistribute it and/or modify it under either the terms of the
For the list of those files and their copying conditions, see the
file LEGAL.
- 5. The scripts and library files supplied as input to or produced as
+ 5. The scripts and library files supplied as input to or produced as
output from the software do not automatically fall under the
- copyright of the software, but belong to whomever generated them,
+ copyright of the software, but belong to whomever generated them,
and may be sold commercially, and may be aggregated with this
software.
diff --git a/ChangeLog b/ChangeLog
new file mode 100644
index 0000000000..f4a56b75ca
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,12187 @@
+Thu Dec 24 23:01:57 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * NEWS: added entry for CGI.escapeHTML optimization.
+
+Thu Dec 24 18:43:19 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * error.c (rb_compile_error_with_enc, rb_compile_error),
+ (rb_compile_bug): deprecate internal functions.
+
+ * parse.y (parser_yyerror): construct exception message with
+ source code and caret.
+
+Thu Dec 24 17:25:42 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * compile.c (append_compile_error), parse.y (compile_error):
+ preserve encoding of source file name in exceptions.
+
+ * error.c (rb_compile_error_str, rb_compile_bug_str): add.
+
+Thu Dec 24 16:17:47 2015 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * common.mk (fake.rb): $(arch)-fake.rb must depend miniruby because
+ it may depend miniruby.
+
+Thu Dec 24 16:13:05 2015 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * common.mk (ripper.c): r50045 wrongly replace $(PWD) with ../..
+ It is the top of build directory, not topsrcdir.
+
+Thu Dec 24 15:02:42 2015 sorah (Shota Fukumori) <her@sorah.jp>
+
+ * tool/vcs.rb (IO.popen): Refactor. Avoid assigning in condition.
+
+Thu Dec 24 15:01:38 2015 sorah (Shota Fukumori) <her@sorah.jp>
+
+ * tool/file2lastrev.rb: Fix ArgumentError to work on Ruby 1.8.7.
+
+Thu Dec 24 14:44:08 2015 sorah (Shota Fukumori) <her@sorah.jp>
+
+ * tool/vcs.rb (IO.popen): Enable on Ruby 1.9 where chdir option is not
+ supported on IO.popen
+
+ * tool/vcs.rb (IO.popen): Fix NoMethodError. I guess r49705 was not
+ tested... :/
+
+Thu Dec 24 14:57:03 2015 Koichi Sasada <ko1@atdot.net>
+
+ * NEWS: rename
+ "Implementation changes" section to
+ "Supported platform changes" section.
+
+ * NEWS: add "Implementation improvements" and add several entries.
+
+ * NEWS: add NEWS entries by Eric Wong. [ruby-core:72450]
+
+Thu Dec 24 00:26:05 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/io/console/extconf.rb: fix gem build failure on Windows.
+ only win32_vk.inc is included in the gem and no dependencies for
+ the header, so that gperf will not be mandatory.
+ [ruby-core:72453] [Bug #11866]
+
+ * ext/io/console/io-console.gemspec: include depend file and
+ win32_vk header.
+
+Wed Dec 23 23:58:44 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * io.c (rb_readwrite_syserr_fail): works with the given errno than
+ thread local errno.
+
+Wed Dec 23 17:57:45 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * file.c, io.c, util.c: prefer rb_syserr_fail with saved errno
+ over setting errno then call rb_sys_fail, not to be clobbered
+ potentially and to reduce thread local errno accesses.
+
+Wed Dec 23 11:58:52 2015 Yuichiro Kaneko <yui-knk@ruby-lang.org>
+
+ * string.c: Fix document. Default value of the first
+ argument of `String#split` is not `$;` but `nil`.
+ When `nil` is passed as first argument, `$;` is used.
+ [ci skip] [Bug #11729] [ruby-dev:49378]
+
+Wed Dec 23 07:15:17 2015 Eric Wong <e@80x24.org>
+
+ * ext/socket/init.c (rsock_init_sock): reject reserved FDs
+ [ruby-core:72445] [Bug #11862]
+
+Wed Dec 23 02:59:26 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in (__STDC_WANT_LIB_EXT1__): necessary to use memset_s
+ in strict C99 mode.
+
+Wed Dec 23 02:34:36 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * regexec.c (match_at): move direct threaded VM code to get rid of
+ mixed declarations and code, and enable it only for gcc since it
+ depends on a gcc extension.
+
+Wed Dec 23 02:23:19 2015 Yuki Nishijima <mail@yukinishijima.net>
+
+ * gems/bundled_gems: Upgrade the did_you_mean gem to 1.0.0
+
+ * NEWS: Add news about the did_you_mean gem
+
+Wed Dec 23 02:18:57 2015 Jake Worth <jakeworth82@gmail.com>
+
+ * doc/contributing.rdoc: [DOC] remove an extra word "here".
+ [Fix GH-1169]
+
+Wed Dec 23 01:58:20 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * regexec.c (USE_DIRECT_THREADED_VM): enable direct threaded VM by
+ the default.
+
+Tue Dec 22 22:15:53 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * gc.c (internal_object_p): should not expose singleton classes
+ without a metaclass. based on patches by ko1 and shugo.
+ [Bug #11740]
+
+ * class.c (rb_singleton_class_object_p): added.
+
+Tue Dec 22 22:15:08 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/io/console/io-console.gemspec: bump up to 0.4.4.
+
+Tue Dec 22 22:11:06 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * NEWS: Added news entry of Psych 2.0.17
+
+Tue Dec 22 22:09:01 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * NEWS: Added news entry of RDoc 4.2.1
+
+Tue Dec 22 21:20:00 2015 Kenta Murata <mrkn@mrkn.jp>
+
+ * ext/bigdecimal/bigdecimal.gemspec: bump version to 1.2.8.
+
+Tue Dec 22 21:08:05 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * lib/rdoc.rb: bump version to 4.2.1. It contains following fixes.
+ https://github.com/rdoc/rdoc/pull/340
+ https://github.com/rdoc/rdoc/pull/341
+ https://github.com/rdoc/rdoc/pull/367
+ https://github.com/rdoc/rdoc/pull/368
+ * lib/rdoc/*: ditto.
+ * test/rdoc/*: ditto.
+
+Tue Dec 22 20:25:33 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * ext/psych/lib/psych.rb: bump version to 2.0.17
+ * ext/psych/psych.gemspec: ditto.
+
+Tue Dec 22 20:14:47 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_insnhelper.c: move vm_callee_setup_block_arg() (and related
+ functions) to the latter location.
+ This moving recovers performance a little.
+ [Bug #11829]
+
+Tue Dec 22 15:21:11 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * string.c (str_compat_and_valid): as scrub does nothing for dummy
+ encoding string now, incompatible encoding is not a matter.
+
+Tue Dec 22 14:31:28 2015 Toru Iwase <tietew@tietew.net>
+
+ * ext/cgi/escape/escape.c (optimized_escape_html): CGI.escapeHTML
+ should return unfrozen new string.
+ [ruby-core:72426] [Bug #11858]
+
+Tue Dec 22 05:39:58 2015 Takashi Kokubun <takashikkbn@gmail.com>
+
+ * ext/cgi/escape/escape.c (preserve_original_state): Preserve
+ original state for tainted and frozen. [Fix GH-1166]
+ [ruby-dev:49451] [Bug #11855]
+
+Tue Dec 22 03:57:20 2015 Eric Wong <e@80x24.org>
+
+ * ext/socket/init.c (rsock_init_sock): check FD after validating
+ * test/socket/test_basicsocket.rb (test_for_fd): new
+ [ruby-core:72418] [Bug #11854]
+
+Mon Dec 21 21:29:45 2015 Naohisa Goto <ngotogenome@gmail.com>
+
+ * variable.c (struct ivar_update): rename "extended" to "iv_extended"
+ to avoid name conflict with /usr/include/floatingpoint.h on
+ Solaris. [Bug #11853] [ruby-dev:49448]
+
+Mon Dec 21 12:15:32 2015 Kimura Wataru <kimuraw@i.nifty.jp>
+
+ * test/ruby/test_io.rb: handled rlimit value same as r52277
+ [Bug #11852][ruby-dev:49446]
+
+Mon Dec 21 10:21:22 2015 Ilya Vassilevsky <vassilevsky@gmail.com>
+
+ * lib/net/http.rb (open_timeout): update default value in RDoc
+ [ruby-core:72413]
+
+Mon Dec 21 10:18:46 2015 Kazuki Yamaguchi <k@rhe.jp>
+
+ * vm_backtrace.c (rb_profile_frames): ignore ifunc frames as it
+ did before. [ruby-core:72409] [Bug #11851]
+
+Mon Dec 21 09:33:17 2015 Karol Bucek <kares@users.noreply.github.com>
+
+ * ext/openssl/lib/openssl/ssl.rb (OpenSSL::SSL::SSLSocket): fix
+ NotImplementedError typo. [Fix GH-1165]
+
+Sun Dec 20 20:54:51 2015 Takashi Kokubun <takashikkbn@gmail.com>
+
+ * cgi/escape/escape.c: Optimize CGI.escapeHTML for
+ ASCII-compatible encodings. [Fix GH-1164]
+
+Sun Dec 20 15:36:46 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * lib/erb.rb: revert r53123. It breaks compatibility like thor and
+ rspec-rails.
+ We should try with Ruby 2.4 or 3.0.
+ [Bug #11842][ruby-core:72374]
+ * lib/rdoc/erb_partial.rb: ditto.
+ * template/verconf.h.tmpl: ditto.
+
+Sun Dec 20 11:43:31 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (parser_yylex): allow here documents in labeled
+ argument. [ruby-core:72396] [Bug #11849]
+
+Sun Dec 20 11:14:11 2015 Koichi Sasada <ko1@atdot.net>
+
+ * proc.c (rb_mod_define_method): should check Symbol or not.
+ [Bug #11850]
+
+ * test/ruby/test_method.rb: add a test.
+
+Sun Dec 20 11:01:57 2015 Koichi Sasada <ko1@atdot.net>
+
+ * proc.c (rb_mod_define_method): fix notation.
+
+Sun Dec 20 10:54:15 2015 Koichi Sasada <ko1@atdot.net>
+
+ * proc.c (proc_new): fix notation.
+
+Sun Dec 20 00:29:00 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * proc.c (rb_proc_get_iseq): proc made from symbol does not have
+ iseq. fix infinite loop. [ruby-core:72381] [Bug #11845]
+
+Sat Dec 19 20:06:10 2015 Naohisa Goto <ngotogenome@gmail.com>
+
+ * enc/windows_1250.c: Should not use C++ style comments (C99 feature).
+ [Bug #11843]
+
+Sat Dec 19 17:17:04 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/webrick/utils.rb (WEBrick::Utils::TimeoutHandler#initialize):
+ use WEBrick::Utils::TimeoutHandler::Thread, which is ignored by
+ LeakChecker#find_threads, instead of ::Thread to get rid of
+ thread leak checker. since this TimeoutHandler is resident
+ during tests because of Singleton, it waits for the next timeout
+ if it has any schedules. in the case of nested timeouts, inner
+ timeout does not cancel outer timeouts and then those schedules
+ still remain.
+
+Sat Dec 19 14:28:01 2015 Jake Worth <jakeworth82@gmail.com>
+
+ * ext/zlib/zlib.c (Init_zlib): [DOC] Fix double-word typo and
+ grammatical error. [Fix GH-1162]
+
+Sat Dec 19 14:23:59 2015 Jake Worth <jakeworth82@gmail.com>
+
+ * lib/csv.rb (CSV#initialize): [DOC] Fix double-word typo.
+ [Fix GH-1161]
+
+Sat Dec 19 10:33:33 2015 Martin Duerst <duerst@it.aoyama.ac.jp>
+
+ * enc/iso_8859_2.c, enc/windows_1250.c: separate Windows-1250
+ from ISO-8859-2 to fix 0x80..0x9e range (from Kimihito Matsui)
+
+Fri Dec 18 21:26:54 2015 Naohisa Goto <ngotogenome@gmail.com>
+
+ * lib/webrick/utils.rb (WEBrick::Utils::TimeoutHandler): To prevent
+ potential deadlocks, Queue is used to tell update of @timeout_info
+ instead of sleep and wakeup. [Bug #11742] [ruby-dev:49387]
+
+Fri Dec 18 17:24:09 2015 Koichi Sasada <ko1@atdot.net>
+
+ * compile.c (ibf_load_object_string): use fstring if frozen string.
+
+Fri Dec 18 16:54:38 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/stringio/stringio.c (strio_set_encoding): add StringIO's own
+ encoding and separate it from the buffer string to override the
+ encoding of string when reading. [ruby-core:72189] [Bug #11827]
+ note that setting the encoding of its buffer string directly
+ without StringIO#set_encoding may cause unpredictable behavior.
+
+Fri Dec 18 16:50:35 2015 Koichi Sasada <ko1@atdot.net>
+
+ * compile.c (ibf_load_setup): check tainted string argument.
+
+Fri Dec 18 16:12:13 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_core.h: define USE_LAZY_LOAD if it is not defined.
+
+Fri Dec 18 15:40:06 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/stringio/stringio.c (strio_unget_bytes): extract from
+ strio_ungetbyte to share with strio_ungetc.
+
+Fri Dec 18 12:39:42 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * doc/syntax/*.rdoc: separated modifier at sentence.
+ [ci skip][fix GH-1121] Patch by @clandry94
+
+Fri Dec 18 12:09:21 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/stringio/stringio.c (strio_ungetbyte): pad with \000 when
+ the current position is after the end.
+
+Fri Dec 18 11:24:48 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * vm_method.c (rb_method_entry_make, check_override_opt_method):
+ should check whether a newly created method overrides an optimize
+ method in case the method is defined in a prepended module of a
+ built-in class.
+ [ruby-core:72226] [Bug #11836]
+
+Fri Dec 18 11:09:38 2015 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * vm.c (vm_exec): call RUBY_DTRACE_CMETHOD_RETURN_HOOK instead of
+ RUBY_DTRACE_METHOD_RETURN_HOOK.
+
+Fri Dec 18 10:24:44 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * lib/irb/ruby-lex.rb: fixed parse error for striped heredocument syntax.
+ [fix GH-1127] Patch by @koic
+
+Fri Dec 18 09:44:47 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * ext/pty/pty.c: fix double words typo.
+ [ci skip][fix GH-1157] Patch by @jwworth
+
+Fri Dec 18 09:42:45 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * ext/nkf/nkf-utf8/utf8tbl.c: fix a typo.
+ [ci skip][fix GH-1159] Patch by @akshay-vishnoi
+ * ext/nkf/nkf-utf8/utf8tbl.h: ditto.
+
+Fri Dec 18 07:39:01 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * vm.c (rb_vm_check_redefinition_opt_method): should check the real
+ class instead of the origin iclass.
+ [ruby-core:72188] [Bug #11826]
+
+Thu Dec 17 22:13:10 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * vm_args.c (vm_caller_setup_arg_block): remove code for ifunc
+ because it was made unnecessary by r52138.
+
+Thu Dec 17 16:13:10 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * proc.c (rb_block_arity): should not call GetProcPtr() for symbols.
+ [ruby-core:72205] [Bug #11830]
+
+Thu Dec 17 14:16:29 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * string.c (rb_str_scrub): the result should be infected by the
+ original string.
+
+Thu Dec 17 13:35:27 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * transcode.c (rb_econv_substr_append, econv_primitive_convert):
+ the result should be infected by the original string.
+
+Thu Dec 17 09:46:08 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * re.c (reg_names_iter): should consider encoding of regexp.
+ [ruby-core:72185] [Bug #11825]
+
+Thu Dec 17 03:52:10 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm.c (vm_make_env_each): should not compare with Qfalse and FALSE.
+ Pointed at http://d.hatena.ne.jp/nagachika/20151216/ruby_trunk_changes_53128_53163
+
+Thu Dec 17 03:15:25 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_insnhelper.c (vm_call_method_each_type): should not set fastpath
+ with keyword arguments for VM_METHOD_TYPE_ATTRSET type methods.
+
+ Normally, we can not use keyword arguments for this kind of methods,
+ (obj.foo = 1), but we can set alias names for them.
+ [Bug #11657]
+
+ * test/ruby/test_keyword.rb: add a test for this fix.
+
+Wed Dec 16 20:32:43 2015 CHIKANAGA Tomoyuki <nagachika@ruby-lang.org>
+
+ * ext/fiddle/handle.c: check tainted string arguments.
+ Patch provided by tenderlove and nobu.
+
+ * test/fiddle/test_handle.rb (class TestHandle): add test for above.
+
+
+Wed Dec 16 19:30:56 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * vm.c (vm_make_proc_from_block): should convert a Symbol to a Proc.
+ [ruby-core:72083] [Bug #11811]
+
+Wed Dec 16 16:17:34 2015 Eric Wong <e@80x24.org>
+
+ * test/ruby/test_io.rb: fix spelling errors
+
+Wed Dec 16 16:04:49 2015 Eric Wong <e@80x24.org>
+
+ * NEWS: note IO#advise change [ruby-core:72168]
+
+Wed Dec 16 15:35:13 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm.c: fix mark miss for proc given as passed block.
+ [Bug #11750]
+
+ * vm.c (vm_make_proc_from_block): should return a Proc object
+ if block is given. Previous implementation returns
+ a Proc object only when corresponding Proc object is not
+ available.
+
+ * vm.c (vm_make_env_each): ditto.
+
+ * test/ruby/test_proc.rb: add a test for this bug.
+
+Wed Dec 16 12:24:59 2015 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
+
+ * test_struct.rb: Test that initialize is overridable [#11708]
+
+Wed Dec 16 10:49:51 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (block_command, block_call): fix `&.` calls after
+ block_call. [Feature #11537]
+
+Wed Dec 16 00:53:45 2015 Naohisa Goto <ngotogenome@gmail.com>
+
+ * lib/webrick/utils.rb (WEBrick::Utils::TimeoutHandler): Acquire
+ TimeoutMutex only when accessing @timeout_info for avoiding
+ potential deadlock. [Bug #11742] [ruby-dev:49387]
+
+Wed Dec 16 00:39:27 2015 Jake Worth <jakeworth82@gmail.com>
+
+ * doc/extension.rdoc: [DOC] fix double-word typo. [Fix GH-1153]
+
+Wed Dec 16 00:25:41 2015 Naohisa Goto <ngotogenome@gmail.com>
+
+ * lib/webrick/utils.rb (WEBrick::Utils::TimeoutHandler#initialize):
+ TimeoutMutex should be acquired when accessing @timeout_info.
+ To avoid deadlock, interrupt() calls are delayed.
+ Due to the mutex, it is safe to treat ary without ary.dup.
+ [Bug #11742] [ruby-dev:49387]
+
+Tue Dec 15 23:13:10 2015 Naohisa Goto <ngotogenome@gmail.com>
+
+ * gc.c: Delete excess semicolon after RUBY_ALIAS_FUNCTION().
+ Suppress "syntax error: empty declaration" warnings by
+ Oracle Solaris Studio 12.x on Solaris. [Bug #11821]
+
+ * hash.c: ditto, after NOINSERT_UPDATE_CALLBACK().
+
+Tue Dec 15 18:04:04 2015 Martin Duerst <duerst@it.aoyama.ac.jp>
+
+ * NEWS: added news about EBCDIC encoding
+
+Tue Dec 15 17:57:57 2015 Martin Duerst <duerst@it.aoyama.ac.jp>
+
+ * enc/ebcdic.h, enc/trans/ebcdic.trans,
+ test/ruby/test_transcode.rb: Fixed encoding name
+ to the correct one in the IANA registry (IBM037)
+ and added an alias (ebcdic-cp-us)
+
+Tue Dec 15 16:19:26 2015 Takashi Kokubun <takashikkbn@gmail.com>
+
+ * lib/erb.rb: Render erb with array buffer for function call optimization.
+ [fix GH-1143]
+ * lib/rdoc/erb_partial.rb: ditto.
+ * template/verconf.h.tmpl: ditto.
+
+Tue Dec 15 13:50:05 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * string.c (rb_str_oct): [DOC] mention radix indicators.
+ [ruby-core:71310] [Bug #11648]
+
+Tue Dec 15 12:20:30 2015 Takashi Kokubun <takashikkbn@gmail.com>
+
+ * lib/erb.rb: Simplify regexp to optimize erb scanner.
+ [fix GH-1144]
+
+Tue Dec 15 11:56:24 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * lib/uri/common.rb: make code block for rdoc.
+ [ci skip][fix GH-1152] Patch by @Tonkpils
+
+Tue Dec 15 11:55:08 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * ext/zlib/zlib.c: fix a typo.
+ [ci skip][fix GH-1149] Patch by @crismali
+
+Tue Dec 15 09:14:14 2015 Martin Duerst <duerst@it.aoyama.ac.jp>
+
+ * tool/transcode_tablegen.rb: detailed documentation
+ for transcode_tblgen function [ci skip]
+
+Mon Dec 14 22:11:11 2015 Martin Duerst <duerst@it.aoyama.ac.jp>
+
+ * enc/ebcdic.h: new dummy encoding EBCDIC-US
+ * enc/trans/ebcdic.trans: transcodings between EBCDIC-US
+ and iso-8859-1 [with code from Andrea Ribuoli]
+ * test/ruby/test_transcode.rb: tests for above
+ * tool/transcode_tablegen.rb: additional argument for
+ method transcode_tblgen
+
+Mon Dec 14 17:04:14 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * ext/socket/lib/socket.rb: use safe navigation operator.
+ [fix GH-1142] Patch by @mlarraz
+ * lib/drb/extservm.rb: ditto.
+ * lib/net/http.rb: ditto.
+ * lib/net/http/response.rb: ditto.
+ * lib/scanf.rb: ditto.
+ * lib/uri/generic.rb: ditto.
+
+Mon Dec 14 17:03:05 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * bootstraptest/runner.rb: use safe navigation operator.
+ [fix GH-1142] Patch by @mlarraz
+ * test/openssl/test_pair.rb: ditto.
+ * test/ruby/test_econv.rb: ditto.
+ * test/ruby/test_settracefunc.rb: ditto.
+ * test/thread/test_queue.rb: ditto.
+
+Mon Dec 14 14:33:35 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * lib/xmlrpc.rb: added documentation for parser details.
+ [ci skip][fix GH-1124] Patch by @jrafanie
+
+Mon Dec 14 11:46:52 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * enum.c: fix a typo in documentation.
+ [ci skip][fix GH-1140] Patch by @jutaz
+ * io.c: ditto.
+ * iseq.c: ditto.
+ * numeric.c: ditto.
+ * process.c: ditto.
+ * string.c: ditto.
+ * vm_trace.c: ditto.
+
+Mon Dec 14 11:41:59 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * lib/cgi.rb: fix a typo in documentation.
+ [ci skip][fix GH-1140] Patch by @jutaz
+
+Mon Dec 14 11:31:00 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * compile.c: fix typos.
+ [ci skip][fix GH-1140] Patch by @jutaz
+ * dir.c: ditto.
+ * gc.c: ditto.
+ * io.c: ditto.
+ * node.h: ditto.
+ * thread_pthread.c: ditto.
+ * vm_insnhelper.c: ditto.
+ * vsnprintf.c: ditto.
+
+Mon Dec 14 11:27:01 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * enc/iso_2022_jp.h: fix typos.
+ [ci skip][fix GH-1140] Patch by @jutaz
+ * enc/utf_16_32.h: ditto.
+ * enc/utf_7.h: ditto.
+
+Mon Dec 14 11:25:57 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * benchmark/bm_app_aobench.rb: fix typos.
+ [ci skip][fix GH-1140] Patch by @jutaz
+ * benchmark/bm_vm_thread_pipe.rb: ditto.
+
+Sun Dec 13 23:46:10 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (trace_lex_state): trace lex_state changes if yydebug is
+ set, and send the messages to rb_stdout.
+
+ * parse.y (rb_parser_printf): store YYPRINTF messages per lines
+ so that lex_state traces do not mix.
+
+ * tool/ytab.sed: add parser argument to yy_stack_print too.
+
+Sun Dec 13 20:41:16 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (build_lex_state_name, trace_lex_state): lex_state is
+ now bit flags and can be set 2 bits or more.
+
+Sun Dec 13 20:26:30 2015 Yuki Yugui Sonoda <yugui@yugui.jp>
+
+ * test/ruby/test_syntax.rb: fix typo in test
+
+Sun Dec 13 20:12:14 2015 Yuki Yugui Sonoda <yugui@yugui.jp>
+
+ * parse.y (parse_percent): Allow %-literals in labeled arg as
+ r51624 did for parentheses.
+ Fixes [ruby-core:72084] [Bug #11812].
+
+Sun Dec 13 20:02:15 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * ChangeLog: fix a typo
+
+Sun Dec 13 19:54:26 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * test/lib/envutil.rb: move envutil's assertions under Test::Unit::Assertion.
+ * test/lib/test/unit/assertions.rb: ditto.
+
+Sun Dec 13 19:24:20 2015 Yuki Yugui Sonoda <yugui@yugui.jp>
+
+ * parse.y (lex_state_name): Make it return the correct names.
+ Add new names to follow r51617; Indices ffs(2) returns are 1-origin.
+
+Sun Dec 13 18:40:45 2015 Yuki Yugui Sonoda <yugui@yugui.jp>
+
+ * parse.y: debug output of lex_state transition if PARSER_DEBUG
+
+Sun Dec 13 18:49:25 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * io.c (parse_mode_enc): preserve encoding of mode string in
+ warnings.
+
+ * io.c (io_encname_bom_p): check BOM prefix only, not including
+ UTF prefix.
+
+ * io.c (parse_mode_enc): warn BOM with non-UTF encoding.
+
+ * io.c (parse_mode_enc): fix buffer overflow.
+
+Sun Dec 13 18:35:57 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/fiddle/function.c (initialize): check all arguments first.
+ reported by Marcin 'Icewall' Noga of Cisco Talos.
+
+ * ext/fiddle/conversions.h (PTR2NUM): use signed integer to make
+ Fixnum for negative values.
+
+Sun Dec 13 18:33:41 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * pack.c (pack_pack): always check index range against the
+ receiver array length, which can be shortened by elements
+ conversion. reported by Marcin 'Icewall' Noga of Cisco Talos.
+
+Sun Dec 13 18:28:52 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/psych/psych_emitter.c (start_document): should not exceed
+ tags array range.
+
+ * ext/psych/psych_emitter.c (start_document): ensure string before
+ encoding conversion.
+
+Sun Dec 13 18:26:31 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/tk/tkutil/tkutil.c (tk_hash_kv): check types of array
+ argument. reported by Marcin 'Icewall' Noga of Cisco Talos.
+
+ * ext/tk/tkutil/tkutil.c (cbsubst_table_setup): check length of
+ argument arrays for each access, as callback methods can modify
+ them. reported by Marcin 'Icewall' Noga of Cisco Talos.
+
+ * ext/tk/tkutil/tkutil.c (cbsubst_table_setup): check types of
+ argument elements. reported by Marcin 'Icewall' Noga of Cisco
+ Talos.
+
+Sun Dec 13 18:19:20 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/win32ole/win32ole.c (ole_vstr2wc): check argument type, vstr
+ must be a String here. reported by Marcin 'Icewall' Noga of
+ Cisco Talos.
+
+Sun Dec 13 16:41:01 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in (BOOTSTRAPRUBY): make BASERUBY full path before
+ building ruby to get rid of unexpectedly invoking built ruby.
+ [ruby-core:72065] [Bug #11807]
+
+ * configure.in (BOOTSTRAPRUBY): use MINIRUBY but not BASERUBY
+ unless cross compiling. [ruby-core:72065] [Bug #11807]
+
+Sun Dec 13 14:17:19 2015 Akinori MUSHA <knu@iDaemons.org>
+
+ * test/test_shellwords.rb (TestShellwords): Add many more tests
+ for handling whitespace characters and frozenness.
+
+Sun Dec 13 14:16:09 2015 Akinori MUSHA <knu@iDaemons.org>
+
+ * lib/shellwords.rb (Shellwords#shellsplit): Document that this
+ method does not treat shell metacharacters as such.
+
+Sun Dec 13 12:17:43 2015 Eric Wong <e@80x24.org>
+
+ * lib/shellwords.rb (shellescape): duplicate frozen literal
+ * test/test_shellwords.rb (test_stringification): new test
+
+Sun Dec 13 11:47:35 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * object.c (rb_inspect): check the default internal encoding as
+ String#inspect do.
+ [ruby-dev:49415] [Bug #11787]
+
+Sun Dec 13 11:38:12 2015 Akinori MUSHA <knu@iDaemons.org>
+
+ * lib/shellwords.rb: Turn on frozen-string-literal after fixing
+ shellsplit.
+
+Sun Dec 13 10:44:44 2015 Martin Duerst <duerst@it.aoyama.ac.jp>
+
+ * KNOWNBUGS.rb: Fixed typo, made more explicit [ci skip]
+
+Sun Dec 13 10:26:47 2015 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * ext/openssl/ossl_ssl.c (ssl_npn_select_cb_common): fix parsing
+ protocol list.
+ The protocol list from OpenSSL is not null-terminated.
+ patched by Kazuki Yamaguchi [Bug #11810] [ruby-core:72082]
+
+Sun Dec 13 06:40:30 2015 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
+
+ * lib/ostruct.rb: Have OpenStruct#dig raise if argument is not a
+ symbol
+ nor a string. See [#11762]
+
+Sun Dec 13 00:05:42 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * vm_insnhelper.c (vm_call_method_missing): method_missing should
+ not be refined.
+ [ruby-core:72080] [Bug #11809]
+
+Sat Dec 12 23:00:17 2015 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * ext/nkf/nkf-utf8/nkf.c: Merge nkf 2.1.4.
+
+Sat Dec 12 18:52:26 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * object.c (rb_obj_dig): raise TypeError if an element does not
+ have #dig method. [ruby-core:71798] [Bug #11762]
+
+Sat Dec 12 17:59:07 2015 Yuichiro Kaneko <yui-knk@ruby-lang.org>
+
+ * test/ruby/test_regexp.rb: Add test cases for `$KCODE` and `$=` warning
+ [Misc #11770][ruby-dev:49398]
+
+Sat Dec 12 17:11:57 2015 CHIKANAGA Tomoyuki <nagachika@ruby-lang.org>
+
+ * doc/NEWS-0.2.2: add description about incompatible change in Hash
+ duplicated key overriding policy. [Bug #10315] [Bug #11501]
+
+Sat Dec 12 07:44:38 2015 Eric Wong <e@80x24.org>
+
+ * io.c (do_io_advise): do not raise on ENOSYS
+ * test/ruby/test_io.rb (test_advise): do not skip on Errno::ENOSYS
+ (test_advise_pipe): ditto
+ [ruby-core:72066] [Feature #11806]
+
+Sat Dec 12 07:05:29 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * enc/windows_1252.c: separate from ISO-8859-1 to fix 0x80..0x9e
+ range. [ruby-core:64049] [Bug #10097]
+
+Fri Dec 11 23:33:40 2015 Yusuke Endoh <mame@ruby-lang.org>
+
+ * sample/trick2015/: added the award-winning entries of TRICK 2015.
+ See https://github.com/tric/trick2015 for the contest outline.
+
+Fri Dec 11 17:59:05 2015 Eric Wong <e@80x24.org>
+
+ * insns.def (opt_case_dispatch): avoid converting Infinity
+ * test/ruby/test_optimization.rb (test_opt_case_dispatch_inf): new
+ [ruby-dev:49423] [Bug #11804]'
+
+Fri Dec 11 16:48:57 2015 Eric Wong <e@80x24.org>
+
+ * hash.c (rb_num_hash_start): avoid pathological behavior
+ [ruby-core:72028] [Feature #11405]
+
+Fri Dec 11 11:58:46 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * NEWS: Mentioned rubygems-2.5.1
+
+Fri Dec 11 11:52:39 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * lib/rubygems: Update to RubyGems 2.5.1
+ * test/rubygems: ditto.
+
+Fri Dec 11 11:38:14 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * compile.c (iseq_compile_each, ibf_load_object_hash): rehash
+ case-dispatch hash to reduce collisions.
+ http://d.hatena.ne.jp/ku-ma-me/20151210
+
+Fri Dec 11 03:44:43 2015 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * object.c (rb_inspect): dump inspected result with rb_str_escape()
+ instead of raising Encoding::CompatibilityError. [Feature #11801]
+
+ * string.c (rb_str_escape): added to dump given string like
+ rb_str_inspect without quotes and always dump in US-ASCII
+ like rb_str_dump.
+
+Thu Dec 10 14:59:59 2015 Koichi Sasada <ko1@atdot.net>
+
+ * test/ruby/test_gc.rb (test_expand_heap): relax condition (1->2).
+
+Thu Dec 10 14:15:59 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * cont.c: fix a double word typo.
+ [Bug #11313][ruby-core:69749]
+
+Thu Dec 10 14:13:34 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * ext/tk/lib/multi-tk.rb: fix typos.
+ [Bug #11764][ruby-core:71800]
+
+Thu Dec 10 11:33:34 2015 Eric Wong <e@80x24.org>
+
+ * compile.c (iseq_compile_each): reduce needless rb_str_dup
+ [ruby-core:72018] <5668DB6E.8000101@ruby-lang.org>
+
+Thu Dec 10 09:32:51 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/mkmf.rb, lib/shellwords.rb: disable frozen-string-literal.
+ [ruby-core:72011] [Bug #11800]
+
+Thu Dec 10 06:33:39 2015 Eric Wong <e@80x24.org>
+
+ * marshal.c (memsize_dump_arg): remove NULL check
+ (memsize_load_arg): ditto
+
+Thu Dec 10 05:53:18 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * tool/mkconfig.rb: rbconfig must not be frozen-string-literal to
+ expand CONFIG hash. [ruby-core:72006] [Bug #11798]
+
+Thu Dec 10 05:03:51 2015 Eric Wong <e@80x24.org>
+
+ * ext/socket/ifaddr.c (ifaddr_mark): remove empty function
+ (ifaddr_type): pass zero to rb_data_type_t.function.dmark
+
+Thu Dec 10 04:49:16 2015 Eric Wong <e@80x24.org>
+
+ * proc.c (bm_free): remove, use default free
+ (method_data_type): use RUBY_TYPED_DEFAULT_FREE
+
+Thu Dec 10 02:01:41 2015 Koichi Sasada <ko1@atdot.net>
+
+ * compile.c (iseq_compile_each): do not add debug information
+ without --debug or --debug=frozen-string-literal option
+ because String#dup slows down with debug information.
+ [Feature #11725]
+
+ * NEWS: apply about it.
+
+ * test/ruby/test_rubyoptions.rb: catch up this fix with refactoring.
+
+Thu Dec 10 00:06:56 2015 Koichi Sasada <ko1@atdot.net>
+
+ * iseq.c: rename methods
+ RubyVM::InstructionSequence#to_binary_format -> #to_binary
+ RubyVM::InstructionSequence.from_binary_format -> .load_from_binary
+ RubyVM::InstructionSequence.from_binary_format_extra_data ->
+ .load_from_binary_extra_data
+
+ * iseq.c: fix document of iseq.to_binary.
+ [Fix GH-1134]
+
+ * sample/iseq_loader.rb: catch up this change.
+
+ * test/lib/iseq_loader_checker.rb: ditto.
+
+Wed Dec 9 17:02:03 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * regparse.h (SET_NTYPE): get rid of breaking strict aliasing.
+ patch by Zarko Todorovski in [ruby-core:71953]. [Bug #11790]
+
+Wed Dec 9 16:10:37 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm.c (rb_vm_cref_in_context): Module#define_method in non-class
+ expression should be public.
+ [Bug #11754]
+
+ * test/ruby/test_method.rb: add a test.
+
+Wed Dec 9 14:45:27 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_mark_stacked_objects): fix typo.
+ reported by XIE Zhibang. [Bug #11763]
+
+Wed Dec 9 14:37:51 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * doc/syntax/refinements.rdoc: remove outdated description.
+
+Wed Dec 9 09:58:09 2015 Koichi Sasada <ko1@atdot.net>
+
+ * ext/**/*.c (*_memsize): same as r52986 for extensions.
+
+Wed Dec 9 09:46:19 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * .gitignore: ignored ISeq binary format.
+
+Wed Dec 9 09:34:41 2015 Koichi Sasada <ko1@atdot.net>
+
+ * *.c (*_memsize): do not check ptr.
+ NULL checking is finished Before call of memsize functions.
+ See r52979.
+
+Wed Dec 9 09:25:29 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * test/net/smtp/test_response.rb: use Test::Unit. We should use Test::Unit
+ without rubygems and rdoc.
+
+Wed Dec 9 06:26:23 2015 Colin Kelley <colindkelley@gmail.com>
+
+ * lib/uri/generic.rb: enable frozen_string_literal
+ (split_userinfo): remove explicit .freeze for string literals
+ (check_path): ditto
+ (query): ditto
+ (fragment): ditto
+ (to_s): ditto
+ [ruby-core:71910] [Bug #11759]
+
+Wed Dec 9 06:25:47 2015 Eric Wong <e@80x24.org>
+
+ * test/uri/test_generic.rb (to_s): new test
+ [ruby-core:71820]
+
+Wed Dec 9 02:18:52 2015 Koichi Sasada <ko1@atdot.net>
+
+ * compile.c (ibf_dump_memsize): should check NULL.
+
+Wed Dec 9 01:46:35 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * string.c (rb_str_init): now accepts new option parameter `encoding'.
+ [Feature #11785]
+
+Wed Dec 9 00:52:37 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * file.c (rb_stat_wr, rb_stat_ww): call get_stat only once and
+ reduce checking struct. patch by Yuki Kurihara in
+ [ruby-core:71949]. [Misc #11789]
+
+Wed Dec 9 00:24:33 2015 Koichi Sasada <ko1@atdot.net>
+
+ * compile.c (iseq_ibf_dump): dump extra data just string length.
+
+ * sample/iseq_loader.rb: add using
+ RubyVM::InstructionSequence.from_binary_format_extra_data method
+ (commented out).
+
+Mon Dec 9 00:21:19 2015 Yuki Nishijima <mail@yukinishijima.net>
+
+ * gems/bundled_gems: Upgrade the did_you_mean gem to 1.0.0.rc1
+
+Wed Dec 9 00:17:49 2015 Koichi Sasada <ko1@atdot.net>
+
+ * compile.c (ibf_load_setup): cast to int.
+
+Wed Dec 9 00:13:09 2015 Koichi Sasada <ko1@atdot.net>
+
+ * compile.c (ibf_setup_load): rename to ibf_load_setup().
+
+ * compile.c (iseq_load_setup): check binary format.
+
+Tue Dec 8 23:30:07 2015 Naohisa Goto <ngotogenome@gmail.com>
+
+ * test/io/console/test_io_console.rb (run_pty): Avoid waiting twice
+ for a process. Fix Errno::ECHILD in TestIO_Console#test_close and
+ TestIO_Console#test_sync.
+
+Tue Dec 8 23:05:47 2015 Koichi Sasada <ko1@atdot.net>
+
+ * compile.c (iseq_ibf_dump): fix for clang type checker.
+
+Tue Dec 8 23:04:02 2015 Koichi Sasada <ko1@atdot.net>
+
+ * iseq.c (iseq_s_load): fix mysterious bug.
+
+Tue Dec 8 22:31:58 2015 Koichi Sasada <ko1@atdot.net>
+
+ * introduce new ISeq binary format serializer/de-serializer
+ and a pre-compilation/runtime loader sample.
+ [Feature #11788]
+
+ * iseq.c: add new methods:
+ * RubyVM::InstructionSequence#to_binary_format(extra_data = nil)
+ * RubyVM::InstructionSequence.from_binary_format(binary)
+ * RubyVM::InstructionSequence.from_binary_format_extra_data(binary)
+
+ * compile.c: implement body of this new feature.
+
+ * load.c (rb_load_internal0), iseq.c (rb_iseq_load_iseq):
+ call RubyVM::InstructionSequence.load_iseq(fname) with
+ loading script name if this method is defined.
+
+ We can return any ISeq object as a result value.
+ Otherwise loading will be continue as usual.
+
+ This interface is not matured and is not extensible.
+ So that we don't guarantee the future compatibility of this method.
+ Basically, you shouldn't use this method.
+
+ * iseq.h: move ISEQ_MAJOR/MINOR_VERSION (and some definitions)
+ from iseq.c.
+
+ * encoding.c (rb_data_is_encoding), internal.h: added.
+
+ * vm_core.h: add several supports for lazy load.
+ * add USE_LAZY_LOAD macro to specify enable or disable of
+ this feature.
+ * add several fields to rb_iseq_t.
+ * introduce new macro rb_iseq_check().
+
+ * insns.def: some check for lazy loading feature.
+
+ * vm_insnhelper.c: ditto.
+
+ * proc.c: ditto.
+
+ * vm.c: ditto.
+
+ * test/lib/iseq_loader_checker.rb: enabled iff suitable
+ environment variables are provided.
+
+ * test/runner.rb: enable lib/iseq_loader_checker.rb.
+
+ * sample/iseq_loader.rb: add sample compiler and loader.
+
+ $ ruby sample/iseq_loader.rb [dir]
+
+ will compile all ruby scripts in [dir].
+ With default setting, this compile creates *.rb.yarb files
+ in same directory of target .rb scripts.
+
+ $ ruby -r sample/iseq_loader.rb [app]
+
+ will run with enable to load compiled binary data.
+
+Tue Dec 8 21:21:16 2015 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
+
+ * NEWS: mention about Enumerator::Lazy#grep_v.
+ [ruby-core:71845] [Feature #11773]
+
+Tue Dec 8 17:36:36 2015 Martin Duerst <duerst@it.aoyama.ac.jp>
+
+ * string.c: removed unused variable
+
+Tue Dec 8 16:23:40 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * enumerator.c (lazy_grep_v): add Enumerator::Lazy#grep_v as well
+ as Enumerable, to enumerate lazily.
+ [ruby-core:71845] [Feature #11773]
+
+Tue Dec 8 14:27:07 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * error.c (name_err_local_variables): new method
+ NameError#local_variables for internal use only.
+ [Feature #11777]
+
+Tue Dec 8 14:20:38 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * marshal.c (w_objivar): skip internal instance variables in
+ T_OBJECT too.
+
+Tue Dec 8 12:58:04 2015 Naohisa Goto <ngotogenome@gmail.com>
+
+ * test/io/console/test_io_console.rb (test_getpass): s.getpass
+ should be tested. Narrow ensure block. This reverts r52911.
+ [Bug #11780] [ruby-dev:49412]
+
+Tue Dec 8 10:40:21 2015 Eric Wong <e@80x24.org>
+
+ * benchmark/bm_vm2_case_lit.rb: new benchmark
+ * compile.c (case_when_optimizable_literal): add nil/true/false
+ * insns.def (opt_case_dispatch): ditto
+ * vm.c (vm_redefinition_check_flag): ditto
+ * vm.c (vm_init_redefined_flag): ditto
+ * vm_core.h: ditto
+ * object.c (InitVM_Object): define === explicitly for nil/true/false
+ * test/ruby/test_case.rb (test_deoptimize_nil): new test
+ * test/ruby/test_optimization.rb (test_opt_case_dispatch): update
+ (test_eqq): new test
+ [ruby-core:71923] [Feature #11769]
+ Original patch by Aaron Patterson <tenderlove@ruby-lang.org>
+
+Tue Dec 8 10:19:02 2015 Jake Worth <jakeworth82@gmail.com>
+
+ * lib/optparse.rb: fix double word typo in the document.
+ [Misc #10608] [Fix GH-1126]
+
+Tue Dec 8 09:03:19 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/date/date_core.c (d_lite_lshift): should check the argument
+ before negation.
+
+Tue Dec 8 08:56:16 2015 Eric Wong <e@80x24.org>
+
+ * insns.def (opt_case_dispatch): check Float#=== redefinition
+ * test/ruby/test_optimization.rb (test_opt_case_dispatch): new
+ [ruby-core:71920] [Bug #11784]
+
+Tue Dec 8 03:56:05 2015 Koichi Sasada <ko1@atdot.net>
+
+ * test/lib/iseq_loader_checker.rb: add iseq dumper/loader checker.
+ If you enable this checker (remove `#' in test/runner.rb),
+ you can see comparison results between an original iseq disassembed
+ result and dumped and loaded iseq disassembed result.
+
+ There are several bugs around there, because of inexact stack depth
+ calculation. Now, I leave these bugs because they are not critical
+ and difficult to solve completely.
+
+ * test/runner.rb: require test/lib/iseq_loader_checker.rb but
+ disabled at default (commented out).
+
+Tue Dec 8 03:45:47 2015 Eric Wong <e@80x24.org>
+
+ * doc/extension.rdoc: warn about kwargs performance in C
+ [Feature #11339] [ci skip]
+
+Tue Dec 8 03:44:51 2015 Koichi Sasada <ko1@atdot.net>
+
+ * iseq.c (iseq_load): disable peephole optimization option
+ because apply it multiple times change the sequence.
+ (iseq != peephole_optimize(load(iseq.to_a)))
+
+Tue Dec 8 03:43:21 2015 Koichi Sasada <ko1@atdot.net>
+
+ * compile.c (rb_iseq_build_from_ary): do not allocate table
+ if table_size is 0.
+
+Tue Dec 8 03:30:34 2015 Eric Wong <e@80x24.org>
+
+ * ext/socket/unixsocket.c (unix_send_io): document args
+ (unix_recv_io): ditto
+ * test/socket/test_unix.rb (test_fd_passing_class_mode): added
+
+Tue Dec 08 02:21:35 2015 Koichi Sasada <ko1@atdot.net>
+
+ * iseq.c (iseq_translate): at the end of constructing an iseq,
+ call RubyVM::InstructionSequence.translate(iseq) if this method
+ is defined. If the return value is also an object of
+ RubyVM::InstructionSequence, then use it instead of created one.
+
+ For example, this method is useful to test iseq dumper/loader
+ such as RubyVM::InstructionSequence#to_a and rb_iseq_load().
+
+ Because this method is for such internal experimental usage,
+ the interface is not matured. For example, this interface has
+ no extensibility. Two or more translators can not run
+ simultaneously.
+
+ So that we don't guarantee future compatibility of this method.
+ Basically, do not use this method.
+
+Tue Dec 8 01:57:13 2015 Aaron Patterson <tenderlove@ruby-lang.org>
+
+ * ext/psych/*: update psych to 2.0.16
+ * test/psych/*: ditto
+
+Mon Dec 7 23:45:20 2015 Koichi Sasada <ko1@atdot.net>
+
+ * string.c: introduce String#+@ and String#-@ to control
+ String mutability.
+ [Feature #11782]
+
+Mon Dec 7 23:39:49 2015 Ben Miller <bjmllr@gmail.com>
+
+ * parse.y: add heredoc <<~ syntax. [Feature #9098]
+
+Mon Dec 7 23:06:16 2015 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
+
+ * prelude.rb (IO#read_nonblock): [DOC] add missing options to
+ call-seq. [ruby-core:71627] [Bug #11730]
+
+Mon Dec 7 15:50:50 2015 Martin Duerst <duerst@it.aoyama.ac.jp>
+
+ * .gitignore: added cygruby*.def for Cygwin
+
+Sun Dec 6 19:52:31 2015 Eric Wong <e@80x24.org>
+
+ * include/ruby/intern.h (rb_autoload): deprecate
+ * internal.h (rb_autoload_str): declare
+ * load.c (rb_mod_autoload): use rb_autoload_str
+ * variable.c (rb_autoload): become compatibility wrapper
+ (rb_autoload_str): hoisted out from old rb_autoload
+ [ruby-core:71369] [Feature #11664]
+
+Sun Dec 6 18:25:22 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * test/webrick/test_cgi.rb (TestWEBrickCGI#test_cgi): gave up the test
+ of binary path info test on Windows because the test had passed
+ occasionally as the comment said.
+
+Sun Dec 6 15:25:06 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/io/console/console.c (console_getpass): add IO#getpass
+ method.
+
+Sun Dec 6 08:39:05 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * ext/json/json.gemspec: bump version to json 1.8.3. CRuby already contained
+ upstream changes.
+
+ https://github.com/ruby/ruby/commit/4d059bf9f5f10f3d3088de49fc87e5555db7770d
+ https://github.com/flori/json/commit/d4c99de78905d96c3f301f48b2c789943bb3f098
+
+ * ext/json/lib/json/version.rb: ditto.
+
+Sat Dec 5 17:48:25 2015 Lars Kanis <lars@greiz-reinsdorf.de>
+
+ * tool/fake.rb: Fix cross build when srcdir is an absolute path.
+
+ * Makefile.in: PREP dependency is needed when cross build too, not
+ "-r$(arch)-fake" to be used before created. [Fix GH-1125]
+
+Sat Dec 5 17:26:24 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * hash.c (env_str_new, env_path_str_new): make default string
+ UTF-8 for the case conversion is not possible. [Bug #8822]
+
+ * hash.c (get_env_cstr): convert non-ASCII string to UTF-8 string.
+
+ * hash.c (ruby_setenv): use wide char version to put environment
+ variable to deal with non-ASCII value.
+
+Sat Dec 5 09:56:50 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ruby_atomic.h (ATOMIC_CAS): old value to be swapped should be
+ same as the destination. immediate value may need type
+ promotion.
+
+ * ruby_atomic.h (ATOMIC_SIZE_CAS): fix the argument order of
+ InterlockedCompareExchange64. new value and then old value is
+ the last.
+
+Sat Dec 5 09:23:34 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * random.c (fill_random_seed): fix the size to be filled, not the
+ size of element, but the whole size of array.
+
+Sat Dec 5 06:03:54 2015 Eric Wong <e@80x24.org>
+
+ * vm.c (ruby_vm_verbose_ptr): make static
+ (ruby_vm_debug_ptr): ditto
+
+Sat Dec 5 00:56:29 2015 Naohisa Goto <ngotogenome@gmail.com>
+
+ * include/ruby/ruby.h (RB_OBJ_TAINT): follow-up of r52881.
+ Turn into void expression not to use unexpected result.
+ Fix "operands have incompatible types" error with
+ Oracle Solaris Studio 12.x on Solaris.
+
+Fri Dec 4 19:52:52 2015 Martin Duerst <duerst@it.aoyama.ac.jp>
+
+ * enc/iso_8859_13.c: Added three missing lower/upper-case
+ character pairs (from Kimihito Matsui)
+
+Fri Dec 4 18:57:57 2015 Martin Duerst <duerst@it.aoyama.ac.jp>
+
+ * enc/iso_8859_4.c: Added missing lower/upper-case character
+ pair (U+014A and U+014B, LATIN CAPITAL/SMALL LETTER ENG)
+ (from Kimihito Matsui)
+
+Fri Dec 4 16:48:19 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * string.c (rb_obj_as_string): fstring should not be infected.
+ re-apply r52872 and fix a typo.
+ TODO: other frozen strings also may not be.
+
+Fri Dec 4 15:21:45 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * lib/rubygems: Update to RubyGems 2.5.0+ HEAD(fdab4c4).
+ this version includes #1396, #1397, #1398, #1399
+ * test/rubygems: ditto.
+
+Fri Dec 4 11:22:40 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * thread.c (rb_thread_setname): name must be ascii-compatible, as
+ pthread APIs do not accept legacy wide char strings.
+
+Thu Dec 3 15:39:21 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * lib/scanf.rb: fixed double words typo.
+ [ci skip][fix GH-1123] Patch by @jwworth
+
+Thu Dec 3 15:37:56 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * test/ruby/test_mixed_unicode_escapes.rb: fixed typo.
+ [fix GH-1122] Patch by @davydovanton
+ * test/ruby/test_object.rb: ditto.
+ * test/socket/test_tcp.rb: ditto.
+
+Thu Dec 3 15:33:08 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * sprintf.c (rb_str_format): fix wrong shifting position in
+ Rational conversion when not at the beginning of the result.
+ [ruby-core:71806] [Bug #11766]
+
+Thu Dec 3 14:22:16 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * range.c (range_to_s): should be infected by the receiver.
+ str2 infects by appending. [ruby-core:71811] [Bug #11767]
+
+Thu Dec 3 11:57:12 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in: separate SET_CURRENT_THREAD_NAME, which can set
+ the name of current thread only, and SET_ANOTHER_THREAD_NAME,
+ which can set the name of other threads.
+
+ * thread.c (rb_thread_setname): use SET_ANOTHER_THREAD_NAME. OS X
+ is not possible to set another thread name.
+
+ * thread_pthread.c (native_set_thread_name, thread_timer): use
+ SET_CURRENT_THREAD_NAME.
+
+Wed Dec 02 22:57:46 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_core.h, iseq.h: remove rb_iseq_t::variable_body.
+ Fields in rb_iseq_t::variable_body are contained by
+ rb_iseq_t::body::mark_ary (hidden Array object).
+
+ Index 0 to 2 of mark_ary are reserved by these objects.
+
+ * iseq.c: catch up this fix.
+
+ * compile.c (rb_iseq_original_iseq): trivial rewrite.
+
+Wed Dec 2 17:19:02 2015 Koichi Sasada <ko1@atdot.net>
+
+ * iseq.h: introduce ISEQ_ORIGINAL_ISEQ() and
+ ISEQ_ORIGINAL_ISEQ_ALLOC() macro.
+
+ * compile.c: use them to access original iseq buffer.
+
+ * iseq.c: ditto.
+
+ * vm_core.h: rename iseq field to support this fix.
+
+Wed Dec 2 17:10:32 2015 Koichi Sasada <ko1@atdot.net>
+
+ * iseq.h: introduce ISEQ_FLIP_CNT_INCREMENT() macro.
+
+ * compile.c (iseq_compile_each): use it.
+
+ * vm_core.h: rename flip_cnt field to support this fix.
+
+Wed Dec 2 17:05:15 2015 Koichi Sasada <ko1@atdot.net>
+
+ * iseq.h: introduce ISEQ_COVERAGE() and ISEQ_COVERAGE_SET() macro.
+
+ * compile.c: use them.
+
+ * iseq.c: ditto.
+
+ * iseq.c (rb_iseq_coverage): added.
+
+ * thread.c (update_coverage): use rb_iseq_coverage().
+
+ * vm_core.h: rename coverage field name to support this fix.
+
+Wed Dec 2 17:00:54 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * encoding.c (enc_name, rb_enc_name_list_i, rb_enc_aliases_enc_i):
+ make fstring instead of making each copies.
+
+Wed Dec 2 16:32:08 2015 Koichi Sasada <ko1@atdot.net>
+
+ * iseq.h: introduce ISEQ_COMPILE_DATA() macro.
+
+ * compile.c, iseq.c: use ISEQ_COMPILE_DATA().
+
+ * vm_core.h: rename compile_data field to support this fix.
+
+Wed Dec 2 16:27:19 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * encoding.c (enc_m_loader): defer finding encoding object not to
+ be infected by marshal source. [ruby-core:71793] [Bug #11760]
+
+ * marshal.c (r_object0): enable compatible loader on USERDEF
+ class. the loader function is called with the class itself,
+ instead of an allocated object, and the loaded data.
+
+ * marshal.c (compat_allocator_table): initialize
+ compat_allocator_tbl on demand.
+
+ * object.c (rb_undefined_alloc): extract from rb_obj_alloc.
+
+Wed Dec 2 15:12:43 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * configure.in: Fixed double negative comments.
+ [Bug #11698][ruby-core:71506]
+
+Wed Dec 2 14:55:01 2015 yui-knk <spiketeika@gmail.com>
+
+ * test/ruby/test_string.rb: removed non executing tests.
+ [Misc #11757][ruby-dev:49397]
+
+Wed Dec 2 11:23:06 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * lib/csv.rb: enable frozen_string_literal.
+ [fix GH-1116] Patch by @marshall-lee
+
+Wed Dec 2 10:36:25 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * ext/bigdecimal/bigdecimal.c: Fix double word typo.
+ [ci skip][fix GH-1120] Patch by @jwworth
+
+Wed Dec 2 07:43:51 2015 Eric Wong <e@80x24.org>
+
+ * ext/openssl/ossl_ssl.c (mSSLExtConfig): make static
+ (eSSLError): ditto
+ (ID_callback_state): ditto
+ (ossl_ssl_ex_vcb_idx): ditto
+ (ossl_ssl_ex_store_p): ditto
+ (ossl_ssl_ex_ptr_idx): ditto
+ * ext/openssl/ossl_ssl.h: remove extern declarations for
+ mSSLExtConfig and eSSLError
+
+Wed Dec 2 07:41:08 2015 Eric Wong <e@80x24.org>
+
+ * missing/explicit_bzero.c (explicit_bzero): fixup r52839
+ for compilers with "weak" attribute
+
+Wed Dec 2 06:47:25 2015 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * missing/explicit_bzero.c: add ruby_explicit_bzero_hook_unused
+ for preventing optimization. Inspired from OpenBSD.
+
+Tue Dec 1 23:36:39 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * thread.c (rb_thread_setname): allow to reset thread name.
+
+Tue Dec 1 23:14:04 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * thread.c (rb_thread_setname): check the argument if valid
+ string. [ruby-core:71774] [Bug #11756]
+
+Tue Dec 1 17:13:41 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * string.c (rb_string_value_cstr): should not raise on frozen
+ string.
+
+Tue Dec 1 09:35:29 2015 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * missing/explicit_bzero.c: add a few comment.
+
+Tue Dec 1 09:31:19 2015 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * missing/explicit_bzero.c: add disabling optimization on gcc.
+
+Tue Dec 1 07:50:33 2015 Eric Wong <e@80x24.org>
+
+ * missing/explicit_bzero.c: new file. define explicit_bzero.
+ Fixup r52806
+
+Thu Oct 22 12:54:43 2015 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * thread_pthread.c (register_ubf_list): renamed from
+ add_signal_thread_list.
+ * thread_pthread.c (unregister_ubf_list): renamed
+ from remove_signal_thread_list.
+ * thread_pthread.c (ubf_wakeup_all_threads): renamed from
+ ping_signal_thread_list.
+ * thread_pthread.c (ubf_wakeup_thread): renamed from
+ ubf_select_each.
+ * thread_pthread.c (ubf_threads_empty): renamed from
+ check_signal_thread_list().
+ * thread_pthread.c (ubf_list_lock): renamed from
+ signal_thread_list_lock.
+
+ * thread_pthread.c (register_ubf_list): large simplification
+ by using ccan/list.h.
+ bonus: removed malloc() and exit(EXIT_FAILURE).
+ * thread_pthread.c (unregister_ubf_list): ditto.
+ * thread_pthread.c (ubf_threads_empty): ditto.
+ * thread_pthread.c (ubf_wakeup_all_threads): ditto.
+
+ * thread_pthread.c (print_signal_list): removed.
+
+Thu Oct 22 08:03:49 2015 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * test/ruby/test_rand.rb (TestRand#test_default_seed): add
+ srand case.
+
+Thu Oct 22 06:33:38 2015 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * random.c (InitVM_Random): move Random::DEFAULT initialization
+ bits to Init_Random_default.
+ * random.c (Init_Random_default): renamed from Init_RandomSeed2.
+ * random.c (Init_RandomSeedCore): renamed from Init_RandomSeed.
+
+Thu Oct 22 06:20:48 2015 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * random.c (Init_RandomSeed): move all Random::DEFAULT
+ construction bits to Init_RandomSeed2. Random::DEFAULT
+ and Ruby internal hashes are no longer shared their seed.
+ * random.c (Init_RandomSeed2): ditto. And, kill evil
+ rb_obj_reveal() stuff.
+
+ * random.c (init_hashseed): add MT argument.
+ * random.c: (init_siphash): ditto.
+
+ * test/ruby/test_rand.rb (TestRand#test_default_seed): new
+ test for Random::DEFAULT::seed.
+
+Thu Oct 22 05:23:48 2015 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * random.c (init_hashseed, init_siphash): extract initialize
+ functions.
+
+Thu Oct 22 01:01:34 2015 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * configure.in: sort AC_CHECK_HEADERS() by alphabetical order.
+
+Thu Oct 22 00:19:07 2015 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * random.c (init_randomseed): remove "initial" argument. It never
+ be used from outside of this function.
+
+Thu Oct 22 00:12:33 2015 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * lib/securerandom.rb (SecureRandom::gen_random): use /dev/urandom
+ for initialize OpenSSL's rand.
+
+Wed Oct 21 12:10:04 2015 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * ext/openssl/ossl_rand.c (ossl_rand_bytes): RAND_bytes could
+ be return -1 as an error. Therefore, added error handling.
+ * ext/openssl/ossl_pkey_dsa.c (dsa_generate): ditto.
+
+Wed Oct 21 09:04:09 2015 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * include/ruby/util.h: remove a warning suppression C4723
+ (potential divide by zero) for VisualC++. It's meaningless.
+ Before r26197, there is ruby_div0() in this place and it
+ actually made divide by zero. But now it's just garbage.
+
+Wed Oct 21 08:23:36 2015 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * random.c: random_raw_seed don't use GRND_NONBLOCK. GRND_NONBLOCK
+ mean the result might not have an enough cryptic strength and
+ easy predictable. That's no good for SecureRandom.
+
+Sun Oct 18 17:26:53 2015 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * common.mk: add a rule for explicit_bzero.o.
+ * configure.in: detect explicit_bzero and memset_s.
+ * include/ruby/missing.h: add explicit_bzero.
+ * random.c (init_randomseed): use explicit_bzero() instead of
+ memset(). memset could be eliminated by compiler optimization.
+
+Mon Nov 30 18:46:44 2015 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * ext/readline/extconf.rb: call dir_config("libedit")
+ if --enable-libedit is specified. [Bug #11751]
+ patched by John Hein
+
+Mon Nov 30 08:44:29 2015 Eric Wong <e@80x24.org>
+
+ * variable.c: remove spurious #define for globals
+ [ruby-core:71735] [Feature #11749]
+
+Sun Nov 29 09:13:03 2015 Conor Landry <clandry94@gmail.com>
+
+ * NEWS: [DOC] Various grammar corrections and clarifications to
+ increase readability. [Fix GH-1115]
+
+Sat Nov 28 19:33:55 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (parser_here_document): store dispatched result of
+ on_tstring_content at the last fragment of a here document.
+
+Fri Nov 27 19:19:44 2015 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * lib/net/http.rb (connect): detect closed connection and reconnect
+ If the server closes a keep-alive http connection, the client socket
+ reaches EOF. To avoid an EOFError, detect the closed connection and
+ reconnect.
+ Added test to ensure HTTP#post succeeds even if the
+ keep-alive-connection has been closed by the server.
+ by Kristian Hanekamp <kris.hanekamp@gmail.com>
+ https://github.com/ruby/ruby/pull/1089 fix GH-1089
+
+Thu Nov 26 21:36:40 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * compile.c (iseq_peephole_optimize): enable tail call
+ optimization for specialized indexers.
+
+ * compile.c (iseq_compile_each): blockiseq should be NULL, but not
+ Qnil.
+
+Thu Nov 26 17:22:53 2015 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * regcomp.c, regenc.c, regexec.c, regint.h, enc/unicode.c:
+ Merge Onigmo 58fa099ed1a34367de67fb3d06dd48d076839692
+ + https://github.com/k-takata/Onigmo/pull/52
+
+Thu Nov 26 09:50:02 2015 yui-knk <spiketeika@gmail.com>
+
+ * test/coverage/test_coverage.rb: Added test-case for Coverage.restart.
+ [Misc #11732][ruby-dev:49379]
+
+Thu Nov 26 09:46:36 2015 yui-knk <spiketeika@gmail.com>
+
+ * test/coverage/test_coverage.rb: Added test-case for Coverage.peek_result
+ without Coverage.start. [Misc #11726][ruby-core:71622]
+
+Thu Nov 26 07:22:55 2015 Eric Wong <e@80x24.org>
+
+ * test/openssl/test_ssl.rb (test_copy_stream): new test
+
+Wed Nov 25 21:23:39 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * io.c (copy_stream_body): try to_io conversion before read,
+ readpartial, and write methods. [ruby-dev:49008] [Bug #11199]
+
+Wed Nov 25 10:55:21 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * io.c (argf_getpartial): should not resize str if the second
+ argument is not given.
+ [ruby-core:71668] [Bug #11738]
+
+Tue Nov 24 23:56:25 2015 Naohisa Goto <ngotogenome@gmail.com>
+
+ * configure.in: On Solaris, it is safe to define _LARGEFILE_SOURCE
+ when _FILE_OFFSET_BITS=64 is defined (= when 32-bit compile).
+
+Tue Nov 24 10:00:10 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * lib/rubygems/installer.rb: Fix two double-word typos.
+ [ci skip][fix GH-1108] Patch by @jwworth
+
+Tue Nov 24 09:17:02 2015 Alexander von Gluck IV <kallisti5@unixzen.com>
+
+ * beos: Drop support for BeOS now that Haiku is stable.
+ [Fix GH-1112]
+
+Tue Nov 24 09:16:35 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * internal.h (rb_gc_for_fd): move to export, as referred by
+ ext/socket.
+
+Tue Nov 24 09:04:29 2015 David Rodriguez <deivid.rodriguez@gmail.com>
+
+ * file.c: [DOC] add a missing period to File docs, to terminate
+ the sentence and separate from the next sentence. [Fix GH-1111]
+
+Tue Nov 24 08:30:06 2015 JuanitoFatas <katehuang0320@gmail.com>
+
+ * NEWS: Fix the issue number of `Struct#dig`, which should be
+ [Feature #11688]. [Fix GH-1110]
+
+Tue Nov 24 07:56:54 2015 Eric Wong <e@80x24.org>
+
+ * ext/socket/init.c (rsock_s_accept): handle ENOMEM
+
+Tue Nov 24 07:50:15 2015 Eric Wong <e@80x24.org>
+
+ * dir.c (dir_initialize): use rb_gc_for_fd for ENOMEM
+ * ext/socket/init.c (rsock_socket): ditto
+ * ext/socket/socket.c (rsock_socketpair): ditto
+ * internal.h (rb_gc_for_fd): prototype
+ * io.c (rb_gc_for_fd): remove static
+ [ruby-core:71623] [Feature #11727]
+
+Tue Nov 24 06:46:27 2015 Eric Wong <e@80x24.org>
+
+ * io.c (rb_gc_for_fd): new helper function
+ (ruby_dup): use rb_gc_for_fd
+ (rb_sysopen): ditto
+ (rb_fdopen): ditto
+ (rb_pipe): ditto
+ [ruby-core:71623] [Feature #11727]
+
+Tue Nov 24 05:13:35 2015 Eric Wong <e@80x24.org>
+
+ * ext/fiddle/function.c (struct nogvl_ffi_call_args):
+ new struct for GVL release
+ (nogvl_ffi_call): new function
+ (function_call): adjust for GVL release
+ [ruby-core:71642] [Feature #11607]
+ * ext/fiddle/closure.c (struct callback_args):
+ new struct for GVL acquire
+ (with_gvl_callback): adjusted original callback function
+ (callback): wrapper for conditional GVL acquire
+ * ext/fiddle/depend: add dependencies
+ * ext/fiddle/extconf.rb: include top_srcdir for internal.h
+ * internal.h (ruby_thread_has_gvl_p): expose for fiddle
+ * vm_core.h (ruby_thread_has_gvl_p): moved to internal.h
+ * test/fiddle/test_function.rb (test_nogvl_poll): new test
+
+Mon Nov 23 19:53:12 2015 Naohisa Goto <ngotogenome@gmail.com>
+
+ * configure.in: On Solaris, with gcc, "-std=iso9899:1999"
+ in $ansi_options is often also needed in CPPFLAGS,
+ because some feature definitions vary depending on such
+ standards options.
+
+Mon Nov 23 12:54:39 2015 Hamish Morrison <hamishm53@gmail.com>
+
+ * configure.in: remove obsolete workarounds for Haiku.
+
+ * dln.c, file.c, io.c: remove obsolete Haiku workarounds.
+
+ * thread_pthread.c: add stack bounds detection for Haiku.
+
+ * signal.c: get stack pointer from signal context on Haiku.
+ [ruby-core:67923] [Bug #10811] [Fix GH-1109]
+
+Mon Nov 23 11:44:11 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * gems/bundled_gems: bump version to minitest-5.8.3
+
+Mon Nov 23 08:55:00 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * ChangeLog: fix wrong reference for r52714
+
+Sun Nov 22 22:23:37 2015 Rei Odaira <Rei.Odaira@gmail.com>
+
+ * gc.c (rb_raw_obj_info): fix compile errors when USE_RGENGC
+ is 0.
+
+Sun Nov 22 21:58:09 2015 Naohisa Goto <ngotogenome@gmail.com>
+
+ * lib/cmath.rb: methods which has suffix '!' are now deprecated.
+ Re-apply r52469 made by Kazuki Tanaka, with fixing bug about
+ mathn.rb compatibility. [ruby-core:68528] [Feature #10974]
+
+Sun Nov 22 19:36:51 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * ext/openssl/ossl.c: fix brew command for installation of openssl.
+ [ci skip][fix GH-1107] Patch by @arthurnn
+
+Sun Nov 22 17:59:50 2015 Naohisa Goto <ngotogenome@gmail.com>
+
+ * configure.in: On Solaris, add -D_XOPEN_SOURCE=n only when both
+ AC_TRY_CPP and AC_TRY_COMPILE pass, because some options
+ (e.g. -std=iso9899:1999) are not set when running C preprocessor
+ or building ext.
+
+Sun Nov 22 16:53:34 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * compile.c (iseq_peephole_optimize): remove unreachable code
+ chunk after jump/leave.
+
+ * parse.y: move dead code elimination of logical operation to
+ compile.c. not to warn logical operation of literal constants.
+
+Sun Nov 22 16:37:10 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * compile.c (iseq_peephole_optimize): eliminate always/never
+ branches after a literal object and when the value is used after
+ the branch.
+
+Sun Nov 22 01:23:43 2015 Naohisa Goto <ngotogenome@gmail.com>
+
+ * configure.in: Add -D_XOPEN_SOURCE=500 (or 600 or 700) on Solaris
+ if available, mainly for enabling some features in sockets.
+
+Sun Nov 22 00:17:22 2015 Naohisa Goto <ngotogenome@gmail.com>
+
+ * test/socket/test_socket.rb (test/socket/test_socket.rb): skip
+ the test when Socket::SO_TIMESTAMP is not defined. Fix error
+ on Solaris 10. [Bug #11728] [ruby-dev:49377]
+
+Sat Nov 21 18:57:28 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ruby.c (need_argument): move frozen-string-literal-debug option
+ from --enable to --debug. [Feature #11725]
+
+ * ruby.c (proc_options): fix pointer overrun. do not advance argv
+ until it is valid.
+
+Sat Nov 21 13:59:09 2015 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * ext/digest/sha1/extconf.rb: OpenSSL's struct name for SHA1 is
+ SHA_CTX. http://openssl.org/docs/man0.9.8/crypto/SHA1.html
+
+Sat Nov 21 13:31:52 2015 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * ext/digest/*/*.[ch]: include ruby.h before digest.h to avoid
+ including ext/digest/extconf.h. [Bug #3231]
+ https://msdn.microsoft.com/library/36k2cdd4.aspx
+
+ * ext/digest/*/extconf.rb: remove ext/digest from include search path
+ to avoid confusion of cl.exe.
+
+ * ext/digest/*/*.[ch]: explicitly specify def.h's path.
+
+Sat Nov 21 13:05:16 2015 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * ext/openssl/ossl.h: LibreSSL doesn't have and need e_os2.h.
+
+Sat Nov 21 09:18:10 2015 Koichi Sasada <ko1@atdot.net>
+
+ * thread_sync.c: reduce the specification of Queue#close.
+ * Queue#close accepts no arguments.
+ * deq'ing on closed queue returns nil, always.
+ [Feature #10600]
+
+ * test/thread/test_queue.rb: catch up this fix.
+
+Sat Nov 21 08:44:21 2015 Koichi Sasada <ko1@atdot.net>
+
+ * compile.c (iseq_compile_each): add debug information to NODE_STR
+ strings as default.
+ [Feature #11725]
+
+ * insns.def (freezestring): add new instruction to support adding
+ debug information for dynamically constructed strings.
+
+ * compile.c (iseq_compile_each): support adding debug information
+ for NODE_DSTR with freezestring instruction.
+
+ * error.c (rb_error_frozen): change the debug information ID name
+ id_debug_created_info and this field should have a 2 element array
+ containing path and line information.
+
+ * defs/id.def: ditto.
+
+ * test/ruby/test_rubyoptions.rb: catch up this fix.
+
+ * test/ruby/test_iseq.rb: now frozen strings are not same.
+
+Sat Nov 21 04:34:16 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * symbol.c (rb_str_intern): should not freeze the receiver itself
+ unexpectedly. [ruby-core:71611] [Bug #11721]
+
+Fri Nov 20 23:15:18 2015 Naotoshi Seo <sonots@gmail.com>
+
+ * lib/logger.rb: expose logger mutex
+ [fix GH-541] Patch by @arthurnn
+
+Fri Nov 20 15:05:28 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * Added missing reference of GitHub
+
+Fri Nov 20 14:57:01 2015 Trevor Rowe <trevorrowe@gmail.com>
+
+ * lib/net/http.rb: Fixed regression for Net::HTTP::PUT with "Expect-100"
+ header. [fix GH-949]
+ * test/net/http/test_http.rb: added test.
+
+Fri Nov 20 14:39:56 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * lib/net/http.rb: set hostname before call ossl_ssl_set_session.
+ [Bug #11401][ruby-core:70152][fix GH-964] Patch by @mkarnebeek
+
+Fri Nov 20 12:53:19 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * array.c: clarify docs for take_while/drop_while samples.
+ [ci skip][fix GH-1028] Patch by @leriksen
+
+Fri Nov 20 12:48:04 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * ext/socket/socket.c: remove mention of :UNIX in getaddrinfo().
+ It's typically not a support option.
+ [ci skip][fix GH-990] Patch by @eam
+
+Fri Nov 20 12:44:06 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * lib/rss/syndication.rb: Add nodoc marker for #validate_sy_updatePeriod.
+ [ci skip][fix GH-1105] Patch by @davydovanton
+
+Fri Nov 20 09:05:21 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm.c (rb_vm_cref_replace_with_duplicated_cref): added.
+
+ CREFs should not be shared by methods between `using'.
+ [Bug #11247]
+
+ * vm_insnhelper.c (vm_cref_replace_with_duplicated_cref): ditto.
+
+ * vm.c (vm_cref_dup): should copy refinements correctly.
+
+ * eval.c: use rb_vm_cref_replace_with_duplicated_cref().
+
+ * eval_intern.h: add a decl. of
+ rb_vm_cref_replace_with_duplicated_cref().
+
+ * vm_eval.c (eval_string_with_cref): do not need to pass
+ scope's CREF because VM can find out CREF from stack frames.
+
+ * test/ruby/test_refinement.rb: add a test.
+
+Fri Nov 20 06:52:53 2015 Eric Wong <e@80x24.org>
+
+ * .gitattributes: new file for git users
+ [ruby-core:71578] [Feature #11713]
+
+Thu Nov 19 22:35:31 2015 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/ancdata.c: Check buffer full and ignore MSG_TRUNC flag.
+ buffer fullness is more robust to detect the message is too big for
+ the buffer.
+ AIX 7.1 recvmsg doesn't set MSG_TRUNC for rflags when MSG_PEEK is
+ given.
+
+Thu Nov 19 21:55:11 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_start): force to invoke GC by GC.start
+ even if it is GC.disable'd.
+
+ * test/ruby/test_gc.rb: add a test.
+
+Thu Nov 19 20:08:59 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: trivial performance improvements.
+
+ name modified
+ vm1_gc_short_lived* 1.015
+ vm1_gc_short_with_complex_long* 1.014
+ vm1_gc_short_with_long* 1.000
+ vm1_gc_short_with_symbol* 1.016
+ vm1_gc_wb_ary* 1.002
+ vm1_gc_wb_ary_promoted* 0.996
+ vm1_gc_wb_obj* 1.045
+ vm1_gc_wb_obj_promoted* 1.014
+ vm3_gc 1.021
+
+ * gc.c (gc_writebarrier_generational): reorder parameters to optimize
+ register passing function call.
+
+ * gc.c (gc_writebarrier_incremental): ditto.
+
+ * gc.c (rb_gc_writebarrier): remove LIKELY().
+ LIKELY() seems to move related functions not better places.
+
+Thu Nov 19 19:45:05 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ruby.c (ruby_prog_init): [DOC] ARGV does not contain the name of
+ the executable. [ruby-core:71561] [Bug #11711]
+
+Thu Nov 19 15:53:21 2015 Koichi Sasada <ko1@atdot.net>
+
+ * signal.c: should also clear ruby_disable_gc.
+ [Bug #11692]
+
+Thu Nov 19 15:31:45 2015 Koichi Sasada <ko1@atdot.net>
+
+ * compile.c (iseq_compile_each): T_IMEMO/iseq objects should be
+ wrap with ISeq wrappers. [Bug #11676]
+
+Thu Nov 19 15:16:12 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * lib/rubygems: Update to RubyGems 2.5.0+ HEAD(c6b4946).
+ this version includes #1114, #1314, #1322, #1375, #1383, #1387
+ * test/rubygems: ditto.
+
+Thu Nov 19 14:14:37 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * win32/win32.c (finish_overlapped_socket): return value of this
+ function should be only 0 or SOCKET_ERROR.
+
+Thu Nov 19 14:12:12 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * compile.c (iseq_tailcall_optimize): apply tail call optimization
+ before conversion to specialized instructions. when looking
+ back from `leave` instruction, `send` instructions have been
+ translated already.
+
+Thu Nov 19 13:57:58 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * win32/win32.c (finish_overlapped_socket): ignore EMSGSIZE when input,
+ because POSIX platforms just do so. fixes test errors revealed by
+ r52647.
+
+Thu Nov 19 02:52:30 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * ext/socket/ancdata.c (bsock_recvmsg_internal): stretch the buffer size
+ only when vmaxdatlen is nil.
+
+Thu Nov 19 02:20:11 2015 Tanaka Akira <akr@fsij.org>
+
+ * test/socket/test_socket.rb (test_udp_recvmsg_truncation): rflags is
+ nil on Solaris 10 which have no HAVE_STRUCT_MSGHDR_MSG_CONTROL.
+ Reported by Naohisa Goto. [ruby-core:71557] [Bug #11709]
+
+Thu Nov 19 01:48:05 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * configure.in: add -static-libgcc for mingw automatically if available.
+
+Thu Nov 19 00:53:26 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * ext/extmk.rb (--extflags): new option to pass EXTLDFLAGS to children,
+ especially exts.mk.
+
+ * common.mk (EXTMK_ARGS): use above option.
+
+Wed Nov 18 22:50:43 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_method.c (rb_class_clear_method_cache): should clear all
+ RCLASS_CALLABLE_M_TBLs of all sub-classes (T_ICLASS).
+
+ RCLASS_CALLABLE_M_TBL() caches complemented method entries.
+ It should be cleared when the modules are cleared.
+ On previous version clears only for direct children.
+ It is enough for normal modules because corresponding T_ICLASSes
+ are direct children.
+
+ However, refinements create complex data structure. So that
+ we need to clear all children (and descendants).
+ [ruby-core:71423] [Bug #11672]
+
+ * vm_method.c (rb_clear_method_cache_by_class): rb_mKernel
+ doesn't call rb_class_clear_method_cache, so that
+ clear child T_ICLASSes.
+
+ * test/ruby/test_refinement.rb: enable disabled test.
+
+Wed Nov 18 21:09:08 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_method.c (prepare_callable_method_entry): use
+ RCLASS_CALLABLE_M_TBL() instead of accessing a filed directly.
+
+Wed Nov 18 17:08:18 2015 Koichi Sasada <ko1@atdot.net>
+
+ * method.h: introduce the following field and macros.
+
+ * rb_method_definition_t::complemented_count to count shared method
+ entries because of complemented method entries and separate from
+ alias_count.
+
+ Shared `def' only by complemented method entries should not prevent
+ method re-definition warning.
+
+ * METHOD_ENTRY_COMPLEMENTED(me) to represent complemented method entry.
+ * METHOD_ENTRY_COMPLEMENTED_SET(me) to check it as complemented me.
+
+ * vm_insnhelper.c (aliased_callable_method_entry): should also
+ check me->def->complemented_count.
+
+ * vm_method.c (method_definition_addref_complement): add to count
+ complemented method entries number.
+
+ * vm_method.c (rb_method_definition_release): release `def' iff
+ alias_count == 0 and complemented_count == 0.
+
+ * test/ruby/test_module.rb: add a test.
+
+Wed Nov 18 17:06:19 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (rb_raw_obj_info): fix trivial issues.
+
+ * support SPECIAL_CONSTs.
+ * fix IMEMO/ment outputs.
+
+Wed Nov 18 11:32:15 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * compile.c (iseq_peephole_optimize): eliminate always/never
+ branches after a literal object. this sequence typically
+ appears by defined? operator for a method call on a local
+ variable.
+
+Wed Nov 18 10:33:06 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * ext/socket/ancdata.c (bsock_recvmsg_internal): stretch the buffer size
+ when EMSGSIZE occurs on non HAVE_STRUCT_MSGHDR_MSG_CONTROL platforms
+ (such as, Windows). fixes a test error revealed by r52625.
+
+Wed Nov 18 10:12:36 2015 Eric Wong <e@80x24.org>
+
+ * ext/socket/ancdata.c (bsock_recvmsg_internal): use 4096 as
+ default size to match pre-r52610, which also maps to a common
+ page size.
+
+Wed Nov 18 10:05:25 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * doc/syntax/refinements.rdoc: update documentation to reflect
+ recent changes.
+ [ci skip] [ruby-core:71466] [Misc #11681] Patch by James Adam
+
+Wed Nov 18 09:50:21 2015 Naotoshi Seo <sonots@gmail.com>
+
+ * test/logger/test_logdevice.rb: Fix tests of logger to make it work on
+ windows (windows can not remove opened file) [Bug #11702]
+
+Wed Nov 18 06:59:52 2015 Eric Wong <e@80x24.org>
+
+ * ext/socket/ancdata.c (bsock_recvmsg_internal): grow buffer
+ on unspecified maxdatlen
+ [ruby-core:71517] [Bug #11701]
+ * ext/socket/lib/socket.rb (Socket#recvmsg): nil default for dlen
+ (Socket#recvmsg_nonblock): ditto
+ * test/socket/test_socket.rb (test_recvmsg_udp_no_arg): new test
+
+Tue Nov 17 19:50:06 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * win32/win32.c (fstat): declare for mingw.
+
+Tue Nov 17 19:02:59 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * configure.in (BASERUBY): use Kernel#print instead of Kernel#p because
+ the baseruby may output CRLF as end of line.
+
+Tue Nov 17 15:34:34 2015 Martin Duerst <duerst@it.aoyama.ac.jp>
+ * NEWS: Added update from Unicode 7.0.0 to 8.0.0 [ci skip]
+
+Tue Nov 17 15:30:30 2015 Martin Duerst <duerst@it.aoyama.ac.jp>
+ * enc/unicode/casefold.h, name2ctype.h: Change Unicode
+ Version for regular expressions from 7.0.0 to
+ 8.0.0 (with help from Kimihito Matsui) [Feature #11563]
+
+Tue Nov 17 14:36:00 2015 Kenichi Kamiya <kachick1@gmail.com>
+
+ * lib/ostruct.rb (dig): Implement OpenStruct#dig
+ [Feature #11688]
+
+Tue Nov 17 14:04:14 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * ext/socket/lib/socket.rb (Socket#recvmsg{,_nonblock}): default values
+ of clen must be nil.
+
+ * ext/socket/ancdata.c (bsock_sendmsg_internal): handle nil of clen.
+ fixes test errors introduced at r52602.
+
+Tue Nov 17 13:43:46 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * ext/socket/lib/socket.rb: UNIXSocket is not always exists. fixes
+ install error on Windows, introduced at r52601.
+
+Tue Nov 17 11:27:23 2015 Eric Wong <e@80x24.org>
+
+ * ext/socket/lib/socket.rb (Socket#recvfrom_nonblock):
+ UDPSocket#recvfrom_nonblock):
+ update doc for `exception: false` and destination buffer
+ [ruby-core:69542] [Feature #11229]
+ [ruby-core:69543] [Feature #11242]
+
+Tue Nov 17 11:25:05 2015 Eric Turner <ericturnerdev@gmail.com>
+
+ * array.c (rb_ary_dig), hash.c (rb_hash_dig): [DOC] Update
+ comments describing dig methods. [Fix GH-1103]
+
+ * struct.c (rb_struct_dig): [DOC] add rdoc.
+
+Tue Nov 17 11:22:22 2015 Martin Duerst <duerst@it.aoyama.ac.jp>
+ * NEWS: Small grammatical fix [ci skip]
+
+Tue Nov 17 10:12:30 2015 Eric Wong <e@80x24.org>
+
+ * ext/socket/lib/socket.rb (Socket.accept_loop): avoid exceptions
+ (Socket.udp_server_recv): ditto
+
+Tue Nov 17 09:59:00 2015 Eric Wong <e@80x24.org>
+
+ * ext/socket/ancdata.c (bsock_sendmsg_internal): avoid arg parsing
+ [ruby-core:71439] [Feature #11339]
+ (rsock_bsock_sendmsg): make private, adjust for above
+ (rsock_bsock_sendmsg_nonblock): ditto
+ * ext/socket/rubysocket.h: adjust prototypes
+ (rsock_opt_false_p): remove
+ * ext/socket/basicsocket.c (rsock_init_basicsocket):
+ define private methods
+ * ext/socket/lib/socket.rb (BasicSocket#sendmsg): new wrapper
+ (BasicSocket#sendmsg_nonblock): ditto
+
+Tue Nov 17 09:45:18 2015 Eric Wong <e@80x24.org>
+
+ * ext/socket/ancdata.c (bsock_recvmsg_internal): avoid arg parsing
+ (rsock_bsock_recvmsg): adjust for above change
+ (rsock_bsock_recvmsg_nonblock): ditto
+ [ruby-core:71439] [Feature #11339]
+ * ext/socket/rubysocket.h: adjust prototypes for above
+ * ext/socket/basicsocket.c (rsock_init_basicsocket):
+ adjust private methods
+ * ext/socket/lib/socket.rb (BasicSocket#recvmsg): wrapper method
+ (BasicSocket#recvmsg_nonblock): ditto
+
+Tue Nov 17 08:36:34 2015 Eric Wong <e@80x24.org>
+
+ * ext/socket/init.c (rsock_s_accept_nonblock): avoid parsing args
+ [ruby-core:71439] [Feature #11339]
+ * ext/socket/rubysocket.h: adjust prototype
+ * ext/socket/socket.c (sock_accept_nonblock): make private
+ * ext/socket/tcpserver.c (tcp_accept_nonblock): ditto
+ * ext/socket/unixserver.c (unix_accept_nonblock): ditto
+ * ext/socket/lib/socket.rb (Socket#accept_nonblock):
+ implement as wrapper, move RDoc
+ (TCPServer#accept_nonblock): ditto
+ (UNIXServer#accept_nonblock): ditto
+
+Tue Nov 17 08:25:57 2015 Eric Wong <e@80x24.org>
+
+ * ext/socket/socket.c (sock_connect_nonblock):
+ avoid argument parsing in C.
+ [ruby-core:71439] [Feature #11339]
+ * ext/socket/lib/socket.rb (Socket#connect_nonblock):
+ new wrapper for private method, move RDoc
+
+Tue Nov 17 08:16:09 2015 Eric Wong <e@80x24.org>
+
+ * ext/socket/init.c (rsock_s_recvfrom_nonblock):
+ avoid arg parsing with C API
+ [ruby-core:71439] [Feature #11339]
+ * ext/socket/basicsocket.c (bsock_recv_nonblock):
+ adjust for above change, make private
+ * ext/socket/socket.c (sock_recvfrom_nonblock): ditto
+ * ext/socket/udpsocket.c (udp_recvfrom_nonblock): ditto
+ * ext/socket/lib/socket.rb (BasicSocket#recv_nonblock):
+ new wrapper for private method, move RDoc
+ (Socket#recvfrom_nonblock): ditto
+ (UDPSocket#recvfrom_nonblock): ditto
+
+Mon Nov 16 21:27:54 2015 Naohisa Goto <ngotogenome@gmail.com>
+
+ * test/dtrace/helper.rb (Dtrace::TestCase#trap_probe): dtrace buffer
+ size is set as 8m on Solaris (default 4m). [Bug #11697]
+
+Mon Nov 16 20:03:14 2015 Naotoshi Seo <sonots@gmail.com>
+
+ * lib/logger.rb: Add Logger#reopen
+
+Mon Nov 16 18:21:52 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * object.c (rb_obj_dig): dig in nested structs too.
+
+ * struct.c (rb_struct_dig): new method Struct#dig.
+ [Feature #11688]
+
+Mon Nov 16 17:41:33 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * compile.c (iseq_peephole_optimize): optimize tail calls on aref
+ and aset specialized instructions.
+
+ * compile.c (iseq_peephole_optimize): optimize replaced leave
+ instruction copied to jump instruction too.
+
+Mon Nov 16 16:39:38 2015 Akinori MUSHA <knu@iDaemons.org>
+
+ * lib/set.rb: Enable frozen_string_literal.
+
+ * lib/set.rb: Move << out of the begin block that ensures pop.
+
+Mon Nov 16 16:28:30 2015 Akinori MUSHA <knu@iDaemons.org>
+
+ * lib/set.rb (Hash#flatten!, #add?, #delete?, #collect!, #reject!,
+ #select!, #^, #classify): Micro-optimize some methods for
+ performance and readability.
+
+Mon Nov 16 16:17:58 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * ChangeLog: fixed accidentally commit.
+
+Mon Nov 16 16:10:51 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * mkconfig.rb: Add some high-level documentation.
+ [ci skip][fix GH-1081] Patch by @ulfalizer
+
+Mon Nov 16 15:59:14 2015 yui-knk <spiketeika@gmail.com>
+
+ * proc.c: Add call-seq of `Method#super_method`
+ [ci skip][fix GH-1094]
+
+Mon Nov 16 15:58:39 2015 Kenichi Kamiya <kachick1@gmail.com>
+
+ * struct.c: Standardize a method signature of Struct#[]=.
+ [ci skip][fix GH-1095]
+
+Mon Nov 16 15:42:36 2015 Akinori MUSHA <knu@iDaemons.org>
+
+ * lib/set.rb (#>=, #>, #<=, #<): Make use of Hash#>=, #>, #<, and
+ #<= when comparing against an instance of the same kind.
+
+Mon Nov 16 15:37:11 2015 Naotoshi Seo <sonots@gmail.com>
+
+ * lib/logger.rb: Support symbol and string log level setting
+
+Mon Nov 16 15:33:11 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * tool/rbinstall.rb: fix wrong permission for gem specification without
+ zlib runtime. [Bug #11685][ruby-dev:49343]
+
+Mon Nov 16 12:11:11 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * lib/webrick/httpauth/basicauth.rb: fix a typo.
+ [ci skip][fix GH-1099] Patch by @jwworth
+ * lib/webrick/httpauth/digestauth.rb: ditto.
+
+Sun Nov 15 18:28:43 2015 Kenichi Kamiya <kachick1@gmail.com>
+
+ * vm_method.c (set_method_visibility): should fail if the receiver
+ is frozen. [ruby-core:71489] [Bug #11687]
+
+Sat Nov 14 22:15:07 2015 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/lib/socket.rb: Specify frozen_string_literal: true.
+
+Sat Nov 14 21:44:56 2015 Tanaka Akira <akr@fsij.org>
+
+ * lib/time.rb: Use "<<" to reduce string allocation.
+
+Sat Nov 14 17:45:49 2015 Tanaka Akira <akr@fsij.org>
+
+ * lib/tsort.rb: Specify frozen_string_literal: true.
+
+Sat Nov 14 17:25:15 2015 Tanaka Akira <akr@fsij.org>
+
+ * lib/resolv-replace.rb: Specify frozen_string_literal: true.
+
+Sat Nov 14 17:00:13 2015 Tanaka Akira <akr@fsij.org>
+
+ * lib/time.rb: Specify frozen_string_literal: true.
+
+Sat Nov 14 16:43:02 2015 Tanaka Akira <akr@fsij.org>
+
+ * lib/open3.rb: Specify frozen_string_literal: true.
+
+Sat Nov 14 05:04:09 2015 Koichi Sasada <ko1@atdot.net>
+
+ * node.h: remove old comments.
+
+Sat Nov 14 04:55:36 2015 Koichi Sasada <ko1@atdot.net>
+
+ * refactoring CREF related code.
+
+ * eval_intern.h: remove unused setter functions.
+ CREF_CLASS_SET()
+ CREF_NEXT_SET()
+ CREF_SCOPE_VISI_COPY()
+
+ * eval_intern.h: rename flags:
+ * NODE_FL_CREF_PUSHED_BY_EVAL_ -> CREF_FL_PUSHED_BY_EVAL
+ * NODE_FL_CREF_OMOD_SHARED_ -> CREF_FL_OMOD_SHARED
+ and use IMEMO_FL_USER1/2.
+
+ * vm.c (vm_cref_new): accept push_by_eval parameter.
+
+ * vm.c (vm_cref_new_use_prev): added for rb_vm_rewrite_cref().
+
+ * vm_insnhelper.c (vm_cref_push): accept pushed_by_eval parameter.
+
+ * vm_insnhelper.h: remove unused macros:
+ COPY_CREF_OMOD() and COPY_CREF().
+
+ * vm_eval.c, insns.def: catch up this fix.
+
+Sat Nov 14 02:58:03 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm.c (vm_define_method): refactoring.
+ * get CREF in this function.
+ * cbase is no longer needed (CREF_CLASS(cref) is enough).
+
+ * compile.c: RubyVM::FrozenCore.define_method only accept 2 args.
+
+Sat Nov 14 02:34:43 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm.c (vm_define_method): do not use current CREF immediately,
+ but check CREF in environment or methods. Methods defined in methods
+ should be public.
+ [Bug #11571]
+
+ * vm_method.c (rb_scope_module_func_check): check CREF in env or me.
+ if CREF is contained by `me', then return FALSE.
+
+ * test/ruby/test_method.rb: add a test.
+
+Sat Nov 14 02:19:16 2015 Koichi Sasada <ko1@atdot.net>
+
+ * method.h: constify rb_cref_t::scope_visi;
+
+ * eval_intern.h (CREF_SCOPE_VISI_COPY): catch up this fix.
+
+ * vm_method.c: ditto.
+
+Sat Nov 14 01:53:52 2015 Naohisa Goto <ngotogenome@gmail.com>
+
+ * pack.c (pack_unpack, AVOID_CC_BUG): Very ugly workaround for
+ optimization bug of Oracle Solaris Studio 12.4 on Solaris
+ with -xO4 optimization option. [Bug #11684]
+
+Fri Nov 13 23:00:23 2015 Hiroshi Shirosaki <h.shirosaki@gmail.com>
+
+ * configure.in: unset LD_PRELOAD on mingw. msys2 child processes
+ crash at make test-all with LD_PRELOAD.
+ [ruby-core:71461] [Bug #11680]
+
+Fri Nov 13 14:00:43 2015 Zachary Scott <zzak@ruby-lang.org>
+
+ * ext/openssl/ossl_pkey.c: Merge ruby/openssl@b9ea8ef [Bug #10735]
+
+Fri Nov 13 13:09:16 2015 Zachary Scott <zzak@ruby-lang.org>
+
+ * ext/openssl/ossl_ssl.c: Merge ruby/openssl@81e1a30
+
+ * test/openssl/test_ssl.rb: ditto
+
+Fri Nov 13 13:05:37 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * prelude.rb (Thread.exclusive): warn as deprecated.
+
+Fri Nov 13 10:36:39 2015 Victor Nawothnig <Victor.Nawothnig@gmail.com>
+
+ * parse.y (new_unless): optimize constant condition for `unless`
+ as well as `if`. [Fix GH-1092]
+
+Fri Nov 13 10:08:41 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * ext/psych/psych.gemspec: bump version to 2.0.15
+
+Thu Nov 12 18:44:26 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (parser_magic_comment): should match exactly.
+ [ruby-core:71460] [Bug #11679]
+
+Thu Nov 12 16:16:20 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * template/prelude.c.tmpl: enable tail call optimization.
+
+Thu Nov 12 14:17:01 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (parser_yylex): ANDDOT at the head of the line denote
+ line continuation from previous one to support fluent interface,
+ as well as single dot.
+
+Thu Nov 12 13:49:50 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * lib/rubygems: Update to RubyGems 2.5.0+ HEAD(db78980).
+ this version includes #1367 , #1373 , #1375
+ * test/rubygems: ditto.
+
+Thu Nov 12 10:53:41 2015 Eric Wong <e@80x24.org>
+
+ * benchmark/bm_io_nonblock_noex2.rb: new benchmark based
+ on bm_io_nonblock_noex.rb
+ * io.c (io_read_nonblock): move documentation to prelude.rb
+ (io_write_nonblock): ditto
+ (Init_io): private, internal methods for prelude.rb use only
+ * prelude.rb (IO#read_nonblock): wrapper + documentation
+ (IO#write_nonblock): ditto
+ [ruby-core:71439] [Feature #11339]
+
+Wed Nov 11 18:30:28 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * sprintf.c (rb_str_format): look up the key, then get default
+ value and raise KeyError if the returned value is nil.
+ [ruby-dev:49338] [Ruby trunk - Bug #11677]
+
+Wed Nov 11 17:38:24 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_eval.c (local_var_list_add): skip internal local variable
+ name by its type but not if it has a name. internal local
+ variable names are just unique per frame, not globally.
+ [ruby-core:71437] [Bug #11674]
+
+Wed Nov 11 14:14:33 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * transcode.c: fix a typo
+ [ci skip][fix GH-1091] Patch by @jwworth
+
+Wed Nov 11 11:58:38 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * lib/net/ftp.rb (initialize): Connections are in passive mode per
+ default now. The default mode can be changed by
+ Net::FTP.default_passive=.
+ [ruby-core:71146] [Feature #11612]
+
+ * lib/net/ftp.rb (default_passive=, default_passive): new methods.
+
+Wed Nov 11 09:03:12 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * sprintf.c (rb_str_format): respect default value of a hash. no
+ longer raises KeyError unless the default value of the hash is
+ nil. [ruby-core:71354] [Bug #11661]
+
+Tue Nov 10 20:35:12 2015 Tanaka Akira <akr@fsij.org>
+
+ * lib/open-uri.rb: Remove indicator for "frozen_string_literal: true".
+
+ * lib/pp.rb: Ditto.
+
+ * lib/prettyprint.rb: Ditto.
+
+ * lib/resolv.rb: Ditto.
+
+ * lib/securerandom.rb: Ditto.
+
+ * lib/tmpdir.rb: Ditto.
+
+ * lib/unicode_normalize/tables.rb: Ditto.
+
+ * test/net/ftp/test_buffered_socket.rb: Ditto.
+
+ * test/net/ftp/test_mlsx_entry.rb: Ditto.
+
+ * test/open-uri/test_open-uri.rb: Ditto.
+
+ * test/open-uri/test_ssl.rb: Ditto.
+
+ * test/pathname/test_pathname.rb: Ditto.
+
+ * test/test_pp.rb: Ditto.
+
+ * test/test_prettyprint.rb: Ditto.
+
+ * tool/transcode-tblgen.rb: Ditto.
+
+ * ext/pathname/lib/pathname.rb: Ditto.
+
+Tue Nov 10 18:42:24 2015 Aleksandrs Ledovskis <aleksandrs@ledovskis.lv>
+
+ * defs/id.def, parse.y: Switch internal token name to reflect
+ current form of safe-call operator. [Fix GH-1090]
+
+Tue Nov 10 18:25:56 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * hash.c (rb_hash_to_proc): use rb_func_proc_new to make light
+ weight proc. [Feature #11653]
+
+Tue Nov 10 18:23:35 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * proc.c (cfunc_proc_t): add room for me.
+
+ * proc.c (cfunc_proc_new): generalise for cfunc proc without env.
+
+ * proc.c (rb_func_proc_new, rb_func_lambda_new): new functions to
+ make proc/lambda without env from cfunc.
+
+Tue Nov 10 17:32:35 2015 Naohisa Goto <ngotogenome@gmail.com>
+
+ * bootstraptest/test_fork.rb ([ruby-dev:37934]): :NPROC (RLIMIT_NPROC)
+ is not supported on some platforms (e.g. Solaris 10).
+
+Tue Nov 10 16:57:14 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * hash.c (rb_hash_to_proc): new method Hash#to_proc.
+ [Feature #11653]
+
+Tue Nov 10 14:34:09 2015 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * time.c (rb_time_timespec_new): swap utc and localtime
+ to generate gmt flag by INT_MAX - gmtoff.
+
+Tue Nov 10 14:01:59 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * hash.c (rb_hash_{le,lt,ge,gt}): new methods, Hash#<=, Hash#<,
+ Hash#>=, Hash#>, to test if all elements of a hash are also
+ included in another hash, and vice versa.
+ [ruby-core:68561] [Feature #10984]
+
+Tue Nov 10 11:25:29 2015 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * time.c (rb_timespec_now): added. [Feature #11558]
+
+ * time.c (rb_time_timespec_new): added. [Feature #11558]
+
+Tue Nov 10 06:17:17 2015 Eric Wong <e@80x24.org>
+
+ * variable.c (rb_autoload_load): allow recursive calls
+ [ruby-core:71345] [Bug #11658]
+ * test/ruby/test_autoload.rb (test_autoload_while_autoloading):
+ new test by: Hiroshi Shirosaki <h.shirosaki@gmail.com>
+ [ruby-core:71390]
+
+Tue Nov 10 00:36:46 2015 Tanaka Akira <akr@fsij.org>
+
+ * lib/resolv.rb (Resolv::DNS::Message::MessageEncoder#put_labels):
+ Prevent overflow of pointer to labels.
+ Patch by Hannes Georg. [ruby-core:71248] [Bug #11632]
+
+Tue Nov 10 00:25:41 2015 Kazuki Tsujimoto <kazuki@callcc.net>
+
+ * gems/bundled_gems: update to power_assert 0.2.6.
+
+Mon Nov 9 21:48:17 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_eval.c (rb_check_funcall_default): split from
+ rb_check_funcall to return the given fallback value.
+
+ * object.c (rb_obj_dig): use rb_check_funcall_default so that tail
+ call optimization will be possible. [Feature #11643]
+
+Mon Nov 9 21:27:23 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * array.c (rb_ary_dig): new method Array#dig.
+
+ * hash.c (rb_hash_dig): new method Hash#dig.
+
+ * object.c (rb_obj_dig): dig in nested arrays/hashes.
+ [Feature #11643]
+
+Mon Nov 9 18:00:47 2015 Yuki Nishijima <mail@yukinishijima.net>
+
+ * gems/bundled_gems: Upgrade the did_you_mean gem to 1.0.0.beta3
+
+Mon Nov 9 17:38:14 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * test/runner.rb: use official repository for coverage tool.
+ * Makefile.in: ditto.
+ * common.mk: ditto.
+ * .gitignore: ignored third party repositories.
+
+Mon Nov 9 17:29:09 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * compile.c (iseq_compile_each): Dynamic string literals should be
+ frozen.
+ [ruby-core:57574] [Feature #8976]
+
+Mon Nov 9 15:56:07 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * common.mk: Use ruby organization url for simplecov repository.
+
+Sun Nov 8 16:24:09 2015 Masaki Matsushita <glass.saga@gmail.com>
+
+ * NEWS: describe addition of File::TMPFILE
+
+Sun Nov 8 15:19:17 2015 Masaki Matsushita <glass.saga@gmail.com>
+
+ * file.c: Add O_TMPFILE.
+
+Sun Nov 8 14:24:43 2015 windwiny <windwiny.ubt@gmail.com>
+
+ * method.h (METHOD_ENTRY_{VISI,BASIC,FLAGS}_SET): suppress
+ shift-op-parentheses warnings. [Fix GH-1082]
+
+Sun Nov 8 14:01:22 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * ext/psych/psych_emitter.c: backport 5bd7744 from tenderlove/psych.
+ support backward compatibility of Ruby 2.0
+
+Sun Nov 8 10:55:10 2015 Anton Davydov <antondavydov.o@gmail.com>
+
+ * io.c (rb_io_gets_m): Update IO#gets doc for characters more than
+ 1 byte. [Fix GH-1085]
+
+Sun Nov 8 10:37:58 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * lib/uri/ftp.rb: fix a typo.
+ [fix GH-1084][ci skip] Patch by @windwiny
+
+Sun Nov 8 08:10:31 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_trace.c (exec_hooks_precheck): check need_clean everytime
+ to clean-up unused hooks.
+
+ * vm_trace.c (list->need_clean): use as boolean value.
+
+Sun Nov 8 01:31:27 2015 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * lib/net/http.rb (Net::HTTP#initialize):
+ default value of Net::HTTP#open_timeout is now 60 (was nil).
+
+Sat Nov 7 12:18:05 2015 Eric Wong <e@80x24.org>
+
+ * string.c (id_to_s): remove redundant variable
+ (rb_obj_as_string): trade id_to_s for idTo_s
+ (rb_str_equal): replace rb_intern(...) with pre-defined ID
+ (rb_str_cmp_m): ditto
+ (rb_str_match): ditto
+ (str_upto_each): ditto
+ (rb_str_sum): ditto
+ (Init_String): remove id_to_s initialization
+
+Sat Nov 7 11:40:05 2015 Eric Wong <e@80x24.org>
+
+ * thread.c (rb_cThreadShield): make static
+
+Sat Nov 7 09:51:38 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_trace.c (rb_threadptr_exec_event_hooks_orig):
+ maintain trace_running counter on internal events.
+
+ This patch is made by Takashi Kokubun <takashikkbn@gmail.com>.
+ [Bug #11603] https://github.com/ruby/ruby/pull/1059
+
+Sat Nov 7 03:32:27 2015 Koichi Sasada <ko1@atdot.net>
+
+ * include/ruby/ruby.h (RSTRUCT_PTR): need a close parenthesis.
+
+Sat Nov 7 01:32:06 2015 Naohisa Goto <ngotogenome@gmail.com>
+
+ * dir.c (dir_fileno, dirfd): support of Dir#fileno on Solaris 10.
+ Solaris 10 does not have dirfd, but the file descriptor of a
+ directory is stored in the d_fd or dd_fd member in the DIR struct.
+ Note that Solaris 11 has dirfd(3C).
+
+ * configure.in: checks for DIR.d_fd and DIR.dd_fd on Solaris 10.
+
+Fri Nov 6 23:13:53 2015 Kazuki Tanaka <gogotanaka@ruby-lang.org>
+
+ * array.c: clarifies Array#reject! documentation.
+ [fix GH-894][ci skip] Patch by @GxSplinter
+
+Fri Nov 6 20:18:25 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * test/runner.rb: extracted test helper.
+ * test/lib/zombie_hunter.rb: ditto.
+
+Fri Nov 6 18:07:47 2015 Naohisa Goto <ngotogenome@gmail.com>
+
+ * include/ruby/ruby.h (rb_array_const_ptr, rb_struct_const_ptr):
+ Suppress pointer type mismatch warnings occurred with old version
+ of Fujitsu C Compiler (fcc) on Solaris 10. The warnings cause
+ failure of TestMkmf::TestConvertible. [Bug #11644] [ruby-dev:49326]
+ * include/ruby/ruby.h (FIX_CONST_VALUE_PTR): macro for the above,
+ only effective with fcc.
+
+Fri Nov 6 12:39:21 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * defs/id.def (token_ops), parse.y (parser_yylex): change DOTQ
+ from ".?" to "&.". [ruby-core:71363] [Feature #11537]
+
+Fri Nov 6 09:01:26 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (kwd_append): fix segv after invalid keyword argument,
+ preceding keyword list is NULL when syntax error is there.
+ [ruby-core:71356] [Bug #11663]
+
+Fri Nov 6 06:59:37 2015 Eric Wong <e@80x24.org>
+
+ * test/ruby/test_autoload: hoist out ruby_impl_require
+
+Thu Nov 5 13:03:58 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * defs/id.def (token_ops): gather associations between IDs,
+ operators, and parser tokens.
+
+Thu Nov 5 10:17:17 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/socket/socket.c (make_addrinfo): use RARRAY_ASET for
+ write-barrier.
+
+ * ext/tk/tcltklib.c ({call,eval,invoke}_queue_handler): ditto.
+
+ * ext/tk/tkutil/tkutil.c (ary2list, ary2list2): ditto.
+
+Thu Nov 5 10:09:12 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/**/*.c: prefer RARRAY_AREF to indexing RARRAY_CONST_PTR.
+ pointed out by hanmac.
+ https://github.com/ruby/ruby/commit/3553a86#commitcomment-14187670
+
+Wed Nov 4 17:33:24 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * lib/debug.rb: Add documentation for #thread_list_all.
+ [Misc #11580][ci skip]
+
+Wed Nov 4 15:45:59 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * class.c: fix documentation for rb_define_class{_id}_under.
+ [fix GH-991][ci skip] Patch by @kachick
+
+Wed Nov 4 15:40:45 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * method.h: fix typo. Patch by @davydovanton
+ [fix GH-1076][ci skip]
+
+Wed Nov 4 15:39:32 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * hash.c: use correct grammer. Patch by @tveastman
+ [fix GH-1079][ci skip]
+
+Wed Nov 4 11:38:23 2015 Jake Worth <jakeworth82@gmail.com>
+
+ * process.c (proc_getsid): [DOC] Fix double word 'for' and typo.
+ [Fix GH-1080]
+
+Wed Nov 4 06:01:52 2015 Eric Wong <e@80x24.org>
+
+ * include/ruby/ruby.h (struct RObject): hide iv_index_tbl type
+ [ruby-core:71306] [Feature #11647]
+
+Tue Nov 3 06:48:58 2015 Eric Wong <e@80x24.org>
+
+ * variable.c (find_class_path): remove cast for rb_class_ivar_set
+ (rb_ivar_set): ditto
+ (rb_cvar_set): ditto
+
+Tue Nov 3 06:18:21 2015 Eric Wong <e@80x24.org>
+
+ * variable.c (rb_global_tbl): convert to id_table
+
+Tue Nov 3 01:58:46 2015 Naohisa Goto <ngotogenome@gmail.com>
+
+ * parse.y (NO_QCALL): fix type mismatch of operands that causes
+ compile error with Oracle Solaris Studio on Solaris.
+ [Bug #11645] [ruby-dev:49327]
+
+Sun Nov 1 17:14:36 2015 Koichi Sasada <ko1@atdot.net>
+
+ * id_table.c (mix_id_table_insert): do not touch list during
+ list->hash transition because GC can run during transition.
+
+Sun Nov 1 11:07:31 2015 Eric Wong <e@80x24.org>
+
+ * iseq.c (iseq_memsize): account for rb_call_cache entries
+
+Sun Nov 1 09:12:10 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (parser_yylex): ':' separated by a comment and a newline
+ is not valid as symbol.
+
+Sat Oct 31 20:15:48 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * test/openssl/test_pair.rb: skipped tests if openssl doesn't support
+ ECDH cipher.
+
+Sat Oct 31 14:58:10 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * man/ruby.1 (SYNOPSIS): remove extraneous space for -F option as
+ it does not allow spaces before its argument.
+ [ruby-core:71283] [Bug #11641]
+
+Sat Oct 31 14:58:01 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * man/ruby.1 (SYNOPSIS): remove extraneous space for -F option as
+ it does not allow spaces before its argument.
+ [ruby-core:71283] [Bug #11641]
+
+Sat Oct 31 10:22:49 2015 yui-knk <spiketeika@gmail.com>
+
+ * eval_error.c (undef_mesg_for): fix typo. Before this commit
+ `ArgumentError: malformed format string - %$` was raised when
+ `NameError#message` is called. [ruby-core:71282] [Bug #11640]
+ [Fix GH-1077]
+
+Fri Oct 30 21:12:45 2015 Kazuki Tsujimoto <kazuki@callcc.net>
+
+ * gems/bundled_gems: update to power_assert 0.2.5.
+
+Fri Oct 30 19:29:52 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (newobj_slowpath): do not need to use flags hack (commit miss).
+
+Fri Oct 30 19:08:48 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (heap_get_freeobj_from_next_freepage): not so UNLIKELY.
+
+Fri Oct 30 18:09:51 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (newobj_slowpath): reduce 1 parameter to use only registers
+ for performance.
+
+ On my laptop, 'N.times{x = []}' (where N = 29_000_000) is
+ 1.86 sec -> 1.74 sec.
+
+Fri Oct 30 12:53:21 2015 yui-knk <spiketeika@gmail.com>
+
+ * test/ruby/test_call.rb: added test for safe navigation operator.
+ [fix GH-1066]
+
+Fri Oct 30 12:47:34 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * ChangeLog: fix wrong commit name.
+
+Fri Oct 30 12:36:16 2015 yui-knk <spiketeika@gmail.com>
+
+ * vm_method.c: added documentation of protected/private methods.
+ [fix GH-1072]
+ * test/ruby/test_module.rb: added testcase for method_defined?
+ [fix GH-1071]
+
+Fri Oct 30 12:06:59 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * variable.c (rb_class_ivar_set): rename as class specific ivar
+ setter, and st_table is no longer involved.
+
+Fri Oct 30 11:36:33 2015 Eric Wong <e@80x24.org>
+
+ * variable.c (generic_ivar_remove): adjust type, set valp
+ (rb_obj_remove_instance_variable): simplify call
+ * test/ruby/test_object.rb (test_remove_instance_variable):
+ expand for implementation details
+
+Fri Oct 30 10:37:56 2015 Eric Wong <e@80x24.org>
+
+ * internal.h (rb_st_insert_id_and_value): update prototype
+ * variable.c (rb_st_insert_id_and_value): reduce args
+ (find_class_path): adjust call for less args
+ (rb_ivar_set): ditto
+ (rb_cvar_set): ditto
+ * class.c (rb_singleton_class_attached): ditto
+
+Fri Oct 30 09:57:22 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * gems/bundled_gems: update latest gems.
+ test-unit-3.1.5 and minitest-5.8.2
+
+Fri Oct 30 09:54:05 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * lib/rubygems: Update to RubyGems HEAD(60d7972).
+ this version contains pull requests number of #1343, #1356, #1357, #1363
+ at https://github.com/rubygems/rubygems/pulls
+ * test/rubygems: ditto.
+
+Fri Oct 30 07:38:29 2015 Koichi Sasada <ko1@atdot.net>
+
+ * insns.def (getinlinecache/setinlinecache): compare ic->ic_cref and
+ current cref only when cached CREF list includes singleton class.
+
+ Singleton classes have own namespaces, so that we need to check
+ cref as a key (#10943).
+
+ However, if current CREF list does not include singleton class,
+ no need to check CREF because it should be same name space.
+
+ * vm_insnhelper.c (vm_get_const_key_cref): add a function returns
+ CREF only when it includes singleton class.
+
+ * vm_core.h: constify iseq_inline_cache_entry::ic_cref.
+
+Fri Oct 30 06:43:50 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_insnhelper.c (vm_env_cref): make it inline for performance.
+
+ * vm_insnhelper.c (rb_vm_get_cref): use NULL instead of 0.
+
+Fri Oct 30 06:20:40 2015 Koichi Sasada <ko1@atdot.net>
+
+ * insns.def: nobody set ic->ic_value.value to Qundef.
+
+Fri Oct 30 06:15:50 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm.c: add ifndef guard for VM_CHECK_MODE.
+
+Fri Oct 30 06:13:10 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_insnhelper.c (vm_check_frame_detail): should require me for
+ VM_FRAME_FLAG_BMETHOD type frame.
+
+Thu Oct 29 18:42:30 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_mark_ptr): specify NOINLINE so that gc_mark() can return
+ immediately when obj is not a markable object.
+
+Thu Oct 29 18:05:22 2015 Koichi Sasada <ko1@atdot.net>
+
+ * encoding.c (rb_enc_check_str): add for performance.
+ This function only accepts T_STRING (and T_REGEXP).
+
+ This patch improves performance of a tiny_segmenter benchmark
+ (num=2) 2.54sec -> 2.42sec on my machine.
+ https://github.com/chezou/TinySegmenter.jl/blob/master/benchmark/benchmark.rb
+
+ * encoding.c: add ENC_DEBUG and ENC_ASSERT() macros.
+
+ * internal.h: add a decl. of rb_enc_check_str().
+
+ * string.c (rb_str_plus): use rb_enc_check_str().
+
+ * string.c (rb_str_subpat_set): ditto.
+
+Thu Oct 29 17:16:40 2015 Koichi Sasada <ko1@atdot.net>
+
+ * internal.h: export rb_wb_(un)protected_newobj_of()
+ because some extensions include internal.h.
+
+Thu Oct 29 16:42:19 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (rb_imemo_new): should not pass FL_WB_PROTECTED flag.
+
+ * gc.c (rb_wb_protected_newobj_of): add more assertions.
+
+ * gc.c (rb_wb_unprotected_newobj_of): ditto.
+
+Thu Oct 29 16:20:26 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: introduce rb_wb_unprotected_newobj_of() and
+ rb_wb_protected_newobj_of(), pass the WB_PROTECTED
+ information explicitly.
+
+ * internal.h: use introduced functions by NEWOBJ_OF().
+ `flag' is immediate value, so that C compilers can
+ solve them at compile time.
+
+ * include/ruby/ruby.h: add a comment about that.
+
+Thu Oct 29 14:52:03 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: add rb_objspace::flags::has_hook to represent hook availability.
+
+ * gc.c: add gc_event_hook_available_p(objspace) to check that flag.
+
+ * gc.c (newobj_of): use gc_event_hook_available_p() instead of
+ checking gc_event_hook_needed_p(objspace, RUBY_INTERNAL_EVENT_NEWOBJ).
+ for performance.
+
+ * gc.c (newobj_init): add UNLIKELY() for FL_WB_PROTECTED flag.
+
+ * gc.c (newobj_init): change parameters order (trivial change).
+
+Thu Oct 29 14:45:15 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_core.h (rb_thread_struct): move forward declarations before
+ used.
+
+Thu Oct 29 14:07:54 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_mark_ptr): remove debug code for #11244.
+
+Thu Oct 29 10:08:33 2015 Eric Wong <e@80x24.org>
+
+ * variable.c (struct autoload_state): usable as wait-queue head
+ (struct autoload_data_i): remove 2 words of overhead
+ (autoload_i_mark): remove marking for thread
+ (autoload_reset): adjust for struct changes
+ (rb_autoload): ditto
+ (rb_autoloading_value): ditto
+ (rb_autoload_load): ditto
+ (const_update): ditto
+
+Thu Oct 29 08:48:05 2015 Eric Wong <e@80x24.org>
+
+ * variable.c (struct autoload_data_i): add waitq_head
+ (struct autoload_state): new struct
+ (autoload_require): save result in autoload_state for use
+ in autoload_reset
+ (autoload_reset): wake up other waiters with open-coded
+ wait-queues
+ (rb_autoload_load): add ensure autoload_const_set happens
+ atomically w.r.t. autoload-triggered "require"
+ [ruby-core:70075] [ruby-core:71239] [Bug #11384]
+
+Wed Oct 29 00:39:50 2015 Naohisa Goto <ngotogenome@gmail.com>
+
+ * test/rubygems/test_gem_commands_server_command.rb
+ (test_handle_options_port): change port from http to discard.
+ Solaris does not include "http 80/tcp" in its default
+ /etc/inet/services. AFAIK, discard (9/tcp) is older than http
+ and it is expected that all OS can resolve the service name.
+ [Bug #10004] [ruby-core:63518]
+
+Wed Oct 28 23:52:48 2015 Naohisa Goto <ngotogenome@gmail.com>
+
+ * probes_helper.h (RUBY_DTRACE_HOOK): add RB_GC_GUARD, though paranoic.
+
+Wed Oct 28 15:36:11 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * error.c (rb_name_err_new): store the receiver directly.
+
+ * error.c (name_err_receiver): return directly stored receiver.
+ [Feature #10881]
+
+ * error.c (name_err_mesg_to_str): quote the name if unprintable.
+
+ * object.c (check_setter_id): use rb_check_id to convert names.
+
+ * variable.c (uninitialized_constant): use NameError::message to
+ keep the receiver of uninitialized constant. [Feature #10881]
+
+ * error.c (rb_name_err_new): new function to create NameError
+ exception instance. [Feature #10881]
+
+Wed Oct 28 13:29:39 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (new_attr_op_assign): fix op_assign type, which is
+ already an ID since r52284. [Feature #11537]
+
+Tue Oct 27 23:14:14 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * defs/id.def: enable anonymous IDs not to expose internal IDs for
+ frozen-string-literal-debug by Marshal.dump.
+
+Tue Oct 27 17:06:55 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * defs/id.def: move internal IDs for frozen-string-literal-debug.
+
+Tue Oct 27 16:41:05 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * error.c (rb_error_frozen_object): use rb_attr_get instead of
+ rb_ivar_get to get rid of warnings for string objects created
+ when frozen-string-literal-debug is disabled.
+
+Tue Oct 27 16:18:12 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/logger.rb (Logger::Period#previous_period_end): as weekly
+ rotation shifts the log file on Sundays, the end date of the
+ previous period should be Saturdays. fix r45072.
+ [ruby-dev:49314] [Bug #11622]
+
+Tue Oct 27 16:12:37 2015 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * vm_dump.c (rb_print_backtrace): our addr2line doesn't work on sparc.
+ http://rubyci.s3.amazonaws.com/unstable11s/ruby-trunk/log/20151027T043311Z.log.html.gz
+
+Tue Oct 27 12:00:33 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/logger.rb (Logger::Period#next_rotate_time): get rid of
+ adding to mday not to exceed the days of the month.
+ [ruby-core:71185] [Bug #11620]
+
+Mon Oct 26 22:43:03 2015 yui-knk <spiketeika@gmail.com>
+
+ * test/ruby/test_module.rb (test_method_defined): Add test cases
+ for `public/protected/private _method_defined?`
+ These methods accept string as argument, so add string argument
+ cases. [Fix GH-1067]
+
+Mon Oct 26 22:23:30 2015 SimonDKnight <simondknight@hotmail.com>
+
+ * lib/racc/rdoc/grammar.en.rdoc: Grammatical errors fixed.
+ [Fix GH-1070]
+
+Mon Oct 26 18:36:43 2015 Shota Fukumori (sora_h) <her@sorah.jp>
+
+ * vm_method.c(rb_method_entry_make):
+ [DOC] [ci skip] Remove a needless space from comment
+ [Fixes GH-1069] Patch by @yui-knk
+
+Mon Oct 26 17:30:13 2015 Ryan Hosford <tad.hosford@gmail.com>
+
+ * lib/fileutils.rb: rename tailing to trailing.
+ [Misc #11548]
+
+Mon Oct 26 17:11:53 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (call_op, call_op2): fix values on ripper. [Feature #11537]
+
+Mon Oct 26 12:55:06 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (call_op2): separate from call_op and also allow "::",
+ while dot_or_colon should not allow ".?". [Feature #11537]
+
+Mon Oct 26 01:03:23 2015 Rei Odaira <Rei.Odaira@gmail.com>
+
+ * thread_pthread.c: fix compile errors when
+ USE_SLEEPY_TIMER_THREAD is disabled.
+
+Sun Oct 25 10:12:05 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * symbol.c (op_tbl): add DOTQ for ripper. [Feature #11537]
+
+Sat Oct 24 22:51:18 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * configure.in: fixed build failure of Haiku.
+ [fix GH-984] Patch by @kallisti5
+ * ext/socket/getaddrinfo.c: ditto.
+ * ext/socket/getnameinfo.c: ditto.
+ * ext/socket/rubysocket.h: ditto.
+
+Sat Oct 24 21:16:53 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * test/fileutils/test_fileutils.rb (test_uptodate): relax error
+ message format. [Feature #9025], [ruby-core:71178] [Bug #11617]
+
+Sat Oct 24 21:06:43 2015 Shota Fukumori (sora_h) <her@sorah.jp>
+
+ * lib/mkmf.rb: Revert r45640 because it may lead to link
+ with different libruby. [Bug #9760]
+
+Sat Oct 24 15:42:20 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * bootstraptest/test_method.rb: relax error message format.
+
+ * test/ruby/test_arity.rb (err_mess): ditto.
+ [Feature #9025], [ruby-core:71178] [Bug #11617]
+
+Sat Oct 24 12:47:47 2015 Martin Duerst <duerst@it.aoyama.ac.jp>
+
+ * vm_insnhelper.c: improved error message for "wrong number
+ of arguments", distinguishing given and expected argument
+ numbers clearly. [Feature #9025]
+
+Sat Oct 24 11:57:59 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * vm_insnhelper.c: remove the typedef redeclaration of
+ vm_call_handler.
+
+Sat Oct 24 07:29:12 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/forwardable.rb (def_instance_delegator, def_single_delegator):
+ match backtraces against ::Forwardable in case the target class
+ is a subclass of BasicObject and does not include Kernel.
+ [ruby-core:71176] [Bug #11616]
+
+Sat Oct 24 04:10:13 2015 Koichi Sasada <ko1@atdot.net>
+
+ * iseq.c (make_compile_option_value): include frozen_string_literal*
+ in a made option value.
+
+ * vm_opts.h: forgot to add OPT_FROZEN_STRING_LITERAL_DEBUG
+ at last commit.
+
+Sat Oct 24 03:58:02 2015 Koichi Sasada <ko1@atdot.net>
+
+ * ruby.c: introduce --enable-frozen-string-literal-debug option.
+ If this option is enabled, the modify error will be:
+ can't modify frozen String (RuntimeError) =>
+ can't modify frozen String, created at test.rb:3 (RuntimeError)
+
+ * iseq.h: add compile option frozen_string_literal_debug.
+
+ * compile.c: catch up this fix.
+
+ * error.c (rb_error_frozen): ditto.
+
+ * iseq.c (set_compile_option_from_hash): ditto.
+
+ * test/ruby/test_rubyoptions.rb: add a test for this fix.
+
+Sat Oct 24 02:02:24 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_insnhelper.c: introduce new call handler for simple ISeqs.
+
+ vm_call_iseq_setup_normal_0start() is simple, however it has
+ some loops/conditions depends on ISeq::param.size and
+ ISeq::local_size (in vm_push_frame(), inlined into this function).
+
+ There are many simple methods which has a few parameters and local
+ variables. So that this patch introduces several special functions
+ generated in vm_call_iseq_optimized.inc by
+ tool/mk_call_iseq_optimized.rb.
+
+ This script makes
+ vm_call_iseq_setup_normal_0start_Xparams_Ylocals()
+ where X is 0 to 3 and Y is 1 to 6 (as current setting).
+ In this case, X * Y = 24 functions are created.
+
+ These functions creates fast method dispatch by inlining
+ vm_push_frame() with immediate params/locals sizes.
+
+ On my laptop, we can have the following results.
+
+ vm2_method* 1.083 (8.3% faster)
+ vm2_poly_method* 0.961 (3.4% slower)
+
+ It shows 8.3% faster for inner loop method dispatch (hit inline
+ cache), but 3.4% slower when inline cache miss because we need
+ to find a suitable call handler.
+
+ * common.mk: add a rule for vm_call_iseq_optimized.inc.
+
+ * tool/mk_call_iseq_optimized.rb: added.
+
+ * vm.c: include vm_call_iseq_optimized.inc.
+
+Sat Oct 24 01:58:50 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_core.h: define vm_call_handler.
+
+Sat Oct 24 01:56:01 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_core.h, vm_insnhelper.h: move definition of VMDEBUG
+ from vm_insnhelper.h to vm_core.h.
+
+Sat Oct 24 01:51:01 2015 Akinori MUSHA <knu@iDaemons.org>
+
+ * NEWS: [DOC] In the new safe call syntax, arguments are evaluated
+ only if a call is made.
+
+ * doc/syntax/calling_methods.rdoc: Fix a typo.
+
+Sat Oct 24 00:38:34 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * lib/forwardable (def_instance_delegator, def_single_delegator):
+ rescue ::Exception instead of Exception in case Exception is
+ defined under the target class.
+ [ruby-core:71175] [Ruby trunk - Bug #11615]
+
+Fri Oct 23 21:10:37 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * error.c (name_err_mesg_to_str): separate class names from the
+ receiver description.
+
+ * vm_eval.c (make_no_method_exception, raise_method_missing): add
+ format specifiers for class names.
+
+Fri Oct 23 18:10:32 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * .gitignore: ignored environmental wrapper files.
+
+Fri Oct 23 17:55:29 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * lib/irb.rb: Ignored assignment of STDOUT.sync = true
+ when irb.rb loaded. It's affected to IDE such as Jetbrain.
+ [fix GH-864] Patch by @os97673
+
+Fri Oct 23 16:35:08 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * lib/ipaddr.rb, test/test_ipaddr.rb: Reject invalid address contained
+ EOL string. Patch by @kachick [fix GH-942][Bug #11513]
+
+Fri Oct 23 16:03:26 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * file.c: fix indent style. [fix GH-977]
+ * test/ruby/test_string.rb: indent. [fix GH-975]
+ [ci skip] These patches are contributed from @yui-knk
+
+Fri Oct 23 15:46:09 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * string.c: Added method signature to include hash. It's inconsistency
+ with `gsub` method signature.
+ [ci skip][fix GH-1023] Patch by @danielevans
+
+Fri Oct 23 15:25:51 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * lib/net/imap.rb: remove an empty comment line and -*-.
+
+Fri Oct 23 15:20:02 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * lib/net/ftp.rb (gettextfile, getbinaryfile): use the safe
+ navigation operator.
+
+Fri Oct 23 13:51:33 2015 yui-knk <spiketeika@gmail.com>
+
+ * test_call.rb (test_safe_call): Add test cases for safe
+ navigation operator assignment. [Fix GH-1064]
+ Validate:
+ * can assign an attribute which is `nil`
+ * can "or assign" an attribute which is `nil`
+
+Fri Oct 23 11:58:21 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * compile.c (iseq_peephole_optimize): optimize lengthy safe
+ navigation method chain. [Feature #11537]
+
+Fri Oct 23 10:58:41 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * lib/matrix/eigenvalue_decomposition.rb (tridiagonalize): fix
+ indentation to avoid a warning when the command line option -w of
+ ruby is specified.
+
+ * lib/matrix/eigenvalue_decomposition.rb (hessenberg_to_real_schur):
+ change the name of a block parameter to avoid a warning when the
+ command line option -w of ruby is specified.
+
+Fri Oct 23 10:49:36 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * compile.c (iseq_compile_each): support safe navigation of simple
+ attribute assignment. [Feature #11537]
+
+ * parse.y (mlhs_node, lhs, attrset_gen): ditto. keep mid
+ non-attrset as the sign of safe navigation.
+
+Fri Oct 23 07:17:11 2015 Eric Wong <e@80x24.org>
+
+ * test/io/wait/test_io_wait.rb (test_wait_eof): test return value
+
+Fri Oct 23 00:32:02 2015 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * ext/openssl/ossl_ssl.c (ssl_npn_select_cb): explicitly raise error
+ in ext/openssl instead of OpenSSL itself because LibreSSL
+ silently truncate the selected protocol name by casting the length
+ from int to unsigned char. [Bug #11369]
+ Patch by Jeremy Evans <merch-redmine@jeremyevans.net>
+
+Fri Oct 23 00:49:45 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * lib/un.rb (help): change the name of a block parameter to avoid
+ a warning when the command line option -w of ruby is specified.
+
+Fri Oct 23 00:22:20 2015 Josef Simanek <josef.simanek@gmail.com>
+
+ * string.c (rb_str_tr): [DOC] Escape backslash in String#tr
+ documentation. [Fix GH-1063]
+
+Fri Oct 23 00:19:04 2015 yui-knk <spiketeika@gmail.com>
+
+ * array.c (rb_ary_collect): [DOC] Fix space of code example of
+ Array#map. [Fix GH-1062]
+
+Thu Oct 22 18:52:53 2015 Akinori MUSHA <knu@iDaemons.org>
+
+ * vm_eval.c (rb_f_loop): When a loop is stopped by a StopIteration
+ exception, return what the enumerator has returned instead of
+ nil. [ruby-core:71133] [Feature #11498]
+
+Thu Oct 22 18:25:10 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * lib/net/imap.rb (idle): add a new argument timeout for keep-alive.
+ [ruby-core:63693] [Bug #10031]
+
+Thu Oct 22 15:30:08 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * compile.c (iseq_peephole_optimize): peephole optimization for
+ branchnil jumps.
+
+ * compile.c (iseq_compile_each): generate save navigation operator
+ code.
+
+ * insns.def (branchnil): new opcode to pop the tos and branch if
+ it is nil.
+
+ * parse.y (NEW_QCALL, call_op, parser_yylex): parse token '.?'.
+ [Feature #11537]
+
+Thu Oct 22 13:16:19 2015 Guilherme Reis Campos <guilhermekbsa@gmail.com>
+
+ * dir.c (ruby_brace_expand): glob brace expansion edge case fix.
+ When there are closing braces '}' before a open brace '{' it
+ must be ignored and considered as literal.
+ [ruby-core:71138] [Bug #11609]
+
+Thu Oct 22 13:13:49 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * io.c (argf_next_argv): check ARGV element type, and try
+ conversion if necessary. [ruby-core:71140] [Bug #11610]
+
+Thu Oct 22 11:11:16 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * test/net/ftp/test_ftp.rb: add tests for getbinaryfile and
+ gettextfile.
+
+Wed Oct 21 18:34:06 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (parser_magic_comment): allow a sole magic comment without
+ indicators, neither other non-space comments. [Feature #8976]
+
+Tue Oct 20 12:17:56 2015 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
+
+ * lib/prime.rb: Add basic argument checking to Prime.prime?
+ [Bug #11606]
+
+Tue Oct 20 12:17:50 2015 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
+
+ * lib/prime.rb: Optimize Integer#prime?
+ Patch by Nick Slocum [Bug #10354]
+
+Tue Oct 20 08:12:47 2015 Rei Odaira <Rei.Odaira@gmail.com>
+
+ * configure.in: pthread_getattr_np is broken on AIX.
+ More specifically, the stack address and size returned are
+ not correct.
+
+Tue Oct 20 05:54:46 2015 Eric Wong <e@80x24.org>
+
+ * ext/fiddle/closure.c (callback): static function
+
+Mon Oct 19 10:33:46 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/socket/init.c (rsock_raise_socket_error): get rid of a glibc
+ bug. [ruby-core:71100] [Bug #11600]
+
+Mon Oct 19 01:26:26 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * file.c (rb_file_identical_p): not necessary to compare the paths after
+ comparing the file indexes on Windows. designate by kosaki.
+
+Sun Oct 18 21:17:27 2015 Tanaka Akira <akr@fsij.org>
+
+ * lib/open-uri.rb: Specify frozen_string_literal: true.
+
+Sun Oct 18 14:37:56 2015 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * random.c (fill_random_bytes_urandom): add a comment why using
+ O_NONBLOCK and O_NOCTTY.
+
+Sun Oct 18 13:24:17 2015 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * random.c (fill_random_bytes_syscall): use ATOMIC_SET() for
+ updating try_syscall.
+
+Sun Oct 18 13:03:52 2015 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * include/ruby/backward/util.h: Good-by Borland-C.
+
+Sun Oct 18 13:03:09 2015 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * common.mk: add a comment how to use "make test-all"
+
+Sun Oct 18 12:59:22 2015 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * common.mk: add comments how to use "make benchmark"
+
+Sun Oct 18 12:58:15 2015 Tanaka Akira <akr@fsij.org>
+
+ * lib/securerandom.rb: Specify frozen_string_literal: true.
+
+Sun Oct 18 11:22:52 2015 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * dln.c: remove defined(__WATCOMC__).
+
+Sun Oct 18 11:16:33 2015 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * lib/mkmf.rb: Good-by Borland-C.
+
+Sun Oct 18 11:04:36 2015 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * numeric.c: Good-by Borland-C.
+ * include/ruby/backward/rubyio.h: ditto.
+ * include/ruby/backward/st.h: ditto.
+ * include/ruby/backward/util.h: ditto.
+ * include/ruby/backward/rubysig.h: ditto.
+ * include/ruby/backward/classext.h: ditto.
+ * dln.c: ditto.
+ * gc.c: ditto.
+ * win32/resource.rb: ditto.
+ * win32/dir.h: ditto.
+ * ext/tk/tcltklib.c: ditto.
+ * NEWS: announce that Borland-C is no longer supported.
+
+Sun Oct 18 10:54:52 2015 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * dln.c: simplify #ifdef. _WIN32 and __CYGWIN__ are exclusive.
+ see include/ruby/defines.h
+ * gc.c: ditto.
+ * ext/sdbm/_sdbm.c: ditto.
+
+Sun Oct 18 10:42:19 2015 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * ruby.c (open_load_file): add a comment.
+
+Sun Oct 18 10:12:46 2015 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * file.c (rb_file_identical_p): simplify ifdefs
+
+Sun Oct 18 10:01:40 2015 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * ChangeLog: Good-bye OS/2.
+ * common.mk: ditto.
+ * configure.in: ditto.
+ * dln_find.c: ditto.
+ * ext/Setup.emx: ditto.
+ * ext/extmk.rb: ditto.
+ * ext/socket/extconf.rb: ditto.
+ * ext/zlib/extconf.rb: ditto.
+ * file.c: ditto.
+ * include/ruby/defines.h: ditto.
+ * io.c: ditto.
+ * lib/mkmf.rb: ditto.
+ * missing/os2.c: ditto.
+ * process.c: ditto.
+ * ruby.c: ditto.
+ * NEWS: announce OS/2 is no longer supported.
+
+Sun Oct 18 08:50:15 2015 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * include/ruby/defines.h (DOSISH): add comments.
+
+Sun Oct 18 08:26:51 2015 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * io.c (fptr_finalize): don't release gvl if fptr is not writable.
+ writable fd may block on close(2) when it's on NFS. But readonly
+ fd doesn't. [Bug #11559]
+ result: make benchmark OPTS="-p bm_require_t -e ruby-trunk -e ruby-2.2.2"
+ build-ruby: 0.171
+ ruby 2.3.0dev(r52151): 0.659
+ ruby 2.2.0p95 (r50295): 0.834
+
+Sun Oct 18 09:32:58 2015 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * file.c (ruby_is_fd_loadable): this should be fail if st_mode is
+ not regular file nor FIFO.
+
+Sun Oct 18 09:20:17 2015 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * ruby.c (open_load_file): use rb_thread_wait_fd() instead of reopen.
+
+Sun Oct 18 05:11:22 2015 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * ruby.c (open_load_file): reset O_NONBLOCK after open.
+ Even if S_ISREG() is true, the file may be file on FUSE filesystem
+ or something. We can't assume O_NONBLOCK is safe.
+ Moreover, we should wait if the path is point to FIFO. That's
+ FIFO semantics. GVL should be transparent from ruby script.
+ Thus, just reopen without O_NONBLOCK for filling the requirements.
+ [Bug #11060][Bug #11559]
+
+ * ruby.c (loadopen_func): new for the above.
+
+ * file.c (ruby_is_fd_loadable): new. for checks loadable file type
+ of not.
+ * file.c (rb_file_load_ok): use ruby_is_fd_loadble()
+ * internal.h: add ruby_is_fd_loadble()
+
+ * common.mk: now, ruby.o depend on thread.h.
+
+ * test/ruby/test_require.rb
+ (TestRequire#test_loading_fifo_threading_success): new test.
+ This test successful case that loading from FIFO.
+
+ * test/ruby/test_require.rb
+ (TestRequire#test_loading_fifo_threading_raise): rename from
+ test_loading_fifo_threading. You shouldn't rescue an exception
+ if you test raise or not.
+ Moreover, this case should be caught IOError because load(FIFO)
+ should be blocked until given any input.
+
+Sat Oct 17 13:55:32 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * file.c (rb_file_expand_path_internal): concatenate converted
+ string to the result instead of making converted string and
+ append it.
+
+ * string.c (rb_str_cat_conv_enc_opts): from rb_str_conv_enc_opts,
+ separate function to concatenate with transcoding.
+
+Sat Oct 17 13:19:10 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ruby.c (load_file): unify each preparations and clean-ups by
+ merging load_file_internal and load_file_internal2, and remove
+ nested rb_protect and rb_ensure.
+
+Sat Oct 17 05:28:32 2015 Rei Odaira <Rei.Odaira@gmail.com>
+
+ * test/ruby/test_symbol.rb (test_symbol_fstr_leak): add a warm-up
+ code and check RSS to avoid false positive on AIX and false
+ negative on Mac OS X. [Bug #10686]
+
+Fri Oct 16 15:54:37 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * file.c (rb_file_load_ok): open in non-blocking mode withoout
+ releasing GVL. don't care about others than regular files and
+ directories. [ruby-dev:49272] [Bug #11559]
+
+ * ruby.c (load_file_internal): ditto.
+
+Thu Oct 15 23:56:03 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * proc.c (rb_sym_to_proc): make void env.
+
+Thu Oct 15 13:37:23 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * proc.c (rb_sym_to_proc): move from string.c and create a Proc
+ with no environments. [ruby-core:71088] [Bug #11594]
+
+Thu Oct 15 01:57:03 2015 CHIKANAGA Tomoyuki <nagachika@ruby-lang.org>
+
+ * test/objspace/test_objspace.rb
+ (test_trace_object_allocations_start_stop_clear): clear object
+ allocation table first to get rid of erroneous detection for obj3.
+ [ruby-dev:49095] [Bug #11271]
+
+Thu Oct 15 01:53:38 2015 Benoit Daloze <eregontp@gmail.com>
+
+ * test/ostruct/test_ostruct.rb: Add tests for OpenStruct#respond_to.
+ Patch by @jeremy in [GH-1041]: https://github.com/ruby/ruby/pull/1041
+
+Thu Oct 15 01:49:25 2015 Benoit Daloze <eregontp@gmail.com>
+
+ * lib/ostruct.rb: Finish defining OpenStruct attributes lazily.
+ Patch by @sferik in [GH-1037]: https://github.com/ruby/ruby/pull/1037
+ This commit is an addendum to https://github.com/ruby/ruby/pull/1033.
+ It:
+ 1. lazily defines attribute accessors for copied and marshaled objects,
+ 2. returns nil when an attribute reader is not defined, and
+ 3. defines respond_to_missing? to maintain the same respond_to? behavior
+
+Wed Oct 14 16:56:50 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in: check for libunwind.h, which is not available in
+ very old OS X SDK. [ruby-core:71080] [Bug #11591]
+
+Wed Oct 14 14:11:42 2015 Brian Black <bblack@veracode.com>
+
+ * iseq.c (rb_insn_operand_intern): change kw in callinfo disasm from the
+ number of keyword arguments to an ordered list of the keywords used.
+ [Feature #11589]
+
+Wed Oct 14 13:58:44 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (parser_nextc): send a warning to ripper, not to STDERR
+ always.
+
+ * parse.y (rb_warn1, rb_warning1): move argument conversions to
+ callers. PRIsVALUE is not valid in String#%.
+
+Wed Oct 14 13:37:23 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * lib/racc/rdoc/grammar.en.rdoc: fix spell error.
+ [fix GH-1053][ci skip] Patch by @Matrixbirds
+
+Tue Oct 13 22:06:50 2015 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/raddrinfo.c (rsock_fd_family): Check sa_len.
+
+Tue Oct 13 12:14:10 2015 Craig Davison <craig65535@gmail.com>
+
+ * ext/socket/rsock_addrinfo (rsock_addrinfo): specify address
+ family. [Fix GH-1052]
+
+ * ext/socket/udpsocket.c (udp_connect, udp_bind, udp_send):
+ address family by the receiver.
+
+Sun Oct 11 07:09:19 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_insnhelper.c (vm_push_frame): initialize other than sp (and ep)
+ first for performance.
+
+Sun Oct 11 06:21:50 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_eval.c, internal.h (rb_yield_1): added for performance which
+ doesn't check Qundef.
+
+ * numeric.c (int_dotimes): use rb_yield_1.
+
+Sun Oct 11 06:19:49 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_insnhelper.c (vm_call_iseq_setup_normal): setup sp first
+ for performance.
+
+Sun Oct 11 05:29:51 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm.c (invoke_block_from_c): split this function into several
+ functions.
+
+ * vm_insnhelper.c (vm_yield_callee_setup_arg): remove this function
+ because it is only delegation function.
+
+Sun Oct 11 03:48:46 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (newobj_of_slowpass): fix typo (pass -> path).
+ Pointed out by Yukihiro Matsumoto <matz@ruby-lang.org>.
+
+ * gc.c (newobj_of_...): `of' is unnecessary.
+
+Sat Oct 10 19:04:42 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/socket/udpsocket.c (udp_connect, udp_bind): get open files
+ inside ensure functions.
+
+Sat Oct 10 18:35:12 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_insnhelper.c (vm_call_method0): do not propagate enable_fastpath,
+ but pass dummy CC to prevent wrong caching.
+
+Sat Oct 10 15:28:45 2015 Koichi Sasada <ko1@atdot.net>
+
+ * import a github pull request
+ https://github.com/ruby/ruby/pull/1050
+ by Kazuho Oku <kazuho@natadeco.co>.
+
+ This pull request has the following commits.
+
+ * gc.c: reduce # of args to 6 (max. of register args on x86-64) so
+ that the `newobj_of_slowpass` can be called via TCO.
+
+ * gc.c (newobj_of), string.c (str_duplicate): for performance,
+ the hot functions must be inlined.
+
+ * gc.c: for performance, preceding arguments of `.*newobj_of.*`
+ must be same, so that the arg registers can be reused in case of
+ TCO.
+
+Sat Oct 10 08:52:21 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/socket/udpsocket.c (udp_connect, udp_bind, udp_send): fix
+ memory leaks at closed socket.
+
+Fri Oct 9 17:29:07 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * lib/net/ftp.rb (parse257): refactor.
+
+Fri Oct 9 16:42:26 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * lib/net/imap.rb: use frozen_string_literal: true.
+
+ * test/net/imap/test_imap.rb: ditto.
+
+ * test/net/imap/test_imap_response_parser.rb: ditto.
+
+Fri Oct 9 15:52:28 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * lib/net/ftp.rb: use frozen_string_literal: true.
+
+ * test/net/ftp/test_buffered_socket.rb: ditto.
+
+ * test/net/ftp/test_ftp.rb: ditto.
+
+ * test/net/ftp/test_mlsx_entry.rb: ditto.
+
+Fri Oct 9 14:12:35 2015 Shota Fukumori (sora_h) <her@sorah.jp>
+
+ * ext/openssl/lib/openssl/ssl.rb: Revert r52082 because it was
+ dropping TLS v1.1 support too. Supporting only TLS v1.2 is too
+ early, because many popular websites still don't support it.
+
+ For instance, Servers where aws-sdk connects to still don't support
+ TLS v1.2 and it became broken.
+
+ We should consider more carefully about this.
+
+ [Fix GH-873] [Feature #11524]
+
+Fri Oct 9 12:52:08 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * compile.c (iseq_compile_each): Dynamic string literals (e.g.,
+ "#{x}") should not be frozen because they don't literally
+ represent strings.
+ https://twitter.com/shugomaeda/status/651937650027401216
+ https://twitter.com/yukihiro_matz/status/651942882312482817
+ https://twitter.com/yukihiro_matz/status/651980835181096960
+
+Fri Oct 9 06:52:49 2015 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * benchmark/prepare_require.rb: skip file creation if it already
+ exist. Suggested by ko1.
+
+Fri Oct 9 06:18:04 2015 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+ * benchmark/bm_require.rb: new benchmark for require.
+ * benchmark/bm_require_thread.rb: new benchmark for conflicting
+ require vs thread. like [Bug #11559]
+ * prepare_require.rb: new file for preparing above tests.
+ * prepare_require.rb: ditto.
+
+Thu Oct 8 14:10:45 2015 Zachary Scott <zzak@ruby-lang.org>
+
+ * ext/openssl/lib/openssl/ssl.rb: Default to TLSv1.2 and drop TLS v1
+ Patch provided by @claudijd [Fixes GH-873] [Feature #11524]:
+ https://github.com/ruby/ruby/pull/873
+
+Wed Oct 7 22:55:02 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * test/minitest/metametameta.rb (with_output): restore output to
+ fix mixing test result output in worker responses.
+
+Wed Oct 7 21:32:51 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * string.c (str_duplicate): move from rb_str_resurrect to short
+ circuit initialization.
+
+Wed Oct 7 20:43:14 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * string.c (rb_str_resurrect): fix resurrection of short enough to
+ be embedded but not embedded string.
+
+Wed Oct 7 20:17:29 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (newobj_of): divide fast path and slow path
+ to avoid register savings for fast path.
+
+ This idea is given by Kazuho Oku <kazuho@natadeco.co>.
+
+Wed Oct 7 17:30:50 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * string.c (rb_str_times): optimize for the argument 0 and 1.
+
+Wed Oct 7 01:20:46 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.h, gc.c: introduce new debug function rb_obj_info_dump(VALUE obj)
+ which prints the result of rb_raw_obj_info(..., obj).
+
+Wed Oct 7 01:16:11 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_args.c: remove an unused field args_info::calling.
+
+Tue Oct 6 23:43:10 2015 Koichi Sasada <ko1@atdot.net>
+
+ * proc.c (rb_method_entry_min_max_arity): should support
+ OPTIMIZED_METHOD_TYPE_CALL.
+
+Tue Oct 6 21:29:08 2015 Tanaka Akira <akr@fsij.org>
+
+ * lib/tmpdir.rb (Dir.tmpdir): return duplicated string to be
+ modify safely even when $SAFE > 0.
+
+Tue Oct 6 19:24:38 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_insnhelper.c (vm_call_method0): use switch() for visibilities
+ (for readability).
+
+Tue Oct 6 19:23:58 2015 Koichi Sasada <ko1@atdot.net>
+
+ * proc.c (Init_Proc): Proc#call and others should be public.
+
+Tue Oct 6 18:51:51 2015 Koichi Sasada <ko1@atdot.net>
+
+ * method.h: IMEMO_FL_USER3 and IMEMO_FL_USER4 is not needed any more.
+
+Tue Oct 6 18:47:45 2015 Koichi Sasada <ko1@atdot.net>
+
+ * method.h: remove METHOD_ENTRY_SAFE(me) and related code
+ because $SAFE = 3 and 4 is not available.
+ Now, $SAFE is not checked on method dispatch at all.
+
+ * vm_eval.c, vm_insnhelper.c, vm_method.c: ditto.
+
+Tue Oct 6 13:56:14 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * include/ruby/ruby.h: turn function macros into inline functions,
+ for debuggers.
+
+ * include/ruby/ruby.h: turn constant macros into enums, for
+ debuggers.
+
+Tue Oct 6 13:48:05 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * method.h: typo fix. Patch by @davydovanton [fix GH-1032][ci skip]
+
+Tue Oct 6 06:54:34 2015 Koichi Sasada <ko1@atdot.net>
+
+ * iseq.c (rb_iseq_free): free iseq::variable_body to avoid memory
+ leak.
+
+Tue Oct 6 06:32:52 2015 Koichi Sasada <ko1@atdot.net>
+
+ * proc.c: enable optimization of Proc#call.
+ [Feature #11569]
+
+ * NEWS: write about this optimization and incompatibilities.
+
+ * test/ruby/test_backtrace.rb: catch up this fix.
+
+Tue Oct 6 04:41:03 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_insnhelper.c: solve goto spaghetti.
+
+ Change all goto statement across blocks to tail call functions.
+
+Tue Oct 6 02:29:38 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * string.c (rb_str_resurrect): optimize by short circuit to copy
+ hidden string without checking length, encoding and so on.
+
+Mon Oct 5 23:08:17 2015 CHIKANAGA Tomoyuki <nagachika@ruby-lang.org>
+
+ * test/ruby/test_thread.rb (test_handle_interrupt_blocking): check if
+ exception handling was postponed until sleep.
+
+Mon Oct 5 22:25:49 2015 Tanaka Akira <akr@fsij.org>
+
+ * lib/pp.rb: Use frozen_string_literal: true.
+
+ * lib/prettyprint.rb: Ditto.
+
+ * lib/resolv.rb: Ditto.
+
+ * lib/tmpdir.rb: Ditto.
+
+ * test/test_pp.rb: Ditto.
+
+ * test/test_prettyprint.rb: Ditto.
+
+ * tool/transcode-tblgen.rb: Ditto.
+
+Mon Oct 5 20:39:32 2015 Benoit Daloze <eregontp@gmail.com>
+
+ * test/ruby/test_thread.rb: fix potential race condition.
+ The thread could have a "sleep" status because it tries
+ to acquire the mutex, but does not have it yet.
+
+Mon Oct 5 15:39:30 2015 Zachary Scott <zzak@ruby-lang.org>
+
+ * numeric.c: [DOC] Overview for Numeric class by Joe Corcoran
+ This patch was created at ROSSConf Berlin 2015 [Bug #11555]
+
+Mon Oct 5 15:34:56 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * proc.c (proc_new): link ep to calling block.
+ [ruby-core:70980] [Bug #11566]
+
+Mon Oct 5 00:53:51 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * dir.c (rb_dir_getwd): make ASCII-8BIT if filesystem encoding is
+ US-ASCII, like as Dir.glob.
+
+Sun Oct 4 23:39:09 2015 Tanaka Akira <akr@fsij.org>
+
+ * enum.c (nmin_filter): Fix limit value.
+ patch by Helder Pereira.
+ [Bug #11471] [ruby-core:70477]
+
+Sun Oct 4 15:11:48 2015 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * enc/euc_jp.c (mbc_case_fold): check given string is valid or not,
+ and if invalid, return 1. [Bug #11486]
+
+Sun Oct 4 10:09:57 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * dir.c (rb_dir_getwd): normalize OS path to UTF-8 on OS X.
+
+Sun Oct 4 00:09:45 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * template/ruby-runner.c.in: wrapper to set dynamic loading path
+ environment variable. /bin/sh on Mac OS X 10.11 (El Capitan)
+ clears DYLD_LIBRARY_PATH.
+
+ it must:
+ - do nothing even if current directory is not present
+ - do not set other environment variables, e.g. PWD, SHLVL, etc
+ - do not open other FDs, e.g. pipes for timer thread
+
+Sun Oct 2 10:59:00 2015 schneems <richard.schneeman@gmail.com>
+
+ * ext/pathname/lib/pathname.rb: freeze string literals for
+ reduced object allocation.
+ [Feature #11375] [ruby-core:70043]
+
+Fri Oct 2 09:20:20 2015 Martin Duerst <duerst@it.aoyama.ac.jp>
+
+ * common.mk, lib/unicode_normalize/tables.rb: Change Unicode
+ Version for character normalization data from 7.0.0 to
+ 8.0.0.
+
+Fri Oct 2 00:18:39 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * proc.c (proc_mark): block.ep of Proc from Symbol is now NULL.
+ [ruby-core:70961] [Bug #11560]
+
+Wed Sep 30 15:47:13 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_args.c (vm_caller_setup_arg_block): bypass Symbol#to_proc
+ call to optimize symbol block passing.
+
+Wed Sep 30 01:34:34 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (parser_free): fix memory leak at syntax error when
+ warn-indent is enabled.
+
+Tue Sep 29 22:27:50 2015 Benoit Daloze <eregontp@gmail.com>
+
+ * parse.y: fix minor typo. [ci skip][fix GH-1038].
+ Patch by @ltratt.
+
+Tue Sep 29 16:53:53 2015 Martin Duerst <duerst@it.aoyama.ac.jp>
+
+ * tool/unicode_norm_gen.tmpl, lib/unicode_normalize/tables.rb:
+ get rid of many .freeze commands by using frozen_string_literal
+ pragma.
+
+Tue Sep 29 16:37:29 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * compile.c (compile_dstr_fragments): fix performance by omitting
+ the first empty string only for keeping literal encoding if
+ other literals are too. [ruby-core:70930] [Bug #11556]
+
+ * string.c (rb_str_append_literal): append but keep encoding non
+ US-ASCII.
+
+Mon Sep 28 17:40:17 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * lib/net/ftp.rb (mtime): use usec instead of fractions to parse
+ decimal fractions of a second correctly when the number of digits
+ is not 6.
+
+Mon Sep 28 16:07:08 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * lib/net/ftp.rb (mtime): parse decimal fractions of a second as
+ specified in RFC 3659.
+
+Mon Sep 28 10:31:12 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * test/test_forwardable.rb: Write basic tests for lib/forwardable.
+ [fix GH-1035] Patch by @kachick
+
+Sun Sep 27 23:32:46 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * class.c (rb_define_class, rb_define_class_id_under): refine
+ error messages.
+
+ * class.c (rb_define_module, rb_define_module_id_under): ditto,
+ and make consistent with class.
+
+Sun Sep 27 18:44:43 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * ChangeLog: removed duplicated message.
+
+Sun Sep 27 15:46:58 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ruby.c (process_options): add an option to enable/disable
+ frozen-string-literal. [Feature #8976]
+
+ * compile.c (iseq_compile_each): override compile option by option
+ given by pragma.
+
+ * iseq.c (rb_iseq_make_compile_option): extract a function to
+ overwrite rb_compile_option_t.
+
+ * parse.y (parser_set_compile_option_flag): introduce pragma to
+ override compile options.
+
+ * parse.y (magic_comments): new pragma "frozen-string-literal".
+ [Feature #8976]
+
+Sun Sep 27 08:16:35 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/ostruct.rb (delete_field): do not raise NameError for
+ existing keys. [Fix GH-1033]
+
+Sun Sep 27 00:34:31 2015 Zachary Scott <zzak@ruby-lang.org>
+
+ * lib/ostruct.rb: Move method definitions for getter/setter to be lazy
+ Patch by @sferik in [GH-1033]: https://github.com/ruby/ruby/pull/1033
+
+Fri Sep 25 10:07:25 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * lib/net/http.rb: removed unused variable. It's removed at r13648.
+ [fix GH-1022] Patch by @nkondratyev
+
+Fri Sep 25 09:48:27 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * gems/bundled_gems: upgrade to minitest-5.8.1
+
+Fri Sep 25 09:47:12 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * id_table.c: fix typo. [ci skip][fix GH-1031] Patch @davydovanton
+
+Fri Sep 25 07:54:05 2015 Rei Odaira <Rei.Odaira@gmail.com>
+
+ * test/gdbm/test_gdbm.rb (TestGDBM#test_s_open_lock): skip
+ this test on AIX. The issue is the same as on Solaris.
+ [ruby-dev:47631]
+
+Thu Sep 24 17:25:09 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (paren_args): fix separator token at `foo::bar()` in
+ ripper.
+
+Thu Sep 24 00:00:17 2015 Rei Odaira <Rei.Odaira@gmail.com>
+
+ * complex.c: ruby/config.h must be included before math.h
+ because it defines _LARGE_FILES on AIX and _LARGE_FILES
+ must be defined before sys/types.h is included from math.h.
+ [Bug #11483]
+
+Wed Sep 23 22:22:38 2015 Zachary Scott <zzak@ruby-lang.org>
+
+ * ext/openssl/ossl_pkcs12*: Remove svn commit id macro
+
+Wed Sep 23 01:11:28 2015 Zachary Scott <zzak@ruby-lang.org>
+
+ * ext/openssl/*: Remove svn commit id macros to make sync easier
+
+Tue Sep 22 04:20:01 2015 Masatoshi SEKI <m_seki@mva.biglobe.ne.jp>
+
+ * test/drb/test_drb.rb: Run Rinda/DRb tests on localhost. [Fix GH-1027]
+ patch by voxik.
+
+ * test/rinda/test_rinda.rb: ditto
+
+Mon Sep 21 20:53:39 2015 tbpgr <tbpgr@tbpgr.jp>
+
+ * test/win32ole/test_win32ole_event.rb: fix typo.
+ swbemsink_avairable? => swbemsink_available? [Fix GH-1025]
+
+Sun Sep 20 10:07:35 2015 Anton Davydov <antondavydov.o@gmail.com>
+
+ * cont.c (rb_callcc): [DOC] append continuations example accros
+ methods. [Fix GH-1026]
+
+Sun Sep 20 03:20:21 2015 Koichi Sasada <ko1@atdot.net>
+
+ * iseq.c (rb_iseq_free): free rb_iseq_t::body::cc_entries.
+
+Sun Sep 20 02:46:34 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_core.h: split rb_call_info_t into several structs.
+ * rb_call_info (ci) has compiled fixed information.
+ * if ci->flag & VM_CALL_KWARG, then rb_call_info is
+ also rb_call_info_with_kwarg. This technique reduce one word
+ for major rb_call_info data.
+ * rb_calling_info has temporary data (argc, blockptr, recv).
+ for each method dispatch. This data is allocated only on
+ machine stack.
+ * rb_call_cache is for inline method cache.
+
+ Before this patch, only rb_call_info_t data is passed.
+ After this patch, above three structs are passed.
+
+ This patch improves:
+ * data locality (rb_call_info is now read-only data).
+ * reduce memory consumption (rb_call_info_with_kwarg,
+ rb_calling_info).
+
+ * compile.c: use above data.
+
+ * insns.def: ditto.
+
+ * iseq.c: ditto.
+
+ * vm_args.c: ditto.
+
+ * vm_eval.c: ditto.
+
+ * vm_insnhelper.c: ditto.
+
+ * vm_insnhelper.h: ditto.
+
+ * iseq.h: add iseq_compile_data::ci_index and
+ iseq_compile_data::ci_kw_index.
+
+ * tool/instruction.rb: introduce TS_CALLCACHE operand type.
+
+Sun Sep 20 02:18:10 2015 Tanaka Akira <akr@fsij.org>
+
+ * test/lib/envutil.rb: mkfifo command based File.mkfifo method
+ definition removed.
+
+Fri Sep 18 20:11:11 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * file.c (rb_file_s_mkfifo): implement File.mkfifo.
+ [Feature #11536]
+
+Fri Sep 18 16:56:19 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * NEWS: add Net::FTP#mlst and Net::FTP#mlsd.
+
+Fri Sep 18 07:39:22 2015 Aaron Patterson <tenderlove@ruby-lang.org>
+
+ * ext/objspace/objspace_dump.c (obj_type): add IMEMO types to the heap
+ dump information.
+
+Thu Sep 17 22:33:07 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * common.mk: fix command error with outside builddir.
+
+Thu Sep 17 17:42:09 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * common.mk: separated test for test-framework from test-all task.
+ They should be invoke at first before tests of test-all.
+
+Thu Sep 17 12:05:54 2015 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * test/ruby/test_dir.rb (TestDir#test_fileno): s/?x/"x"/. Don't
+ use tricky code, please.
+
+Wed Sep 16 20:49:56 2015 Masaki Suketa <masaki.suketa@nifty.ne.jp>
+
+ * encindex.h: fix typo of last #endif comment. [ci skip]
+
+Wed Sep 16 20:39:26 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * variable.c (set_const_visibility): fail if the class/module is
+ frozen. [ruby-core:70828] [Bug #11532]
+
+Wed Sep 16 17:16:43 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_core.h (ENABLE_VM_OBJSPACE): enable per-VM object space on
+ Windows by default, as rb_w32_sysinit() no longer depends on
+ ruby_xmalloc.
+
+Wed Sep 16 15:08:17 2015 Akinori MUSHA <knu@iDaemons.org>
+
+ * doc/syntax/literals.rdoc (Strings): [DOC] Revise the character
+ literal part.
+
+Wed Sep 16 14:55:33 2015 Akinori MUSHA <knu@iDaemons.org>
+
+ * doc/syntax/literals.rdoc (Strings): [DOC] Document the full list
+ of supported escape sequences in string literals.
+
+Wed Sep 16 14:49:58 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * string.c (rb_str_setbyte): keep the code range as possible.
+
+Wed Sep 16 13:23:48 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * doc/syntax/literals.rdoc (Strings): mention about ?a literal.
+
+Wed Sep 16 12:06:53 2015 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * dir.c (glob_helper): check pathtype once again by lstat(2) if
+ dp->d_type is DT_UNKNOWN. XFS may return DT_UNKNOWN.
+
+Wed Sep 16 03:49:19 2015 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * test/ruby/test_thread.rb (TestThread#test_mutex_synchronize):
+ insert waste loop for invoking preemptive thread context switch.
+ [Bug #11496]
+
+Tue Sep 15 19:38:55 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * gc.c (rb_objspace_alloc, rb_objspace_free): define always
+ regardless ENABLE_VM_OBJSPACE, and free heap pages.
+
+Tue Sep 15 15:15:41 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * win32/win32.c (rb_w32_sysinit, rb_w32_readdir): compare by
+ encoding index to get rid of encoding initialization before VM
+ object space allocation.
+
+ * dir.c (fundamental_encoding_p, push_glob): compare by encoding
+ index immediately.
+
+ * enc/{ascii,us_ascii,utf_8}.c: set encoding indexes of
+ fundamental built-in encodings so that usable as well as
+ allocated rb_encoding before rb_enc_init().
+
+ * encindex.h: separate encoding index constants from internal.h.
+
+Tue Sep 15 13:13:13 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * array.c (rb_ary_sort_bang, rb_ary_sort): [DOC] correct block
+ return values, which may be a negative or positive integer, not
+ only -1 or +1.
+
+Tue Sep 15 12:49:10 2015 Jason Barnabe <jason.barnabe@gmail.com>
+
+ * array.c (rb_ary_sort_bang, rb_ary_sort): [DOC] Correct
+ description of array sort block return values. And also fix up
+ the grammar a bit. [Fix GH-1020]
+
+Tue Sep 15 12:44:32 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * util.c (ruby_qsort): use BSD-style qsort_r if available.
+
+Mon Sep 14 19:26:34 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * lib/net/ftp.rb (parse_mlsx_entry): parse pathnames including
+ space correctly.
+
+Mon Sep 14 11:12:10 2015 Anton Davydov <antondavydov.o@gmail.com>
+
+ * lib/racc/rdoc/grammar.en.rdoc: [DOC] fix typo, "convertion" to
+ "conversion". [Fix GH-1016]
+
+Sun Sep 13 11:03:13 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * include/ruby/ruby.h: prefix RUBY or RB to global symbols to get
+ rid of name conflicts with other headers.
+
+ * include/ruby/encoding.h, include/ruby/intern.h: ditto.
+
+Sun Sep 13 09:38:51 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * lib/net/ftp.rb (size, modify, create, type, unique, perm, lang,
+ media_type, charset): new methods to return standard facts.
+
+Sat Sep 12 19:43:49 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_insnhelper.c (vm_call_iseq_setup_normal): do not clear local
+ variables here. vm_push_frame() clears.
+
+ * vm_insnhelper.c (vm_call_iseq_setup_tailcall): ditto.
+
+ * vm_insnhelper.c (vm_push_frame): move check code to
+ vm_check_frame().
+
+ Reorder initialization timing to reuse same values (sp).
+
+ * compile.c (rb_iseq_compile_node): use
+ iseq_set_exception_local_table() for ISEQ_TYPE_DEFINED_GUARD.
+
+Sat Sep 12 23:06:51 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * lib/net/ftp.rb (file?, directory?, appendable?, creatable?,
+ deletable?, enterable?, renamable?, listable?, directory_makable?,
+ purgeable?, readable?, writable?): new methods.
+
+Sat Sep 12 21:27:22 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * lib/net/ftp.rb (FACT_PARSERS): support system dependent facts
+ UNIX.mode, UNIX.owner, UNIX.group, UNIX.ctime, and UNIX.atime.
+
+Sat Sep 12 19:08:58 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * win32/win32.c (rb_w32_dup2): should return the new fd on
+ success, while msvcrt returns 0 wrongly.
+
+Sat Sep 12 18:14:11 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * lib/net/ftp.rb (parse_mlsx_entry, mlst) raise an FTPProtoError
+ when parsing failed.
+
+Sat Sep 12 18:00:35 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * lib/net/ftp.rb (TIME_PARSER): use "Z" instead of "+00:00" to
+ get UTC time. Thanks, Wilson Bilkovich.
+
+Sat Sep 12 17:55:24 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * lib/net/ftp.rb (mlst, mlsd): support new commands MLST and MLSD
+ specified in RFC 3659.
+
+Sat Sep 12 16:14:31 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * file.c: access()/eaccess() wrapping methods check more than just uid.
+ [fix GH-1007][ci skip] Patch by @eam
+
+Sat Sep 12 16:07:01 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * README.md: improve markdown rendering for readability.
+ [fix GH-1015][ci skip] Patch by @Matrixbirds
+
+Sat Sep 12 14:30:03 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * process.c (save_redirect_fd): make saved FDs close-on-exec not
+ to be inherited.
+
+ * process.c (run_exec_dup2): restore close-on-exec flags too.
+
+ * win32/win32.c (fcntl): implement F_GETFD, F_SETFD, and
+ F_DUPFD_CLOEXEC.
+
+Sat Sep 12 05:35:24 2015 Eric Wong <e@80x24.org>
+
+ * rational.c (string_to_r_strict): preserve encoding in exception
+
+Fri Sep 11 20:23:35 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_core.h: remove rb_call_info_t::aux.opt_pc.
+
+ * vm_insnhelper.c: introduce shortcut functions for opt_pc == 0
+ because opt_pc is always 0 on shortcut function.
+
+Fri Sep 11 17:49:36 2015 Koichi Sasada <ko1@atdot.net>
+
+ * iseq.c: disable ISeq.load. It enabled accidentally at r51794.
+
+Fri Sep 11 11:15:12 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * lib/net/ftp.rb (size, mdtm, system): parse responses according to
+ RFC 959 and 3659, where reply codes must be followed by SP.
+
+ * lib/net/ftp.rb (system): remove LF from the return value.
+
+Thu Sep 10 22:48:49 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (literal_concat_gen, evstr2dstr_gen): keep literal
+ encoding beginning with an interpolation same as the source file
+ encoding. [ruby-core:70703] [Bug #11519]
+
+Thu Sep 10 22:15:51 2015 Joe Rafaniello <jrafanie@redhat.com>
+
+ * process.c (rb_f_spawn): Be more specific regarding "other
+ values" by having "non-zero positive integers" Add nil, the
+ default value, as a possible value and what it means.
+
+ Try to use more consistent language.
+ [Fix GH-1008]
+
+Thu Sep 10 15:16:02 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * lib/net/ftp.rb (getmultiline): refactor.
+
+Thu Sep 10 12:17:28 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * compile.c (iseq_build_from_ary_body): register cdhash to the
+ iseq constant body instead of compile time mark array, not to
+ get GCed. [ruby-core:70708] [Feature #8543]
+
+Wed Sep 9 18:16:14 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * lib/rubygems/stub_specification.rb (Gem::StubSpecification#data):
+ should not change the value of $. when `require`ing gems.
+ this fixed test failures introduced by r51813.
+
+Wed Sep 9 16:55:45 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * ruby.c (usage, enable_option, disable_option, process_options): new
+ option `--disable-did_you_mean`.
+
+ * gem_prelude.rb: now requires did_you_mean gem by default if available.
+
+Wed Sep 9 13:38:56 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * tool/extlibs.rb (do_patch): let "patch" command change the
+ working directory and open the patch file there, instead of
+ spawn options, so that proper error message will be shown by the
+ command not just "chdir" or "open".
+
+Wed Sep 9 11:33:05 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * common.mk (update-gems): use BASERUBY instead of RUNRUBY.
+
+Wed Sep 9 11:08:59 2015 Zachary Scott <zzak@ruby-lang.org>
+
+ * lib/delegate.rb: Remove backtrace cleaning for delegated methods
+ This patch was provided by Rafael Franca and greatly improves
+ performance when an exception is raised. [Bug #11461]
+
+Wed Sep 9 10:05:41 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * test/rubygems/test_config.rb: fix broken tests for Windows platform.
+
+Wed Sep 9 07:46:32 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * lib/rubygems: Update to RubyGems HEAD(fe61e4c112).
+ this version contains new feature that warn invalid SPDX license
+ identifiers. https://github.com/rubygems/rubygems/pull/1249
+ and #1032, #1023, #1332, #1328, #1306, #1321, #1324
+ * test/rubygems: ditto.
+
+Tue Sep 8 23:17:36 2015 Yuki Nishijima <mail@yukinishijima.net>
+
+ * gems/bundled_gems: Upgrade the did_you_mean gem to 1.0.0.beta2.
+
+Tue Sep 8 23:09:28 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * io.c (rb_io_s_popen): do not wait the child process during being
+ killed. [ruby-core:70671] [Bug #11510]
+
+Tue Sep 8 22:18:04 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * gems/bundled_gems: revert because ruby trunk never be able to install
+ the did_you_mean gem. retry after enough test.
+
+Tue Sep 8 21:48:22 2015 Yuki Nishijima <mail@yukinishijima.net>
+
+ * gems/bundled_gems: Automatically install the did_you_mean gem
+ as a bundled gem. [Feature #11252]
+
+Tue Sep 8 17:17:48 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_core.h: remove rb_call_info_t::blockiseq.
+
+ * insns.def (send, invokesuper): pass blockiseq explicitly.
+
+ * compile.c: catch up this fix.
+
+ * iseq.c: ditto.
+
+ * vm_args.c: ditto.
+
+ * iseq.c (ISEQ_MINOR_VERSION): 2->3 because instruction spec was
+ changed.
+
+Tue Sep 8 15:01:19 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * lib/net/ftp.rb (list): fetch all the lines before yielding a block
+ to allow other commands in the block. [Feature #11454]
+ Patched by Srikanth Shreenivas.
+
+Tue Sep 8 12:05:00 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * win32/win32.c (rb_w32_read_reparse_point): return correct required
+ buffer size for IO_REPARSE_TAG_MOUNT_POINT.
+
+Tue Sep 8 00:14:43 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * process.c (rb_execarg_parent_start1): raise with the target path
+ name when open() failed.
+
+Mon Sep 7 23:45:28 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * process.c (rb_exec_fail): raise with the target directory name
+ when chdir() failed. pointed out by sorah.
+
+Mon Sep 7 22:05:28 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * win32/win32.c (insert): should use plain strdup() instead of
+ ruby_strdup() at startup time, and plain free()ed in cmdglob().
+
+Mon Sep 7 16:49:30 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_core.h (rb_vm_struct): define objspace always regardless
+ ENABLE_VM_OBJSPACE.
+
+Mon Sep 7 15:54:58 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ruby_atomic.h (ATOMIC_VALUE_CAS): fix typo.
+ TODO: make arguments of all CAS macros consistent.
+
+Sun Sep 6 16:07:22 2015 Eric Wong <e@80x24.org>
+
+ * ccan/list/list.h: suppress unused argument warnings
+ [ccan commit 6aaca17e07588997417a73fac19dcf0ff17ed81b]
+
+Sat Sep 5 11:39:52 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/rss/rss.rb (Time#w3cdtf): fix zero-trimmed width of fraction
+ digits. [ruby-core:70667] [Bug #11509]
+
+Sat Sep 5 08:28:58 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * hash.c (rb_hash_equal, rb_hash_eql): [DOC] the orders of each
+ hashes are not compared. [Bug #11508]
+
+Fri Sep 4 23:26:22 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * include/ruby/win32.h: fix macro name for VC runtime version,
+ RT_VER is only in Makefile.
+
+Fri Sep 4 17:46:17 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * doc/contributing.rdoc: fix configuration option.
+ [ci skip] [fix GH-1009]
+
+Fri Sep 4 04:46:54 2015 Koichi Sasada <ko1@atdot.net>
+
+ * iseq.c (iseq_memsize): functions for wrapper object should have
+ iseqw_ prefix.
+
+Thu Sep 3 21:12:12 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/cgi/session.rb (create_new_id): use SHA512 instead of MD5.
+ pointed out by SARWAR JAHAN.
+
+Thu Sep 3 20:29:18 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (rb_raw_obj_info): iseq->body->location.first_lineno is Fixnum.
+
+Thu Sep 3 17:54:26 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_eval.c (raise_method_missing): "names" should be singular.
+ pointed out by Filip Bartuzi.
+
+Thu Sep 3 17:50:09 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (rb_raw_obj_info): should support IMEMO/iseq.
+
+Thu Sep 3 10:07:49 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_eval.c (raise_method_missing): refine error messages when a
+ symbol is not given. [Fix GH-1013]
+
+Wed Sep 2 18:49:55 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * ext/psych/*: merge psych master(8737e5b). It contains following fixes.
+ https://github.com/tenderlove/psych/pull/242
+ https://github.com/tenderlove/psych/pull/246 [ruby-list:50219]
+ * test/psych/*: ditto.
+
+Wed Sep 2 18:04:13 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_insnhelper.h (GET_PC_COUNT): remove unused macro.
+
+Wed Sep 2 17:18:37 2015 Chris Schneider <chris@christopher-schneider.com>
+
+ * process.c (proc_detach): [DOC] fix typo "intent" as "intend" in
+ rdoc. [Fix GH-1011]
+
+Wed Sep 2 16:58:21 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * file.c (rb_realpath_internal): use filesystem encoding if the
+ argument is in ASCII encodings.
+
+ * win32/file.c (rb_readlink): needs the result encoding.
+
+Tue Sep 1 18:37:15 2015 Koichi Sasada <ko1@atdot.net>
+
+ * test/thread/test_queue.rb: catch up last commit.
+
+Tue Sep 1 18:16:32 2015 Koichi Sasada <ko1@atdot.net>
+
+ * thread_sync.c (queue_do_close): ignore multiple close to allow
+ multiple producers.
+ https://bugs.ruby-lang.org/issues/10600#note-14
+
+Tue Sep 1 18:06:26 2015 Koichi Sasada <ko1@atdot.net>
+
+ * thread_tools.c: rename thread_tools.c to thread_sync.c.
+
+Mon Aug 31 17:04:45 2015 Koichi Sasada <ko1@atdot.net>
+
+ * class.c (move_refined_method): should insert a write barrier
+ from an original class to a created (cloned) method entry.
+
+ * test/ruby/test_refinement.rb: add a test.
+
+Sun Aug 30 02:42:22 2015 Aaron Patterson <tenderlove@ruby-lang.org>
+
+ * ext/openssl/ossl_ssl.c (ossl_ssl_method_tab): Only add SSLv3 support
+ if the SSL library supports it. Thanks Kurt Roeckx <kurt@roeckx.be>
+ [Bug #11376]
+
+ * ext/openssl/extconf.rb: check for SSLv3 support in the SSL
+ implementation.
+
+ * test/openssl/test_ssl.rb (class OpenSSL): Skip tests that need SSLv3
+ if there is no support.
+
+Fri Aug 28 16:05:09 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * lib/rdoc/*: Update rdoc master(cfffed5)
+ https://github.com/rdoc/rdoc/pull/337
+ https://github.com/rdoc/rdoc/pull/367
+
+Fri Aug 28 10:16:20 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm.c (hook_before_rewind): prevent kicking :return event while
+ finishing vm_exec func because invoke_block_from_c() kick a :return
+ event for bmethods.
+ [Bug #11492]
+
+ * test/ruby/test_settracefunc.rb: add a test.
+
+Thu Aug 27 18:05:42 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * lib/webrick/server.rb: use IO::NULL instead of '/dev/null'
+ * test/ruby/test_string.rb: ditto.
+
+Thu Aug 27 15:24:57 2015 Koichi Sasada <ko1@atdot.net>
+
+ * compile.c (iseq_set_sequence): rename variable names
+ to make it readable.
+
+Thu Aug 27 07:45:34 2015 Koichi Sasada <ko1@atdot.net>
+
+ * thread_tools.c: add Queue#close(exception=false) and
+ SizedQueue#close(exception=false).
+ [Feature #10600]
+
+ Trying to deq from a closed empty queue return nil
+ if exception parameter equals to false (default).
+
+ If exception parameter is truthy, it raises
+ ClosedQueueError (< StopIteration).
+ ClosedQueueError inherits StopIteration so that you can write:
+
+ loop{ e = q.deq; (using e) }
+
+ Trying to close a closed queue raises ClosedQueueError.
+
+ Blocking threads to wait deq for Queue and SizedQueue will be
+ restarted immediately by returning nil (exception=false) or
+ raising a ClosedQueueError (exception=true).
+
+ Blocking threads to wait enq for SizedQueue will be
+ restarted by raising a ClosedQueueError immediately.
+
+ The above specification is not proposed specification, so that
+ we need to continue discussion to conclude specification this
+ method.
+
+ * test/thread/test_queue.rb: add tests originally written by
+ John Anderson and modify detailed behavior.
+
+Wed Aug 26 10:52:02 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * re.c (rb_memsearch_wchar, rb_memsearch_qchar): test matching
+ till the end of string. [ruby-core:70592] [Bug #11488]
+
+ * test/ruby/test_m17n.rb (test_include?, test_index): add tests by
+ Tom Stuart.
+
+Wed Aug 26 09:26:00 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * id_table.c (list_table_extend, hash_table_extend): remove C99
+ features. [ruby-dev:49239] [Bug #11487]
+
+Tue Aug 25 06:34:43 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * win32/win32.c (w32_symlink): implement symlink().
+
+Mon Aug 24 16:01:19 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * encoding.c (rb_locale_encindex): find encoding index without
+ making a string object every time. [ruby-core:58160] [Bug #9080]
+
+Sat Aug 22 15:43:12 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_eval.c (check_funcall_failed, check_funcall_missing): cache
+ results of respond_to? and respond_to_missing?, and search a
+ public method only for compatibility with rb_respond_to.
+
+Sat Aug 22 08:23:32 2015 Koichi Sasada <ko1@atdot.net>
+
+ * ext/thread/thread.c: move definitions of Queue, SizedQueue
+ and ConditionalVariables to thread_tools.c. In other words,
+ such classes are built-in.
+ [Feature #8919]
+
+ At first, I planned to embed only a Queue class.
+ However, rubygems requires 'thread.rb' (rubygems are
+ required at first, when launch MRI without --disable-gems).
+ So most of people require 'thread.rb' as an embedded library.
+
+ Now, ext/thread/thread.c is empty, only for a dummy for
+ compatibility.
+
+ * thread.c: move a definition of Mutex class to thread_tools.c.
+
+ And define Mutex class under Thread (so now Mutex is Thread::Mutex).
+ Because other thread related classes are also defined under Thread.
+ We remain ::Mutex as Thread::Mutex. Only an inspect result is changed.
+
+ * common.mk: add dependency from thread.o to thread_tools.c.
+
+Sat Aug 22 05:31:37 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_opts.h, iseq.c, iseq.h: add compile option to force frozen
+ string literals.
+ [Feature #11473]
+
+ This addition is not specification change, but to try frozen
+ string literal world discussed on [Feature #11473].
+
+ You can try frozen string literal world using this magical line:
+
+ RubyVM::InstructionSequence.compile_option =
+ {frozen_string_literal: true}
+
+ Note that this is a global compilation option, so that you need to
+ compile another script like that:
+
+ p 'foo'.frozen? #=> false
+ RubyVM::InstructionSequence.compile_option =
+ {frozen_string_literal: true}
+ p 'foo'.frozen? #=> false, because this line is already compiled.
+ p eval("'foo'.frozen?") #=> true
+
+ Details:
+ * String literals are deduped by rb_fstring().
+ * Dynamic string literals ("...#{xyz}...") is now only frozen,
+ not deduped. Maybe you have other ideas.
+
+ Now, please do not use this option on your productions :)
+ Of course, current specification can be changed.
+
+ * compile.c: ditto.
+
+ * test/ruby/test_iseq.rb: add a test.
+
+Sat Aug 22 02:53:12 2015 Aaron Patterson <tenderlove@ruby-lang.org>
+
+ * ext/psych/*: update to Psych 2.0.14
+
+ * test/psych/*: ditto
+
+Fri Aug 21 19:58:48 2015 Koichi Sasada <ko1@atdot.net>
+
+ * ext/objspace/objspace.c: add a new method ObjectSpace.count_symbols.
+ [Feature #11158]
+
+ * symbol.c (rb_sym_immortal_count): added to count immortal symbols.
+
+ * symbol.h: ditto.
+
+ * test/objspace/test_objspace.rb: add a test for this method.
+
+ * NEWS: describe about this method.
+
+Fri Aug 21 19:48:17 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * win32/Makefile.sub ($(LIBRUBY_SO)): needs additional libraries
+ for extension libraries to link statically.
+ [ruby-core:70499] [Feature #9018]
+
+Fri Aug 21 18:49:22 2015 Koichi Sasada <ko1@atdot.net>
+
+ * include/ruby/ruby.h, cont.c, vm_trace.c: add a new event
+ fiber_switch. We need more discussion about this feature
+ so that I don't write it on NEWS.
+ [Feature #11348]
+
+ * test/ruby/test_settracefunc.rb: add tests.
+
+Fri Aug 21 17:32:42 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_insnhelper.c (vm_invoke_block): we should not expect ci->argc is
+ stable after invoking a block. [Bug #11451]
+
+ * test/ruby/test_yield.rb: add a test. This test script is given by
+ Alex Dowad.
+
+Fri Aug 21 06:35:50 2015 Aaron Patterson <tenderlove@ruby-lang.org>
+
+ * test/openssl/test_ssl_session.rb: Fix tests so that they take in to
+ account OpenSSL installations that have SSLv3 disabled by default.
+ Thanks Jeremy Evans <code@jeremyevans.net> for the patches.
+ [Bug #11366] [Bug #11367]
+
+Thu Aug 20 22:19:17 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_method.c (basic_obj_respond_to): call respond_to_missing?
+ only when redefined. [ruby-core:70460] [Bug #11465]
+
+Thu Aug 20 14:13:27 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_eval.c (check_funcall_respond_to): share the behavior with
+ rb_obj_respond_to. [ruby-core:70460] [Bug #11465]
+
+ * vm_method.c (vm_respond_to): extract from rb_obj_respond_to and
+ merge r39881.
+
+Thu Aug 20 08:53:09 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_method.c (rb_obj_respond_to): reuse found method entry
+ instead of searching same entry repeatedly.
+
+Thu Aug 20 08:31:17 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * dir.c (replace_real_basename), win32/win32.c (opendir_internal):
+ check reparse point tags and treat supported tags only as
+ symbolic links. [ruby-core:70454] [Bug #11462]
+
+Wed Aug 19 23:59:28 2015 Aaron Patterson <tenderlove@ruby-lang.org>
+
+ * ext/openssl/lib/openssl/ssl.rb (module OpenSSL): add OP_ALL to
+ existing options rather than just setting it. Some vendors apply
+ custom patches to their versions of OpenSSL that set default values
+ for options. This commit respects the custom patches they've
+ applied.
+
+ * test/openssl/test_ssl.rb (class OpenSSL): check that OP_ALL has been
+ added to the options.
+
+Wed Aug 19 23:55:29 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * process.c (rb_f_spawn): [DOC] elaborate environment variable
+ values. [ruby-core:70456] [Bug #11463]
+
+Wed Aug 19 23:48:06 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * win32/win32.c (winnt_lstat): check reparse point tags and treat
+ supported tags only as symbolic links.
+ [ruby-core:70454] [Bug #11462]
+
+Tue Aug 18 20:05:49 2015 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * thread_pthread.c (reserve_stack): ensure the memory is really
+ allocated. [Bug #11457]
+
+Tue Aug 18 17:19:21 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (IS_BEG): include labeled argument state, which was
+ EXPR_LABELARG. [ruby-dev:49221] [Bug #11456]
+
+Tue Aug 18 16:16:21 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * include/ruby/ruby.h (RClass): define only in C, `__attribute__`
+ between `struct` and the name can't compile with g++.
+ [ruby-core:70297] [Bug #11426]
+
+Mon Aug 17 20:56:36 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y: fix syntax error at do-block after a conditional
+ operator. separate label-allowed and after-a-label states from
+ others as bit flags. [ruby-dev:48790] [Bug #10653]
+
+Mon Aug 17 11:57:36 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * io.c (rb_io_each_codepoint): raise an exception at incomplete
+ character before EOF when conversion takes place. [Bug #11444]
+
+Sun Aug 16 17:33:45 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * gems/bundled_gems: update latest version of bundled gems.
+ It includes minitest-5.8.0 and test-unit 3.1.3.
+
+Sun Aug 16 17:24:10 2015 Kazuki Tsujimoto <kazuki@callcc.net>
+
+ * gc.c (gc_mark_children): check if RCLASS_EXT is valid
+ before marking. This fixes the following test failure
+ introduced in r51126:
+
+ make test-all TESTOPTS='--gc-stress ruby/test_refinement.rb'
+
+Sat Aug 15 10:51:08 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/win32/lib/win32/registry.rb (API#SetValue): data size should
+ be in bytes, not in chars. [ruby-core:70365] [Bug #11439]
+
+Sat Aug 15 10:15:20 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * io.c (rb_io_each_codepoint): read more data when read partially.
+ [ruby-core:70379] [Bug #11444]
+
+Sat Aug 15 04:33:39 2015 Eric Wong <e@80x24.org>
+
+ * hash.c (any_hash): skip rb_objid_hash for static syms
+ (rb_num_hash_start): extract from rb_ident_hash
+ (rb_objid_hash): call rb_num_hash_start
+ (rb_ident_hash): ditto
+ [ruby-core:70181] [Feature #11405]
+
+Sat Aug 15 04:16:13 2015 Eric Wong <e@80x24.org>
+
+ * iseq.c (rb_iseq_mark): reduce NULL checks
+
+Fri Aug 14 18:50:57 2015 Eric Wong <e@80x24.org>
+
+ * method.h (METHOD_ENTRY_VISI_SET): cast visi to int
+ (METHOD_ENTRY_FLAGS_SET): ditto
+
+Fri Aug 14 18:43:11 2015 Eric Wong <e@80x24.org>
+
+ * process.c (close_unless_reserved): add extra check
+ (dup2_with_divert): remove
+ (redirect_dup2): use dup2 without divert
+ (before_exec_non_async_signal_safe): adjust call + comment
+ (rb_f_exec): stop timer thread for all OSes
+ (rb_exec_without_timer_thread): remove
+ * eval.c (ruby_cleanup): adjust call
+ * thread.c (rb_thread_stop_timer_thread): always close pipes
+ * thread_pthread.c (struct timer_thread_pipe): add writing field,
+ mark owner_process volatile for signal handlers
+ (rb_thread_wakeup_timer_thread_fd): check valid FD
+ (rb_thread_wakeup_timer_thread): set writing flag to prevent close
+ (rb_thread_wakeup_timer_thread_low): ditto
+ (CLOSE_INVALIDATE): new macro
+ (close_invalidate): new function
+ (close_communication_pipe): removed
+ (setup_communication_pipe_internal): make errors non-fatal
+ (setup_communication_pipe): ditto
+ (thread_timer): close reading ends inside timer thread
+ (rb_thread_create_timer_thread): make errors non-fatal
+ (native_stop_timer_thread): close write ends only, always,
+ wait for signal handlers to finish
+ (rb_divert_reserved_fd): remove
+ * thread_win32.c (native_stop_timer_thread): adjust (untested)
+ (rb_divert_reserved_fd): remove
+ * vm_core.h: adjust prototype
+ [ruby-core:70386] [Bug #11336]
+
+Fri Aug 14 18:40:43 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/win32/lib/win32/registry.rb (API#SetValue): add terminator
+ size, not 1 byte. [ruby-core:70365] [Bug #11439]
+
+Thu Aug 13 22:49:42 2015 Juanito Fatas <katehuang0320@gmail.com>
+
+ * lib/timeout.rb (Timeout#timeout): freeze a string message to
+ reduce string allocations. [Fix GH-996]
+
+Thu Aug 13 17:42:34 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_core.h (rb_call_info_kw_arg_bytes): move the definition
+ to iseq.h because this function is shared with iseq.c and compile.c.
+
+Thu Aug 13 14:36:31 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * object.c (rb_num_to_dbl): move from num2dbl_with_to_f in math.c.
+
+Thu Aug 13 09:01:25 2015 Eric Wong <e@80x24.org>
+
+ * load.c (features_index_add): avoid repeat calculation
+
+Wed Aug 12 21:57:31 2015 Koichi Sasada <ko1@atdot.net>
+
+ * id_table.c: IMPL() macro accept op as _opname instead of opname
+ because jemalloc seems to replace the word `free' to `je_free'.
+
+Wed Aug 12 21:51:11 2015 Koichi Sasada <ko1@atdot.net>
+
+ * id_table.c (mix_id_table_insert): fix memory leak.
+
+Wed Aug 12 21:17:38 2015 Eric Wong <e@80x24.org>
+
+ * iseq.c (iseq_memsize): reimplement for wrapper
+ (param_keyword_size): extracted from iseq_memsize
+ (iseqw_mark): new mark function
+ (iseqw_data_type): new data type
+ (iseqw_new): wrap as iseqw_data_type
+ (iseqw_check): adjust for wrapper
+ (Init_ISeq): remove iseqw_iseq_key initialization
+ * test/objspace/test_objspace.rb: new test
+ [ruby-core:70344] [Feature #11435]
+
+Wed Aug 12 21:15:27 2015 Eric Wong <e@80x24.org>
+
+ * vm_core.h (rb_call_info_kw_arg_bytes): extract from compile.c
+ * compile.c (iseq_build_callinfo_from_hash): use above function
+
+Wed Aug 12 18:00:17 2015 Koichi Sasada <ko1@atdot.net>
+
+ * class.c (move_refined_method): same as the last commit.
+
+Wed Aug 12 17:57:53 2015 Koichi Sasada <ko1@atdot.net>
+
+ * class.c, gc.c vm.c: use ID_TABLE_* instead of ST_*
+ (such as ST_CONTINUE) for enum rb_id_table_iterator_result.
+
+Wed Aug 12 17:05:36 2015 Koichi Sasada <ko1@atdot.net>
+
+ * id_table.h: introduce ID key table.
+ [Feature #11420]
+
+ This table only manage ID->VALUE table to reduce overhead of st.
+
+ Some functions prefixed rb_id_table_* are provided.
+
+ * id_table.c: implement rb_id_table_*.
+
+ There are several algorithms to implement it.
+
+ Now, there are roughly 4 types:
+
+ * st
+ * array
+ * hash (implemented by Yura Sokolov)
+ * mix of array and hash
+
+ The macro ID_TABLE_IMPL can choose implementation.
+ You can see detailes about them at the head of id_table.c.
+
+ At the default, I choose 34 (mix of list and hash).
+ This is not final decision.
+ Please report your suitable parameters or
+ your data structure.
+
+ * symbol.c: introduce rb_id_serial_t and rb_id_to_serial()
+ to represent ID by serial number.
+
+ * internal.h: use id_table for method tables.
+
+ * class.c, gc.c, marshal.c, vm.c, vm_method.c: ditto.
+
+Wed Aug 12 05:19:11 2015 Eric Wong <e@80x24.org>
+
+ * parse.y (rb_parser_compile_cstr): remove volatile arg
+ (rb_parser_compile_string): ditto
+ (rb_parser_compile_file): ditto
+ (rb_parser_compile_string_path): ditto
+ (rb_parser_compile_file_path): ditto
+ [ruby-core:70323] [Misc #11431]
+
+Tue Aug 11 22:59:57 2015 Tanaka Akira <akr@fsij.org>
+
+ * numeric.c (Init_Numeric): Fix document for Float::MIN and
+ Float::EPSILON.
+
+Tue Aug 11 15:22:31 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * include/ruby/ruby.h (ALLOCV_N): check integer overflow, as well
+ as ruby_xmalloc2. pointed out by Paul <pawlkt AT gmail.com>.
+
+Tue Aug 11 14:57:09 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * array.c (rb_ary_repeated_permutation): fix buffer size, ALLOCV_N
+ already multiplies element size.
+
+Tue Aug 11 12:13:20 2015 Jeremy Evans <merch-redmine@jeremyevans.net>
+
+ * test/openssl/test_ssl.rb: Fix LocalJumpErrors being raised
+ in OpenSSL tests. [ruby-core:70020][Bug #11368]
+
+Tue Aug 11 11:54:13 2015 Alexey Lipnyagov <liptonshmidt@gmail.com>
+
+ * string.c: Fix documentation for String#slice
+ [ruby-core:70298][Bug #11427]
+
+Tue Aug 11 11:53:28 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (superclass): make superclass rule optional and allow
+ any contents without a terminator. [EXPERIMENTAL]
+
+Tue Aug 11 10:58:42 2015 Juanito Fatas <juanitofatas@gmail.com>
+
+ * string.c: [DOC] Make #end_with? example doc symmetry
+ with #start_with? [fix GH-992][ci skip]
+
+Tue Aug 11 10:51:19 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * test/ruby/test_array.rb: Add test for `Array#flatten` with level 1
+ [fix GH-986] Patch @yui-knk
+
+Tue Aug 11 10:48:16 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * enum.c: added doc for Enumerable#zip
+ [fix GH-985] Patch by @yui-knk
+ * test/ruby/test_enum.rb: added tests for Enumerable#zip
+ [fix GH-985] Patch @yui-knk
+
+Tue Aug 11 10:33:26 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * vm_method.c: typo fix [fix GH-993][ci skip] Patch by @0x0dea
+ * test/ruby/test_refinement.rb: ditto.
+
+Sun Aug 9 14:15:54 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm.c (Init_vm_objects, rb_vm_fstring_table): use frozen_strings
+ table in rb_vm_t. [ruby-core:70274] [Bug #11423]
+
+Sat Aug 8 03:59:51 2015 Zachary Scott <zzak@ruby-lang.org>
+
+ * object.c: [DOC] Improve grammar for Module#===
+ Patch by @SkyBirdSoar in documenting-ruby/ruby#52:
+ https://github.com/documenting-ruby/ruby/pull/52
+
+Sat Aug 8 03:39:33 2015 Zachary Scott <zzak@ruby-lang.org>
+
+ * hash.c: [DOC] Improve description of symbol key syntax
+ Patch by Raphael Das Gupta in documenting-ruby/ruby#51:
+ https://github.com/documenting-ruby/ruby/pull/51
+
+Fri Aug 7 21:04:19 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (parser_params): turn in_def and in_single into bit
+ flags and reduce the size by 2-words.
+
+ * parse.y (parser_params): remove redundant prefixes.
+
+ * parse.y (yylex): non-pure parser has not been supported since
+ merger of ripper. change argument types from void pointers.
+
+Fri Aug 7 17:07:56 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * proc.c (method_super_method): uncallable method entry does not
+ have the defined class, use the owner instead.
+ [ruby-core:70254] [Bug #11419]
+
+ * test/ruby/test_method.rb (test_super_method_unbound): add test
+ by Akira Matsuda.
+
+Thu Aug 6 10:49:57 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * node.c (rb_alloc_tmp_buffer): round up the size and check the
+ range.
+
+ * ruby_atomic.h (ATOMIC_VALUE_EXCHANGE, ATOMIC_VALUE_CAS): add
+ atomic operations for VALUE.
+
+Thu Aug 6 08:15:49 2015 Aaron Patterson <tenderlove@ruby-lang.org>
+
+ * ext/openssl/lib/openssl/ssl.rb (module OpenSSL): move
+ SSLSocket#sysclose to Ruby.
+
+ * ext/openssl/ossl_ssl.c (ossl_ssl_close): ditto
+
+Thu Aug 6 07:57:21 2015 Aaron Patterson <tenderlove@ruby-lang.org>
+
+ * ext/openssl/lib/openssl/ssl.rb (module OpenSSL): move nonblock
+ enable to SSLSocket#initialize and remove Nonblock module.
+
+Thu Aug 6 07:53:47 2015 Aaron Patterson <tenderlove@ruby-lang.org>
+
+ * ext/openssl/lib/openssl/ssl.rb (module OpenSSL): move
+ OpenSSL::SSL::SSLSocket#initialize to Ruby.
+
+ * ext/openssl/ossl_ssl.c: ditto
+
+Thu Aug 6 02:25:31 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * node.c (rb_alloc_tmp_buffer): use NODE_ALLOCA to mark locations
+ like as builtin alloca. [ruby-core:70251] [Bug #11418]
+
+Wed Aug 5 14:37:55 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * transcode.c (rb_econv_open0): rb_econv_t::source_encoding_name
+ and rb_econv_t::destination_encoding_name should refer static
+ strings always or NULL. [ruby-core:70247] [Bug #11416]
+
+Tue Aug 4 16:53:43 2015 Aaron Patterson <tenderlove@ruby-lang.org>
+
+ * ext/openssl/lib/openssl/ssl.rb (module OpenSSL): extract callback
+ lookup to private Ruby methods. This means we can keep the default
+ DH callback logic hidden from consumers. Also, since the SSLSocket
+ always has a context, we can remove conditionals about that
+ instance.
+
+ * ext/openssl/ossl_ssl.c: move callback lookup methods to private Ruby
+ methods.
+
+Tue Aug 4 16:40:26 2015 Koichi Sasada <ko1@atdot.net>
+
+ * test/ruby/test_module.rb: should not expect a method table ordering.
+ [Feature #11414]
+
+Tue Aug 04 15:30:04 2015 Koichi Sasada <ko1@atdot.net>
+
+ * proc.c (rb_block_clear_env_self): clear by Qfalse instead of Qnil.
+ [Bug #11409]
+
+ * test/ruby/test_eval.rb: add tests for this issue,
+ written by @0x0dea.
+ https://github.com/ruby/ruby/pull/988
+
+Tue Aug 4 12:12:14 2015 Eric Wong <e@80x24.org>
+
+ * variable.c: wrap long lines
+
+Tue Aug 4 09:32:30 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * proc.c: Removing duplicate doc [fix GH-987][ci skip]
+ Patch by @ronakjangir47
+
+Tue Aug 4 09:21:58 2015 Richard Schneeman <richard.schneeman+foo@gmail.com>
+
+ * doc/contributing.rdoc: fixed wrong instructions with OS X
+ [fix GH-989][ci skip] Patch by @schneems
+
+Mon Aug 3 10:08:33 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * re.c (rb_memsearch): should match only char boundaries in wide
+ character encodings. [ruby-core:70220] [Bug #11413]
+
+Sun Aug 2 07:01:17 2015 Eric Wong <e@80x24.org>
+
+ * ext/openssl/lib/openssl/buffering.rb (gets):
+ avoid comparing fixnum with nil
+ * test/openssl/test_pair.rb: test gets with limit when EOF is hit
+ Thanks to Bar Hofesh <bar.hofesh@safe-t.com> for the bug report
+ and testing.
+ [ruby-core:70149] [Bug #11400]
+
+Sat Aug 1 17:13:15 2015 Kazuki Tsujimoto <kazuki@callcc.net>
+
+ * lib/net/http/response.rb (Net::HTTPResponse::Inflater#finish):
+ fix a bug that empty gzipped response body causes Zlib::BufError.
+ [ruby-core:68846] [Bug #11058]
+
+ * test/net/http/test_httpresponse.rb: tests for the above.
+
+Sat Aug 1 17:05:18 2015 Kazuki Tsujimoto <kazuki@callcc.net>
+
+ * lib/net/http/response.rb (Net::HTTPResponse#inflater):
+ fix TypeError. An exception object might be nil.
+ [ruby-core:68846] [Bug #11058]
+
+Sat Aug 1 09:09:46 2015 Aaron Patterson <tenderlove@ruby-lang.org>
+
+ * ext/openssl/ossl_ssl.c (ossl_sslctx_setup): Implement
+ SSLContext#options and options= using SSL_CTX_set_options and
+ SSL_CTX_get_options. This reduces the number of ivars we need and
+ simplifies `ossl_sslctx_setup`.
+
+ * ext/openssl/lib/openssl/ssl.rb (module OpenSSL): Default `options`
+ to SSL_OP_ALL
+
+Sat Aug 1 06:54:36 2015 Aaron Patterson <tenderlove@ruby-lang.org>
+
+ * ext/openssl/ossl_ssl.c (Init_ossl_ssl): OpenSSL declares these
+ constants as longs, so we should follow that and use LONG2NUM.
+ http://git.io/vOqxD
+
+Sat Aug 1 04:06:29 2015 Aaron Patterson <tenderlove@ruby-lang.org>
+
+ * ext/openssl/ossl_ssl.c (ossl_call_tmp_dh_callback): change callback
+ to return the Ruby dh (or ecdh) object that the caller cares about
+ instead of doing rb_iv_get / set to communicate. This means we can
+ remove an rb_iv_get call, and only use the set calls for their
+ intended purpose (to prevent the object from being GC'd).
+
+ * ext/openssl/ossl_ssl.c (ossl_tmp_dh_callback): ditto
+ * ext/openssl/ossl_ssl.c (ossl_call_tmp_ecdh_callback): ditto
+ * ext/openssl/ossl_ssl.c (ossl_tmp_ecdh_callback): ditto
+
+Sat Aug 1 03:49:31 2015 Aaron Patterson <tenderlove@ruby-lang.org>
+
+ * ext/openssl/ossl_ssl.c (ossl_call_tmp_dh_callback): Similarly to the
+ tmp_ecdh_callback, the SSLSocket instance always holds a reference
+ to the SSLContext object (it's always set in `initialize`). The
+ SSLContext holds a reference to the tmp_dh_callback. Ask the
+ context for the callback instead of storing the callback in two
+ places.
+
+Sat Aug 1 03:43:10 2015 Aaron Patterson <tenderlove@ruby-lang.org>
+
+ * ext/openssl/ossl_ssl.c (ossl_call_tmp_dh_callback): create an array
+ and use `rb_apply` to clean up calls to `rb_protect`.
+
+ * ext/openssl/ossl_ssl.c (ossl_tmp_dh_callback): ditto
+
+Sat Aug 1 03:27:12 2015 Aaron Patterson <tenderlove@ruby-lang.org>
+
+ * ext/openssl/ossl_ssl.c (ossl_call_tmp_ecdh_callback): The SSL socket
+ always holds a reference to the SSLContext object, which will have
+ the callback object. Ask the context for the callback instead of
+ storing the callback in two places.
+
+Sat Aug 1 03:14:07 2015 Aaron Patterson <tenderlove@ruby-lang.org>
+
+ * ext/openssl/lib/openssl/ssl.rb (module OpenSSL): convert
+ `tmp_dh_callback` to Ruby, and call it when setting up an SSL
+ connection. This allows us to move the "default" behavior to the
+ reader method.
+
+ * ext/openssl/ossl_ssl.c: call the tmp_dh_callback instead of
+ accessing the SSLContext's internals.
+
+Fri Jul 31 23:34:27 2015 Aaron Patterson <tenderlove@ruby-lang.org>
+
+ * .travis.yml: update libssl before running tests.
+ Thanks to Chris Sinjakli <chris@sinjakli.co.uk> for figuring out the
+ travis settings!
+
+Fri Jul 31 21:34:49 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * load.c (rb_require_internal): use rb_load_internal0 not to raise
+ a exception to be caught.
+
+Thu Jul 30 13:19:54 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * variable.c (rb_const_get_0): warn deprecated constant reference.
+
+ * variable.c (rb_mod_deprecate_constant): mark constants to be
+ warned as deprecated. [Feature #11398]
+
+Thu Jul 30 11:53:54 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * thread.c (rb_thread_s_handle_interrupt): make identity hash, to
+ compare masking classes just by their IDs.
+
+Thu Jul 30 11:52:55 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * load.c (rb_load_internal0): stop separating exits at loading
+ from exits from execution. TAG_FATAL is the only case that
+ `errinfo` is a Fixnum, and should continue to exit by JUMP_TAG
+ but not raising as an ordinary exception.
+ [ruby-core:70169] [Bug #11404]
+
+Thu Jul 30 10:42:27 2015 Alex Dowad <alexinbeijing@gmail.com>
+
+ * load.c (rb_load_internal0): extra check before returning
+ TAG_RAISE when a non-local transfer of control happens while
+ loading and parsing a Ruby source file.
+ [ruby-core:70169] [Bug #11404]
+
+Thu Jul 30 08:48:42 2015 Eric Wong <e@80x24.org>
+
+ * st.c (find_entry): constify st_table*
+ (find_packed_index_from): ditto
+ (find_packed_index): ditto
+ (get_keys): ditto
+ (get_values): ditto
+
+Thu Jul 30 04:29:25 2015 Eric Wong <e@80x24.org>
+
+ * benchmark/bm_hash_aref_dsym.rb: new benchmark
+ * benchmark/bm_hash_aref_dsym_long.rb: ditto
+ * benchmark/bm_hash_aref_fix.rb: ditto
+
+Wed Jul 29 21:38:41 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * hash.c (any_hash), symbol.c (dsymbol_alloc): fix dynamic symbol
+ hash value by restricting in Fixnum range, that is `long`.
+
+Wed Jul 29 17:25:46 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * hash.c (rb_obj_hash): move in order to share with rb_any_hash.
+
+Wed Jul 29 16:00:22 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * string.c (str_buf_cat): consider empty non-embed string case,
+ not to loop infinitely. [ruby-core:70074] [Bug #11383]
+
+Wed Jul 29 15:25:19 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_eval.c (send_internal): set method_missing_reason before
+ invoking overriding method_missing method so that the default
+ method_missing can achieve it properly.
+ [ruby-core:68515] [Bug #10969]
+
+Wed Jul 29 14:54:16 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * hash.c (rb_sym_hash): return same value as rb_any_hash() of
+ Symbol. [Bug #9381]
+
+ * hash.c (rb_any_hash): fix Float hash. rb_dbl_hash() returns a
+ Fixnum, but not a long. [Bug #9381]
+
+Wed Jul 29 11:07:10 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * internal.h (LIKELY, UNLIKELY): make a boolean to enforce 1 or 0.
+
+Wed Jul 29 10:44:43 2015 Alex Dowad <alexinbeijing@gmail.com>
+
+ * gc.c: document argument passed to finalizer proc.
+ [fix GH-976][ci skip] Patch by @alexdowad
+
+Wed Jul 29 10:36:58 2015 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * io.c (rb_io_extract_modeenc): add option parameter `flags'
+ to append extra oflags to normal mode.
+ [Feature #11253] [ruby-core:69539]
+
+Wed Jul 29 04:54:47 2015 Eric Wong <e@80x24.org>
+
+ * test/rubygems/test_gem_remote_fetcher.rb: pre-generate test key
+ [ruby-core:70151] [Bug #11397]
+
+Tue Jul 28 10:32:09 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * internal.h (struct RClass): moved from ruby/ruby.h to hide the
+ internals.
+
+Tue Jul 28 08:48:29 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in (RUBY_TYPE_ATTRIBUTE): attribute declaration for
+ types.
+
+Tue Jul 28 07:23:03 2015 Eric Wong <e@80x24.org>
+
+ * symbol.h (struct RSymbol): add hashval field
+ * symbol.c (dsymbol_alloc): setup hashval field once
+ * hash.c (rb_any_hash): return RSymbol->hashval directly
+ * common.mk: hash.o depends on symbol.h
+ Thanks to Bruno Escherl <bruno@escherl.net> for the bug report
+ [ruby-core:70129] [Bug #11396]
+
+Tue Jul 28 03:26:15 2015 Aaron Patterson <tenderlove@ruby-lang.org>
+
+ * ext/openssl/lib/openssl/ssl.rb (module OpenSSL): raise a more
+ helpful exception when verifying the peer connection and an
+ anonymous cipher has been selected. [ruby-core:68330] [Bug #10910]
+ Thanks to Chris Sinjakli <chris@sinjakli.co.uk> for the patch.
+
+ * test/openssl/test_ssl.rb (class OpenSSL): test for change
+
+Mon Jul 27 13:24:11 2015 Koichi Sasada <ko1@atdot.net>
+
+ * template/id.h.tmpl (ID2ATTRSET): remove an unused macro.
+
+Mon Jul 27 12:21:15 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * test/openssl/test_ssl.rb: run tests on non-Unix platforms.
+
+Sun Jul 26 19:21:31 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/openssl/ossl_ssl.c (ossl_ssl_alpn_protocol): fix condition
+ to compile, needs ALPN to be available. [Feature #9390]
+
+Sun Jul 26 11:29:01 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * signal.c (default_handler, Init_signal): discard SIGSYS, ENOSYS
+ should raise a SystemCallError always instead.
+
+Sun Jul 26 10:26:35 2015 Aaron Patterson <tenderlove@ruby-lang.org>
+
+ * ext/openssl/ossl_ssl.c (ossl_call_servername_cb): set the ssl context
+ object returned by the servername callback on to the socket as an
+ instance variable. If the callback allocated a new context object
+ and didn't keep a reference to it, it could be GC'd out from under
+ the socket object.
+
+ * test/openssl/test_ssl.rb (class OpenSSL): test for change.
+
+Sun Jul 26 10:07:26 2015 Aaron Patterson <tenderlove@ruby-lang.org>
+
+ * test/openssl/test_ssl.rb (class OpenSSL): add test coverage around
+ OpenSSL::SSL::SSLContext#servername_cb
+
+Sun Jul 26 09:10:32 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * gems/bundled_gems: update latest version of bundled power_assert.
+
+Sun Jul 26 08:49:28 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * test/rubygems/test_gem_remote_fetcher.rb: backport rubygems upstream
+ change for OpenSSL key length. see detail to
+ https://github.com/rubygems/rubygems/pull/1290
+
+Sun Jul 26 08:33:03 2015 Aaron Patterson <tenderlove@ruby-lang.org>
+
+ * ext/openssl/lib/openssl/pkey.rb: implement DEFAULT_512 and
+ DEFAULT_1024 constants in Ruby.
+
+ * ext/openssl/lib/openssl/ssl.rb (module OpenSSL): Ask PKey for the
+ default DH callback since it already must check whether openssl has
+ been compiled with DH support.
+
+ * ext/openssl/ossl_pkey_dh.c (OSSL_PKEY_BN): Remove C definitions of
+ DEFAULT_512 and DEFAULT_1024
+
+ * ext/openssl/ossl_pkey_dh.c (Init_ossl_dh): ditto
+
+ * test/openssl/test_pkey_dh.rb (class OpenSSL): add test to ensure the
+ Ruby definitions are the same as the C definitions were.
+
+Sun Jul 26 08:14:59 2015 Aaron Patterson <tenderlove@ruby-lang.org>
+
+ * ext/openssl/lib/openssl/ssl.rb (module OpenSSL): support
+ specifically setting the tmp_dh_callback to nil.
+
+ * ext/openssl/ossl_ssl.c (Init_ossl_ssl): ditto
+
+ * test/openssl/test_pair.rb (module OpenSSL): add a test
+
+Sun Jul 26 07:47:14 2015 Aaron Patterson <tenderlove@ruby-lang.org>
+
+ * ext/openssl/lib/openssl/ssl.rb (module OpenSSL): move the default
+ tmp_dh_callback Ruby code and set it as a default in `initialize`.
+
+ * ext/openssl/ossl_pkey_dh.c (static unsigned char DEFAULT_DH_512_GEN):
+ move this constant to Ruby.
+
+ * ext/openssl/ossl_pkey_dh.c (static unsigned char DEFAULT_DH_1024_GEN):
+ ditto
+
+ * ext/openssl/ossl_pkey_dh.c (Init_ossl_dh): ditto
+
+ * ext/openssl/ossl_ssl.c (ossl_tmp_dh_callback): ditto
+
+ * ext/openssl/ossl_ssl.c (ossl_sslctx_setup): tmp_dh_callback should
+ always be set, so we can remove this conditional
+
+Sun Jul 26 06:22:24 2015 Aaron Patterson <tenderlove@ruby-lang.org>
+
+ * test/openssl/test_pair.rb: add a test ensuring that the default DH
+ callback is used when no DH callback is specified.
+
+Sun Jul 26 04:08:27 2015 Aaron Patterson <tenderlove@ruby-lang.org>
+
+ * ext/openssl/lib/openssl/ssl.rb (module OpenSSL): add missing
+ instance variables to squash warnings with alpn.
+
+Sun Jul 26 03:42:19 2015 Aaron Patterson <tenderlove@ruby-lang.org>
+
+ * ext/openssl/lib/openssl/ssl.rb (module OpenSSL): move
+ OpenSSL::SSL::SSLContext#initialize implementation to pure Ruby.
+
+ * ext/openssl/ossl_ssl.c (ossl_sslctx_initialize): ditto
+
+ * ext/openssl/ossl_ssl.c (Init_ossl_ssl): ditto
+
+Sat Jul 25 21:03:45 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * random.c (fill_random_bytes_syscall): get rid of blocking when
+ no entropy is available. based on the patch by mame in
+ [ruby-core:70114]. [Bug #11395]
+
+Sat Jul 25 11:05:31 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * string.c (str_replace_shared_without_enc): fill the terminator
+ of embedded strings in wide char encodings.
+
+Sat Jul 25 06:38:36 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_core.h: size should be unsigned.
+ * rb_call_info_t::index
+ * rb_iseq_constant_body::stack_max
+ * rb_iseq_constant_body::local_size
+ * rb_iseq_constant_body::param::size
+ * rb_iseq_constant_body::local_table_size
+ * rb_iseq_constant_body::is_size
+ * rb_iseq_constant_body::callinfo_size
+
+ * iseq.h: same for iseq_catch_table::size.
+
+ * compile.c: catch up these fix.
+
+ * iseq.c: ditto.
+
+ * proc.c: ditto.
+
+ * vm.c: ditto.
+
+ * vm_args.c: ditto.
+
+ * vm_eval.c: ditto.
+
+ * vm_insnhelper.c: ditto.
+
+Sat Jul 25 06:00:09 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_core.h: constify rb_iseq_constant_body::line_info_table.
+
+ * iseq.c: catch up this fix.
+
+Sat Jul 25 05:56:43 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_core.h: constify rb_iseq_constant_body::param::opt_table and
+ rb_iseq_constant_body::param::keyword.
+
+ * compile.c: catch up this fix.
+
+Sat Jul 25 04:47:01 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_core.h: constify rb_iseq_constant_body::catch_table.
+
+ * compile.c (iseq_set_exception_table): catch up this fix.
+
+ * iseq.c: ditto.
+
+ * vm.c (vm_exec): ditto.
+
+Fri Jul 24 21:29:54 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * st.c (EQUAL, st_delete_safe): fix arguments order to compare
+ function, searching key is the first and stored key is the
+ second always.
+
+Fri Jul 24 21:27:29 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * string.c (fstr_update_callback): fstring must not be a shared
+ string, or the content without RSTRING_FSTR may be freed.
+ [ruby-dev:49188] [Bug #11386]
+
+Fri Jul 24 20:09:43 2015 Naohisa Goto <ngotogenome@gmail.com>
+
+ * test/rinda/test_rinda.rb (RingIPv6#prepare_ipv6): prevent to use
+ IPv6 loopback interface for
+ Rinda::TestRingFinger#test_make_socket_ipv6_multicast and
+ Rinda::TestRingFinger#test_make_socket_ipv6_multicast_hops.
+ The tests are skipped if there are no IPv6 devices other than the
+ loopback device. [Bug #11394] [ruby-dev:49199]
+
+ * test/rinda/test_rinda.rb (test_make_socket_ipv6_multicast): ditto
+ for Rinda::TestRingServer#test_make_socket_ipv6_multicast.
+
+ * test/rinda/test_rinda.rb (test_ring_server_ipv6_multicast): ditto
+ for Rinda::TestRingServer#test_ring_server_ipv6_multicast.
+
+Fri Jul 24 16:35:55 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * string.c (fstr_update_callback): pool bare strings only.
+
+ * string.c (rb_fstring): return the original string with sharing a
+ fstring if it has extra attributes, not the fstring itself.
+ [ruby-dev:49188] [Bug #11386]
+
+Fri Jul 24 16:35:34 2015 yui-knk <spiketeika@gmail.com>
+
+ * file.c (rb_file_s_extname): [DOC] add an example.
+
+ * test/ruby/test_path.rb (test_extname): add tests. [Fix GH-978]
+ * path starts with dot ('.a.rb')
+ * path includes dir name ('a/b/d/test.rb')
+ * path includes dir name and dir name starts with dot
+ ('.a/b/d/test.rb')
+
+Thu Jul 23 18:50:43 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_core.h: constify rb_iseq_constant_body::local_table and
+ rb_iseq_param_keyword::table and
+ rb_iseq_param_keyword::default_values.
+
+ * compile.c: catch up this fix.
+
+ * iseq.c: ditto.
+
+Thu Jul 23 17:30:43 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_core.h: constify rb_iseq_constant_body::iseq_encoded and
+ rb_control_frame_t::pc.
+
+ * compile.c (rb_iseq_translate_threaded_code): catch up this fix.
+
+ * iseq.c: ditto.
+
+ * vm_exec.c (vm_exec_core): ditto.
+
+Thu Jul 23 10:25:46 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * include/ruby/ruby.h: add raw FL macros, which assume always the
+ argument object is not a special constant.
+
+ * internal.h (STR_EMBED_P, STR_SHARED_P): valid only for T_STRING.
+
+ * string.c: deal with taint flags directly across String instances.
+
+Thu Jul 23 09:05:28 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (lambda_body): pop cmdarg stack for lookahead
+ token. [ruby-core:70067] [Bug #11380]
+
+Thu Jul 23 04:03:03 2015 Aaron Patterson <tenderlove@ruby-lang.org>
+
+ * ext/openssl/ossl_ssl.c: fix tests by not setting the instance
+ variable on the frozen ssl instance.
+
+Thu Jul 23 03:32:26 2015 Aaron Patterson <tenderlove@ruby-lang.org>
+
+ * ext/openssl/ossl_ssl.c: add ECDH callback support. [Feature #11356]
+
+ * test/openssl/test_pair.rb: test for ECDH callback support
+
+Thu Jul 23 03:29:49 2015 Aaron Patterson <tenderlove@ruby-lang.org>
+
+ * ext/openssl/ossl_ssl.c: add ALPN support. [Feature #9390]
+
+ * ext/openssl/extconf.rb: detect ALPN support in OpenSSL
+
+ * test/openssl/test_ssl.rb: test for ALPN
+
+Wed Jul 22 23:44:17 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * string.c (rb_str_reverse): reversed string is not a substring,
+ and should not set coderange of the original string.
+ [ruby-dev:49189] [Bug #11387]
+
+Wed Jul 22 20:17:51 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_core.h: modify layout of rb_iseq_constant_body.
+
+ Move frequent accessing fields to upper part.
+
+Wed Jul 22 19:57:47 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_core.h: remove unused declaration of
+ iseq_compile_data_ensure_node_stack.
+
+Wed Jul 22 19:52:45 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_core.h: separate rb_iseq_body into rb_iseq_constant_body and
+ rb_iseq_variable_body (rb_iseq_t::variable_body).
+
+ rb_iseq_variable_body can be modified after compilation.
+
+ * compile.c: use rb_iseq_t::variable_body.
+
+ * iseq.c: ditto.
+
+ * thread.c: ditto.
+
+Wed Jul 22 17:50:35 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * lib/matrix/eigenvalue_decomposition.rb: refine code style.
+ [fix GH-959][ci skip] Patch by @bogdanvlviv
+
+Wed Jul 22 15:48:47 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * test/ruby/test_range.rb: Add test case for Range#end with
+ exclude_end true case. [fix GH-968] Patch by @yui-knk
+
+Wed Jul 22 09:45:31 2015 Maksim Sitnikov <sitnikovme@undev.ru>
+
+ * numeric.c (num_coerce): [DOC] fix doc for Numeric#coerce,
+ missing '+'. [Fix GH-974]
+
+Wed Jul 22 07:24:18 2015 Koichi Sasada <ko1@atdot.net>
+
+ * make rb_iseq_t T_IMEMO object (type is imemo_iseq).
+
+ All contents of previous rb_iseq_t is in rb_iseq_t::body.
+ Remove rb_iseq_t::self because rb_iseq_t is an object.
+
+ RubyVM::InstructionSequence is wrapper object points T_IMEMO/iseq.
+ So RubyVM::ISeq.of(something) method returns different wrapper
+ objects but they point the same T_IMEMO/iseq object.
+
+ This patch is big, but most of difference is replacement of
+ iseq->xxx to iseq->body->xxx.
+
+ (previous) rb_iseq_t::compile_data is also located to
+ rb_iseq_t::compile_data.
+ It was moved from rb_iseq_body::compile_data.
+
+ Now rb_iseq_t has empty two pointers.
+ I will split rb_iseq_body data into static data and dynamic data.
+
+ * compile.c: rename some functions/macros.
+ Now, we don't need to separate iseq and iseqval (only VALUE).
+
+ * eval.c (ruby_exec_internal): `n' is rb_iseq_t (T_IMEMO/iseq).
+
+ * ext/objspace/objspace.c (count_imemo_objects): count T_IMEMO/iseq.
+
+ * gc.c: check T_IMEMO/iseq.
+
+ * internal.h: add imemo_type::imemo_iseq.
+
+ * iseq.c: define RubyVM::InstructionSequence as T_OBJECT.
+ Methods are implemented by functions named iseqw_....
+
+ * load.c (rb_load_internal0): rb_iseq_new_top() returns
+ rb_iseq_t (T_IMEMO/iesq).
+
+ * method.h (rb_add_method_iseq): accept rb_iseq_t (T_IMEMO/iseq).
+
+ * vm_core.h (GetISeqPtr): removed because it is not T_DATA now.
+
+ * vm_core.h (struct rb_iseq_body): remove padding for
+ [Bug #10037][ruby-core:63721].
+
+Wed Jul 22 07:15:33 2015 Koichi Sasada <ko1@atdot.net>
+
+ * ext/objspace/objspace.c (total_i): no need to skip singleton classes.
+
+Wed Jul 22 06:37:54 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_core.h: constify rb_call_info_t::kw_arg,
+ rb_control_frame_t::iseq and rb_control_frame_t::block_iseq.
+
+ * iseq.c (iseq_free): catch up this fix.
+
+ * vm.c: ditto.
+
+ * vm_dump.c: ditto.
+
+Wed Jul 22 06:25:45 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_core.h: constify rb_call_info_t::blockiseq and rb_block_t::iseq.
+
+ * vm.c, vm_insnhelper.c: catch up this fix.
+
+ * iseq.c (iseq_data_to_ary): constify the first iseq parameter.
+
+ * vm_insnhelper.c (vm_make_proc_with_iseq): ditto.
+
+Wed Jul 22 06:17:35 2015 Koichi Sasada <ko1@atdot.net>
+
+ * method.h: constify rb_method_iseq_t::iseqptr.
+
+ * proc.c (rb_method_entry_min_max_arity): catch up this fix.
+
+ * vm_insnhelper.c (def_iseq_ptr): constify.
+
+Wed Jul 22 03:37:39 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (internal_object_p): Now a singleton classes appear by
+ ObjectSpace.each_object. [Bug #11360]
+
+ * test/ruby/test_objectspace.rb: add a test about it.
+
+Tue Jul 21 21:21:33 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * thread.c (do_select): replace switch and goto with a loop to
+ suppress maybe-uninitialized warnings by gcc6.
+
+ * thread.c (set_unblock_function, rb_wait_for_single_fd): ditto.
+
+Tue Jul 21 20:32:33 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * test/ruby/test_range.rb: Add test for Range#hash
+ [fix GH-969] Patch by @yui-knk
+
+Tue Jul 21 19:43:20 2015 Koichi Sasada <ko1@atdot.net>
+
+ * compile.c: constify the first parameter (iseq).
+ * iseq_add_mark_object()
+ * iseq_add_mark_object_compile_time()
+
+ * iseq.c, iseq.h (rb_iseq_add_mark_object): ditto.
+
+Tue Jul 21 16:18:48 2015 Eric Wong <e@80x24.org>
+
+ * test/socket/test_nonblock.rb: increase buffer sizes
+ to OpenBSD limits. Thanks to Jeremy Evans <code@jeremyevans.net>
+ [ruby-core:70058]
+
+Tue Jul 21 16:08:53 2015 Eric Wong <e@80x24.org>
+
+ * load.c (ruby_dln_librefs): make static
+
+Tue Jul 21 13:36:54 2015 yuuji.yaginuma <yuuji.yaginuma@gmail.com>
+
+ * lib/optparse.rb (complete): [DOC] fix typo. [Fix GH-973]
+
+Tue Jul 21 05:20:21 2015 Eric Wong <e@80x24.org>
+
+ * io.c (nogvl_wait_for_single_fd): new function for Linux
+ (maygvl_copy_stream_wait_read): Linux-specific version
+ (nogvl_copy_stream_wait_write): use nogvl_wait_for_single_fd
+ [ruby-core:70051] [Feature #11377]
+
+Mon Jul 20 15:04:30 2015 Eric Wong <e@80x24.org>
+
+ * parse.y (parser_initialize): avoid redundant zero-ing
+
+Mon Jul 20 12:12:05 2015 Eric Wong <e@80x24.org>
+
+ * parse.y (struct parser_params): pack: 88 => 256 bytes on 64-bit
+ [ruby-core:70034] [Feature #11371]
+
+Sun Jul 19 14:29:18 2015 windwiny <windwiny.ubt@gmail.com>
+
+ * ext/pty/pty.c: [DOC] fix example typo, an old name at move from
+ PTY.open. [Fix GH-972]
+
+Sat Jul 18 21:29:19 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * thread.c (vm_check_ints_blocking): gather common statements at
+ the end, and prefer LIKELY for Visual C optimization.
+
+Sat Jul 18 20:44:56 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * load.c (rb_load_internal0): do not raise any exceptions but
+ return the result tag state.
+
+ * load.c (rb_load_protect): reduce nested EXEC_TAGs.
+
+Sat Jul 18 19:52:17 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * gc.c (run_finalizer): set and restore safe level here to reduce
+ nested EXEC_TAGs.
+
+Sat Jul 18 18:45:22 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * eval.c (ruby_cleanup): error_handle() returns exit status to the
+ system, not internal error state, do not convert the exit status
+ again.
+
+Sat Jul 18 10:29:03 2015 Eric Wong <e@80x24.org>
+
+ * test/ruby/test_process.rb: test thread+sigs work after failed exec
+
+Sat Jul 18 07:20:18 2015 Jeremy Evans <code@jeremyevans.net>
+
+ * test/socket/test_nonblock: use smaller buffer for sendmsg
+ [ruby-core:70016] [Bug #11364]
+
+Sat Jul 18 07:04:24 2015 Eric Wong <e@80x24.org>
+
+ * signal.c (trap_handler): cleanup to use RSTRING_GETMEM + memcmp
+
+Sat Jul 18 02:53:06 2015 Eric Wong <e@80x24.org>
+
+ * io.c (argf_read_nonblock): support `exception: false'
+ (io_nonblock_eof): new function
+ (io_read_nonblock): use io_nonblock_eof
+ (argf_getpartial): accept kwargs hash for `exception: false'
+ * test/ruby/test_argf.rb (test_read_nonblock): new test
+ * NEWS: add item for ARGF.read_nonblock
+ [ruby-core:70000] [Feature #11358]
+
+Fri Jul 17 23:51:31 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_eval.c (rb_eval_cmd): $SAFE=4 has been deprecated.
+
+Fri Jul 17 22:18:09 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * compile.c (iseq_compile_each): use enum ruby_tag_type names.
+
+ * vm_core.h (ruby_tag_type): move from eval_intern.h for compiling
+ break/next/redo/return.
+
+Fri Jul 17 15:39:19 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * include/ruby/encoding.h (ENC_CODERANGE_CLEAN_P): predicate that
+ tells if the coderange is clean, that is 7bit or valid, and no
+ needs to scrub.
+
+ * re.c (rb_reg_expr_str): use ENC_CODERANGE_CLEAN_P.
+
+ * string.c (enc_strlen, rb_enc_cr_str_buf_cat, rb_str_scrub):
+ ditto.
+
+ * string.c (rb_str_enumerate_chars): ditto, and suppress a warning
+ by gcc6.
+
+Fri Jul 17 15:36:52 2015 yui-knk <spiketeika@gmail.com>
+
+ * test/ruby/test_range.rb (test_first_last): Add test for
+ `Range.new`. [Fix GH-971]
+
+Fri Jul 17 15:36:40 2015 yui-knk <spiketeika@gmail.com>
+
+ * test/ruby/test_range.rb (test_first_last): Add assertions to
+ test of `Range#last` with exclude_end true case. [Fix GH-970]
+
+Fri Jul 17 09:59:14 2015 Eric Wong <e@80x24.org>
+
+ * thread.c (rb_thread_alone): simplify
+
+Fri Jul 17 09:58:32 2015 Eric Wong <e@80x24.org>
+
+ * lib/rinda/tuplespace.rb: remove enumerator require
+ * test/pathname/test_pathname.rb: ditto
+
+Fri Jul 17 05:33:58 2015 Eric Wong <e@80x24.org>
+
+ * iseq.c (rb_iseq_compile_with_option): reuse result of previous
+ GET_THREAD() call
+ * thread.c (thread_create_core): ditto
+ (rb_mutex_trylock): ditto
+ (rb_mutex_lock): ditto
+ * process.c (rb_waitpid): avoid multiple eval from RUBY_VM_CHECK_INTS
+ * thread.c (rb_thread_check_ints): ditto
+
+Thu Jul 16 19:12:30 2015 Eric Wong <e@80x24.org>
+
+ * thread.c (mutex_alloc): remove needless volatile
+
+Thu Jul 16 22:05:29 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_core.h: constify rb_iseq_t::parent_iseq.
+
+ rb_iseq_t::local_iseq is not constant data because
+ local_iseq::flip_cnt can be modified (commented).
+
+ * compile.c: catch up this fix.
+
+ * iseq.c: ditto.
+
+ * vm_insnhelper.c: ditto.
+
+Thu Jul 16 21:47:47 2015 Naohisa Goto <ngotogenome@gmail.com>
+
+ * process.c (redirect_dup2): when the new FD of dup2() conflicts
+ with one of the timer thread FDs, the internal FD is diverted.
+ [Bug #11336] [ruby-core:69886] [Bug #11350] [ruby-core:69961]
+
+ * process.c (dup2_with_divert): new function for the above purpose.
+
+ * thread_pthread.c (rb_divert_reserved_fd): new function for
+ diverting reserved FD. If the given FD is the same as one of the
+ reserved FDs, the reserved FD number is internally changed.
+ It returns -1 when error. Otherwise, returns 0. It also returns
+ 0 if there is no need to change reserved FD number.
+
+ * thread_win32.c (rb_divert_reserved_fd): always returns 0 because
+ of no reserved FDs.
+
+ * internal.h (rb_divert_reserved_fd): prototype declaration.
+ It is Ruby internal use only.
+
+Thu Jul 16 21:47:46 2015 Koichi Sasada <ko1@atdot.net>
+
+ * iseq.c (rb_iseq_disasm): rename rb_iseq_t *iseqdat to iseq
+ and VALUE *iseq to code.
+
+ * iseq.c (rb_iseq_disasm_insn): ditto.
+
+Thu Jul 16 14:34:24 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm.c (REWIND_CFP): keep the arguments region inside the valid
+ value stack. [ruby-core:69969] [Bug #11352]
+
+Thu Jul 16 11:38:21 2015 Eric Wong <e@80x24.org>
+
+ * process.c (close_unless_reserved): declare type of `fd' arg
+
+Thu Jul 16 08:47:29 2015 Eric Wong <e@80x24.org>
+
+ * load.c (rb_construct_expanded_load_path): fstring expanded path
+ (get_loaded_features_index): fstring feature path
+ (rb_provide_feature): ditto
+ [ruby-core:69871] [Feature #11331]
+
+Thu Jul 16 02:56:14 2015 Eric Wong <e@80x24.org>
+
+ * thread.c (thread_initialize): avoid RSTRING_PTR and NUMT2INT
+
+Thu Jul 16 01:00:46 2015 Naohisa Goto <ngotogenome@gmail.com>
+
+ * test/ruby/test_process.rb (test_exec_close_reserved_fd): test for
+ [Bug #11353]
+
+Thu Jul 16 00:35:42 2015 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
+
+ * .gitignore: ignore version.i.
+
+Wed Jul 15 23:40:32 2015 Naohisa Goto <ngotogenome@gmail.com>
+
+ * test/ruby/test_process.rb (test_deadlock_by_signal_at_forking):
+ use RUBY (= EnvUtil.rubybin)
+
+Wed Jul 15 23:01:22 2015 Naohisa Goto <ngotogenome@gmail.com>
+
+ * process.c (redirect_close, parent_redirect_close): should not close
+ reserved FD. It should be closed in the exec system call due to the
+ O_CLOEXEC or FD_CLOEXEC flag. [Bug #11353] [ruby-core:69977]
+
+ * process.c (close_unless_reserved): new function to close FD unless
+ it is reserved for internal communication.
+
+ * thread_pthread.c (rb_reserved_fd_p): should check owner_process pid
+ to avoid false positive in forked child process.
+
+Wed Jul 15 18:31:18 2015 Eric Wong <e@80x24.org>
+
+ * proc.c (proc_mark): remove redundant check
+ * vm.c (env_mark): ditto
+
+Wed Jul 15 17:27:40 2015 Eric Wong <e@80x24.org>
+
+ * iseq.c (iseq_mark): remove check for data pointer
+ * proc.c (binding_mark): ditto
+ * vm.c (rb_thread_mark): ditto
+ * vm_trace.c (tp_mark): ditto
+
+Wed Jul 15 16:55:04 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * encoding.c (enc_autoload): drop dummy encoding flag from
+ the loaded encoding index. this flag is used only in this
+ source.
+
+Wed Jul 15 14:39:29 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm.c (vm_make_env_each): add comments about env layout.
+ Do not use `i' to specify `new_ep'.
+
+ * vm.c (rb_proc_create, rb_vm_make_proc_lambda): envval is not used.
+
+Wed Jul 15 08:59:19 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * gc.h (RUBY_MARK_UNLESS_NULL): evaluate the argument only once
+ to get rid of inadvertent side effects.
+
+Wed Jul 15 02:53:11 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_core.h, vm.c: remove rb_proc_t::envval because we can know it via
+ rb_proc_t::block::ep.
+
+ rb_vm_proc_envval(const rb_proc_t *proc) returns an Env object which
+ the Proc object use.
+
+ * proc.c: catch up this fix.
+
+ * vm_dump.c (rb_vmdebug_proc_dump_raw): ditto.
+
+Wed Jul 15 02:27:22 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_core.h, vm.c: remove rb_env_t::prev_envval because we can know it
+ via env->ep.
+
+ rb_vm_env_prev_envval(env) returns prev_envval via env->ep.
+
+ * vm_core.h (rb_vm_env_local_variables): change parameter type
+ from VALUE (T_DATA/env) to `const rb_env_t *' to make same as
+ rb_vm_env_prev_envval().
+
+ * proc.c: catch up these changes.
+
+ * vm_dump.c: ditto.
+
+ * vm.c: rename macros.
+
+ * ENV_IN_HEAP_P() to VM_EP_IN_HEAP_P() because it uses ep.
+ * ENV_VAL() to VM_ENV_EP_ENVVAL() because it is too short.
+
+Wed Jul 15 01:09:09 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm.c: refactoring Proc/Env related code.
+
+ * vm_core.h: remove blockprocval field from rb_proc_t and rb_binding_t.
+ Instead of this field, mark given block in Proc at rb_env_t::env.
+
+ * vm.c (vm_make_env_each): make an Env object with this layout.
+ And also simplify parameters.
+
+ * proc.c: catch up this fix.
+
+ * vm_core.h: remove rb_env_t::local_size because it is not used.
+
+ * vm_dump.c (rb_vmdebug_env_dump_raw): catch up this fix.
+
+ * vm_core.h (rb_vm_make_env_object): remove rb_vm_make_env_object()
+ because it is only referred from vm.c.
+
+ * vm_eval.c (eval_string_with_cref): catch up this fix.
+
+Wed Jul 15 00:03:36 2015 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
+
+ * gc.c (__has_feature): move into internal.h.
+
+ * internal.h (__has_feature): ditto.
+
+ * internal.h (__has_extension): new macro.
+
+ * internal.h (STATIC_ASSERT): use _Static_assert with
+ clang. [ruby-core:69931] [Bug #11343]
+
+Wed Jul 15 00:00:00 2015 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
+
+ * random.c (fill_random_bytes_syscall): fix compile error with
+ clang. [ruby-core:69931] [Bug #11343]
+
+Tue Jul 14 11:22:42 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/webrick/utils.rb (WEBrick::Utils::TimeoutHandler#register):
+ notify the handler thread of new timeout registration.
+
+ * lib/webrick/utils.rb (WEBrick::Utils::TimeoutHandler#initialize):
+ make sleep intervals adaptive than fixed period intervals.
+
+ * lib/webrick/server.rb (WEBrick::GenericServer#start): flush
+ shutdown pipe.
+
+ * lib/webrick/server.rb (WEBrick::GenericServer#stop): request the
+ server to stop immediately by sending data via shutdown pipe.
+
+Mon Jul 13 23:58:08 2015 Stefano Tortarolo <stefano.tortarolo@gmail.com>
+
+ * lib/webrick/httpproxy.rb (WEBrick::HTTPProxyServer#do_CONNECT):
+ fix typos in debugger statements. [Fix GH-967]
+
+Mon Jul 13 19:11:35 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/timeout.rb (timeout): warn as deprecated for a long time.
+
+Mon Jul 13 01:37:27 2015 Zachary Scott <zzak@ruby-lang.org>
+
+ * ext/openssl/ossl.c: [DOC] Backport ruby/openssl@dbb3fdb [Bug #11345]
+ Thanks to Tomoya Chiba for the report and help with patch.
+
+Sun Jul 12 09:20:02 2015 Shota Fukumori <her@sorah.jp>
+
+ * ext/socket/basicsocket.c: [DOC] typo (Errno::AGAIN -> Errno::EAGAIN)
+
+ * ext/socket/socket.c: ditto
+
+ * ext/socket/tcpserver.c: ditto
+
+ * ext/socket/udpsocket.c: ditto
+
+ * ext/socket/unixserver.c: ditto
+
+ * io.c: ditto
+
+Sun Jul 12 06:42:23 2015 ksss <co000ri@gmail.com>
+
+ * test/stringio/test_stringio.rb (test_sysread): add a test for
+ StringIO#sysread. [Fix GH-966]
+
+Sat Jul 11 21:16:34 2015 ksss <co000ri@gmail.com>
+
+ * ext/stringio/stringio.c (Init_stringio): [DOC] Fix an example,
+ StringIO#puts should be set "\n" at last. [Fix GH-965]
+
+Sat Jul 11 12:45:51 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/timeout.rb (Timeout#timeout): remove regexp with wrong line
+ number and fix caller depth.
+
+Fri Jul 10 22:05:50 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/timeout.rb (ExitException): removed internal exception class
+ and use Timeout::Error instead, as using throw/catch to isolate
+ each timeouts now. [ruby-dev:49179] [Bug #11344]
+
+Fri Jul 10 17:41:54 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * dir.c (is_case_sensitive): get attributes by the file descriptor
+ of open directory, instead of using mount point name.
+
+Fri Jul 10 10:46:02 2015 ksss <co000ri@gmail.com>
+
+ * ext/stringio/stringio.c (writable): remove unnecessary check for
+ deprecated safe level 4. [Fix GH-963]
+
+Thu Jul 9 15:07:12 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * win32/win32.c (waitpid): return immediately if interrupted.
+ reported by <takkanm AT gmail.com> [ruby-dev:49176] [Bug #11340]
+
+Thu Jul 9 13:03:46 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_insnhelper.c (vm_search_super_method): use CI_SET_FASTPATH().
+
+Thu Jul 9 11:07:06 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_core.h: remove rb_call_info_t::klass because
+ rb_callable_method_entry_t has information about defined class.
+
+ * vm_insnhelper.c (vm_search_method): don't set ci->klass because
+ it is removed.
+
+ * vm_insnhelper.c (rb_equal_opt): ditto.
+
+ * vm_insnhelper.c (vm_search_superclass): removed because it is too
+ simple to write code directly.
+
+ * vm_insnhelper.c (vm_defined): don't use vm_search_superclass().
+ This fix avoid searching current callable `me' twice.
+
+ * vm_insnhelper.c (vm_search_super_method): ditto.
+
+Thu Jul 9 10:03:10 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * lib/net/http/responses.rb: Added 308 status to CODE_TO_OBJ list.
+ [fix GH-961] Patch by @billinghamj
+
+Thu Jul 9 09:34:14 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_core.h (rb_control_frame_t): fix comments (layout index).
+
+Thu Jul 9 09:25:50 2015 Zachary Scott <e@zzak.io>
+
+ * parse.y: Improve duplicate key warning with patch by @andremedeiros
+ [Fix GH-938] https://github.com/ruby/ruby/pull/938 [Bug #11327]
+
+Wed Jul 8 07:43:01 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * lib/csv.rb: typo fix [ci skip][fix GH-958] Patch by @henrik
+
+Wed Jul 8 04:42:27 2015 Eric Wong <e@80x24.org>
+
+ * iseq.c (iseq_data_to_ary): dump kw_arg as symbol
+ * test/-ext-/iseq_load/test_iseq_load.rb: test kw_arg roundtrip
+ [ruby-core:69891] [Bug #11338]
+
+Tue Jul 7 18:18:41 2015 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
+
+ * random.c (fill_random_bytes_syscall): fix compile error.
+
+Tue Jul 7 16:47:30 2015 Eric Wong <e@80x24.org>
+
+ * compile.c (COMPILE_ERROR): reduce GET_THREAD() calls
+
+Tue Jul 7 16:39:04 2015 Eric Wong <e@80x24.org>
+
+ * random.c (fill_random_bytes_syscall): return -1 for error
+ * random.c (fill_random_bytes): try urandom on syscall failure
+
+Tue Jul 7 15:02:18 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * file.c (rb_str_normalize_ospath): skip invalid byte sequence not
+ to loop infinitely. this case usually does not happen as the
+ input name should come from real file systems.
+
+Tue Jul 7 14:40:08 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_backtrace.c: remove debug flag introduced accidentally.
+
+Tue Jul 7 12:05:37 2015 Koichi Sasada <ko1@atdot.net>
+
+ * cont.c (cont_free): remove mysterious fflush()
+ introduced at r19890, maybe accidentally.
+
+Tue Jul 7 11:45:14 2015 Koichi Sasada <ko1@atdot.net>
+
+ * proc.c (rb_method_call): because data->me should be non-NULL,
+ do not check data->me
+
+ * proc.c (method_inspect): ditto.
+
+Tue Jul 7 11:37:25 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_core.h: remove rb_iseq_t::orig because rb_iseq_clone()
+ no longer exists.
+
+ * iseq.c: don't use rb_iseq_t::orig.
+
+Tue Jul 07 11:25:57 2015 Koichi Sasada <ko1@atdot.net>
+
+ * iseq.c, internal.h (rb_iseq_clone): removed because we don't need to
+ clone iseq any more.
+
+ * class.c (clone_method): share iseq between cloned methods. All of
+ method dependent information are able to refer from method entry.
+
+Tue Jul 7 04:42:25 2015 Eric Wong <e@80x24.org>
+
+ * string.c (Init_String): use rb_str_freeze for String#freeze
+ to resize internal buffer
+ [ruby-core:69870] [Feature #11330]
+
+Tue Jul 7 04:12:32 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm.c (vm_define_method): remove an unused local variable.
+
+Tue Jul 7 03:57:28 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_core.h: remove rb_iseq_t::defined_method_id because it is not
+ needed.
+
+ * eval.c (frame_func_id): simplify. rb_callable_method_entry_t
+ has enough information.
+
+ * eval.c (frame_called_id): ditto.
+
+ * iseq.c (prepare_iseq_build): catch up this fix.
+
+ * proc.c (rb_mod_define_method): ditto.
+
+ * vm.c (vm_define_method): ditto.
+
+Tue Jul 7 03:47:26 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_core.h: remove a useless declaration.
+
+Tue Jul 7 03:33:20 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_core.h: remove rb_iseq_t::klass to reduce dynamic data.
+
+ * internal.h, iseq.c (rb_iseq_klass): remove it because
+ rb_iseq_t::klass is removed.
+
+ * vm_insnhelper.c (vm_super_outside): do not see cfp->iseq, but
+ check callable method entry on a frame.
+ This fix simplify the logic to search super class.
+
+ * test/ruby/test_method.rb: support super() from Proc.
+ Now, [Bug #4881] and [Bug #3136] was solved.
+
+ * proc.c (rb_mod_define_method): catch up this change.
+
+ * vm.c (vm_define_method): ditto.
+
+ * vm_backtrace.c (rb_profile_frames): now, each `frame' objects
+ are rb_callable_method_entry_t data or iseq VALUEs.
+
+ This fix introduce minor compatibility issue that
+ rb_profile_frame_label() always returns
+ rb_profile_frame_base_label().
+
+ * test/-ext-/debug/test_profile_frames.rb: catch up this change.
+
+Tue Jul 7 01:52:14 2015 Koichi Sasada <ko1@atdot.net>
+
+ * cont.c (fiber_init): initialize control frame correctly.
+ This fix does not affect any ordinal execution, but
+ affects debug prints.
+
+Mon Jul 6 17:59:05 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_insnhelper.c (vm_search_super_method): do not skip calling
+ same methods in super.
+ [Bug #3351]
+
+ * test/ruby/test_super.rb: fix a test.
+
+Mon Jul 6 17:59:11 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * ext/tk/tcltklib.c: removed deprecated safe level.
+
+Mon Jul 6 17:16:37 2015 Koichi Sasada <ko1@atdot.net>
+
+ * method.h, proc.c (rb_method_entry_location): make it static
+ and remove prefix `rb_' because it is used only in proc.c.
+
+Mon Jul 6 16:42:10 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * test/lib/memory_status.rb: removed redundant path.
+
+Mon Jul 6 01:18:11 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * test/lib/test/unit/parallel.rb: make @@project_dir one level
+ upper as this file had moved one level deeper.
+
+Sun Jul 5 23:54:10 2015 mizokami <suzunatsu@yahoo.com>
+
+ * lib/optparse.rb: [DOC] Fix typo.
+
+Sun Jul 5 18:25:37 2015 Eric Wong <e@80x24.org>
+
+ * gc.c (gc_profile_record_get): fix spelling error in keys
+
+Sun Jul 5 14:49:01 2015 CHIKANAGA Tomoyuki <nagachika@ruby-lang.org>
+
+ * README.md: fix a typo pointed out by raoulvdberge.
+ https://github.com/ruby/ruby/pull/953#commitcomment-11998186
+
+Sun Jul 5 12:56:20 2015 Irvi Firqotul Aini <viarc7@gmail.com>
+
+ * README.md: Added link HowToReport bugs.
+
+Sun Jul 5 10:51:48 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * array.c (rb_ary_sort_bang): the original array may not be
+ embedded even if a substitution array is embedded, as it is
+ embedded when the original array is short enough but not
+ embedded. [ruby-dev:49166] [Bug #11332]
+
+Sun Jul 5 09:31:40 2015 Eric Wong <e@80x24.org>
+
+ * test/ruby/test_process.rb: test for fd=3 usability in child
+
+Sat Jul 4 19:43:31 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * Add test case for empty array and first method with args.
+ Patch by @yui-knk [fix GH-955]
+
+Sat Jul 4 19:39:08 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * Add test for `Enumerable#sort` with block. Patch by @yui-knk
+ [fix GH-954]
+
+Sat Jul 4 14:38:43 2015 Eric Wong <e@80x24.org>
+
+ * enum.c (zip_ary): remove volatile, use RB_GC_GUARD
+ (zip_i): ditto
+
+Sat Jul 4 10:42:57 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/rubygems/test_case.rb (teardown): do not delete features
+ loaded from the original load paths, the same libraries should
+ be loaded again when the same features are required.
+ [ruby-dev:49031] [Bug #11222]
+
+Sat Jul 4 09:38:52 2015 Eric Wong <e@80x24.org>
+
+ * vm.c (rb_vm_mark): reduce branches for always-set VM fields
+ (rb_vm_add_root_module): ditto
+
+Fri Jul 03 20:05:10 2015 Koichi Sasada <ko1@atdot.net>
+
+ * method.h: introduce rb_callable_method_entry_t to remove
+ rb_control_frame_t::klass.
+ [Bug #11278], [Bug #11279]
+
+ rb_method_entry_t data belong to modules/classes.
+ rb_method_entry_t::owner points defined module or class.
+
+ module M
+ def foo; end
+ end
+
+ In this case, owner is M.
+
+ rb_callable_method_entry_t data belong to only classes.
+ For modules, MRI creates corresponding T_ICLASS internally.
+ rb_callable_method_entry_t can also belong to T_ICLASS.
+
+ rb_callable_method_entry_t::defined_class points T_CLASS or
+ T_ICLASS.
+ rb_method_entry_t data for classes (not for modules) are also
+ rb_callable_method_entry_t data because it is completely same data.
+ In this case, rb_method_entry_t::owner == rb_method_entry_t::defined_class.
+
+ For example, there are classes C and D, and includes M,
+
+ class C; include M; end
+ class D; include M; end
+
+ then, two T_ICLASS objects for C's super class and D's super class
+ will be created.
+
+ When C.new.foo is called, then M#foo is searched and
+ rb_callable_method_t data is used by VM to invoke M#foo.
+
+ rb_method_entry_t data is only one for M#foo.
+ However, rb_callable_method_entry_t data are two (and can be more).
+ It is proportional to the number of including (and prepending)
+ classes (the number of T_ICLASS which point to the module).
+
+ Now, created rb_callable_method_entry_t are collected when
+ the original module M was modified. We can think it is a cache.
+
+ We need to select what kind of method entry data is needed.
+ To operate definition, then you need to use rb_method_entry_t.
+
+ You can access them by the following functions.
+
+ * rb_method_entry(VALUE klass, ID id);
+ * rb_method_entry_with_refinements(VALUE klass, ID id);
+ * rb_method_entry_without_refinements(VALUE klass, ID id);
+ * rb_resolve_refined_method(VALUE refinements, const rb_method_entry_t *me);
+
+ To invoke methods, then you need to use rb_callable_method_entry_t
+ which you can get by the following APIs corresponding to the
+ above listed functions.
+
+ * rb_callable_method_entry(VALUE klass, ID id);
+ * rb_callable_method_entry_with_refinements(VALUE klass, ID id);
+ * rb_callable_method_entry_without_refinements(VALUE klass, ID id);
+ * rb_resolve_refined_method_callable(VALUE refinements, const rb_callable_method_entry_t *me);
+
+ VM pushes rb_callable_method_entry_t, so that rb_vm_frame_method_entry()
+ returns rb_callable_method_entry_t.
+ You can check a super class of current method by
+ rb_callable_method_entry_t::defined_class.
+
+ * method.h: renamed from rb_method_entry_t::klass to
+ rb_method_entry_t::owner.
+
+ * internal.h: add rb_classext_struct::callable_m_tbl to cache
+ rb_callable_method_entry_t data.
+
+ We need to consider about this field again because it is only
+ active for T_ICLASS.
+
+ * class.c (method_entry_i): ditto.
+
+ * class.c (rb_define_attr): rb_method_entry() does not takes
+ defined_class_ptr.
+
+ * gc.c (mark_method_entry): mark RCLASS_CALLABLE_M_TBL() for T_ICLASS.
+
+ * cont.c (fiber_init): rb_control_frame_t::klass is removed.
+
+ * proc.c: fix `struct METHOD' data structure because
+ rb_callable_method_t has all information.
+
+ * vm_core.h: remove several fields.
+ * rb_control_frame_t::klass.
+ * rb_block_t::klass.
+
+ And catch up changes.
+
+ * eval.c: catch up changes.
+
+ * gc.c: ditto.
+
+ * insns.def: ditto.
+
+ * vm.c: ditto.
+
+ * vm_args.c: ditto.
+
+ * vm_backtrace.c: ditto.
+
+ * vm_dump.c: ditto.
+
+ * vm_eval.c: ditto.
+
+ * vm_insnhelper.c: ditto.
+
+ * vm_method.c: ditto.
+
+Fri Jul 3 14:30:18 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * win32/file.c: some mingw compilers need a tweek for the
+ declarations of _wfreopen_s. [Bug #11320]
+
+Fri Jul 3 12:25:19 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * transcode.c (rb_econv_set_replacement): target encoding name can
+ be empty now. [ruby-core:69841] [Bug #11324]
+
+Fri Jul 3 07:21:06 2015 Eric Wong <e@80x24.org>
+
+ * benchmark/bm_io_nonblock_noex.rb: new benchmark
+ * ext/openssl/ossl_ssl.c (no_exception_p): new function
+ (ossl_start_ssl): adjust for no_exception_p
+ (ossl_ssl_connect): adjust ossl_start_ssl call
+ (ossl_ssl_connect_nonblock): ditto
+ (ossl_ssl_accept): ditto
+ (ossl_ssl_accept_nonblock): ditto
+ (ossl_ssl_read_internal): adjust for no_exception_p
+ (ossl_ssl_write_internal): ditto
+ (ossl_ssl_write): adjust ossl_write_internal call
+ (ossl_ssl_write_nonblock): ditto
+ * ext/stringio/stringio.c (strio_read_nonblock):
+ delay exception check
+ * io.c (no_exception_p): new function
+ (io_getpartial): call no_exception_p
+ (io_readpartial): adjust for io_getpartial
+ (get_kwargs_exception): remove
+ (io_read_nonblock): adjust for io_getpartial,
+ check no_exception_p on EOF
+ (io_write_nonblock): call no_exception_p
+ (rb_io_write_nonblock): do not check `exception: false'
+ (argf_getpartial): adjust for io_getpartial
+ [ruby-core:69778] [Feature #11318]
+
+Fri Jul 3 07:13:11 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * dir.c (replace_real_basename): Win32 API does not set errno, get
+ the last error by GetLastError() and map to errno. [Bug #10015]
+
+Thu Jul 2 21:32:06 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * dir.c (replace_real_basename): show warnings at errors.
+ [Bug #10015]
+
+Thu Jul 2 18:39:20 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: remove `#define RGENGC_OBJ_INFO 1' line introduced to
+ debug Bug #11244.
+
+Thu Jul 2 18:34:26 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (rb_raw_obj_info): separated from rb_obj_info().
+ Fill internal object information into passed buffer.
+
+ * gc.h: declare rb_raw_obj_info().
+
+Thu Jul 2 16:15:04 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * dir.c (replace_real_basename): update path type by the target
+ attributes if possible, to improve the performance. [Bug #10015]
+
+Thu Jul 2 14:45:53 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * st.c: get rid of VC++'s warnings of C4700 (uninitialized local
+ variable used). I think that these are wrong, but should shut them
+ up.
+
+Thu Jul 2 14:15:50 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/rubygems.rb (Gem.load_path_insert_index): search
+ @gem_prelude_index first.
+
+ * lib/rubygems/test_case.rb (Gem::TestCase#setup): keep already
+ expanded paths to preserve instance variables.
+
+Thu Jul 2 14:12:01 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ruby.c (process_options): also copy initial load path marks at
+ setting load paths encoding.
+
+Thu Jul 2 12:26:11 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * test/rubygems/test_gem_server.rb (process_based_port): use
+ dynamically chosen port numbers to get rid of conflicts.
+
+Thu Jul 2 11:58:59 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * test/rubygems/test_gem_specification.rb: skip tests which the
+ platform does not permit the filename of its test file.
+
+Thu Jul 2 11:36:20 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * test/rubygems/test_gem_resolver_git_specification.rb: require
+ rubygems/installer.rb before Gem::TestCase#setup runs, otherwise
+ as Gem::TestCase#teardown restores $LOADED_FEATURES to the state
+ at that time, the requiring the file in GitSpecification#install
+ method causes a lot of constant redefinitions.
+
+Thu Jul 2 10:43:36 2015 Eric Wong <e@80x24.org>
+
+ * ext/socket/rubysocket.h: flags for common socket families
+ (rsock_getfamily): update signature
+ * include/ruby/io.h: comment socket FMODE flags
+ * ext/socket/init.c (rsock_getfamily): memoize family
+ * ext/socket/basicsocket.c: adjust rsock_getfamily calls
+ * ext/socket/ancdata.c: ditto
+ [ruby-core:69713] [Feature #11298]
+
+Thu Jul 2 10:30:01 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * lib/rubygems/resolver.rb: fixed NameError of Gem::Util::NULL_DEVICE.
+
+Thu Jul 2 09:51:44 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * lib/rubygems/resolver.rb: fix error of null device reference with DOSISH
+ platform.
+
+Thu Jul 2 06:49:44 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * lib/rubygems: Update to RubyGems HEAD(c202db2).
+ this version contains many enhancements see http://git.io/vtNwF
+ * test/rubygems: ditto.
+
+Wed Jul 1 23:50:34 2015 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
+
+ * test/net/http/test_httpresponse.rb
+ (HTTPResponseTest#test_read_body_content_encoding_deflate_uppercase):
+ fix a failure without zlib.
+
+Wed Jul 1 10:54:56 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * Add test for Enumerable#none? [fix GH-950] Patch by @yui-knk
+
+Wed Jul 1 09:30:36 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * struct.c (struct_set_members): hide internal back_members
+ object, and members object does not need to be duped as it
+ should be frozen and hidden.
+
+Wed Jul 1 09:28:47 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * struct.c (struct_member_pos): revert r51080 to fix other
+ implicit conversions but cast the return value to fix the
+ previous implicit conversion.
+
+Wed Jul 1 08:47:24 2015 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * struct.c (struct_member_pos): avoid implicit conversion loses
+ integer precision: 'long' to 'int'.
+
+Wed Jul 1 05:57:03 2015 Eric Wong <e@80x24.org>
+
+ * vm_method.c (rb_add_method_iseq): add RB_GC_GUARD
+ * class.c (clone_method): remove RB_GC_GUARD
+ * struct.c (define_aref_method): ditto
+ (define_aset_method): ditto
+ * vm.c (vm_define_method):
+ * iseq.c (rb_iseq_clone): add RB_GC_GUARD
+
+Wed Jul 1 05:43:58 2015 Eric Wong <e@80x24.org>
+
+ * struct.c (AREF_HASH_THRESHOLD): new macro
+ (id_back_members): new ID
+ (struct_member_pos_ideal): new function
+ (struct_member_pos_probe): ditto
+ (struct_set_members): ditto
+ (struct_member_pos): ditto
+ (rb_struct_getmember): use struct_member_pos for O(1) access
+ (rb_struct_aref_sym): ditto
+ (rb_struct_aset_sym): ditto
+ (setup_struct): call struct_set_members
+ (struct_define_without_accessor): ditto
+ (Init_Struct): initialize __members_back__
+ [ruby-core:66851] [ruby-core:69705] [ruby-core:69821]
+
+Tue Jun 30 23:12:08 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * io.c (rb_io_reopen): FilePathValue() ensures the path
+ NUL-terminated and frozen, so it is unnecessary to make it shared.
+
+Tue Jun 30 23:11:53 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * dir.c (check_dirname): ensure path name NUL-terminated for
+ SHARABLE_MIDDLE_SUBSTRING.
+
+ * io.c (rb_sysopen): ditto.
+
+Tue Jun 30 18:38:16 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * win32/file.c (rb_freopen): need to terminate by NUL.
+
+Tue Jun 30 17:28:25 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * io.c (rb_io_reopen): freopen(3) with OS encoding path.
+ [ruby-core:69780] [Bug #11320]
+
+ * win32/file.c (rb_freopen): wrapper of wchar version freopen(3).
+ use _wfreopen_s() if available.
+
+Tue Jun 30 08:24:08 2015 Eric Wong <e@80x24.org>
+
+ * io.c (rb_io_oflags_modestr): handle O_TRUNC correctly
+ * test/ruby/test_io.rb (test_reopen_stdio): new test
+ Patch-by: cremno phobia <cremno@mail.ru>
+ [ruby-core:69779] [Bug #11319]
+
+Tue Jun 30 02:47:02 2015 Eric Wong <e@80x24.org>
+
+ * include/ruby/st.h (struct st_table): hide struct list_head
+ * st.c (struct st_table_entry): adjust struct
+ (head, tail): remove shortcut macros
+ (st_head): new wrapper function
+ (st_init_table_with_size): adjust to new struct and API
+ (st_clear): ditto
+ (add_direct): ditto
+ (unpack_entries): ditto
+ (rehash): ditto
+ (st_copy): ditto
+ (remove_entry): ditto
+ (st_shift): ditto
+ (st_foreach_check): ditto
+ (st_foreach): ditto
+ (get_keys): ditto
+ (get_values): ditto
+ (st_values_check): ditto
+ (st_reverse_foreach_check): ditto (unused)
+ (st_reverse_foreach): ditto (unused)
+ [ruby-core:69726] [Misc #10278]
+
+Mon Jun 29 17:38:01 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * insns.def (defineclass): do not quote unprintable characters at
+ raising an exception.
+
+Mon Jun 29 16:01:24 2015 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * lib/net/http/response.rb (inflater): CONTENT_ENCODING can be upper
+ case. [ruby-core:69670] [Bug #11285] patched by Andy Chu
+
+Mon Jun 29 14:50:08 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * eval.c (add_activated_refinement): should not include the original
+ class.
+
+Mon Jun 29 12:09:10 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * README.md: tweak styles. [fix GH-945][ci skip] Patch by @bryndyment
+
+Mon Jun 29 07:23:55 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * template/sizes.c.tmpl: extract RUBY_DEFINT to define sizes of
+ types checked by configure.in, and fix size of intptr_t in
+ universal binary.
+
+Mon Jun 29 02:10:10 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * insns.def (defineclass): preserve encoding of name in error
+ messages for super class mismatch.
+
+ * insns.def (defineclass): preserve encoding of name in error
+ messages for non-class super.
+
+ * insns.def (defineclass): preserve encoding of name in error
+ messages when already defined but type mismatch.
+
+Sun Jun 28 12:07:35 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * class.c (rb_define_class_id_under): raise TypeError exception
+ same as ruby level class definition when superclass mismatch.
+
+Sun Jun 14 19:02:03 2015 Benoit Daloze <eregontp@gmail.com>
+
+ * lib/net/ftp.rb (makeport): close the TCPServer
+ when sending the port fails.
+
+ * test/net/ftp/test_ftp.rb: test for above.
+
+Fri Jun 26 12:48:37 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * transcode.c (load_transcoder_entry): fix transcoder loading race
+ condition, by waiting in require. [ruby-dev:49106] [Bug #11277]
+
+Fri Jun 26 07:53:56 2015 Eric Wong <e@80x24.org>
+
+ * enum.c (enum_minmax): simplify return value creation
+ * test/ruby/test_enum.rb: test behavior on empty
+ * hash.c (rb_hash_fetch_m): remove unnecessary volatile since r41597
+ (env_reject_bang): trade volatile for GC guard
+ (env_select): ditto
+ (env_select_bang): ditto
+ (env_keep_if): ditto
+ (rb_env_clear): ditto
+
+Thu Jun 25 21:24:28 2015 Naohisa Goto <ngotogenome@gmail.com>
+
+ * test/-ext-/popen_deadlock/test_popen_deadlock.rb: test [Bug #11265]
+
+ * ext/-test-/popen_deadlock/infinite_loop_dlsym.c: new ext to call
+ dlsym(3) infinitely without GVL, used in the above test.
+
+ * ext/-test-/popen_deadlock/extconf.rb: extconf.rb for the above
+ ext. Currently, only enabled on Solaris (main target) and Linux
+ (as a reference platform and for debugging the ext).
+
+Thu Jun 25 19:24:25 2015 Naohisa Goto <ngotogenome@gmail.com>
+
+ * configure.in: not to use vfork on Solaris to avoid deadlock
+ occurred in vfork(2) with multi-threading and dynamic linker
+ on Solaris. [Bug #11265] [ruby-dev:49089]
+
+Thu Jun 25 18:25:41 2015 Naohisa Goto <ngotogenome@gmail.com>
+
+ * test/lib/envutil.rb (Test::Unit::Assertions#assert_no_memory_leak):
+ NO_MEMORY_LEAK_ENVS is moved to Memory::NO_MEMORY_LEAK_ENVS
+ to reduce child executions during test-all on Solaris.
+
+ * test/lib/memory_status.rb (Memory::NO_MEMORY_LEAK_ENVS): ditto.
+
+Thu Jun 25 17:32:33 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_method.c (rb_method_entry_create): need to call
+ method_definition_reset() if def is given.
+
+ Actually, `me' is a new object, so we don't need to call it.
+ It is just to make sure.
+
+ * vm_method.c (method_definition_reset): remove duplicated insertion.
+
+ * vm_method.c (rb_method_entry_clone): assign dst->def here,
+ not in method_definition_reset().
+
+Thu Jun 25 16:44:54 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_method.c: make a rb_method_definition_t data (def) *after* making
+ a rb_method_entry_t data (me).
+
+ Normally, `me' points `def'. Some Ruby objects pointed from `def'
+ and objects are marked by `me' (mark_method_entry() in gc.c).
+ However, `def' is built before making a `me', then nobody can mark
+ objects pointed from `def' before making (and pointing from) `me'.
+
+ I hope this patch solve #11244.
+
+ * vm_method.c: remove `rb_' prefix from some static functions.
+
+ * method.h (rb_method_entry_create): constify
+
+ * gc.c (mark_method_entry): add checking `def' and
+ `def->body.iseq.iseqptr' availability because they can be NULL.
+
+Thu Jun 25 14:14:16 2015 takiy33 <takiy33@gmail.com>
+
+ * test/test_prime.rb (test_eratosthenes_works_fine_after_timeout):
+ use spaces instead of TABs in ruby codes. [Fix GH-944]
+
+Thu Jun 25 07:08:35 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (obj_info, method_type_name): show method type name in a string
+ instead of a number.
+
+Thu Jun 25 06:49:25 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (obj_info): show more details for T_IMEMO/imemo_ment.
+
+Thu Jun 25 06:40:46 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_method.c (rb_method_definition_reset): need a WB for
+ VM_METHOD_TYPE_ATTRSET.
+
+Thu Jun 25 03:33:21 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (RGENGC_OBJ_INFO, obj_info): add a macro to enable/disable
+ rich obj_info() output.
+
+ At the default, the value of RGENGC_OBJ_INFO is
+ (RGENGC_DEBUG | RGENGC_CHECK_MODE).
+
+ * gc.c (RGENGC_OBJ_INFO): force enable it to debug #11244.
+
+ * gc.c (gc_mark_ptr): print more details with obj_info().
+
+ * gc.c (gc_mark_children): remove useless debug prints.
+
+Thu Jun 25 02:40:33 2015 Eric Wong <e@80x24.org>
+
+ * ext/openssl/ossl_ssl.c (ossl_ssl_read_internal):
+ do not process kwargs in blocking mode
+ * test/openssl/test_ssl.rb: test sysread
+
+Wed Jun 24 16:54:11 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_mark_children): add additional debug code for #11244.
+
+Wed Jun 24 16:05:42 2015 Eric Wong <e@80x24.org>
+
+ * string.c (rb_str_justify): use RB_GC_GUARD
+
+Wed Jun 24 14:25:17 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_mark_ptr): add a check code for #11244.
+
+ It should be removed later. But we can remain this check
+ because it is only a branch.
+
+Wed Jun 24 12:49:11 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * string.c (rb_fstring_cstr): new function to make a fstring from
+ a string literal.
+
+ * internal.h (rb_fstring_lit): new macro to make a fstring from a
+ string literal.
+
+ * include/ruby/intern.h (rb_strlen_lit): new macro to get the
+ length of a string literal, borrowed from mruby/mruby@e4afd53.
+
+Wed Jun 24 12:21:16 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * re.c: Update documentation for Regexp class.
+ [fix GH-937][ci skip] Patch by @davydovanton
+
+Wed Jun 24 09:23:03 2015 Eric Wong <e@80x24.org>
+
+ * variable.c (generic_ivar_set): remove FL_ABLE check
+ (gen_ivar_copy): ditto
+ [ruby-core:69715]
+
+Wed Jun 24 08:28:15 2015 Eric Wong <e@80x24.org>
+
+ * ext/socket/ancdata.c (bsock_recvmsg_internal): reduce stack use
+ [ruby-core:69595] [Feature #11263]
+
+Tue Jun 23 14:32:42 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * error.c (name_err_receiver): raise ArgumentError if no receiver
+ is available on this exception object. [Feature #10881]
+
+Tue Jun 23 09:48:34 2015 Eric Wong <e@80x24.org>
+
+ * dir.c (check_dirname): avoid volatile, use return value
+ (dir_s_chroot, dir_s_mkdir, dir_s_rmdir): adjust callers
+
+Tue Jun 23 06:37:10 2015 Eric Wong <e@80x24.org>
+
+ * struct.c (struct_ivar_get): cache member definition in a subclass
+ Thanks to Sokolov Yura aka funny_falcon <funny.falcon@gmail.com>
+ in https://bugs.ruby-lang.org/issues/10585
+
+Tue Jun 23 04:58:06 2015 Eric Wong <e@80x24.org>
+
+ * benchmark/bm_vm2_struct_big_href_hi.rb: new benchmark
+ * benchmark/bm_vm2_struct_big_href_lo.rb: ditto
+ * benchmark/bm_vm2_struct_big_hset.rb: ditto
+ * benchmark/bm_vm2_struct_small_href.rb: ditto
+ * benchmark/bm_vm2_struct_small_hset.rb: ditto
+ Thanks to Sokolov Yura aka funny_falcon <funny.falcon@gmail.com>
+ in https://bugs.ruby-lang.org/issues/10585
+
+Mon Jun 22 18:08:48 2015 Naohisa Goto <ngotogenome@gmail.com>
+
+ * test/lib/test/unit.rb (Test::Unit::Parallel#start_watchdog): removed
+ because it has been meaningless since r36385. [Bug #11288]
+
+ * test/lib/test/unit.rb (Test::Unit::Parallel#_run_parallel): delete
+ lines related to the removed start_watchdog method
+
+Sun Jun 21 23:52:46 2015 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
+
+ * NEWS: mention about Array#bsearch_index and Hash#fetch_values.
+
+Sun Jun 21 23:46:27 2015 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
+
+ * NEWS: add a reference to a ticket.
+
+Sun Jun 21 20:28:09 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * internal.h (roomof): extract from type_roomof, and move from
+ bignum.c.
+
+Sun Jun 21 18:32:37 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ruby_atomic.h (ATOMIC_PTR_CAS): define by generic CAS macro, not
+ via size_t, to suppress a warning by mingw gcc.
+
+Sun Jun 21 05:31:41 2015 Shota Fukumori <her@sorah.jp>
+
+ * ext/objspace/objspace_dump.c(dump_object): Return empty JSON object when
+ passed object is a special const, instead of SEGV.
+ Based patch by Kohei Suzuki (eagletmt). [ruby-core:69692] [Bug #11291]
+
+ * test/objspace/test_objspace.rb(test_dump_special_consts): Test for above fix.
+
+
+Sat Jun 20 03:56:58 2015 Yusuke Endoh <mame@ruby-lang.org>
+
+ * enc/make_encmake.rb: the list of encoding extension libraries must
+ not include encinit.c itself. It caused "undefined reference to
+ Init_encinit".
+
+Sat Jun 20 02:03:53 2015 Naohisa Goto <ngotogenome@gmail.com>
+
+ * process.c (rb_execarg_parent_start1): new macro ALWAYS_NEED_ENVP
+ to generate envp_str anytime on Solaris 10 (or earlier version
+ of Solaris) to avoid calling execv() which is async-signal unsafe
+ on Solaris 10. [Bug #11265] [ruby-dev:49089]
+
+ * process.c (exec_with_sh, proc_exec_cmd): On Solaris 10,
+ because ALWAYS_NEED_ENVP is 1 and envp_str is always generated,
+ execv() in exec_with_sh() and proc_exec_cmd() are never called.
+ To guarantee this, execv() is replaced by a macro to print
+ out error message on Solaris 10.
+
+ * process.c (proc_exec_sh): Because proc_exec_sh() may be called
+ by rb_proc_exec() with envp_str = Qfalse, execl() is replaced
+ by a macro that calls execle() with "extern char **environ"
+ traditional global variable on Solaris 10.
+ TODO: This may be unsafe and should be changed in the future.
+ Although rb_proc_exec() is not used from inside current version
+ of ruby, it may be called by third-party extensions.
+
+Sat Jun 20 01:10:13 2015 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
+
+ * NEWS: mention about $SAFE.
+
+Fri Jun 19 14:53:35 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * proc.c (rb_mod_define_method): now requires a block direct to
+ this method call. [ruby-core:69655] [Bug #11283]
+
+Fri Jun 19 13:54:43 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * proc.c (rb_mod_define_method): get rid of inadvertent ID
+ creations at error.
+
+Fri Jun 19 07:58:11 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/extmk.rb: if no with-ext option is given, default to
+ enable everything. [ruby-dev:49108] [Bug #11280]
+
+Fri Jun 19 06:30:07 2015 Koichi Sasada <ko1@atdot.net>
+
+ * bootstraptest/test_method.rb: remove a test because $SAFE=2 was
+ obsolete.
+
+ Please check btest, too.
+
+Thu Jun 18 23:51:51 2015 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
+
+ * bin/erb: $SAFE=3 is obsolete.
+
+Thu Jun 18 23:45:11 2015 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
+
+ * safe.c: removed needless doc related $SAFE=2
+
+Thu Jun 18 23:38:07 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * thread.c (rb_thread_safe_level): fix document. $SAFE=3 is obsolete.
+ [ci skip]
+
+Thu Jun 18 23:25:51 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/extmk.rb: configure intersection of with-ext and not
+ without-ext, as withouts is no longer true by default if
+ with-ext option is given. [ruby-dev:49108] [Bug #11280]
+
+Thu Jun 18 23:20:46 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * include/ruby/ruby.h: $SAFE=2 is now obsolete.
+
+ * dir.c, ext/fiddle/handle.c, ext/socket/basicsocket.c, file.c
+ gc.c, io.c, process.c, safe.c, signal.c, win32/file.c:
+ removed code for $SAFE=2
+
+ * test/erb/test_erb.rb, test/fiddle/test_handle.rb
+ test/ruby/test_env.rb: removed tests for $SAFE=2.
+
+Thu Jun 18 22:50:07 2015 Yusuke Endoh <mame@ruby-lang.org>
+
+ * enc/make_encmake.rb: added --transes and --no-transes options.
+
+Thu Jun 18 18:24:12 2015 Eric Wong <e@80x24.org>
+
+ * test/socket/test_unix.rb: replace sleep with select
+
+Thu Jun 18 17:59:06 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm.c (rb_vm_control_frame_id_and_class): remove useless codes.
+ `me' knows ID and owner class.
+
+Thu Jun 18 16:58:35 2015 Koichi Sasada <ko1@atdot.net>
+
+ * method.h: constify rb_method_alias_struct::original_me and
+ rb_method_refined_struct::orig_me.
+
+ * class.c (move_refined_method): use RB_OBJ_WRITE() for
+ me->def->body.refined.orig_me.
+
+Thu Jun 18 14:35:28 2015 Koichi Sasada <ko1@atdot.net>
+
+ * ext/objspace/objspace.c (count_imemo_objects): support imemo_ment.
+
+Thu Jun 18 13:32:46 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * error.c (name_err_receiver): add NameError#receiver method.
+ [Feature #10881]
+
+Thu Jun 18 10:00:06 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * safe.c: removed needless doc related $SAFE=3
+
+Thu Jun 18 09:59:23 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * safe.c: rename old method name for $SAFE=3
+
+Thu Jun 18 06:02:42 2015 Eric Wong <e@80x24.org>
+
+ * compile.c (get_exception_sym2type, iseq_build_from_ary_body):
+ rely on %+PRIsVALUE instead of calling rb_inspect directly
+
+Wed Jun 17 20:59:25 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * common.mk (ENC_MK): needs fake.rb if cross compilation.
+ [ruby-dev:49098] [Bug #11272]
+
+Wed Jun 17 20:23:29 2015 Tanaka Akira <akr@fsij.org>
+
+ * ext/rbconfig/sizeof/extconf.rb: Check __float80.
+
+Wed Jun 17 15:15:53 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * safe.c (safe_setter): of course, don't have to warn the limitation of
+ $SAFE=3 after it's removed.
+
+Wed Jun 17 14:29:43 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * include/ruby/ruby.h: $SAFE=3 is now obsolete.
+
+ * ext/socket/init.c, ext/socket/socket.c, ext/socket/tcpsocket.c
+ ext/socket/udpsocket.c, gc.c, object.c, re.c, safe.c: removed code
+ for $SAFE=3
+
+ * bootstraptest/test_method.rb, test/erb/test_erb.rb, test/ruby/test_dir.rb
+ test/ruby/test_file.rb, test/ruby/test_method.rb, test/ruby/test_regexp.rb
+ test/ruby/test_thread.rb: remove tests for $SAFE=3
+
+Wed Jun 17 12:13:33 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * ChangeLog: added contributor name.
+
+Wed Jun 17 10:57:28 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * lib/csv.rb: accept to use Range object for row selection.
+ contributed by Mitsutaka Mimura.
+ [Feature #11267][ruby-dev:49091]
+
+Wed Jun 17 09:50:12 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/rdoc/servlet.rb (documentation_search, root_search):
+ requires json for JSON.dump and fix sporadic failures due to
+ the loading order.
+
+Tue Jun 16 19:19:53 2015 Tanaka Akira <akr@fsij.org>
+
+ * ext/rbconfig/sizeof/extconf.rb: Check several types defined in C99
+ and x86_64 ABI.
+
+ * template/sizes.c.tmpl: Relax a pattern for types.
+
+Tue Jun 16 17:37:01 2015 Koichi Sasada <ko1@atdot.net>
+
+ * test/objspace/test_objspace.rb: relax pattern because uncollectible
+ flag and marked flag can be false at major GC.
+ [Bug #10852]
+
+Tue Jun 16 04:50:44 2015 Eric Wong <e@80x24.org>
+
+ * ext/socket/basicsocket.c (bsock_recv): document outbuf
+ * ext/socket/unixsocket.c (unix_recvfrom): ditto
+ * ext/socket/init.c (rsock_strbuf, recvfrom_locktmp): new functions
+ (rsock_s_recvfrom): support destination buffer as 3rd arg
+ (rsock_s_recvfrom_nonblock): ditto
+ * string.c (rb_str_locktmp_ensure): export for internal ext
+ * test/socket/test_nonblock.rb: test recv_nonblock
+ * test/socket/test_unix.rb: test recv
+ [ruby-core:69543] [Feature #11242]
+
+Tue Jun 16 04:38:02 2015 Eric Wong <e@80x24.org>
+
+ * ext/socket/ancdata.c (bsock_sendmsg_internal,
+ bsock_recvmsg_internal):
+ support "exception: false" kwarg
+ * ext/socket/init.c (rsock_s_recvfrom_nonblock):
+ ditto
+ * ext/socket/init.c (rsock_s_recvfrom_nonblock): use rsock_opt_false_p
+ * ext/socket/socket.c (sock_connect_nonblock): ditto
+ * ext/socket/rubysocket.h (rsock_opt_false_p): new function
+ * ext/socket/basicsocket.c (bsock_recv_nonblock): update rdoc
+ * ext/socket/udpsocket.c (udp_recvfrom_nonblock): ditto
+ * test/socket/test_nonblock.rb: new tests
+ [ruby-core:69542] [Feature #11229]
+
+Mon Jun 15 14:33:02 2015 Akinori MUSHA <knu@iDaemons.org>
+
+ * lib/set.rb: Make Set#each and SortedSet#each generate a sized
+ enumerator. [GH-931] by kachick (Kenichi Kamiya)
+
+ * test/test_set.rb: Import tests from Set into SortedSet. [GH-931]
+ by kachick (Kenichi Kamiya)
+
+Mon Jun 15 02:26:34 2015 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * lib/net/http.rb (Net::HTTP#connect): use connect_nonblock and
+ io/wait to eliminate timeout use. fix GH-899
+
+Sat Jun 13 07:21:18 2015 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * thread.c (thread_start_func_2): don't interrupt when last thread
+ exit unless main thread is already exited. Otherwise main thread
+ could be wrongly interrupted when it uses rb_thread_call_without_gvl().
+ Patch by Takehiro Kubo. [Bug #11237][ruby-dev:49044][GH-898]
+
+ * test/-ext-/gvl/test_last_thread.rb: new test for the above fix.
+
+ * ext/-test-/gvl/call_without_gvl/call_without_gvl.c: new ext for
+ the above test.
+ * ext/-test-/gvl/call_without_gvl/extconf.rb: ditto.
+
+Mon Jun 15 00:14:33 2015 Tanaka Akira <akr@fsij.org>
+
+ * ext/pathname/lib/pathname.rb (descend): Blockless form supported.
+ (ascend): Ditto.
+ [ruby-core:68820] [Feature #11052] Patch by Piotr Szotkowski.
+
+Sun Jun 14 20:09:25 2015 Tanaka Akira <akr@fsij.org>
+
+ * time.c (time_getlocaltime): [DOC] Add examples of valid utc_offset
+ formats.
+ [ruby-core:68306] [Misc #10905] Patch by Charles Korn.
+
+Sun Jun 14 18:49:56 2015 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/raddrinfo.c (parse_numeric_port): Detect
+ port overflow.
+ (numeric_getaddrinfo): Use parse_numeric_port.
+ numeric_getaddrinfo fails if port is too big now.
+ This makes rb_getaddrinfo invokes the real getaddrinfo()
+ on such condition.
+ This change is related to [ruby-core:69355] [Bug #11179].
+
+Sun Jun 14 17:26:03 2015 Tanaka Akira <akr@fsij.org>
+
+ * enum.c (enum_chunk_while): New method Enumerable#chunk_while.
+ [ruby-core:67738] [Feature #10769] proposed by Tsuyoshi Sawada.
+
+Sun Jun 14 17:20:40 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * file.c (rb_file_load_ok): try opening file without gvl not to
+ lock entire process. [Bug #11060]
+
+Sun Jun 14 10:43:50 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * tool/runruby.rb: just remove the lines of RUBY_VERSION check and raise
+ instead of replacing the check to `true`, for getting rid of a
+ warning `possibly useless use of true in void context`.
+
+Sun Jun 14 10:13:55 2015 Kouhei Sutou <kou@cozmixng.org>
+
+ * lib/rexml/source.rb (REXML::IOSource#scan): Fix a typo in
+ document. [fix GH-934]
+ Patch by Anton Davydov. Thanks!!!
+
+Sun Jun 14 10:09:48 2015 Kouhei Sutou <kou@cozmixng.org>
+
+ * lib/rexml/attlistdecl.rb (REXML::AttlistDecl): Fix a typo in
+ document. [fix GH-934]
+ Patch by Anton Davydov. Thanks!!!
+
+Sun Jun 14 06:24:57 2015 Benoit Daloze <eregontp@gmail.com>
+
+ * test/ruby/test_io.rb: add test for IO.binread fd leak.
+ See r50881.
+
+Sun Jun 14 05:23:51 2015 Benoit Daloze <eregontp@gmail.com>
+
+ * io.c (rb_io_s_binread): close fd if seek offset is invalid.
+
+Sun Jun 14 04:40:32 2015 Benoit Daloze <eregontp@gmail.com>
+
+ * test/lib/leakchecker.rb (check): refactor.
+
+Sun Jun 14 04:34:14 2015 Benoit Daloze <eregontp@gmail.com>
+
+ * test/lib/leakchecker.rb: Return false for no leaks.
+ Otherwise the GC could run for nothing.
+
+Sun Jun 14 04:15:40 2015 Benoit Daloze <eregontp@gmail.com>
+
+ * lib/delegate.rb: [DOC] Update SimpleDelegator example. [ci skip]
+
+Sat Jun 13 20:28:14 2015 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * file.c (rb_stat_ino): get inode from the interval of struct st.
+
+ * win32/win32.c (stati64_set_inode): get nFileIndexHigh/Low, and set it
+ to the interval of struct st as inode.
+ [Feature #11216]
+
+ * win32/win32.c (stati64_set_inode_handle): call stati64_set_inode.
+
+ * win32/win32.c (rb_w32_fstati64): call stati64_set_inode_handle.
+
+ * win32/win32.c (stati64_handle): call stati64_set_inode.
+
+Sat Jun 13 19:44:53 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * ext/io/console/depend (.list.chksum): revert a part of r50859, because
+ it was not mentioned at its commit log and it caused a build error on
+ Windows ($(MAKE) is already quoted).
+
+Sat Jun 13 17:35:11 2015 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * vm_core.h (rb_thread_t): add th->name.
+
+ * vm.c (th_init): initialize th->name.
+
+ * thread.c (Init_Thread): add Thread.name and name=. [Feature #11251]
+
+ * thread.c (rb_thread_inspect): show thread's name if set.
+
+ * thread.c (rb_thread_getname): defined.
+
+ * thread.c (rb_thread_setname): ditto.
+
+Sat Jun 13 11:39:43 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * lib/tempfile.rb: Fix typo. [fix GH-933] Patch by @Zorbash
+
+Sat Jun 13 11:38:00 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * ext/openssl/ossl_ocsp.c: fix documentation on ocsp response cert status.
+ [fix GH-932] Patch by @chrisholmes
+
+Sat Jun 13 11:35:19 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * ext/bigdecimal/bigdecimal.gemspec: Fix require paths for released gem.
+ [fix GH-929] Patch by @voxik
+ * ext/io/console/io-console.gemspec: ditto.
+
+Sat Jun 13 00:45:08 2015 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
+
+ * lib/prime.rb: Return sized enumerators.
+ Patch by Kenichi Kamiya [GH-931]
+
+Sat Jun 13 00:45:06 2015 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
+
+ * lib/prime.rb: Fix with_object with no block given
+
+Sat Jun 13 00:44:59 2015 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
+
+ * lib/prime.rb: Have with_index accept an offset parameter.
+ Based on patch by T Yamada. [#11007]
+
+Fri Jun 12 22:21:12 2015 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
+
+ * test/ruby/test_extlibs.rb (TestExtLibs::check_existence): fix
+ error. [Bug #11255] [ruby-dev:49079]
+
+Fri Jun 12 21:17:46 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * pack.c (pack_{un,}pack): new template character `j` and `J`, pointer
+ with signed and unsigned integers.
+
+ * NEWS: mention about this feature.
+ [Feature #11215] [ruby-dev:49015]
+
+Fri Jun 12 21:01:44 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * file.c (File::SHARE_DELETE): new flag to be able to delete opened file
+ on Windows.
+
+ * include/win32/win32.c (O_SHARE_DELETE): new pseudo file mode flag.
+
+ * win32/win32.c (rb_w32_{w,}open): support above flag. [EXPERIMENTAL]
+
+ * NEWS: mention about this feature.
+ [Feature #11218] [ruby-dev:49022]
+
+Fri Jun 12 18:21:45 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * ChangeLog: added missing commit message.
+
+Fri Jun 12 18:20:37 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * sample/exyacc.rb: Fix some typos. [fix GH-927] Patch by @davydovanton
+ * sample/list.rb: ditto.
+ * sample/trick2013/kinaba/remarks.markdown: ditto.
+
+Fri Jun 12 17:34:14 2015 Wojciech Mach <wojtek@wojtekmach.pl>
+
+ * hash.c (rb_hash_fetch_values): add `Hash#fetch_values`.
+ [Feature #10017] [Fix GH-776]
+
+Fri Jun 12 16:28:17 2015 Radan Skoric <radan.skoric@gmail.com>
+
+ * array.c (rb_ary_bsearch_index): Implement Array#bsearch_index
+ method, which is similar to bsearch and returns the index or
+ nil. [Feature #10730]
+
+Thu Jun 11 19:11:22 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * ext/zlib/zlib.c: Fix indentation for rdoc.
+ [Bug #11221][ruby-core:69465]
+
+Thu Jun 11 16:23:37 2015 Koichi Sasada <ko1@atdot.net>
+
+ * method.h (METHOD_ENTRY_BASIC_SET): fix last commit (unbalanced parens).
+
+Thu Jun 11 15:14:16 2015 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * configure.in: define SET_THREAD_NAME if it has pthread_set_name_np
+ for FreeBSD, and don't define it if both pthread_setname_np
+ and pthread_set_name_np don't exist.
+
+ * thread_pthread.c (SET_THREAD_NAME): don't define if they don't exist.
+
+ * thread_pthread.c (native_set_thread_name): run if SET_THREAD_NAME
+ is defined.
+
+Thu Jun 11 15:53:31 2015 Koichi Sasada <ko1@atdot.net>
+
+ * method.h (METHOD_ENTRY_BASIC_SET): should clear last bit.
+
+Thu Jun 11 14:34:45 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * lib/rubygems.rb: bump version to 2.4.7 and 2.4.8. these versions fixed
+ CVE-2015-3900.
+ * lib/rubygems/remote_fetcher.rb: ditto.
+ * test/rubygems/test_gem_remote_fetcher.rb: added testcase for CVE-2015-3900
+
+Thu Jun 11 14:18:51 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * lib/rubygems.rb: bump version to 2.4.6. It's missing change at r49774.
+
+Thu Jun 11 13:50:19 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * array.c (ary_ensure_room_for_push): check if array size will
+ exceed maximum size to get rid of buffer overflow.
+ [ruby-dev:49043] [Bug #11235]
+
+ * array.c (ary_ensure_room_for_unshift, rb_ary_splice): ditto.
+
+Thu Jun 11 13:17:34 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * test/test_cmath.rb (TestCMath#test_trigonometric_functions): should
+ not compare float values (in complex values) by `==`.
+
+Thu Jun 11 08:52:01 2015 Koichi Sasada <ko1@atdot.net>
+
+ * method.h: embed rb_method_entry_t::attr::flags (5 bits) into
+ rb_method_entry_t::flags to make one word spare space.
+
+ Add some macros to access these flags.
+
+ * vm_method.c: use these macros.
+
+ * internal.h: define IMEMO_FL_USHIFT and IMEMO_FL_USER[0-4]
+ for T_IMEMO local flags.
+
+Thu Jun 11 08:27:06 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm.c: use VM_ASSERT instead of assert().
+
+ * vm_args.c: ditto.
+
+ * vm_insnhelper.c: ditto.
+
+ * vm_method.c: ditto.
+
+Thu Jun 11 08:16:48 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_core.h: define VM_ASSERT() for assertion
+ enabled only when (VM_CHECK_MODE > 0).
+
+ * vm_insnhelper.c: move definition VM_CHECK_MODE
+ from vm_insnhelper.c to vm_core.h.
+
+ * vm.c: remove <assert.h>
+
+Thu Jun 11 06:46:07 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_insnhelper.c (check_frame): check type of cref_or_me first.
+
+Thu Jun 11 04:34:39 2015 Kazuki Tanaka <gogotanaka@ruby-lang.org>
+
+ * test/test_cmath.rb: Add some assertions.
+
+Thu Jun 11 00:34:39 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * template/fake.rb.in: expanded macro result may have spaces
+ between tokens. [ruby-dev:49047] [Bug #11243]
+
+Wed Jun 10 22:27:32 2015 Naohisa Goto <ngotogenome@gmail.com>
+
+ * lib/mkmf.rb: revert r50804 because of build failure when specifying
+ LDFLAGS during configure, observed on Solaris with GCC 4.6.
+ [Bug #11245]
+
+Wed Jun 10 21:59:51 2015 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
+
+ * README.ja.md: fix markup miss.
+
+Wed Jun 10 11:06:25 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * template/fake.rb.in: turn into erb template from autoconf
+ template to fake more accurately.
+
+ * common.mk (fake.rb): needs preprocessed file now.
+
+ * version.c (Init_version): add dummy expression to
+ RUBY_ENGINE_VERSION.
+
+Tue Jun 9 12:31:25 2015 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
+
+ * lib/prime.rb: Simplify and optimize EratosthenesSieve
+
+Tue Jun 9 11:45:00 2015 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
+
+ * lib/prime.rb: Simplify and optimize EratosthenesSieve
+ based on patch by Ajay Kumar. [Fixes GH-921]
+
+Mon Jun 8 05:09:58 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (obj_info): print method id for T_IMEMO/ment.
+
+Sun Jun 7 07:05:43 2015 Kazuki Tanaka <gogotanaka@ruby-lang.org>
+
+ * Move test cases from test/ruby/test_complex.rb to test/test_cmath.rb
+
+Sat Jun 6 18:23:41 2015 Koichi Sasada <ko1@atdot.net>
+
+ * method.h: back to share rb_method_definition_t by
+ rb_method_entry_t.
+
+ r50728 changed sharing `def's to isolating `def's
+ on alias and so on. However, this change conflicts
+ future improvement plan. So I change back to sharing approach.
+
+ * method.h: move rb_method_definition_t::flags to
+ rb_method_entry_t::attr::flags.
+
+ rb_method_entry_t::attr is union with VALUE because this field
+ should have same size of VALUE. rb_method_entry_t is T_IMEMO).
+
+ And also add the following access macros to it's fields.
+
+ * METHOD_ENTRY_VISI(me)
+ * METHOD_ENTRY_BASIC(me)
+ * METHOD_ENTRY_SAFE(me)
+
+ * vm_method.c (rb_method_definition_addref): added instead of
+ rb_method_definition_clone().
+
+ Do not create new definition, but increment alias_count.
+
+ * class.c (clone_method): catch up this fix.
+
+ * class.c (method_entry_i): ditto.
+
+ * proc.c (mnew_internal): ditto.
+
+ * proc.c (mnew_missing): ditto.
+
+ * vm_eval.c: ditto.
+
+ * vm_insnhelper.c: ditto.
+
+ * vm_method.c: ditto.
+
+Sat Jun 6 15:59:38 2015 Koichi Sasada <ko1@atdot.net>
+
+ * class.c: ins_methods_push() needs rb_method_visibility_t type on
+ 2nd arg.
+
+Sat Jun 6 15:05:47 2015 Koichi Sasada <ko1@atdot.net>
+
+ * class.c (ins_methods_push): Change type and name of parameters
+ to make more clear.
+
+Sat Jun 6 08:52:13 2015 Eric Wong <e@80x24.org>
+
+ * test/socket/test_nonblock.rb: try to avoid EMSGSIZE
+ [ruby-core:69466]
+
+Sat Jun 6 07:58:30 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: remove struct mark_tbl_arg and pass objspace directly
+ to avoid indirect access overhead.
+
+Sat Jun 6 07:08:45 2015 Eric Wong <e@80x24.org>
+
+ * ext/socket/ancdata.c (bsock_sendmsg_internal): drop redundant assignment
+
+Sat Jun 6 01:00:06 2015 Naohisa Goto <ngotogenome@gmail.com>
+
+ * ext/socket/ancdata.c (bsock_sendmsg_internal): all arguments are
+ parsed even on systems without HAVE_STRUCT_MSGHDR_MSG_CONTROL
+ to prevent SEGV caused by passing Qnil to RARRAY_LENINT and
+ to preserve behavior before r50776.
+ [Bug #11224] [ruby-core:69468] [Bug #11225] [ruby-core:69469]
+
+Fri Jun 5 22:37:42 2015 Koichi Sasada <ko1@atdot.net>
+
+ * class.c (ins_methods_push): change 3rd parameter's type
+ from long to rb_method_visibility_t.
+
+ * class.c (ins_methods_i): catch up this fix.
+
+ * class.c (method_entry_i): cast to st_data_t instead of `long'.
+
+Fri Jun 5 20:37:10 2015 Koichi Sasada <ko1@atdot.net>
+
+ * internal.h: move definition of rb_cref_t to method.h.
+
+ * eval_intern.h: move definition of rb_scope_visibility_t
+ to method.h.
+
+ * method.h: change rb_cref_t::scope_visi from VALUE to
+ rb_scope_visibility_t.
+ [Bug #11219]
+
+ * vm.c (vm_cref_new): accept rb_method_visibility_t directly.
+
+ * vm_insnhelper.c (rb_vm_rewrite_cref): don't use 0,
+ but METHOD_VISI_UNDEF.
+
+ * vm_method.c (rb_scope_visibility_set): don't need to use cast.
+
+ * vm_method.c (rb_scope_module_func_set): ditto.
+
+Fri Jun 5 17:27:30 2015 Eric Wong <e@80x24.org>
+
+ * ext/socket/ancdata.c (bsock_sendmsg_internal): avoid msg_control
+ ptr if msg_controllen is zero to fix portability problems.
+
+Fri Jun 5 09:17:45 2015 Eric Wong <e@80x24.org>
+
+ * ext/socket/ancdata.c (bsock_sendmsg_internal): fix build error
+ from r50776
+
+Fri Jun 5 07:05:58 2015 Eric Wong <e@80x24.org>
+
+ * io.c (sym_wait_readable, sym_wait_writable): declare
+ (io_getpartial): use sym_wait_readable
+ (io_write_nonblock): use sym_wait_writable
+ (Init_IO): initialize sym_wait_*able
+
+Fri Jun 5 06:43:00 2015 Eric Wong <e@80x24.org>
+
+ * doc/extension.rdoc: note rb_get_kwargs changes keywords_hash
+ [ruby-core:68507]
+
+Fri Jun 5 05:50:29 2015 Eric Wong <e@80x24.org>
+
+ * ext/socket/ancdata.c (bsock_sendmsg_internal): use rb_scan_args
+ [ruby-core:69439] [Feature #11207]
+
+Fri Jun 5 02:20:06 2015 Koichi Sasada <ko1@atdot.net>
+
+ * test/lib/envutil.rb (assert_no_memory_leak): change default value
+ of limit from 1.5 to 2.0. It is ad-hoc fix to solve test failure
+ in travis-ci.
+
+Fri Jun 5 01:17:21 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_insnhelper.c (vm_defined): no need to use cast.
+
+Fri Jun 5 01:14:02 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_insnhelper.c (vm_defined): show additional messages on rb_bug().
+
+Fri Jun 5 01:06:02 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_method.c (rb_add_method_iseq): use intermediate struct to
+ avoid initializing struct with variables.
+ [Bug #11217]
+
+ * method.h: add a comment about it.
+
+Fri Jun 5 00:55:21 2015 Koichi Sasada <ko1@atdot.net>
+
+ * method.h: constify rb_method_refined_t::orig_me.
+
+ Also constify the following functions.
+
+ * rb_resolve_refined_method()
+ * rb_method_entry_with_refinements()
+ * rb_method_entry_without_refinements()
+ * rb_method_entry_copy()'s parameter.
+
+ * class.c: catch up this fix.
+
+ * vm_insnhelper.c: ditto.
+
+ * vm_method.c: ditto.
+
+Thu Jun 4 12:47:54 SGT 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * array.c: Revert r50763. because "reentered" is not typo.
+
+Thu Jun 4 11:12:29 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * ext/win32ole/win32ole.c: fix a typo. Patch by @davydovanton
+ [fix GH-923]
+ * include/ruby/st.h: ditto.
+ * include/ruby/util.h: ditto.
+
+Thu Jun 4 10:54:30 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * array.c: fix a typo. Patch by @manish-shrivastava
+ [fix GH-922]
+
+Thu Jun 4 09:52:02 2015 Eric Wong <e@80x24.org>
+
+ * ext/openssl/lib/openssl/ssl.rb: use io/nonblock instead of fcntl
+ [ruby-core:69382] [Feature #11190]
+
+Thu Jun 4 07:22:45 2015 Koichi Sasada <ko1@atdot.net>
+
+ * method.h: introduce rb_method_refined_t for refined method entry.
+
+ * class.c (move_refined_method): catch up this fix.
+
+ * gc.c (mark_method_entry): ditto.
+
+ * vm_eval.c (vm_call0_body): ditto.
+
+ * vm_insnhelper.c (vm_call_method): ditto.
+
+ * vm_method.c: ditto.
+
+Thu Jun 4 07:12:20 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * dir.c (dirent_match): match short names only when FNM_SHORTNAME
+ flag is given, for the backward compatibility, and the new
+ behavior is often dangerous. [ruby-core:69435] [Bug #11206]
+
+Thu Jun 4 05:44:01 2015 Eric Wong <e@80x24.org>
+
+ * variable.c (special_generic_ivar): remove flag
+ (givar_i, rb_mark_generic_ivar_tbl): remove functions
+ (rb_free_generic_ivar, rb_ivar_lookup, rb_ivar_delete,
+ generic_ivar_set, rb_ivar_set, rb_ivar_defined,
+ rb_copy_generic_ivar, rb_ivar_foreach, rb_ivar_count,
+ rb_obj_remove_instance_variable):
+ adjust for lack of ivar support in special constants
+ * test/ruby/test_variable.rb: test ivars for special consts
+ * internal.h: remove rb_mark_generic_ivar_tbl decl
+ * gc.c (gc_mark_roots): remove rb_mark_generic_ivar_tbl call
+ [ruby-core:69441] [Feature #11208]
+
+Thu Jun 4 05:13:34 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_insnhelper.c (def_iseq_ptr): `iseqval' is not available any more.
+
+Thu Jun 4 04:50:12 2015 Koichi Sasada <ko1@atdot.net>
+
+ * class.c (method_entry_i): mtbl should not have `me' as NULL.
+
+Thu Jun 4 04:28:45 2015 Koichi Sasada <ko1@atdot.net>
+
+ * class.c (clone_method): do not use me->klass, but use explicitly
+ passed argument.
+
+Thu Jun 4 04:10:43 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_core.h (rb_vm_rewrite_cref_stack): rename to rb_vm_rewrite_cref().
+
+ * class.c (clone_method): use renamed name.
+
+ * vm_insnhelper.c (rb_vm_rewrite_cref): do not use `node' in variable
+ names.
+
+Wed Jun 3 23:03:50 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_method.c: rename `rb_frame_...' to `rb_scope_...'.
+
+ * eval_intern.h: move decl. of rb_scope_visibility_set() to method.h.
+
+ * load.c: catch up this fix.
+
+Wed Jun 3 21:14:20 2015 Tanaka Akira <akr@fsij.org>
+
+ * ext/rbconfig/sizeof/extconf.rb: Check C99 standard integer types.
+
+Wed Jun 3 21:00:47 2015 Tanaka Akira <akr@fsij.org>
+
+ * configure.in: Don't check __int128.
+
+ * ext/rbconfig/sizeof/extconf.rb: Check __int128.
+
+ * ext/rbconfig/sizeof/depend: sizes.c depends on
+ ext/rbconfig/sizeof/extconf.rb.
+
+ * template/sizes.c.tmpl: Detect check_sizeof.
+
+Wed Jun 3 20:07:07 2015 Koichi Sasada <ko1@atdot.net>
+
+ * class.c (clone_method): remove redundant check for me->def != NULL.
+ Now, all `me` have `me->def`.
+
+ * proc.c (rb_method_entry_location): ditto.
+
+ * vm.c (rb_vm_check_redefinition_opt_method): ditto.
+
+ * vm.c (add_opt_method): ditto.
+
+ * vm_eval.c (vm_call0_body): ditto.
+
+Wed Jun 3 19:24:12 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_core.h: rename enum missing_reason to enum method_missing_reason.
+
+ * vm_core.h: use enum method_missing_reason for
+ rb_thread_t::method_missing_reason.
+
+ * vm_eval.c: catch up this fix.
+
+ * vm_insnhelper.c: ditto.
+
+Wed Jun 3 16:17:21 2015 Aaron Patterson <tenderlove@ruby-lang.org>
+
+ * vm.c: eagerly allocate `loading_table`. This eliminates the need to
+ do NULL checks when looking up the `loading_table` hash.
+ https://github.com/ruby/ruby/pull/918
+
+ * load.c: remove various NULL checks
+
+Wed Jun 3 11:47:15 2015 Koichi Sasada <ko1@atdot.net>
+
+ * method.h: change fields order to gather frequent access fields.
+
+ * vm_insnhelper.c (vm_call_method): add LIKELY().
+
+Wed Jun 03 10:35:45 2015 Koichi Sasada <ko1@atdot.net>
+
+ * method.h: split rb_method_definition_t::flag to several flags.
+
+ `flag' contains several categories of attributes and it makes us
+ confusion (at least, I had confused).
+
+ * rb_method_visibility_t (flags::visi)
+ * NOEX_UNDEF -> METHOD_VISI_UNDEF = 0
+ * NOEX_PUBLIC -> METHOD_VISI_PUBLIC = 1
+ * NOEX_PRIVATE -> METHOD_VISI_PRIVATE = 2
+ * NOEX_PROTECTED -> METHOD_VISI_PROTECTED = 3
+ * NOEX_SAFE(flag) -> safe (flags::safe, 3 bits)
+ * NOEX_BASIC -> basic (flags::basic, 1 bit)
+ * NOEX_MODFUNC -> rb_scope_visibility_t in CREF
+ * NOEX_SUPER -> MISSING_SUPER (enum missing_reason)
+ * NOEX_VCALL -> MISSING_VCALL (enum missing_reason)
+ * NOEX_RESPONDS -> BOUND_RESPONDS (macro)
+
+ Now, NOEX_NOREDEF is not supported (I'm not sure it is needed).
+
+ Background:
+ I did not know what "NOEX" stands for.
+ I asked Matz (who made this name) and his answer was "Nothing".
+ "At first, it meant NO EXport (private), but the original
+ meaning was gone."
+ This is why I remove the mysterious word "NOEX" from MRI.
+
+ * vm_core.h: introduce `enum missing_reason' to represent
+ method_missing (NoMethodError) reason.
+
+ * eval_intern.h: introduce rb_scope_visibility_t to represent
+ scope visibility.
+ It has 3 method visibilities (public/private/protected)
+ and `module_function`.
+
+Wed Jun 3 08:06:30 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * gem/bundled_gems: updated to test-unit 3.1.1 and minitest 5.7.0.
+
+Wed Jun 3 04:48:05 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_insnhelper.c (vm_defined): check respond_to_missing?
+ at defined?(func()).
+ [Bug #11212]
+
+ * test/ruby/test_defined.rb: add a test for this fix.
+
+Wed Jun 3 04:34:39 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_insnhelper.c (vm_defined): skip respond_to_missing? when
+ a method is available.
+ [Bug #11211]
+
+ * test/ruby/test_defined.rb: add a test for this fix.
+
+Wed Jun 3 04:14:13 2015 Koichi Sasada <ko1@atdot.net>
+
+ * insns.def (defined), vm_insnhelper.c (vm_defined):
+ move instruction body to the vm_defined() function.
+
+Wed Jun 3 02:29:25 2015 Benoit Daloze <eregontp@gmail.com>
+
+ * test/ruby/test_module.rb: Do not assume class variable order.
+ Patch by @enebo.
+
+Wed Jun 3 01:10:38 2015 Yusuke Endoh <mame@tsg.ne.jp>
+
+ * vm_method.c (rb_method_definition_set): remove a double assignment.
+ Coverity Scan found this bug.
+
+Wed Jun 3 00:04:51 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_method.c (rb_alias): rename parameter names.
+
+Tue Jun 2 23:27:18 2015 Koichi Sasada <ko1@atdot.net>
+
+ * method.h: remove rb_method_iseq_t::iseqval.
+ While making a r50728, iseqval is needed (to mark correctly),
+ but now just iseqptr is enough.
+
+ * class.c: catch up this fix.
+
+ * gc.c: ditto.
+
+ * proc.c: ditto.
+
+ * vm_method.c: ditto.
+
+Tue Jun 2 21:29:28 2015 Koichi Sasada <ko1@atdot.net>
+
+ * proc.c (proc_curry): remove a debug line.
+
+Tue Jun 2 12:43:46 2015 Koichi Sasada <ko1@atdot.net>
+
+ * method.h: make rb_method_entry_t a VALUE.
+ Motivation and new data structure are described in [Bug #11203].
+
+ This patch also solve the following issues.
+
+ * [Bug #11200] Memory leak of method entries
+ * [Bug #11046] __callee__ returns incorrect method name in orphan
+ proc
+
+ * test/ruby/test_method.rb: add a test for [Bug #11046].
+
+ * vm_core.h: remove rb_control_frame_t::me. me is located at value
+ stack.
+
+ * vm_core.h, gc.c, vm_method.c: remove unlinked_method... codes
+ because method entries are simple VALUEs.
+
+ * method.h: Now, all method entries has own independent method
+ definitions. Strictly speaking, this change is not essential,
+ but for future changes.
+
+ * rb_method_entry_t::flag is move to rb_method_definition_t::flag.
+ * rb_method_definition_t::alias_count is now
+ rb_method_definition_t::alias_count_ptr, a pointer to the counter.
+
+ * vm_core.h, vm_insnhelper.c (rb_vm_frame_method_entry) added to
+ search the current method entry from value stack.
+
+ * vm_insnhelper.c (VM_CHECK_MODE): introduced to enable/disable
+ assertions.
+
+Tue Jun 2 10:46:36 2015 Eric Wong <e@80x24.org>
+
+ * test/socket/test_nonblock.rb: new test for sendmsg_nonblock
+
+Tue Jun 2 09:04:14 2015 Eric Wong <e@80x24.org>
+
+ * lib/benchmark.rb: just use Process::CLOCK_MONOTONIC
+ [ruby-core:69390]
+
+Mon Jun 1 22:01:27 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/mkmf.rb (pkg_config): split --libs if --libs-only-l option
+ is not available. patch in [ruby-core:69428] by Hans Mackowiak.
+ [ruby-core:69421] [Bug #11201]
+
+Mon Jun 1 21:18:24 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_mark_children): remove a garbage character
+ introduced at the last commit.
+
+Mon Jun 1 19:24:42 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_method.c (rb_method_entry_make): do not show warning message
+ when method_entry is an alias.
+
+Mon Jun 1 15:47:16 2015 Koichi Sasada <ko1@atdot.net>
+
+ * internal.h: move class related definitions.
+
+Mon Jun 1 15:43:03 2015 Koichi Sasada <ko1@atdot.net>
+
+ * class.c: remove needless include pragma for method.h.
+
+ * struct.c: ditto.
+
+ * vm_method.c: ditto.
+
+Mon Jun 1 05:42:00 2015 Koichi Sasada <ko1@atdot.net>
+
+ * eval_intern.h, vm_method.c: move macros to functions.
+ * SCOPE_TEST(f) -> rb_frame_visibility_test(flag).
+ * SCOPE_CHECK(f) -> rb_frame_visibility_check(flag).
+ * SCOPE_SET(f) -> rb_frame_visibility_set(flag).
+
+ * load.c (load_ext): use it.
+
+Mon Jun 1 04:47:37 2015 Zachary Scott <e@zzak.io>
+
+ * ext/date/date_core.c: [DOC] Add comparison of Time and DateTime
+ Patch provided by @pixeltrix
+
+Mon Jun 1 04:22:09 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_core.h (VM_FRAME_MAGIC_DUMMY): introduce new frame type to
+ recognize dummy frame.
+
+ * vm.c (th_init): use new frame type.
+
+ * vm_args.c (raise_argument_error): ditto.
+
+Mon Jun 1 04:15:42 2015 Koichi Sasada <ko1@atdot.net>
+
+ * class.c (rb_class_has_methods): added to reduce dependency
+ to internal class data structure.
+
+ * internal.h: ditto.
+
+ * hash.c (has_extra_methods): use added function.
+
+Mon Jun 1 04:11:48 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c , gc.h (rb_obj_info): export obj_info(VALUE) for debugging.
+
+Mon Jun 1 03:52:55 2015 Koichi Sasada <ko1@atdot.net>
+
+ * test/ruby/test_gc.rb: increase timeout seconds for GC stressful
+ debugging.
+
+Sun May 31 04:18:06 2015 Koichi Sasada <ko1@atdot.net>
+
+ * method.h: fix typo of comments.
+
+Sun May 31 03:36:42 2015 Koichi Sasada <ko1@atdot.net>
+
+ * method.h: add VM_METHOD_TYPE_ALIAS rb_method_definition_t::type
+ to fix [Bug #11173].
+
+ Now, inter class/method alias creates new method entry
+ VM_METHOD_TYPE_ALIAS, which has an original method entry.
+
+ * vm_insnhelper.c (find_defined_class_by_owner): added.
+ Search corresponding defined_class from owner class/module.
+
+ * vm_method.c (rb_method_entry_get_without_cache): return me->klass
+ directly for defined_class.
+
+ Now, no need to check me->klass any more.
+
+ * vm_method.c (method_entry_set0): separated from method_entry_set().
+
+ * vm_method.c (rb_alias): make method entry has VM_METHOD_TYPE_ALIAS.
+
+ * vm_method.c (release_method_definition): support VM_METHOD_TYPE_ALIAS.
+
+ * vm_method.c (rb_hash_method_definition): ditto.
+
+ * vm_method.c (rb_method_definition_eq): ditto.
+
+ * vm_method.c (release_method_definition): ditto.
+
+ * vm_insnhelper.c (vm_call_method): ditto.
+
+ * vm_insnhelper.c (vm_method_cfunc_entry): ditto.
+
+ * vm_eval.c (vm_call0_body): ditto.
+
+ * gc.c (mark_method_entry): ditto.
+
+ * proc.c (method_def_iseq): ditto.
+
+ * proc.c (method_cref): ditto.
+
+ * proc.c (rb_method_entry_min_max_arity): ditto.
+
+ * test/ruby/test_alias.rb: add tests.
+
+ * test/ruby/test_module.rb: fix a test to catch up current behavior.
+
+Sun May 31 03:34:25 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_method.c (rb_unlink_method_entry): make it static.
+
+Sun May 31 03:26:58 2015 Koichi Sasada <ko1@atdot.net>
+
+ * method.h, vm_method.c (rb_free_method_entry): constify a parameter.
+
+ * vm_core.h: remove useless declaration about rb_unlink_method_entry().
+
+Sat May 30 18:05:02 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * lib/tempfile.rb (Remover#call): fixed wrong condition. introduced at
+ r50682.
+
+Sat May 30 16:12:35 2015 Eric Wong <e@80x24.org>
+
+ * ext/socket/ancdata.c: use RB_GC_GUARD instead of volatile
+ [ruby-core:69419] [Feature #11198]
+
+Sat May 30 15:59:10 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * lib/tempfile.rb (Tempfile#initialize): initialize @unlinked to fix
+ test failures introduced at r50682. I hope that check the results of
+ tests before committing, at least the tests about the changed feature.
+
+Sat May 30 11:02:55 2015 Martin Englund <martin@englund.nu>
+
+ * doc/dtrace_probes.rdoc: change lingering dtrace probe documentation
+ from function- to method-
+
+Sat May 30 10:26:09 2015 Masaki Matsushita <glass.saga@gmail.com>
+
+ * lib/tempfile.rb: refactoring.
+ * use warn instead of STDERR.print
+ * remove @tmpname and use @tmpfile.path
+ * introduce @unlinked flag
+ * Remover takes only @tmpfile
+ * mode will be modified just before file reopen
+
+Sat May 30 09:02:51 2015 Eric Wong <e@80x24.org>
+
+ * include/ruby/intern.h (rb_generic_ivar_table): deprecate
+ * internal.h (rb_attr_delete): declare
+ * marshal.c (has_ivars): use rb_ivar_foreach
+ (w_ivar): ditto
+ (w_object): update for new interface
+ * time.c (time_mload): use rb_attr_delete
+ * variable.c (generic_ivar_delete): implement
+ (rb_ivar_delete): ditto
+ (rb_attr_delete): ditto
+ [ruby-core:69323] [Feature #11170]
+
+Sat May 30 09:14:28 2015 Scott Francis <scott.francis@shopify.com>
+
+ * cont.c (cont_free): check if ruby_current_thread is still valid.
+ [Fix GH-914]
+
+Sat May 30 08:36:04 2015 Eric Wong <e@80x24.org>
+
+ * variable.c (static int special_generic_ivar): move
+ (rb_generic_ivar_table): rewrite for compatibility
+ (gen_ivtbl_bytes): new function
+ (generic_ivar_get): update to use ivar index
+ (generic_ivar_update): ditto
+ (generic_ivar_set): ditto
+ (generic_ivar_defined): ditto
+ (generic_ivar_remove): ditto
+ (rb_mark_generic_ivar): ditto
+ (givar_i): ditto
+ (rb_free_generic_ivar): ditto
+ (rb_mark_generic_ivar_tbl): ditto
+ (rb_generic_ivar_memsize): ditto
+ (rb_copy_generic_ivar): ditto
+ (rb_ivar_set): ditto
+ (rb_ivar_foreach): ditto
+ (rb_ivar_count): ditto
+ (givar_mark_i): remove
+ (gen_ivtbl_mark): new function
+ (gen_ivar_each): ditto
+ (iv_index_tbl_extend): update for struct ivar_update
+ (iv_index_tbl_newsize): ditto
+ [ruby-core:69323] [Feature #11170]
+
+Sat May 30 08:10:46 2015 Eric Wong <e@80x24.org>
+
+ * variable.c (iv_index_tbl_make): extract from rb_ivar_set
+ (iv_index_tbl_extend): ditto
+ (iv_index_tbl_newsize): ditto
+ (rb_ivar_set): use extracted functions
+ [ruby-core:69323] (Part 1)
+
+Fri May 29 17:39:14 2015 Koichi Sasada <ko1@atdot.net>
+
+ * tool/make_hgraph.rb: added.
+
+Fri May 29 14:39:00 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * compile.c (iseq_compile_each): out of range NTH_REF is always
+ nil.
+
+ * parse.y (parse_numvar): check overflow of NTH_REF and range.
+ [ruby-core:69393] [Bug #11192]
+
+ * util.c (ruby_scan_digits): make public and add length parameter.
+
+Fri May 29 11:18:58 2015 Eric Wong <e@80x24.org>
+
+ * ext/socket/ancdata.c (bsock_sendmsg_internal,
+ bsock_recvmsg_internal):
+ avoid redundant fcntl on Linux
+ [ruby-core:69154] [Feature #11145]
+ * ext/socket/init.c (rsock_s_recvfrom_nonblock): ditto
+ * ext/socket/rubysocket.h (MSG_DONTWAIT_RELIABLE): new macro
+
+Fri May 29 10:30:34 2015 Eric Wong <e@80x24.org>
+
+ * lib/net/resolv.rb (request): use monotonic clock
+ * lib/net/http.rb (begin_transport, end_transport): ditto
+ [ruby-core:69384] [Feature #11124]
+
+Fri May 29 04:37:38 2015 Koichi Sasada <ko1@atdot.net>
+
+ * ext/objspace/objspace.c: add two methods to debug internals.
+
+ * ObjectSpace.internal_class_of: return RBASIC_CLASS(obj).
+ * ObjectSpace.internal_super_of: return RCLASS_SUPER(cls).
+
+ * NEWS: add information about both methods.
+
+ * test/objspace/test_objspace.rb: add tests for both methods.
+
+Thu May 28 06:55:53 2015 Anton Davydov <antondavydov.o@gmail.com>
+
+ * ext/tk/sample/figmemo_sample.rb (open_file),
+ ext/tk/sample/tktextio.rb (TkTextIO): fix typo in messages.
+ [Fix GH-916]
+
+Wed May 27 09:50:51 2015 Eric Wong <e@80x24.org>
+
+ * ext/openssl/ossl_asn1.c (ossl_asn1_traverse, ossl_asn1_decode,
+ ossl_asn1_decode_all): use RB_GC_GUARD instead of volatile
+ [ruby-core:69371] [Bug #11185]
+
+Wed May 27 09:27:30 2015 Eric Wong <e@80x24.org>
+
+ * lib/drb/drb.rb (set_sockopt): remove redundant fcntl call
+ * lib/drb/unix.rb (set_sockopt): ditto
+ [ruby-core:69128] [Feature #11137]
+
+Tue May 26 22:10:43 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * vm_method.c (rb_alias): should resolve refined methods.
+ [ruby-core:69360] [Bug #11182]
+
+Tue May 26 21:35:13 2015 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
+
+ * include/ruby/defines.h (RUBY_ATTR_ALLOC_SIZE): fix condition.
+
+Mon May 25 22:35:58 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * tool/redmine-backporter.rb (rel): after the relations is changed,
+ @changesets is no longer right.
+
+Mon May 25 11:27:14 2015 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * win32/win32.c (setup_overlapped): seek to the file end only when
+ writing (mode:a), not reading (mode:a+, read).
+
+Mon May 25 00:27:37 2015 Benoit Daloze <eregontp@gmail.com>
+
+ * numeric.c (Numeric#negative?): [DOC] Fix call-seq.
+ Patch by @yui-knk. [Fixes GH-908]
+
+Sun May 24 01:35:22 2015 Koichi Sasada <ko1@atdot.net>
+
+ * debug.c (ruby_debug_print_id): use rb_id2name() for fprintf().
+
+Sat May 23 18:38:46 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * man/*.1: updated dates in man pages.
+ [ruby-dev:48988] [Bug #11171]
+
+Sat May 23 03:10:58 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * win32/win32.c (rb_w32_write_console): should return the count of
+ actually eaten characters, include escape sequences.
+
+Fri May 22 22:36:14 2015 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
+
+ * lib/prime.rb: Remove obsolete Prime.new
+ patch by Ajay Kumar. [Fixes GH-891]
+
+Fri May 22 21:13:12 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * include/ruby/intern.h (rb_sym_count): move `rb_sym_all_symbols`
+ to a symbol.c specific section. a part of patch by Lourens
+ Naude.
+
+Fri May 22 20:56:33 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * complex.c (f_complex_polar): simple bug reproduced only when y is
+ a float but x is not a float.
+
+Fri May 22 19:42:06 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * process.c (rb_spawn_process): do not discard global escape
+ status. [ruby-core:69304] [Bug #11166]
+
+ * process.c (rb_execarg_spawn): extract the start procedure in a
+ parent process with ensuring the end procedure.
+
+Fri May 22 16:48:32 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * NEWS: added news for net-telnet and rake
+
+Thu May 21 20:27:07 2015 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * configure.in (RUBY_DTRACE_POSTPROCESS): cmp -b is GNU extension.
+ darwin uses GNU cmp, and FreeBSD and Solaris are not.
+ Note that accidentally equals to expected result.
+
+Thu May 21 18:00:19 2015 Koichi Sasada <ko1@atdot.net>
+
+ * iseq.c: constify.
+
+ * iseq.h: ditto.
+
+ * method.h: ditto.
+
+ * proc.c: ditto.
+
+ * vm_method.c: ditto.
+
+Thu May 21 17:44:53 2015 Koichi Sasada <ko1@atdot.net>
+
+ * proc.c: fix issues caused by binding created from Method#to_proc.
+ [Bug #11163]
+
+ * vm.c (vm_cref_new_toplevel): export as rb_vm_cref_new_toplevel().
+
+ * test/ruby/test_method.rb: add some assertions.
+
+Thu May 21 17:29:26 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * lib/matrix.rb: added documentation for Matrix#empty and Matrix#/
+ [Feature #10070][ruby-dev:48433] Patch by @gogotanaka
+
+Thu May 21 17:02:43 2015 Koichi Sasada <ko1@atdot.net>
+
+ * proc.c: rename functions.
+ * method_get_def() -> method_def()
+ * method_get_iseq() -> method_def_iseq()
+ * method_get_cref() -> method_cref()
+
+Thu May 21 16:52:44 2015 Koichi Sasada <ko1@atdot.net>
+
+ * proc.c (rb_method_get_iseq): rename to rb_method_iseq.
+
+ * iseq.c: catch up this fix.
+
+ * iseq.h: commit ditto.
+
+Thu May 21 15:41:45 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * lib/net/telnet.rb: gemify net-telnet.
+ [Feature #11083]
+ * gems/bundled_gems: added net-telnet to bundled gems.
+
+Thu May 21 15:37:32 2015 Zachary Scott <e@zzak.io>
+
+ * vm_method.c: Remove private attribute warning [Bug #10967]
+ Patch by @spastorino [Fixes GH-849]
+ https://github.com/ruby/ruby/pull/849
+
+ * test/ruby/test_module.rb: Update test for changes
+
+Thu May 21 10:59:43 2015 Koichi Sasada <ko1@atdot.net>
+
+ * proc.c (method_proc): rename to method_to_proc.
+
+Thu May 21 10:51:54 2015 Jake Worth <jakeworth82@gmail.com>
+
+ * io.c (rb_f_select): [DOC] Fixes for grammar and style.
+ [Fix GH-906]
+
+Thu May 21 08:25:19 2015 Eric Wong <e@80x24.org>
+
+ * variable.c (Init_var_tables): init generic_iv_tbl
+ (rb_generic_ivar_table, generic_ivar_get, generic_ivar_set,
+ generic_ivar_defined, generic_ivar_remove,
+ rb_mark_generic_ivar, givar_i, rb_mark_generic_ivar_tbl,
+ rb_free_generic_ivar, rb_copy_generic_ivar, rb_ivar_foreach,
+ rb_ivar_count): remove checks for uninitialize generic_iv_tbl
+ [ruby-core:69155] [Feature #11146]
+
+Thu May 21 04:11:03 2015 Koichi Sasada <ko1@atdot.net>
+
+ * iseq.c (exception_type2symbol): show correct bug message.
+
+Wed May 20 23:19:05 2015 Yusuke Endoh <mame@ruby-lang.org>
+
+ * lib/base64.rb: Fix rdoc-formatting for padding argument.
+ [fix GH-905][ci skip] Patch by @davydovanton
+
+Wed May 20 13:16:23 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in (DEPRECATED_BY): deprecate warning with preferable
+ alternative.
+
+ * configure.in (RUBY_FUNC_ATTRIBUTE): allow attribute arguments in
+ the macro.
+
+Wed May 20 11:23:24 2015 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * vm_dump.c (rb_print_backtrace): return value of libexec's backtrace
+ is size_t, so simply cast as int.
+
+Tue May 19 18:54:41 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * iseq.c (rb_iseq_compile_with_option): check source type, must be
+ an IO or a String. [ruby-core:69219] [Bug #11159]
+
+Tue May 19 17:15:03 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * lib/benchmark.rb: Update Benchmark documentation and formatting.
+ [fix GH-903][ci skip] Patch by @davydovanton
+
+Tue May 19 13:10:08 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * numeric.c (num_positive_p): should false on Bignum 0.
+ http://twitter.com/rafaelfranca/status/600509783427391488
+ [ruby-core:69173] [Feature #11151]
+
+Tue May 19 11:22:28 2015 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * lib/uri/rfc2396_parser.rb (initialize_pattern):
+ URI::Generic.build should accept port as a string.
+ pattern[:PORT] is not defined for long.
+ by Dave Slutzkin <daveslutzkin@fastmail.fm>
+ https://github.com/ruby/ruby/pull/804 fix GH-804
+
+Tue May 19 11:18:46 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * include/ruby/ruby.h (rb_data_typed_object_alloc),
+ (rb_data_object_alloc): add old names for source level backward
+ compatibilities.
+
+ * gc.c (rb_data_object_alloc, rb_data_typed_object_alloc): add
+ aliases for binary level backward compatibilities.
+
+Tue May 19 09:54:44 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * include/ruby/ruby.h (Data_Make_Struct0): needs function pointer
+ casts to fix function overloading in C++.
+
+Tue May 19 09:43:56 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * include/ruby/ruby.h (Data_Make_Struct0, TypedData_Make_Struct0):
+ explicit cast from void* is necessary as implicit cast is
+ disallowed in C++.
+
+Mon May 18 15:31:31 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * include/ruby/intern.h (rb_f_notimplement): should not respond to
+ not-implemented methods. as the address inside a DLL and the
+ imported address are different on Windows, use an exported
+ variable to share the same address.
+
+Mon May 18 13:55:01 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * lib/monitor.rb (mon_try_enter, mon_enter): should reset @mon_count
+ just in case the previous owner thread dies without mon_exit.
+ [fix GH-874] Patch by @chrisberkhout
+
+Sun May 17 17:21:29 2015 Eric Wong <e@80x24.org>
+
+ * lib/webrick/utils.rb (set_non_blocking): use IO#nonblock=
+ * (set_close_on_exec): use IO#close_on_exec=
+ [Feature #11136]
+
+Sun May 17 15:01:26 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * numeric.c (num_positive_p, num_negative_p): add methods
+ Numeric#positive? and Numeric#negative?.
+ [ruby-core:69173] [Feature #11151]
+
+ * numeric.c (flo_positive_p, flo_negative_p): specialized
+ functions for Float.
+
+ * complex.c (Init_Complex): Complex do not have positive? and
+ negative? methods
+
+Sun May 17 14:57:42 2015 Eric Wong <e@80x24.org>
+
+ * lib/webrick/server.rb (accept_client): avoid redundant fcntl call
+ [Feature #11137]
+
+Sun May 17 12:13:33 2015 Eric Wong <e@80x24.org>
+
+ * ext/socket/init.c (cloexec_accept): support nonblock flag and
+ use SOCK_NONBLOCK if possible
+ * ext/socket/init.c (rsock_s_accept_nonblock):
+ update cloexec_accept call
+ * ext/socket/init.c (accept_blocking): ditto for blocking
+ * test/socket/test_nonblock.rb: check nonblock? on accepted socket
+ [Feature #11138]
+
+Sun May 17 03:58:59 2015 Aaron Patterson <tenderlove@ruby-lang.org>
+
+ * load.c (loaded_feature_path): stop returning false negatives for
+ filenames which are trailing substrings of file extensions. For
+ example, 'b', which a trailing substring of ".rb" should not return
+ false. [Bug #11155][ruby-core:69206]
+
+ * test/ruby/test_autoload.rb: test for fix
+
+Sat May 16 21:41:24 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * string.c: added documentation for character sequence \' with String#sub
+ [Bug #11132][ruby-core:69121][fix GH-900][ci skip] Patch by @shishir127
+
+Sat May 16 21:38:05 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * enum.c: fix a sample code. Patch by @eagletmt
+ [fix GH-901][ci skip]
+
+Sat May 16 21:17:11 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * gc.c (rb_data_object_wrap, rb_data_typed_object_wrap): rename
+ alloc as wrap. these functions do not allocate data pointers
+ but just wrap the given pointers.
+
+Sat May 16 19:59:24 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * win32/win32.c (rb_w32_accept): simplified.
+
+Fri May 15 18:28:20 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * array.c (rb_ary_assoc, rb_ary_rassoc): [DOC] the result when key
+ was found is the existing element, not a new array. reported by
+ Giau Nguyen <giaunv AT nustechnology.com>.
+
+Fri May 15 08:24:28 2015 Takeyuki FUJIOKA <xibbar@ruby-lang.org>
+
+ * lib/cgi/cookie.rb: Implement HttpOnly flag for cookies.
+ [fix GH-887] Patch by @martinpovolny
+
+Fri May 15 06:54:19 2015 Aaron Patterson <tenderlove@ruby-lang.org>
+
+ * variable.c: Change autoload to call `require` through Ruby rather
+ than directly calling `rb_require_safe`. This allows things like
+ RubyGems to intercept file loading done though `autoload`.
+ [Feature #11140]
+
+ * test/ruby/test_autoload.rb: Test for change.
+
+Wed Apr 8 19:18:02 2015 Shota Fukumori (sora_h) <her@sorah.jp>
+
+ * enum.c (enum_grep_v, grep_i, grep_iter_i, Init_enum):
+ Implement Enumerable#grep_v. [Feature #11049]
+
+Thu May 14 15:54:13 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * ext/pathname/lib/pathname.rb: Remove condition of RUBY_VERSION <= 1.9.
+ [Feature #11082]
+
+Wed May 13 17:10:37 2015 Masaki Matsushita <glass.saga@gmail.com>
+
+ * enum.c (enum_to_a): revert r50457.
+ it requires recursion check.
+ then, it doesn't make performance improvement.
+ [Bug #11130] [Feature #9118]
+
+Wed May 13 11:13:40 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (parse_gvar): separate message for gvar without
+ non-space characters from message for invalid identifiers.
+
+Tue May 12 22:18:27 2015 Masaki Matsushita <glass.saga@gmail.com>
+
+ * enum.c (enum_to_a): fix incompatibility introduced in r50457.
+ [Bug #11130]
+
+ * test/ruby/test_enum.rb: test for above.
+
+Tue May 12 17:08:03 2015 Koichi Sasada <ko1@atdot.net>
+
+ * method.h: remove unused declaration.
+
+Mon May 11 10:58:45 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * gems/bundled_gems: Update minitest-5.6.1 and power_assert-0.2.3.
+
+Mon May 11 00:20:31 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * include/ruby/ruby.h (Data_Make_Struct, TypedData_Make_Struct):
+ allocate wrapper data object before allocating DATA_PTR to get
+ rid of possible memory leak when the former failed.
+
+Sun May 10 21:32:45 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * gc.c (gc_mark_children): call dmark function for non-NULL
+ pointers only, so that DATA_PTR can be NULL safely now.
+
+Sun May 10 16:23:58 2015 Kazuki Tsujimoto <kazuki@callcc.net>
+
+ * proc.c (proc_binding): fix segmentation fault on marking phase.
+ envptr of newenvval should not be NULL.
+
+ You can reproduce by
+ make test-all TESTS='--gc-stress -n test_to_proc_binding ruby/test_method.rb'
+
+Sun May 10 12:41:18 2015 Masaki Matsushita <glass.saga@gmail.com>
+
+ * ext/zlib/zlib.c (rb_gzreader_external_encoding):
+ define GzipReader#external_encoding.
+ [Bug #10900]
+
+ * test/zlib/test_zlib.rb: test for above.
+
+Sun May 10 11:57:48 2015 Masaki Matsushita <glass.saga@gmail.com>
+
+ * ext/win32ole/win32ole_variant.c: fix typo "indicies".
+ the patch is from davydovanton <antondavydov.o at gmail.com>.
+ [fix GH-892]
+
+ * lib/rubygems/indexer.rb: ditto.
+
+ * test/rubygems/test_gem_indexer.rb: ditto.
+
+Sun May 10 11:44:37 2015 Masaki Matsushita <glass.saga@gmail.com>
+
+ * string.c (rb_str_crypt): Raise ArgumentError when
+ string passed to String#crypt contains null.
+ the patch is from jrusnack <jrusnack at redhat.com>.
+ [Bug #10988] [fix GH-853]
+
+ * test/ruby/test_string.rb: test for above.
+
+Sun May 10 11:23:03 2015 Masaki Matsushita <glass.saga@gmail.com>
+
+ * enum.c (enum_to_a): Use size to set array capa when possible.
+ the patch is from HonoreDB <aweiner at mdsol.com>.
+ [fix GH-444]
+
+Sat May 9 06:48:36 2015 Eric Wong <e@80x24.org>
+
+ * ext/socket/ancdata.c (bsock_recvmsg_internal): GC guard
+ [Bug #11123]
+
+Fri May 8 22:57:24 2015 takiy33 <takiy33@gmail.com>
+
+ * test/matrix/test_matrix.rb (test_determinant): refactor test on
+ Matrix#determinant, by merging with test_det for an alias method
+ det. [Fix GH-897]
+
+Fri May 8 15:43:11 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * lib/net/imap.rb (body_ext_mpart): should work even if body-fld-dsp
+ is omitted. [ruby-core:69093] [Bug #11128]
+
+Fri May 8 15:05:57 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * doc/syntax/control_expressions.rdoc: fix a missing "a"
+ [fix GH-888][ci skip] Patch by @riffraff
+
+Fri May 8 12:11:33 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_eval.c (rb_method_call_status): resolve refined method entry
+ to check if undefined. [ruby-core:69064] [Bug #11117]
+
+Thu May 7 22:22:59 2015 Sho Hashimoto <sho-h@ruby-lang.org>
+
+ * proc.c: [DOC] fix Binding#local_variable_set example. [ci skip]
+
+Thu May 7 11:32:57 2015 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * Makefile.in (rbconfig.rb): add rule to make.
+
+Thu May 7 05:14:39 2015 Eric Wong <e@80x24.org>
+
+ * ext/socket/lib/socket.rb (connect_nonblock): use IO#wait_writable
+ * lib/drb/drb.rb (DRB::DRbTCPSocket#alive?): use IO#wait_readable
+ * lib/webrick/httpserver.rb (run): ditto
+ * lib/resolv.rb (request): ditto for single socket case
+ [ruby-core:68943] [Feature #11081]
+
+Wed May 6 22:49:54 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_eval.c (rb_method_call_status): undefined refined method is
+ not callable unless using. [ruby-core:69064] [Bug #11117]
+
+Sun May 3 22:40:06 2015 Rei Odaira <Rei.Odaira@gmail.com>
+
+ * ext/-test-/file/fs.c: need to include sys/statvfs.h
+ to use statvfs().
+
+ * ext/-test-/file/extconf.rb: check the existence of
+ sys/statvfs.h
+
+Sun May 3 21:59:48 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * lib/yaml.rb: fix typo. [ci skip][fix GH-890]
+ Patch by @miketheman
+
+Sun May 3 10:02:12 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * range.c (linear_object_p, range_include): test if covered for
+ linear objects. [ruby-core:69052] [Bug #11113]
+
+Fri May 1 13:30:24 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * dln.c (dln_load): check if a different libruby is loaded by the
+ extension library, and then bail out to get rid of very
+ frequently reported stale bug reports.
+
+Thu Apr 30 19:51:11 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * compile.c (iseq_compile_each): revert r46873 and r46875, not to
+ allow to execute private readers by pretending op assign.
+ [ruby-core:68984] [Bug #11096]
+
+Thu Apr 30 17:02:33 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * rational.c: Added documentation for rational literal.
+ [Bug #11075][fix GH-885][ci skip] Patch by @shishir127
+
+Thu Apr 30 16:39:44 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/socket/ipsocket.c (init_inetsock_internal): preserve errno
+ before other library calls and use rb_syserr_fail.
+ [ruby-core:68531] [Bug #10975]
+
+Thu Apr 30 16:22:16 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (lambda): push and reset cmdarg_stack in lambda body.
+ [ruby-core:69017] [Bug #11107]
+
+Sun Apr 26 07:36:48 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * enc/utf_8.c (code_to_mbclen, code_to_mbc): reject values larger
+ than UTF-8 max codepoints. [Feature #11094]
+
+Sat Apr 25 14:26:19 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * string.c (str_buf_cat): expand later so that the buffer can be
+ larger for further use. [Bug #11080] [Bug #11095]
+
+Fri Apr 24 23:48:45 2015 Akinori MUSHA <knu@iDaemons.org>
+
+ * misc/ruby-electric.el: Import version 2.2.3 from
+ https://github.com/knu/ruby-electric.el.
+
+Fri Apr 24 10:40:02 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * win32/win32.c (rb_w32_{getc,putc}): removed. they are needed for old
+ ruby (before 1.8), but not now.
+
+Fri Apr 24 08:40:13 2015 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * win32/win32.c: remove bcc related code.
+
+ * include/ruby/win32.h: ditto.
+
+Fri Apr 24 08:21:07 2015 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * win32/win32.c (rb_acrt_lowio_lock_fh): wrap _pioinfo(i)->lock.
+
+ * win32/win32.c (rb_acrt_lowio_unlock_fh): ditto.
+
+Fri Apr 24 06:47:19 2015 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * win32/win32.c (_filbuf): msvc14 doesn't have it, use _fgetc_nolock.
+
+ * win32/win32.c (_flsbuf): msvc14 doesn't have it, use _fputc_nolock.
+
+ * win32/win32.c (vcruntime_file): define vcruntime_file on msvc14
+ because it doesn't export FILE's internal structure.
+
+ * win32/win32.c (FILE_COUNT): added to abstract FILE->_cnt.
+
+ * win32/win32.c (FILE_READPTR): added to abstract FILE->_ptr.
+
+ * win32/win32.c (FILE_FILENO): added to abstract FILE->_file.
+
+ * win32/win32.c (init_stdhandle): use FILE_FILENO.
+
+ * win32/win32.c (rb_w32_getc): use FILE_COUNT and FILE_READPTR.
+
+ * win32/win32.c (rb_w32_putc): ditto.
+
+Fri Apr 24 06:37:07 2015 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * win32/win32.c (dupfd): use _set_osfhnd.
+
+ * win32/win32.c (rb_w32_wopen): use _set_osflags.
+
+Thu Apr 24 05:38:01 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_mark_roots): fox to work PRINT_ROOT_TICKS.
+
+Fri Apr 24 04:49:05 2015 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * win32/Makefile.sub: MSVC14 have struct timespec.
+
+ * win32/rtname.cmd: support vcruntime140.dll.
+
+ * time.c (localtime_with_gmtoff_zone): MSVC14 doesn't have tzname and
+ daylight but have _tzname and _daylight.
+
+Thu Apr 23 11:35:55 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_eval.c (rb_obj_instance_eval, rb_obj_instance_exec): allow
+ symbols to just instance_eval/exec, except for definition of
+ singletons. [ruby-core:68961] [Bug #11086]
+
+Thu Apr 23 10:01:36 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * lib/delegate.rb: fix a typo.
+ [fix GH-881][ci skip] Patch by @Zorbash
+
+Wed Apr 22 18:36:50 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * lib/net/imap.rb (move, uid_move): support the MOVE command defined
+ in RFC6851. Patch by ojab ojab.
+ [ruby-core:68960] [Feature #11077]
+
+Tue Apr 22 12:42:12 2015 Kazuki Tanaka <gogotanaka@ruby-lang.org>
+
+ * test/ruby/test_object.rb: add tests for Kernel#String and Kernel#Array.
+ [fix GH-879][fix GH-880] Patch by @yui-knk
+
+Tue Apr 21 20:46:02 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * test/ruby/test_object.rb: renamed tests to explicitly class name.
+ [fix GH-877] Patch by @yui-knk
+
+Tue Apr 21 05:31:00 2015 Eric Wong <e@80x24.org>
+
+ * ext/socket/lib/socket.rb (connect_internal): avoid common exceptions
+ from connect_nonblock. [ruby-core:68909]
+
+Mon Apr 20 23:46:53 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * win32/win32.c (rb_w32_wreadlink): follow the official format of
+ REPARSE_DATA_BUFFER structure.
+
+Mon Apr 20 20:23:04 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * common.mk ($(arch)-fake.rb): revert r50354 because bsdmake seems not
+ to handle such substitution.
+
+ * tool/expand-config.rb: convert path separators here.
+
+Mon Apr 20 16:52:20 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * tool/fake.rb: don't fake libdir. use libdirname instead.
+
+Mon Apr 20 16:49:52 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * lib/mkmf.rb (MakeMakefile#configuration): DESTDIR should never affect
+ top_srcdir and builddir.
+
+Mon Apr 20 16:18:17 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * common.mk ($(arch)-fake.rb): fix the path separator up for Windows.
+
+Mon Apr 20 15:02:47 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * win32/win32.c (rb_w32_wreadlink): fixed a bug that a junction misses
+ its drive letter.
+
+Mon Apr 20 12:54:56 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * ext/openssl/*: use license instead of licence.
+ [fix GH-876][ci skip] Patch by @davydovanton
+ * lib/net/https.rb: ditto.
+
+Mon Apr 20 12:42:40 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * benchmark/bm_so_meteor_contest.rb: fix a typo.
+ [fix GH-876][ci skip] Patch by @davydovanton
+ * tool/bisect.sh: ditto.
+ * tool/update-deps: ditto.
+
+Mon Apr 20 11:10:46 2015 Eric Wong <e@80x24.org>
+
+ * ext/socket/socket.c (sock_connect_nonblock): do not raise EISCONN
+ [ruby-core:68926] [Feature #11072]
+ * test/socket/test_nonblock.rb: check non-EISCONN on 2nd connect
+
+Sun Apr 19 12:19:17 2015 Chad Brewbaker <crb002@gmail.com>
+
+ * ext/{etc,openssl,tk}: Adding parens and comparisons around
+ assignments to get rid of Wparentheses warnings. [Fix GH-875]
+
+Sun Apr 19 10:42:54 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * hash.c (get_env_cstr): environment variables must be ASCII
+ compatible, as dummy encodings and wide char encodings are
+ unsupported now.
+
+Sat Apr 18 15:18:56 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/json/parser/parser.rl: raise with messages in UTF-8
+ encoding. [ruby-core:67386] [Bug #10705]
+
+Fri Apr 17 11:58:34 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * string.c (STR_SET_EMBED): clear NOFREE flag at embedding as
+ embedded strings no longer refer static strings.
+ [ruby-core:68436] [Bug #10942]
+
+Thu Apr 16 05:15:50 2015 Eric Wong <e@80x24.org>
+
+ * NEWS: note IO#wait_readable change in r50263
+
+Thu Apr 16 05:09:36 2015 Eric Wong <e@80x24.org>
+
+ * lib/net/protocol.rb (rbuf_fill): use IO#wait_*able
+ * lib/net/http/generic_request.rb (wait_for_continue): ditto
+ [ruby-core:68891] [Feature #11056]
+
+Wed Apr 15 18:43:43 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_trace.c (rb_tracepoint_new): fix documentation.
+ Commented by @emilsoman.
+
+Wed Apr 15 17:36:51 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_trace.c (rb_tracepoint_new): Add documentation for
+ rb_tracepoint_new C level API [ci skip]
+ Provided by @emilsoman. [fix GH-869]
+
+Wed Apr 15 10:37:40 2015 SHIBATA Hiroshi <hsbt@ruby-lang.org>
+
+ * doc/contributors.rdoc: fix a typo. Patch by @davydovanton
+ [fix GH-872][ci skip]
+ * doc/syntax/methods.rdoc: ditto.
+ * ext/digest/sha2/sha2.c: ditto.
+ * ext/socket/ipsocket.c: ditto.
+ * ext/tk/*: ditto.
+
+Wed Apr 15 07:51:23 2015 Yuki Yugui Sonoda <yugui@yugui.jp>
+
+ * doc/extension.ja.rdoc: Added description of TypedData_XXX.
+ Deprecated the old DATA_XXX.
+ Reviewed by ko1 and nobu.
+ Fixes [ruby-dev:40881] #3064
+
+ * doc/extension.rdoc: ditto.
+
+Wed Apr 15 07:34:49 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * thread_pthread.c (reserve_stack): keep sp safe zone to get rid
+ of crash by -fstack-check. [ruby-core:68740] [Bug #11030]
+
+Tue Apr 14 16:03:49 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * tool/merger.rb (versionup): should also increment revision when
+ changing teeny.
+
+Tue Apr 14 11:24:56 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/-test-/printf/printf.c (uint_to_str): renamed to get rid of
+ conflict on cygwin. [ruby-core:68877] [Bug #11065]
+
+Tue Apr 14 08:59:04 2015 Zachary Scott <e@zzak.io>
+
+ * gc.c: [DOC] Improve documentation for ObjectSpace.count_objects
+ with regards to `:TOTAL` key, with patch by @schneems [Fixes GH-871]
+ https://github.com/ruby/ruby/pull/871 [Bug #11067]
+
+Mon Apr 13 22:44:07 2015 Tanaka Akira <akr@fsij.org>
+
+ * test/lib/envutil.rb (File.mkfifo): Defined using mkfifo command.
+
+ * test/ruby/test_io.rb: Use File.mkfifo.
+
+ * test/ruby/test_file_exhaustive.rb: Ditto.
+
+ * test/ruby/test_process.rb: Ditto.
+
+Mon Apr 13 21:20:20 2015 CHIKANAGA Tomoyuki <nagachika@ruby-lang.org>
+
+ * ext/openssl/lib/openssl/ssl.rb: stricter hostname verification
+ following RFC 6125. with the patch provided by Tony Arcieri and
+ Hiroshi Nakamura [ruby-core:61545] [Bug #9644]
+ * test/openssl/test_ssl.rb: add tests for above.
+
+Sun Apr 12 18:40:04 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * ext/json/json.gemspec: bump version to 1.8.2.
+ * ext/json/lib/json/version.rb: ditto.
+
+Sun Apr 12 18:12:07 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * ext/json/json.gemspec, lib/rdoc/rdoc.gemspec: added gemspec directly.
+ * defs/default_gems, tool/rbinstall.rb: removed default_gems definition.
+ it make simple installation for default gems.
+
+Sun Apr 12 17:35:17 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * ext/json/*, test/json/*: Reverted r50231. Because it's not
+ working with cross-compile environment.
+
+Sun Apr 12 15:34:59 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (arg): fix segfault by null caused by syntax error.
+ [ruby-core:68851] [Bug #10957]
+
+Sun Apr 12 15:11:16 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * lib/rubygems/test_case.rb: use explicitly exception class and reverted
+ to require JSON library for rubygems tests with Ruby 2.2.0 or earlier.
+
+Sun Apr 12 15:10:18 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/io/wait/wait.c (io_wait_readable): simply returns that IO is
+ readable without blocking, but no longer returns EOF.
+
+ * ext/io/wait/wait.c (io_ready_p, io_wait_readable): try polling
+ first and check FIONREAD optionally to see if EOF.
+ [ruby-core:36805] [Feature #4849]
+
+Sun Apr 12 14:53:23 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * lib/rubygems/test_case.rb: fixed json load error for rubygems tests.
+
+Sun Apr 12 14:13:28 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * gc.c: Document require name for ObjectSpace methods.
+ [ci skip][fix GH-860] Patch by @schneems
+
+Sun Apr 12 13:54:05 2015 Tanaka Akira <akr@fsij.org>
+
+ * test/ruby/test_io.rb: New test that open(fifo) doesn't block other
+ threads.
+
+Sun Apr 12 13:52:18 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * ext/coverage/coverage.c: Remove extension from require argument.
+ [ci skip][fix GH-870] Patch by @yui-knk
+
+Sun Apr 12 10:29:14 2015 Eric Wong <e@80x24.org>
+
+ * ext/openssl/ossl_ssl.c (ossl_ssl_connect_nonblock):
+ support `exception: false'
+ * (get_no_exception): move function location
+ * ext/socket/socket.c (sock_connect_nonblock):
+ support `exception: false'
+ * test/openssl/test_pair.rb (test_connect_accept_nonblock_no_exception):
+ test `exception: false' on connect,
+ rename from `test_accept_nonblock_no_exception'
+ * test/socket/test_nonblock.rb (test_connect_nonblock_no_exception):
+ new test
+
+Sun Apr 12 09:57:16 2015 Tanaka Akira <akr@fsij.org>
+
+ * test/ruby/test_file_exhaustive.rb: Test a block device on GNU/Linux.
+
+Sun Apr 12 09:24:03 2015 Tanaka Akira <akr@fsij.org>
+
+ * test/ruby/test_file_exhaustive.rb: Test a file not owned.
+
+Sun Apr 12 09:05:44 2015 Tanaka Akira <akr@fsij.org>
+
+ * ext/fiddle/depend: Fix "Wrong mix of special targets" error with
+ OpenBSD make.
+
+Sun Apr 12 09:04:37 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * test/ruby/test_file_exhaustive.rb: Windows doesn't support Unix file
+ modes.
+
+Sun Apr 12 08:56:44 2015 Tanaka Akira <akr@fsij.org>
+
+ * ext/-test-/file/fs.c: OpenBSD needs sys/param.h before sys/mount.h.
+
+Sun Apr 12 08:52:01 2015 Tanaka Akira <akr@fsij.org>
+
+ * test/ruby/test_file_exhaustive.rb: Test suid, sgid and sticky file.
+
+Sat Apr 11 23:48:30 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * template/fake.rb.in: Don't assign baseruby, Because it's affect to
+ Makefile of native gem like json on bundled gems.
+
+Sat Apr 11 23:33:22 2015 Tanaka Akira <akr@fsij.org>
+
+ * file.c (rb_f_test): Consider nsec for "=", "<" and ">" for "test"
+ method.
+
+Sat Apr 11 23:26:05 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * tool/rbinstall.rb: support destdir for native extension gem.
+
+Sat Apr 11 21:02:06 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * test/ruby/test_file_exhaustive.rb
+ (TestFileExhaustive#test_stat_socket_p): r50226 accidentally missed
+ the guard for non-unix environments.
+
+Sat Apr 11 20:14:21 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * ext/json/*, test/json/*, defs/default_gems: Gemify JSON library.
+ [fix GH-867][Feature #11057]
+ * test/ruby/test_extlibs.rb: removed json gem from existence extensions.
+ * gems/bundled_gems: added json gem into bundled gem.
+ * lib/rdoc/rubygems_hook.rb: ignored no json environment.
+ * lib/rubygems/test_case.rb, test/rubygems/*: ditto.
+ * lib/rdoc/test_case.rb, test/rdoc/*: ditto.
+
+Sat Apr 11 15:56:58 2015 Tanaka Akira <akr@fsij.org>
+
+ * test/ruby/test_file_exhaustive.rb: Create sample files lazily.
+
+Sat Apr 11 14:03:47 2015 Tanaka Akira <akr@fsij.org>
+
+ * test/ruby/test_file_exhaustive.rb: Test character device using
+ /dev/null.
+
+Sat Apr 11 10:59:58 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/mkmf.rb (append_cppflags, append_cflags, append_ldflags):
+ utility methods to append compiler options.
+
+Sat Apr 11 08:22:24 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * lib/rdoc/text.rb: removed duplicated code.
+
+Sat Apr 11 04:46:42 2015 Eric Wong <e@80x24.org>
+
+ * lib/net/protocol.rb (rbuf_fill): avoid exception with read_nonblock
+ [ruby-core:68787] [Feature #11044]
+
+Fri Apr 10 23:57:44 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * dir.c (need_normalization): use getattrlist() if fgetattrlist()
+ is unavailable, on OSX 10.5. [ruby-core:68829] [Bug #11054]
+
+Fri Apr 10 22:29:21 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/mkmf.rb (try_compile): pass the given werror flag to try_do
+ to check if stderr is empty.
+
+ * lib/mkmf.rb (try_cflags, try_ldflags): default werror to true.
+
+ * win32/Makefile.sub (WERRORFLAG): remove useless option. VC does
+ not make warnings of unknown command option an error.
+
+Fri Apr 10 19:34:24 2015 Tanaka Akira <akr@fsij.org>
+
+ * test/ruby/test_file_exhaustive.rb: Test socket.
+
+Fri Apr 10 19:38:46 2015 Koichi Sasada <ko1@atdot.net>
+
+ * test/objspace/test_objspace.rb: remove debug prints.
+
+Fri Apr 10 19:35:51 2015 Koichi Sasada <ko1@atdot.net>
+
+ * ext/objspace/objspace.c: add ObjectSpace.count_imemo_objects method
+ to count imemo objects for each type.
+
+ * test/objspace/test_objspace.rb: add a test.
+
+ * NEWS: describe about this addition.
+
+Fri Apr 10 19:34:24 2015 Tanaka Akira <akr@fsij.org>
+
+ * test/ruby/test_file_exhaustive.rb: Test anonymous pipe.
+
+Fri Apr 10 19:31:56 2015 Tanaka Akira <akr@fsij.org>
+
+ * test/ruby/test_file_exhaustive.rb: Test named pipe.
+
+Fri Apr 10 19:10:34 2015 Koichi Sasada <ko1@atdot.net>
+
+ * ext/objspace/objspace.c (setup_hash): unify common routine.
+
+Fri Apr 10 18:29:49 2015 Tanaka Akira <akr@fsij.org>
+
+ * process.c (rb_execarg_parent_start1): Handle EINTR.
+
+Fri Apr 10 17:27:58 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm.c (vm_exec): check other events when RETURN is thrown.
+ [Bug #10724]
+
+ * test/ruby/test_settracefunc.rb: add a test.
+
+Fri Apr 10 11:44:09 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/date/extconf.rb: check warnings.
+
+ * lib/mkmf.rb (try_cflags): pass options to try_compile.
+
+ * win32/Makefile.sub (WERRORFLAG): make unknown command line
+ options an error.
+
+Fri Apr 10 08:00:17 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * test/ruby/test_process.rb: unfortunately, windows is not POSIX...
+ cygwin has mkfifo command, but it does not affect system-wide.
+
+Fri Apr 10 02:18:53 2015 Tanaka Akira <akr@fsij.org>
+
+ * test/ruby/test_process.rb: Use mkfifo command instead of mknod
+ command to create a named pipe. mkfifo command is defined by POSIX.
+
+Fri Apr 10 01:29:05 2015 Tanaka Akira <akr@fsij.org>
+
+ * process.c: Release GVL when opening a file in spawn() to avoid whole
+ process blocking when opening a named pipe.
+ (open_func): New function.
+ (rb_execarg_parent_start1): Extracted from rb_execarg_parent_start and
+ use rb_thread_call_without_gvl2 to release GVL when opening a file.
+ (rb_execarg_parent_start): Invoke rb_execarg_parent_start1 via
+ rb_protect and invoke rb_execarg_parent_end when error.
+
+Thu Apr 9 22:19:19 2015 Tanaka Akira <akr@fsij.org>
+
+ * process.c (redirect_open): Removed.
+
+Thu Apr 9 21:38:20 2015 Tanaka Akira <akr@fsij.org>
+
+ * internal.h (rb_execarg_parent_end): Declared.
+
+ * process.c: "spawn" opens files in the parent process.
+ (check_exec_redirect): Add an placeholder for fd in parameters
+ for fd_open.
+ (check_exec_fds_1): Delete fd_open condition.
+ (check_exec_fds): Don't call check_exec_fds_1 with fd_open.
+ (rb_execarg_parent_start): Open files specified as "spawn" options
+ and add "dup2" options.
+ (rb_execarg_parent_end): New function to close opened fds.
+ (run_exec_open): Removed.
+ (rb_execarg_run_options): Don't call run_exec_open.
+ (rb_spawn_internal): Call rb_execarg_parent_end.
+
+ * io.c (pipe_open): Call rb_execarg_parent_end.
+
+ * ext/pty/pty.c (establishShell): Call rb_execarg_parent_end.
+
+Thu Apr 9 20:52:31 2015 Tanaka Akira <akr@fsij.org>
+
+ * internal.h (rb_execarg_parent_start): Renamed from rb_execarg_fixup.
+
+ * process.c: Follows the above change.
+
+ * io.c: Ditto.
+
+ * ext/pty/pty.c: Ditto.
+
+Thu Apr 9 20:35:12 2015 Tanaka Akira <akr@fsij.org>
+
+ * process.c (fd_clear_cloexec): Extracted from run_exec_dup2.
+
+Thu Apr 9 09:26:47 2015 Eric Wong <e@80x24.org>
+
+ * ccan/list/list.h: sync with ccan upstream
+ [ccan commit c2fbfe5282ba264f3485586e7efa8a5967f2d386]
+
+Thu Apr 9 08:24:03 2015 Masahiro Tomita <tommy@tmtm.org>
+
+ * ext/socket/raddrinfo.c (addrinfo_mload): fix memory leak of
+ addrinfo. [ruby-dev:48923] [Bug #11051]
+
+Wed Apr 8 17:45:02 2015 Shannon Skipper <shannonskipper@gmail.com>
+
+ * version.c (Init_version): the version of the engine or
+ interpreter. [Fix GH-858]
+
+Wed Apr 8 16:15:30 2015 Kenta Murata <mrkn@cookpad.com>
+
+ * bigdecimal: conform to ruby's license. [ruby-core:68466] [Bug #10952]
+
+Wed Apr 8 14:57:06 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * win32/win32.c (rb_w32_wreadlink): should treat junctions like as
+ symlinks.
+
+Wed Apr 8 14:03:47 2015 Koichi Sasada <ko1@atdot.net>
+
+ * test/ruby/test_symbol.rb: fix syntax error.
+
+Wed Apr 8 13:01:06 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * hash.c (rb_any_hash): Symbols are compared by the identities
+ always. [ruby-core:68767] [Bug #11035]
+
+Tue Apr 7 10:22:51 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * internal.h: fix typo. Patch by @sferik [fix GH-865]
+
+Mon Apr 6 22:52:35 2015 Tanaka Akira <akr@fsij.org>
+
+ * enum.c: Enumerable#chunk and Enumerable#slice_before no longer takes
+ the initial_state argument. [Feature #10958]
+
+Mon Apr 6 16:09:58 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_args.c: protect value stack from calling other methods
+ during complex parameter setting process (splat, kw, and so on).
+ [Bug #11027]
+
+ * vm_core.h: remove rb_thread_t::mark_stack_len.
+ With this modification, we don't need to use th->mark_stack_len.
+
+ * test/ruby/test_keyword.rb: add a test.
+
+ * cont.c (cont_capture): catch up this fix.
+
+ * vm.c (rb_thread_mark): ditto.
+
+Mon Apr 6 11:26:42 2015 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * tool/downloader.rb (http_options): prevent content auto decoding
+ because this is a downloader.
+
+Sun Apr 5 09:55:18 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * doc/contributing.rdoc: update Maintainers list.
+
+Sun Apr 5 09:11:00 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * tool/rbinstall.rb: fix bin script permission of bundled gems.
+
+Sun Apr 5 08:46:08 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * tool/rbinstall.rb: support --program-suffix option.
+
+Sat Apr 4 21:31:18 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * lib/rake/*: Gemify rake [fix GH-862][Feature #11025]
+ * test/rake/*: ditto.
+ * tool/rbinstall.rb: ditto.
+
+Sat Apr 4 11:30:24 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * string.c (rb_str_setbyte): check the argument first not to
+ discard shared string and code range unnecessarily until
+ actually changing the contents. pointed out by headius.
+
+Sat Apr 4 08:16:43 2015 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * lib/net/http.rb (edit_path): use path which is absolute ftp url
+ on using ftp_proxy.
+
+Fri Apr 3 11:43:17 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_eval.c (vm_call0_cfunc): update invoker arguments.
+
+ * vm_insnhelper.c (vm_call_cfunc_latter): ditto.
+
+ * vm_insnhelper.c (rb_vm_call_cfunc_push_frame): ditto, and prefix
+ with rb_.
+
+Thu Apr 2 16:26:59 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * common.mk, tool/mkconfig.rb: check the running ruby version in
+ rbconfig.rb with the program version, as RUBY_VERSION has never
+ been affected by --with-ruby-version option.
+ [ruby-core:68639] [Bug #11002]
+
+ * configure.in (LIBRUBY_DLDFLAGS): compatibility_version must be
+ valid version numbers, not an arbitrary string.
+
+Wed Apr 1 11:09:15 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * dir.c (push_glob): remove indirect links of arguments for
+ trampoline.
+
+Wed Apr 1 09:59:12 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/fileutils.rb (FileUtils#mv): show the exact target path in
+ the error message instead of the destination parent directory
+ name. patched by Joao Britto <jabcalves AT gmail.com> at
+ [ruby-core:68706]. [Bug #11021]
+
+Tue Mar 31 15:25:07 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * doc/ChangeLog-0.06_to_0.52: added archived Changelog.
+ [ruby-list:50105]
+ * doc/ChangeLog-0.50_to_0.60: ditto.
+ * doc/ChangeLog-0.60_to_1.1: ditto.
+
+Mon Mar 30 22:02:55 2015 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
+
+ * README.EXT.ja: add redirect [ruby-core:68631]
+
+Mon Mar 30 14:42:41 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * win32/win32.c (fileattr_to_unixmode, winnt_lstat): deal with
+ symbolic link than directory, and set executable bits.
+
+Mon Mar 30 11:27:54 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * io.c (copy_stream_body): use the arguments without conversion if
+ having read, readpartial, and write methods, than conversion by
+ to_path method. [ruby-core:68676] [Bug #11015]
+
+Sun Mar 29 21:08:37 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * gc.c (objspace_allrefs_destruct_i): fix a typo.
+ [Bug #11013]
+
+Sun Mar 29 11:51:32 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * proc.c (proc_binding): replicate env from method object, and
+ allocate the local variable area for the iseq local table.
+ [ruby-core:68673] [Bug #11012]
+
+Sat Mar 28 09:19:41 2015 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * ext/date/extconf.rb: try_cflags("-std=iso9899:1999") [Bug #10906]
+ ruby itself (including numeric.c) is built with strict compile
+ options including -std=iso9899:1999, but ext/date is not.
+ By the way -std=iso9899:1999 is not only a warning option but also
+ changes behavior like MACRO definitions for example INFINITY.
+ gcc on Solaris affect this.
+
+Fri Mar 27 16:34:16 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * common.mk: revert using BOOTSTRAPRUBY for enc.mk, as
+ enc/depend uses CONFIG. [ruby-core:68647] [Bug #11004]
+
+Thu Mar 26 10:05:13 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * test/test_observer.rb: add tests for Observable module.
+ [fix GH-859] Patch by @brightbits
+
+Thu Mar 26 06:35:10 2015 Eric Wong <e@80x24.org>
+
+ * README.EXT: add redirect [ruby-core:68631]
+
+Wed Mar 25 16:46:49 2015 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * ext/socket/extconf.rb: Solaris 11 has struct tcp_info.tcpi_ca_state,
+ but it is a dummy.
+
+ * ext/socket/option.c: Solaris 11 doesn't have u_intN_t.
+
+ * ext/socket/option.c: Solaris 11 needs inspect_tcpi_msec.
+
+ * ext/socket/raddrinfo.c: Solaris 11 has AF_PACKET but doesn't have
+ related macros.
+
+Wed Mar 25 17:03:08 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/-test-/file/fs.c (get_fsname): try magic number only if
+ f_type is included. [ruby-dev:48913] [Bug #11000]
+
+Wed Mar 25 11:20:40 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * benchmark/bm_hash_aref_flo.rb: make more realistic data.
+ [ruby-core:68632] [[Bug #10999]
+
+Wed Mar 25 10:39:06 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * .document: removed needless entries.
+
+Wed Mar 25 08:07:28 2015 Eric Wong <e@80x24.org>
+
+ * doc/extension.rdoc: fix spelling of filename
+ * doc/extension.ja.rdoc: ditto.
+
+Tue Mar 25 06:55:43 2015 Kazuki Tanaka <gogotanaka@ruby-lang.org>
+
+ * complex.c (k_inexact_p, k_exact_zero_p): use k_exact_zero_p macro
+ to remove k_inexact_p macro.
+
+ * complex.c (k_exact_one_p): remove unused macro k_exact_one_p.
+
+Tue Mar 24 22:23:33 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * doc/extention.rdoc: move from toplevel document and added extname.
+ * doc/extention.ja.rdoc: ditto.
+
+Tue Mar 24 22:06:58 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * doc/standard_library.rdoc: strip.
+
+Tue Mar 24 22:06:27 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * doc/standard_library.rdoc: move Thread to Extensions.
+
+Tue Mar 24 21:59:10 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * doc/contributing.rdoc: update Maintainers list.
+
+Tue Mar 24 19:10:24 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_writebarrier_generational): fix messages for rb_bug().
+ Remove `rb_' prefix.
+
+ * gc.c (gc_writebarrier_incremental): ditto.
+
+Tue Mar 24 17:34:01 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * README.ja.md: should be chunibyo.
+
+Tue Mar 24 17:30:12 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/-test-/file/fs.c (get_fsname): return filesystem name by
+ statfs/statvfs. [ruby-core:68624] [Bug #10998]
+
+Tue Mar 24 16:46:02 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * tool/redmine-backporter.rb: now doesn't required spaces just after
+ `!`.
+
+Mon Mar 23 23:18:27 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * dir.c (dir_close): don't raise on double close for consistent to
+ IO#close. [Feature #10950]
+
+Mon Mar 23 21:22:07 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * win32/file.c (rb_readlink): move from file.c for better buffer
+ allocation and the result encoding.
+
+ * win32/win32.c (wreadlink, rb_w32_ureadlink): implement readlink().
+
+Mon Mar 23 14:40:45 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * win32/win32.c (winnt_stat): stat with following symbolic links.
+
+ * win32/win32.c (winnt_lstat): rename old winnt_stat, which does
+ not follow symbolic links.
+
+Mon Mar 23 01:44:35 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * marshal.c (r_symreal): register symbol names as strings first so
+ that r_symlink always returns valid names.
+ [ruby-core:68587] [Bug #10991]
+
+ * marshal.c (r_ivar, r_object0): now need to intern symbol names.
+
+ * marshal.c (r_object0): compare with symbol names.
+
+Sun Mar 22 22:07:40 2015 Kouhei Sutou <kou@cozmixng.org>
+
+ * doc/etc.rd.ja: Fix wrong coding for Emacs.
+
+Sun Mar 22 09:53:15 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * tool/make-snapshot (package): add default CONFIGURE name to
+ follow r50039.
+
+ * tool/make-snapshot (package): substitute configuration variables
+ in Makefile.in instead of passing by the command line, and make
+ temporary Makefile instead of a pipe.
+
+Sun Mar 22 08:09:47 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * common.mk (ext/ripper/ripper.c, ext/rbconfig/sizeof/sizes.c):
+ strip autogenerated dependencies which have invalid syntax in
+ other than nmake.
+
+Sat Mar 21 15:01:26 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/io/console/console.c (console_set_winsize): use handle for
+ writing. GetConsoleScreenBufferInfo seems failing on a handle
+ for reading.
+
+ * io.c: [DOC] update the example of IO#winsize to use $stdout
+ instead of $stdin, which does not work on Windows. a patch by
+ Jan Lelis <mail AT janlelis.de> at [ruby-core:68574].
+ [Bug #10986]
+
+Fri Mar 20 18:41:03 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * proc.c (respond_to_missing_p): check if the receiver responds to
+ the given method by respond_to_missing?.
+
+ * proc.c (mnew_missing): create Method object for method_missing.
+ [ruby-core:68564] [Bug #10985]
+
+Fri Mar 20 17:43:18 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * .travis.yml: enabled email notification.
+
+Fri Mar 20 17:39:52 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * .travis.yml: removed Ruby 1.9.3 build on Travis CI
+
+Fri Mar 20 12:38:36 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (obj_info): obj_info() can receive internal objects.
+
+ * gc.c (check_rvalue_consistency): obj_info() returns const char *.
+
+Fri Mar 20 12:14:37 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (obj_info): show class name and T_DATA type_name.
+
+Thu Mar 19 22:12:46 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (rb_copy_wb_protected_attribute): `dest' can be WB unprotected.
+
+Thu Mar 19 21:25:25 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (rb_copy_wb_protected_attribute): demote `dest' object.
+
+Thu Mar 19 16:18:00 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c, internal.h: export rb_gc_verify_internal_consistency().
+
+Thu Mar 19 16:15:24 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (obj_info): show allocation site if GC_DEBUG is not 0.
+
+Thu Mar 19 16:12:01 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (newobj_of): fix RGENGC_OLD_NEWOBJ_CHECK logics.
+ * skip on incremental marking because not sure what happen :p
+ * rb_gc_writebarrier_remember() is enough to mark children.
+
+Thu Mar 19 16:08:42 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (rb_copy_wb_protected_attribute): need demote for old objects.
+
+Thu Mar 19 10:31:00 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * random.c (fill_random_bytes): release the handle in the static
+ variable, not a local variable.
+
+Thu Mar 19 06:30:35 2015 Koichi Sasada <ko1@atdot.net>
+
+ * object.c (rb_obj_clone): do not touch age (FL_PROMOTED[01]) because
+ rb_obj_alloc() can return old object in debug.
+
+Thu Mar 19 06:29:28 2015 Koichi Sasada <ko1@atdot.net>
+
+ * test/objspace/test_objspace.rb: flag name was changed
+ (long_lived -> uncollectible).
+
+Thu Mar 19 05:30:13 2015 Koichi Sasada <ko1@atdot.net>
+
+ * iseq.c (iseq_mark): skip some marking if iseq->orig is available.
+
+ * iseq.c (rb_iseq_clone): need WB for iseq1->klass = iseq0->klass
+ (done in MEMCPY).
+
+Thu Mar 19 04:55:53 2015 Koichi Sasada <ko1@atdot.net>
+
+ * internal.h (IMEMO_DEBUG): added.
+
+ * internal.h: remove unused FL_IMEMO_MARK_V[0-3].
+
+ * gc.c (rb_imemo_new_debug): added.
+
+ * gc.c (obj_info): show imemo type name.
+
+Thu Mar 19 04:52:26 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (RGENGC_OLD_NEWOBJ_CHECK): add check mechanism.
+
+ If RGENGC_OLD_NEWOBJ_CHECK > 0, then create old objects
+ (not new objects) periodically.
+
+ Create one old objects per RGENGC_OLD_NEWOBJ_CHECK objects are
+ created.
+
+Thu Mar 19 04:46:36 2015 Koichi Sasada <ko1@atdot.net>
+
+ * enum.c (enum_sort_by): add WBs.
+
+Thu Mar 19 03:37:52 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (check_rvalue_consistency): refactoring.
+ * not inline on RGENGC_CHECK_MODE > 0.
+ * check SPECIAL_CONST_P(obj) first.
+ * add a check that remembered_bit is only TRUE when old (age == 3).
+
+ * gc.c (RVALUE_DEMOTE): should clear RVALUE_REMEMBERED bit.
+
+ remembered_bit should be TRUE only for old (age == 3) objects.
+
+ Actually there are no effect because demoted objects will be
+ uncollectible WB unprotected objects (marked at the beginning of
+ every minor GC).
+
+Thu Mar 19 02:52:48 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: rename terminologies.
+ * long_lived -> uncollectible:
+ because this bitmap does not mean "long lived objects in past",
+ but means "prohibit collection these objects until next major GC".
+
+ Uncollectible objects consist of two types objects, one is old
+ objects (WB protected objects which age == 3) and another is
+ uncollectible WB unprotected objects which are referred from old
+ objects
+
+ * remembered_wb_unprotected_objects ->
+ uncollectible_wb_unprotected_objects:
+ because uncollectible objects does not mean remembered objects.
+
+Wed Mar 18 17:21:12 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_writebarrier_generational): add an alternative write
+ barrier (WB) implementation.
+ When finding reference from [Old obj] to [New obj] by WB, current
+ implementation marks [Old obj] as remembered old objects and marks
+ children of [Old obj] at the beginning of marking.
+
+ Added (but disabled) code changes current behaviour. This fix promote
+ [New obj] to old and marks as a remembered old object. We can assume
+ "new objects referred from old objects are maybe long-lived old
+ objects".
+
+ Disadvantage of added algorithm is we may promote unwilling
+ short-lived objects. For example, consider many new objects push and
+ pop to an old stack object. All of new objects (short-lived objects)
+ promote to old objects unexpectedly.
+
+ To compare these behaviour, I add this new code (but disabled it).
+
+Wed Mar 18 17:14:39 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (RVALUE_PROMOTE_RAW): rename to RVALUE_OLD_LONG_LIVED_SET()
+ to make clear.
+
+Wed Mar 18 17:10:01 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (check_rvalue_consistency): do not need to check is_sweeping().
+
+Wed Mar 18 14:13:22 2015 Koichi Sasada <ko1@atdot.net>
+
+ * benchmark/bm_vm1_gc_wb_ary.rb: run GC to finish "marking" phase.
+
+ * benchmark/bm_vm1_gc_wb_obj.rb: ditto.
+
+ * benchmark/bm_vm1_gc_wb_ary_promoted.rb: add parameter
+ full_mark: false to invoke only minor GC.
+
+ * benchmark/bm_vm1_gc_wb_obj_promoted.rb: ditto.
+
+Wed Mar 18 12:07:36 2015 Koichi Sasada <ko1@atdot.net>
+
+ * string.c: add a comment about RSTRING_FSTR.
+
+Wed Mar 18 12:01:53 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * hash.c (rb_any_hash): use same hash values with Float#hash so
+ that -0.0 and +0.0 will be identical.
+ [ruby-core:68541] [Bug #10979]
+
+Wed Mar 18 05:34:32 2015 Koichi Sasada <ko1@atdot.net>
+
+ * string.c: introduce STR_FAKESTR to show string is FAKESTR or not.
+
+ * string.c (STR_SET_SHARED): ignore FAKESTR because only Ruby objects
+ can use write barrier.
+
+Tue Mar 17 18:59:16 2015 Koichi Sasada <ko1@atdot.net>
+
+ * include/ruby/ruby.h: use rb_gc_writebrrier() simply.
+ For incremental GC, we need to get a pointer to the objspace.
+ We can share this pointer for the following WB process.
+ And considering icache hit ratio, process in the GC.
+
+ * gc.c (rb_gc_writebarrier): added.
+
+ * gc.c (gc_writebarrier_generational, gc_writebarrier_incremental):
+ make them NOINLINE because inlining them into rb_gc_writebarrier()
+ makes a prologue code of rb_gc_writebarrier() longer (storing callee
+ save registers).
+
+ This patch improve the performance of WB on micro-benchmarks.
+
+ name ruby 2.1 trunk modified
+ vm1_gc_wb_ary* 0.511 0.632 0.532
+ vm1_gc_wb_ary_promoted* 0.578 0.701 0.674
+ vm1_gc_wb_obj* 0.419 0.575 0.492
+ vm1_gc_wb_obj_promoted* 0.537 0.664 0.618
+ (sec)
+
+Tue Mar 17 18:51:43 2015 Koichi Sasada <ko1@atdot.net>
+
+ * benchmark/bm_vm1_gc_wb_ary(_promoted).rb: separate fastpath and
+ slowpath for WB.
+
+ Before this change bm_vm1_gc_wb_ary.rb tried to check the performance
+ for WB slowpath (making a reference from oldobj to newobj). However,
+ from Ruby 2.2, 3 GCs are needed to promote new objects because
+ only 3 age objects are promoted objects.
+
+ To compare fastpath and slowpath, introduce new "promoted" version
+ benchmark.
+
+ bm_vm1_gc_wb_ary.rb is for fastpath and
+ bm_vm1_gc_wb_ary_promoted.rb is for slowpath.
+
+ * benchmark/bm_vm1_gc_wb_obj(_promoted).rb: ditto.
+
+Tue Mar 17 17:23:11 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * dir.c (glob_helper): distinguish not-yet-stated and DT_UNKNOWN
+ by readdir, and traverse recursively for the former. Linux
+ readdir returns DT_UNKNOWN on some filesystems, e.g., smbfs,
+ iso9660.
+
+Mon Mar 16 17:43:21 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * lib/webrick/server.rb: Fix regression bug in WEBrick's
+ :DoNotReverseLookup config option implementation.
+ [fix GH-731] Patch by @vais
+ * test/webrick/test_do_not_reverse_lookup.rb: ditto.
+
+Sat Mar 14 20:05:23 2015 Kazuki Tanaka <gogotanaka@ruby-lang.org>
+
+ * math.c (math_gamma): optimization for passed small integer.
+
+Sat Mar 14 18:07:23 2015 Kazuki Tanaka <gogotanaka@ruby-lang.org>
+
+ * enum.c: [DOC] Fixes Enumerable#member? documentation
+ [fix GH-756][ci skip] Patch by @shamanime
+
+Sat Mar 14 12:23:53 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * dir.c (glob_helper): use d_type to reduce lstat system calls.
+
+ * win32/dir.h (struct direct): add d_type instead of d_isdir and
+ d_isrep. SYMLINKD is unreliable, since the target can be
+ replaced after a link was created.
+
+ * win32/win32.c (readdir_internal): set d_type.
+
+Sat Mar 14 02:14:50 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (primary): empty parentheses at cmdarg can be null.
+ [ruby-core:68477] [Bug #10957]
+
+Fri Mar 13 15:04:36 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/stringio/stringio.c (strio_close): don't raise on double
+ close for consistent to IO#close.
+
+Fri Mar 13 15:03:20 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * io.c (rb_io_close_read, rb_io_close_write): don't raise after
+ close same as IO#close.
+
+Fri Mar 13 12:29:07 2015 Tanaka Akira <akr@fsij.org>
+
+ * test/readline/test_readline.rb: Restore environment variables:
+ COLUMNS LINES
+
+Fri Mar 13 11:37:46 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/fiddle/extconf.rb: needs --enable-shared when linked to
+ libruby or fiddle.so. since --with-static-linked-ext does no
+ longer link extensions to ruby program with --enable-shared, the
+ only combination needs --enable-static is --disable-shared and
+ --with-static-linked-ext. [ruby-dev:48901] [Bug #10960]
+
+Fri Mar 13 07:02:20 2015 Eric Wong <e@80x24.org>
+
+ * ext/socket/init.c (rsock_s_accept_nonblock): use rb_hash_lookup2
+ * ext/openssl/ossl_ssl.c (get_no_exception): new function
+ (ossl_ssl_accept_nonblock): use get_no_exception
+ (ossl_ssl_read_internal): ditto
+ (ossl_ssl_write_nonblock): ditto
+ [ruby-core:68511]
+
+Fri Mar 13 07:01:38 2015 Eric Wong <e@80x24.org>
+
+ * ext/openssl/ossl_ssl.c: predefine wait_*able symbols
+
+Thu Mar 12 22:59:53 2015 Tanaka Akira <akr@fsij.org>
+
+ * test/lib/leakchecker.rb: Check environment variables.
+
+Thu Mar 12 05:54:27 2015 Eric Wong <e@80x24.org>
+
+ * ext/socket/init.c (rsock_s_accept_nonblock):
+ support exception: false
+ [ruby-core:66385] [Feature #10532]
+ * ext/socket/init.c (rsock_init_socket_init): define new symbols
+ * ext/socket/rubysocket.h: adjust prototype
+ * ext/socket/socket.c (sock_accept_nonblock): support exception: false
+ * ext/openssl/ossl_ssl.c (ossl_ssl_accept_nonblock): ditto
+ * ext/socket/socket.c (Init_socket): adjust accept_nonblock definition
+ * ext/openssl/ossl_ssl.c (Init_ossl_ssl): ditto
+ * ext/socket/tcpserver.c (rsock_init_tcpserver): ditto
+ * ext/socket/unixserver.c (rsock_init_unixserver): ditto
+ * ext/socket/tcpserver.c (tcp_accept_nonblock): adjust
+ rsock_s_accept_nonblock call
+ * ext/socket/unixserver.c (unix_accept_nonblock): ditto
+ * ext/openssl/ossl_ssl.c (ossl_start_ssl): support no_exception
+ * ext/openssl/ossl_ssl.c (ossl_ssl_connect): adjust ossl_start_ssl call
+ * ext/openssl/ossl_ssl.c (ossl_ssl_connect_nonblock): ditto
+ * ext/openssl/ossl_ssl.c (ossl_ssl_accept): ditto
+ * test/socket/test_nonblock.rb (test_accept_nonblock): test for
+ "exception :false"
+ * test/socket/test_tcp.rb (test_accept_nonblock): new test
+ * test/socket/test_unix.rb (test_accept_nonblock): ditto
+ * test/openssl/test_pair.rb (test_accept_nonblock_no_exception): ditto
+
+Thu Mar 12 10:53:06 2015 Koichi Sasada <ko1@atdot.net>
+
+ * internal.h, node.h: move a definition of `struct rb_global_entry'
+ and related functions from node.h to internal.h.
+
+ * variable.c: remove unused include pragma.
+
+ * common.mk: remove unused dependency.
+
+Thu Mar 12 10:32:39 2015 Koichi Sasada <ko1@atdot.net>
+
+ * common.mk: remove unused dependency.
+
+Thu Mar 12 08:20:14 2015 Koichi Sasada <ko1@atdot.net>
+
+ * load.c: removed unused header file "node.h".
+
+ * method.h: ditto.
+
+ * symbol.c: ditto.
+
+Thu Mar 12 08:14:48 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: RGENGC_CHECK_MODE should be 0.
+
+Thu Mar 12 07:44:17 2015 Koichi Sasada <ko1@atdot.net>
+
+ * internal.h: use T_IMEMO to represent `struct MEMO' value.
+ memo->v1 and memo->v2 is WB protected values.
+ So use MEMO_V1/V2_SET() macros to set these values.
+ memo->u3 is ambiguous (sometimes a VALUE, sometimes an integer
+ value), so use gc_mark_maybe() in gc.c to mark it.
+
+ Rename NEW_MEMO() to MEMO_NEW().
+
+ Move MEMO_FOR and NEW_MEMO_FOR macros from node.h.
+
+ Export a rb_imemo_new() function for ext/ripper.
+
+ * node.h: remove NODE_MEMO.
+
+ * enum.c: catch up these change.
+
+ * enumerator.c: ditto.
+
+ * load.c: ditto.
+
+ * ext/objspace/objspace.c (count_nodes): ditto.
+
+ * gc.c (gc_mark_children): mark imemo_memo type.
+
+ * parse.y (new_args_gen): use T_IMEMO.
+ (I'm not sure it is working correctly...)
+
+Wed Mar 11 22:36:34 2015 Koichi Sasada <ko1@atdot.net>
+
+ * eval.c (frame_called_id): it should use vm_ifunc type.
+
+ * eval.c (frame_func_id): ditto.
+
+Wed Mar 11 22:27:05 2015 Koichi Sasada <ko1@atdot.net>
+
+ * node.h: remove NODE_IFUNC, NEW_IFUNC.
+
+ * internal.h: use T_IMEMO for IFUNC.
+
+ rename `struct IFUNC' to `struct vm_ifunc' and move the definition
+ from vm_insnhelper.h. Add imemo_ifunc.
+
+ * gc.c (gc_mark_children): mark imemo_ifunc type T_IMEMO object.
+
+ * compile.c: catch up these changes.
+
+ * proc.c: ditto.
+
+ * vm_core.h (RUBY_VM_IFUNC_P): ditto.
+
+ * vm_eval.c (rb_iterate): ditto.
+
+ * vm_insnhelper.c: ditto.
+
+ * ext/objspace/objspace.c: ditto.
+
+Wed Mar 11 21:53:43 2015 Koichi Sasada <ko1@atdot.net>
+
+ * internal.h, eval_intern.h: move CREF accessors.
+
+ List IMEMO supported types in internal.h.
+
+Wed Mar 11 21:45:36 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_insnhelper.h: use T_IMEMO to create THROW_DATA.
+
+ Add THROW_DATA_NEW().
+
+ * internal.h: move definition of `struct THROW_DATA'
+ from vm_insnhelper.h to internal.h.
+
+ Rename `THROW_DATA' to `vm_throw_data'.
+
+ * eval_intern.h (THROW_DATA_P): move to internal.h.
+ THROW_DATA is no longer T_NODE, so check T_IMEMO.
+
+ * gc.c (gc_mark_children): mark THROW_DATA.
+
+ * vm.c: catch up these changes.
+
+ * vm_eval.c: ditto.
+
+ * vm_insnhelper.c: ditto.
+
+Wed Mar 11 21:21:56 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_insnhelper.c: use T_IMEMO to create SVAR.
+
+ * internal.h, vm_insnhelper.h: move definition `struct SVAR'
+ from vm_insnhelper.h to internal.h. And rename it to struct vm_svar.
+
+ new imemo_type imemo_svar is added.
+
+ * gc.c (gc_mark_children): mark imemo_svar.
+
+ * node.c (rb_gc_mark_node): remove useless marking.
+
+Wed Mar 11 19:35:46 2015 Koichi Sasada <ko1@atdot.net>
+
+ * include/ruby/ruby.h: introduce new type T_IMEMO.
+ T_IMEMO is Internal Memo type, internal use only.
+ T_IMEMO has same purpose of NODE_MEMO.
+
+ To insert T_IMEMO, type numbers are modified a little.
+
+ * internal.h: define struct RIMemo. Each RIMemo objects
+ has imemo_type. We can observe it by the imemo_type() function.
+
+ * gc.c (rb_imemo_new): added.
+
+ * node.h: remove NODE_CREF and NEW_CREF().
+
+ * node.c (rb_gc_mark_node): ditto.
+
+ * vm.c (vm_cref_new): use rb_imem_new().
+
+ * vm_eval.c: ditto.
+
+ * vm_insnhelper.c: use RIMemo objects for CREF.
+
+ * ext/objspace/objspace.c: support T_IMEMO.
+
+Wed Mar 11 17:03:20 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: fix memory leak by prepend method.
+
+ It is easy to reproduce with such script:
+
+ module M; def bar; end; end
+ loop{
+ Class.new do
+ def foo; end
+ prepend M
+ end
+ }
+
+ * gc.c (obj_free): free T_ICLASS::m_tbl if it is created by prepend.
+ To recognize it, check RICLASS_IS_ORIGIN flag.
+
+ * gc.c (gc_mark_children): T_ICLASS objects only need to mark
+ T_ICLASS::m_tbl if RICLASS_IS_ORIGIN is set.
+
+ * gc.c (obj_memsize_of): count T_ICLASS if RICLASS_IS_ORIGIN is set.
+
+ * internal.h (RCLASS_SET_ORIGIN): add to set RCLASS_SET_ORIGIN.
+
+ TODO: The word `origin' seems not good name. We need to invent
+ another good name.
+
+ * class.c: use RCLASS_SET_ORIGIN().
+
+ * class.c (class_alloc): zero clear rb_classext_t.
+
+Wed Mar 11 13:28:49 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in: check also procstat_getvmmap, which is not
+ available on FreeBSD 9. [ruby-core:68468] [Bug #10954]
+
+ * vm_dump.c (procstat_vm): use kinfo_getvmmap instead if
+ procstat_getvmmap is not available.
+
+Wed Mar 11 09:15:21 2015 Koichi Sasada <ko1@atdot.net>
+
+ * internal.h: define struct MEMO.
+
+ * enum.c: use MEMO.
+
+ * enumerator.c: ditto.
+
+ * load.c: ditto.
+
+ * node.h: return (struct MEMO *) pointer.
+
+Wed Mar 11 06:26:21 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_insnhelper.h (THROW_DATA_STATE): return int, not VALUE.
+
+ * vm_insnhelper.h (THROW_DATA_STATE_SET): accept int value.
+
+Wed Mar 11 05:06:46 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_eval.c (rb_catch_protect): use THROW_DATA_VAL().
+
+Wed Mar 11 04:56:04 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_insnhelper.h: define struct IFUNC.
+
+ * vm_eval.c (rb_iterate): use it.
+
+ * vm_insnhelper.c (vm_yield_with_cfunc): ditto.
+
+Wed Mar 11 03:52:12 2015 Koichi Sasada <ko1@atdot.net>
+
+ * eval_intern.h (THROW_DATA_P): use RB_TYPE_P() instead of
+ BUILTIN_TYPE().
+
+ * thread.c (thread_join): use THROW_DATA_P().
+
+Wed Mar 11 03:48:01 2015 Koichi Sasada <ko1@atdot.net>
+
+ * proc.c: use RUBY_VM_IFUNC_P() to recognize IFUNC or not.
+
+ * vm.c: ditto.
+
+ * vm_dump.c: ditto.
+
+ * vm_insnhelper.c: ditto.
+
+ * vm_core.h (RUBY_VM_IFUNC_P): use RB_TYPE_P() instead of
+ BUILTIN_TYPE().
+
+Wed Mar 11 03:21:37 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_insnhelper.h: define struct THROW_DATA to represent
+ throwing data. Also define accessor functions.
+
+ * eval_intern.h: move related changes into vm_insnhelper.h.
+ Now these MACROs (functions) are only used in vm*.c.
+
+ There is only THROW_DATA_P(err) to check this data type or not.
+
+ * vm.c: catch up these changes.
+
+ * vm_eval.c: ditto.
+
+ * vm_insnhelper.c: ditto.
+
+Wed Mar 11 00:57:00 2015 Rei Odaira <Rei.Odaira@gmail.com>
+
+ * test/rubygems/test_gem_security_trust_dir.rb: The return value of
+ File::Stat#mode is OS dependent. In AIX, 0200000 is set.
+
+Tue Mar 10 20:03:41 2015 Tanaka Akira <akr@fsij.org>
+
+ * lib/webrick/server.rb: Invoke setup_shutdown_pipe in start method
+ instead of listen method.
+ [ruby-core:68476] [Bug #10956] Reported by Shintaro Kojima.
+
+Tue Mar 10 17:27:27 2015 Koichi Sasada <ko1@atdot.net>
+
+ * thread.c (thread_join): Fixnum (except TAG_FATAL) and
+ NODE should not be reached here.
+
+Mon Mar 9 21:42:10 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_insnhelper.c (ep_cref): rename to lep_cref() because it should be
+ local ep.
+
+Mon Mar 9 16:34:36 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/stringio/stringio.c (strio_close): don't raise on double
+ close for consistent to IO#close.
+
+Mon Mar 09 06:44:48 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_insnhelper.h: define struct SVAR for SVAR.
+ This data type is also same layout of NODE (NODE_IF).
+
+ * vm_insnhelper.c: catch up this change.
+
+Mon Mar 9 06:43:21 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_insnhelper.c (lep_svar_set): add WBs.
+
+Mon Mar 9 06:19:06 2015 Koichi Sasada <ko1@atdot.net>
+
+ * internal.h: define rb_cref_t and change to use it.
+
+ rb_cref_t is data type of CREF. Now, the body is still NODE.
+ It is easy to understand what is CREF and what is pure NODE.
+
+Mon Mar 9 06:00:37 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_insnhelper.h (COPY_CREF_OMOD): fix translation miss.
+
+Mon Mar 9 04:47:58 2015 Koichi Sasada <ko1@atdot.net>
+
+ * internal.h: define CREF accessor macros.
+ * CREF_CLASS(cref)
+ * CREF_NEXT(cref)
+ * CREF_VISI(cref)
+ * CREF_VISI_SET(cref, v)
+ * CREF_REFINEMENTS(cref)
+ * CREF_PUSHED_BY_EVAL(cref)
+ * CREF_PUSHED_BY_EVAL_SET(cref)
+ * CREF_OMOD_SHARED(cref)
+ * CREF_OMOD_SHARED_SET(cref)
+ * CREF_OMOD_SHARED_UNSET(cref)
+
+ This is process to change CREF data type from NODE.
+
+Sun Mar 8 22:50:57 2015 Tanaka Akira <akr@fsij.org>
+
+ * ext/zlib/zlib.c (rb_gzfile_close): Don't raise on double
+ close for consistent to IO#close.
+
+Sun Mar 8 16:57:35 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * dir.c (glob_helper): match patterns against legacy short names
+ too, not only ordinary names. [ruby-core:67954] [Bug #10819]
+
+ * win32/dir.h (struct direct): add short name members.
+
+ * win32/win32.c (opendir_internal, readdir_internal): ditto.
+
+Sat Mar 7 09:36:05 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * array.c: document that first element is kept when using
+ Array#uniq and #uniq! [fix GH-845][ci skip]
+ Patch by @riffraff
+
+Sat Mar 7 09:28:02 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * thread.c: Mutex#owned? is no longer experimental since 2.1.0
+ [fix GH-839][ci skip] Patch by @takiy33
+
+Sat Mar 7 09:18:42 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * tool/merger.rb: Added documentation to version method.
+ [fix GH-847][ci skip] Patch by @magikid
+
+Fri Mar 6 22:50:36 2015 Koichi Sasada <ko1@atdot.net>
+
+ * class.c (rb_prepend_module): need a WB for klass -> origin.
+
+Fri Mar 6 20:18:38 2015 Koichi Sasada <ko1@atdot.net>
+
+ * fix namespace issue on singleton class expressions. [Bug #10943]
+
+ * vm_core.h, method.h: remove rb_iseq_t::cref_stack. CREF is stored
+ to rb_method_definition_t::body.iseq_body.cref.
+
+ * vm_insnhelper.c: modify SVAR usage.
+ When calling ISEQ type method, push CREF information onto method
+ frame, SVAR located place. Before this fix, SVAR is simply nil.
+ After this patch, CREF (or NULL == Qfalse for not iseq methods)
+ is stored at the method invocation.
+
+ When SVAR is required, then put NODE_IF onto SVAR location,
+ and NDOE_IF::nd_reserved points CREF itself.
+
+ * vm.c (vm_cref_new, vm_cref_dump, vm_cref_new_toplevel): added.
+
+ * vm_insnhelper.c (vm_push_frame): accept CREF.
+
+ * method.h, vm_method.c (rb_add_method_iseq): added. This function
+ accepts iseq and CREF.
+
+ * class.c (clone_method): use rb_add_method_iseq().
+
+ * gc.c (mark_method_entry): mark method_entry::body.iseq_body.cref.
+
+ * iseq.c: remove CREF related codes.
+
+ * insns.def (getinlinecache/setinlinecache): CREF should be cache key
+ because a different CREF has a different namespace.
+
+ * node.c (rb_gc_mark_node): mark NODE_IF::nd_reserved for SVAR.
+
+ * proc.c: catch up changes.
+
+ * struct.c: ditto.
+
+ * insns.def: ditto.
+
+ * vm_args.c (raise_argument_error): ditto.
+
+ * vm_eval.c: ditto.
+
+ * test/ruby/test_class.rb: add a test.
+
+Fri Mar 6 18:19:13 2015 Koichi Sasada <ko1@atdot.net>
+
+ * test/webrick/test_filehandler.rb: on vboxsf (on VirtualBox
+ on Windows 7), file name and permissions are strange (can access
+ by short file name and so on).
+
+ Simply skip on such tests on such FS. To detect strange FS, this
+ patch use a part of code `File.executable?(__FILE__)`.
+ Please correct them if there are better ways.
+
+Fri Mar 6 17:31:29 2015 Koichi Sasada <ko1@atdot.net>
+
+ * test/ruby/test_beginendblock.rb: do not change directory.
+
+ Run system command in the directory mounted by vboxsf on Windows 7
+ and get warning like that "warning: Insecure world writable dir...".
+
+Fri Mar 6 10:31:00 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_eval.c (vm_call_super): search next super class from the
+ original class, to get rid of infinite recursion with
+ prepending. a patch by Seiei Higa <hanachin AT gmail.com> at
+ [ruby-core:68434]. [ruby-core:68093] [Bug #10847]
+
+Fri Mar 6 08:45:26 2015 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
+
+ * lib/matrix.rb: Add Vector#round. Patch by Jordan Stephens.
+ [Fixes GH-802]
+
+Fri Mar 6 07:33:03 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (obj_info): show node name too.
+
+Fri Mar 6 07:00:44 2015 Koichi Sasada <ko1@atdot.net>
+
+ * internal.h: remove struct method_table_wrapper.
+ struct method_table_wrapper was introduced to avoid duplicate marking
+ for method tables.
+
+ For example, `module M1; def foo; end; end` make one method table
+ (mtbl) contains a method `foo`. M1 (T_MODULE) points mtbl.
+ Classes C1 and C2 includes M1, then two T_ICLASS objects are created
+ and they points mtbl too. In this case, three objects (one T_MODULE
+ and two T_ICLASS objects) points same mtbl. On marking phase, these
+ three objects mark same mtbl. To avoid such duplication, struct
+ method_table_wrapper was introduced.
+
+ However, created two T_ICLASS objects have same or shorter lifetime
+ than M1 (T_MODULE) object. So that we only need to mark mtbl from M1,
+ not from T_ICLASS objects. This patch tries marking only from M1.
+ In other words, original module (M1) has responsibility to mark mtbl.
+ Because of no duplicate marking, we don't need method_table_wrapper
+ any more.
+
+ Note that one `Module#prepend` call creates two T_ICLASS objects.
+ One for referring to a prepending Module object, same as
+ `Module#include`. We don't need to care this T_ICLASS.
+ One for moving original mtbl from a prepending class. We need to
+ mark such mtbl from this T_ICLASS object. To mark the mtbl,
+ we need to use `RCLASS_ORIGIN(klass)` on marking from a prepended
+ class `klass`.
+
+ * class.c: ditto.
+
+ * eval.c (rb_using_refinement): ditto.
+
+ * gc.c: ditto.
+
+ * include/ruby/ruby.h: define m_tbl directly. The definition of
+ struct RClass should be moved to (srcdir)/internal.h.
+
+ * method.h: remove decl of rb_free_m_tbl_wrapper().
+
+ * object.c: use RCLASS_M_TBL() directly.
+
+Fri Mar 6 02:50:12 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * dir.c (replace_real_basename): need to check the return value of
+ GLOB_REALLOC().
+
+Fri Mar 6 02:26:03 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * dir.c (replace_real_basename): shouldn't create Ruby object before
+ the object system is loaded.
+ [ruby-core:68430] [Bug #10941]
+
+Wed Mar 5 16:58:43 2015 Kazuki Tanaka <gogotanaka@ruby-lang.org>
+
+ * hash.c: [DOC] #delete method actually returns nil, if the key
+ is not found. [fix GH-844][ci skip] Patch by @ivdma
+
+Wed Mar 5 12:22:23 2015 Kazuki Tanaka <gogotanaka@ruby-lang.org>
+
+ * math.c: refactoring: remove unnecessary variable d0 to unify code
+ appearance.
+
+Thu Mar 5 11:50:54 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * vm_eval.c (eval_string_with_cref): A binding should keep
+ refinements activation information and the refinements should be
+ activated in subsequent eval calls with the binding.
+ [ruby-core:67945] [Bug #10818]
+
+Thu Mar 5 11:16:55 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * test/ruby/test_refinement.rb: There is no need anymore to suppress
+ warnings.
+
+Thu Mar 5 08:31:02 2015 Rei Odaira <Rei.Odaira@gmail.com>
+
+ * random.c (random_raw_seed): Avoid calling fill_random_bytes()
+ if the requested size is 0. AIX returns -1 for 0-byte read from
+ /dev/urandom, while other UNIX returns 0. With this change,
+ Random.raw_seed(0) consistently returns "" in any UNIX.
+
+Wed Mar 4 12:43:32 2015 Kazuki Tanaka <gogotanaka@ruby-lang.org>
+
+ * test/ruby/test_math.rb (assert_float_and_int): Refactor test cases
+ by introducing assert_float_and_int. [misc #10810]
+
+Wed Mar 4 11:52:30 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * symbol.c (Init_sym): make dsym_fstrs a hash compared by identity
+ as the keys are unique fstrings, to get rid of running hash and
+ compare methods and causing new object allocation during garbage
+ collection phase. [ruby-dev:48891] [Bug #10933]
+
+Wed Mar 4 10:16:57 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * enum.c: Fix typo in slice_after's exception message.
+ [fix GH-842][ci skip] Patch by @jsyeo
+
+Wed Mar 4 10:15:37 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * doc/syntax/methods.rdoc: add some missing spaces and
+ fix a grammatical error in method docs.
+ [fix GH-843][ci skip] Patch by @nikolas
+
+Wed Mar 4 02:13:06 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * tool/redmine-backporter.rb (backport_command_string): pick up only
+ when the revision exists in trunk.
+
+Wed Mar 4 00:44:56 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * thread.c (rb_thread_io_blocking_region): assigned variables
+ inside EXEC_TAG() should be volatile.
+
+ * thread.c (rb_thread_s_handle_interrupt): ditto.
+
+ * thread.c (exec_recursive): ditto.
+
+Wed Mar 4 00:29:18 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * tool/redmine-backporter.rb: now can specify shorten form of commands.
+
+Tue Mar 3 23:41:42 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * tool/redmine-backporter.rb (Readline.readline): drop untreated control
+ characters.
+
+Tue Mar 3 22:25:24 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * test/lib/envutil.rb (EnvUtil.invoke_ruby): need to rescue because
+ Signal.signame may raise exception.
+
+Tue Mar 3 16:57:39 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * tool/redmine-backporter.rb: use 'b' instead of 's' for showing
+ Backport options for merger.rb.
+
+Tue Mar 3 16:55:23 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * tool/redmine-backporter.rb: show selected ticket number at prompt.
+
+Tue Mar 3 14:47:30 2015 Kazuki Tanaka <gogotanaka@ruby-lang.org>
+
+ * math.c (num2dbl_with_to_f): direct casting from Rational to double.
+ [Feature #10909]
+
+ * test/ruby/test_math.rb: add tests for the above change.
+
+Tue Mar 3 07:52:20 2015 Rei Odaira <Rei.Odaira@gmail.com>
+
+ * test/ruby/test_symbol.rb: avoid a false positive in AIX.
+
+Tue Mar 3 00:59:39 2015 Naohisa Goto <ngotogenome@gmail.com>
+
+ * configure.in: set PRELOADENV in Solaris to avoid "wrong ELF class"
+ error. [Bug #10926] [ruby-dev:48888]
+ * configure.in: set LIBPATHENV for 32-bit compile in Solaris
+ in addition to 64-bit.
+
+Mon Mar 2 15:36:10 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in: do not check _setjmp unless _longjmp is available,
+ so that configure results will not be changed by cache.
+
+Mon Mar 2 14:44:56 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in (RUBY_REPLACE_TYPE): restore unsigned type from
+ cached variable only if the target type is not available.
+
+Mon Mar 2 13:04:27 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * signal.c (sig_signame): return nil if the argument is a valid
+ signal number.
+
+Mon Mar 2 12:05:04 2015 Naohisa Goto <ngotogenome@gmail.com>
+
+ * test/net/ftp/test_ftp.rb (create_ftp_server): set SO_OOBINLINE
+ for receiving OOB data which is sent with MSG_OOB flag in
+ portable way. [Bug #10915] [ruby-dev:48885]
+ * test/net/ftp/test_ftp.rb (test_abort, test_status): use gets
+ for receiving OOB data in portable way.
+
+Mon Mar 2 11:43:07 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in (RUBY_REPLACE_TYPE): restore unsigned type from
+ cached variable.
+
+Mon Mar 2 06:01:41 2015 Eric Wong <e@80x24.org>
+
+ * ext/io/wait/wait.c (io_nread): wrap return value with INT2FIX
+ Thanks to Yura Sokolov <funny.falcon@gmail.com>
+ [ruby-core:68369] [Bug#10923]
+ * test/io/wait/test_io_wait.rb (test_nread_buffered):
+ fix broken test
+
+Sun Mar 1 20:21:16 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in (RUBY_REPLACE_TYPE): restore convertible type from
+ cached variable, so that configured results will be stable.
+
+Sun Mar 1 18:10:34 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in (rb_cv_broken_memmem): check before adding the
+ result HAVE_MEMMEM macro to confdefs.h, so that configured
+ results will be stable.
+
+Sun Mar 1 11:17:56 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * gc.c (id2ref): prohibit from accessing internal objects.
+ [ruby-core:68348] [Bug #10918]
+
+Sun Mar 1 09:06:11 2015 Tanaka Akira <akr@fsij.org>
+
+ * lib/time.rb (strptime): Support %s.%N.
+ [ruby-core:68301] [Bug #10904] Patch by Sadayuki Furuhashi.
+
+Sat Feb 28 17:18:39 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * enum.c (enum_each_slice, enum_each_cons): limit elements size by
+ the enumerator size. suggested by Hans Mackowiak <hanmac AT
+ gmx.de> at [ruby-core:68335]
+
+Sat Feb 28 15:44:20 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_dump.c (rb_vm_bugreport): get rid of making new strings
+ inside signal context.
+
+ * variable.c (rb_tmp_class_path): defer making temporary class
+ path string.
+
+ * variable.c (rb_search_class_path): search class path or return
+ Qnil or Qfalse if unnamed, not creating a temporary path.
+
+Sat Feb 28 15:02:02 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * variable.c (rb_tmp_class_path): preserve name encoding of an
+ anonymous instance of module/class subclass.
+
+Sat Feb 28 08:24:30 2015 Rei Odaira <Rei.Odaira@gmail.com>
+
+ * ext/pty/pty.c: AIX supports autopush.
+ Patch by Perry Smith [ruby-core:58539] [Bug #9144]
+
+Fri Feb 27 22:00:05 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * lib/rubygems: Update to RubyGems 2.4.6 and HEAD(800f2e6).
+ Fixed #1159, #1171, #1173 on rubygems/rubygems
+ * test/rubygems: ditto.
+
+Fri Feb 27 20:55:42 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * lib/rake: Update to rake (9237e74), typo fix and remove needless
+ private syntax.
+ * test/rake: ditto.
+
+Fri Feb 27 17:06:44 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_core.h: define vm_svar_index.
+
+ * vm_insnhelper.c, vm.c, compile.c: use vm_svar_index names.
+
+ * iseq.h: remove DEFAULT_SPECIAL_VAR_COUNT.
+ use VM_SVAR_FLIPFLOP_START instead.
+
+Fri Feb 27 13:57:48 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * io.c (setup_narg): wipe away expanded part of buffer to get rid
+ of revealing uncleaned data. reported by Dongkwan Kim <dkay AT
+ kaist.ac.kr>.
+
+Wed Feb 25 22:25:07 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * spec/default.mspec: use default configuration file name.
+ https://github.com/ruby/rubyspec/commit/cc69f337b06362e5607ffa3e3ad40ef7494960cf
+
+Wed Feb 25 22:21:56 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * spec/default.mspec: remove specific version number.
+ https://github.com/ruby/rubyspec/commit/7a909e925c1baa9c700bd44af9241aef6e596714
+
+Wed Feb 25 22:04:04 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * ext/win32/Win32API.rb (initialize): accept both a string and an array
+ for the arguments of the imported function.
+ reported by Aaron Stone [ruby-core:68208] [Bug #10876] [Fixes GH-835]
+
+Wed Feb 25 18:12:11 2015 Eric Wong <e@80x24.org>
+
+ * signal.c (sighandler): preserve errno
+ Patch by Steven Stewart-Gallus <sstewartgallus00@mylangara.bc.ca>
+ [ruby-core:68172] [Bug #10866]
+
+Wed Feb 25 15:59:35 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * dir.c (push_pattern, push_glob): make globbed file names same
+ encoding to the given pattern.
+
+Wed Feb 25 15:27:16 2015 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * tool/merger.rb: support 2.1+ versioning scheme.
+
+Tue Feb 25 08:49:12 2015 Kazuki Tanaka <gogotanaka@ruby-lang.org>
+
+ * lib/cmath.rb (log): raise ArgumentError when more than 2 arguments
+ are passed. [ruby-core:66143] [Bug #10487]
+
+Tue Feb 25 02:15:17 2015 Kazuki Tanaka <gogotanaka@ruby-lang.org>
+
+ * test/ruby/test_math.rb: Use assert_infinity instead of assert_equal(1.0/0, ...).
+
+ * test/ruby/test_math.rb: Add tests for overriding Integer#to_f.
+ [ruby-core:67919] [Misc #10809]
+
+Tue Feb 24 22:58:48 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * complex.c (nucomp_mul): calculate as rotation in complex plane
+ if matrix calculation resulted in NaN.
+
+Tue Feb 24 21:45:39 2015 Kazuki Tanaka <gogotanaka@ruby-lang.org>
+
+ * test/ruby/test_math.rb(test_cbrt): Add an assertion for Math.cbrt(1.0/0)
+ and move #test_cbrt to more proper place.
+
+Tue Feb 24 19:09:25 2015 Koichi Sasada <ko1@atdot.net>
+
+ * vm_insnhelper.c (lep_svar_place, lep_svar_get): do not create
+ additional T_NODE object (svars holder) when only getting
+ svars.
+
+Tue Feb 24 11:49:48 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * time.c (time_zone_name): should be US-ASCII only if all 7-bits,
+ otherwise locale encoding. [ruby-core:68230] [Bug #10887]
+
+Tue Feb 24 09:47:07 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * string.c (chompped_length): enable smart chomp for all non-dummy
+ encoding strings, not only default_rs.
+ [ruby-core:68258] [Bug #10893]
+
+Mon Feb 23 23:19:42 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * tool/vcs.rb (IO.popen): support :chdir option.
+
+ * tool/vcs.rb (VCS::GIT.get_revisions): use :chdir option instead
+ of -C option which is not supported by older git.
+ [ruby-dev:48880] [Bug #10890]
+
+Mon Feb 23 15:26:39 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * string.c (rb_str_split_m): raise ArgumentError at broken string
+ not RegexpError, as Regexp is not involved in.
+ [ruby-core:68229] [Bug #10886]
+
+Mon Feb 23 07:25:29 2015 Benoit Daloze <eregontp@gmail.com>
+
+ * time.c: Zone encoding should be US-ASCII if all 7-bits. Fix r46907.
+
+ * test/ruby/test_time.rb, test/ruby/test_time_tz.rb: Update tests.
+
+Sun Feb 22 18:33:42 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * common.mk: use ruby organization for rubyspec.
+
+Sun Feb 22 15:56:06 2015 Kazuki Tsujimoto <kazuki@callcc.net>
+
+ * vm_insnhelper.c (rb_vm_rewrite_cref_stack): copy nd_refinements
+ of original crefs. It fixes segmentation fault when calling
+ refined method in duplicate module. [ruby-dev:48878] [Bug #10885]
+
+ * vm_core.h, class.c: change accordingly.
+
+ * test/ruby/test_refinement.rb: add a test for above.
+
+Sun Feb 22 10:43:37 2015 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (rb_objspace_call_finalizer): control GC execution during
+ force firnalizations at the end of interpreter process.
+ [Bug #10768]
+
+ 1) Prohibit incremental GC while running Ruby-level finalizers
+ to avoid any danger.
+ 2) Prohibit GC while invoking T_DATA/T_FILE data structure
+ because these operations break object relations consistency.
+
+ This patch can introduce another memory consuming issue because
+ Ruby-level finalizers can run after (2), GC is disabled.
+ However, basically object consistency was broken at (2) as I
+ described above. So that running Ruby-level finalizers contains
+ danger originally. Because of this point, I need to suggest to
+ remove these 3 lines (invoking remaining finalizers). And add a
+ rule to add that finalizers should not add new finalizers, or
+ say there is no guarantee to invoke finalizers that added by
+ another finalizer.
+
+Sun Feb 22 04:07:05 2015 Zachary Scott <e@zzak.io>
+
+ * ext/openssl/ossl_asn1.c: [DOC] RDoc formatting fixes for
+ ASN1::ObjectId with patch from @vbatts [Fixes GH-834]
+
+ * ext/openssl/ossl_bn.c: ditto.
+
+Sat Feb 21 19:51:49 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * re.c (match_aref): RMatch::regexp is Qnil after matching by a
+ string since r45451. [ruby-core:68209] [Bug #10877]
+
+Sat Feb 21 16:18:42 2015 Stefan Schuler <mail@stefanschuessler.de>
+
+ * compar.c (Init_Comparable): [DOC] Replace camelcase variable name.
+ [Fix GH-833]
+
+Fri Feb 20 17:27:12 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * file.c (rb_file_identical_p): fix handle leak, ensure to close
+ the handle of the first argument.
+
+Fri Feb 20 17:19:23 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * win32/win32.c (different_device_p): compare by volume serial
+ numbers, not by path names. [ruby-core:68162] [Bug #10865]
+
+Thu Feb 19 01:58:10 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * win32/file.c (rb_file_expand_path_internal): neither the drive
+ of base directory nor the current drive are involved in the
+ result if different than the drive of path.
+ [ruby-core:68130] [Bug #10858]
+
+Wed Feb 18 10:48:56 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * win32/win32.c (wrename): return EXDEV if moving a directory to
+ another drive, since MoveFileExW does not set proper error code.
+ [ruby-core:68162] [Bug #10865]
+
+Wed Feb 18 03:13:52 2015 Aaron Patterson <aaron@tenderlovemaking.com>
+
+ * ext/psych/lib/psych.rb: bump psych version.
+ * ext/psych/psych.gemspec: ditto
+ * ext/psych/yaml/scanner.c: add latest libyaml change.
+ * test/psych/helper.rb: support newer minitest
+ * test/psych/test_to_yaml_properties.rb: ditto
+
+Tue Feb 17 11:47:17 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/resolv.rb (Resolv::DNS::Resource#==, #hash): elements
+ returned by Kernel#instance_variables are Symbols now.
+ [ruby-core:68128] [Bug #10857]
+
+Tue Feb 17 10:59:10 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * doc/syntax/calling_methods.rdoc: Fix documentation for "calling_methods"
+ Patch by @sos4nt [fix GH-830][ci skip]
+
+Tue Feb 17 10:53:29 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * win32/file.c (rb_file_expand_path_internal): do not make invalid
+ (or ADS) path if the path has a drive letter, the result also
+ should have be under it. [ruby-core:68130] [Bug #10858]
+
+Tue Feb 17 10:47:20 2015 Iain Beeston <iain.beeston@gmail.com>
+
+ * hash.c: Added docs to explain that #include? and #member? do not
+ check member equality
+ * lib/set.rb: ditto
+
+Mon Feb 16 20:58:49 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * compile.c (compile_massign): optimization for special case,
+ assignments by aset or attrset.
+ http://kokizzu.blogspot.jp/2015/02/c-java-hhvm-ruby-nodejsrhinojscspidermo.html
+ http://www.atdot.net/~ko1/diary/201502.html#d16
+
+Sun Feb 15 10:41:23 2015 Sho Hashimoto <sho-h@ruby-lang.org>
+
+ * doc/standard_library.rdoc: [DOC] delete removed libraries.
+ [misc #10843] [ci skip]
+
+Sat Feb 14 12:20:01 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * random.c (rand_random_number): add a method to return a random
+ number like SecureRandom to Random::Formatter.
+
+ * lib/securerandom.rb (random_bytes): move to Random::Formatter,
+ the base method of the module.
+
+Sat Feb 14 12:01:32 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * random.c (random_raw_seed): extract platform dependent random
+ seed initialization function as a new method Random.raw_seed.
+
+ * lib/securerandom.rb (SecureRandom): use Random.raw_seed.
+
+Sat Feb 14 00:49:37 2015 Aaron Patterson <aaron@tenderlovemaking.com>
+
+ * ext/coverage/coverage.c: Add Coverage.peek_result. Allows you to
+ capture coverage information without stopping the coverage tool.
+ [ruby-core:67940] [Feature #10816]
+
+ * test/coverage/test_coverage.rb: test for change.
+
+Fri Feb 13 21:52:05 2015 Yusuke Endoh <mame@tsg.ne.jp>
+
+ * string.c (str_discard): does not free for STR_NOFREE string.
+ [Bug #10853][ruby-core:68110]
+
+ * bootstraptest/test_string.rb: test for above.
+
+Fri Feb 13 21:16:00 2015 Yusuke Endoh <mame@tsg.ne.jp>
+
+ * lib/base64.rb: make urlsafe mode user-friendly.
+
+ * lib/base64.rb (Base64.urlsafe_encode64): a new option "padding" to
+ suppress the padding character ("=").
+
+ * lib/base64.rb (Base64.urlsafe_decode64): now it accepts not only
+ correctly-padded input but also unpadded input.
+ [Feature #10740][ruby-core:67570]
+
+ * test/base64/test_base64.rb: Test for above
+
+Fri Feb 13 14:19:06 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * ext/json: merge upstream from flori/json
+ change usage of TypedData. [Feature #10739][ruby-core:67564]
+
+Thu Feb 12 18:34:01 2015 multisnow <infinity.blick.winkel@gmail.com>
+
+ * ext/openssl/extconf.rb: check RAND_edg to support libressl.
+
+ * ext/openssl/ossl_rand.c (ossl_rand_egd): define only if RAND_edg
+ is available. [Fix GH-829]
+
+Thu Feb 12 10:46:14 2015 Eric Hodel <drbrain@segment7.net>
+
+ * proc.c (proc_call): Improve Proc#call documentation. Patch by
+ Hsing-Hui Hsu. [fix GH-761]
+
+Thu Feb 12 04:33:02 2015 Benoit Daloze <eregontp@gmail.com>
+
+ * compar.c (cmp_equal): no more error hiding for Comparable#==.
+ It now behaves as other Comparable methods. See #7688.
+
+ * test/ruby/test_comparable.rb: update related test.
+
+Thu Feb 12 03:28:05 2015 Eric Wong <e@80x24.org>
+
+ * lib/set.rb (initialize): internal hash defaults to false
+
+ * lib/set.rb (include?): use Hash#[] for optimized dispatch.
+ Patch by Ismael Abreu <ismaelga@gmail.com>
+ [ruby-core:67664] [Misc #10754]
+
+Wed Feb 11 11:09:52 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/digest/digest_conf.rb (digest_conf): check for CommonDigest.
+
+ * ext/digest/*/*cc.h: for Apple CommonCrypto/CommonDigest.h.
+
+ * ext/digest/digest.h (DEFINE_FINISH_FUNC_FROM_FINAL): macro for
+ finish functions, by inverting arguments order.
+
+ * ext/digest/digest_conf.rb (digest_conf): extract common
+ configurations.
+
+Wed Feb 11 11:01:33 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/json/generator/generator.c (generate_json): get rid of
+ unnecessary recursive calls which can cause infinite recursion.
+ T_STRING may not have rb_cString.
+
+Wed Feb 11 07:53:35 2015 Masaki Suketa <masaki.suketa@nifty.ne.jp>
+
+ * test/win32ole/test_word.rb: use skip method to skip test.
+
+Tue Feb 10 11:38:28 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * vm_insnhelper.c (vm_call_method): stop method search when a method
+ is not found in a refinement, to support undef in refinements.
+ [ruby-core:66741] [Bug #10578]
+
+Tue Feb 10 11:19:11 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * lib/net/ftp.rb (chdir, delete, gettextfile, mdtm, mkdir, nlst,
+ putbinaryfile, puttextfile, rename, rmdir, size): support
+ Pathname. Patch by Joe Rafaniello. [fix GH-828]
+
+Mon Feb 9 16:36:12 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * tool/make-snapshot (package): get rid of loading unbundled and
+ unexpected libraries. [ruby-core:67977] [Bug #10822]
+
+Sun Feb 8 20:09:37 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * lib/net/http/header.rb: pass header names as symbols.
+ Patch by @DamirSvrtan [fix GH-805]
+ * test/net/http/test_httpheader.rb: added test.
+
+Sun Feb 8 13:04:25 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/socket/getaddrinfo.c (get_addr): reject too long hostname to
+ get rid of GHOST vulnerability on very old platforms.
+
+ * ext/socket/raddrinfo.c (make_hostent_internal): ditto, paranoic
+ check for the canonical name.
+
+Sun Feb 8 12:48:38 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/win32/lib/win32/registry.rb (Win32::Registry::API): use wide
+ versions of RegDeleteValue and RegDeleteKey.
+ [ruby-core:67958] [Bug #10820]
+
+Sat Feb 7 22:13:08 2015 Masaki Suketa <masaki.suketa@nifty.ne.jp>
+
+ * test/win32ole/test_win32ole_record.rb: remove test using .NET
+ Framework 3.5 because it is not included in Windows 8/8.1.
+
+Sat Feb 7 19:25:25 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * dir.c (has_magic): always get long path name on Windows even if
+ no tilde is there. [ruby-core:68011] [Bug #10819]
+
+ * dir.c (replace_real_basename): FindFirstFile ignore redirection
+ character, check if exists before call it. cf. [Bug #8597]
+
+Sat Feb 7 13:30:11 2015 Masaki Suketa <masaki.suketa@nifty.ne.jp>
+
+ * test/win32ole/test_win32ole_record.rb
+ (test_ole_instance_variable_get): correct VT_RECORD type and
+ instance variables.
+
+Fri Feb 6 17:47:05 2015 Aaron Patterson <aaron@tenderlovemaking.com>
+
+ * ext/psych/lib/psych/visitors/yaml_tree.rb: register nodes when
+ dumping objects with custom coders. [ruby-core:66215] [Bug #10496]
+
+ * test/psych/test_coder.rb: test for fix
+
+Fri Feb 6 16:58:31 2015 Aaron Patterson <aaron@tenderlovemaking.com>
+
+ * ext/psych/lib/psych/visitors/to_ruby.rb: fix support for regular
+ expressions with newlines. tenderlove/psych#222
+
+ * test/psych/test_yaml.rb: test for change.
+
+Fri Feb 6 10:31:50 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_core.h (rb_call_info_kw_arg_struct): make keywords a symbols
+ list to get rid of inadvertent creation by variable keyword
+ arguments. [ruby-core:68031] [Bug #10831]
+
+Thu Feb 5 22:42:34 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * lib/rubygems: Update to RubyGems HEAD(5c3b6f3).
+ Fixed #1156, #1142, #1115, #1142, #1139 on rubygems/rubygems
+ * test/rubygems: ditto.
+
+Thu Feb 5 13:41:01 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_eval.c (send_internal), vm_insnhelper.c (vm_call_opt_send):
+ convert String method name into a Symbol, as method_missing
+ method expects its first argument to be a Symbol. [Bug #10828]
+
+ * vm_insnhelper.c (ci_missing_reason): return the reason of method
+ missing in call info.
+
+ * vm_insnhelper.c (vm_call_opt_send): re-apply r49500 with the
+ proper missing reason. [Bug #10828]
+
+Thu Feb 5 10:31:46 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * class.c (rb_obj_singleton_methods): should use RTEST() to convert
+ VALUE to int.
+
+Thu Feb 5 03:59:33 2015 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
+
+ * vm_insnhelper.c: Fix symbol leak with +send+ [Bug #10828]
+
+Wed Feb 4 20:26:54 2015 Masaki Suketa <masaki.suketa@nifty.ne.jp>
+
+ * ext/win32ole/win32ole.c (Init_win32ole): should not use atexit to
+ free allocated hash table to avoid error on Cygwin.
+
+Wed Feb 4 15:34:25 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * class.c (method_entry_i, class_instance_method_list,
+ rb_obj_singleton_methods): should not include methods of
+ superclasses if recur is false. [ruby-dev:48854] [Bug #10826]
+
+Wed Feb 4 16:32:40 2015 Matt Hoyle <matt@deployable.co>
+
+ * ext/bigdecimal/bigdecimal.c (VpSetPTR): fix a typo, 'expoennt'
+ to 'exponent'. [ruby-core:67980] [Bug #10823] [Fix GH-825]
+
+Wed Feb 4 15:55:38 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/sdbm/_sdbm.c: include ruby/ruby.h for PRIdPTRDIFF when a
+ macro `DEBUG` is defined. based on the patch by Owen Rodley in
+ [ruby-core:67987]. [Bug #10825]
+
+Wed Feb 4 11:12:43 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * Makefile.in (probes.stamp): rebuild dtrace dependent objects
+ only when `dtrace -G` modifies its input files.
+
+Tue Feb 3 19:27:16 2015 Naohisa Goto <ngotogenome@gmail.com>
+
+ * common.mk (ruby-glommed.o): dependency on $(OBJ) should be written
+ in common.mk (in which OBJ is defined) because of Makefile include
+ and parse order. This partly reverts r49419.
+ [ruby-dev:48849] [Bug #10808]
+
+ * Makefile.in (ruby-glommed.o): ditto.
+
+ * Makefile.in (ruby-glommed.o): remove excess $(DTRACE_OBJ) because
+ it is included in $(OBJS) since r49451.
+
+ * Makefile.in (probes.o): should depend on $(DTRACE_DEPENDENT_OBJS)
+
+Tue Feb 3 17:15:45 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/mkmf.rb (try_cppflags, try_cflags, try_ldflags): get rid of
+ interference by modifying global variables in have_devel? method.
+ [ruby-core:67962] [Bug #10821]
+
+Tue Feb 3 15:23:58 2015 Shugo Maeda <shugo@ruby-lang.org>
+
+ * vm_method.c (remove_method): When remove refined
+ method, raise a NameError if the method is not
+ defined in refined class.
+
+ But if the method is defined in refined class,
+ it should keep refined method and remove original
+ method.
+
+ Patch by Seiei Higa. [ruby-core:67722] [Bug #10765]
+
+Tue Feb 3 14:04:47 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * dir.c (glob_helper): obtain real name with FindFirstFile API
+ instead of matching all entries, on Windows.
+ [ruby-core:67954] [Bug #10819]
+
+Tue Feb 3 12:26:35 2015 Katsuhiko Nishimra <ktns.87@gmail.com>
+
+ * lib/mkmf.rb (configuration): set the default cxxflags, which is
+ referred from the default CXXFLAGS, for extension libraries.
+ [Fix GH-823]
+
+Tue Feb 3 05:52:00 2015 Aman Gupta <ruby@tmm1.net>
+
+ * gc.c (rb_objspace_free): cause rb_bug if lazy sweep is in progress
+ during rb_objspace_free. Adds extra protection for r46340.
+ Patch by Vicent Marti. [Bug #10768] [ruby-core:67734]
+ * gc.c (rb_objspace_call_finalizer): Ensure GC is completed after
+ finalizers have run. We already call gc_rest() before invoking
+ finalizers, but finalizer can allocate new objects and start new GC
+ cycle, so we call gc_rest() again after finalizers are complete.
+
+Mon Feb 2 10:51:34 2015 Ari Pollak <ajp@aripollak.com>
+
+ * doc/security.rdoc (Symbols): update about Symbol GC. Symbols
+ explicitly converted from Strings now can be collected, but
+ reflection/metaprogramming still can cause memory flooding.
+ [Fix GH-725]
+
+Sun Feb 1 13:46:52 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * tool/rbinstall.rb (bin-comm): drop batch file installation.
+ Windows 95 support has not been supported already.
+ [Feature #10806]
+
+Sat Jan 31 12:06:23 2015 Scott Francis <scott.francis@shopify.com>
+
+ * thread_pthread.c (reserve_stack): fix intermittent SIGBUS on
+ Linux, by reserving the stack virtual address space at process
+ start up so that it will not clash with the heap space.
+ [Fix GH-822]
+
+Fri Jan 30 17:28:29 2015 Kazuki Tanaka <gogotanaka@ruby-lang.org>
+
+ * math.c (num2dbl_with_to_f): make faster when Bignum passed by
+ direct conversion using rb_big2dbl(). [Feature #10800]
+
+Thu Jan 29 23:30:00 2015 Kenta Murata <mrkn@mrkn.jp>
+
+ * ext/bigdecimal/bigdecimal.c (rb_rational_num): add fallback function
+ for rubies lower than 2.2.0.
+
+ * ext/bigdecimal/bigdecimal.c (rb_rational_den): ditto.
+
+ * ext/bigdecimal/extconf.rb: check the existences of struct RRational,
+ rb_rational_num, and rb_rational_den.
+
+ * ext/bigdecimal/bigdecimal.bundle: bump version.
+
+Thu Jan 29 20:28:25 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * tool/make-snapshot: removed md5 digest with package information
+
+Thu Jan 29 10:41:52 2015 Kazuki Tanaka <gogotanaka@ruby-lang.org>
+
+ * math.c (Get_Double): direct casting from Fixnum to double.
+ [Feature #10785]
+
+Thu Jan 29 02:34:27 2015 Aaron Patterson <aaron@tenderlovemaking.com>
+
+ * ext/psych/lib/psych/visitors/to_ruby.rb: fix parsing hashes with
+ instance variables when it is referenced multiple times.
+ * ext/psych/lib/psych.rb: bump version
+ * ext/psych/psych.gemspec: bump version
+ * test/psych/test_hash.rb: test for fix
+
+Thu Jan 29 02:06:09 2015 Eric Wong <e@80x24.org>
+
+ * thread.c (struct join_arg): restructure and make smaller
+ (thread_join_sleep): avoid timeofday() call if forever
+ (thread_join): pass join_arg.delay directly
+ (rb_thread_inspect_msg): remove, inline into rb_thread_inspect
+ (rb_thread_inspect): reduce branching and string creation
+ * thread_pthread.c (native_set_thread_name): create string directly
+ to avoid reparsing. [Misc #10723]
+
+Wed Jan 28 21:32:24 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * thread.c: Improve documentation for Thread#value
+ [Bug #10694][ruby-core:67324][ci skip]
+
+Tue Jan 27 16:04:19 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * tool/redmine-backporter.rb: added `!` command.
+
+Tue Jan 27 15:58:23 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * tool/redmine-backporter.rb: added history feature for platforms which
+ lack readline.
+
+Mon Jan 26 22:09:35 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * .gitignore: ignored temporary file with git.
+
+Mon Jan 26 18:06:03 2015 Akinori MUSHA <knu@iDaemons.org>
+
+ * misc/ruby-electric.el: Import version 2.2.2 from
+ https://github.com/knu/ruby-electric.el.
+
+Mon Jan 26 11:37:49 2015 Dave Stevens <dave@crowdlab.com>
+
+ * string.c (str_make_independent_expand): terminate String when
+ moved from heap to embedded. [Fix GH-821].
+
+Sun Jan 25 12:04:12 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * array.c (flatten): no need to call to_ary method on elements
+ beyond the given level. [ruby-core:67637] [Bug #10748]
+
+Sun Jan 25 00:42:24 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/fiddle/win32/libffi.mk.tmpl: assemble without directory prefix.
+ workaround of a bug of VC12 ml, by unak at [ruby-core:67792].
+ [ruby-core:67789] [Bug #10780]
+
+Sat Jan 24 19:56:25 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * dln_find.c (dln_find_1): search regular files only. based on
+ the patch by Alex Coomans in [ruby-core:67766]. [Bug #10776]
+
+Fri Jan 23 23:57:05 2015 Misumi Rize <r@ayase-e.li>
+
+ * vm_insnhelper.c (vm_throw_start): search the target to break
+ from a block with nested rescue, from the nested blocks.
+ [ruby-core:67765] [Bug #10775] [Fix GH-820]
+
+Fri Jan 23 20:00:59 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * marshal.c (w_object, marshal_dump): use identity tables for
+ arbitrary VALUE keys, because of performance of FLONUM.
+ [Bug #10761]
+
+ * marshal.c (obj_alloc_by_klass, marshal_load): ditto.
+
+Fri Jan 23 17:12:33 2015 Eric Wong <e@80x24.org>
+
+ * benchmark/bm_marshal_dump_flo.rb: new benchmark for [Bug #10761]
+
+Thu Jan 22 18:03:19 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * tool/redmine-backporter.rb (find_svn_log): use double quotes instead
+ of single quotes because cmd.exe doesn't handle them.
+
+ * tool/redmine-backporter.rb (done): the 2nd element of matched data
+ is the offset of the end of matched string, not length.
+
+Thu Jan 22 16:45:24 2015 Eric Wong <e@80x24.org>
+
+ * st.c (st_numhash): mix float value for flonum
+ * hash.c (rb_any_hash): ditto
+ * benchmark/bm_hash_aref_flo.rb: new benchmark
+ * benchmark/bm_hash_ident_flo.rb: ditto
+ [Bug #10761]
+
+Wed Jan 21 22:33:51 2015 Akinori MUSHA <knu@iDaemons.org>
+
+ * misc/ruby-electric.el: Import version 2.2.1 from
+ https://github.com/knu/ruby-electric.el. Improve compatibility
+ with and optimize for Emacs 24.4.
+
+Wed Jan 21 09:40:52 2015 Zachary Scott <e@zzak.io>
+
+ * file.c: Document other cases of missing birthtime on OS with patch
+ provided by @sho-h similar to GH-817. [ci skip] [DOC]
+
+Wed Jan 21 09:09:19 2015 Tanaka Akira <akr@fsij.org>
+
+ * NEWS: References to tickets added.
+ [ruby-core:67701] [Bug #10760] Suggested by Zachary Scott.
+
+Tue Jan 20 22:59:54 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * tool/vcs.rb: fix the exception given remote-url of svn.
+
+Tue Jan 20 12:58:33 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * tool/redmine-backporter.rb: now can change the page of `ls`.
+
+Tue Jan 20 12:28:37 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * tool/redmine-backporter.rb (readline): fallback to normal gets on
+ Windows because IO.console.getch is not always do as expected.
+
+Tue Jan 20 11:31:07 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * tool/redmine-backporter.rb: update usage.
+
+Tue Jan 20 11:23:47 2015 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * tool/redmine-backporter.rb (mygets): to support Backspace
+ implement gets by itself.
+
+Tue Jan 20 02:54:11 2015 Zachary Scott <e@zzak.io>
+
+ * file.c: NotImplementedError is raised if birthtime is unavailable.
+ Patch by @y-yagi san and [Fixes GH-817] [ci skip] [DOC]
+
+ * ext/pathname/pathname.c: ditto.
+
+Mon Jan 19 22:08:26 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * class.c (include_modules_at): allow prepend each modules upto
+ once for each classes. [EXPERIMENTAL]
+
+Sun Jan 18 18:32:20 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * math.c (math_atan2): revive documentation before r49220.
+ http://d.hatena.ne.jp/nagachika/20150112/ruby_trunk_changes_49213_49226
+
+Sun Jan 18 15:57:32 2015 Seiei Higa <hanachin@gmail.com>
+
+ * vm_method.c (check_definition): Module#public_method_defined?,
+ Module#private_method_defined?, Module#protected_method_defined?
+ should not use refinements. [ruby-core:67656] [Bug #10753]
+
+Sun Jan 18 15:50:39 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_dump.c (rb_vm_bugreport): check by configured result instead
+ of system name for old FreeBSD. based on a patch by Steve Wills
+ at [ruby-core:67655]. [Bug #10752]
+
+Sun Jan 18 12:56:49 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * Makefile.in (VPATH, NEWLINE_C), common.mk (common-srcs): make
+ and use newline.c under enc/trans directory, not toplevel. no
+ longer search enc directory implicitly.
+
+ * configure.in, enc/Makefile.in (BUILTIN_ENCS, BUILTIN_TRANSES):
+ prefix respective directory names to builtin encodings and
+ transcoder source names.
+
+Sun Jan 18 11:49:46 2015 Masaki Suketa <masaki.suketa@nifty.ne.jp>
+
+ * ext/win32ole/win32ole.c (ole_invoke): avoid SEGV when VT_RECORD
+ variable is passed by reference. [ruby-dev:48803] [Bug #10697]
+
+Sat Jan 17 23:59:15 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/psych/lib/psych/visitors/yaml_tree.rb (visit_String):
+ anchors like `\Z` are not valid inside character class. use
+ negative-lookahead instead.
+ Fixes: https://github.com/tenderlove/psych/issues/221
+
+Sat Jan 17 23:42:27 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in: get rid of pattern substitution, which is not
+ supported by ash, and ash on NetBSD parses whole source first
+ and fails to start. [ruby-dev:48823] [Bug #10750]
+
+Fri Jan 16 18:42:58 2015 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * tool/redmine-backporter.rb: support adding related revisions
+ to issues.
+
+Fri Jan 16 17:20:33 2015 Koichi Sasada <ko1@atdot.net>
+
+ vm.c, vm_core.h: constify VM_CF_LEP, VM_CF_PREV_EP, VM_CF_BLOCK_PTR
+ and rb_vm_control_frame_block_ptr.
+
+Fri Jan 16 15:41:21 2015 Aaron Patterson <aaron@tenderlovemaking.com>
+
+ * ext/psych/lib/psych.rb: bump version
+
+ * ext/psych/psych.gemspec: ditto
+
+Fri Jan 16 15:37:49 2015 Aaron Patterson <aaron@tenderlovemaking.com>
+
+ * ext/psych/lib/psych/visitors/yaml_tree.rb: only dump hash
+ subclasses. Thanks Joe Eli McIlvain <joe.eli.mac@gmail.com>
+
+ * test/psych/test_hash.rb: test for change
+
+Fri Jan 16 15:35:21 2015 Aaron Patterson <aaron@tenderlovemaking.com>
+
+ * ext/psych/lib/psych.rb: bump version
+
+ * ext/psych/lib/psych/visitors/yaml_tree.rb: fix line width wrapping
+ for long strings. Thanks Jakub Jirutka <jakub@jirutka.cz>
+
+ * test/psych/test_string.rb: test for change
+
+Fri Jan 16 11:44:44 2015 Kazuki Tsujimoto <kazuki@callcc.net>
+
+ * eval_intern.h, vm.c, vm_eval.c, vm_insnhelper.c:
+ change throw mechanism (not save target ep, but save target cfp).
+ It fixes `unexpected break' bug that occurs when
+ TracePoint#binding is called.
+ [ruby-dev:48797] [Bug #10689]
+
+ * test/ruby/test_settracefunc.rb: add a test.
+
+Thu Jan 15 23:55:15 2015 Tanaka Akira <akr@fsij.org>
+
+ * io.c (rb_io_close_m): Don't raise when the IO object is closed.
+ [ruby-core:67444] [Feature #10718]
+
+Thu Jan 15 21:34:57 2015 Seiei Higa <hanachin@gmail.com>
+
+ * proc.c (rb_obj_singleton_method): Kernel#singleton_method should
+ not use refinements, as well as Kernel#method.
+ [ruby-core:67603] [Bug #10744]
+
+Thu Jan 15 10:45:04 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * array.c (rb_ary_select_bang, ary_reject_bang): linear
+ performance. [ruby-core:67418] [Feature #10714]
+
+Wed Jan 14 18:06:06 2015 Martin Duerst <duerst@it.aoyama.ac.jp>
+
+ * lib/uri/mailto.rb: raising URI::InvalidComponentError instead
+ of failing with undefined method `split' for nil:NilClass for
+ mailto: URIs without opaque part. [Bug #10738]
+ * test/uri/testuri.rb: Test for above
+
+Wed Jan 14 16:45:24 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * tool/downloader.rb (RubyGems.download): verify downloaded gem
+ packages. LowSecurity to allow untrusted certificates now.
+
+Wed Jan 14 15:43:48 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/readline/readline.c (readline_s_refresh_line): initialize
+ before rl_refresh_line(), as some function make the internal
+ state non-clean but rl_refresh_line() does not re-initialize it.
+ [ruby-core:43957] [Bug #6232]
+
+Tue Jan 13 21:59:24 2015 Michal Papis <mpapis@gmail.com>
+
+ * tool/rbinstall.rb (gem): fix changing permissions of installed
+ bundled gems. [Fix GH-812]
+
+Tue Jan 13 21:57:12 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * common.mk (distclean-local): remove autom4te.cache generated by
+ autoconf.
+
+ * common.mk (realclean-local): remove id sources and dummy header
+ for dtrace. [ruby-core:67562] [Bug #10737]
+
+Tue Jan 13 21:08:22 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * ext/json, test/json: merge JSON HEAD(259dee6)
+ separate implementation of Typed_Data macro.
+ https://github.com/flori/json/compare/v1.8.1...v1.8.2
+
+Tue Jan 13 14:16:35 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * test/net/http/test_http.rb: get rid of accessing DNS actually
+ for some servers returning wrong results.
+ [ruby-core:67454] [Bug #10721]
+
+Mon Jan 12 23:21:57 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * gems/bundled_gems: update test-unit to 3.0.9.
+
+Mon Jan 12 18:35:44 2015 Eric Wong <e@80x24.org>
+
+ * numeric.c (bit_coerce): use original value for error message
+ [ruby-core:67405] [Bug #10711]
+ * test/ruby/test_numeric.rb (test_coerce): check error message
+
+Mon Jan 12 18:01:24 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/rdoc/text.rb (expand_tabs): get rid of infinite loop with
+ CR. should check if substitution occurred too.
+ [ruby-dev:48813] [Bug #10732]
+
+Mon Jan 12 16:45:46 2015 Seiei Higa <hanachin@gmail.com>
+
+ * vm_method.c (rb_alias): raise a NameError when creating alias to
+ a refined method if the original method of the refined method is
+ not defined. [ruby-core:67523] [Bug #10731]
+
+Mon Jan 12 13:53:17 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * math.c (math_atan2): improve documentation.
+ [Feature #10323][ruby-core:65400][ci skip]
+
+Mon Jan 12 13:50:49 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * ext/bigdecimal/bigdecimal.c: fixes documentation like labeled lists,
+ code examples etc. [ruby-core:66730][Bug #10576][ci skip]
+
+Mon Jan 12 13:36:44 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * lib/optparse.rb: improvements for OptionParser documentation.
+ [misc #10608][ruby-core:66901][ci skip]
+
+Mon Jan 12 13:33:52 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * array.c (rb_ary_each): documented return value.
+ [misc #10469][ruby-core:66063]
+
+Sun Jan 11 15:11:38 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * test/webrick/test_utils.rb (test_create_listeners): use
+ dynamically chosen port number, not hardcoded port number.
+ [ruby-core:67508]
+
+Sat Jan 10 12:57:12 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * ext/zlib/zlib.c: fix document of method signatures.
+ [Bug #10668][ruby-core:67186][ci skip]
+
+Sat Jan 10 12:32:44 2015 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * eval_error.c (error_print): pos and len parameters of rb_str_substr()
+ are counted by characters, not bytes. use rb_str_subseq() instead.
+ [Bug #10727] [ruby-core:67473]
+
+Sat Jan 10 10:58:55 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * complex.c: removed commented-out code.
+
+Sat Jan 10 10:57:19 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * rational.c: removed commented-out code.
+ [Feature #10376][ruby-core:65643]
+
+Sat Jan 10 10:12:15 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * array.c (rb_ary_select_bang): keep the array consistent by
+ removing unselected values soon. [ruby-dev:48805] [Bug #10722]
+
+Fri Jan 9 23:20:04 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * lib/rubygems: Update to RubyGems HEAD(e53c54a).
+ * test/rubygems: ditto.
+
+Fri Jan 9 11:13:01 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (assocs, assoc): eliminate splatting empty literal
+ hashes. [ruby-core:67446] [Bug #10719]
+
+ * compile.c (compile_array_): support splatted hash in hash type.
+
+Fri Jan 9 10:57:09 2015 Vit Ondruch <vondruch@redhat.com>
+
+ * configure.in (RUBY_SETJMP_TYPE): Remove superfluous semicolon
+ which causes a syntax error with autoconf 2.63.
+ [ruby-core:67429] [Bug #10716]
+
+Fri Jan 9 07:23:32 2015 Aaron Patterson <aaron@tenderlovemaking.com>
+
+ * ext/psych/lib/psych/visitors/yaml_tree.rb: correctly quote non-ascii
+ letters. Thanks @jirutka for the patch.
+
+ * test/psych/test_string.rb: test for change
+
+Fri Jan 9 07:13:55 2015 Aaron Patterson <aaron@tenderlovemaking.com>
+
+ * ext/psych/lib/psych/visitors/to_ruby.rb: call `allocate` on hash
+ subclasses. Fixes github.com/tenderlove/psych/issues/196
+
+ * test/psych/test_hash.rb: test for change
+
+Fri Jan 9 06:58:43 2015 Aaron Patterson <aaron@tenderlovemaking.com>
+
+ * ext/psych/lib/psych/visitors/to_ruby.rb: revive hashes with ivars
+
+ * ext/psych/lib/psych/visitors/yaml_tree.rb: dump hashes with ivars.
+ Fixes github.com/psych/issues/43
+
+ * test/psych/test_hash.rb: test for change
+
+Thu Jan 8 17:05:00 2015 Seiei Higa <hanachin@gmail.com>
+
+ * vm_method.c (rb_method_entry): if no super class, no original
+ method entry. [ruby-core:67389] [Bug #10707]
+
+Thu Jan 8 16:31:43 2015 Seiei Higa <hanachin@gmail.com>
+
+ * vm_method.c (rb_export_method): bail out if the original method
+ is undefined when the method is refined.
+ [ruby-core:67387] [Bug #10706]
+
+Thu Jan 8 12:53:44 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * dir.c (glob_helper): match in case-folding only if the directory
+ resides on a case-insensitive file system, on OSX.
+ [ruby-core:67364] [Bug #10700]
+
+Thu Jan 8 11:39:18 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * .travis.yml: Remove redundant configuration option.
+ [fix GH-809] Patch by @gxworld
+
+Thu Jan 8 07:17:14 2015 Eric Wong <e@80x24.org>
+
+ * lib/resolv.rb: consider ENETUNREACH as ResolvTimeout
+ [ruby-core:67411] [Bug #10712]
+
+Thu Jan 8 00:13:52 2015 Tanaka Akira <akr@fsij.org>
+
+ * lib/open3.rb: Open3 properly passes non-keyword hash args to spawn.
+ Fixed by Josh Cheek. [Fix GH-808]
+ Related to [ruby-core:67347] [Bug #10699]
+
+Wed Jan 7 19:19:26 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * dir.c (dir_initialize): workaround of opendir failure at symlink
+ directories on Windows via CIFS.
+
+Wed Jan 7 18:52:50 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * dir.c (need_normalization): not only HFS+, CIFS (SMB) is also
+ decomposed. [Bug #10704]
+
+ * dir.c (NORMALIZE_UTF8PATH): Unicode decomposition seems to
+ perform in an upper layer than file systems on OSX, as all path
+ names are always decomposed regardless of file system types.
+
+Tue Jan 6 21:41:04 2015 Tanaka Akira <akr@fsij.org>
+
+ * time.c (timelocalw): Set tm_isdst field -1 if vtm->isdst is
+ VTM_ISDST_INITVAL. This bug is introduced at packing struct
+ vtm (r45155).
+ [ruby-core:67345] [Bug #10698] Reported by Boris Ruf.
+
+Tue Jan 6 03:10:54 2015 Koichi Sasada <ko1@atdot.net>
+
+ * test/fiddle/test_handle.rb: fix syntax.
+
+Tue Jan 6 00:16:10 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * test/fiddle/test_handle.rb (test_NEXT): use -test-/dln/empty
+ which is always a shared object and is not used by others.
+ [ruby-dev:48629] [Bug #10384]
+
+Mon Jan 5 14:58:01 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * test/ruby/test_io.rb: added timeout for AIX environment.
+ [ruby-core:62983][Bug #9917]
+
+Sun Jan 4 22:33:33 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * test/lib/test/unit.rb (ExcludesOption): add "excludes" support
+ to test suite, for alternative implementations and platforms.
+ [Feature #10682]
+
+Sun Jan 4 22:32:42 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * test/lib/test/unit.rb (Test::Unit): reorder modules and merge
+ each modules.
+
+ * test/lib/test/unit.rb (Test::Unit): split the large class into
+ each modules.
+
+Sun Jan 4 21:32:52 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (f_label): return tLABEL value as it is.
+ [ruby-core:67315] [Bug #10693]
+
+Sun Jan 4 14:02:37 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * test/lib/test/unit/parallel.rb (run): expand the file name to be
+ loaded, so that relative paths work in parallel mode.
+
+Sun Jan 4 13:36:56 2015 Ayumu AIZAWA <ayumu.aizawa@gmail.com>
+
+ * test/test_tempfile.rb: use assert_file for more descriptive message.
+ following r49131.
+
+Sun Jan 4 13:05:09 2015 Ayumu AIZAWA <ayumu.aizawa@gmail.com>
+
+ * string.c: improve docs for String#<=>. [ruby-core:65399][Feature #10322]
+ Patch by gogo tanaka.
+
+Sun Jan 4 12:42:24 2015 Ayumu AIZAWA <ayumu.aizawa@gmail.com>
+
+ * array.c: improve docs for Array#reject. [ruby-core:65324][misc #10307]
+ Patched by Nebu Pookins.
+
+Sun Jan 4 12:24:11 2015 Ayumu AIZAWA <ayumu.aizawa@gmail.com>
+
+ * string.c: improve docs for String#strip and variations.
+ [ruby-core:66081][Bug #10476]
+
+Sun Jan 4 09:21:04 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * lib/drb/drb.rb: removed unused argument. Patch by @vipulnsward
+ [fix GH-515]
+
+Sun Jan 4 09:18:31 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * lib/tempfile.rb: provide default basename parameter.
+ [fix GH-523] Patch by @dissolved
+ * test/test_tempfile.rb: ditto.
+
+Sun Jan 4 00:43:41 2015 Ayumu AIZAWA <ayumu.aizawa@gmail.com>
+
+ * README.ja.md: add guidance of mailing list and bugs.r-l.o.
+
+Sat Jan 3 23:56:28 2015 Ayumu AIZAWA <ayumu.aizawa@gmail.com>
+
+ * hash.c: fix docs for Hash#invert. [ruby-core:66917] [Bug #10612]
+
+Sat Jan 3 19:52:12 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * include/ruby/intern.h (rb_str_new_literal): define on all
+ platforms, not only gcc.
+
+Sat Jan 3 18:53:28 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/fiddle/lib/fiddle/cparser.rb (parse_ctype): limit split word
+ number as the rest are not used.
+
+Sat Jan 3 18:19:50 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * ext/fiddle/lib/fiddle/cparser.rb: r49110 broke Fiddle::Import with
+ type_alias.
+ * test/fiddle/test_cparser.rb: added type_alias test for parse_ctype
+ and parse_struct_signature.
+
+Sat Jan 3 11:50:16 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * ext/openssl/ossl.h: avoid to build failure of Windows environment.
+ * ext/openssl/ossl_ssl_session.c: ditto.
+
+Sat Jan 3 11:27:46 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * array.c: Improve performance of Array#shift. use shared instead of
+ MEMMOVE if with arguments. Patch by @ksss [fix GH-537]
+ * test/ruby/test_array.rb: ditto.
+ * benchmark/bm_array_shift.rb: Added benchmark of GH-537 issue.
+
+Sat Jan 3 10:38:52 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * lib/net/http.rb: More descriptive error message when net/http fails
+ to connect to a server. Patch by @xaviershay [fix GH-700]
+ * test/net/http/test_http.rb: ditto.
+
+Sat Jan 3 10:14:51 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * ext/openssl/ossl.h: Make `SSL_SESSION_cmp` use `CRYPTO_memcmp`
+ [fix GH-591] Patch by @PiPeep
+ * ext/openssl/ossl_ssl_session.c: ditto.
+
+Sat Jan 3 09:54:32 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * ext/fiddle/lib/fiddle/cparser.rb: Support for Fiddle::CParser
+ to handle rich signatures including parameter names and function
+ pointer types. Patch by @theryan [fix GH-590]
+ * test/fiddle/test_cparser.rb: ditto.
+
+Sat Jan 3 09:01:43 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * NEWS: added compatibility entry of r49101.
+
+Fri Jan 2 21:06:59 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * lib/net/http.rb (Net::HTTP#send_request): there is no response body
+ with HEAD request. Patch by @rodrigosaito [fix GH-520]
+
+Fri Jan 2 21:04:36 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * test/net/http/test_http.rb (_test_send_request__HEAD): Added
+ failing test for send_request with HEAD method.
+
+Fri Jan 2 18:41:20 2015 Tanaka Akira <akr@fsij.org>
+
+ * eval.c (ruby_init): Print ruby_setup() error only in debug mode.
+ Unsuppressable error message is not a good idea.
+ Note that the message is printed sometimes with following
+ code (highly timing dependent, though):
+ pid = spawn("ruby -e ''"); Process.kill(:TERM, pid)
+
+Fri Jan 2 16:18:44 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * test/ruby/test_module.rb: Refactor invalid testcase.
+ [fix GH-472][ruby-core:59035][Bug #9240]
+
+Fri Jan 2 15:53:00 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * lib/webrick/utils.rb: removed unused argument variable.
+ [fix GH-356] Patch by @vipulnsward
+ * lib/webrick/server.rb: ditto.
+ * lib/webrick/ssl.rb: ditto.
+ * test/webrick/test_utils.rb: added test for WEBrick::Utils#create_listeners.
+
+Fri Jan 2 15:35:53 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * lib/securerandom.rb: improve syntax and grammar of documentation.
+ [fix GH-796][ci skip] Patch by @Erol
+
+Fri Jan 2 15:10:01 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * test/openssl/test_ssl_session.rb (OpenSSL#test_ctx_client_session_cb):
+ fix test failure with OpenSSL disabled SSLv3 protocol.
+ [ruby-core:63772] [Bug #10046]
+
+Fri Jan 2 09:08:31 2015 Tanaka Akira <akr@fsij.org>
+
+ * lib/resolv.rb (Resolv::DNS::Label::Str#==): Check class equality.
+ (Resolv::DNS::Name#initialize): Normalize labels as
+ Resolv::DNS::Label::Str objects.
+
+Thu Jan 1 21:41:49 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * doc/regexp.rdoc: fix regexp docs for whitespace character.
+ [ruby-dev:48765] [Bug #10624]
+
+Thu Jan 1 17:50:52 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * test/ruby/test_rubyoptions.rb: try locale encoding name.
+ [ruby-core:67109] [Bug #10643]
+
+Thu Jan 1 11:07:12 2015 Eric Wong <e@80x24.org>
+
+ * symbol.c (rb_gc_free_dsymbol): delete from global fstr hash
+ * test/ruby/test_symbol.rb (test_symbol_fstr_leak): test for bug
+ [ruby-core:67268] [Bug #10686]
+
+Thu Jan 1 09:14:21 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_args.c (keyword_hash_p): fix non-symbol keys hash.
+ rb_extract_keywords() returns 0 not Qnil when no symbol keys is
+ included. [ruby-core:67264] [Bug #10685]
+
+Wed Dec 31 17:48:43 2014 Tanaka Akira <akr@fsij.org>
+
+ * lib/resolv.rb (Resolv::DNS::Label::Str#initialize): Set encoding
+ ASCII-8BIT before downcase. case insensitivity of DNS labels doesn't
+ apply non-ASCII characters. [RFC 4343]
+
+Wed Dec 31 16:48:44 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (gettable_gen): disable warnings of possible reference
+ to a local variable defined in a past scope.
+ [ruby-core:67162] [Bug #10661]
+
+Wed Dec 31 13:43:48 2014 Tanaka Akira <akr@fsij.org>
+
+ * lib/resolv.rb (Resolv::DNS::Name#==): Compare an array of Label:Str
+ objects. Label#Str#== is case-insensitive.
+
+Tue Dec 30 16:16:12 2014 Ben Miller <bmiller@rackspace.com>
+
+ * lib/resolv.rb (Resolv::DNS::Name#==): DNS is case-insensitive, so the
+ comparison should be case-insensitive as well.
+ [ruby-core:66498] [Bug #10550]
+
+Tue Dec 30 16:03:45 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/resolv.rb (Resolv::DNS::Name): names with different dots
+ should be different.
+
+Tue Dec 30 13:16:56 2014 Martin Duerst <bernhard+git@lsmod.de>
+
+ * lib/uri/common.rb: Initialize HTML5ASCIIINCOMPAT to empty Array
+ to avoid error during bootstrap when encodings are not yet defined.
+ [Bug #10678]
+
+Tue Dec 30 09:29:26 2014 Bernhard M. Wiedemann <bernhard+git@lsmod.de>
+
+ * ext/dbm/dbm.c (Init_dbm): [DOC] as UNIX permissions are octal
+ numbers, needs to be prefixed by 0. [Fix GH-800]
+
+Tue Dec 30 08:57:39 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * lib/unicode_normalize.rb: typo fix. [ci skip]
+ [ruby-dev:48794][misc #10675]
+
+Mon Dec 29 19:38:01 2014 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * version.h (RUBY_VERSION): 2.3.0 development has started.
+
+Mon Dec 29 18:58:46 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * re.c (unescape_nonascii): append escape sequence as-is not
+ unescaped character, to get rid of unexpected meta-character.
+ [ruby-core:67193] [Bug #10670]
+
+Mon Dec 29 14:27:33 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * doc/syntax/literals.rdoc (Symbols): now Symbols created by
+ interpolation can be garbage collected. patch by Yihang Ho in
+ [ruby-core:67194]. [Bug #10671]
+
+Mon Dec 29 11:18:17 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * thread.c (rb_thread_variable_get): fix dynamic symbol keys.
+ rb_check_id() returns non-zero only for static symbols, whereas
+ thread local variable keys can be dynamic symbols.
+ [ruby-core:67185] [Bug #10667]
+
+Mon Dec 29 10:37:27 2014 Thiago Lewin <thiago_lewin@yahoo.com.br>
+
+ * io.c (rb_f_select): [DOC] workaround for YARD doc. [Fix GH-799]
+
+ * process.c (proc_detach): [DOC] fix missing closing parenthesis.
+ [Fix GH-799]
+
+Mon Dec 29 07:27:23 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * ext/json, test/json: merge JSON HEAD(17fe8e7)
+ https://github.com/flori/json/compare/v1.8.1...17fe8e7
+
+Sun Dec 28 23:49:37 2014 Michal Papis <mpapis@gmail.com>
+
+ * rbinstall.rb: fix target location for installing bundled gems.
+ install to the prepared directory instead of default Gem.dir,
+ not to be affected GEM_HOME environment variable. [Fix GH-798]
+
+Sun Dec 28 18:19:28 2014 Eric Wong <e@80x24.org>
+
+ * test/-ext-/iseq_load/test_iseq_load.rb
+ (test_next_in_block_in_block): test using ISeq#eval
+ (test_break_ensure): ditto
+ [ruby-core:66988]
+
+Sun Dec 28 16:25:12 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * cygwin/GNUmakefile.in (EXTOBJS): override to add resource files
+ always. [ruby-core:67153] [Bug #10657]
+
+Sun Dec 28 13:54:26 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (f_kwrest, new_args_tail_gen): unnamed rest keyword and
+ keywords bits arguments should be unique. since internal IDs
+ depend on the local variable index in the current scope, new ID
+ should be made before popping those vtables.
+ [ruby-core:67157] [Bug #10659]
+
+Sat Dec 27 20:12:55 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/json/generator/generator.c (JSON_Generator_State_type): add
+ #ifdef for backward compatibility.
+
+ * ext/json/parser/parser.rl (JSON_Parser_type): ditto.
+
+ * ext/json/generator/generator.h (ZALLOC): add fallback definition.
+
+ * ext/json/parser/parser.h (ZALLOC): ditto.
+
+Sat Dec 27 16:54:05 2014 Tanaka Akira <akr@fsij.org>
+
+ * process.c: Unused code removed.
+ It seems waitpid() is universally available on POSIX platforms.
+
+Sat Dec 27 15:08:27 2014 Eric Wong <e@80x24.org>
+
+ * vm_core.h (rb_vm_living_threads_insert): preserve order
+ [Bug #10660] [ruby-core:67154] [ruby-core:67159]
+
+Sat Dec 27 13:08:20 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * ext/socket/socket.c: improved document for YARD doc.
+ [fix GH-795][ci skip] Patch by @tlewin
+
+Sat Dec 27 10:11:21 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * ext/tk/lib/tkextlib/tcllib/plotchart.rb: fix to invoke correct function
+ of tcllib. Patch by @zalt50 [fix GH-787]
+
+Sat Dec 27 10:03:41 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * tool/make-snapshot: show sha1 digest when making packages.
+ it's request from https://github.com/ruby/www.ruby-lang.org/issues/921
+ [fix GH-794]
+
+Fri Dec 26 15:32:16 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/tk/tcltklib.c (ip_invoke_core): remove probably duplicate
+ dead code.
+
+Fri Dec 26 15:28:27 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/tk/tcltklib.c (ip_ruby_cmd_receiver_const_get): simply use
+ rb_path2class() to get a class/module from its name.
+
+Fri Dec 26 15:20:54 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * marshal.c (w_long): append at once by w_nbyte() instead of
+ appending byte by byte.
+
+Fri Dec 26 15:13:13 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/json/parser/parser.rl (unescape_unicode): check if valid
+ before bit-or assignments.
+ reported by Denis Denisov <denji0k AT gmail.com>.
+
+ * ext/nkf/nkf-utf8/nkf.c (nkf_iconv_t): fix a missing semicolon.
+ reported by Denis Denisov <denji0k AT gmail.com>.
+
+ * process.c (rb_spawn_process): get rid of usage of uninitialized
+ variable.
+ reported by Denis Denisov <denji0k AT gmail.com>.
+
+ * regexec.c (match_at): ditto.
+
+ * ext/win32ole/win32ole.c (ole_wc2mb_alloc, ole_vstr2wc, ole_mb2wc):
+ ditto.
+
+ * dir.c (ruby_glob0): no need to check never-NULL pointer.
+ reported by Denis Denisov <denji0k AT gmail.com>.
+
+ * win32/file.c (rb_file_expand_path_internal): ditto.
+
+ * win32/file.c (code_page_i): handle realloc failure.
+ reported by Denis Denisov <denji0k AT gmail.com>.
+
+ * win32/stub.c (stub_sysinit): ditto.
+
+ * fix printf format conversion specifiers.
+ reported by Denis Denisov <denji0k AT gmail.com>.
+
+Fri Dec 26 01:41:40 2014 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * tool/rbinstall.rb: skip installing bundle gems if zlib is unavailable.
+ [Bug #10647] [ruby-dev:48787]
+
+Fri Dec 26 01:24:42 2014 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * tool/downloader.rb: support old versions of ruby.
+
+ * tool/downloader.rb: now can download gems by http if openssl is not
+ available (this may be danger!)
+
+Fri Dec 26 00:13:48 2014 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * test/ruby/test_extlibs.rb: check existence of extension libraries
+ which not depend on outer libraries. (experimental)
+
+Thu Dec 25 21:58:15 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/fiddle/extconf.rb: make PIC objects if it will be linked as
+ a shared object eventually. [ruby-core:67128]
+
+Thu Dec 25 19:01:13 2014 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * ext/fiddle/win32/libffi-3.2.1-mswin.patch: support mswin32.
+
+Thu Dec 25 17:30:40 2014 Naohisa Goto <ngotogenome@gmail.com>
+
+ * gc.c (wmap_final_func): fix memory size shortage when realloc wmap.
+ Fix SEGV during finalize of WeakRef on Solaris (though the SEGV
+ could occur on all OS/platforms). [ruby-dev:48779] [Bug #10646]
+
+Thu Dec 25 17:27:06 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in (NET_LUID): include winsock2.h instead of windows.h.
+ patch by Jon Forums in [ruby-core:67125]. [Bug #10640]
+
+Thu Dec 25 16:14:10 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/io/console/console.c (console_dev): send the given arguments
+ to the opened console. as a special case, do nothing if :close
+ is given.
+
+ * test/lib/leakchecker.rb (LeakChecker#check_fd_leak): close if
+ console.
+
+For the changes before 2.2.0, see doc/ChangeLog-2.2.0
+For the changes before 2.1.0, see doc/ChangeLog-2.1.0
+For the changes before 2.0.0, see doc/ChangeLog-2.0.0
+For the changes before 1.9.3, see doc/ChangeLog-1.9.3
+For the changes before 1.8.0, see doc/ChangeLog-1.8.0
+
+Local variables:
+coding: us-ascii
+add-log-time-format: (lambda ()
+ (let* ((time (current-time))
+ (system-time-locale "C")
+ (diff (+ (cadr time) 32400))
+ (lo (% diff 65536))
+ (hi (+ (car time) (/ diff 65536))))
+ (format-time-string "%a %b %e %H:%M:%S %Y" (list hi lo) t)))
+indent-tabs-mode: t
+tab-width: 8
+change-log-indent-text: 2
+end:
+vim: tabstop=8 shiftwidth=2
diff --git a/LEGAL b/LEGAL
index 0fe24dfc3c..2607f0082a 100644
--- a/LEGAL
+++ b/LEGAL
@@ -1,27 +1,23 @@
-# -*- rdoc -*-
-
-= LEGAL NOTICE INFORMATION
---------------------------
+LEGAL NOTICE INFORMATION
+------------------------
All the files in this distribution are covered under either the Ruby's
license (see the file COPYING) or public-domain except some files
mentioned below.
-ccan/build_assert/build_assert.h::
-ccan/check_type/check_type.h::
-ccan/container_of/container_of.h::
-ccan/str/str.h::
+ccan/build_assert/build_assert.h
+ccan/check_type/check_type.h
+ccan/container_of/container_of.h
+ccan/str/str.h
These files are licensed under the CC0.
- >>>
- https://creativecommons.org/choose/zero/
+ http://creativecommons.org/choose/zero/
-ccan/list/list.h::
+ccan/list/list.h
This file is licensed under the MIT License.
- >>>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
@@ -40,192 +36,81 @@ ccan/list/list.h::
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
-include/ruby/onigmo.h::
-include/ruby/oniguruma.h::
-regcomp.c::
-regenc.c::
-regenc.h::
-regerror.c::
-regexec.c::
-regint.h::
-regparse.c::
-regparse.h::
-enc/ascii.c::
-enc/big5.c::
-enc/cp949.c::
-enc/emacs_mule.c::
-enc/encdb.c::
-enc/euc_jp.c::
-enc/euc_kr.c::
-enc/euc_tw.c::
-enc/gb18030.c::
-enc/gb2312.c::
-enc/gbk.c::
-enc/iso_8859_1.c::
-enc/iso_8859_10.c::
-enc/iso_8859_11.c::
-enc/iso_8859_13.c::
-enc/iso_8859_14.c::
-enc/iso_8859_15.c::
-enc/iso_8859_16.c::
-enc/iso_8859_2.c::
-enc/iso_8859_3.c::
-enc/iso_8859_4.c::
-enc/iso_8859_5.c::
-enc/iso_8859_6.c::
-enc/iso_8859_7.c::
-enc/iso_8859_8.c::
-enc/iso_8859_9.c::
-enc/koi8_r.c::
-enc/koi8_u.c::
-enc/shift_jis.c::
-enc/unicode.c::
-enc/us_ascii.c::
-enc/utf_16be.c::
-enc/utf_16le.c::
-enc/utf_32be.c::
-enc/utf_32le.c::
-enc/utf_8.c::
-enc/windows_1251.c::
-
- Onigmo (Oniguruma-mod) LICENSE
-
- >>>
- Copyright (c) 2002-2009 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>
- Copyright (c) 2011-2014 K.Takata <kentkt AT csc DOT jp>
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- 1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- SUCH DAMAGE.
-
- Oniguruma LICENSE
-
- >>>
- Copyright (c) 2002-2009 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- 1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- SUCH DAMAGE.
-
- * https://github.com/k-takata/Onigmo/
- * https://github.com/kkos/oniguruma
- * https://svnweb.freebsd.org/ports/head/devel/oniguruma/
-
- When this software is partly used or it is distributed with Ruby,
- this of Ruby follows the license of Ruby.
-
-enc/trans/GB/GB12345%UCS.src::
-enc/trans/GB/UCS%GB12345.src::
-enc/trans/GB/GB2312%UCS.src::
-enc/trans/GB/UCS%GB2312.src::
-
- These files have this explanatory texts.
-
- >>>
- This mapping data was created from files provided by Unicode, Inc.
- (The Unicode Consortium). The files were used to create a product supporting
- Unicode, as explicitly permitted in the files' copyright notices.
- Please note that Unicode, Inc. never made any claims as to fitness of these
- files for any particular purpose, and has ceased to publish the files many
- years ago.
-
-enc/trans/JIS/JISX0201-KANA%UCS.src::
-enc/trans/JIS/JISX0208\@1990%UCS.src::
-enc/trans/JIS/JISX0212%UCS.src::
-enc/trans/JIS/UCS%JISX0201-KANA.src::
-enc/trans/JIS/UCS%JISX0208@1990.src::
-enc/trans/JIS/UCS%JISX0212.src::
-
- These files are copyrighted as the following.
-
- >>>
- © 2015 Unicode®, Inc.
-
- For terms of use, see http://www.unicode.org/terms_of_use.html
-
-enc/trans/JIS/JISX0213-1%UCS@BMP.src::
-enc/trans/JIS/JISX0213-1%UCS@SIP.src::
-enc/trans/JIS/JISX0213-2%UCS@BMP.src::
-enc/trans/JIS/JISX0213-2%UCS@SIP.src::
-
- These files are copyrighted as the following.
-
- >>>
- Copyright (C) 2001 earthian@tama.or.jp, All Rights Reserved.
- Copyright (C) 2001 I'O, All Rights Reserved.
- Copyright (C) 2006 Project X0213, All Rights Reserved.
- You can use, modify, distribute this table freely.
-
-enc/trans/JIS/UCS@BMP%JISX0213-1.src::
-enc/trans/JIS/UCS@BMP%JISX0213-2.src::
-enc/trans/JIS/UCS@SIP%JISX0213-1.src::
-enc/trans/JIS/UCS@SIP%JISX0213-2.src::
-
- These files are copyrighted as the following.
-
- >>>
- Copyright (C) 2001 earthian@tama.or.jp, All Rights Reserved.
- Copyright (C) 2001 I'O, All Rights Reserved.
- You can use, modify, distribute this table freely.
-
-configure::
+include/ruby/oniguruma.h:
+regcomp.c:
+regenc.[ch]:
+regerror.c:
+regexec.c:
+regint.h:
+regparse.[ch]:
+enc/ascii.c
+enc/big5.c
+enc/cp949.c
+enc/emacs_mule.c
+enc/encdb.c
+enc/euc_jp.c
+enc/euc_kr.c
+enc/euc_tw.c
+enc/gb18030.c
+enc/gb2312.c
+enc/gbk.c
+enc/iso_8859_1.c
+enc/iso_8859_10.c
+enc/iso_8859_11.c
+enc/iso_8859_13.c
+enc/iso_8859_14.c
+enc/iso_8859_15.c
+enc/iso_8859_16.c
+enc/iso_8859_2.c
+enc/iso_8859_3.c
+enc/iso_8859_4.c
+enc/iso_8859_5.c
+enc/iso_8859_6.c
+enc/iso_8859_7.c
+enc/iso_8859_8.c
+enc/iso_8859_9.c
+enc/koi8_r.c
+enc/koi8_u.c
+enc/shift_jis.c
+enc/unicode.c
+enc/us_ascii.c
+enc/utf_16be.c
+enc/utf_16le.c
+enc/utf_32be.c
+enc/utf_32le.c
+enc/utf_8.c
+enc/windows_1251.c
+
+Oniguruma ---- (C) K.Kosako <sndgk393 AT ybb DOT ne DOT jp>
+
+http://www.geocities.jp/kosako3/oniguruma/
+http://www.ruby-lang.org/cgi-bin/cvsweb.cgi/oniguruma/
+http://www.freebsd.org/cgi/cvsweb.cgi/ports/devel/oniguruma/
+
+ When this software is partly used or it is distributed with Ruby,
+ this of Ruby follows the license of Ruby.
+
+configure:
This file is free software.
- >>>
- Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
+ Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
This configure script is free software; the Free Software Foundation
gives unlimited permission to copy, distribute and modify it.
-tool/config.guess::
-tool/config.sub::
+tool/config.guess:
+tool/config.sub:
As long as you distribute these files with the file configure, they
are covered under the Ruby's license.
- >>>
- Copyright 1992-2018 Free Software Foundation, Inc.
+ Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999
+ Free Software Foundation, Inc.
This file is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
+ the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful, but
@@ -234,55 +119,53 @@ tool/config.sub::
General Public License for more details.
You should have received a copy of the GNU General Public License
- along with this program; if not, see <https://www.gnu.org/licenses/>.
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
As a special exception to the GNU General Public License, if you
distribute this file as part of a program that contains a
configuration script generated by Autoconf, you may include it under
- the same distribution terms that you use for the rest of that
- program. This Exception is an additional permission under section 7
- of the GNU General Public License, version 3 ("GPLv3").
+ the same distribution terms that you use for the rest of that program.
-parse.c::
+parse.c:
This file is licensed under the GPL, but is incorporated into Ruby and
redistributed under the terms of the Ruby license, as permitted by the
exception to the GPL below.
- >>>
- Copyright (C) 1984, 1989-1990, 2000-2015, 2018 Free Software Foundation, Inc.
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
+ Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
+ Free Software Foundation, Inc.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2, or (at your option)
+ any later version.
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
- As a special exception, you may create a larger work that contains
- part or all of the Bison parser skeleton and distribute that work
- under terms of your choice, so long as that work isn't itself a
- parser generator using the skeleton or a modified version thereof
- as a parser skeleton. Alternatively, if you modify or redistribute
- the parser skeleton itself, you may (at your option) remove this
- special exception, which will cause the skeleton and the resulting
- Bison output files to be licensed under the GNU General Public
- License without this special exception.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ Boston, MA 02110-1301, USA. */
- This special exception was added by the Free Software Foundation in
- version 2.2 of Bison.
+ /* As a special exception, you may create a larger work that contains
+ part or all of the Bison parser skeleton and distribute that work
+ under terms of your choice, so long as that work isn't itself a
+ parser generator using the skeleton or a modified version thereof
+ as a parser skeleton. Alternatively, if you modify or redistribute
+ the parser skeleton itself, you may (at your option) remove this
+ special exception, which will cause the skeleton and the resulting
+ Bison output files to be licensed under the GNU General Public
+ License without this special exception.
-util.c (partly)::
+ This special exception was added by the Free Software Foundation in
+ version 2.2 of Bison. */
- This file contains the source code under these licenses.
+util.c (partly):
- >>>
Copyright (c) 1991, 2000, 2001 by Lucent Technologies.
Permission to use, copy, modify, and distribute this software for any
@@ -296,49 +179,48 @@ util.c (partly)::
REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
- >>>
- Copyright (c) 2004-2008 David Schultz <das@FreeBSD.ORG>
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
- 1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- SUCH DAMAGE.
-
-win32/win32.{c,h}::
+win32/win32.[ch]:
You can apply the Artistic License to these files. (or GPL,
alternatively)
- >>>
Copyright (c) 1993, Intergraph Corporation
You may distribute under the terms of either the GNU General Public
License or the Artistic License, as specified in the perl README file.
-random.c::
+util.c (partly):
+
+ Copyright (c) 2004-2008 David Schultz <das@FreeBSD.ORG>
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
- This file contains the source code under the new-style BSD license.
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+random.c
+
+ This file is under the new-style BSD license.
- >>>
A C-program for MT19937, with initialization improved 2002/2/10.
- Coded by Takuji Nishimura and Makoto Matsumoto.
+ Coded by Takuji Nishimura and Makoto Matsumoto.
This is a faster version by taking Shawn Cokus's optimization,
Matthe Bellew's simplification, Isaku Wada's real version.
@@ -352,16 +234,16 @@ random.c::
modification, are permitted provided that the following conditions
are met:
- 1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
- 2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
- 3. The names of its contributors may not be used to endorse or promote
- products derived from this software without specific prior written
- permission.
+ 3. The names of its contributors may not be used to endorse or promote
+ products derived from this software without specific prior written
+ permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
@@ -380,14 +262,11 @@ random.c::
http://www.math.keio.ac.jp/matumoto/emt.html
email: matumoto@math.keio.ac.jp
- The Wayback Machine url: http://web.archive.org/web/19990429082237/http://www.math.keio.ac.jp/matumoto/emt.html
-
-vm_dump.c:procstat_vm::
+vm_dump.c:procstat_vm
- This file contains the source code under the new-style BSD license.
+ This file is under the new-style BSD license.
- >>>
- Copyright (c) 2007 Robert N. M. Watson
+ Copyright (c) 2007 Robert N. M. Watson
All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -413,14 +292,13 @@ vm_dump.c:procstat_vm::
$FreeBSD: head/usr.bin/procstat/procstat_vm.c 261780 2014-02-11 21:57:37Z jhb $
-vsnprintf.c::
+vsnprintf.c:
This file is under the old-style BSD license. Note that the
paragraph 3 below is now null and void.
- >>>
- Copyright (c) 1990, 1993
- The Regents of the University of California. All rights reserved.
+ Copyright (c) 1990, 1993
+ The Regents of the University of California. All rights reserved.
This code is derived from software contributed to Berkeley by
Chris Torek.
@@ -454,40 +332,32 @@ vsnprintf.c::
From ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change
paragraph 3 above is now null and void.
-st.c::
-strftime.c::
-include/ruby/st.h::
-missing/acosh.c::
-missing/alloca.c::
-missing/dup2.c::
-missing/erf.c::
-missing/finite.c::
-missing/hypot.c::
-missing/isinf.c::
-missing/isnan.c::
-missing/lgamma_r.c::
-missing/memcmp.c::
-missing/memmove.c::
-missing/strchr.c::
-missing/strerror.c::
-missing/strstr.c::
-missing/tgamma.c::
-ext/date/date_strftime.c::
-ext/digest/sha1/sha1.c::
-ext/digest/sha1/sha1.h::
-ext/sdbm/_sdbm.c::
-ext/sdbm/sdbm.h::
+st.[ch]:
+missing/alloca.c:
+missing/dup2.c:
+missing/erf.c:
+missing/finite.c:
+missing/hypot.c:
+missing/isinf.c:
+missing/isnan.c:
+missing/lgamma_r.c:
+missing/memcmp.c:
+missing/memmove.c:
+missing/strchr.c:
+missing/strstr.c:
+missing/strtol.c:
+missing/tgamma.c:
+ext/digest/sha1/sha1.[ch]:
These files are all under public domain.
-missing/crypt.c::
+missing/crypt.c:
This file is under the old-style BSD license. Note that the
paragraph 3 below is now null and void.
- >>>
- Copyright (c) 1989, 1993
- The Regents of the University of California. All rights reserved.
+ Copyright (c) 1989, 1993
+ The Regents of the University of California. All rights reserved.
This code is derived from software contributed to Berkeley by
Tom Truscott.
@@ -516,16 +386,15 @@ missing/crypt.c::
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.
-missing/setproctitle.c::
+missing/setproctitle.c
This file is under the old-style BSD license. Note that the
paragraph 3 below is now null and void.
- >>>
- Copyright 2003 Damien Miller
- Copyright (c) 1983, 1995-1997 Eric P. Allman
- Copyright (c) 1988, 1993
- The Regents of the University of California. All rights reserved.
+ Copyright 2003 Damien Miller
+ Copyright (c) 1983, 1995-1997 Eric P. Allman
+ Copyright (c) 1988, 1993
+ The Regents of the University of California. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
@@ -551,45 +420,52 @@ missing/setproctitle.c::
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.
-missing/strlcat.c::
-missing/strlcpy.c::
+missing/strlcat.c
+missing/strlcpy.c
- These files are under an ISC-style license.
+ These files are under the new-style BSD license.
- >>>
- Copyright (c) 1998, 2015 Todd C. Miller <Todd.Miller@courtesan.com>
+ Copyright (c) 1998 Todd C. Miller <Todd.Miller@courtesan.com>
+ All rights reserved.
- Permission to use, copy, modify, and distribute this software for any
- purpose with or without fee is hereby granted, provided that the above
- copyright notice and this permission notice appear in all copies.
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. The name of the author may not be used to endorse or promote products
+ derived from this software without specific prior written permission.
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+ AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+ THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+ OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+ OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-missing/langinfo.c::
+missing/langinfo.c
This file is from http://www.cl.cam.ac.uk/~mgk25/ucs/langinfo.c.
Ruby uses a modified version. The file contains the following
author/copyright notice:
- >>>
- Markus.Kuhn@cl.cam.ac.uk -- 2002-03-11
- Permission to use, copy, modify, and distribute this software
- for any purpose and without fee is hereby granted. The author
- disclaims all warranties with regard to this software.
+ Markus.Kuhn@cl.cam.ac.uk -- 2002-03-11
+ Permission to use, copy, modify, and distribute this software
+ for any purpose and without fee is hereby granted. The author
+ disclaims all warranties with regard to this software.
-ext/digest/md5/md5.c::
-ext/digest/md5/md5.h::
+ext/digest/md5/md5.[ch]:
These files are under the following license. Ruby uses modified
versions of them.
- >>>
Copyright (C) 1999, 2000 Aladdin Enterprises. All rights reserved.
This software is provided 'as-is', without any express or implied
@@ -611,26 +487,22 @@ ext/digest/md5/md5.h::
L. Peter Deutsch
ghost@aladdin.com
-ext/digest/rmd160/rmd160.c::
-ext/digest/rmd160/rmd160.h::
+ext/digest/rmd160/rmd160.[ch]:
These files have the following copyright information, and by the
author we are allowed to use it under the new-style BSD license.
- >>>
- AUTHOR:: Antoon Bosselaers, ESAT-COSIC
+ AUTHOR: Antoon Bosselaers, ESAT-COSIC
(Arranged for libc by Todd C. Miller)
- DATE:: 1 March 1996
+ DATE: 1 March 1996
Copyright (c) Katholieke Universiteit Leuven
1996, All Rights Reserved
-ext/digest/sha2/sha2.c::
-ext/digest/sha2/sha2.h::
+ext/digest/sha2/sha2.[ch]:
These files are under the new-style BSD license.
- >>>
Copyright 2000 Aaron D. Gifford. All rights reserved.
Redistribution and use in source and binary forms, with or without
@@ -657,108 +529,28 @@ ext/digest/sha2/sha2.h::
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.
-ext/json/generator/generator.c::
-
- The file contains the following copyright notice.
-
- >>>
- Copyright 2001-2004 Unicode, Inc.
-
- Disclaimer::
-
- This source code is provided as is by Unicode, Inc. No claims are
- made as to fitness for any particular purpose. No warranties of any
- kind are expressed or implied. The recipient agrees to determine
- applicability of information provided. If this file has been
- purchased on magnetic or optical media from Unicode, Inc., the
- sole remedy for any claim will be exchange of defective media
- within 90 days of receipt.
-
- Limitations on Rights to Redistribute This Code::
-
- Unicode, Inc. hereby grants the right to freely use the information
- supplied in this file in the creation of products supporting the
- Unicode Standard, and to make copies of this file in any form
- for internal or external distribution as long as this notice
- remains attached.
-
-ext/nkf/nkf-utf8/config.h::
-ext/nkf/nkf-utf8/nkf.c::
-ext/nkf/nkf-utf8/utf8tbl.c::
+ext/nkf/nkf-utf8/config.h:
+ext/nkf/nkf-utf8/nkf.c:
+ext/nkf/nkf-utf8/utf8tbl.c:
These files are under the following license. So to speak, it is
copyrighted semi-public-domain software.
- >>>
Copyright (C) 1987, Fujitsu LTD. (Itaru ICHIKAWA)
-
- Everyone is permitted to do anything on this program
- including copying, modifying, improving,
- as long as you don't try to pretend that you wrote it.
- i.e., the above copyright notice has to appear in all copies.
- Binary distribution requires original version messages.
- You don't have to ask before copying, redistribution or publishing.
- THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE.
-
-ext/psych::
-test/psych::
-
- The files under these directories are under the following license, except for
- ext/psych/yaml.
-
- >>>
- Copyright 2009 Aaron Patterson, et al.
-
- Permission is hereby granted, free of charge, to any person obtaining a copy of
- this software and associated documentation files (the 'Software'), to deal in
- the Software without restriction, including without limitation the rights to
- use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
- of the Software, and to permit persons to whom the Software is furnished to do
- so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in all
- copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- SOFTWARE.
-
-ext/psych/yaml::
-
- The files under this directory are under the following license.
-
- >>>
- Copyright (c) 2006 Kirill Simonov
-
- Permission is hereby granted, free of charge, to any person obtaining a copy of
- this software and associated documentation files (the "Software"), to deal in
- the Software without restriction, including without limitation the rights to
- use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
- of the Software, and to permit persons to whom the Software is furnished to do
- so, subject to the following conditions:
-
- The above copyright notice and this permission notice shall be included in all
- copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- SOFTWARE.
-
-ext/socket/addrinfo.h::
-ext/socket/getaddrinfo.c::
-ext/socket/getnameinfo.c::
+ Everyone is permitted to do anything on this program
+ including copying, modifying, improving,
+ as long as you don't try to pretend that you wrote it.
+ i.e., the above copyright notice has to appear in all copies.
+ Binary distribution requires original version messages.
+ You don't have to ask before copying, redistribution or publishing.
+ THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE.
+
+ext/socket/addrinfo.h:
+ext/socket/getaddrinfo.c:
+ext/socket/getnameinfo.c:
These files are under the new-style BSD license.
- >>>
Copyright (C) 1995, 1996, 1997, 1998, and 1999 WIDE Project.
All rights reserved.
@@ -786,12 +578,11 @@ ext/socket/getnameinfo.c::
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.
-ext/win32ole/win32ole.c::
+ext/win32ole/win32ole.c:
You can apply the Artistic License to this file. (or GPL,
alternatively)
- >>>
(c) 1995 Microsoft Corporation. All rights reserved.
Developed by ActiveWare Internet Corp., http://www.ActiveWare.com
@@ -801,135 +592,3 @@ ext/win32ole/win32ole.c::
You may distribute under the terms of either the GNU General Public
License or the Artistic License, as specified in the README file
of the Perl distribution.
-
- The Wayback Machine url: http://web.archive.org/web/19970607104352/http://www.activeware.com:80/
-
-lib/rdoc/generator/template/darkfish/css/fonts.css::
-
- This file is licensed under the SIL Open Font License.
-
- >>>
- http://scripts.sil.org/OFL
-
-spec/mspec::
-spec/ruby::
-
- The files under these directories are under the following license.
-
- >>>
- Copyright (c) 2008 Engine Yard, Inc. All rights reserved.
-
- Permission is hereby granted, free of charge, to any person
- obtaining a copy of this software and associated documentation
- files (the "Software"), to deal in the Software without
- restriction, including without limitation the rights to use,
- copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the
- Software is furnished to do so, subject to the following
- conditions:
-
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
- OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
- HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- OTHER DEALINGS IN THE SOFTWARE.
-
-lib/rubygems.rb::
-lib/rubygems::
-test/rubygems::
-
- RubyGems is under the following license.
-
- >>>
- RubyGems is copyrighted free software by Chad Fowler, Rich Kilmer, Jim
- Weirich and others. You can redistribute it and/or modify it under
- either the terms of the MIT license (see the file MIT.txt), or the
- conditions below:
-
- 1. You may make and give away verbatim copies of the source form of the
- software without restriction, provided that you duplicate all of the
- original copyright notices and associated disclaimers.
-
- 2. You may modify your copy of the software in any way, provided that
- you do at least ONE of the following:
-
- a. place your modifications in the Public Domain or otherwise
- make them Freely Available, such as by posting said
- modifications to Usenet or an equivalent medium, or by allowing
- the author to include your modifications in the software.
-
- b. use the modified software only within your corporation or
- organization.
-
- c. give non-standard executables non-standard names, with
- instructions on where to get the original software distribution.
-
- d. make other distribution arrangements with the author.
-
- 3. You may distribute the software in object code or executable
- form, provided that you do at least ONE of the following:
-
- a. distribute the executables and library files of the software,
- together with instructions (in the manual page or equivalent)
- on where to get the original distribution.
-
- b. accompany the distribution with the machine-readable source of
- the software.
-
- c. give non-standard executables non-standard names, with
- instructions on where to get the original software distribution.
-
- d. make other distribution arrangements with the author.
-
- 4. You may modify and include the part of the software into any other
- software (possibly commercial).
-
- 5. The scripts and library files supplied as input to or produced as
- output from the software do not automatically fall under the
- copyright of the software, but belong to whomever generated them,
- and may be sold commercially, and may be aggregated with this
- software.
-
- 6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
- IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- PURPOSE.
-
-lib/bundler::
-lib/bundler.rb::
-lib/bundler.gemspec::
-spec/bundler::
-man/bundle-*,gemfile.*::
-
- Bundler is under the following license.
-
- >>>
- Portions copyright (c) 2010 Andre Arko
- Portions copyright (c) 2009 Engine Yard
-
- MIT License::
-
- Permission is hereby granted, free of charge, to any person obtaining
- a copy of this software and associated documentation files (the
- "Software"), to deal in the Software without restriction, including
- without limitation the rights to use, copy, modify, merge, publish,
- distribute, sublicense, and/or sell copies of the Software, and to
- permit persons to whom the Software is furnished to do so, subject to
- the following conditions:
-
- The above copyright notice and this permission notice shall be
- included in all copies or substantial portions of the Software.
-
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/Makefile.in b/Makefile.in
index fa1e19ef37..76b61f5581 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -16,14 +16,12 @@ top_srcdir = $(srcdir)
hdrdir = $(srcdir)/include
PLATFORM_DIR = @PLATFORM_DIR@
-CC_WRAPPER = @XCC_WRAPPER@
CC = @CC@
CPP = @CPP@
LD = @LD@
YACC = bison
PURIFY =
AUTOCONF = autoconf
-ACLOCAL = aclocal
CONFIGURE = @CONFIGURE@
@SET_MAKE@
MKFILES = @MAKEFILES@
@@ -45,17 +43,7 @@ arch = @arch@
sitearch = @sitearch@
sitedir = @sitedir@
archlibdir = @archlibdir@
-includedir = @includedir@
-archincludedir = @archincludedir@
-rubylibprefix = @rubylibprefix@
-rubylibdir = @rubylibdir@
-rubyarchprefix = @rubyarchprefix@
-rubyarchdir = @rubyarchdir@
-rubyhdrdir = @rubyhdrdir@
-rubyarchhdrdir = @rubyarchhdrdir@
ruby_version = @ruby_version@
-RUBY_VERSION_NAME = @RUBY_VERSION_NAME@
-UNIVERSAL_ARCHNAMES = @UNIVERSAL_ARCHNAMES@
TESTUI = console
TESTS =
@@ -63,7 +51,6 @@ INSTALLDOC = @INSTALLDOC@
DOCTARGETS = @RDOCTARGET@ @CAPITARGET@
EXTOUT = @EXTOUT@
-TIMESTAMPDIR = $(EXTOUT)/.timestamp
arch_hdrdir = $(EXTOUT)/include/$(arch)
VPATH = $(arch_hdrdir)/ruby:$(hdrdir)/ruby:$(srcdir):$(srcdir)/missing
@@ -71,7 +58,6 @@ empty =
CC_VERSION = @CC_VERSION@
OUTFLAG = @OUTFLAG@$(empty)
COUTFLAG = @COUTFLAG@$(empty)
-CPPOUTFLAG = $(COUTFLAG)
ARCH_FLAG = @ARCH_FLAG@
CFLAGS_NO_ARCH = @CFLAGS@
CFLAGS = $(CFLAGS_NO_ARCH) $(ARCH_FLAG)
@@ -80,38 +66,18 @@ optflags = @optflags@
debugflags = @debugflags@
warnflags = @warnflags@ @strict_warnflags@
cppflags = @cppflags@
-MATHN = @MATHN@
-XCFLAGS = @XCFLAGS@ $(MATHN:yes=-DCANONICALIZATION_FOR_MATHN)
-USE_RUBYGEMS = @USE_RUBYGEMS@
-USE_RUBYGEMS_ = $(USE_RUBYGEMS:yes=)
-CPPFLAGS = @CPPFLAGS@ $(INCFLAGS) $(USE_RUBYGEMS_:no=-DDISABLE_RUBYGEMS=1)
-MJIT_SUPPORT = @MJIT_SUPPORT@
-MJIT_HEADER_FLAGS = @MJIT_HEADER_FLAGS@
-MJIT_HEADER_SUFFIX =
-MJIT_HEADER_ARCH =
-MJIT_HEADER_INSTALL_DIR = @MJIT_HEADER_INSTALL_DIR@
-MJIT_CC = @MJIT_CC@
-MJIT_CFLAGS = @MJIT_CFLAGS@
-MJIT_OPTFLAGS = @MJIT_OPTFLAGS@
-MJIT_DEBUGFLAGS = @MJIT_DEBUGFLAGS@
-MJIT_LDSHARED = @MJIT_LDSHARED@
-MJIT_DLDFLAGS = @DLDFLAGS@
-MJIT_HEADER = rb_mjit_header.h
-MJIT_MIN_HEADER_NAME = rb_mjit_min_header-$(RUBY_PROGRAM_VERSION).h
-MJIT_MIN_HEADER = $(MJIT_HEADER_BUILD_DIR)/$(MJIT_MIN_HEADER_NAME)
-MJIT_HEADER_BUILD_DIR = $(EXTOUT)/include/$(arch)
+INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir) -I$(srcdir)
+XCFLAGS = @XCFLAGS@
+CPPFLAGS = @CPPFLAGS@ $(INCFLAGS)
LDFLAGS = @STATIC@ $(CFLAGS) @LDFLAGS@
EXTLDFLAGS = @EXTLDFLAGS@
XLDFLAGS = @XLDFLAGS@ $(EXTLDFLAGS)
EXTLIBS =
LIBS = @LIBS@ $(EXTLIBS)
MISSING = @LIBOBJS@ @ALLOCA@
-ENABLE_SHARED = @ENABLE_SHARED@
LDSHARED = @LIBRUBY_LDSHARED@
-DLDSHARED = @DLDSHARED@
DLDFLAGS = @LIBRUBY_DLDFLAGS@ $(XLDFLAGS) $(ARCH_FLAG)
SOLIBS = @SOLIBS@
-ENABLE_DEBUG_ENV = @ENABLE_DEBUG_ENV@
MAINLIBS = @MAINLIBS@
ARCHMINIOBJS = @MINIOBJS@
DLNOBJ = @DLNOBJ@
@@ -124,7 +90,6 @@ POSTLINK = @POSTLINK@
RUBY_BASE_NAME=@RUBY_BASE_NAME@
RUBY_PROGRAM_VERSION=@RUBY_PROGRAM_VERSION@
-RUBY_API_VERSION=@RUBY_API_VERSION@
RUBY_INSTALL_NAME=@RUBY_INSTALL_NAME@
RUBY_SO_NAME=@RUBY_SO_NAME@
EXEEXT = @EXEEXT@
@@ -151,19 +116,14 @@ XRUBY_RUBYLIBDIR = @XRUBY_RUBYLIBDIR@
XRUBY_RUBYHDRDIR = @XRUBY_RUBYHDRDIR@
BOOTSTRAPRUBY = @BOOTSTRAPRUBY@
-COROUTINE_H = @X_FIBER_COROUTINE_H@
-COROUTINE_OBJ = $(COROUTINE_H:.h=.@OBJEXT@)
-
#### End of system configuration section. ####
MAJOR= @MAJOR@
MINOR= @MINOR@
TEENY= @TEENY@
-RUBY_PROGRAM_VERSION = @RUBY_PROGRAM_VERSION@
LIBRUBY_A = @LIBRUBY_A@
LIBRUBY_SO = @LIBRUBY_SO@
-LIBRUBY_SONAME= @LIBRUBY_SONAME@
LIBRUBY_ALIASES= @LIBRUBY_ALIASES@
LIBRUBY = @LIBRUBY@
LIBRUBYARG = @LIBRUBYARG@
@@ -203,18 +163,17 @@ RMDIRS = @RMDIRS@
RMALL = @RMALL@
NM = @NM@
AR = @AR@
-ARFLAGS = @ARFLAGS@$(empty)
+ARFLAGS = rcu
RANLIB = @RANLIB@
AS = @AS@
ASFLAGS = @ASFLAGS@ $(INCFLAGS)
IFCHANGE = $(srcdir)/tool/ifchange
+SET_LC_MESSAGES = env LC_MESSAGES=C
OBJDUMP = @OBJDUMP@
OBJCOPY = @OBJCOPY@
-HAVE_GIT = @HAVE_GIT@
-GIT = @GIT@
VCS = @VCS@
VCSUP = @VCSUP@
-DTRACE = @DTRACE@ @DTRACE_OPT@
+DTRACE = @DTRACE@
DTRACE_EXT = @DTRACE_EXT@
DTRACE_OBJ = @DTRACE_OBJ@
DTRACE_REBUILD= @DTRACE_REBUILD@
@@ -222,7 +181,6 @@ DTRACE_GLOMMED_OBJ = $(DTRACE_REBUILD:yes=ruby-glommed.$(OBJEXT))
OBJEXT = @OBJEXT@
ASMEXT = S
-SOEXT = @SOEXT@
DLEXT = @DLEXT@
MANTYPE = @MANTYPE@
SYMBOL_PREFIX = @SYMBOL_PREFIX@
@@ -232,11 +190,8 @@ INSTALLED_LIST= .installed.list
NEWLINE_C = enc/trans/newline.c
MINIPRELUDE_C = miniprelude.c
PRELUDE_C = prelude.c
-GOLF_PRELUDE_C= golf_prelude.c
RBCONFIG = .rbconfig.time
-MAINSRC = $(MAINOBJ:@OBJEXT@=c)
-
SRC_FILE = $<
OS_SRC_FILE = $<
DEST_FILE = $@
@@ -252,7 +207,7 @@ DESTDIR = @DESTDIR@
configure_args = @configure_args@
#### End of variables
-.SUFFIXES: .inc .h .c .y .i .$(ASMEXT) .$(DTRACE_EXT)
+.SUFFIXES: .inc .h .c .y .i .$(DTRACE_EXT)
all:
@@ -263,7 +218,6 @@ miniruby$(EXEEXT):
@-if test -f $@; then $(MV) -f $@ $@.old; $(RM) $@.old; fi
$(ECHO) linking $@
$(Q) $(PURIFY) $(CC) $(LDFLAGS) $(XLDFLAGS) $(NORMALMAINOBJ) $(MINIOBJS) $(COMMONOBJS) $(MAINLIBS) $(LIBS) $(OUTFLAG)$@
- $(Q) $(POSTLINK)
$(PROGRAM):
@$(RM) $@
@@ -271,45 +225,39 @@ $(PROGRAM):
$(Q) $(PURIFY) $(CC) $(LDFLAGS) $(XLDFLAGS) $(MAINOBJ) $(EXTOBJS) $(LIBRUBYARG) $(MAINLIBS) $(LIBS) $(EXTLIBS) $(OUTFLAG)$@
$(Q) $(POSTLINK)
-PRE_LIBRUBY_UPDATE = [ -n "$(LIBRUBY_SO_UPDATE)" ] || $(exec) $(RM) $(LIBRUBY_EXTS)
-
# We must `rm' the library each time this rule is invoked because "updating" a
# MAB library on Apple/NeXT (see --enable-fat-binary in configure) is not
# supported.
$(LIBRUBY_A):
@$(RM) $@
- @-[ -z "$(EXTSTATIC)" ] || $(PRE_LIBRUBY_UPDATE)
$(ECHO) linking static-library $@
$(Q) $(AR) $(ARFLAGS) $@ $(LIBRUBY_A_OBJS) $(INITOBJS)
@-$(RANLIB) $@ 2> /dev/null || true
-
-verify-static-library: $(LIBRUBY_A)
$(ECHO) verifying static-library $@
@$(PURIFY) $(CC) $(LDFLAGS) $(XLDFLAGS) $(MAINOBJ) $(LIBRUBY_A) $(MAINLIBS) $(EXTLIBS) $(LIBS) $(OUTFLAG)conftest$(EXEEXT)
- @$(RMALL) conftest$(EXEEXT) conftest.c conftest.dSYM
+ @$(RM) conftest$(EXEEXT) conftest.c
$(LIBRUBY_SO):
- @-[ -n "$(EXTSTATIC)" ] || $(PRE_LIBRUBY_UPDATE)
+ @-$(PRE_LIBRUBY_UPDATE)
$(ECHO) linking shared-library $@
$(Q) $(LDSHARED) $(DLDFLAGS) $(OBJS) $(DLDOBJS) $(SOLIBS) $(EXTSOLIBS) $(OUTFLAG)$@
-$(Q) $(OBJCOPY) -w -L '$(SYMBOL_PREFIX)Init_*' -L '$(SYMBOL_PREFIX)ruby_static_id_*' \
- -L '$(SYMBOL_PREFIX)*_threadptr_*' -L '$(SYMBOL_PREFIX)*_ec_*' $@
+ -L '$(SYMBOL_PREFIX)*_threadptr_*' $@
$(Q) $(POSTLINK)
- @-$(MINIRUBY) -e 'so, *aliases = ARGV; aliases.uniq!; aliases.delete(File.basename(so)); \
- aliases.each { |link| File.delete link rescue nil; File.symlink so, link }' \
- $(LIBRUBY_SO) $(LIBRUBY_ALIASES) || true
-
-LIBRUBY_WITH_EXT = @LIBRUBY_WITH_EXT@
-$(LIBRUBY_$(LIBRUBY_WITH_EXT)): $(LIBRUBY_SO_UPDATE)
+ @-$(MINIRUBY) -e 'ARGV.each{|link| File.delete link rescue nil; \
+ File.symlink "$(LIBRUBY_SO)", link}' \
+ $(LIBRUBY_ALIASES) || true
ruby_pc = @ruby_pc@
-ruby.pc: $(ruby_pc)
-$(ruby_pc): config.status
+$(ruby_pc):
@./config.status --file=$@:$(srcdir)/template/ruby.pc.in
-ruby-runner.h: template/ruby-runner.h.in config.status
+ruby-runner.c: template/ruby-runner.c.in
@./config.status --file=$@:$(srcdir)/template/$(@F).in
+ruby-runner$(EXEEXT): ruby-runner.c
+ $(Q) $(PURIFY) $(CC) $(CFLAGS) $(CPPFLAGS) -DRUBY_INSTALL_NAME=$(RUBY_INSTALL_NAME) $(LDFLAGS) $(LIBS) $(OUTFLAG)$@ ruby-runner.c
+
$(RBCONFIG): $(PREP)
rbconfig.rb: $(RBCONFIG)
@@ -351,25 +299,17 @@ uncommon.mk: $(srcdir)/common.mk
.PHONY: reconfig
reconfig-args = $(srcdir)/$(CONFIGURE) $(configure_args)
config.status-args = ./config.status --recheck
-reconfig-exec-0 = test -t 1 && { : $${CONFIGURE_TTY=yes}; export CONFIGURE_TTY; }; exec 3>&1; exit `exec 4>&1; { "$$@" 3>&- 4>&-; echo $$? 1>&4; } | fgrep -v '(cached)' 1>&3 3>&- 4>&-`
+reconfig-exec-0 = test -t 1 && { CONFIGURE_TTY=yes; export CONFIGURE_TTY; }; exec 3>&1; exit `exec 4>&1; { "$$@" 3>&- 4>&-; echo $$? 1>&4; } | fgrep -v '(cached)' 1>&3 3>&- 4>&-`
reconfig-exec-1 = set -x; "$$@"
reconfig config.status: $(srcdir)/$(CONFIGURE) $(srcdir)/enc/Makefile.in \
$(srcdir)/include/ruby/version.h
@PWD= MINIRUBY="$(MINIRUBY)"; export MINIRUBY; \
- warnflags="@warnflags@"; export warnflags; \
set $(SHELL) $($@-args); $(reconfig-exec-$(V))
-$(srcdir)/$(CONFIGURE): $(srcdir)/configure.ac $(srcdir)/aclocal.m4
+$(srcdir)/$(CONFIGURE): $(srcdir)/configure.in $(srcdir)/aclocal.m4
$(CHDIR) $(srcdir) && exec $(AUTOCONF) -o $(@F)
-$(srcdir)/aclocal.m4:
- $(CHDIR) $(srcdir) && \
- type $(ACLOCAL) >/dev/null 2>&1 && exec $(ACLOCAL); \
- touch $(@F)
-
-prereq: $(srcdir)/$(CONFIGURE)
-
incs: id.h
all-incs: probes.h
@@ -388,16 +328,35 @@ lex.c: defs/keywords
else \
[ $(Q) ] && echo generating $@ || set -x; \
gperf -C -P -p -j1 -i 1 -g -o -t -N rb_reserved_word -k1,3,$$ $? \
- | sed -f $(srcdir)/tool/gperf.sed \
+ | sed 's/(long)&((\(struct stringpool_t\) *\*)0)->\(stringpool_[a-z0-9]*\)/offsetof(\1, \2)/g' \
> $@.tmp && \
$(MV) $@.tmp $@ && \
$(CP) $? $(srcdir)/defs/lex.c.src && \
$(CP) $@ $(srcdir)/lex.c.blt; \
fi
+NAME2CTYPE_OPTIONS = -7 -c -j1 -i1 -t -C -P -T -H uniname2ctype_hash -Q uniname2ctype_pool -N uniname2ctype_p
+
+enc/unicode/name2ctype.h: enc/unicode/name2ctype.kwd
+ $(MAKEDIRS) $(@D)
+ @set +e; \
+ if cmp -s $(?:.kwd=.src) $?; then \
+ set -x; \
+ $(CP) $(?:.kwd=.h.blt) $@; \
+ else \
+ trap '$(RM) $@-1.h $@-2.h' 0 && \
+ set -x; \
+ sed '/^#ifdef USE_UNICODE_PROPERTIES/,/^#endif/d' $? | gperf $(NAME2CTYPE_OPTIONS) > $@-1.h && \
+ sed '/^#ifdef USE_UNICODE_PROPERTIES/d;/^#endif/d' $? | gperf $(NAME2CTYPE_OPTIONS) > $@-2.h && \
+ diff -DUSE_UNICODE_PROPERTIES $@-1.h $@-2.h > $@.tmp || :; \
+ $(MV) $@.tmp $@ && \
+ $(CP) $? $(?:.kwd=.src) && \
+ $(CP) $@ $(?:.kwd=.h.blt); \
+ fi
+
JIS_PROPS_OPTIONS = -k1,3 -7 -c -j1 -i1 -t -C -P -t --ignore-case -H onig_jis_property_hash -Q onig_jis_property_pool -N onig_jis_property
-$(srcdir)/enc/jis/props.h: enc/jis/props.kwd
+enc/jis/props.h: enc/jis/props.kwd
$(MAKEDIRS) $(@D)
@set +e; \
if cmp -s $(?:.kwd=.src) $?; then \
@@ -406,7 +365,7 @@ $(srcdir)/enc/jis/props.h: enc/jis/props.kwd
else \
set -x; \
gperf $(JIS_PROPS_OPTIONS) $? | \
- sed -f $(srcdir)/tool/gperf.sed > $@ && \
+ sed 's/(int)(long)&((\([a-zA-Z_0-9 ]*[a-zA-Z_0-9]\) *\*)0)->\([a-zA-Z0-9_]*\),/(char)offsetof(\1, \2),/g' > $@ && \
$(CP) $? $(?:.kwd=.src) && \
$(CP) $@ $(?:.kwd=.h.blt); \
fi
@@ -415,11 +374,11 @@ $(srcdir)/enc/jis/props.h: enc/jis/props.kwd
@$(ECHO) compiling $<
$(Q) $(CC) $(CFLAGS) $(XCFLAGS) $(CPPFLAGS) $(COUTFLAG)$@ -c $<
-.$(ASMEXT).@OBJEXT@:
+.s.@OBJEXT@:
@$(ECHO) assembling $<
- $(Q) $(CC) $(ASFLAGS) -o $@ -c $<
+ $(Q) $(AS) $(ASFLAGS) -o $@ $<
-.c.$(ASMEXT):
+.c.S:
@$(ECHO) translating $<
$(Q) $(CC) $(CFLAGS) $(XCFLAGS) $(CPPFLAGS) $(COUTFLAG)$@ -S $<
@@ -434,8 +393,8 @@ $(srcdir)/enc/jis/props.h: enc/jis/props.kwd
$(Q) $(RM) $@.tmp
.dmyh.h:
- @$(ECHO) making dummy $(DEST_FILE)
- $(Q)echo '#include "$(*F).dmyh"' > $@
+ @$(ECHO) copying dummy $(DEST_FILE)
+ $(Q) $(CP) $(OS_SRC_FILE) $(OS_DEST_FILE)
probes.stamp: $(DTRACE_REBUILD_OBJS)
$(Q) if test -f $@ -o -f probes.$(OBJEXT); then \
@@ -445,21 +404,11 @@ probes.stamp: $(DTRACE_REBUILD_OBJS)
fi
$(Q) touch $@
-probes.$(OBJEXT): $(srcdir)/probes.d $(DTRACE_REBUILD:yes=probes.stamp)
+probes.@OBJEXT@: $(srcdir)/probes.d $(DTRACE_REBUILD:yes=probes.stamp)
@$(ECHO) processing probes in object files
$(Q) $(RM) $@
$(Q) $(DTRACE) -G -C $(INCFLAGS) -s $(srcdir)/probes.d -o $@ $(DTRACE_REBUILD_OBJS)
-main: mjit-headers
-yes-mjit-headers: $(MJIT_MIN_HEADER)
-clean-local::
- $(Q)$(RM) $(MJIT_HEADER) $(MJIT_HEADER:.h=)$(MJIT_HEADER_SUFFIX:%=*).h
- $(Q)$(RM) $(MJIT_MIN_HEADER) $(MJIT_MIN_HEADER:.h=)$(MJIT_HEADER_SUFFIX:%=*).h
- $(Q)$(RM) $(MJIT_HEADER_INSTALL_DIR)/rb_mjit_min_header-*.h
- $(Q)$(RM) $(TIMESTAMPDIR)/$(MJIT_HEADER:.h=)$(MJIT_HEADER_SUFFIX).time mjit_config.h
- $(Q)$(RM) -r mjit_build_dir.*
- -$(Q) $(RMDIRS) $(MJIT_HEADER_INSTALL_DIR) 2> $(NULL) || exit 0
-
# DTrace static library hacks described here:
# http://mail.opensolaris.org/pipermail/dtrace-discuss/2005-August/000207.html
ruby-glommed.$(OBJEXT):
@@ -470,7 +419,6 @@ clean-local::
$(Q)$(RM) ext/extinit.c ext/extinit.$(OBJEXT) ext/ripper/y.output \
enc/encinit.c enc/encinit.$(OBJEXT)
-$(Q)$(RM) $(pkgconfig_DATA)
- -$(Q)$(RMALL) exe/ ruby-runner.$(OBJEXT) ruby-runner.h *.dSYM
distclean-local::
$(Q)$(RM) ext/config.cache $(RBCONFIG) Doxyfile
@@ -478,48 +426,33 @@ distclean-local::
-$(Q)$(RM) $(INSTALLED_LIST) $(arch_hdrdir)/ruby/config.h verconf.h
-$(Q)$(RMDIRS) $(arch_hdrdir)/ruby 2> /dev/null || true
-ext/clean.sub gems/clean.sub:: ext/clean.mk
-ext/distclean.sub gems/distclean.sub:: ext/distclean.mk
-ext/realclean.sub gems/realclean.sub:: ext/realclean.mk
-
-ext/clean.mk ext/distclean.mk ext/realclean.mk::
- -$(Q) if [ -f $(EXTS_MK) ]; then exec $(MAKE) -f $(EXTS_MK) $(@F:.mk=); fi
-
-ext/clean:: ext/clean.sub
-ext/distclean:: ext/distclean.sub
-ext/realclean:: ext/realclean.sub
-gems/clean:: gems/clean.sub
-gems/distclean:: gems/distclean.sub
-gems/realclean:: gems/realclean.sub
-
-ext/clean.sub ext/distclean.sub ext/realclean.sub \
-gems/clean.sub gems/distclean.sub gems/realclean.sub::
- $(Q) set dummy `echo "${EXTS}" | tr , ' '`; shift; \
+clean-ext distclean-ext realclean-ext::
+ @cd ext 2>/dev/null || exit 0; set dummy `echo "${EXTS}" | tr , ' '`; shift; \
test "$$#" = 0 && set .; \
set dummy `\
- cd $(@D) 2>/dev/null && \
- find "$$@" \( -name Makefile -o -name exts.mk \) -print | \
- sed -n 's:^\./::;s:^:$(@D)/:;s:/[^/][^/]*$$::p' | sort -u; \
+ find "$$@" -name Makefile -print | sed 's:^\./::;s:/Makefile$$::' | sort; \
`; shift; \
+ cd ..; \
for dir do \
- $(RM) "$$dir/exts.mk"; \
- if [ -f "$$dir/Makefile" ]; then \
- echo $(@F:.sub=)ing "$$dir"; \
- (cd "$$dir" && exec $(MAKE) $(mflags) $(@F:.sub=)); \
- fi; \
- done || true
-
-ext/distclean ext/realclean gems/distclean gems/realclean::
- $(Q) set dummy `echo "${EXTS}" | tr , ' '`; shift; \
- test "$$#" = 0 && set .; \
- cd $(@D) 2>/dev/null && \
- find "$$@" -type d -empty -exec $(RMDIRS) {} + 2> /dev/null || true
- $(Q) $(RMDIRS) $(@D) 2> /dev/null || true
+ echo $(@:-ext=)ing "$$dir"; \
+ (cd "ext/$$dir" && exec $(MAKE) $(MFLAGS) $(@:-ext=)) && \
+ case "$@" in \
+ *distclean-ext*|*realclean-ext*) \
+ $(RMDIRS) "ext/$$dir" 2> /dev/null || true;; \
+ esac; \
+ done
+ -$(Q)$(RM) ext/extinit.$(OBJEXT)
+
+distclean-ext realclean-ext::
+ -$(Q)$(RM) ext/extinit.c
+ -$(Q)$(RMDIR) ext 2> /dev/null || true
+
+clean-extout:
clean-enc distclean-enc realclean-enc:
@test -f "$(ENC_MK)" || exit 0; \
echo $(@:-enc=ing) encodings; \
- exec $(MAKE) $(MAKE_ENC) $(@:-enc=)
+ exec $(MAKE) -f $(ENC_MK) $(MFLAGS) $(@:-enc=)
ext/extinit.$(OBJEXT): ext/extinit.c $(SETUP)
$(ECHO) compiling $@
@@ -527,59 +460,89 @@ ext/extinit.$(OBJEXT): ext/extinit.c $(SETUP)
enc/encinit.$(OBJEXT): enc/encinit.c $(SETUP)
-cont.$(OBJEXT): $(COROUTINE_H)
-
-test-bundled-gems-run:
- $(Q) set -e; while read gem _; do \
- echo testing $$gem gem && \
- $(XRUBY) -C $(srcdir)/gems/src/$$gem -Ilib ../../../.bundle/bin/rake; \
- done < $(srcdir)/gems/bundled_gems
-
-update-src::
+up::
@$(CHDIR) "$(srcdir)" && LC_TIME=C exec $(VCSUP)
-update-download:: update-config_files
-
-after-update:: prereq
+after-update:: update-config_files common-srcs
-gcov:
- $(Q) $(BASERUBY) $(srcdir)/tool/run-gcov.rb
+update-mspec:
+ @$(CHDIR) $(srcdir); \
+ if [ -d spec/mspec ]; then \
+ echo updating mspec ...; \
+ $(Q:@=:) set -x; \
+ cd spec/mspec && \
+ exec git pull; \
+ else \
+ echo retrieving mspec ...; \
+ $(Q:@=:) set -x; \
+ exec git clone $(MSPEC_GIT_URL) spec/mspec; \
+ fi
-lcov:
- $(Q) $(BASERUBY) $(srcdir)/tool/run-lcov.rb
+update-rubyspec: update-mspec
+ @$(CHDIR) $(srcdir); \
+ if [ -d spec/rubyspec ]; then \
+ echo updating rubyspec ...; \
+ $(Q:@=:) set -x; \
+ cd spec/rubyspec && \
+ exec git pull; \
+ else \
+ echo retrieving rubyspec ...; \
+ $(Q:@=:) set -x; \
+ exec git clone $(RUBYSPEC_GIT_URL) spec/rubyspec; \
+ fi
-update-benchmark-driver:
- $(Q) $(srcdir)/tool/git-refresh -C $(srcdir)/benchmark $(Q1:0=-q) \
- --branch $(BENCHMARK_DRIVER_GIT_REF) \
- $(BENCHMARK_DRIVER_GIT_URL) benchmark-driver $(GIT_OPTS)
+test-rubyspec-precheck:
+ @if [ ! -d $(srcdir)/spec/rubyspec ]; then echo No rubyspec here. make update-rubyspec first.; exit 1; fi
update-doclie:
- $(Q) $(srcdir)/tool/git-refresh -C $(srcdir)/coverage $(Q1:0=-q) \
- --branch $(DOCLIE_GIT_REF) \
- $(DOCLIE_GIT_URL) doclie $(GIT_OPTS)
+ @$(CHDIR) $(srcdir); \
+ if [ -d coverage/doclie ]; then \
+ echo updating doclie ...; \
+ $(Q:@=:) set -x; \
+ cd coverage/doclie && \
+ git fetch && \
+ exec git checkout $(DOCLIE_GIT_REF); \
+ else \
+ echo retrieving doclie ...; \
+ $(Q:@=:) set -x; \
+ exec git clone --branch $(DOCLIE_GIT_REF) $(DOCLIE_GIT_URL) coverage/doclie; \
+ fi
update-simplecov-html:
- $(Q) $(srcdir)/tool/git-refresh -C $(srcdir)/coverage $(Q1:0=-q) \
- --branch $(SIMPLECOV_HTML_GIT_REF) \
- $(SIMPLECOV_HTML_GIT_URL) simplecov-html $(GIT_OPTS)
+ @$(CHDIR) $(srcdir); \
+ if [ -d coverage/simplecov-html ]; then \
+ echo updating simplecov-html ...; \
+ $(Q:@=:) set -x; \
+ cd coverage/simplecov-html && \
+ git fetch && \
+ exec git checkout $(SIMPLECOV_HTML_GIT_REF); \
+ else \
+ echo retrieving simplecov-html ...; \
+ exec git clone --branch $(SIMPLECOV_HTML_GIT_REF) $(SIMPLECOV_HTML_GIT_URL) coverage/simplecov-html; \
+ fi
update-simplecov:
- $(Q) $(srcdir)/tool/git-refresh -C $(srcdir)/coverage $(Q1:0=-q) \
- --branch $(SIMPLECOV_GIT_REF) \
- $(SIMPLECOV_GIT_URL) simplecov $(GIT_OPTS)
+ @$(CHDIR) $(srcdir); \
+ if [ -d coverage/simplecov ]; then \
+ echo updating simplecov ...; \
+ $(Q:@=:) set -x; \
+ cd coverage/simplecov && \
+ git fetch && \
+ exec git checkout $(SIMPLECOV_GIT_REF); \
+ else \
+ echo retrieving simplecov ...; \
+ $(Q:@=:) set -x; \
+ exec git clone --branch $(SIMPLECOV_GIT_REF) $(SIMPLECOV_GIT_URL) coverage/simplecov; \
+ fi
update-coverage: update-simplecov update-simplecov-html update-doclie
-update-known-errors:
- errno --list | cut -d' ' -f1 | sort -u - $(srcdir)/defs/known_errors.def | \
- $(IFCHANGE) $(srcdir)/defs/known_errors.def -
-
INSNS = opt_sc.inc optinsn.inc optunifs.inc insns.inc insns_info.inc \
- vmtc.inc vm.inc mjit_compile.inc
+ vmtc.inc vm.inc
$(INSNS): $(srcdir)/insns.def vm_opts.h \
$(srcdir)/defs/opt_operand.def $(srcdir)/defs/opt_insn_unif.def \
- $(srcdir)/tool/insns2vm.rb
+ $(srcdir)/tool/instruction.rb $(srcdir)/tool/insns2vm.rb
$(ECHO) generating $@
$(Q) $(BASERUBY) -Ku $(srcdir)/tool/insns2vm.rb $(INSNS2VMOPT) $@
@@ -589,45 +552,3 @@ loadpath: verconf.h
@$(CPP) $(XCFLAGS) $(CPPFLAGS) $(srcdir)/loadpath.c | \
sed -e '1,/^const char ruby_initial_load_paths/d;/;/,$$d' \
-e '/^ /!d;s/ *"\\0"$$//;s/" *"//g'
-
-un-runnable:
- $(ECHO) cannot make runnable, configure with --enable-load-relative.
- $(Q) exit 1
-
-mjit_config.h:
- $(ECHO) making $@
- @{ \
- . $(srcdir)/tool/mjit_archflag.sh; \
- parse_arch_flags "$(UNIVERSAL_ARCHNAMES)" $(ARCH_FLAG); \
- test "$(Q)" = @ || set -x; \
- echo '#ifndef RUBY_MJIT_CONFIG_H'; \
- echo '#define RUBY_MJIT_CONFIG_H 1'; \
- echo; \
- sep=; \
- echo '#ifdef LOAD_RELATIVE'; \
- quote MJIT_HEADER_INSTALL_DIR "/$(MJIT_HEADER_INSTALL_DIR)"; \
- echo '#else'; \
- quote MJIT_HEADER_INSTALL_DIR "$(rubyarchhdrdir)"; \
- echo '#endif'; \
- quote MJIT_MIN_HEADER_NAME "$(MJIT_MIN_HEADER_NAME)"; \
- sep=,; \
- quote "MJIT_CC_COMMON " $(MJIT_CC); \
- quote "MJIT_CFLAGS MJIT_ARCHFLAG" $(MJIT_CFLAGS); \
- quote "MJIT_OPTFLAGS " $(MJIT_OPTFLAGS); \
- quote "MJIT_DEBUGFLAGS " $(MJIT_DEBUGFLAGS); \
- quote "MJIT_LDSHARED " $(MJIT_LDSHARED); \
- quote "MJIT_DLDFLAGS MJIT_ARCHFLAG" $(MJIT_DLDFLAGS); \
- quote "MJIT_LIBS " $(LIBRUBYARG_SHARED); \
- quote 'PRELOADENV "@PRELOADENV@"'; \
- indent=$${archs:+' '}; \
- define_arch_flags; \
- echo; \
- echo '#endif /* RUBY_MJIT_CONFIG_H */'; \
- } > $@
-
-yes-test-almost yes-test-all: mjit_build_dir.$(SOEXT)
-mjit_build_dir.$(SOEXT): $(MJIT_MIN_HEADER) $(srcdir)/ruby-runner.c ruby-runner.h
- $(ECHO) making $@
- $(Q) $(DLDSHARED) $(MJIT_DLDFLAGS) $(ARCH_FLAG) $(CFLAGS) $(CPPFLAGS) \
- -DMAKE_MJIT_BUILD_DIR=1 -DMJIT_MIN_HEADER='"$(MJIT_MIN_HEADER)"' \
- $(OUTFLAG)$@ $(srcdir)/ruby-runner.c
diff --git a/NEWS b/NEWS
index e7684e15bb..be722bc9de 100644
--- a/NEWS
+++ b/NEWS
@@ -1,686 +1,404 @@
# -*- rdoc -*-
-= NEWS for Ruby 2.6.0
+= NEWS for Ruby 2.3.0
This document is a list of user visible feature changes made between
releases except for bug fixes.
-Note that each entry is kept so brief that no reason behind or reference
-information is supplied with. For a full list of changes with all
-sufficient information, see the ChangeLog file or Redmine
+Note that each entry is kept so brief that no reason behind or
+reference information is supplied with. For a full list of changes
+with all sufficient information, see the ChangeLog file or Redmine
(e.g. <tt>https://bugs.ruby-lang.org/issues/$FEATURE_OR_BUG_NUMBER</tt>)
-== Changes since the 2.5.0 release
+== Changes since the 2.2.0 release
=== Language changes
-* <code>$SAFE</code> now is a process global state and can be set to 0 again. [Feature #14250]
+* frozen-string-literal pragma:
-* Refinements take place at block passing. [Feature #14223]
+ * new pragma, frozen-string-literal has been experimentally introduced.
+ [Feature #8976]
+ * besides, --enable/--disable=frozen-string-literal options also have
+ been introduced. [Feature #8976]
+ * command line options --debug or --debug=frozen-string-literal enable
+ additional debugging mode which shows created location with at frozen
+ object error (RuntimeError).
+ [Feature #11725]
-* Refinements take place at Kernel#public_send. [Feature #15326]
+* safe navigation operator:
-* Refinements take place at Kernel#respond_to?. [Feature #15327]
+ * new method call syntax, `object&.foo', method #foo is called on
+ `object' if it is not nil.
+ this is similar to `try!' in Active Support, except:
+ * method name is syntactically required
+ obj.try! {} # valid
+ obj&. {} # syntax error
+ * arguments are evaluated only if a call is made:
+ obj.try!(:foo, bar()) # bar() is always evaluated
+ obj&.foo(bar()) # bar() is conditionally evaluated
+ * attribute assignment is valid
+ obj&.attr += 1
+ [Feature #11537]
-* +else+ without +rescue+ now causes a syntax error. [EXPERIMENTAL] [Feature #14606]
+* the did_you_mean gem:
-* Constant names may start with a non-ASCII capital letter. [Feature #13770]
+ * When a NameError or NoMethodError occurs because of a typo in the name,
+ the did_you_mean gem automatically suggests other names similar to the
+ method name.
-* Endless ranges are introduced. You can use a Range that has no end,
- like <code>(0..)</code> (or similarly <code>(0...)</code>). [Feature #12912]
+ "Yuki".starts_with?("Y")
+ # => NoMethodError: undefined method `starts_with?' for "Yuki":String
+ # Did you mean? start_with?
- The following shows typical use cases:
+* indented here document:
- ary[1..] # identical to ary[1..-1]
- (1...).each {|index| block } # infinite loop from index 1
- ary.zip(1..) {|elem, index| block } # ary.each.with_index(1) { }
-
-* The "shadowing outer local variable" warning is removed. [Feature #12490]
-
- You can now write the following without warning:
-
- user = users.find {|user| cond(user) }
-
-* Print +cause+ of the exception if the exception is not caught and printed
- its backtraces and error message. [Feature #8257]
-
-* The flip-flop syntax is deprecated. [Feature #5400]
-
-* Non-Symbol keys in a keyword arguments hash was prohibited at 2.6.0, but
- now allowed again. [Bug #15658]
+ * new string literal, here document starts with `<<~`.
+ refer doc/syntax/literals.rdoc for more details.
+ [Feature #9098]
=== Core classes updates (outstanding ones only)
-[Array]
-
- [New methods]
-
- * Added Array#union and Array#difference instance methods. [Feature #14097]
-
- [Modified methods]
-
- * Array#to_h now accepts a block that maps elements to new key/value pairs. [Feature #15143]
-
- [Aliased methods]
-
- * Array#filter is a new alias for Array#select. [Feature #13784]
- * Array#filter! is a new alias for Array#select!. [Feature #13784]
-
-[Binding]
-
- [New methods]
-
- * Added Binding#source_location. [Feature #14230]
-
- This method returns the source location of the binding, a 2-element
- array of <code>__FILE__</code> and <code>__LINE__</code>.
- Traditionally, the same information could be retrieved by
- <code>eval("[__FILE__, __LINE__]", binding)</code>, but we are
- planning to change this behavior so that Kernel#eval ignores
- binding's source location [Bug #4352]. So, users should use this
- newly-introduced method instead of Kernel#eval.
-
-[Dir]
-
- [New methods]
-
- * Added Dir#each_child and Dir#children instance methods. [Feature #13969]
-
-[Enumerable]
-
- [New methods]
-
- * Enumerable#chain returns an enumerator object that iterates over the
- elements of the receiver and then those of each argument
- in sequence. [Feature #15144]
-
- [Modified methods]
-
- * Enumerable#to_h now accepts a block that maps elements to new key/value pairs. [Feature #15143]
-
- [Aliased methods]
-
- * Enumerable#filter is a new alias for Enumerable#select. [Feature #13784]
-
-[Enumerator::ArithmeticSequence]
-
- * This is a new class to represent a generator of an arithmetic sequence,
- that is a number sequence defined by a common difference. It can be used
- for representing what is similar to Python's slice. You can get an
- instance of this class from Numeric#step and Range#step.
-
-[Enumerator::Chain]
-
- * This is a new class to represent a chain of enumerables that works as a
- single enumerator, generated by such methods as Enumerable#chain and
- Enumerator#+.
-
-[Enumerator::Lazy]
-
- [Aliased methods]
-
- * Enumerator::Lazy#filter is a new alias for
- Enumerator::Lazy#select. [Feature #13784]
-
-[Enumerator]
-
- [New methods]
-
- * Enumerator#+ returns an enumerator object that iterates over the
- elements of the receiver and then those of the other operand. [Feature #15144]
-
-[ENV]
-
- [Modified methods]
-
- * ENV.to_h now accepts a block that maps names and values to new keys and values. [Feature #15143]
-
-[Exception]
-
- [New options]
-
- * Exception#full_message takes +:highlight+ and +:order+
- options. [Bug #14324]
-
-[Hash]
-
- [Modified methods]
+* ARGF
- * Hash#merge, Hash#merge!, and Hash#update now accept multiple
- arguments. [Feature #15111]
+ * ARGF.read_nonblock supports `exception: false' like IO#read_nonblock.
+ [Feature #11358]
- * Hash#to_h now accepts a block that maps keys and values to new keys and values. [Feature #15143]
+* Array
- [Aliased methods]
+ * Array#bsearch_index [Feature #10730]
+ * Array#dig [Feature #11643]
- * Hash#filter is a new alias for Hash#select. [Feature #13784]
+* Comparable
- * Hash#filter! is a new alias for Hash#select!. [Feature #13784]
+ * Comparable#== no longer rescues exceptions [Feature #7688]
-[IO]
+* Encoding
- [New options]
+ * new Encoding::IBM037 (alias ebcdic-cp-us; dummy)
- * Added new mode character <code>'x'</code> to open files for exclusive
- access. [Feature #11258]
+* Enumerable
-[Kernel]
+ * Enumerable#grep_v is added as inverse version of Enumerable#grep.
+ [Feature #11049]
+ * Enumerable#chunk_while [Feature #10769]
- [Aliased methods]
+* Enumerator::Lazy
- * Kernel#then is a new alias for Kernel#yield_self. [Feature #14594]
+ * Enumerator::Lazy#grep_v [Feature #11773]
- [New options]
+* File
- * Kernel#Complex, Kernel#Float, Kernel#Integer, and
- Kernel#Rational take an +:exception+ option to specify the way of
- error handling. [Feature #12732]
+ * File.mkfifo [Feature #11536]
+ * Add File::TMPFILE corresponding to O_TMPFILE
- * Kernel#system takes an +:exception+ option to raise an exception
- on failure. [Feature #14386]
+* Hash
- [Incompatible changes]
+ * Hash#fetch_values [Feature #10017]
+ * Hash#dig [Feature #11643]
+ * Hash#<=, Hash#<, Hash#>=, Hash#> [Feature #10984]
+ * Hash#to_proc [Feature #11653]
- * Kernel#system and Kernel#exec do not close non-standard file descriptors
- (the default of the +:close_others+ option is changed to +false+,
- but we still set the +FD_CLOEXEC+ flag on descriptors we
- create). [Misc #14907]
+* IO
-[KeyError]
+ * new mode flag File::SHARE_DELETE is available.
+ this flag means to permit deleting opened file on Windows, but currently
+ this affect only files opened as binary. [Feature #11218]
- [New options]
+ * new option parameter `flags' is added.
+ this parameter is bitwise-ORed to oflags generated by normal mode argument.
+ [Feature #11253]
- * KeyError.new accepts +:receiver+ and +:key+ options to set receiver and
- key in Ruby code. [Feature #14313]
+ * IO#advise no longer raises Errno::ENOSYS in cases where it was
+ detected at build time but not available at runtime. [Feature #11806]
-[Method]
+* Kernel
- [New methods]
+ * Kernel#loop, when stopped by a StopIteration exception, returns
+ what the enumerator has returned instead of nil. [Feature #11498]
- * Added Method#<< and Method#>> for Proc composition. [Feature #6284]
+* Module
+ * Module#deprecate_constant [Feature #11398]
-[Module]
+* NameError
+ * NameError#receiver is added to take the receiver object. [Feature #10881]
- [Modified methods]
+* Numeric
- * Module#method_defined?, Module#private_method_defined?, and
- Module#protected_method_defined? now accept the second
- parameter as optional. If it is +true+ (the default value), it checks
- ancestor modules/classes, or checks only the class itself. [Feature #14944]
+ * Numeric#positive? and Numeric#negative? are added, which return
+ true when the receiver is positive and negative respectively.
+ [Feature #11151]
-[NameError]
+* Proc
- [New options]
+ * Proc#call (and also #[], #===, #yield) are optimized.
+ Backtrace doesn't show each method (show block lines directly).
+ TracePoint also ignores these calls. [Feature #11569]
- * NameError.new accepts a +:receiver+ option to set receiver in Ruby
- code. [Feature #14313]
+* Queue (Thread::Queue)
-[NilClass]
+ * Queue#close is added to notice a termination. [Feature #10600]
- [New methods]
+* Regexp/String: Updated Unicode version from 7.0.0 to 8.0.0
- * NilClass#=~ is added for compatibility. [Feature #15231]
+* RubyVM::InstructionSequence
+ * add the following methods as a primitive tool of iseq loader.
+ See sample/iseq_loader.rb for usage.
+ Note that loader does not have verifier so it is easy to cause
+ critical problem by loading modified/broken binary data.
+ See [Feature #11788] for more details. (experimental feature)
+ * RubyVM::InstructionSequence#to_binary(extra_data = nil)
+ * RubyVM::InstructionSequence.load_from_binary(binary)
+ * RubyVM::InstructionSequence.load_from_binary_extra_data(binary)
-[NoMethodError]
+* String
- [New options]
+ * String#+@ and String#-@ are added to get mutable/frozen strings.
+ [Feature #11782]
- * NoMethodError.new accepts a +:receiver+ option to set receiver in Ruby
- code. [Feature #14313]
+ * String.new now accepts new option parameter `encoding'.
+ [Feature #11785]
-[Numeric]
+* Struct
+ * Struct#dig [Feature #11688]
- [Incompatible changes]
+* Thread
+ * Thread#name, Thread#name= are added to handle thread names [Feature #11251]
- * Numeric#step now returns an instance of the Enumerator::ArithmeticSequence
- class rather than one of the Enumerator class.
+=== Core classes compatibility issues (excluding feature bug fixes)
-[OpenStruct]
+* Array
+ * Array#select!, Array#keep_if, Array#reject!, and Array#delete_if
+ no longer changes the receiver array instantly every time the
+ block is called. [Feature #10714]
- [Modified methods]
+ * Array#flatten and Array#flatten! no longer try to call #to_ary
+ method on elements beyond the given level. [Bug #10748]
- * OpenStruct#to_h now accepts a block that maps keys and values to new keys and values. [Feature #15143]
+ * Array#inspect doesn't raise error even if its content returns
+ a string which is not compatible with Encoding.default_external
+ as inspected result. [Feature #11801]
-[Proc]
+* Enumerable
+ * Enumerable#chunk and Enumerable#slice_before no longer takes the
+ initial_state argument. [Feature #10958]
+ Use a local variable instead to maintain a state.
- [New methods]
+* File::Stat
+ * On Windows File::Stat#ino always returned 0, but now returns
+ BY_HANDLE_FILE_INFORMATION.nFileIndexHigh/Low. [Feature #11216]
- * Added Proc#<< and Proc#>> for Proc composition. [Feature #6284]
+* Hash
+ * Hash#inspect doesn't raise error even if its content returns
+ a string which is not compatible with Encoding.default_external
+ as inspected result. [Feature #11801]
- [Incompatible changes]
+* IO
+ * IO#close doesn't raise when the IO object is closed. [Feature #10718]
+ * IO#each_codepoint raises an exception at incomplete character
+ before EOF when conversion takes place. [Bug #11444]
- * Proc#call doesn't change <code>$SAFE</code> any more. [Feature #14250]
+* Module
+ * Module#define_method and Object.define_singleton_method now
+ require method body, Proc, Method, or a block, and raise
+ ArgumentError if no block is given directly. [Bug #11283]
-[Random]
+* pack/unpack (Array/String)
+ * j and J directives for pointer width integer type. [Feature #11215]
- [New methods]
-
- * Added Random.bytes. [Feature #4938]
-
-[Range]
-
- [New methods]
-
- * Added Range#% instance method. [Feature #14697]
-
- [Incompatible changes]
-
- * Range#=== now uses the +#cover?+ instead of the +#include?+ method. [Feature #14575]
- * Range#cover? now accepts a Range object. [Feature #14473]
- * Range#step now returns an instance of the Enumerator::ArithmeticSequence
- class rather than one of the Enumerator class.
-
-[Regexp/String]
-
- * Update Unicode version to 12.1.0, adding support for
- U+32FF SQUARE ERA NAME REIWA [Feature #15195]
-
- * Update Unicode version and Emoji version from 11.0.0 to
- 12.0.0. [Feature #15321]
-
- * Update Unicode version from 10.0.0 to 11.0.0. [Feature #14802]
-
- This includes a rewrite of the grapheme cluster (/\X/) algorithm
- and special-casing for Georgian MTAVRULI on String#downcase.
-
- * Update Emoji version from 5.0 to 11.0.0 [Feature #14802]
-
-[RubyVM::AbstractSyntaxTree]
-
- [New methods]
-
- * RubyVM::AbstractSyntaxTree.parse parses a given string and returns AST
- nodes. [experimental]
-
- * RubyVM::AbstractSyntaxTree.parse_file parses a given file and returns AST
- nodes. [experimental]
-
- * RubyVM::AbstractSyntaxTree.of returns AST nodes of the given proc or method.
- [experimental]
-
-[RubyVM]
-
- [New methods]
-
- * RubyVM.resolve_feature_path identifies the file that will be loaded by
- "require(feature)". [experimental] [Feature #15230]
-
-[String]
-
- * String#crypt is now deprecated. [Feature #14915]
-
- [New features]
-
- * String#split yields each substring to the block if given. [Feature #4780]
-
-[Struct]
-
- [Modified methods]
-
- * Struct#to_h now accepts a block that maps keys and values to new keys and values. [Feature #15143]
-
- [Aliased method]
-
- * Struct#filter is a new alias for Struct#select. [Feature #13784]
-
-[Time]
-
- [New features]
-
- * Time.new and Time#getlocal accept a timezone object as well as
- a UTC offset string. Time#+, Time#-, and Time#succ also preserve
- the timezone. [Feature #14850]
-
-[TracePoint]
-
- [New features]
-
- * "script_compiled" event is supported. [Feature #15287]
-
- [New methods]
-
- * TracePoint#parameters [Feature #14694]
-
- * TracePoint#instruction_sequence [Feature #15287]
-
- * TracePoint#eval_script [Feature #15287]
-
- [Modified methods]
-
- * TracePoint#enable accepts new keywords "target:" and "target_line:".
- [Feature #15289]
=== Stdlib updates (outstanding ones only)
-[BigDecimal]
-
- Update to version 1.4.0. This version includes several compatibility
- issues, see Compatibility issues section below for details.
-
- [Modified methods]
-
- * BigDecimal() accepts the new keyword "exception:" similar to Float().
+* Logger
+
+ * Logger#level= now supports symbol and string levels such as :debug, :info,
+ :warn, :error, :fatal (case insensitive) [Feature #11695]
+ * Logger#reopen is added to reopen a log device. [Feature #11696]
+
+* io/wait
+ * IO#wait_readable no longer checks FIONREAD, it may be used for
+ non-bytestream IO such as listen sockets.
+
+* Net::FTP
+ * Net::FTP#mlst is added.
+ * Net::FTP#mlsd is added.
+
+* nkf
+ * Merge nkf 2.1.4.
+
+* ObjectSpace (objspace)
+ * ObjectSpace.count_symbols is added.
+ * ObjectSpace.count_imemo_objects is added.
+ * ObjectSpace.internal_class_of is added.
+ * ObjectSpace.internal_super_of is added.
+
+* OpenSSL
+ * OpenSSL::SSL::SSLSocket#accept_nonblock and
+ OpenSSL::SSL::SSLSocket#connect_nonblock supports `exception: false`.
+ [Feature #10532]
+
+* Pathname
+ * Pathname#descend and Pathname#ascend supported blockless form.
+ [Feature #11052]
+
+* Socket
+ * Socket#connect_nonblock, Socket#accept_nonblock,
+ TCPServer#accept_nonblock, UNIXServer#accept_nonblock,
+ BasicSocket#recv_nonblock, BasicSocket#recvmsg_nonblock,
+ BasicSocket#sendmsg_nonblock all support `exception: false` to return
+ :wait_readable or :wait_writable symbols instead of raising
+ IO::WaitReadable or IO::WaitWritable exceptions
+ [Feature #10532] [Feature #11229]
+ * BasicSocket#recv and BasicSocket#recv_nonblock allow an output
+ String buffer argument like IO#read and IO#read_nonblock to reduce
+ GC overhead [Feature #11242]
+
+* StringIO
+ * In read-only mode, StringIO#set_encoding no longer sets the encoding
+ of its buffer string. Setting the encoding of the string directly
+ without StringIO#set_encoding may cause unpredictable behavior now.
+ [Bug #11827]
+
+* timeout
+ * Object#timeout is now warned as deprecated when called.
- [Note for the differences among recent versions]
-
- You should want to know the differences among recent versions of bigdecimal.
- Please select the suitable version of bigdecimal according to the following
- information.
-
- * 1.3.5 has BigDecimal.new without "exception:" keyword. You can see the
- deprecation warning of BigDecimal.new when you specify "-w" option.
- BigDecimal(), BigDecimal.new, and Object#to_d methods are the same.
-
- * 1.4.0 has BigDecimal.new with "exception:" keyword. You always see the
- deprecation warning of BigDecimal.new. Object#to_d method is different
- from BigDecimal() and BigDecimal.new.
-
- * 2.0.0 will be released soon after releasing Ruby 2.6.0. This version
- will not have the BigDecimal.new method.
-
-[Bundler]
-
- * Add Bundler to Standard Library. [Feature #12733]
-
- * Use 1.17.2, the latest stable version.
-
-[Coverage]
-
- A oneshot_lines mode is added. [Feature #15022]
-
- This mode checks "whether each line was executed at least once or not",
- instead of "how many times each line was executed".
- A hook for each line is fired at most once, and after it is fired
- the hook flag is removed, i.e., it runs with zero overhead.
-
- [New options]
-
- * Add +:oneshot_lines+ keyword argument to Coverage.start.
-
- * Add +:stop+ and +:clear+ keyword arguments to Coverage.result.
- If +clear+ is true, it clears the counters to zero.
- If +stop+ is true, it disables coverage measurement.
-
- [New methods]
-
- * Coverage.line_stub, which is a simple helper function that
- creates the "stub" of line coverage from a given source code.
-
-[CSV]
-
- * Upgrade to 3.0.2. This includes performance improvements especially
- for writing. Writing is about 2 times faster.
- See https://github.com/ruby/csv/blob/master/NEWS.md.
-
-[ERB]
-
- [New options]
-
- * Add +:trim_mode+ and +:eoutvar+ keyword arguments to ERB.new.
- Now non-keyword arguments other than the first one are softly deprecated
- and will be removed when Ruby 2.5 becomes EOL. [Feature #14256]
-
- * erb command's <tt>-S</tt> option is deprecated, and will be removed
- in the next version.
-
-[FileUtils]
-
- [New methods]
-
- * FileUtils#cp_lr. [Feature #4189]
-
-[Matrix]
-
- [New methods]
-
- * Matrix#antisymmetric?, Matrix#skew_symmetric?
-
- * Matrix#map!, Matrix#collect! [Feature #14151]
-
- * Matrix#[]=
-
- * Vector#map!, Vector#collect!
-
- * Vector#[]=
-
-[Net]
-
- [New options]
-
- * Add +:write_timeout+ keyword argument to Net::HTTP.new. [Feature #13396]
-
- [New methods]
-
- * Add Net::HTTP#write_timeout and Net::HTTP#write_timeout=. [Feature #13396]
-
- [New constant]
-
- * Add Net::HTTPClientException to deprecate Net::HTTPServerException,
- whose name is misleading. [Bug #14688]
-
- [Net::IMAP]
-
- * Add Server Name Indication (SNI) support. [Feature #15594]
-
-[NKF]
-
- * Upgrade to nkf v2.1.5
-
-[Psych]
-
- * Upgrade to Psych 3.1.0
-
-[RDoc]
-
- * Become about 2 times faster.
-
- * Use SOURCE_DATE_EPOCH to generate files.
-
- * Fix method line number that slipped off.
-
- * Enable <code>--width</code>, <code>--exclude</code>,
- and <code>--line-numbers</code> that were ignored.
-
- * Add support for blockquote by ">>>" in default markup notation.
-
- * Add support for "Raises" lines in TomDoc notation.
-
- * Fix syntax error output.
-
- * Fix many parsing bugs.
-
-[REXML]
-
- * Upgrade to REXML 3.1.9.
- See https://github.com/ruby/rexml/blob/master/NEWS.md.
-
- [Improved some XPath implementations]
-
- * <code>concat()</code> function: Stringify all arguments before concatenating.
-
- * <code>string()</code> function: Support context node.
-
- * <code>string()</code> function: Support processing instruction node.
-
- * Support <code>"*:#{ELEMENT_NAME}"</code> syntax in XPath 2.0.
-
- [Fixed some XPath implementations]
-
- * <code>"//#{ELEMENT_NAME}[#{POSITION}]"</code> case
-
- * <code>string()</code> function: Fix <code>function(document)</code>
- returns nodes that are out of root elements.
-
- * <code>"/ #{ELEMENT_NAME} "</code> case
-
- * <code>"/ #{ELEMENT_NAME} [ #{PREDICATE} ]"</code> case
-
- * <code>"/ #{AXIS}::#{ELEMENT_NAME}"</code> case
-
- * <code>"#{N}-#{M}"</code> case: One or more white spaces were required
- before <code>"-"</code>
-
- * <code>"/child::node()"</code> case
-
- * <code>"#{FUNCTION}()/#{PATH}"</code> case
-
- * <code>"@#{ATTRIBUTE}/parent::"</code> case
-
- * <code>"name(#{NODE_SET})"</code> case
-
-[CSV]
-
- * Upgrade to 3.0.9.
- See https://github.com/ruby/csv/blob/master/NEWS.md.
-
-[Date]
-
- * Date.jisx0301, Date#jisx0301, and Date.parse provisionally support the
- new Japanese era as an informal extension, until the new JIS X 0301 is
- issued. [Feature #15742]
-
-[RSS]
-
- [New options]
-
- * RSS::Parser.parse now accepts options as Hash. +:validate+ ,
- +:ignore_unknown_element+ , +:parser_class+ options are available.
+=== Stdlib compatibility issues (excluding feature bug fixes)
-[RubyGems]
+* ext/coverage/coverage.c
+ * Coverage.peek_result: new method to allow coverage to be captured without
+ stopping the coverage tool. [Feature #10816]
- * Upgrade to RubyGems 3.0.1
+* Fiddle
+ * Fiddle::Function#call releases the GVL. [Feature #11607]
- * https://blog.rubygems.org/2018/12/19/3.0.0-released.html
+* io-console
+ * Update to io-console 0.4.5, and change the license to BSD 2-clause
+ "Simplified" License.
- * https://blog.rubygems.org/2018/12/23/3.0.1-released.html
+* lib/base64.rb
+ * Base64.urlsafe_encode64: added a "padding" option to suppress
+ the padding character ("="). [Feature #10740]
+ * Base64.urlsafe_decode64: now it accepts not only correctly-padded
+ input but also unpadded input. [Feature #10740]
-[Set]
+* lib/drb/drb.rb
+ * removed unused argument. https://github.com/ruby/ruby/pull/515
- [Aliased methods]
+* lib/matrix.rb
+ * Add Vector#round. https://github.com/ruby/ruby/pull/802
- * Set#filter! is a new alias for Set#select!. [Feature #13784]
+* lib/webrick/utils.rb
+ * removed unused argument. https://github.com/ruby/ruby/pull/356
-[URI]
+* Net::FTP
+ * Connections are in passive mode per default now. The default mode can
+ be changed by Net::FTP.default_passive=. [Feature #11612]
- [New constant]
+* Net::HTTP
+ * default value of Net::HTTP#open_timeout is now 60 (was nil).
- * Add URI::File to handle the file URI scheme. [Feature #14035]
+* Net::Telnet
+ * Net::Telnet is extracted to net-telnet gem. It's unmaintain code.
+ [Feature #11083]
-=== Compatibility issues (excluding feature bug fixes)
+* Psych
+ * Updated to Psych 2.0.17
-[Dir]
+* Rake
+ * Rake is removed from stdlib. [Feature #11025]
- * Dir.glob with <code>'\0'</code>-separated pattern list will be deprecated,
- and is now warned. [Feature #14643]
+* RDoc
+ * Updated to RDoc 4.2.1. For full release notes see:
-[File]
+ https://github.com/rdoc/rdoc/blob/master/History.rdoc#421--2015-12-22
- * File.read, File.binread, File.write, File.binwrite, File.foreach, and
- File.readlines do not invoke external commands even if the path starts
- with the pipe character <code>'|'</code>. [Feature #14245]
+* RubyGems
+ * Updated to RubyGems 2.5.1. For full release notes see:
-[Object]
+ http://docs.seattlerb.org/rubygems/History_txt.html#label-2.5.0+-2F+2015-11-03
+ and
+ http://docs.seattlerb.org/rubygems/History_txt.html#label-2.5.1+-2F+2015-12-10
- * Object#=~ is deprecated. [Feature #15231]
+=== Built-in global variables compatibility issues
-=== Stdlib compatibility issues (excluding feature bug fixes)
+* $SAFE
+ * $SAFE=2 and $SAFE=3 are obsolete. If $SAFE is set to 2 or larger,
+ an ArgumentError is raised. [Feature #5455]
-* These standard libraries have been promoted to default gems.
-
- * e2mmap
- * forwardable
- * irb
- * logger
- * matrix
- * mutex_m
- * ostruct
- * prime
- * rexml
- * rss
- * shell
- * sync
- * thwait
- * tracer
+=== C API updates
-[BigDecimal]
+* rb_define_class_id_under() now raises a TypeError exception when the
+ class is already defined but its superclass does not match the given
+ superclass, as well as definitions in ruby level.
- * The following methods are removed.
+* rb_timespec_now() is added to fetch current datetime as struct timespec.
+ [Feature #11558]
- * BigDecimal.allocate
- * BigDecimal.ver
+* rb_time_timespec_new() is added to create a time object with epoch,
+ nanosecond, and UTC/localtime/time offset arguments. [Feature #11558]
- * Every BigDecimal object is frozen. [Feature #13984]
+* rb_autoload() deprecated, use rb_funcall() instead. [Feature #11664]
- * BigDecimal() parses the given string similar to Float().
+* rb_compile_error_with_enc(), rb_compile_error(), and rb_compile_bug()
+ deprecated. these functions are exposed but only for internal use.
+ external libraries should not use them.
- * String#to_d parses the receiver string similar to String#to_f.
+=== Supported platform changes
- * BigDecimal.new will be removed in version 2.0.
+* OS/2 is no longer supported
-[Pathname]
+* BeOS is no longer supported
- * Pathname#read, Pathname#binread, Pathname#write, Pathname#binwrite,
- Pathname#each_line and Pathname#readlines do not invoke external
- commands even if the path starts with the pipe character <code>'|'</code>.
- This follows [Feature #14245].
+* Borland-C is no longer supported
-=== C API updates
+* Haiku now stable and best effort
=== Implementation improvements
-* Speedup Proc#call because we don't need to care about <code>$SAFE</code>
- any more. [Feature #14318]
-
- With +lc_fizzbuzz+ benchmark which uses Proc#call many times we can
- measure x1.4 improvements. [Bug #10212]
-
-* Speedup block.call where +block+ is passed block parameter. [Feature #14330]
-
- Ruby 2.5 improves block passing performance. [Feature #14045]
-
- Additionally, Ruby 2.6 improves the performance of passed block calling.
+* Optimize Proc#call to eliminate method frame construction.
+ [Feature #11569]
-* Introduce an initial implementation of a JIT (Just-in-time) compiler. [Feature #14235] [experimental]
+* Reconsidering method entry data structure.
+ [Bug #11278]
- * <tt>--jit</tt> command line option is added to enable JIT. <tt>--jit-verbose=1</tt>
- is good for inspection. See <tt>ruby --help</tt> for others.
- * To generate machine code, this JIT compiler uses the C compiler used for building
- the interpreter. Currently GCC, Clang, and Microsoft Visual C++ are supported for it.
- * <tt>--disable-mjit-support</tt> option is added to configure. This is added for JIT debugging,
- but if you get an error on building a header file for JIT, you can use this option to skip
- building it as a workaround.
- * rb_waitpid reimplemented on Unix-like platforms to maintain
- compatibility with processes created for JIT [Bug #14867]
+* Introducing new table data structure for ID keys tables used by
+ method table and so on. New table structure is simple and fast
+ than st_table. [Feature #11420]
-* VM generator script renewal; makes the generated VM more optimized. [GH-1779]
+* Machine code level tuning for object allocation and method calling
+ code. r52099, r52254
-* Thread cache enabled for pthreads platforms (for Thread.new and
- Thread.start). [Feature #14757]
+* RubyVM::InstructionSequence is extended for future improvement.
+ [Feature #11788]
-* timer thread is eliminated for platforms with POSIX timers. [Misc #14937]
+* Case dispatch is now optimized for all special constant literals
+ including nil, true, and false. Previously, only literal strings,
+ symbols, integers and floats compiled to optimized case dispatch.
+ [Feature #11769]
-* Transient Heap (theap) is supported. [Bug #14858] [Feature #14989]
+* Instance variables on non-pure Ruby classes (T_DATA, T_FILE,
+ etc..) is less expensive to store than before. [Feature #11170]
- theap is a managed heap for short-living memory objects. For example,
- making a small and short-living Hash object is x2 faster. With rdoc benchmark,
- we measured 6-7% performance improvement.
+* All accesses to members of big Struct objects are performed in
+ constant-time. Previously, Struct elements beyond the first 10
+ 10 elements used a linear scan. [Feature #10585]
-* Native implementations (arm32, arm64, ppc64le, win32, win64, x86, amd64) of
- coroutines to improve performance of Fiber significantly. [Feature #14739]
+* The Set class got several speed up.
+ [Misc #10754], [r52591]
-=== Miscellaneous changes
+* Socket and I/O-related improvements
-* On macOS, shared libraries no longer include a full version number of Ruby
- in their names. This eliminates the burden of each teeny upgrade on the
- platform that users need to rebuild every extension library.
+ * Calling overhead of most of new keyword-using I/O methods in
+ [Feature #11229] is reduced by avoiding the inefficient C API
+ to parse keywords. [Feature #11339]
- [Before]
- * libruby.2.6.0.dylib
- * libruby.2.6.dylib -> libruby.2.6.0.dylib
- * libruby.dylib -> libruby.2.6.0.dylib
+ * The standard library is updated to use the improved
+ exception-free non-blocking I/O from [Feature #11229].
+ This has the additional benefit of quieter $DEBUG output in
+ addition to reducing expensive exceptions. [Feature #11044]
- [After]
- * libruby.2.6.dylib
- * libruby.dylib -> libruby.2.6.dylib
+ * (Linux-only) waiting on a single FD anywhere in the stdlib no longer
+ uses select(2), making it immune to slowdowns with high-numbered FDs.
+ [Feature #11081] [Feature #11377]
-* Extracted misc/*.el files to https://github.com/ruby/elisp
+* CGI.escapeHTML is optimized with C extention.
+ https://github.com/ruby/ruby/pull/1164
diff --git a/README.ja.md b/README.ja.md
index 3ecdc9d7d3..eee54a9171 100644
--- a/README.ja.md
+++ b/README.ja.md
@@ -1,7 +1,3 @@
-[![Build Status](https://travis-ci.org/ruby/ruby.svg?branch=trunk)](https://travis-ci.org/ruby/ruby)
-[![Build status](https://ci.appveyor.com/api/projects/status/0sy8rrxut4o0k960/branch/trunk?svg=true)](https://ci.appveyor.com/project/ruby/ruby/branch/trunk)
-[![wercker status](https://app.wercker.com/status/e5e7e1704f62b76525022aa424aef6ef/s/trunk "wercker status")](https://app.wercker.com/project/byKey/e5e7e1704f62b76525022aa424aef6ef)
-
# Rubyとは
Rubyはシンプルかつ強力なオブジェクト指向スクリプト言語です. Rubyは純粋なオブジェクト指向言語として設計されているので,
@@ -20,40 +16,40 @@ Rubyはテキスト処理関係の能力などに優れ,Perlと同じくらい
* イテレータとクロージャ
* ガーベージコレクタ
* ダイナミックローディング (アーキテクチャによる)
-* 移植性が高い.多くのUnix-like/POSIX互換プラットフォーム上で動くだけでなく,Windows, macOS,
- Haikuなどの上でも動く cf.
- https://github.com/ruby/ruby/blob/trunk/doc/contributing.rdoc#platform-maintainers
+* 移植性が高い.多くのUnix-like/POSIX互換プラットフォーム上で動くだけでなく,Windows, Mac OS
+ X,BeOSなどの上でも動く cf.
+ http://bugs.ruby-lang.org/projects/ruby-trunk/wiki/SupportedPlatformsJa
## 入手法
-サードパーティーツールを使った方法を含むRubyのインストール方法の一覧は
+### FTPで
-https://www.ruby-lang.org/ja/downloads/
+以下の場所においてあります.
-を参照してください.
+ftp://ftp.ruby-lang.org/pub/ruby/
### Subversionで
開発先端のソースコードは次のコマンドで取得できます.
- $ svn co https://svn.ruby-lang.org/repos/ruby/trunk/ ruby
+ $ svn co http://svn.ruby-lang.org/repos/ruby/trunk/ ruby
他に開発中のブランチの一覧は次のコマンドで見られます.
- $ svn ls https://svn.ruby-lang.org/repos/ruby/branches/
+ $ svn ls http://svn.ruby-lang.org/repos/ruby/branches/
### Gitで
SubversionのミラーをGitHubに公開しています. 以下のコマンドでリポジトリを取得できます.
- $ git clone https://github.com/ruby/ruby.git
+ $ git clone git://github.com/ruby/ruby.git
## ホームページ
RubyのホームページのURLは
-https://www.ruby-lang.org/
+http://www.ruby-lang.org/
です.
@@ -82,7 +78,7 @@ Ruby拡張モジュールについて話し合うruby-extメーリングリス
以下の手順で行ってください.
-1. もし `configure` ファイルが見つからない,もしくは `configure.ac` より古いようなら, `autoconf` を実行して
+1. もし `configure` ファイルが見つからない,もしくは `configure.in` より古いようなら, `autoconf` を実行して
新しく `configure` を生成する
2. `configure` を実行して `Makefile` などを生成する
@@ -155,14 +151,14 @@ UNIXであれば `configure` がほとんどの差異を吸収してくれるは
## 配布条件
-[COPYING.ja](COPYING.ja) ファイルを参照してください.
+`COPYING.ja` ファイルを参照してください.
## フィードバック
Rubyに関する質問は Ruby-Talk(英語)や Ruby-List(日本語) (https://www.ruby-lang.org/ja/community/mailing-lists) や,
-stackoverflow (https://ja.stackoverflow.com/) などのWebサイトに投稿してください.
+stackoverflow (http://ja.stackoverflow.com/) などのWebサイトに投稿してください.
-バグ報告は https://bugs.ruby-lang.org で受け付けています.
+バグ報告は http://bugs.ruby-lang.org で受け付けています.
## 著者
diff --git a/README.md b/README.md
index 1e76fda4f0..14fb7aa213 100644
--- a/README.md
+++ b/README.md
@@ -1,27 +1,23 @@
-[![Build Status](https://travis-ci.org/ruby/ruby.svg?branch=trunk)](https://travis-ci.org/ruby/ruby)
-[![Build status](https://ci.appveyor.com/api/projects/status/0sy8rrxut4o0k960/branch/trunk?svg=true)](https://ci.appveyor.com/project/ruby/ruby/branch/trunk)
-[![wercker status](https://app.wercker.com/status/e5e7e1704f62b76525022aa424aef6ef/s/trunk "wercker status")](https://app.wercker.com/project/byKey/e5e7e1704f62b76525022aa424aef6ef)
-
# What's Ruby
Ruby is the interpreted scripting language for quick and easy object-oriented
-programming. It has many features to process text files and to do system
-management tasks (as in Perl). It is simple, straight-forward, and
+programming. It has many features to process text files and to do system
+management tasks (as in Perl). It is simple, straight-forward, and
extensible.
## Features of Ruby
* Simple Syntax
* **Normal** Object-oriented Features (e.g. class, method calls)
-* **Advanced** Object-oriented Features (e.g. mix-in, singleton-method)
+* **Advanced** Object-oriented Features (e.g. Mix-in, Singleton-method)
* Operator Overloading
* Exception Handling
* Iterators and Closures
* Garbage Collection
* Dynamic Loading of Object Files (on some architectures)
* Highly Portable (works on many Unix-like/POSIX compatible platforms as
- well as Windows, macOS, Haiku, etc.) cf.
- https://github.com/ruby/ruby/blob/trunk/doc/contributing.rdoc#platform-maintainers
+ well as Windows, Mac OS X, BeOS, etc.) cf.
+ http://bugs.ruby-lang.org/projects/ruby-trunk/wiki/SupportedPlatforms
## How to get Ruby
@@ -29,56 +25,60 @@ extensible.
For a complete list of ways to install Ruby, including using third-party tools
like rvm, see:
-https://www.ruby-lang.org/en/downloads/
+http://www.ruby-lang.org/en/downloads/
+
+The Ruby distribution files can be found on the following FTP site:
+
+ftp://ftp.ruby-lang.org/pub/ruby/
The trunk of the Ruby source tree can be checked out with the following
command:
- $ svn co https://svn.ruby-lang.org/repos/ruby/trunk/ ruby
+ $ svn co http://svn.ruby-lang.org/repos/ruby/trunk/ ruby
Or if you are using git then use the following command:
- $ git clone https://github.com/ruby/ruby.git
+ $ git clone git://github.com/ruby/ruby.git
-There are some other branches under development. Try the following command
+There are some other branches under development. Try the following command
to see the list of branches:
- $ svn ls https://svn.ruby-lang.org/repos/ruby/branches/
+ $ svn ls http://svn.ruby-lang.org/repos/ruby/branches/
Or if you are using git then use the following command:
- $ git ls-remote https://github.com/ruby/ruby.git
+ $ git ls-remote git://github.com/ruby/ruby.git
## Ruby home page
The URL of the Ruby home page is:
-https://www.ruby-lang.org/
+http://www.ruby-lang.org/
## Mailing list
-There is a mailing list to talk about Ruby. To subscribe to this list, please
+There is a mailing list to talk about Ruby. To subscribe this list, please
send the following phrase:
subscribe
in the mail body (not subject) to the address
-<ruby-talk-request@ruby-lang.org>.
+<mailto:ruby-talk-request@ruby-lang.org>.
## How to compile and install
This is what you need to do to compile and install Ruby:
-1. If you want to use Microsoft Visual C++ to compile Ruby, read
- [win32/README.win32](win32/README.win32) instead of this document.
+1. If you want to use Microsoft Visual C++ to compile ruby, read
+ win32/README.win32 instead of this document.
-2. If `./configure` does not exist or is older than `configure.ac`, run
+2. If `./configure` does not exist or is older than configure.in, run
`autoconf` to (re)generate configure.
3. Run `./configure`, which will generate `config.h` and `Makefile`.
Some C compiler flags may be added by default depending on your
- environment. Specify `optflags=..` and `warnflags=..` as necessary to
+ environment. Specify `optflags=..` and `warnflags=..` as necessary to
override them.
4. Edit `defines.h` if you need. Usually this step will not be needed.
@@ -94,21 +94,13 @@ This is what you need to do to compile and install Ruby:
6. Run `make`.
- * On Mac, set RUBY\_CODESIGN environment variable with a signing identity.
- It uses the identity to sign `ruby` binary. See also codesign(1).
-
7. Optionally, run '`make check`' to check whether the compiled Ruby
interpreter works well. If you see the message "`check succeeded`", your
- Ruby works as it should (hopefully).
-
-8. Optionally, run `make update-gems` and `make extract-gems`.
-
- If you want to install bundled gems, run `make update-gems` and
- `make extract-gems` before running `make install`.
+ ruby works as it should (hopefully).
-9. Run '`make install`'.
+8. Run '`make install`'
- This command will create the following directories and install files into
+ This command will create following directories and install files onto
them.
* `${DESTDIR}${prefix}/bin`
@@ -135,10 +127,10 @@ This is what you need to do to compile and install Ruby:
**NOTE**: teeny of the API version may be different from one of Ruby's
program version
- You may have to be a super user to install Ruby.
+ You may have to be a super user to install ruby.
-If you fail to compile Ruby, please send the detailed error report with the
+If you fail to compile ruby, please send the detailed error report with the
error log and machine/OS type, to help others.
Some extension libraries may not get compiled because of lack of necessary
@@ -147,21 +139,21 @@ to remove old configuration after installing them in such case.
## Copying
-See the file [COPYING](COPYING).
+See the file `COPYING`.
## Feedback
Questions about the Ruby language can be asked on the Ruby-Talk mailing list
-(https://www.ruby-lang.org/en/community/mailing-lists) or on websites like
-(https://stackoverflow.com).
+(http://www.ruby-lang.org/en/community/mailing-lists) or on websites like
+(http://stackoverflow.com).
-Bug reports should be filed at https://bugs.ruby-lang.org. Read [HowToReport] for more information.
+Bug reports should be filed at http://bugs.ruby-lang.org. Read [HowToReport] for more information.
[HowToReport]: https://bugs.ruby-lang.org/projects/ruby/wiki/HowToReport
-## Contributing
+##Contributing
-See the file [CONTRIBUTING.md](CONTRIBUTING.md)
+See the file `CONTRIBUTING.md`
## The Author
@@ -169,4 +161,4 @@ See the file [CONTRIBUTING.md](CONTRIBUTING.md)
Ruby was originally designed and developed by Yukihiro Matsumoto (Matz) in
1995.
-<matz@ruby-lang.org>
+<mailto:matz@ruby-lang.org>
diff --git a/aclocal.m4 b/aclocal.m4
index b0fe3eb959..30fccd52fe 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -1,46 +1,46 @@
-# generated automatically by aclocal 1.16.1 -*- Autoconf -*-
+# -*- autoconf -*-
-# Copyright (C) 1996-2018 Free Software Foundation, Inc.
+AC_DEFUN([_COLORIZE_RESULT_PREPARE], [
+ msg_checking= msg_result_yes= msg_result_no= msg_result_other= msg_reset=
+ AS_IF([test "x${CONFIGURE_TTY}" = xyes -o -t 1], [
+ msg_begin="`tput smso 2>/dev/null`"
+ AS_CASE(["$msg_begin"], ['@<:@'*m],
+ [msg_begin="`echo "$msg_begin" | sed ['s/[0-9]*m$//']`"
+ msg_checking="${msg_begin}33m"
+ AS_IF([test ${TEST_COLORS:+set}], [
+ msg_result_yes=[`expr ":$TEST_COLORS:" : ".*:pass=\([^:]*\):"`]
+ msg_result_no=[`expr ":$TEST_COLORS:" : ".*:fail=\([^:]*\):"`]
+ msg_result_other=[`expr ":$TEST_COLORS:" : ".*:skip=\([^:]*\):"`]
+ ])
+ msg_result_yes="${msg_begin}${msg_result_yes:-32;1}m"
+ msg_result_no="${msg_begin}${msg_result_no:-31;1}m"
+ msg_result_other="${msg_begin}${msg_result_other:-33;1}m"
+ msg_reset="${msg_begin}m"
+ ])
+ AS_UNSET(msg_begin)
+ ])
+ AS_REQUIRE_SHELL_FN([colorize_result],
+ [AS_FUNCTION_DESCRIBE([colorize_result], [MSG], [Colorize result])],
+ [AS_CASE(["$[]1"],
+ [yes], [AS_ECHO(["${msg_result_yes}$[]1${msg_reset}]")],
+ [no], [AS_ECHO(["${msg_result_no}$[]1${msg_reset}]")],
+ [AS_ECHO(["${msg_result_other}$[]1${msg_reset}]")])])
+])
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
+AC_DEFUN([COLORIZE_RESULT], [AC_REQUIRE([_COLORIZE_RESULT_PREPARE])dnl
+ AS_LITERAL_IF([$1],
+ [m4_case([$1],
+ [yes], [AS_ECHO(["${msg_result_yes}$1${msg_reset}"])],
+ [no], [AS_ECHO(["${msg_result_no}$1${msg_reset}"])],
+ [AS_ECHO(["${msg_result_other}$1${msg_reset}"])])],
+ [colorize_result "$1"]) dnl
+])
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
+AC_DEFUN([AC_CHECKING],[dnl
+AC_REQUIRE([_COLORIZE_RESULT_PREPARE])dnl
+AS_MESSAGE([checking ${msg_checking}$1${msg_reset}...])])
-m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])
-m4_include([tool/m4/_colorize_result_prepare.m4])
-m4_include([tool/m4/ac_msg_result.m4])
-m4_include([tool/m4/colorize_result.m4])
-m4_include([tool/m4/ruby_append_option.m4])
-m4_include([tool/m4/ruby_append_options.m4])
-m4_include([tool/m4/ruby_check_builtin_func.m4])
-m4_include([tool/m4/ruby_check_builtin_setjmp.m4])
-m4_include([tool/m4/ruby_check_printf_prefix.m4])
-m4_include([tool/m4/ruby_check_setjmp.m4])
-m4_include([tool/m4/ruby_check_signedness.m4])
-m4_include([tool/m4/ruby_check_sizeof.m4])
-m4_include([tool/m4/ruby_check_sysconf.m4])
-m4_include([tool/m4/ruby_cppoutfile.m4])
-m4_include([tool/m4/ruby_decl_attribute.m4])
-m4_include([tool/m4/ruby_default_arch.m4])
-m4_include([tool/m4/ruby_define_if.m4])
-m4_include([tool/m4/ruby_defint.m4])
-m4_include([tool/m4/ruby_dtrace_available.m4])
-m4_include([tool/m4/ruby_dtrace_postprocess.m4])
-m4_include([tool/m4/ruby_func_attribute.m4])
-m4_include([tool/m4/ruby_mingw32.m4])
-m4_include([tool/m4/ruby_prepend_option.m4])
-m4_include([tool/m4/ruby_prog_gnu_ld.m4])
-m4_include([tool/m4/ruby_replace_type.m4])
-m4_include([tool/m4/ruby_rm_recursive.m4])
-m4_include([tool/m4/ruby_setjmp_type.m4])
-m4_include([tool/m4/ruby_stack_grow_direction.m4])
-m4_include([tool/m4/ruby_try_cflags.m4])
-m4_include([tool/m4/ruby_try_ldflags.m4])
-m4_include([tool/m4/ruby_type_attribute.m4])
-m4_include([tool/m4/ruby_universal_arch.m4])
-m4_include([tool/m4/ruby_werror_flag.m4])
+AC_DEFUN([AC_MSG_RESULT], [dnl
+{ _AS_ECHO_LOG([result: $1])
+COLORIZE_RESULT([$1]); dnl
+}])
diff --git a/addr2line.c b/addr2line.c
index b2c31b39ad..c8faf48d62 100644
--- a/addr2line.c
+++ b/addr2line.c
@@ -8,28 +8,14 @@
**********************************************************************/
-#if defined(__clang__)
-#pragma clang diagnostic ignored "-Wpedantic"
-#pragma clang diagnostic ignored "-Wgcc-compat"
-#elif defined(__GNUC__)
-#pragma GCC diagnostic ignored "-Wpedantic"
-#endif
-
#include "ruby/config.h"
-#include "ruby/defines.h"
#include "ruby/missing.h"
#include "addr2line.h"
#include <stdio.h>
#include <errno.h>
-#ifdef HAVE_STDBOOL_H
-#include <stdbool.h>
-#else
-#include "missing/stdbool.h"
-#endif
-
-#if defined(USE_ELF) || defined(HAVE_MACH_O_LOADER_H)
+#ifdef USE_ELF
#include <fcntl.h>
#include <limits.h>
@@ -42,11 +28,19 @@
#include <sys/stat.h>
#include <unistd.h>
+#ifdef __OpenBSD__
+#include <elf_abi.h>
+#else
+#include <elf.h>
+#endif
+
/* Make alloca work the best possible way. */
#ifdef __GNUC__
-# ifndef alloca
-# define alloca __builtin_alloca
-# endif
+# ifndef atarist
+# ifndef alloca
+# define alloca __builtin_alloca
+# endif
+# endif /* atarist */
#else
# ifdef HAVE_ALLOCA_H
# include <alloca.h>
@@ -65,20 +59,24 @@ void *alloca();
# include <dlfcn.h>
#endif
-#ifdef HAVE_MACH_O_LOADER_H
-# include <mach-o/fat.h>
-# include <mach-o/ldsyms.h>
-# include <mach-o/loader.h>
-# include <mach-o/nlist.h>
-# include <mach-o/stab.h>
-#endif
+#define DW_LNS_copy 0x01
+#define DW_LNS_advance_pc 0x02
+#define DW_LNS_advance_line 0x03
+#define DW_LNS_set_file 0x04
+#define DW_LNS_set_column 0x05
+#define DW_LNS_negate_stmt 0x06
+#define DW_LNS_set_basic_block 0x07
+#define DW_LNS_const_add_pc 0x08
+#define DW_LNS_fixed_advance_pc 0x09
+#define DW_LNS_set_prologue_end 0x0a /* DWARF3 */
+#define DW_LNS_set_epilogue_begin 0x0b /* DWARF3 */
+#define DW_LNS_set_isa 0x0c /* DWARF3 */
-#ifdef USE_ELF
-# ifdef __OpenBSD__
-# include <elf_abi.h>
-# else
-# include <elf.h>
-# endif
+/* Line number extended opcode name. */
+#define DW_LNE_end_sequence 0x01
+#define DW_LNE_set_address 0x02
+#define DW_LNE_define_file 0x03
+#define DW_LNE_set_discriminator 0x04 /* DWARF4 */
#ifndef ElfW
# if SIZEOF_VOIDP == 8
@@ -94,44 +92,13 @@ void *alloca();
# define ELF_ST_TYPE ELF32_ST_TYPE
# endif
#endif
-#endif
-
-#ifdef SHF_COMPRESSED
-# if defined(ELFCOMPRESS_ZLIB) && defined(HAVE_LIBZ)
- /* FreeBSD 11.0 lacks ELFCOMPRESS_ZLIB */
-# include <zlib.h>
-# define SUPPORT_COMPRESSED_DEBUG_LINE
-# endif
-#else /* compatibility with glibc < 2.22 */
-# define SHF_COMPRESSED 0
-#endif
-
#ifndef PATH_MAX
#define PATH_MAX 4096
#endif
-#define DW_LNS_copy 0x01
-#define DW_LNS_advance_pc 0x02
-#define DW_LNS_advance_line 0x03
-#define DW_LNS_set_file 0x04
-#define DW_LNS_set_column 0x05
-#define DW_LNS_negate_stmt 0x06
-#define DW_LNS_set_basic_block 0x07
-#define DW_LNS_const_add_pc 0x08
-#define DW_LNS_fixed_advance_pc 0x09
-#define DW_LNS_set_prologue_end 0x0a /* DWARF3 */
-#define DW_LNS_set_epilogue_begin 0x0b /* DWARF3 */
-#define DW_LNS_set_isa 0x0c /* DWARF3 */
-
-/* Line number extended opcode name. */
-#define DW_LNE_end_sequence 0x01
-#define DW_LNE_set_address 0x02
-#define DW_LNE_define_file 0x03
-#define DW_LNE_set_discriminator 0x04 /* DWARF4 */
-
-PRINTF_ARGS(static int kprintf(const char *fmt, ...), 1, 2);
+int kprintf(const char *fmt, ...);
-typedef struct line_info {
+typedef struct {
const char *dirname;
const char *filename;
const char *path; /* object path */
@@ -140,52 +107,15 @@ typedef struct line_info {
uintptr_t base_addr;
uintptr_t saddr;
const char *sname; /* function name */
-
- struct line_info *next;
} line_info_t;
-
-struct dwarf_section {
- char *ptr;
- size_t size;
- uint64_t flags;
-};
-
-typedef struct obj_info {
+typedef struct obj_info obj_info_t;
+struct obj_info {
const char *path; /* object path */
- char *mapped;
+ int fd;
+ void *mapped;
size_t mapped_size;
- void *uncompressed;
uintptr_t base_addr;
- uintptr_t vmaddr;
- struct dwarf_section debug_abbrev;
- struct dwarf_section debug_info;
- struct dwarf_section debug_line;
- struct dwarf_section debug_ranges;
- struct dwarf_section debug_str;
- struct obj_info *next;
-} obj_info_t;
-
-#define DWARF_SECTION_COUNT 5
-
-static struct dwarf_section *
-obj_dwarf_section_at(obj_info_t *obj, int n)
-{
- struct dwarf_section *ary[] = {
- &obj->debug_abbrev,
- &obj->debug_info,
- &obj->debug_line,
- &obj->debug_ranges,
- &obj->debug_str
- };
- if (n < 0 || DWARF_SECTION_COUNT <= n) {
- abort();
- }
- return ary[n];
-}
-
-struct debug_section_definition {
- const char *name;
- struct dwarf_section *dwarf;
+ obj_info_t *next;
};
/* Avoid consuming stack as this module may be used from signal handler */
@@ -249,7 +179,8 @@ get_nth_dirname(unsigned long dir, char *p)
}
static void
-fill_filename(int file, char *include_directories, char *filenames, line_info_t *line, obj_info_t *obj)
+fill_filename(int file, char *include_directories, char *filenames,
+ line_info_t *line)
{
int i;
char *p = filenames;
@@ -259,8 +190,8 @@ fill_filename(int file, char *include_directories, char *filenames, line_info_t
filename = p;
if (!*p) {
/* Need to output binary file name? */
- kprintf("Unexpected file number %d in %s at %tx\n",
- file, binary_filename, filenames - obj->mapped);
+ kprintf("Unexpected file number %d in %s\n",
+ file, binary_filename);
return;
}
while (*p) p++;
@@ -284,128 +215,100 @@ fill_line(int num_traces, void **traces, uintptr_t addr, int file, int line,
obj_info_t *obj, line_info_t *lines, int offset)
{
int i;
- addr += obj->base_addr - obj->vmaddr;
+ addr += obj->base_addr;
for (i = offset; i < num_traces; i++) {
uintptr_t a = (uintptr_t)traces[i];
/* We assume one line code doesn't result >100 bytes of native code.
We may want more reliable way eventually... */
if (addr < a && a < addr + 100) {
- fill_filename(file, include_directories, filenames, &lines[i], obj);
+ fill_filename(file, include_directories, filenames, &lines[i]);
lines[i].line = line;
}
}
}
-struct LineNumberProgramHeader {
- uint64_t unit_length;
- uint16_t version;
- uint8_t format; /* 4 or 8 */
- uint64_t header_length;
- uint8_t minimum_instruction_length;
- uint8_t maximum_operations_per_instruction;
- uint8_t default_is_stmt;
- int8_t line_base;
- uint8_t line_range;
- uint8_t opcode_base;
- /* uint8_t standard_opcode_lengths[opcode_base-1]; */
- const char *include_directories;
- const char *filenames;
- const char *cu_start;
- const char *cu_end;
-};
-
-static int
-parse_debug_line_header(const char **pp, struct LineNumberProgramHeader *header)
+static void
+parse_debug_line_cu(int num_traces, void **traces, char **debug_line,
+ obj_info_t *obj, line_info_t *lines, int offset)
{
- const char *p = *pp;
- header->unit_length = *(uint32_t *)p;
- p += sizeof(uint32_t);
-
- header->format = 4;
- if (header->unit_length == 0xffffffff) {
- header->unit_length = *(uint64_t *)p;
- p += sizeof(uint64_t);
- header->format = 8;
+ char *p, *cu_end, *cu_start, *include_directories, *filenames;
+ unsigned long unit_length;
+ int default_is_stmt, line_base;
+ unsigned int header_length, minimum_instruction_length, line_range,
+ opcode_base;
+ /* unsigned char *standard_opcode_lengths; */
+
+ /* The registers. */
+ unsigned long addr = 0;
+ unsigned int file = 1;
+ unsigned int line = 1;
+ /* unsigned int column = 0; */
+ int is_stmt;
+ /* int basic_block = 0; */
+ /* int end_sequence = 0; */
+ /* int prologue_end = 0; */
+ /* int epilogue_begin = 0; */
+ /* unsigned int isa = 0; */
+
+ p = *debug_line;
+
+ unit_length = *(unsigned int *)p;
+ p += sizeof(unsigned int);
+ if (unit_length == 0xffffffff) {
+ unit_length = *(unsigned long *)p;
+ p += sizeof(unsigned long);
}
- header->cu_end = p + header->unit_length;
+ cu_end = p + unit_length;
- header->version = *(uint16_t *)p;
- p += sizeof(uint16_t);
- if (header->version > 4) return -1;
+ /*dwarf_version = *(unsigned short *)p;*/
+ p += 2;
- header->header_length = header->format == 4 ? *(uint32_t *)p : *(uint64_t *)p;
- p += header->format;
- header->cu_start = p + header->header_length;
+ header_length = *(unsigned int *)p;
+ p += sizeof(unsigned int);
- header->minimum_instruction_length = *(uint8_t *)p++;
+ cu_start = p + header_length;
- if (header->version >= 4) {
- /* maximum_operations_per_instruction = *(uint8_t *)p; */
- if (*p != 1) return -1; /* For non-VLIW architectures, this field is 1 */
- p++;
- }
+ minimum_instruction_length = *(unsigned char *)p;
+ p++;
- header->default_is_stmt = *(uint8_t *)p++;
- header->line_base = *(int8_t *)p++;
- header->line_range = *(uint8_t *)p++;
- header->opcode_base = *(uint8_t *)p++;
- /* header->standard_opcode_lengths = (uint8_t *)p - 1; */
- p += header->opcode_base - 1;
+ is_stmt = default_is_stmt = *(unsigned char *)p;
+ p++;
- header->include_directories = p;
+ line_base = *(signed char *)p;
+ p++;
- /* temporary measure for compress-debug-sections */
- if (p >= header->cu_end) return -1;
+ line_range = *(unsigned char *)p;
+ p++;
+
+ opcode_base = *(unsigned char *)p;
+ p++;
+
+ /* standard_opcode_lengths = (unsigned char *)p - 1; */
+ p += opcode_base - 1;
+
+ include_directories = p;
/* skip include directories */
while (*p) {
- p = memchr(p, '\0', header->cu_end - p);
- if (!p) return -1;
+ while (*p) p++;
p++;
}
p++;
- header->filenames = p;
+ filenames = p;
- *pp = header->cu_start;
-
- return 0;
-}
-
-static int
-parse_debug_line_cu(int num_traces, void **traces, char **debug_line,
- obj_info_t *obj, line_info_t *lines, int offset)
-{
- const char *p = (const char *)*debug_line;
- struct LineNumberProgramHeader header;
-
- /* The registers. */
- unsigned long addr = 0;
- unsigned int file = 1;
- unsigned int line = 1;
- /* unsigned int column = 0; */
- int is_stmt;
- /* int basic_block = 0; */
- /* int end_sequence = 0; */
- /* int prologue_end = 0; */
- /* int epilogue_begin = 0; */
- /* unsigned int isa = 0; */
-
- if (parse_debug_line_header(&p, &header))
- return -1;
- is_stmt = header.default_is_stmt;
+ p = cu_start;
#define FILL_LINE() \
do { \
fill_line(num_traces, traces, addr, file, line, \
- (char *)header.include_directories, \
- (char *)header.filenames, \
+ include_directories, filenames, \
obj, lines, offset); \
/*basic_block = prologue_end = epilogue_begin = 0;*/ \
} while (0)
- while (p < header.cu_end) {
+ while (p < cu_end) {
unsigned long a;
unsigned char op = *p++;
switch (op) {
@@ -413,19 +316,19 @@ parse_debug_line_cu(int num_traces, void **traces, char **debug_line,
FILL_LINE();
break;
case DW_LNS_advance_pc:
- a = uleb128((char **)&p);
+ a = uleb128(&p);
addr += a;
break;
case DW_LNS_advance_line: {
- long a = sleb128((char **)&p);
+ long a = sleb128(&p);
line += a;
break;
}
case DW_LNS_set_file:
- file = (unsigned int)uleb128((char **)&p);
+ file = (unsigned int)uleb128(&p);
break;
case DW_LNS_set_column:
- /*column = (unsigned int)*/(void)uleb128((char **)&p);
+ /*column = (unsigned int)*/(void)uleb128(&p);
break;
case DW_LNS_negate_stmt:
is_stmt = !is_stmt;
@@ -434,8 +337,8 @@ parse_debug_line_cu(int num_traces, void **traces, char **debug_line,
/*basic_block = 1; */
break;
case DW_LNS_const_add_pc:
- a = ((255 - header.opcode_base) / header.line_range) *
- header.minimum_instruction_length;
+ a = ((255 - opcode_base) / line_range) *
+ minimum_instruction_length;
addr += a;
break;
case DW_LNS_fixed_advance_pc:
@@ -449,7 +352,7 @@ parse_debug_line_cu(int num_traces, void **traces, char **debug_line,
/* epilogue_begin = 1; */
break;
case DW_LNS_set_isa:
- /* isa = (unsigned int)*/(void)uleb128((char **)&p);
+ /* isa = (unsigned int)*/(void)uleb128(&p);
break;
case 0:
a = *(unsigned char *)p++;
@@ -462,7 +365,7 @@ parse_debug_line_cu(int num_traces, void **traces, char **debug_line,
file = 1;
line = 1;
/* column = 0; */
- is_stmt = header.default_is_stmt;
+ is_stmt = default_is_stmt;
/* end_sequence = 0; */
/* isa = 0; */
break;
@@ -476,7 +379,7 @@ parse_debug_line_cu(int num_traces, void **traces, char **debug_line,
break;
case DW_LNE_set_discriminator:
/* TODO:currently ignore */
- uleb128((char **)&p);
+ uleb128(&p);
break;
default:
kprintf("Unknown extended opcode: %d in %s\n",
@@ -484,34 +387,33 @@ parse_debug_line_cu(int num_traces, void **traces, char **debug_line,
}
break;
default: {
- uint8_t adjusted_opcode = op - header.opcode_base;
- uint8_t operation_advance = adjusted_opcode / header.line_range;
- /* NOTE: this code doesn't support VLIW */
- addr += operation_advance * header.minimum_instruction_length;
- line += header.line_base + (adjusted_opcode % header.line_range);
+ unsigned long addr_incr;
+ unsigned long line_incr;
+ a = op - opcode_base;
+ addr_incr = (a / line_range) * minimum_instruction_length;
+ line_incr = line_base + (a % line_range);
+ addr += (unsigned int)addr_incr;
+ line += (unsigned int)line_incr;
FILL_LINE();
}
}
}
- *debug_line = (char *)p;
- return 0;
+ *debug_line = p;
}
-static int
+static void
parse_debug_line(int num_traces, void **traces,
char *debug_line, unsigned long size,
obj_info_t *obj, line_info_t *lines, int offset)
{
char *debug_line_end = debug_line + size;
while (debug_line < debug_line_end) {
- if (parse_debug_line_cu(num_traces, traces, &debug_line, obj, lines, offset))
- return -1;
+ parse_debug_line_cu(num_traces, traces, &debug_line, obj, lines, offset);
}
if (debug_line != debug_line_end) {
kprintf("Unexpected size of .debug_line in %s\n",
binary_filename);
}
- return 0;
}
/* read file and fill lines */
@@ -520,26 +422,22 @@ fill_lines(int num_traces, void **traces, int check_debuglink,
obj_info_t **objp, line_info_t *lines, int offset);
static void
-append_obj(obj_info_t **objp)
-{
+append_obj(obj_info_t **objp) {
obj_info_t *newobj = calloc(1, sizeof(obj_info_t));
if (*objp) (*objp)->next = newobj;
*objp = newobj;
}
-#ifdef USE_ELF
static void
-follow_debuglink(const char *debuglink, int num_traces, void **traces,
+follow_debuglink(char *debuglink, int num_traces, void **traces,
obj_info_t **objp, line_info_t *lines, int offset)
{
/* Ideally we should check 4 paths to follow gnu_debuglink,
but we handle only one case for now as this format is used
by some linux distributions. See GDB's info for detail. */
static const char global_debug_dir[] = "/usr/lib/debug";
- const size_t global_debug_dir_len = sizeof(global_debug_dir) - 1;
- char *p;
+ char *p, *subdir;
obj_info_t *o1 = *objp, *o2;
- size_t len;
p = strrchr(binary_filename, '/');
if (!p) {
@@ -547,13 +445,11 @@ follow_debuglink(const char *debuglink, int num_traces, void **traces,
}
p[1] = '\0';
- len = strlen(binary_filename);
- if (len >= PATH_MAX - global_debug_dir_len)
- len = PATH_MAX - global_debug_dir_len - 1;
- memmove(binary_filename + global_debug_dir_len, binary_filename, len);
- memcpy(binary_filename, global_debug_dir, global_debug_dir_len);
- len += global_debug_dir_len;
- strlcpy(binary_filename + len, debuglink, PATH_MAX - len);
+ subdir = (char *)alloca(strlen(binary_filename) + 1);
+ strcpy(subdir, binary_filename);
+ strcpy(binary_filename, global_debug_dir);
+ strlcat(binary_filename, subdir, PATH_MAX);
+ strlcat(binary_filename, debuglink, PATH_MAX);
append_obj(objp);
o2 = *objp;
@@ -561,1054 +457,6 @@ follow_debuglink(const char *debuglink, int num_traces, void **traces,
o2->path = o1->path;
fill_lines(num_traces, traces, 0, objp, lines, offset);
}
-#endif
-
-enum
-{
- DW_TAG_compile_unit = 0x11,
- DW_TAG_inlined_subroutine = 0x1d,
- DW_TAG_subprogram = 0x2e,
-};
-
-/* Attributes encodings */
-enum
-{
- DW_AT_sibling = 0x01,
- DW_AT_location = 0x02,
- DW_AT_name = 0x03,
- /* Reserved 0x04 */
- /* Reserved 0x05 */
- /* Reserved 0x06 */
- /* Reserved 0x07 */
- /* Reserved 0x08 */
- DW_AT_ordering = 0x09,
- /* Reserved 0x0a */
- DW_AT_byte_size = 0x0b,
- /* Reserved 0x0c */
- DW_AT_bit_size = 0x0d,
- /* Reserved 0x0e */
- /* Reserved 0x0f */
- DW_AT_stmt_list = 0x10,
- DW_AT_low_pc = 0x11,
- DW_AT_high_pc = 0x12,
- DW_AT_language = 0x13,
- /* Reserved 0x14 */
- DW_AT_discr = 0x15,
- DW_AT_discr_value = 0x16,
- DW_AT_visibility = 0x17,
- DW_AT_import = 0x18,
- DW_AT_string_length = 0x19,
- DW_AT_common_reference = 0x1a,
- DW_AT_comp_dir = 0x1b,
- DW_AT_const_value = 0x1c,
- DW_AT_containing_type = 0x1d,
- DW_AT_default_value = 0x1e,
- /* Reserved 0x1f */
- DW_AT_inline = 0x20,
- DW_AT_is_optional = 0x21,
- DW_AT_lower_bound = 0x22,
- /* Reserved 0x23 */
- /* Reserved 0x24 */
- DW_AT_producer = 0x25,
- /* Reserved 0x26 */
- DW_AT_prototyped = 0x27,
- /* Reserved 0x28 */
- /* Reserved 0x29 */
- DW_AT_return_addr = 0x2a,
- /* Reserved 0x2b */
- DW_AT_start_scope = 0x2c,
- /* Reserved 0x2d */
- DW_AT_bit_stride = 0x2e,
- DW_AT_upper_bound = 0x2f,
- /* Reserved 0x30 */
- DW_AT_abstract_origin = 0x31,
- DW_AT_accessibility = 0x32,
- DW_AT_address_class = 0x33,
- DW_AT_artificial = 0x34,
- DW_AT_base_types = 0x35,
- DW_AT_calling_convention = 0x36,
- DW_AT_count = 0x37,
- DW_AT_data_member_location = 0x38,
- DW_AT_decl_column = 0x39,
- DW_AT_decl_file = 0x3a,
- DW_AT_decl_line = 0x3b,
- DW_AT_declaration = 0x3c,
- DW_AT_discr_list = 0x3d,
- DW_AT_encoding = 0x3e,
- DW_AT_external = 0x3f,
- DW_AT_frame_base = 0x40,
- DW_AT_friend = 0x41,
- DW_AT_identifier_case = 0x42,
- /* Reserved 0x43 */
- DW_AT_namelist_item = 0x44,
- DW_AT_priority = 0x45,
- DW_AT_segment = 0x46,
- DW_AT_specification = 0x47,
- DW_AT_static_link = 0x48,
- DW_AT_type = 0x49,
- DW_AT_use_location = 0x4a,
- DW_AT_variable_parameter = 0x4b,
- DW_AT_virtuality = 0x4c,
- DW_AT_vtable_elem_location = 0x4d,
- DW_AT_allocated = 0x4e,
- DW_AT_associated = 0x4f,
- DW_AT_data_location = 0x50,
- DW_AT_byte_stride = 0x51,
- DW_AT_entry_pc = 0x52,
- DW_AT_use_UTF8 = 0x53,
- DW_AT_extension = 0x54,
- DW_AT_ranges = 0x55,
- DW_AT_trampoline = 0x56,
- DW_AT_call_column = 0x57,
- DW_AT_call_file = 0x58,
- DW_AT_call_line = 0x59,
- DW_AT_description = 0x5a,
- DW_AT_binary_scale = 0x5b,
- DW_AT_decimal_scale = 0x5c,
- DW_AT_small = 0x5d,
- DW_AT_decimal_sign = 0x5e,
- DW_AT_digit_count = 0x5f,
- DW_AT_picture_string = 0x60,
- DW_AT_mutable = 0x61,
- DW_AT_threads_scaled = 0x62,
- DW_AT_explicit = 0x63,
- DW_AT_object_pointer = 0x64,
- DW_AT_endianity = 0x65,
- DW_AT_elemental = 0x66,
- DW_AT_pure = 0x67,
- DW_AT_recursive = 0x68,
- DW_AT_signature = 0x69,
- DW_AT_main_subprogram = 0x6a,
- DW_AT_data_bit_offset = 0x6b,
- DW_AT_const_expr = 0x6c,
- DW_AT_enum_class = 0x6d,
- DW_AT_linkage_name = 0x6e,
- DW_AT_string_length_bit_size = 0x6f,
- DW_AT_string_length_byte_size = 0x70,
- DW_AT_rank = 0x71,
- DW_AT_str_offsets_base = 0x72,
- DW_AT_addr_base = 0x73,
- DW_AT_rnglists_base = 0x74,
- /* Reserved 0x75 */
- DW_AT_dwo_name = 0x76,
- DW_AT_reference = 0x77,
- DW_AT_rvalue_reference = 0x78,
- DW_AT_macros = 0x79,
- DW_AT_call_all_calls = 0x7a,
- DW_AT_call_all_source_calls = 0x7b,
- DW_AT_call_all_tail_calls = 0x7c,
- DW_AT_call_return_pc = 0x7d,
- DW_AT_call_value = 0x7e,
- DW_AT_call_origin = 0x7f,
- DW_AT_call_parameter = 0x80,
- DW_AT_call_pc = 0x81,
- DW_AT_call_tail_call = 0x82,
- DW_AT_call_target = 0x83,
- DW_AT_call_target_clobbered = 0x84,
- DW_AT_call_data_location = 0x85,
- DW_AT_call_data_value = 0x86,
- DW_AT_noreturn = 0x87,
- DW_AT_alignment = 0x88,
- DW_AT_export_symbols = 0x89,
- DW_AT_deleted = 0x8a,
- DW_AT_defaulted = 0x8b,
- DW_AT_loclists_base = 0x8c,
- DW_AT_lo_user = 0x2000,
- DW_AT_hi_user = 0x3fff
-};
-
-/* Attribute form encodings */
-enum
-{
- DW_FORM_addr = 0x01,
- /* Reserved 0x02 */
- DW_FORM_block2 = 0x03,
- DW_FORM_block4 = 0x04,
- DW_FORM_data2 = 0x05,
- DW_FORM_data4 = 0x06,
- DW_FORM_data8 = 0x07,
- DW_FORM_string = 0x08,
- DW_FORM_block = 0x09,
- DW_FORM_block1 = 0x0a,
- DW_FORM_data1 = 0x0b,
- DW_FORM_flag = 0x0c,
- DW_FORM_sdata = 0x0d,
- DW_FORM_strp = 0x0e,
- DW_FORM_udata = 0x0f,
- DW_FORM_ref_addr = 0x10,
- DW_FORM_ref1 = 0x11,
- DW_FORM_ref2 = 0x12,
- DW_FORM_ref4 = 0x13,
- DW_FORM_ref8 = 0x14,
- DW_FORM_ref_udata = 0x15,
- DW_FORM_indirect = 0x16,
- DW_FORM_sec_offset = 0x17,
- DW_FORM_exprloc = 0x18,
- DW_FORM_flag_present = 0x19,
- DW_FORM_strx = 0x1a,
- DW_FORM_addrx = 0x1b,
- DW_FORM_ref_sup4 = 0x1c,
- DW_FORM_strp_sup = 0x1d,
- DW_FORM_data16 = 0x1e,
- DW_FORM_line_strp = 0x1f,
- DW_FORM_ref_sig8 = 0x20,
- DW_FORM_implicit_const = 0x21,
- DW_FORM_loclistx = 0x22,
- DW_FORM_rnglistx = 0x23,
- DW_FORM_ref_sup8 = 0x24,
- DW_FORM_strx1 = 0x25,
- DW_FORM_strx2 = 0x26,
- DW_FORM_strx3 = 0x27,
- DW_FORM_strx4 = 0x28,
- DW_FORM_addrx1 = 0x29,
- DW_FORM_addrx2 = 0x2a,
- DW_FORM_addrx3 = 0x2b,
- DW_FORM_addrx4 = 0x2c
-};
-
-enum {
- VAL_none = 0,
- VAL_cstr = 1,
- VAL_data = 2,
- VAL_uint = 3,
- VAL_int = 4
-};
-
-# define ABBREV_TABLE_SIZE 256
-typedef struct {
- obj_info_t *obj;
- char *file;
- char *current_cu;
- uint64_t current_low_pc;
- char *debug_line_cu_end;
- char *debug_line_files;
- char *debug_line_directories;
- char *p;
- char *cu_end;
- char *pend;
- char *q0;
- char *q;
- int format; /* 4 or 8 */;
- uint8_t address_size;
- int level;
- char *abbrev_table[ABBREV_TABLE_SIZE];
-} DebugInfoReader;
-
-typedef struct {
- ptrdiff_t pos;
- int tag;
- int has_children;
-} DIE;
-
-typedef struct {
- union {
- char *ptr;
- uint64_t uint64;
- int64_t int64;
- } as;
- uint64_t off;
- uint64_t at;
- uint64_t form;
- size_t size;
- int type;
-} DebugInfoValue;
-
-/* TODO: Big Endian */
-#define MERGE_2INTS(a,b,sz) (((uint64_t)(b)<<sz)|(a))
-
-static uint16_t
-get_uint16(const uint8_t *p)
-{
- return (uint16_t)MERGE_2INTS(p[0],p[1],8);
-}
-
-static uint32_t
-get_uint32(const uint8_t *p)
-{
- return (uint32_t)MERGE_2INTS(get_uint16(p),get_uint16(p+2),16);
-}
-
-static uint64_t
-get_uint64(const uint8_t *p)
-{
- return MERGE_2INTS(get_uint32(p),get_uint32(p+4),32);
-}
-
-static uint8_t
-read_uint8(char **ptr)
-{
- const unsigned char *p = (const unsigned char *)*ptr;
- *ptr = (char *)(p + 1);
- return *p;
-}
-
-static uint16_t
-read_uint16(char **ptr)
-{
- const unsigned char *p = (const unsigned char *)*ptr;
- *ptr = (char *)(p + 2);
- return get_uint16(p);
-}
-
-static uint32_t
-read_uint24(char **ptr)
-{
- const unsigned char *p = (const unsigned char *)*ptr;
- *ptr = (char *)(p + 3);
- return (*p << 16) | get_uint16(p+1);
-}
-
-static uint32_t
-read_uint32(char **ptr)
-{
- const unsigned char *p = (const unsigned char *)*ptr;
- *ptr = (char *)(p + 4);
- return get_uint32(p);
-}
-
-static uint64_t
-read_uint64(char **ptr)
-{
- const unsigned char *p = (const unsigned char *)*ptr;
- *ptr = (char *)(p + 8);
- return get_uint64(p);
-}
-
-static uintptr_t
-read_uintptr(char **ptr)
-{
- const unsigned char *p = (const unsigned char *)*ptr;
- *ptr = (char *)(p + SIZEOF_VOIDP);
-#if SIZEOF_VOIDP == 8
- return get_uint64(p);
-#else
- return get_uint32(p);
-#endif
-}
-
-static uint64_t
-read_uint(DebugInfoReader *reader)
-{
- if (reader->format == 4) {
- return read_uint32(&reader->p);
- } else { /* 64 bit */
- return read_uint64(&reader->p);
- }
-}
-
-static uint64_t
-read_uleb128(DebugInfoReader *reader)
-{
- return uleb128(&reader->p);
-}
-
-static int64_t
-read_sleb128(DebugInfoReader *reader)
-{
- return sleb128(&reader->p);
-}
-
-static void
-debug_info_reader_init(DebugInfoReader *reader, obj_info_t *obj)
-{
- reader->file = obj->mapped;
- reader->obj = obj;
- reader->p = obj->debug_info.ptr;
- reader->pend = obj->debug_info.ptr + obj->debug_info.size;
- reader->debug_line_cu_end = obj->debug_line.ptr;
-}
-
-static void
-di_read_debug_abbrev_cu(DebugInfoReader *reader)
-{
- uint64_t prev = 0;
- char *p = reader->q0;
- for (;;) {
- uint64_t abbrev_number = uleb128(&p);
- if (abbrev_number <= prev) break;
- if (abbrev_number < ABBREV_TABLE_SIZE) {
- reader->abbrev_table[abbrev_number] = p;
- }
- prev = abbrev_number;
- uleb128(&p); /* tag */
- p++; /* has_children */
- /* skip content */
- for (;;) {
- uint64_t at = uleb128(&p);
- uint64_t form = uleb128(&p);
- if (!at && !form) break;
- }
- }
-}
-
-static int
-di_read_debug_line_cu(DebugInfoReader *reader)
-{
- const char *p;
- struct LineNumberProgramHeader header;
-
- p = (const char *)reader->debug_line_cu_end;
- if (parse_debug_line_header(&p, &header))
- return -1;
-
- reader->debug_line_cu_end = (char *)header.cu_end;
- reader->debug_line_directories = (char *)header.include_directories;
- reader->debug_line_files = (char *)header.filenames;
-
- return 0;
-}
-
-static void
-set_uint_value(DebugInfoValue *v, uint64_t n)
-{
- v->as.uint64 = n;
- v->type = VAL_uint;
-}
-
-static void
-set_int_value(DebugInfoValue *v, int64_t n)
-{
- v->as.int64 = n;
- v->type = VAL_int;
-}
-
-static void
-set_cstr_value(DebugInfoValue *v, char *s)
-{
- v->as.ptr = s;
- v->off = 0;
- v->type = VAL_cstr;
-}
-
-static void
-set_cstrp_value(DebugInfoValue *v, char *s, uint64_t off)
-{
- v->as.ptr = s;
- v->off = off;
- v->type = VAL_cstr;
-}
-
-static void
-set_data_value(DebugInfoValue *v, char *s)
-{
- v->as.ptr = s;
- v->type = VAL_data;
-}
-
-static const char *
-get_cstr_value(DebugInfoValue *v)
-{
- if (v->as.ptr) {
- return v->as.ptr + v->off;
- } else {
- return NULL;
- }
-}
-
-static void
-debug_info_reader_read_value(DebugInfoReader *reader, uint64_t form, DebugInfoValue *v)
-{
- switch (form) {
- case DW_FORM_addr:
- if (reader->address_size == 4) {
- set_uint_value(v, read_uint32(&reader->p));
- } else if (reader->address_size == 8) {
- set_uint_value(v, read_uint64(&reader->p));
- } else {
- fprintf(stderr,"unknown address_size:%d", reader->address_size);
- abort();
- }
- break;
- case DW_FORM_block2:
- v->size = read_uint16(&reader->p);
- set_data_value(v, reader->p);
- reader->p += v->size;
- break;
- case DW_FORM_block4:
- v->size = read_uint32(&reader->p);
- set_data_value(v, reader->p);
- reader->p += v->size;
- break;
- case DW_FORM_data2:
- set_uint_value(v, read_uint16(&reader->p));
- break;
- case DW_FORM_data4:
- set_uint_value(v, read_uint32(&reader->p));
- break;
- case DW_FORM_data8:
- set_uint_value(v, read_uint64(&reader->p));
- break;
- case DW_FORM_string:
- v->size = strlen(reader->p);
- set_cstr_value(v, reader->p);
- reader->p += v->size + 1;
- break;
- case DW_FORM_block:
- v->size = uleb128(&reader->p);
- set_data_value(v, reader->p);
- reader->p += v->size;
- break;
- case DW_FORM_block1:
- v->size = read_uint8(&reader->p);
- set_data_value(v, reader->p);
- reader->p += v->size;
- break;
- case DW_FORM_data1:
- set_uint_value(v, read_uint8(&reader->p));
- break;
- case DW_FORM_flag:
- set_uint_value(v, read_uint8(&reader->p));
- break;
- case DW_FORM_sdata:
- set_int_value(v, read_sleb128(reader));
- break;
- case DW_FORM_strp:
- set_cstrp_value(v, reader->obj->debug_str.ptr, read_uint(reader));
- break;
- case DW_FORM_udata:
- set_uint_value(v, read_uleb128(reader));
- break;
- case DW_FORM_ref_addr:
- if (reader->address_size == 4) {
- set_uint_value(v, read_uint32(&reader->p));
- } else if (reader->address_size == 8) {
- set_uint_value(v, read_uint64(&reader->p));
- } else {
- fprintf(stderr,"unknown address_size:%d", reader->address_size);
- abort();
- }
- break;
- case DW_FORM_ref1:
- set_uint_value(v, read_uint8(&reader->p));
- break;
- case DW_FORM_ref2:
- set_uint_value(v, read_uint16(&reader->p));
- break;
- case DW_FORM_ref4:
- set_uint_value(v, read_uint32(&reader->p));
- break;
- case DW_FORM_ref8:
- set_uint_value(v, read_uint64(&reader->p));
- break;
- case DW_FORM_ref_udata:
- set_uint_value(v, uleb128(&reader->p));
- break;
- case DW_FORM_indirect:
- /* TODO: read the refered value */
- set_uint_value(v, uleb128(&reader->p));
- break;
- case DW_FORM_sec_offset:
- set_uint_value(v, read_uint(reader)); /* offset */
- /* addrptr: debug_addr */
- /* lineptr: debug_line */
- /* loclist: debug_loclists */
- /* loclistptr: debug_loclists */
- /* macptr: debug_macro */
- /* rnglist: debug_rnglists */
- /* rnglistptr: debug_rnglists */
- /* stroffsetsptr: debug_str_offsets */
- break;
- case DW_FORM_exprloc:
- v->size = (size_t)read_uleb128(reader);
- set_data_value(v, reader->p);
- reader->p += v->size;
- break;
- case DW_FORM_flag_present:
- set_uint_value(v, 1);
- break;
- case DW_FORM_strx:
- set_uint_value(v, uleb128(&reader->p));
- break;
- case DW_FORM_addrx:
- /* TODO: read .debug_addr */
- set_uint_value(v, uleb128(&reader->p));
- break;
- case DW_FORM_ref_sup4:
- set_uint_value(v, read_uint32(&reader->p));
- break;
- case DW_FORM_strp_sup:
- set_uint_value(v, read_uint(reader));
- /* *p = reader->sup_file + reader->sup_str->sh_offset + ret; */
- break;
- case DW_FORM_data16:
- v->size = 16;
- set_data_value(v, reader->p);
- reader->p += v->size;
- break;
- case DW_FORM_line_strp:
- set_uint_value(v, read_uint(reader));
- /* *p = reader->file + reader->line->sh_offset + ret; */
- break;
- case DW_FORM_ref_sig8:
- set_uint_value(v, read_uint64(&reader->p));
- break;
- case DW_FORM_implicit_const:
- set_int_value(v, sleb128(&reader->q));
- break;
- case DW_FORM_loclistx:
- set_uint_value(v, read_uleb128(reader));
- break;
- case DW_FORM_rnglistx:
- set_uint_value(v, read_uleb128(reader));
- break;
- case DW_FORM_ref_sup8:
- set_uint_value(v, read_uint64(&reader->p));
- break;
- case DW_FORM_strx1:
- set_uint_value(v, read_uint8(&reader->p));
- break;
- case DW_FORM_strx2:
- set_uint_value(v, read_uint16(&reader->p));
- break;
- case DW_FORM_strx3:
- set_uint_value(v, read_uint24(&reader->p));
- break;
- case DW_FORM_strx4:
- set_uint_value(v, read_uint32(&reader->p));
- break;
- case DW_FORM_addrx1:
- set_uint_value(v, read_uint8(&reader->p));
- break;
- case DW_FORM_addrx2:
- set_uint_value(v, read_uint16(&reader->p));
- break;
- case DW_FORM_addrx3:
- set_uint_value(v, read_uint24(&reader->p));
- break;
- case DW_FORM_addrx4:
- set_uint_value(v, read_uint32(&reader->p));
- break;
- case 0:
- goto fail;
- break;
- }
- return;
-
- fail:
- fprintf(stderr, "%d: unsupported form: %#"PRIx64"\n", __LINE__, form);
- exit(1);
-}
-
-/* find abbrev in current compilation unit */
-static char *
-di_find_abbrev(DebugInfoReader *reader, uint64_t abbrev_number)
-{
- uint64_t n;
- char *p;
- if (abbrev_number < ABBREV_TABLE_SIZE) {
- return reader->abbrev_table[abbrev_number];
- }
- p = reader->abbrev_table[ABBREV_TABLE_SIZE-1];
- /* skip 255th record */
- uleb128(&p); /* tag */
- p++; /* has_children */
- /* skip content */
- for (;;) {
- uint64_t at = uleb128(&p);
- uint64_t form = uleb128(&p);
- if (!at && !form) break;
- }
- for (n = uleb128(&p); abbrev_number != n; n = uleb128(&p)) {
- if (n == 0) {
- fprintf(stderr,"%d: Abbrev Number %"PRId64" not found\n",__LINE__, abbrev_number);
- exit(1);
- }
- uleb128(&p); /* tag */
- p++; /* has_children */
- /* skip content */
- for (;;) {
- uint64_t at = uleb128(&p);
- uint64_t form = uleb128(&p);
- if (!at && !form) break;
- }
- }
- return p;
-}
-
-#if 0
-static void
-hexdump0(const unsigned char *p, size_t n)
-{
- size_t i;
- fprintf(stderr, " 0 1 2 3 4 5 6 7 8 9 A B C D E F\n");
- for (i=0; i < n; i++){
- switch (i & 15) {
- case 0:
- fprintf(stderr, "%02zd: %02X ", i/16, p[i]);
- break;
- case 15:
- fprintf(stderr, "%02X\n", p[i]);
- break;
- default:
- fprintf(stderr, "%02X ", p[i]);
- break;
- }
- }
- if ((i & 15) != 15) {
- fprintf(stderr, "\n");
- }
-}
-#define hexdump(p,n) hexdump0((const unsigned char *)p, n)
-
-static void
-div_inspect(DebugInfoValue *v)
-{
- switch (v->type) {
- case VAL_uint:
- fprintf(stderr,"%d: type:%d size:%zx v:%lx\n",__LINE__,v->type,v->size,v->as.uint64);
- break;
- case VAL_int:
- fprintf(stderr,"%d: type:%d size:%zx v:%ld\n",__LINE__,v->type,v->size,(int64_t)v->as.uint64);
- break;
- case VAL_cstr:
- fprintf(stderr,"%d: type:%d size:%zx v:'%s'\n",__LINE__,v->type,v->size,v->as.ptr);
- break;
- case VAL_data:
- fprintf(stderr,"%d: type:%d size:%zx v:\n",__LINE__,v->type,v->size);
- hexdump(v->as.ptr, 16);
- break;
- }
-}
-#endif
-
-static DIE *
-di_read_die(DebugInfoReader *reader, DIE *die)
-{
- uint64_t abbrev_number = uleb128(&reader->p);
- if (abbrev_number == 0) {
- reader->level--;
- return NULL;
- }
-
- reader->q = di_find_abbrev(reader, abbrev_number);
-
- die->pos = reader->p - reader->obj->debug_info.ptr - 1;
- die->tag = (int)uleb128(&reader->q); /* tag */
- die->has_children = *reader->q++; /* has_children */
- if (die->has_children) {
- reader->level++;
- }
- return die;
-}
-
-static DebugInfoValue *
-di_read_record(DebugInfoReader *reader, DebugInfoValue *vp)
-{
- uint64_t at = uleb128(&reader->q);
- uint64_t form = uleb128(&reader->q);
- if (!at || !form) return NULL;
- vp->at = at;
- vp->form = form;
- debug_info_reader_read_value(reader, form, vp);
- return vp;
-}
-
-static void
-di_skip_records(DebugInfoReader *reader)
-{
- for (;;) {
- DebugInfoValue v = {{}};
- uint64_t at = uleb128(&reader->q);
- uint64_t form = uleb128(&reader->q);
- if (!at || !form) return;
- debug_info_reader_read_value(reader, form, &v);
- }
-}
-
-typedef struct {
- uint64_t low_pc;
- uint64_t high_pc;
- uint64_t ranges;
- bool low_pc_set;
- bool high_pc_set;
- bool ranges_set;
-} ranges_t;
-
-static void
-ranges_set(ranges_t *ptr, DebugInfoValue *v)
-{
- switch (v->at) {
- case DW_AT_low_pc:
- ptr->low_pc = v->as.uint64;
- ptr->low_pc_set = true;
- break;
- case DW_AT_high_pc:
- if (v->form == DW_FORM_addr) {
- ptr->high_pc = v->as.uint64;
- }
- else {
- ptr->high_pc = ptr->low_pc + v->as.uint64;
- }
- ptr->high_pc_set = true;
- break;
- case DW_AT_ranges:
- ptr->ranges = v->as.uint64;
- ptr->ranges_set = true;
- break;
- }
-}
-
-static uintptr_t
-ranges_include(DebugInfoReader *reader, ranges_t *ptr, uint64_t addr)
-{
- if (ptr->high_pc_set) {
- if (ptr->ranges_set || !ptr->low_pc_set) {
- exit(1);
- }
- if (ptr->low_pc <= addr && addr <= ptr->high_pc) {
- return (uintptr_t)ptr->low_pc;
- }
- }
- else if (ptr->ranges_set) {
- /* TODO: support base address selection entry */
- char *p = reader->obj->debug_ranges.ptr + ptr->ranges;
- uint64_t base = ptr->low_pc_set ? ptr->low_pc : reader->current_low_pc;
- for (;;) {
- uintptr_t from = read_uintptr(&p);
- uintptr_t to = read_uintptr(&p);
- if (!from && !to) break;
- if (from == UINTPTR_MAX) {
- /* base address selection entry */
- base = to;
- }
- else if (base + from <= addr && addr < base + to) {
- return from;
- }
- }
- }
- else if (ptr->low_pc_set) {
- if (ptr->low_pc == addr) {
- return (uintptr_t)ptr->low_pc;
- }
- }
- return false;
-}
-
-#if 0
-static void
-ranges_inspect(DebugInfoReader *reader, ranges_t *ptr)
-{
- if (ptr->high_pc_set) {
- if (ptr->ranges_set || !ptr->low_pc_set) {
- fprintf(stderr,"low_pc_set:%d high_pc_set:%d ranges_set:%d\n",ptr->low_pc_set,ptr->high_pc_set,ptr->ranges_set);
- exit(1);
- }
- fprintf(stderr,"low_pc:%"PRIx64" high_pc:%"PRIx64"\n",ptr->low_pc,ptr->high_pc);
- }
- else if (ptr->ranges_set) {
- char *p = reader->obj->debug_ranges.ptr + ptr->ranges;
- fprintf(stderr,"low_pc:%"PRIx64" ranges:%"PRIx64" %lx ",ptr->low_pc,ptr->ranges, p-reader->obj->mapped);
- for (;;) {
- uintptr_t from = read_uintptr(&p);
- uintptr_t to = read_uintptr(&p);
- if (!from && !to) break;
- fprintf(stderr,"%"PRIx64"-%"PRIx64" ",ptr->low_pc+from,ptr->low_pc+to);
- }
- fprintf(stderr,"\n");
- }
- else if (ptr->low_pc_set) {
- fprintf(stderr,"low_pc:%"PRIx64"\n",ptr->low_pc);
- }
- else {
- fprintf(stderr,"empty\n");
- }
-}
-#endif
-
-static int
-di_read_cu(DebugInfoReader *reader)
-{
- uint64_t unit_length;
- uint16_t version;
- uint64_t debug_abbrev_offset;
- reader->format = 4;
- reader->current_cu = reader->p;
- unit_length = read_uint32(&reader->p);
- if (unit_length == 0xffffffff) {
- unit_length = read_uint64(&reader->p);
- reader->format = 8;
- }
- reader->cu_end = reader->p + unit_length;
- version = read_uint16(&reader->p);
- if (version > 5) {
- return -1;
- }
- else if (version == 5) {
- /* unit_type = */ read_uint8(&reader->p);
- reader->address_size = read_uint8(&reader->p);
- debug_abbrev_offset = read_uint(reader);
- }
- else {
- debug_abbrev_offset = read_uint(reader);
- reader->address_size = read_uint8(&reader->p);
- }
- reader->q0 = reader->obj->debug_abbrev.ptr + debug_abbrev_offset;
-
- reader->level = 0;
- di_read_debug_abbrev_cu(reader);
- if (di_read_debug_line_cu(reader)) return -1;
-
-#if defined(__GNUC__) && !defined(__clang__) && !defined(__INTEL_COMPILER_BUILD_DATE)
- /* Though DWARF specifies "the applicable base address defaults to the base
- address of the compilation unit", but GCC seems to use zero as default */
-#else
- do {
- DIE die;
-
- if (!di_read_die(reader, &die)) continue;
-
- if (die.tag != DW_TAG_compile_unit) {
- di_skip_records(reader);
- break;
- }
-
- /* enumerate abbrev */
- for (;;) {
- DebugInfoValue v = {{}};
- if (!di_read_record(reader, &v)) break;
- switch (v.at) {
- case DW_AT_low_pc:
- reader->current_low_pc = v.as.uint64;
- break;
- }
- }
- } while (0);
-#endif
- return 0;
-}
-
-static void
-read_abstract_origin(DebugInfoReader *reader, uint64_t abstract_origin, line_info_t *line)
-{
- char *p = reader->p;
- char *q = reader->q;
- int level = reader->level;
- DIE die;
-
- reader->p = reader->current_cu + abstract_origin;
- if (!di_read_die(reader, &die)) goto finish;
-
- /* enumerate abbrev */
- for (;;) {
- DebugInfoValue v = {{}};
- if (!di_read_record(reader, &v)) break;
- switch (v.at) {
- case DW_AT_name:
- line->sname = get_cstr_value(&v);
- break;
- }
- }
-
- finish:
- reader->p = p;
- reader->q = q;
- reader->level = level;
-}
-
-static void
-debug_info_read(DebugInfoReader *reader, int num_traces, void **traces,
- line_info_t *lines, int offset)
-{
- int i;
- while (reader->p < reader->cu_end) {
- DIE die;
- ranges_t ranges = {};
- line_info_t line = {};
-
- if (!di_read_die(reader, &die)) continue;
- /* fprintf(stderr,"%d:%tx: <%d>\n",__LINE__,die.pos,reader->level,die.tag); */
-
- if (die.tag != DW_TAG_subprogram && die.tag != DW_TAG_inlined_subroutine) {
- skip_die:
- di_skip_records(reader);
- continue;
- }
-
- /* enumerate abbrev */
- for (;;) {
- DebugInfoValue v = {{}};
- /* ptrdiff_t pos = reader->p - reader->p0; */
- if (!di_read_record(reader, &v)) break;
- /* fprintf(stderr,"\n%d:%tx: AT:%lx FORM:%lx\n",__LINE__,pos,v.at,v.form); */
- /* div_inspect(&v); */
- switch (v.at) {
- case DW_AT_name:
- line.sname = get_cstr_value(&v);
- break;
- case DW_AT_call_file:
- fill_filename((int)v.as.uint64, reader->debug_line_directories, reader->debug_line_files, &line, reader->obj);
- break;
- case DW_AT_call_line:
- line.line = (int)v.as.uint64;
- break;
- case DW_AT_low_pc:
- case DW_AT_high_pc:
- case DW_AT_ranges:
- ranges_set(&ranges, &v);
- break;
- case DW_AT_declaration:
- goto skip_die;
- case DW_AT_inline:
- /* 1 or 3 */
- break; /* goto skip_die; */
- case DW_AT_abstract_origin:
- read_abstract_origin(reader, v.as.uint64, &line);
- break; /* goto skip_die; */
- }
- }
- /* ranges_inspect(reader, &ranges); */
- /* fprintf(stderr,"%d:%tx: %x ",__LINE__,diepos,die.tag); */
- for (i=offset; i < num_traces; i++) {
- uintptr_t addr = (uintptr_t)traces[i];
- uintptr_t offset = addr - reader->obj->base_addr + reader->obj->vmaddr;
- uintptr_t saddr = ranges_include(reader, &ranges, offset);
- if (saddr) {
- /* fprintf(stderr, "%d:%tx: %d %lx->%lx %x %s: %s/%s %d %s %s %s\n",__LINE__,die.pos, i,addr,offset, die.tag,line.sname,line.dirname,line.filename,line.line,reader->obj->path,line.sname,lines[i].sname); */
- if (lines[i].sname) {
- line_info_t *lp = malloc(sizeof(line_info_t));
- memcpy(lp, &lines[i], sizeof(line_info_t));
- lines[i].next = lp;
- lp->dirname = line.dirname;
- lp->filename = line.filename;
- lp->line = line.line;
- lp->saddr = 0;
- }
- lines[i].path = reader->obj->path;
- lines[i].base_addr = line.base_addr;
- lines[i].sname = line.sname;
- lines[i].saddr = saddr + reader->obj->base_addr - reader->obj->vmaddr;
- }
- }
- }
-}
-
-#ifdef USE_ELF
-static unsigned long
-uncompress_debug_section(ElfW(Shdr) *shdr, char *file, char **ptr)
-{
-#ifdef SUPPORT_COMPRESSED_DEBUG_LINE
- ElfW(Chdr) *chdr = (ElfW(Chdr) *)(file + shdr->sh_offset);
- unsigned long destsize = chdr->ch_size;
- int ret = 0;
-
- if (chdr->ch_type != ELFCOMPRESS_ZLIB) {
- /* unsupported compression type */
- return 0;
- }
-
- *ptr = malloc(destsize);
- if (!*ptr) return 0;
- ret = uncompress((Bytef *)*ptr, &destsize,
- (const Bytef*)chdr + sizeof(ElfW(Chdr)),
- shdr->sh_size - sizeof(ElfW(Chdr)));
- if (ret != Z_OK) goto fail;
- return destsize;
-
-fail:
- free(*ptr);
-#endif
- return 0;
-}
/* read file and fill lines */
static uintptr_t
@@ -1617,9 +465,10 @@ fill_lines(int num_traces, void **traces, int check_debuglink,
{
int i, j;
char *shstr;
+ char *section_name;
ElfW(Ehdr) *ehdr;
ElfW(Shdr) *shdr, *shstr_shdr;
- ElfW(Shdr) *gnu_debuglink_shdr = NULL;
+ ElfW(Shdr) *debug_line_shdr = NULL, *gnu_debuglink_shdr = NULL;
int fd;
off_t filesize;
char *file;
@@ -1655,7 +504,6 @@ fill_lines(int num_traces, void **traces, int check_debuglink,
kprintf("mmap: %s\n", strerror(e));
goto fail;
}
- close(fd);
ehdr = (ElfW(Ehdr) *)file;
if (memcmp(ehdr->e_ident, "\177ELF", 4) != 0) {
@@ -1663,8 +511,11 @@ fill_lines(int num_traces, void **traces, int check_debuglink,
* Huh? Maybe filename was overridden by setproctitle() and
* it match non-elf file.
*/
+ close(fd);
goto fail;
}
+
+ obj->fd = fd;
obj->mapped = file;
obj->mapped_size = (size_t)filesize;
@@ -1674,7 +525,7 @@ fill_lines(int num_traces, void **traces, int check_debuglink,
shstr = file + shstr_shdr->sh_offset;
for (i = 0; i < ehdr->e_shnum; i++) {
- char *section_name = shstr + shdr[i].sh_name;
+ section_name = shstr + shdr[i].sh_name;
switch (shdr[i].sh_type) {
case SHT_STRTAB:
if (!strcmp(section_name, ".strtab")) {
@@ -1693,34 +544,12 @@ fill_lines(int num_traces, void **traces, int check_debuglink,
dynsym_shdr = shdr + i;
break;
case SHT_PROGBITS:
- if (!strcmp(section_name, ".gnu_debuglink")) {
+ if (!strcmp(section_name, ".debug_line")) {
+ debug_line_shdr = shdr + i;
+ }
+ else if (!strcmp(section_name, ".gnu_debuglink")) {
gnu_debuglink_shdr = shdr + i;
}
- else {
- const char *debug_section_names[] = {
- ".debug_abbrev",
- ".debug_info",
- ".debug_line",
- ".debug_ranges",
- ".debug_str"
- };
-
- for (j=0; j < DWARF_SECTION_COUNT; j++) {
- struct dwarf_section *s = obj_dwarf_section_at(obj, j);
-
- if (strcmp(section_name, debug_section_names[j]) != 0)
- continue;
-
- s->ptr = file + shdr[i].sh_offset;
- s->size = shdr[i].sh_size;
- s->flags = shdr[i].sh_flags;
- if (s->flags & SHF_COMPRESSED) {
- s->size = uncompress_debug_section(&shdr[i], file, &s->ptr);
- if (!s->size) goto fail;
- }
- break;
- }
- }
break;
}
}
@@ -1732,22 +561,20 @@ fill_lines(int num_traces, void **traces, int check_debuglink,
char *strtab = file + dynstr_shdr->sh_offset;
ElfW(Sym) *symtab = (ElfW(Sym) *)(file + dynsym_shdr->sh_offset);
int symtab_count = (int)(dynsym_shdr->sh_size / sizeof(ElfW(Sym)));
- void *handle = dlopen(NULL, RTLD_NOW|RTLD_LOCAL);
- if (handle) {
- for (j = 0; j < symtab_count; j++) {
- ElfW(Sym) *sym = &symtab[j];
- Dl_info info;
- void *s;
- if (ELF_ST_TYPE(sym->st_info) != STT_FUNC || sym->st_size == 0) continue;
- s = dlsym(handle, strtab + sym->st_name);
- if (s && dladdr(s, &info)) {
- obj->base_addr = dladdr_fbase;
- dladdr_fbase = (uintptr_t)info.dli_fbase;
- break;
- }
- }
- dlclose(handle);
- }
+ for (j = 0; j < symtab_count; j++) {
+ ElfW(Sym) *sym = &symtab[j];
+ Dl_info info;
+ void *h, *s;
+ if (ELF_ST_TYPE(sym->st_info) != STT_FUNC || sym->st_size <= 0) continue;
+ h = dlopen(NULL, RTLD_NOW|RTLD_LOCAL);
+ if (!h) continue;
+ s = dlsym(h, strtab + sym->st_name);
+ if (!s) continue;
+ if (dladdr(s, &info)) {
+ dladdr_fbase = (uintptr_t)info.dli_fbase;
+ break;
+ }
+ }
if (ehdr->e_type == ET_EXEC) {
obj->base_addr = 0;
}
@@ -1758,48 +585,33 @@ fill_lines(int num_traces, void **traces, int check_debuglink,
}
}
- if (obj->debug_info.ptr && obj->debug_abbrev.ptr) {
- DebugInfoReader reader;
- debug_info_reader_init(&reader, obj);
- i = 0;
- while (reader.p < reader.pend) {
- /* fprintf(stderr, "%d:%tx: CU[%d]\n", __LINE__, reader.p - reader.obj->debug_info.ptr, i++); */
- if (di_read_cu(&reader)) goto use_symtab;
- debug_info_read(&reader, num_traces, traces, lines, offset);
- }
- }
- else {
- /* This file doesn't have dwarf, use symtab or dynsym */
-use_symtab:
- if (!symtab_shdr) {
- /* This file doesn't have symtab, use dynsym instead */
- symtab_shdr = dynsym_shdr;
- strtab_shdr = dynstr_shdr;
- }
-
- if (symtab_shdr && strtab_shdr) {
- char *strtab = file + strtab_shdr->sh_offset;
- ElfW(Sym) *symtab = (ElfW(Sym) *)(file + symtab_shdr->sh_offset);
- int symtab_count = (int)(symtab_shdr->sh_size / sizeof(ElfW(Sym)));
- for (j = 0; j < symtab_count; j++) {
- ElfW(Sym) *sym = &symtab[j];
- uintptr_t saddr = (uintptr_t)sym->st_value + obj->base_addr;
- if (ELF_ST_TYPE(sym->st_info) != STT_FUNC) continue;
- for (i = offset; i < num_traces; i++) {
- uintptr_t d = (uintptr_t)traces[i] - saddr;
- if (lines[i].line > 0 || d > (uintptr_t)sym->st_size)
- continue;
- /* fill symbol name and addr from .symtab */
- if (!lines[i].sname) lines[i].sname = strtab + sym->st_name;
- lines[i].saddr = saddr;
- lines[i].path = obj->path;
- lines[i].base_addr = obj->base_addr;
- }
- }
- }
+ if (!symtab_shdr) {
+ symtab_shdr = dynsym_shdr;
+ strtab_shdr = dynstr_shdr;
+ }
+
+ if (symtab_shdr && strtab_shdr) {
+ char *strtab = file + strtab_shdr->sh_offset;
+ ElfW(Sym) *symtab = (ElfW(Sym) *)(file + symtab_shdr->sh_offset);
+ int symtab_count = (int)(symtab_shdr->sh_size / sizeof(ElfW(Sym)));
+ for (j = 0; j < symtab_count; j++) {
+ ElfW(Sym) *sym = &symtab[j];
+ uintptr_t saddr = (uintptr_t)sym->st_value + obj->base_addr;
+ if (ELF_ST_TYPE(sym->st_info) != STT_FUNC || sym->st_size <= 0) continue;
+ for (i = offset; i < num_traces; i++) {
+ uintptr_t d = (uintptr_t)traces[i] - saddr;
+ if (lines[i].line > 0 || d <= 0 || d > (uintptr_t)sym->st_size)
+ continue;
+ /* fill symbol name and addr from .symtab */
+ lines[i].sname = strtab + sym->st_name;
+ lines[i].saddr = saddr;
+ lines[i].path = obj->path;
+ lines[i].base_addr = obj->base_addr;
+ }
+ }
}
- if (!obj->debug_line.ptr) {
+ if (!debug_line_shdr) {
/* This file doesn't have .debug_line section,
let's check .gnu_debuglink section instead. */
if (gnu_debuglink_shdr && check_debuglink) {
@@ -1810,233 +622,15 @@ use_symtab:
goto finish;
}
- if (parse_debug_line(num_traces, traces,
- obj->debug_line.ptr,
- obj->debug_line.size,
- obj, lines, offset) == -1)
- goto fail;
-
+ parse_debug_line(num_traces, traces,
+ file + debug_line_shdr->sh_offset,
+ debug_line_shdr->sh_size,
+ obj, lines, offset);
finish:
return dladdr_fbase;
fail:
return (uintptr_t)-1;
}
-#else /* Mach-O */
-/* read file and fill lines */
-static uintptr_t
-fill_lines(int num_traces, void **traces, int check_debuglink,
- obj_info_t **objp, line_info_t *lines, int offset)
-{
-# ifdef __LP64__
-# define LP(x) x##_64
-# else
-# define LP(x) x
-# endif
- int fd;
- off_t filesize;
- char *file, *p = NULL;
- obj_info_t *obj = *objp;
- struct LP(mach_header) *header;
- uintptr_t dladdr_fbase = 0;
-
- {
- char *s = binary_filename;
- char *base = strrchr(binary_filename, '/')+1;
- size_t max = PATH_MAX;
- size_t size = strlen(binary_filename);
- size_t basesize = size - (base - binary_filename);
- s += size;
- max -= size;
- p = s;
- size = strlcpy(s, ".dSYM/Contents/Resources/DWARF/", max);
- if (size == 0) goto fail;
- s += size;
- max -= size;
- if (max <= basesize) goto fail;
- memcpy(s, base, basesize);
- s[basesize] = 0;
-
- fd = open(binary_filename, O_RDONLY);
- if (fd < 0) {
- *p = 0; /* binary_filename becomes original file name */
- fd = open(binary_filename, O_RDONLY);
- if (fd < 0) {
- goto fail;
- }
- }
- }
-
- filesize = lseek(fd, 0, SEEK_END);
- if (filesize < 0) {
- int e = errno;
- close(fd);
- kprintf("lseek: %s\n", strerror(e));
- goto fail;
- }
-#if SIZEOF_OFF_T > SIZEOF_SIZE_T
- if (filesize > (off_t)SIZE_MAX) {
- close(fd);
- kprintf("Too large file %s\n", binary_filename);
- goto fail;
- }
-#endif
- lseek(fd, 0, SEEK_SET);
- /* async-signal unsafe */
- file = (char *)mmap(NULL, (size_t)filesize, PROT_READ, MAP_SHARED, fd, 0);
- if (file == MAP_FAILED) {
- int e = errno;
- close(fd);
- kprintf("mmap: %s\n", strerror(e));
- goto fail;
- }
- close(fd);
-
- obj->mapped = file;
- obj->mapped_size = (size_t)filesize;
-
- header = (struct LP(mach_header) *)file;
- if (header->magic == LP(MH_MAGIC)) {
- /* non universal binary */
- p = file;
- }
- else if (header->magic == FAT_CIGAM) {
- struct fat_header *fat = (struct fat_header *)file;
- char *q = file + sizeof(*fat);
- uint32_t nfat_arch = __builtin_bswap32(fat->nfat_arch);
- /* fprintf(stderr,"%d: fat:%s %d\n",__LINE__, binary_filename,nfat_arch); */
- for (uint32_t i = 0; i < nfat_arch; i++) {
- struct fat_arch *arch = (struct fat_arch *)q;
- cpu_type_t cputype = __builtin_bswap32(arch->cputype);
- cpu_subtype_t cpusubtype = __builtin_bswap32(arch->cpusubtype);
- uint32_t offset = __builtin_bswap32(arch->offset);
- /* fprintf(stderr,"%d: fat %d %x/%x %x/%x\n",__LINE__, i, _mh_execute_header.cputype,_mh_execute_header.cpusubtype, cputype,cpusubtype); */
- if (_mh_execute_header.cputype == cputype &&
- (_mh_execute_header.cpusubtype & ~CPU_SUBTYPE_MASK) == cpusubtype) {
- p = file + offset;
- file = p;
- header = (struct LP(mach_header) *)p;
- if (header->magic == LP(MH_MAGIC)) {
- goto found_mach_header;
- }
- break;
- }
- q += sizeof(*arch);
- }
- kprintf("'%s' is not a Mach-O universal binary file!\n",binary_filename);
- close(fd);
- goto fail;
- }
- else {
- kprintf("'%s' is not a "
-# ifdef __LP64__
- "64"
-# else
- "32"
-# endif
- "-bit Mach-O file!\n",binary_filename);
- close(fd);
- goto fail;
- }
-found_mach_header:
- p += sizeof(*header);
-
- for (uint32_t i = 0; i < (uint32_t)header->ncmds; i++) {
- struct load_command *lcmd = (struct load_command *)p;
- switch (lcmd->cmd) {
- case LP(LC_SEGMENT):
- {
- static const char *debug_section_names[] = {
- "__debug_abbrev",
- "__debug_info",
- "__debug_line",
- "__debug_ranges",
- "__debug_str"
- };
- struct LP(segment_command) *scmd = (struct LP(segment_command) *)lcmd;
- if (strcmp(scmd->segname, "__TEXT") == 0) {
- obj->vmaddr = scmd->vmaddr;
- }
- else if (strcmp(scmd->segname, "__DWARF") == 0) {
- p += sizeof(struct LP(segment_command));
- for (uint64_t i = 0; i < scmd->nsects; i++) {
- struct LP(section) *sect = (struct LP(section) *)p;
- p += sizeof(struct LP(section));
- for (int j=0; j < DWARF_SECTION_COUNT; j++) {
- struct dwarf_section *s = obj_dwarf_section_at(obj, j);
-
- if (strcmp(sect->sectname, debug_section_names[j]) != 0)
- continue;
-
- s->ptr = file + sect->offset;
- s->size = sect->size;
- s->flags = sect->flags;
- if (s->flags & SHF_COMPRESSED) {
- goto fail;
- }
- break;
- }
- }
- }
- }
- break;
-
- case LC_SYMTAB:
- {
- struct symtab_command *cmd = (struct symtab_command *)lcmd;
- struct LP(nlist) *nl = (struct LP(nlist) *)(file + cmd->symoff);
- char *strtab = file + cmd->stroff, *sname;
- uint32_t j;
- uintptr_t saddr;
- /* kprintf("[%2d]: %x/symtab %p\n", i, cmd->cmd, p); */
- for (j = 0; j < cmd->nsyms; j++) {
- uintptr_t symsize, d;
- struct LP(nlist) *e = &nl[j];
- /* kprintf("[%2d][%4d]: %02x/%x/%x: %s %llx\n", i, j, e->n_type,e->n_sect,e->n_desc,strtab+e->n_un.n_strx,e->n_value); */
- if (e->n_type != N_FUN) continue;
- if (e->n_sect) {
- saddr = (uintptr_t)e->n_value + obj->base_addr - obj->vmaddr;
- sname = strtab + e->n_un.n_strx;
- /* kprintf("[%2d][%4d]: %02x/%x/%x: %s %llx\n", i, j, e->n_type,e->n_sect,e->n_desc,strtab+e->n_un.n_strx,e->n_value); */
- continue;
- }
- for (int k = offset; k < num_traces; k++) {
- d = (uintptr_t)traces[k] - saddr;
- symsize = e->n_value;
- /* kprintf("%lx %lx %lx\n",saddr,symsize,traces[k]); */
- if (lines[k].line > 0 || d > (uintptr_t)symsize)
- continue;
- /* fill symbol name and addr from .symtab */
- if (!lines[k].sname) lines[k].sname = sname;
- lines[k].saddr = saddr;
- lines[k].path = obj->path;
- lines[k].base_addr = obj->base_addr;
- }
- }
- }
- }
- p += lcmd->cmdsize;
- }
-
- if (obj->debug_info.ptr && obj->debug_abbrev.ptr) {
- DebugInfoReader reader;
- debug_info_reader_init(&reader, obj);
- while (reader.p < reader.pend) {
- if (di_read_cu(&reader)) goto fail;
- debug_info_read(&reader, num_traces, traces, lines, offset);
- }
- }
-
- if (parse_debug_line(num_traces, traces,
- obj->debug_line.ptr,
- obj->debug_line.size,
- obj, lines, offset) == -1)
- goto fail;
-
- return dladdr_fbase;
-fail:
- return (uintptr_t)-1;
-}
-#endif
#define HAVE_MAIN_EXE_PATH
#if defined(__FreeBSD__)
@@ -2049,7 +643,7 @@ fail:
* it is NUL terminated.
*/
#if defined(__linux__)
-static ssize_t
+ssize_t
main_exe_path(void)
{
# define PROC_SELF_EXE "/proc/self/exe"
@@ -2058,7 +652,7 @@ main_exe_path(void)
return len;
}
#elif defined(__FreeBSD__)
-static ssize_t
+ssize_t
main_exe_path(void)
{
int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1};
@@ -2075,53 +669,6 @@ main_exe_path(void)
#undef HAVE_MAIN_EXE_PATH
#endif
-static void
-print_line0(line_info_t *line, void *address)
-{
- uintptr_t addr = (uintptr_t)address;
- uintptr_t d = addr - line->saddr;
- if (!address) {
- /* inlined */
- if (line->dirname && line->dirname[0]) {
- kprintf("%s(%s) %s/%s:%d\n", line->path, line->sname, line->dirname, line->filename, line->line);
- }
- else {
- kprintf("%s(%s) %s:%d\n", line->path, line->sname, line->filename, line->line);
- }
- }
- else if (!line->path) {
- kprintf("[0x%"PRIxPTR"]\n", addr);
- }
- else if (!line->saddr || !line->sname) {
- kprintf("%s(0x%"PRIxPTR") [0x%"PRIxPTR"]\n", line->path, addr-line->base_addr, addr);
- }
- else if (line->line <= 0) {
- kprintf("%s(%s+0x%"PRIxPTR") [0x%"PRIxPTR"]\n", line->path, line->sname,
- d, addr);
- }
- else if (!line->filename) {
- kprintf("%s(%s+0x%"PRIxPTR") [0x%"PRIxPTR"] ???:%d\n", line->path, line->sname,
- d, addr, line->line);
- }
- else if (line->dirname && line->dirname[0]) {
- kprintf("%s(%s+0x%"PRIxPTR") [0x%"PRIxPTR"] %s/%s:%d\n", line->path, line->sname,
- d, addr, line->dirname, line->filename, line->line);
- }
- else {
- kprintf("%s(%s+0x%"PRIxPTR") [0x%"PRIxPTR"] %s:%d\n", line->path, line->sname,
- d, addr, line->filename, line->line);
- }
-}
-
-static void
-print_line(line_info_t *line, void *address)
-{
- print_line0(line, address);
- if (line->next) {
- print_line(line->next, NULL);
- }
-}
-
void
rb_dump_backtrace_with_lines(int num_traces, void **traces)
{
@@ -2173,11 +720,8 @@ rb_dump_backtrace_with_lines(int num_traces, void **traces)
path = info.dli_fname;
obj->path = path;
lines[i].path = path;
- lines[i].sname = info.dli_sname;
- lines[i].saddr = (uintptr_t)info.dli_saddr;
- strlcpy(binary_filename, path, PATH_MAX);
- if (fill_lines(num_traces, traces, 1, &obj, lines, i) == (uintptr_t)-1)
- break;
+ strcpy(binary_filename, path);
+ fill_lines(num_traces, traces, 1, &obj, lines, i);
}
next_line:
continue;
@@ -2185,36 +729,46 @@ next_line:
/* output */
for (i = 0; i < num_traces; i++) {
- print_line(&lines[i], traces[i]);
-
+ line_info_t *line = &lines[i];
+ uintptr_t addr = (uintptr_t)traces[i];
+ uintptr_t d = addr - line->saddr;
+ if (!line->path) {
+ kprintf("[0x%lx]\n", addr);
+ }
+ else if (!line->saddr || !line->sname) {
+ kprintf("%s [0x%lx]\n", line->path, addr);
+ }
+ else if (line->line <= 0) {
+ kprintf("%s(%s+0x%lx) [0x%lx]\n", line->path, line->sname,
+ d, addr);
+ }
+ else if (!line->filename) {
+ kprintf("%s(%s+0x%lx) [0x%lx] ???:%d\n", line->path, line->sname,
+ d, addr, line->line);
+ }
+ else if (line->dirname && line->dirname[0]) {
+ kprintf("%s(%s+0x%lx) [0x%lx] %s/%s:%d\n", line->path, line->sname,
+ d, addr, line->dirname, line->filename, line->line);
+ }
+ else {
+ kprintf("%s(%s+0x%lx) [0x%lx] %s:%d\n", line->path, line->sname,
+ d, addr, line->filename, line->line);
+ }
/* FreeBSD's backtrace may show _start and so on */
- if (lines[i].sname && strcmp("main", lines[i].sname) == 0)
+ if (line->sname && strcmp("main", line->sname) == 0)
break;
}
/* free */
while (obj) {
obj_info_t *o = obj;
- for (i=0; i < DWARF_SECTION_COUNT; i++) {
- struct dwarf_section *s = obj_dwarf_section_at(obj, i);
- if (s->flags & SHF_COMPRESSED) {
- free(s->ptr);
- }
- }
- if (obj->mapped_size) {
- munmap(obj->mapped, obj->mapped_size);
- }
obj = o->next;
+ if (o->fd) {
+ munmap(o->mapped, o->mapped_size);
+ close(o->fd);
+ }
free(o);
}
- for (i = 0; i < num_traces; i++) {
- line_info_t *line = lines[i].next;
- while (line) {
- line_info_t *l = line;
- line = line->next;
- free(l);
- }
- }
free(lines);
free(dladdr_fbases);
}
@@ -2258,9 +812,10 @@ next_line:
#include <stdarg.h>
#define MAXNBUF (sizeof(intmax_t) * CHAR_BIT + 1)
-static inline int toupper(int c) { return ('A' <= c && c <= 'Z') ? (c&0x5f) : c; }
+extern int rb_toupper(int c);
+#define toupper(c) rb_toupper(c)
#define hex2ascii(hex) (hex2ascii_data[hex])
-static const char hex2ascii_data[] = "0123456789abcdefghijklmnopqrstuvwxyz";
+char const hex2ascii_data[] = "0123456789abcdefghijklmnopqrstuvwxyz";
static inline int imax(int a, int b) { return (a > b ? a : b); }
static int kvprintf(char const *fmt, void (*func)(int), void *arg, int radix, va_list ap);
@@ -2274,7 +829,7 @@ static void putce(int c)
(void)ret;
}
-static int
+int
kprintf(const char *fmt, ...)
{
va_list ap;
diff --git a/addr2line.h b/addr2line.h
index 4f6cf179ef..d99f010934 100644
--- a/addr2line.h
+++ b/addr2line.h
@@ -11,7 +11,7 @@
#ifndef RUBY_ADDR2LINE_H
#define RUBY_ADDR2LINE_H
-#if (defined(USE_ELF) || defined(HAVE_MACH_O_LOADER_H))
+#ifdef USE_ELF
void
rb_dump_backtrace_with_lines(int num_traces, void **traces);
diff --git a/appveyor.yml b/appveyor.yml
deleted file mode 100644
index 3bf1568cd9..0000000000
--- a/appveyor.yml
+++ /dev/null
@@ -1,145 +0,0 @@
----
-version: '{build}'
-shallow_clone: true
-platform:
- - x64
-environment:
- ruby_version: "24-%Platform%"
- zlib_version: "1.2.11"
- matrix:
- # to reduce time for finishing all jobs, run the slowest msys2 build first.
- - build: msys2
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
- - build: vs
- vs: 120
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
- - build: vs
- vs: 140
- APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
- GEMS_FOR_TEST: "timezone tzinfo"
-notifications:
- - provider: Webhook
- url:
- secure: iMINHMS0nZabaDsxN9omRDsekxzVvAAzEq5ev7lN6vZ6r9zNhl3/F/7POIVyahAwVFpRDeQT/iUugpAGWmOt3eGL/lZIdqiJFZ9DjPSkP68= # #alerts
- method: POST
- # "icon_url" is the url used by `provider: Slack`
- body: >-
- {{^isPullRequest}}
- {
- "attachments": [
- {
- "title": "Build {{projectName}} {{buildVersion}} {{status}}",
- "fallback": "AppVeyor Build {{projectName}} {{buildVersion}} {{status}}",
- "title_link": "{{buildUrl}}",
- "text": "Commit <{{commitUrl}}|{{commitId}}> by {{commitAuthor}} on {{commitDate}}: _{{commitMessage}}_",
- {{#passed}}
- "color": "#44ee44"
- {{/passed}}
- {{#failed}}
- "color": "#ee4444"
- {{/failed}}
- }
- ],
- "icon_url": "https://slack-files2.s3-us-west-2.amazonaws.com/bot_icons/2018-02-10/314363543719_48.png",
- "username": "AppVeyor CI"
- }
- {{/isPullRequest}}
- on_build_success: false
- on_build_failure: true
- on_build_status_changed: true
-for:
--
- matrix:
- only:
- - build: vs
- install:
- - ver
- - chcp
- - SET BITS=%Platform:x86=32%
- - SET BITS=%BITS:x=%
- - SET OPENSSL_DIR=c:\OpenSSL-Win%BITS%
- - CALL SET vcvars=%%^VS%VS%COMNTOOLS^%%..\..\VC\vcvarsall.bat
- - SET vcvars
- - '"%vcvars%" %Platform:x64=amd64%'
- - SET ruby_path=C:\Ruby%ruby_version:-x86=%
- - SET PATH=\usr\local\bin;%ruby_path%\bin;%PATH%;C:\msys64\mingw64\bin;C:\msys64\usr\bin
- - ruby --version
- - 'cl'
- - echo> Makefile srcdir=.
- - echo>> Makefile MSC_VER=0
- - echo>> Makefile RT=none
- - echo>> Makefile RT_VER=0
- - echo>> Makefile BUILTIN_ENCOBJS=nul
- - type win32\Makefile.sub >> Makefile
- - nmake %mflags% touch-unicode-files
- - nmake %mflags% up incs UNICODE_FILES=.
- - del Makefile
- - mkdir \usr\local\bin
- - mkdir \usr\local\include
- - mkdir \usr\local\lib
- - appveyor DownloadFile https://zlib.net/zlib%zlib_version:.=%.zip
- - 7z x -o%APPVEYOR_BUILD_FOLDER%\ext\zlib zlib%zlib_version:.=%.zip
- - for %%I in (%OPENSSL_DIR%\*.dll) do mklink /h \usr\local\bin\%%~nxI %%I
- - mkdir %Platform%-mswin_%vs%
- - ps: Get-ChildItem "win32" -Recurse | foreach {$_.Attributes = 'Readonly'}
- - ps: Get-Item $env:Platform"-mswin_"$env:vs | foreach {$_.Attributes = 'Normal'}
- build_script:
- - cd %APPVEYOR_BUILD_FOLDER%
- - cd %Platform%-mswin_%vs%
- - ..\win32\configure.bat --without-ext=+,dbm,gdbm,readline --with-opt-dir=/usr/local --with-openssl-dir=%OPENSSL_DIR:\=/%
- - nmake -l
- - nmake install-nodoc
- - \usr\bin\ruby -v -e "p :locale => Encoding.find('locale'), :filesystem => Encoding.find('filesystem')"
- - if not "%GEMS_FOR_TEST%" == "" \usr\bin\gem install --no-document %GEMS_FOR_TEST%
- test_script:
- - set /a JOBS=%NUMBER_OF_PROCESSORS%
- - nmake -l "TESTOPTS=-v -q" btest
- - nmake -l "TESTOPTS=-v -q" test-basic
- - nmake -l "TESTOPTS=-q --subprocess-timeout-scale=3.0 --excludes=../test/excludes/_appveyor -j%JOBS% --exclude win32ole --exclude test_bignum --exclude test_syntax --exclude test_open-uri --exclude test_bundled_ca" test-all
- # separately execute tests without -j which may crash worker with -j.
- - nmake -l "TESTOPTS=-v --subprocess-timeout-scale=3.0 --excludes=../test/excludes/_appveyor" test-all TESTS="../test/win32ole ../test/ruby/test_bignum.rb ../test/ruby/test_syntax.rb ../test/open-uri/test_open-uri.rb ../test/rubygems/test_bundled_ca.rb"
- - nmake -l test-spec MSPECOPT=-fs # not using `-j` because sometimes `mspec -j` silently dies on Windows
--
- matrix:
- only:
- - build: msys2
- install:
- - ver
- - chcp
- - set /a JOBS=%NUMBER_OF_PROCESSORS%
- - set MSYS_NO_PATHCONV=1
- - SET MSYSTEM=%Platform:x86=32%
- - SET MSYSTEM=%MSYSTEM:x=MINGW%
- - SET MSYS2_ARCH=%Platform:x86=i686%
- - SET MSYS2_ARCH=%MSYS2_ARCH:x64=x86_64%
- - set MSYSTEM_PREFIX=/mingw64
- - set MINGW_CHOST=%MSYS2_ARCH%-w64-mingw32
- - SET ruby_path=C:\Ruby%ruby_version:-x86=%
- - cd ..
- - mkdir build
- - mkdir install
- - SET PATH=%ruby_path%\bin;C:\msys64\%MSYSTEM%\bin;C:\msys64\usr\bin;%PATH%
- - ruby --version
- build_script:
- # always update database
- - pacman -Sy
- - pacman -S --noconfirm --needed --noprogressbar mingw-w64-x86_64-toolchain
- - pacman -S --noconfirm --needed --noprogressbar mingw-w64-x86_64-gdbm mingw-w64-x86_64-gmp mingw-w64-x86_64-libffi mingw-w64-x86_64-ncurses mingw-w64-x86_64-readline mingw-w64-x86_64-zlib
- - cd %APPVEYOR_BUILD_FOLDER%
- - set CFLAGS=-march=%MSYS2_ARCH:_=-% -mtune=generic -O3 -pipe
- - set CXXFLAGS=%CFLAGS%
- - set CPPFLAGS=-D_FORTIFY_SOURCE=2 -D__USE_MINGW_ANSI_STDIO=1 -DFD_SETSIZE=2048
- - set LDFLAGS=-pipe
- - sh -c "autoreconf -fi"
- - cd ..\build
- - sh ../ruby/configure --disable-install-doc --prefix=/. --build=%MINGW_CHOST% --host=%MINGW_CHOST% --target=%MINGW_CHOST%
- - mingw32-make -j%JOBS% up
- - mingw32-make -j%JOBS%
- - mingw32-make DESTDIR=../install install-nodoc
- - if not "%GEMS_FOR_TEST%" == "" ..\install\bin\gem install --no-document %GEMS_FOR_TEST%
- test_script:
- - mingw32-make test
- - mingw32-make test-all TESTOPTS="--retry --job-status=normal --show-skip --subprocess-timeout-scale=1.5 --excludes=../ruby/test/excludes/_appveyor -j %JOBS% --exclude win32ole --exclude test_open-uri"
- # separately execute tests without -j which may crash worker with -j.
- - mingw32-make test-all TESTOPTS="--retry --job-status=normal --show-skip --subprocess-timeout-scale=1.5 --excludes=../ruby/test/excludes/_appveyor" TESTS="../ruby/test/win32ole ../ruby/test/open-uri/test_open-uri.rb"
- - mingw32-make test-spec MSPECOPT=-fs # not using `-j` because sometimes `mspec -j` silently dies on Windows
diff --git a/array.c b/array.c
index ec6f232662..dd14837b76 100644
--- a/array.c
+++ b/array.c
@@ -11,29 +11,23 @@
**********************************************************************/
-#include "ruby/encoding.h"
+#include "internal.h"
#include "ruby/util.h"
#include "ruby/st.h"
#include "probes.h"
#include "id.h"
-#include "debug_counter.h"
-#include "gc.h"
-#include "transient_heap.h"
-#include "internal.h"
-#if !ARRAY_DEBUG
+#ifndef ARRAY_DEBUG
# define NDEBUG
#endif
-#include "ruby_assert.h"
+#include <assert.h>
VALUE rb_cArray;
-/* for OPTIMIZED_CMP: */
-#define id_cmp idCmp
+static ID id_cmp, id_div, id_power;
#define ARY_DEFAULT_SIZE 16
#define ARY_MAX_SIZE (LONG_MAX / (int)sizeof(VALUE))
-#define SMALL_ARRAY_LEN 16
# define ARY_SHARED_P(ary) \
(assert(!FL_TEST((ary), ELTS_SHARED) || !FL_TEST((ary), RARRAY_EMBED_FLAG)), \
@@ -44,21 +38,17 @@ VALUE rb_cArray;
#define ARY_HEAP_PTR(a) (assert(!ARY_EMBED_P(a)), RARRAY(a)->as.heap.ptr)
#define ARY_HEAP_LEN(a) (assert(!ARY_EMBED_P(a)), RARRAY(a)->as.heap.len)
-#define ARY_HEAP_CAPA(a) (assert(!ARY_EMBED_P(a)), RARRAY(a)->as.heap.aux.capa)
-
#define ARY_EMBED_PTR(a) (assert(ARY_EMBED_P(a)), RARRAY(a)->as.ary)
#define ARY_EMBED_LEN(a) \
(assert(ARY_EMBED_P(a)), \
(long)((RBASIC(a)->flags >> RARRAY_EMBED_LEN_SHIFT) & \
(RARRAY_EMBED_LEN_MASK >> RARRAY_EMBED_LEN_SHIFT)))
-#define ARY_HEAP_SIZE(a) (assert(!ARY_EMBED_P(a)), assert(ARY_OWNS_HEAP_P(a)), ARY_HEAP_CAPA(a) * sizeof(VALUE))
+#define ARY_HEAP_SIZE(a) (assert(!ARY_EMBED_P(a)), assert(ARY_OWNS_HEAP_P(a)), RARRAY(a)->as.heap.aux.capa * sizeof(VALUE))
#define ARY_OWNS_HEAP_P(a) (!FL_TEST((a), ELTS_SHARED|RARRAY_EMBED_FLAG))
#define FL_SET_EMBED(a) do { \
assert(!ARY_SHARED_P(a)); \
FL_SET((a), RARRAY_EMBED_FLAG); \
- RARY_TRANSIENT_UNSET(a); \
- ary_verify(a); \
} while (0)
#define FL_UNSET_EMBED(ary) FL_UNSET((ary), RARRAY_EMBED_FLAG|RARRAY_EMBED_LEN_MASK)
#define FL_SET_SHARED(ary) do { \
@@ -108,7 +98,7 @@ VALUE rb_cArray;
} while (0)
#define ARY_CAPA(ary) (ARY_EMBED_P(ary) ? RARRAY_EMBED_LEN_MAX : \
- ARY_SHARED_ROOT_P(ary) ? RARRAY_LEN(ary) : ARY_HEAP_CAPA(ary))
+ ARY_SHARED_ROOT_P(ary) ? RARRAY_LEN(ary) : RARRAY(ary)->as.heap.aux.capa)
#define ARY_SET_CAPA(ary, n) do { \
assert(!ARY_EMBED_P(ary)); \
assert(!ARY_SHARED_P(ary)); \
@@ -136,82 +126,11 @@ VALUE rb_cArray;
} while (0)
#define FL_SET_SHARED_ROOT(ary) do { \
assert(!ARY_EMBED_P(ary)); \
- assert(!RARRAY_TRANSIENT_P(ary)); \
FL_SET((ary), RARRAY_SHARED_ROOT_FLAG); \
} while (0)
#define ARY_SET(a, i, v) RARRAY_ASET((assert(!ARY_SHARED_P(a)), (a)), (i), (v))
-
-#if ARRAY_DEBUG
-#define ary_verify(ary) ary_verify_(ary, __FILE__, __LINE__)
-
-static VALUE
-ary_verify_(VALUE ary, const char *file, int line)
-{
- assert(RB_TYPE_P(ary, T_ARRAY));
-
- if (FL_TEST(ary, ELTS_SHARED)) {
- VALUE root = RARRAY(ary)->as.heap.aux.shared;
- const VALUE *ptr = ARY_HEAP_PTR(ary);
- const VALUE *root_ptr = RARRAY_CONST_PTR_TRANSIENT(root);
- long len = ARY_HEAP_LEN(ary), root_len = RARRAY_LEN(root);
- assert(FL_TEST(root, RARRAY_SHARED_ROOT_FLAG));
- assert(root_ptr <= ptr && ptr + len <= root_ptr + root_len);
- ary_verify(root);
- }
- else if (ARY_EMBED_P(ary)) {
- assert(!RARRAY_TRANSIENT_P(ary));
- assert(!ARY_SHARED_P(ary));
- assert(RARRAY_LEN(ary) <= RARRAY_EMBED_LEN_MAX);
- }
- else {
-#if 1
- const VALUE *ptr = RARRAY_CONST_PTR_TRANSIENT(ary);
- long i, len = RARRAY_LEN(ary);
- volatile VALUE v;
- if (len > 1) len = 1; /* check only HEAD */
- for (i=0; i<len; i++) {
- v = ptr[i]; /* access check */
- }
- v = v;
-#endif
- }
-
- if (RARRAY_TRANSIENT_P(ary)) {
- assert(rb_transient_heap_managed_ptr_p(RARRAY_CONST_PTR_TRANSIENT(ary)));
- }
-
- rb_transient_heap_verify();
-
- return ary;
-}
-
-void
-rb_ary_verify(VALUE ary){
- ary_verify(ary);
-}
-#else
-#define ary_verify(ary) ((void)0)
-#endif
-
-VALUE *
-rb_ary_ptr_use_start(VALUE ary)
-{
-#if ARRAY_DEBUG
- FL_SET_RAW(ary, RARRAY_PTR_IN_USE_FLAG);
-#endif
- return (VALUE *)RARRAY_CONST_PTR_TRANSIENT(ary);
-}
-
-void
-rb_ary_ptr_use_end(VALUE ary)
-{
-#if ARRAY_DEBUG
- FL_UNSET_RAW(ary, RARRAY_PTR_IN_USE_FLAG);
-#endif
-}
-
void
rb_mem_clear(register VALUE *mem, register long size)
{
@@ -223,7 +142,7 @@ rb_mem_clear(register VALUE *mem, register long size)
static void
ary_mem_clear(VALUE ary, long beg, long size)
{
- RARRAY_PTR_USE_TRANSIENT(ary, ptr, {
+ RARRAY_PTR_USE(ary, ptr, {
rb_mem_clear(ptr + beg, size);
});
}
@@ -239,7 +158,7 @@ memfill(register VALUE *mem, register long size, register VALUE val)
static void
ary_memfill(VALUE ary, long beg, long size, VALUE val)
{
- RARRAY_PTR_USE_TRANSIENT(ary, ptr, {
+ RARRAY_PTR_USE(ary, ptr, {
memfill(ptr + beg, size, val);
RB_OBJ_WRITTEN(ary, Qundef, val);
});
@@ -248,22 +167,28 @@ ary_memfill(VALUE ary, long beg, long size, VALUE val)
static void
ary_memcpy0(VALUE ary, long beg, long argc, const VALUE *argv, VALUE buff_owner_ary)
{
+#if 1
assert(!ARY_SHARED_P(buff_owner_ary));
if (argc > (int)(128/sizeof(VALUE)) /* is magic number (cache line size) */) {
- rb_gc_writebarrier_remember(buff_owner_ary);
- RARRAY_PTR_USE_TRANSIENT(ary, ptr, {
- MEMCPY(ptr+beg, argv, VALUE, argc);
- });
+ rb_gc_writebarrier_remember(buff_owner_ary);
+ RARRAY_PTR_USE(ary, ptr, {
+ MEMCPY(ptr+beg, argv, VALUE, argc);
+ });
}
else {
- int i;
- RARRAY_PTR_USE_TRANSIENT(ary, ptr, {
- for (i=0; i<argc; i++) {
- RB_OBJ_WRITE(buff_owner_ary, &ptr[i+beg], argv[i]);
- }
- });
+ int i;
+ RARRAY_PTR_USE(ary, ptr, {
+ for (i=0; i<argc; i++) {
+ RB_OBJ_WRITE(buff_owner_ary, &ptr[i+beg], argv[i]);
+ }
+ });
}
+#else
+ /* giveup write barrier (traditional way) */
+ RARRAY_PTR(buff_owner_ary);
+ MEMCPY(RARRAY_PTR(ary)+beg, argv, VALUE, argc);
+#endif
}
static void
@@ -272,175 +197,49 @@ ary_memcpy(VALUE ary, long beg, long argc, const VALUE *argv)
ary_memcpy0(ary, beg, argc, argv, ary);
}
-static VALUE *
-ary_heap_alloc(VALUE ary, size_t capa)
-{
- VALUE *ptr = rb_transient_heap_alloc(ary, sizeof(VALUE) * capa);
-
- if (ptr != NULL) {
- RARY_TRANSIENT_SET(ary);
- }
- else {
- RARY_TRANSIENT_UNSET(ary);
- ptr = ALLOC_N(VALUE, capa);
- }
-
- return ptr;
-}
-
-static void
-ary_heap_free_ptr(VALUE ary, const VALUE *ptr, long size)
-{
- if (RARRAY_TRANSIENT_P(ary)) {
- /* ignore it */
- }
- else {
- ruby_sized_xfree((void *)ptr, size);
- }
-}
-
-static void
-ary_heap_free(VALUE ary)
-{
- if (RARRAY_TRANSIENT_P(ary)) {
- RARY_TRANSIENT_UNSET(ary);
- }
- else {
- ary_heap_free_ptr(ary, ARY_HEAP_PTR(ary), ARY_HEAP_SIZE(ary));
- }
-}
-
-static void
-ary_heap_realloc(VALUE ary, size_t new_capa)
-{
- size_t old_capa = ARY_HEAP_CAPA(ary);
-
- if (RARRAY_TRANSIENT_P(ary)) {
- if (new_capa <= old_capa) {
- /* do nothing */
- }
- else {
- VALUE *new_ptr = rb_transient_heap_alloc(ary, sizeof(VALUE) * new_capa);
-
- if (new_ptr == NULL) {
- new_ptr = ALLOC_N(VALUE, new_capa);
- RARY_TRANSIENT_UNSET(ary);
- }
-
- MEMCPY(new_ptr, ARY_HEAP_PTR(ary), VALUE, old_capa);
- ARY_SET_PTR(ary, new_ptr);
- }
- }
- else {
- SIZED_REALLOC_N(RARRAY(ary)->as.heap.ptr, VALUE, new_capa, old_capa);
- }
- ary_verify(ary);
-}
-
-#if USE_TRANSIENT_HEAP
-static inline void
-rb_ary_transient_heap_evacuate_(VALUE ary, int transient, int promote)
-{
- if (transient) {
- VALUE *new_ptr;
- const VALUE *old_ptr = ARY_HEAP_PTR(ary);
- long capa = ARY_HEAP_CAPA(ary);
- long len = ARY_HEAP_LEN(ary);
-
- if (ARY_SHARED_ROOT_P(ary)) {
- capa = len;
- }
-
- assert(ARY_OWNS_HEAP_P(ary));
- assert(RARRAY_TRANSIENT_P(ary));
- assert(!ARY_PTR_USING_P(ary));
-
- if (promote) {
- new_ptr = ALLOC_N(VALUE, capa);
- RARY_TRANSIENT_UNSET(ary);
- }
- else {
- new_ptr = ary_heap_alloc(ary, capa);
- }
-
- MEMCPY(new_ptr, old_ptr, VALUE, capa);
- /* do not use ARY_SET_PTR() because they assert !frozen */
- RARRAY(ary)->as.heap.ptr = new_ptr;
- }
-
- ary_verify(ary);
-}
-
-void
-rb_ary_transient_heap_evacuate(VALUE ary, int promote)
-{
- rb_ary_transient_heap_evacuate_(ary, RARRAY_TRANSIENT_P(ary), promote);
-}
-
-void
-rb_ary_detransient(VALUE ary)
-{
- assert(RARRAY_TRANSIENT_P(ary));
- rb_ary_transient_heap_evacuate_(ary, TRUE, TRUE);
-}
-#else
-void
-rb_ary_detransient(VALUE ary)
-{
- /* do nothing */
-}
-#endif
-
static void
ary_resize_capa(VALUE ary, long capacity)
{
assert(RARRAY_LEN(ary) <= capacity);
assert(!OBJ_FROZEN(ary));
assert(!ARY_SHARED_P(ary));
-
if (capacity > RARRAY_EMBED_LEN_MAX) {
if (ARY_EMBED_P(ary)) {
long len = ARY_EMBED_LEN(ary);
- VALUE *ptr = ary_heap_alloc(ary, capacity);
-
+ VALUE *ptr = ALLOC_N(VALUE, (capacity));
MEMCPY(ptr, ARY_EMBED_PTR(ary), VALUE, len);
FL_UNSET_EMBED(ary);
ARY_SET_PTR(ary, ptr);
ARY_SET_HEAP_LEN(ary, len);
}
else {
- ary_heap_realloc(ary, capacity);
+ SIZED_REALLOC_N(RARRAY(ary)->as.heap.ptr, VALUE, capacity, RARRAY(ary)->as.heap.aux.capa);
}
- ARY_SET_CAPA(ary, capacity);
+ ARY_SET_CAPA(ary, (capacity));
}
else {
if (!ARY_EMBED_P(ary)) {
- long len = ARY_HEAP_LEN(ary);
- long old_capa = ARY_HEAP_CAPA(ary);
- const VALUE *ptr = ARY_HEAP_PTR(ary);
+ long len = RARRAY_LEN(ary);
+ const VALUE *ptr = RARRAY_CONST_PTR(ary);
- if (len > capacity) len = capacity;
+ if (len > capacity) len = capacity;
MEMCPY((VALUE *)RARRAY(ary)->as.ary, ptr, VALUE, len);
- ary_heap_free_ptr(ary, ptr, old_capa);
-
FL_SET_EMBED(ary);
ARY_SET_LEN(ary, len);
+ ruby_xfree((VALUE *)ptr);
}
}
-
- ary_verify(ary);
}
static inline void
ary_shrink_capa(VALUE ary)
{
long capacity = ARY_HEAP_LEN(ary);
- long old_capa = ARY_HEAP_CAPA(ary);
+ long old_capa = RARRAY(ary)->as.heap.aux.capa;
assert(!ARY_SHARED_P(ary));
assert(old_capa >= capacity);
- if (old_capa > capacity) ary_heap_realloc(ary, capacity);
-
- ary_verify(ary);
+ if (old_capa > capacity)
+ REALLOC_N(RARRAY(ary)->as.heap.ptr, VALUE, capacity);
}
static void
@@ -456,8 +255,6 @@ ary_double_capa(VALUE ary, long min)
}
new_capa += min;
ary_resize_capa(ary, new_capa);
-
- ary_verify(ary);
}
static void
@@ -513,7 +310,6 @@ static inline void
rb_ary_modify_check(VALUE ary)
{
rb_check_frozen(ary);
- ary_verify(ary);
}
void
@@ -523,9 +319,6 @@ rb_ary_modify(VALUE ary)
if (ARY_SHARED_P(ary)) {
long shared_len, len = RARRAY_LEN(ary);
VALUE shared = ARY_SHARED(ary);
-
- ary_verify(shared);
-
if (len <= RARRAY_EMBED_LEN_MAX) {
const VALUE *ptr = ARY_HEAP_PTR(ary);
FL_UNSET_SHARED(ary);
@@ -535,19 +328,19 @@ rb_ary_modify(VALUE ary)
ARY_SET_EMBED_LEN(ary, len);
}
else if (ARY_SHARED_OCCUPIED(shared) && len > ((shared_len = RARRAY_LEN(shared))>>1)) {
- long shift = RARRAY_CONST_PTR_TRANSIENT(ary) - RARRAY_CONST_PTR_TRANSIENT(shared);
+ long shift = RARRAY_CONST_PTR(ary) - RARRAY_CONST_PTR(shared);
FL_UNSET_SHARED(ary);
- ARY_SET_PTR(ary, RARRAY_CONST_PTR_TRANSIENT(shared));
+ ARY_SET_PTR(ary, RARRAY_CONST_PTR(shared));
ARY_SET_CAPA(ary, shared_len);
- RARRAY_PTR_USE_TRANSIENT(ary, ptr, {
+ RARRAY_PTR_USE(ary, ptr, {
MEMMOVE(ptr, ptr+shift, VALUE, len);
});
FL_SET_EMBED(shared);
rb_ary_decrement_share(shared);
}
else {
- VALUE *ptr = ary_heap_alloc(ary, len);
- MEMCPY(ptr, ARY_HEAP_PTR(ary), VALUE, len);
+ VALUE *ptr = ALLOC_N(VALUE, len);
+ MEMCPY(ptr, RARRAY_CONST_PTR(ary), VALUE, len);
rb_ary_unshare(ary);
ARY_SET_CAPA(ary, len);
ARY_SET_PTR(ary, ptr);
@@ -555,7 +348,6 @@ rb_ary_modify(VALUE ary)
rb_gc_writebarrier_remember(ary);
}
- ary_verify(ary);
}
static VALUE
@@ -572,12 +364,9 @@ ary_ensure_room_for_push(VALUE ary, long add_len)
if (new_len > RARRAY_EMBED_LEN_MAX) {
VALUE shared = ARY_SHARED(ary);
if (ARY_SHARED_OCCUPIED(shared)) {
- if (ARY_HEAP_PTR(ary) - RARRAY_CONST_PTR_TRANSIENT(shared) + new_len <= RARRAY_LEN(shared)) {
+ if (RARRAY_CONST_PTR(ary) - RARRAY_CONST_PTR(shared) + new_len <= RARRAY_LEN(shared)) {
rb_ary_modify_check(ary);
-
- ary_verify(ary);
- ary_verify(shared);
- return shared;
+ return shared;
}
else {
/* if array is shared, then it is likely it participate in push/shift pattern */
@@ -586,23 +375,17 @@ ary_ensure_room_for_push(VALUE ary, long add_len)
if (new_len > capa - (capa >> 6)) {
ary_double_capa(ary, new_len);
}
- ary_verify(ary);
return ary;
}
}
}
- ary_verify(ary);
- rb_ary_modify(ary);
- }
- else {
- rb_ary_modify_check(ary);
}
+ rb_ary_modify(ary);
capa = ARY_CAPA(ary);
if (new_len > capa) {
ary_double_capa(ary, new_len);
}
- ary_verify(ary);
return ary;
}
@@ -622,6 +405,21 @@ rb_ary_freeze(VALUE ary)
return rb_obj_freeze(ary);
}
+/*
+ * call-seq:
+ * ary.frozen? -> true or false
+ *
+ * Return +true+ if this array is frozen (or temporarily frozen
+ * while being sorted). See also Object#frozen?
+ */
+
+static VALUE
+rb_ary_frozen_p(VALUE ary)
+{
+ if (OBJ_FROZEN(ary)) return Qtrue;
+ return Qfalse;
+}
+
/* This can be used to take a snapshot of an array (with
e.g. rb_ary_replace) and check later whether the array has been
modified from the snapshot. The snapshot is cheap, though if
@@ -675,7 +473,7 @@ ary_new(VALUE klass, long capa)
ary = ary_alloc(klass);
if (capa > RARRAY_EMBED_LEN_MAX) {
- ptr = ary_heap_alloc(ary, capa);
+ ptr = ALLOC_N(VALUE, capa);
FL_UNSET_EMBED(ary);
ARY_SET_PTR(ary, ptr);
ARY_SET_CAPA(ary, capa);
@@ -716,12 +514,12 @@ VALUE
return ary;
}
-MJIT_FUNC_EXPORTED VALUE
-rb_ary_tmp_new_from_values(VALUE klass, long n, const VALUE *elts)
+VALUE
+rb_ary_new_from_values(long n, const VALUE *elts)
{
VALUE ary;
- ary = ary_new(klass, n);
+ ary = rb_ary_new2(n);
if (n > 0 && elts) {
ary_memcpy(ary, 0, n, elts);
ARY_SET_LEN(ary, n);
@@ -731,17 +529,9 @@ rb_ary_tmp_new_from_values(VALUE klass, long n, const VALUE *elts)
}
VALUE
-rb_ary_new_from_values(long n, const VALUE *elts)
-{
- return rb_ary_tmp_new_from_values(rb_cArray, n, elts);
-}
-
-VALUE
rb_ary_tmp_new(long capa)
{
- VALUE ary = ary_new(0, capa);
- rb_ary_transient_heap_evacuate(ary, TRUE);
- return ary;
+ return ary_new(0, capa);
}
VALUE
@@ -750,7 +540,6 @@ rb_ary_tmp_new_fill(long capa)
VALUE ary = ary_new(0, capa);
ary_memfill(ary, 0, capa, Qnil);
ARY_SET_LEN(ary, capa);
- rb_ary_transient_heap_evacuate(ary, TRUE);
return ary;
}
@@ -758,16 +547,7 @@ void
rb_ary_free(VALUE ary)
{
if (ARY_OWNS_HEAP_P(ary)) {
- if (RARRAY_TRANSIENT_P(ary)) {
- RB_DEBUG_COUNTER_INC(obj_ary_transient);
- }
- else {
- RB_DEBUG_COUNTER_INC(obj_ary_ptr);
- ary_heap_free(ary);
- }
- }
- else {
- RB_DEBUG_COUNTER_INC(obj_ary_embed);
+ ruby_sized_xfree((void *)ARY_HEAP_PTR(ary), ARY_HEAP_SIZE(ary));
}
}
@@ -775,7 +555,7 @@ RUBY_FUNC_EXPORTED size_t
rb_ary_memsize(VALUE ary)
{
if (ARY_OWNS_HEAP_P(ary)) {
- return ARY_CAPA(ary) * sizeof(VALUE);
+ return RARRAY(ary)->as.heap.aux.capa * sizeof(VALUE);
}
else {
return 0;
@@ -787,15 +567,13 @@ ary_discard(VALUE ary)
{
rb_ary_free(ary);
RBASIC(ary)->flags |= RARRAY_EMBED_FLAG;
- RBASIC(ary)->flags &= ~(RARRAY_EMBED_LEN_MASK | RARRAY_TRANSIENT_FLAG);
+ RBASIC(ary)->flags &= ~RARRAY_EMBED_LEN_MASK;
}
static VALUE
ary_make_shared(VALUE ary)
{
assert(!ARY_EMBED_P(ary));
- ary_verify(ary);
-
if (ARY_SHARED_P(ary)) {
return ARY_SHARED(ary);
}
@@ -803,7 +581,6 @@ ary_make_shared(VALUE ary)
return ary;
}
else if (OBJ_FROZEN(ary)) {
- rb_ary_transient_heap_evacuate(ary, TRUE);
ary_shrink_capa(ary);
FL_SET_SHARED_ROOT(ary);
ARY_SET_SHARED_NUM(ary, 1);
@@ -811,25 +588,18 @@ ary_make_shared(VALUE ary)
}
else {
long capa = ARY_CAPA(ary), len = RARRAY_LEN(ary);
- const VALUE *ptr;
NEWOBJ_OF(shared, struct RArray, 0, T_ARRAY | (RGENGC_WB_PROTECTED_ARRAY ? FL_WB_PROTECTED : 0));
-
- rb_ary_transient_heap_evacuate(ary, TRUE);
- ptr = ARY_HEAP_PTR(ary);
-
FL_UNSET_EMBED(shared);
+
ARY_SET_LEN((VALUE)shared, capa);
- ARY_SET_PTR((VALUE)shared, ptr);
- ary_mem_clear((VALUE)shared, len, capa - len);
+ ARY_SET_PTR((VALUE)shared, RARRAY_CONST_PTR(ary));
+ ary_mem_clear((VALUE)shared, len, capa - len);
FL_SET_SHARED_ROOT(shared);
ARY_SET_SHARED_NUM((VALUE)shared, 1);
FL_SET_SHARED(ary);
ARY_SET_SHARED(ary, (VALUE)shared);
OBJ_FREEZE(shared);
-
- ary_verify((VALUE)shared);
- ary_verify(ary);
- return (VALUE)shared;
+ return (VALUE)shared;
}
}
@@ -840,7 +610,7 @@ ary_make_substitution(VALUE ary)
if (len <= RARRAY_EMBED_LEN_MAX) {
VALUE subst = rb_ary_new2(len);
- ary_memcpy(subst, 0, len, RARRAY_CONST_PTR_TRANSIENT(ary));
+ ary_memcpy(subst, 0, len, RARRAY_CONST_PTR(ary));
ARY_SET_EMBED_LEN(subst, len);
return subst;
}
@@ -855,23 +625,16 @@ rb_assoc_new(VALUE car, VALUE cdr)
return rb_ary_new3(2, car, cdr);
}
-VALUE
-rb_to_array_type(VALUE ary)
+static VALUE
+to_ary(VALUE ary)
{
- return rb_convert_type_with_id(ary, T_ARRAY, "Array", idTo_ary);
+ return rb_convert_type(ary, T_ARRAY, "Array", "to_ary");
}
-#define to_ary rb_to_array_type
VALUE
rb_check_array_type(VALUE ary)
{
- return rb_check_convert_type_with_id(ary, T_ARRAY, "Array", idTo_ary);
-}
-
-MJIT_FUNC_EXPORTED VALUE
-rb_check_to_array(VALUE ary)
-{
- return rb_check_convert_type_with_id(ary, T_ARRAY, "Array", idTo_a);
+ return rb_check_convert_type(ary, T_ARRAY, "Array", "to_ary");
}
/*
@@ -925,7 +688,7 @@ rb_ary_s_try_convert(VALUE dummy, VALUE ary)
* this array is created by passing the element's index to the given block
* and storing the return value.
*
- * Array.new(3) {|index| index ** 2}
+ * Array.new(3){ |index| index ** 2 }
* # => [0, 1, 4]
*
* == Common gotchas
@@ -949,7 +712,7 @@ rb_ary_s_try_convert(VALUE dummy, VALUE ary)
* version which uses the result of that block each time an element
* of the array needs to be initialized:
*
- * a = Array.new(2) {Hash.new}
+ * a = Array.new(2) { Hash.new }
* a[0]['cat'] = 'feline'
* a # => [{"cat"=>"feline"}, {}]
*
@@ -963,8 +726,8 @@ rb_ary_initialize(int argc, VALUE *argv, VALUE ary)
rb_ary_modify(ary);
if (argc == 0) {
- if (ARY_OWNS_HEAP_P(ary) && ARY_HEAP_PTR(ary) != NULL) {
- ary_heap_free(ary);
+ if (ARY_OWNS_HEAP_P(ary) && RARRAY_CONST_PTR(ary) != 0) {
+ ruby_sized_xfree((void *)RARRAY_CONST_PTR(ary), ARY_HEAP_SIZE(ary));
}
rb_ary_unshare_safe(ary);
FL_SET_EMBED(ary);
@@ -1015,7 +778,7 @@ rb_ary_initialize(int argc, VALUE *argv, VALUE ary)
/*
* Returns a new array populated with the given objects.
*
- * Array.[]( 1, 'a', /^A/) # => [1, "a", /^A/]
+ * Array.[]( 1, 'a', /^A/ ) # => [1, "a", /^A/]
* Array[ 1, 'a', /^A/ ] # => [1, "a", /^A/]
* [ 1, 'a', /^A/ ] # => [1, "a", /^A/]
*/
@@ -1071,7 +834,7 @@ ary_make_partial(VALUE ary, VALUE klass, long offset, long len)
if (len <= RARRAY_EMBED_LEN_MAX) {
VALUE result = ary_alloc(klass);
- ary_memcpy(result, 0, len, RARRAY_CONST_PTR_TRANSIENT(ary) + offset);
+ ary_memcpy(result, 0, len, RARRAY_CONST_PTR(ary) + offset);
ARY_SET_EMBED_LEN(result, len);
return result;
}
@@ -1080,15 +843,12 @@ ary_make_partial(VALUE ary, VALUE klass, long offset, long len)
FL_UNSET_EMBED(result);
shared = ary_make_shared(ary);
- ARY_SET_PTR(result, RARRAY_CONST_PTR_TRANSIENT(ary));
+ ARY_SET_PTR(result, RARRAY_CONST_PTR(ary));
ARY_SET_LEN(result, RARRAY_LEN(ary));
rb_ary_set_shared(result, shared);
ARY_INCREASE_PTR(result, offset);
ARY_SET_LEN(result, len);
-
- ary_verify(shared);
- ary_verify(result);
return result;
}
}
@@ -1108,17 +868,13 @@ enum ary_take_pos_flags
static VALUE
ary_take_first_or_last(int argc, const VALUE *argv, VALUE ary, enum ary_take_pos_flags last)
{
+ VALUE nv;
long n;
long len;
long offset = 0;
- argc = rb_check_arity(argc, 0, 1);
- /* the case optional argument is ommited should be handled in
- * callers of this function. if another arity case is added,
- * this arity check needs to rewrite. */
- RUBY_ASSERT_WHEN(TRUE, argc == 1);
-
- n = NUM2LONG(argv[0]);
+ rb_scan_args(argc, argv, "1", &nv);
+ n = NUM2LONG(nv);
len = RARRAY_LEN(ary);
if (n > len) {
n = len;
@@ -1140,10 +896,7 @@ ary_take_first_or_last(int argc, const VALUE *argv, VALUE ary, enum ary_take_pos
* expression returns the array itself, so several appends
* may be chained together.
*
- * a = [ 1, 2 ]
- * a << "c" << "d" << [ 3, 4 ]
- * #=> [ 1, 2, "c", "d", [ 3, 4 ] ]
- * a
+ * [ 1, 2 ] << "c" << "d" << [ 3, 4 ]
* #=> [ 1, 2, "c", "d", [ 3, 4 ] ]
*
*/
@@ -1151,13 +904,12 @@ ary_take_first_or_last(int argc, const VALUE *argv, VALUE ary, enum ary_take_pos
VALUE
rb_ary_push(VALUE ary, VALUE item)
{
- long idx = RARRAY_LEN((ary_verify(ary), ary));
+ long idx = RARRAY_LEN(ary);
VALUE target_ary = ary_ensure_room_for_push(ary, 1);
- RARRAY_PTR_USE_TRANSIENT(ary, ptr, {
+ RARRAY_PTR_USE(ary, ptr, {
RB_OBJ_WRITE(target_ary, &ptr[idx], item);
});
ARY_SET_LEN(ary, idx + 1);
- ary_verify(ary);
return ary;
}
@@ -1173,8 +925,7 @@ rb_ary_cat(VALUE ary, const VALUE *argv, long len)
/*
* call-seq:
- * ary.push(obj, ...) -> ary
- * ary.append(obj, ...) -> ary
+ * ary.push(obj, ... ) -> ary
*
* Append --- Pushes the given object(s) on to the end of this array. This
* expression returns the array itself, so several appends
@@ -1184,7 +935,7 @@ rb_ary_cat(VALUE ary, const VALUE *argv, long len)
* a = [ "a", "b", "c" ]
* a.push("d", "e", "f")
* #=> ["a", "b", "c", "d", "e", "f"]
- * [1, 2, 3].push(4).push(5)
+ * [1, 2, 3,].push(4).push(5)
* #=> [1, 2, 3, 4, 5]
*/
@@ -1209,7 +960,6 @@ rb_ary_pop(VALUE ary)
}
--n;
ARY_SET_LEN(ary, n);
- ary_verify(ary);
return RARRAY_AREF(ary, n);
}
@@ -1243,7 +993,6 @@ rb_ary_pop_m(int argc, VALUE *argv, VALUE ary)
rb_ary_modify_check(ary);
result = ary_take_first_or_last(argc, argv, ary, ARY_TAKE_LAST);
ARY_INCREASE_LEN(ary, -RARRAY_LEN(result));
- ary_verify(ary);
return result;
}
@@ -1258,11 +1007,10 @@ rb_ary_shift(VALUE ary)
top = RARRAY_AREF(ary, 0);
if (!ARY_SHARED_P(ary)) {
if (len < ARY_DEFAULT_SIZE) {
- RARRAY_PTR_USE_TRANSIENT(ary, ptr, {
+ RARRAY_PTR_USE(ary, ptr, {
MEMMOVE(ptr, ptr+1, VALUE, len-1);
}); /* WB: no new reference */
ARY_INCREASE_LEN(ary, -1);
- ary_verify(ary);
return top;
}
assert(!ARY_EMBED_P(ary)); /* ARY_EMBED_LEN_MAX < ARY_DEFAULT_SIZE */
@@ -1271,13 +1019,11 @@ rb_ary_shift(VALUE ary)
ary_make_shared(ary);
}
else if (ARY_SHARED_OCCUPIED(ARY_SHARED(ary))) {
- RARRAY_PTR_USE_TRANSIENT(ary, ptr, ptr[0] = Qnil);
+ RARRAY_PTR_USE(ary, ptr, ptr[0] = Qnil);
}
ARY_INCREASE_PTR(ary, 1); /* shift ptr */
ARY_INCREASE_LEN(ary, -1);
- ary_verify(ary);
-
return top;
}
@@ -1317,17 +1063,6 @@ rb_ary_shift_m(int argc, VALUE *argv, VALUE ary)
rb_ary_modify_check(ary);
result = ary_take_first_or_last(argc, argv, ary, ARY_TAKE_FIRST);
n = RARRAY_LEN(result);
- rb_ary_behead(ary,n);
-
- return result;
-}
-
-MJIT_FUNC_EXPORTED VALUE
-rb_ary_behead(VALUE ary, long n)
-{
- if(n<=0) return ary;
-
- rb_ary_modify_check(ary);
if (ARY_SHARED_P(ary)) {
if (ARY_SHARED_OCCUPIED(ARY_SHARED(ary))) {
setup_occupied_shared:
@@ -1337,8 +1072,8 @@ rb_ary_behead(VALUE ary, long n)
}
else {
if (RARRAY_LEN(ary) < ARY_DEFAULT_SIZE) {
- RARRAY_PTR_USE_TRANSIENT(ary, ptr, {
- MEMMOVE(ptr, ptr+n, VALUE, RARRAY_LEN(ary)-n);
+ RARRAY_PTR_USE(ary, ptr, {
+ MEMMOVE(ptr, ptr+n, VALUE, RARRAY_LEN(ary)-n);
}); /* WB: no new reference */
}
else {
@@ -1348,8 +1083,7 @@ rb_ary_behead(VALUE ary, long n)
}
ARY_INCREASE_LEN(ary, -n);
- ary_verify(ary);
- return ary;
+ return result;
}
static VALUE
@@ -1368,9 +1102,8 @@ ary_ensure_room_for_unshift(VALUE ary, int argc)
VALUE shared = ARY_SHARED(ary);
capa = RARRAY_LEN(shared);
if (ARY_SHARED_OCCUPIED(shared) && capa > new_len) {
- rb_ary_modify_check(ary);
- head = RARRAY_CONST_PTR_TRANSIENT(ary);
- sharedp = RARRAY_CONST_PTR_TRANSIENT(shared);
+ head = RARRAY_CONST_PTR(ary);
+ sharedp = RARRAY_CONST_PTR(shared);
goto makeroom_if_need;
}
}
@@ -1383,13 +1116,11 @@ ary_ensure_room_for_unshift(VALUE ary, int argc)
/* use shared array for big "queues" */
if (new_len > ARY_DEFAULT_SIZE * 4) {
- ary_verify(ary);
-
- /* make a room for unshifted items */
+ /* make a room for unshifted items */
capa = ARY_CAPA(ary);
ary_make_shared(ary);
- head = sharedp = RARRAY_CONST_PTR_TRANSIENT(ary);
+ head = sharedp = RARRAY_CONST_PTR(ary);
goto makeroom;
makeroom_if_need:
if (head - sharedp < argc) {
@@ -1402,17 +1133,14 @@ ary_ensure_room_for_unshift(VALUE ary, int argc)
}
ARY_SET_PTR(ary, head - argc);
assert(ARY_SHARED_OCCUPIED(ARY_SHARED(ary)));
-
- ary_verify(ary);
return ARY_SHARED(ary);
}
else {
/* sliding items */
- RARRAY_PTR_USE_TRANSIENT(ary, ptr, {
+ RARRAY_PTR_USE(ary, ptr, {
MEMMOVE(ptr + argc, ptr, VALUE, len);
});
- ary_verify(ary);
return ary;
}
}
@@ -1420,7 +1148,6 @@ ary_ensure_room_for_unshift(VALUE ary, int argc)
/*
* call-seq:
* ary.unshift(obj, ...) -> ary
- * ary.prepend(obj, ...) -> ary
*
* Prepends objects to the front of +self+, moving other elements upwards.
* See also Array#shift for the opposite effect.
@@ -1468,7 +1195,10 @@ rb_ary_elt(VALUE ary, long offset)
VALUE
rb_ary_entry(VALUE ary, long offset)
{
- return rb_ary_entry_internal(ary, offset);
+ if (offset < 0) {
+ offset += RARRAY_LEN(ary);
+ }
+ return rb_ary_elt(ary, offset);
}
VALUE
@@ -1528,29 +1258,21 @@ rb_ary_subseq(VALUE ary, long beg, long len)
VALUE
rb_ary_aref(int argc, const VALUE *argv, VALUE ary)
{
- rb_check_arity(argc, 1, 2);
+ VALUE arg;
+ long beg, len;
+
if (argc == 2) {
- return rb_ary_aref2(ary, argv[0], argv[1]);
+ beg = NUM2LONG(argv[0]);
+ len = NUM2LONG(argv[1]);
+ if (beg < 0) {
+ beg += RARRAY_LEN(ary);
+ }
+ return rb_ary_subseq(ary, beg, len);
}
- return rb_ary_aref1(ary, argv[0]);
-}
-
-VALUE
-rb_ary_aref2(VALUE ary, VALUE b, VALUE e)
-{
- long beg = NUM2LONG(b);
- long len = NUM2LONG(e);
- if (beg < 0) {
- beg += RARRAY_LEN(ary);
+ if (argc != 1) {
+ rb_scan_args(argc, argv, "11", NULL, NULL);
}
- return rb_ary_subseq(ary, beg, len);
-}
-
-MJIT_FUNC_EXPORTED VALUE
-rb_ary_aref1(VALUE ary, VALUE arg)
-{
- long beg, len;
-
+ arg = argv[0];
/* special case - speeding up */
if (FIXNUM_P(arg)) {
return rb_ary_entry(ary, FIX2LONG(arg));
@@ -1645,7 +1367,7 @@ rb_ary_last(int argc, const VALUE *argv, VALUE ary)
* call-seq:
* ary.fetch(index) -> obj
* ary.fetch(index, default) -> obj
- * ary.fetch(index) {|index| block} -> obj
+ * ary.fetch(index) { |index| block } -> obj
*
* Tries to return the element at position +index+, but throws an IndexError
* exception if the referenced +index+ lies outside of the array bounds. This
@@ -1653,15 +1375,14 @@ rb_ary_last(int argc, const VALUE *argv, VALUE ary)
* +default+ value.
*
* Alternatively, if a block is given it will only be executed when an
- * invalid +index+ is referenced.
- *
- * Negative values of +index+ count from the end of the array.
+ * invalid +index+ is referenced. Negative values of +index+ count from the
+ * end of the array.
*
* a = [ 11, 22, 33, 44 ]
* a.fetch(1) #=> 22
* a.fetch(-1) #=> 44
* a.fetch(4, 'cat') #=> "cat"
- * a.fetch(100) {|i| puts "#{i} is out of bounds"}
+ * a.fetch(100) { |i| puts "#{i} is out of bounds" }
* #=> "100 is out of bounds"
*/
@@ -1696,10 +1417,10 @@ rb_ary_fetch(int argc, VALUE *argv, VALUE ary)
/*
* call-seq:
* ary.find_index(obj) -> int or nil
- * ary.find_index {|item| block} -> int or nil
+ * ary.find_index { |item| block } -> int or nil
* ary.find_index -> Enumerator
* ary.index(obj) -> int or nil
- * ary.index {|item| block} -> int or nil
+ * ary.index { |item| block } -> int or nil
* ary.index -> Enumerator
*
* Returns the _index_ of the first object in +ary+ such that the object is
@@ -1716,14 +1437,15 @@ rb_ary_fetch(int argc, VALUE *argv, VALUE ary)
* a = [ "a", "b", "c" ]
* a.index("b") #=> 1
* a.index("z") #=> nil
- * a.index {|x| x == "b"} #=> 1
+ * a.index { |x| x == "b" } #=> 1
*/
static VALUE
rb_ary_index(int argc, VALUE *argv, VALUE ary)
{
+ const VALUE *ptr;
VALUE val;
- long i;
+ long i, len;
if (argc == 0) {
RETURN_ENUMERATOR(ary, 0, 0);
@@ -1738,11 +1460,20 @@ rb_ary_index(int argc, VALUE *argv, VALUE ary)
val = argv[0];
if (rb_block_given_p())
rb_warn("given block not used");
- for (i=0; i<RARRAY_LEN(ary); i++) {
- VALUE e = RARRAY_AREF(ary, i);
- if (rb_equal(e, val)) {
+ len = RARRAY_LEN(ary);
+ ptr = RARRAY_CONST_PTR(ary);
+ for (i=0; i<len; i++) {
+ VALUE e = ptr[i];
+ switch (rb_equal_opt(e, val)) {
+ case Qundef:
+ if (!rb_equal(e, val)) break;
+ case Qtrue:
return LONG2NUM(i);
+ case Qfalse:
+ continue;
}
+ len = RARRAY_LEN(ary);
+ ptr = RARRAY_CONST_PTR(ary);
}
return Qnil;
}
@@ -1750,7 +1481,7 @@ rb_ary_index(int argc, VALUE *argv, VALUE ary)
/*
* call-seq:
* ary.rindex(obj) -> int or nil
- * ary.rindex {|item| block} -> int or nil
+ * ary.rindex { |item| block } -> int or nil
* ary.rindex -> Enumerator
*
* Returns the _index_ of the last object in +self+ <code>==</code> to +obj+.
@@ -1768,12 +1499,13 @@ rb_ary_index(int argc, VALUE *argv, VALUE ary)
* a = [ "a", "b", "b", "b", "c" ]
* a.rindex("b") #=> 3
* a.rindex("z") #=> nil
- * a.rindex {|x| x == "b"} #=> 3
+ * a.rindex { |x| x == "b" } #=> 3
*/
static VALUE
rb_ary_rindex(int argc, VALUE *argv, VALUE ary)
{
+ const VALUE *ptr;
VALUE val;
long i = RARRAY_LEN(ary), len;
@@ -1792,11 +1524,21 @@ rb_ary_rindex(int argc, VALUE *argv, VALUE ary)
val = argv[0];
if (rb_block_given_p())
rb_warn("given block not used");
+ ptr = RARRAY_CONST_PTR(ary);
while (i--) {
- VALUE e = RARRAY_AREF(ary, i);
- if (rb_equal(e, val)) {
+ VALUE e = ptr[i];
+ switch (rb_equal_opt(e, val)) {
+ case Qundef:
+ if (!rb_equal(e, val)) break;
+ case Qtrue:
return LONG2NUM(i);
+ case Qfalse:
+ continue;
}
+ if (i > (len = RARRAY_LEN(ary))) {
+ i = len;
+ }
+ ptr = RARRAY_CONST_PTR(ary);
}
return Qnil;
}
@@ -1811,10 +1553,10 @@ rb_ary_to_ary(VALUE obj)
}
static void
-rb_ary_splice(VALUE ary, long beg, long len, const VALUE *rptr, long rlen)
+rb_ary_splice(VALUE ary, long beg, long len, VALUE rpl)
{
+ long rlen;
long olen;
- long rofs;
if (len < 0) rb_raise(rb_eIndexError, "negative length (%ld)", len);
olen = RARRAY_LEN(ary);
@@ -1829,11 +1571,14 @@ rb_ary_splice(VALUE ary, long beg, long len, const VALUE *rptr, long rlen)
len = olen - beg;
}
- {
- const VALUE *optr = RARRAY_CONST_PTR_TRANSIENT(ary);
- rofs = (rptr >= optr && rptr < optr + olen) ? rptr - optr : -1;
+ if (rpl == Qundef) {
+ rlen = 0;
+ }
+ else {
+ rpl = rb_ary_to_ary(rpl);
+ rlen = RARRAY_LEN(rpl);
+ olen = RARRAY_LEN(ary); /* ary may be resized in rpl.to_ary too */
}
-
if (beg >= olen) {
VALUE target_ary;
if (beg > ARY_MAX_SIZE - rlen) {
@@ -1843,8 +1588,7 @@ rb_ary_splice(VALUE ary, long beg, long len, const VALUE *rptr, long rlen)
len = beg + rlen;
ary_mem_clear(ary, olen, beg - olen);
if (rlen > 0) {
- if (rofs != -1) rptr = RARRAY_CONST_PTR_TRANSIENT(ary) + rofs;
- ary_memcpy0(ary, beg, rlen, rptr, target_ary);
+ ary_memcpy0(ary, beg, rlen, RARRAY_CONST_PTR(rpl), target_ary);
}
ARY_SET_LEN(ary, len);
}
@@ -1861,23 +1605,16 @@ rb_ary_splice(VALUE ary, long beg, long len, const VALUE *rptr, long rlen)
}
if (len != rlen) {
- RARRAY_PTR_USE_TRANSIENT(ary, ptr,
- MEMMOVE(ptr + beg + rlen, ptr + beg + len,
- VALUE, olen - (beg + len)));
+ RARRAY_PTR_USE(ary, ptr,
+ MEMMOVE(ptr + beg + rlen, ptr + beg + len,
+ VALUE, olen - (beg + len)));
ARY_SET_LEN(ary, alen);
}
if (rlen > 0) {
- if (rofs != -1) rptr = RARRAY_CONST_PTR_TRANSIENT(ary) + rofs;
- /* give up wb-protected ary */
- RB_OBJ_WB_UNPROTECT_FOR(ARRAY, ary);
-
- /* do not use RARRAY_PTR() because it can causes GC.
- * ary can contain T_NONE object because it is not cleared.
- */
- RARRAY_PTR_USE_TRANSIENT(ary, ptr,
- MEMMOVE(ptr + beg, rptr, VALUE, rlen));
+ MEMMOVE(RARRAY_PTR(ary) + beg, RARRAY_CONST_PTR(rpl), VALUE, rlen);
}
}
+ RB_GC_GUARD(rpl);
}
void
@@ -1933,12 +1670,11 @@ rb_ary_resize(VALUE ary, long len)
}
else {
if (olen > len + ARY_DEFAULT_SIZE) {
- ary_heap_realloc(ary, len);
+ SIZED_REALLOC_N(RARRAY(ary)->as.heap.ptr, VALUE, len, RARRAY(ary)->as.heap.aux.capa);
ARY_SET_CAPA(ary, len);
}
ARY_SET_HEAP_LEN(ary, len);
}
- ary_verify(ary);
return ary;
}
@@ -1981,13 +1717,13 @@ static VALUE
rb_ary_aset(int argc, VALUE *argv, VALUE ary)
{
long offset, beg, len;
- VALUE rpl;
if (argc == 3) {
rb_ary_modify_check(ary);
beg = NUM2LONG(argv[0]);
len = NUM2LONG(argv[1]);
- goto range;
+ rb_ary_splice(ary, beg, len, argv[2]);
+ return argv[2];
}
rb_check_arity(argc, 2, 2);
rb_ary_modify_check(ary);
@@ -1997,11 +1733,8 @@ rb_ary_aset(int argc, VALUE *argv, VALUE ary)
}
if (rb_range_beg_len(argv[0], &beg, &len, RARRAY_LEN(ary), 1)) {
/* check if idx is Range */
- range:
- rpl = rb_ary_to_ary(argv[argc-1]);
- rb_ary_splice(ary, beg, len, RARRAY_CONST_PTR_TRANSIENT(rpl), RARRAY_LEN(rpl));
- RB_GC_GUARD(rpl);
- return argv[argc-1];
+ rb_ary_splice(ary, beg, len, argv[1]);
+ return argv[1];
}
offset = NUM2LONG(argv[0]);
@@ -2033,20 +1766,15 @@ rb_ary_insert(int argc, VALUE *argv, VALUE ary)
rb_check_arity(argc, 1, UNLIMITED_ARGUMENTS);
rb_ary_modify_check(ary);
- pos = NUM2LONG(argv[0]);
if (argc == 1) return ary;
+ pos = NUM2LONG(argv[0]);
if (pos == -1) {
pos = RARRAY_LEN(ary);
}
- else if (pos < 0) {
- long minpos = -RARRAY_LEN(ary) - 1;
- if (pos < minpos) {
- rb_raise(rb_eIndexError, "index %ld too small for array; minimum: %ld",
- pos, minpos);
- }
+ if (pos < 0) {
pos++;
}
- rb_ary_splice(ary, pos, 0, argv + 1, argc - 1);
+ rb_ary_splice(ary, pos, 0, rb_ary_new4(argc - 1, argv + 1));
return ary;
}
@@ -2061,7 +1789,7 @@ ary_enum_length(VALUE ary, VALUE args, VALUE eobj)
/*
* call-seq:
- * ary.each {|item| block} -> ary
+ * ary.each { |item| block } -> ary
* ary.each -> Enumerator
*
* Calls the given block once for each element in +self+, passing that element
@@ -2081,7 +1809,7 @@ VALUE
rb_ary_each(VALUE ary)
{
long i;
- ary_verify(ary);
+
RETURN_SIZED_ENUMERATOR(ary, 0, 0, ary_enum_length);
for (i=0; i<RARRAY_LEN(ary); i++) {
rb_yield(RARRAY_AREF(ary, i));
@@ -2091,7 +1819,7 @@ rb_ary_each(VALUE ary)
/*
* call-seq:
- * ary.each_index {|index| block} -> ary
+ * ary.each_index { |index| block } -> ary
* ary.each_index -> Enumerator
*
* Same as Array#each, but passes the +index+ of the element instead of the
@@ -2121,7 +1849,7 @@ rb_ary_each_index(VALUE ary)
/*
* call-seq:
- * ary.reverse_each {|item| block} -> ary
+ * ary.reverse_each { |item| block } -> ary
* ary.reverse_each -> Enumerator
*
* Same as Array#each, but traverses +self+ in reverse order.
@@ -2191,18 +1919,15 @@ rb_ary_dup(VALUE ary)
{
long len = RARRAY_LEN(ary);
VALUE dup = rb_ary_new2(len);
- ary_memcpy(dup, 0, len, RARRAY_CONST_PTR_TRANSIENT(ary));
+ ary_memcpy(dup, 0, len, RARRAY_CONST_PTR(ary));
ARY_SET_LEN(dup, len);
-
- ary_verify(ary);
- ary_verify(dup);
return dup;
}
VALUE
rb_ary_resurrect(VALUE ary)
{
- return ary_make_partial(ary, rb_cArray, 0, RARRAY_LEN(ary));
+ return rb_ary_new4(RARRAY_LEN(ary), RARRAY_CONST_PTR(ary));
}
extern VALUE rb_output_fs;
@@ -2256,10 +1981,7 @@ ary_join_1(VALUE obj, VALUE ary, VALUE sep, long i, VALUE result, int *first)
if (RB_TYPE_P(val, T_STRING)) {
str_join:
rb_str_buf_append(result, val);
- if (*first) {
- rb_enc_copy(result, val);
- *first = FALSE;
- }
+ *first = FALSE;
}
else if (RB_TYPE_P(val, T_ARRAY)) {
obj = val;
@@ -2270,7 +1992,6 @@ ary_join_1(VALUE obj, VALUE ary, VALUE sep, long i, VALUE result, int *first)
else {
VALUE args[4];
- *first = FALSE;
args[0] = val;
args[1] = sep;
args[2] = result;
@@ -2284,13 +2005,17 @@ ary_join_1(VALUE obj, VALUE ary, VALUE sep, long i, VALUE result, int *first)
val = tmp;
goto str_join;
}
- tmp = rb_check_array_type(val);
+ tmp = rb_check_convert_type(val, T_ARRAY, "Array", "to_ary");
if (!NIL_P(tmp)) {
obj = val;
val = tmp;
goto ary_join;
}
val = rb_obj_as_string(val);
+ if (*first) {
+ rb_enc_copy(result, val);
+ *first = FALSE;
+ }
goto str_join;
}
}
@@ -2341,16 +2066,11 @@ rb_ary_join(VALUE ary, VALUE sep)
*
* Returns a string created by converting each element of the array to
* a string, separated by the given +separator+.
- * If the +separator+ is +nil+, it uses current <code>$,</code>.
- * If both the +separator+ and <code>$,</code> are +nil+,
- * it uses an empty string.
+ * If the +separator+ is +nil+, it uses current $,.
+ * If both the +separator+ and $, are nil, it uses empty string.
*
* [ "a", "b", "c" ].join #=> "abc"
* [ "a", "b", "c" ].join("-") #=> "a-b-c"
- *
- * For nested arrays, join is applied recursively:
- *
- * [ "a", [1, 2, [:x, :y]], "b" ].join("-") #=> "a-1-2-x-y-b"
*/
static VALUE
@@ -2358,12 +2078,8 @@ rb_ary_join_m(int argc, VALUE *argv, VALUE ary)
{
VALUE sep;
- if (rb_check_arity(argc, 0, 1) == 0) {
- sep = rb_output_fs;
- }
- else if (NIL_P(sep = argv[0])) {
- sep = rb_output_fs;
- }
+ rb_scan_args(argc, argv, "01", &sep);
+ if (NIL_P(sep)) sep = rb_output_fs;
return rb_ary_join(ary, sep);
}
@@ -2434,32 +2150,22 @@ rb_ary_to_a(VALUE ary)
/*
* call-seq:
- * ary.to_h -> hash
- * ary.to_h { block } -> hash
+ * ary.to_h -> hash
*
* Returns the result of interpreting <i>ary</i> as an array of
* <tt>[key, value]</tt> pairs.
*
* [[:foo, :bar], [1, 2]].to_h
* # => {:foo => :bar, 1 => 2}
- *
- * If a block is given, the results of the block on each element of
- * the array will be used as pairs.
- *
- * ["foo", "bar"].to_h {|s| [s.ord, s]}
- * # => {102=>"foo", 98=>"bar"}
*/
static VALUE
rb_ary_to_h(VALUE ary)
{
long i;
- VALUE hash = rb_hash_new_with_size(RARRAY_LEN(ary));
- int block_given = rb_block_given_p();
-
+ VALUE hash = rb_hash_new();
for (i=0; i<RARRAY_LEN(ary); i++) {
- const VALUE e = rb_ary_elt(ary, i);
- const VALUE elt = block_given ? rb_yield_force_blockarg(e) : e;
+ const VALUE elt = rb_ary_elt(ary, i);
const VALUE key_value_pair = rb_check_array_type(elt);
if (NIL_P(key_value_pair)) {
rb_raise(rb_eTypeError, "wrong element type %"PRIsVALUE" at %ld (expected array)",
@@ -2505,9 +2211,9 @@ rb_ary_reverse(VALUE ary)
rb_ary_modify(ary);
if (len > 1) {
- RARRAY_PTR_USE_TRANSIENT(ary, p1, {
- p2 = p1 + len - 1; /* points last item */
- ary_reverse(p1, p2);
+ RARRAY_PTR_USE(ary, p1, {
+ p2 = p1 + len - 1; /* points last item */
+ ary_reverse(p1, p2);
}); /* WB: no new reference */
}
return ary;
@@ -2547,8 +2253,8 @@ rb_ary_reverse_m(VALUE ary)
VALUE dup = rb_ary_new2(len);
if (len > 0) {
- const VALUE *p1 = RARRAY_CONST_PTR_TRANSIENT(ary);
- VALUE *p2 = (VALUE *)RARRAY_CONST_PTR_TRANSIENT(dup) + len - 1;
+ const VALUE *p1 = RARRAY_CONST_PTR(ary);
+ VALUE *p2 = (VALUE *)RARRAY_CONST_PTR(dup) + len - 1;
do *p2-- = *p1++; while (--len > 0);
}
ARY_SET_LEN(dup, RARRAY_LEN(ary));
@@ -2561,27 +2267,24 @@ rotate_count(long cnt, long len)
return (cnt < 0) ? (len - (~cnt % len) - 1) : (cnt % len);
}
-static void
-ary_rotate_ptr(VALUE *ptr, long len, long cnt)
-{
- --len;
- if (cnt < len) ary_reverse(ptr + cnt, ptr + len);
- if (--cnt > 0) ary_reverse(ptr, ptr + cnt);
- if (len > 0) ary_reverse(ptr, ptr + len);
-}
-
VALUE
rb_ary_rotate(VALUE ary, long cnt)
{
rb_ary_modify(ary);
if (cnt != 0) {
- long len = RARRAY_LEN(ary);
- if (len > 0 && (cnt = rotate_count(cnt, len)) > 0) {
- RARRAY_PTR_USE_TRANSIENT(ary, ptr, ary_rotate_ptr(ptr, len, cnt));
- return ary;
- }
+ VALUE *ptr = RARRAY_PTR(ary);
+ long len = RARRAY_LEN(ary);
+
+ if (len > 0 && (cnt = rotate_count(cnt, len)) > 0) {
+ --len;
+ if (cnt < len) ary_reverse(ptr + cnt, ptr + len);
+ if (--cnt > 0) ary_reverse(ptr, ptr + cnt);
+ if (len > 0) ary_reverse(ptr, ptr + len);
+ return ary;
+ }
}
+
return Qnil;
}
@@ -2605,7 +2308,13 @@ rb_ary_rotate(VALUE ary, long cnt)
static VALUE
rb_ary_rotate_bang(int argc, VALUE *argv, VALUE ary)
{
- long n = (rb_check_arity(argc, 0, 1) ? NUM2LONG(argv[0]) : 1);
+ long n = 1;
+
+ switch (argc) {
+ case 1: n = NUM2LONG(argv[0]);
+ case 0: break;
+ default: rb_scan_args(argc, argv, "01", NULL);
+ }
rb_ary_rotate(ary, n);
return ary;
}
@@ -2632,14 +2341,19 @@ rb_ary_rotate_m(int argc, VALUE *argv, VALUE ary)
{
VALUE rotated;
const VALUE *ptr;
- long len;
- long cnt = (rb_check_arity(argc, 0, 1) ? NUM2LONG(argv[0]) : 1);
+ long len, cnt = 1;
+
+ switch (argc) {
+ case 1: cnt = NUM2LONG(argv[0]);
+ case 0: break;
+ default: rb_scan_args(argc, argv, "01", NULL);
+ }
len = RARRAY_LEN(ary);
rotated = rb_ary_new2(len);
if (len > 0) {
cnt = rotate_count(cnt, len);
- ptr = RARRAY_CONST_PTR_TRANSIENT(ary);
+ ptr = RARRAY_CONST_PTR(ary);
len -= cnt;
ary_memcpy(rotated, 0, len, ptr + cnt);
ary_memcpy(rotated, len, cnt, ptr);
@@ -2650,9 +2364,26 @@ rb_ary_rotate_m(int argc, VALUE *argv, VALUE ary)
struct ary_sort_data {
VALUE ary;
- struct cmp_opt_data cmp_opt;
+ int opt_methods;
+ int opt_inited;
+};
+
+enum {
+ sort_opt_Fixnum,
+ sort_opt_String,
+ sort_optimizable_count
};
+#define STRING_P(s) (RB_TYPE_P((s), T_STRING) && CLASS_OF(s) == rb_cString)
+
+#define SORT_OPTIMIZABLE_BIT(type) (1U << TOKEN_PASTE(sort_opt_,type))
+#define SORT_OPTIMIZABLE(data, type) \
+ (((data)->opt_inited & SORT_OPTIMIZABLE_BIT(type)) ? \
+ ((data)->opt_methods & SORT_OPTIMIZABLE_BIT(type)) : \
+ (((data)->opt_inited |= SORT_OPTIMIZABLE_BIT(type)), \
+ rb_method_basic_definition_p(TOKEN_PASTE(rb_c,type), id_cmp) && \
+ ((data)->opt_methods |= SORT_OPTIMIZABLE_BIT(type))))
+
static VALUE
sort_reentered(VALUE ary)
{
@@ -2668,12 +2399,9 @@ sort_1(const void *ap, const void *bp, void *dummy)
struct ary_sort_data *data = dummy;
VALUE retval = sort_reentered(data->ary);
VALUE a = *(const VALUE *)ap, b = *(const VALUE *)bp;
- VALUE args[2];
int n;
- args[0] = a;
- args[1] = b;
- retval = rb_yield_values2(2, args);
+ retval = rb_yield_values(2, a, b);
n = rb_cmpint(retval, a, b);
sort_reentered(data->ary);
return n;
@@ -2687,17 +2415,14 @@ sort_2(const void *ap, const void *bp, void *dummy)
VALUE a = *(const VALUE *)ap, b = *(const VALUE *)bp;
int n;
- if (FIXNUM_P(a) && FIXNUM_P(b) && CMP_OPTIMIZABLE(data->cmp_opt, Fixnum)) {
+ if (FIXNUM_P(a) && FIXNUM_P(b) && SORT_OPTIMIZABLE(data, Fixnum)) {
if ((long)a > (long)b) return 1;
if ((long)a < (long)b) return -1;
return 0;
}
- if (STRING_P(a) && STRING_P(b) && CMP_OPTIMIZABLE(data->cmp_opt, String)) {
+ if (STRING_P(a) && STRING_P(b) && SORT_OPTIMIZABLE(data, String)) {
return rb_str_cmp(a, b);
}
- if (RB_FLOAT_TYPE_P(a) && CMP_OPTIMIZABLE(data->cmp_opt, Float)) {
- return rb_float_cmp(a, b);
- }
retval = rb_funcallv(a, id_cmp, 1, &b);
n = rb_cmpint(retval, a, b);
@@ -2709,7 +2434,7 @@ sort_2(const void *ap, const void *bp, void *dummy)
/*
* call-seq:
* ary.sort! -> ary
- * ary.sort! {|a, b| block} -> ary
+ * ary.sort! { |a, b| block } -> ary
*
* Sorts +self+ in place.
*
@@ -2720,14 +2445,11 @@ sort_2(const void *ap, const void *bp, void *dummy)
* an integer less than 0 when +b+ follows +a+, +0+ when +a+ and +b+
* are equivalent, or an integer greater than 0 when +a+ follows +b+.
*
- * The result is not guaranteed to be stable. When the comparison of two
- * elements returns +0+, the order of the elements is unpredictable.
- *
- * ary = [ "d", "a", "e", "c", "b" ]
- * ary.sort! #=> ["a", "b", "c", "d", "e"]
- * ary.sort! {|a, b| b <=> a} #=> ["e", "d", "c", "b", "a"]
- *
* See also Enumerable#sort_by.
+ *
+ * a = [ "d", "a", "e", "c", "b" ]
+ * a.sort! #=> ["a", "b", "c", "d", "e"]
+ * a.sort! { |x,y| y <=> x } #=> ["e", "d", "c", "b", "a"]
*/
VALUE
@@ -2739,13 +2461,14 @@ rb_ary_sort_bang(VALUE ary)
VALUE tmp = ary_make_substitution(ary); /* only ary refers tmp */
struct ary_sort_data data;
long len = RARRAY_LEN(ary);
+
RBASIC_CLEAR_CLASS(tmp);
data.ary = tmp;
- data.cmp_opt.opt_methods = 0;
- data.cmp_opt.opt_inited = 0;
+ data.opt_methods = 0;
+ data.opt_inited = 0;
RARRAY_PTR_USE(tmp, ptr, {
- ruby_qsort(ptr, len, sizeof(VALUE),
- rb_block_given_p()?sort_1:sort_2, &data);
+ ruby_qsort(ptr, len, sizeof(VALUE),
+ rb_block_given_p()?sort_1:sort_2, &data);
}); /* WB: no new reference */
rb_ary_modify(ary);
if (ARY_EMBED_P(tmp)) {
@@ -2771,29 +2494,28 @@ rb_ary_sort_bang(VALUE ary)
rb_ary_unshare(ary);
}
else {
- ary_heap_free(ary);
+ ruby_sized_xfree((void *)ARY_HEAP_PTR(ary), ARY_HEAP_SIZE(ary));
}
- ARY_SET_PTR(ary, ARY_HEAP_PTR(tmp));
+ ARY_SET_PTR(ary, RARRAY_CONST_PTR(tmp));
ARY_SET_HEAP_LEN(ary, len);
- ARY_SET_CAPA(ary, ARY_HEAP_LEN(tmp));
+ ARY_SET_CAPA(ary, RARRAY_LEN(tmp));
}
/* tmp was lost ownership for the ptr */
FL_UNSET(tmp, FL_FREEZE);
FL_SET_EMBED(tmp);
ARY_SET_EMBED_LEN(tmp, 0);
FL_SET(tmp, FL_FREEZE);
- }
+ }
/* tmp will be GC'ed. */
RBASIC_SET_CLASS_RAW(tmp, rb_cArray); /* rb_cArray must be marked */
}
- ary_verify(ary);
return ary;
}
/*
* call-seq:
* ary.sort -> new_ary
- * ary.sort {|a, b| block} -> new_ary
+ * ary.sort { |a, b| block } -> new_ary
*
* Returns a new array created by sorting +self+.
*
@@ -2804,14 +2526,12 @@ rb_ary_sort_bang(VALUE ary)
* an integer less than 0 when +b+ follows +a+, +0+ when +a+ and +b+
* are equivalent, or an integer greater than 0 when +a+ follows +b+.
*
- * The result is not guaranteed to be stable. When the comparison of two
- * elements returns +0+, the order of the elements is unpredictable.
- *
- * ary = [ "d", "a", "e", "c", "b" ]
- * ary.sort #=> ["a", "b", "c", "d", "e"]
- * ary.sort {|a, b| b <=> a} #=> ["e", "d", "c", "b", "a"]
*
* See also Enumerable#sort_by.
+ *
+ * a = [ "d", "a", "e", "c", "b" ]
+ * a.sort #=> ["a", "b", "c", "d", "e"]
+ * a.sort { |x,y| y <=> x } #=> ["e", "d", "c", "b", "a"]
*/
VALUE
@@ -2831,12 +2551,12 @@ static VALUE rb_ary_bsearch_index(VALUE ary);
* By using binary search, finds a value from this array which meets
* the given condition in O(log n) where n is the size of the array.
*
- * You can use this method in two modes: a find-minimum mode and
+ * You can use this method in two use cases: a find-minimum mode and
* a find-any mode. In either case, the elements of the array must be
* monotone (or sorted) with respect to the block.
*
- * In find-minimum mode (this is a good choice for typical use cases),
- * the block must always return true or false, and there must be an index i
+ * In find-minimum mode (this is a good choice for typical use case),
+ * the block must return true or false, and there must be an index i
* (0 <= i <= ary.size) so that:
*
* - the block returns false for any element whose index is less than
@@ -2854,7 +2574,7 @@ static VALUE rb_ary_bsearch_index(VALUE ary);
* ary.bsearch {|x| x >= 100 } #=> nil
*
* In find-any mode (this behaves like libc's bsearch(3)), the block
- * must always return a number, and there must be two indices i and j
+ * must return a number, and there must be two indices i and j
* (0 <= i <= j <= ary.size) so that:
*
* - the block returns a positive number for ary[k] if 0 <= k < i,
@@ -2895,8 +2615,8 @@ rb_ary_bsearch(VALUE ary)
* By using binary search, finds an index of a value from this array which
* meets the given condition in O(log n) where n is the size of the array.
*
- * It supports two modes, depending on the nature of the block. They are
- * exactly the same as in the case of the #bsearch method, with the only difference
+ * It supports two modes, depending on the nature of the block and they are
+ * exactly the same as in the case of #bsearch method with the only difference
* being that this method returns the index of the element instead of the
* element itself. For more details consult the documentation for #bsearch.
*/
@@ -2957,18 +2677,14 @@ sort_by_i(RB_BLOCK_CALL_FUNC_ARGLIST(i, dummy))
/*
* call-seq:
- * ary.sort_by! {|obj| block} -> ary
+ * ary.sort_by! { |obj| block } -> ary
* ary.sort_by! -> Enumerator
*
* Sorts +self+ in place using a set of keys generated by mapping the
* values in +self+ through the given block.
*
- * The result is not guaranteed to be stable. When two keys are equal,
- * the order of the corresponding elements is unpredictable.
- *
* If no block is given, an Enumerator is returned instead.
*
- * See also Enumerable#sort_by.
*/
static VALUE
@@ -2986,8 +2702,8 @@ rb_ary_sort_by_bang(VALUE ary)
/*
* call-seq:
- * ary.collect {|item| block} -> new_ary
- * ary.map {|item| block} -> new_ary
+ * ary.collect { |item| block } -> new_ary
+ * ary.map { |item| block } -> new_ary
* ary.collect -> Enumerator
* ary.map -> Enumerator
*
@@ -3000,8 +2716,8 @@ rb_ary_sort_by_bang(VALUE ary)
* If no block is given, an Enumerator is returned instead.
*
* a = [ "a", "b", "c", "d" ]
- * a.collect {|x| x + "!"} #=> ["a!", "b!", "c!", "d!"]
- * a.map.with_index {|x, i| x * i} #=> ["", "b", "cc", "ddd"]
+ * a.collect { |x| x + "!" } #=> ["a!", "b!", "c!", "d!"]
+ * a.map.with_index { |x, i| x * i } #=> ["", "b", "cc", "ddd"]
* a #=> ["a", "b", "c", "d"]
*/
@@ -3014,7 +2730,7 @@ rb_ary_collect(VALUE ary)
RETURN_SIZED_ENUMERATOR(ary, 0, 0, ary_enum_length);
collect = rb_ary_new2(RARRAY_LEN(ary));
for (i = 0; i < RARRAY_LEN(ary); i++) {
- rb_ary_push(collect, rb_yield(RARRAY_AREF(ary, i)));
+ rb_ary_push(collect, rb_yield(RARRAY_AREF(ary, i)));
}
return collect;
}
@@ -3080,34 +2796,6 @@ rb_get_values_at(VALUE obj, long olen, int argc, const VALUE *argv, VALUE (*func
return result;
}
-static VALUE
-append_values_at_single(VALUE result, VALUE ary, long olen, VALUE idx)
-{
- long beg, len;
- if (FIXNUM_P(idx)) {
- beg = FIX2LONG(idx);
- }
- /* check if idx is Range */
- else if (rb_range_beg_len(idx, &beg, &len, olen, 1)) {
- if (len > 0) {
- const VALUE *const src = RARRAY_CONST_PTR_TRANSIENT(ary);
- const long end = beg + len;
- const long prevlen = RARRAY_LEN(result);
- if (beg < olen) {
- rb_ary_cat(result, src + beg, end > olen ? olen-beg : len);
- }
- if (end > olen) {
- rb_ary_store(result, prevlen + len - 1, Qnil);
- }
- }
- return result;
- }
- else {
- beg = NUM2LONG(idx);
- }
- return rb_ary_push(result, rb_ary_entry(ary, beg));
-}
-
/*
* call-seq:
* ary.values_at(selector, ...) -> new_ary
@@ -3129,36 +2817,26 @@ append_values_at_single(VALUE result, VALUE ary, long olen, VALUE idx)
static VALUE
rb_ary_values_at(int argc, VALUE *argv, VALUE ary)
{
- long i, olen = RARRAY_LEN(ary);
- VALUE result = rb_ary_new_capa(argc);
- for (i = 0; i < argc; ++i) {
- append_values_at_single(result, ary, olen, argv[i]);
- }
- RB_GC_GUARD(ary);
- return result;
+ return rb_get_values_at(ary, RARRAY_LEN(ary), argc, argv, rb_ary_entry);
}
/*
* call-seq:
- * ary.select {|item| block} -> new_ary
+ * ary.select { |item| block } -> new_ary
* ary.select -> Enumerator
- * ary.filter {|item| block} -> new_ary
- * ary.filter -> Enumerator
*
* Returns a new array containing all elements of +ary+
* for which the given +block+ returns a true value.
*
* If no block is given, an Enumerator is returned instead.
*
- * [1,2,3,4,5].select {|num| num.even? } #=> [2, 4]
+ * [1,2,3,4,5].select { |num| num.even? } #=> [2, 4]
*
- * a = %w[ a b c d e f ]
- * a.select {|v| v =~ /[aeiou]/ } #=> ["a", "e"]
+ * a = %w{ a b c d e f }
+ * a.select { |v| v =~ /[aeiou]/ } #=> ["a", "e"]
*
* See also Enumerable#select.
- *
- * Array#filter is an alias for Array#select.
*/
static VALUE
@@ -3208,25 +2886,21 @@ select_bang_ensure(VALUE a)
long len = RARRAY_LEN(ary);
long i1 = arg->len[0], i2 = arg->len[1];
- if (i2 < len && i2 < i1) {
- long tail = 0;
+ if (i2 < i1) {
if (i1 < len) {
- tail = len - i1;
- RARRAY_PTR_USE_TRANSIENT(ary, ptr, {
- MEMMOVE(ptr + i2, ptr + i1, VALUE, tail);
+ RARRAY_PTR_USE(ary, ptr, {
+ MEMMOVE(ptr + i2, ptr + i1, VALUE, len - i1);
});
}
- ARY_SET_LEN(ary, i2 + tail);
+ ARY_SET_LEN(ary, len - i1 + i2);
}
return ary;
}
/*
* call-seq:
- * ary.select! {|item| block } -> ary or nil
- * ary.select! -> Enumerator
- * ary.filter! {|item| block } -> ary or nil
- * ary.filter! -> Enumerator
+ * ary.select! {|item| block } -> ary or nil
+ * ary.select! -> Enumerator
*
* Invokes the given block passing in successive elements from +self+,
* deleting elements for which the block returns a +false+ value.
@@ -3235,11 +2909,10 @@ select_bang_ensure(VALUE a)
*
* If changes were made, it will return +self+, otherwise it returns +nil+.
*
- * If no block is given, an Enumerator is returned instead.
+ * See also Array#keep_if
*
- * See also Array#keep_if.
+ * If no block is given, an Enumerator is returned instead.
*
- * Array#filter! is an alias for Array#select!.
*/
static VALUE
@@ -3257,19 +2930,18 @@ rb_ary_select_bang(VALUE ary)
/*
* call-seq:
- * ary.keep_if {|item| block} -> ary
+ * ary.keep_if { |item| block } -> ary
* ary.keep_if -> Enumerator
*
* Deletes every element of +self+ for which the given block evaluates to
- * +false+, and returns +self+.
+ * +false+.
*
- * If no block is given, an Enumerator is returned instead.
+ * See also Array#select!
*
- * a = %w[ a b c d e f ]
- * a.keep_if {|v| v =~ /[aeiou]/ } #=> ["a", "e"]
- * a #=> ["a", "e"]
+ * If no block is given, an Enumerator is returned instead.
*
- * See also Array#select!.
+ * a = %w{ a b c d e f }
+ * a.keep_if { |v| v =~ /[aeiou]/ } #=> ["a", "e"]
*/
static VALUE
@@ -3296,7 +2968,7 @@ ary_resize_smaller(VALUE ary, long len)
/*
* call-seq:
* ary.delete(obj) -> item or nil
- * ary.delete(obj) {block} -> item or result of block
+ * ary.delete(obj) { block } -> item or result of block
*
* Deletes all items from +self+ that are equal to +obj+.
*
@@ -3310,7 +2982,7 @@ ary_resize_smaller(VALUE ary, long len)
* a.delete("b") #=> "b"
* a #=> ["a", "c"]
* a.delete("z") #=> nil
- * a.delete("z") {"not found"} #=> "not found"
+ * a.delete("z") { "not found" } #=> "not found"
*/
VALUE
@@ -3340,7 +3012,6 @@ rb_ary_delete(VALUE ary, VALUE item)
ary_resize_smaller(ary, i2);
- ary_verify(ary);
return v;
}
@@ -3381,11 +3052,11 @@ rb_ary_delete_at(VALUE ary, long pos)
rb_ary_modify(ary);
del = RARRAY_AREF(ary, pos);
- RARRAY_PTR_USE_TRANSIENT(ary, ptr, {
- MEMMOVE(ptr+pos, ptr+pos+1, VALUE, len-pos-1);
+ RARRAY_PTR_USE(ary, ptr, {
+ MEMMOVE(ptr+pos, ptr+pos+1, VALUE, len-pos-1);
});
ARY_INCREASE_LEN(ary, -1);
- ary_verify(ary);
+
return del;
}
@@ -3453,13 +3124,16 @@ rb_ary_slice_bang(int argc, VALUE *argv, VALUE ary)
len = orig_len - pos;
}
if (len == 0) return rb_ary_new2(0);
- arg2 = rb_ary_new4(len, RARRAY_CONST_PTR_TRANSIENT(ary)+pos);
+ arg2 = rb_ary_new4(len, RARRAY_CONST_PTR(ary)+pos);
RBASIC_SET_CLASS(arg2, rb_obj_class(ary));
- rb_ary_splice(ary, pos, len, 0, 0);
+ rb_ary_splice(ary, pos, len, Qundef);
return arg2;
}
- rb_check_arity(argc, 1, 2);
+ if (argc != 1) {
+ /* error report */
+ rb_scan_args(argc, argv, "11", NULL, NULL);
+ }
arg1 = argv[0];
if (!FIXNUM_P(arg1)) {
@@ -3486,8 +3160,7 @@ ary_reject(VALUE orig, VALUE result)
for (i = 0; i < RARRAY_LEN(orig); i++) {
VALUE v = RARRAY_AREF(orig, i);
-
- if (!RTEST(rb_yield(v))) {
+ if (!RTEST(rb_yield(v))) {
rb_ary_push(result, v);
}
}
@@ -3516,6 +3189,7 @@ static VALUE
ary_reject_bang(VALUE ary)
{
struct select_bang_arg args;
+
rb_ary_modify_check(ary);
args.ary = ary;
args.len[0] = args.len[1] = 0;
@@ -3524,7 +3198,7 @@ ary_reject_bang(VALUE ary)
/*
* call-seq:
- * ary.reject! {|item| block} -> ary or nil
+ * ary.reject! { |item| block } -> ary or nil
* ary.reject! -> Enumerator
*
* Deletes every element of +self+ for which the block evaluates to +true+,
@@ -3541,7 +3215,6 @@ static VALUE
rb_ary_reject_bang(VALUE ary)
{
RETURN_SIZED_ENUMERATOR(ary, 0, 0, ary_enum_length);
- rb_ary_modify(ary);
return ary_reject_bang(ary);
}
@@ -3571,7 +3244,7 @@ rb_ary_reject(VALUE ary)
/*
* call-seq:
- * ary.delete_if {|item| block} -> ary
+ * ary.delete_if { |item| block } -> ary
* ary.delete_if -> Enumerator
*
* Deletes every element of +self+ for which block evaluates to +true+.
@@ -3590,7 +3263,6 @@ rb_ary_reject(VALUE ary)
static VALUE
rb_ary_delete_if(VALUE ary)
{
- ary_verify(ary);
RETURN_SIZED_ENUMERATOR(ary, 0, 0, ary_enum_length);
ary_reject_bang(ary);
return ary;
@@ -3600,8 +3272,7 @@ static VALUE
take_i(RB_BLOCK_CALL_FUNC_ARGLIST(val, cbarg))
{
VALUE *args = (VALUE *)cbarg;
- if (args[1] == 0) rb_iter_break();
- else args[1]--;
+ if (args[1]-- == 0) rb_iter_break();
if (argc > 1) val = rb_ary_new4(argc, argv);
rb_ary_push(args[0], val);
return Qnil;
@@ -3626,7 +3297,7 @@ take_items(VALUE obj, long n)
/*
* call-seq:
* ary.zip(arg, ...) -> new_ary
- * ary.zip(arg, ...) {|arr| block} -> nil
+ * ary.zip(arg, ...) { |arr| block } -> nil
*
* Converts any arguments to arrays, then merges elements of +self+ with
* corresponding elements from each argument.
@@ -3770,14 +3441,14 @@ rb_ary_replace(VALUE copy, VALUE orig)
VALUE shared = 0;
if (ARY_OWNS_HEAP_P(copy)) {
- ary_heap_free(copy);
+ RARRAY_PTR_USE(copy, ptr, ruby_sized_xfree(ptr, ARY_HEAP_SIZE(copy)));
}
else if (ARY_SHARED_P(copy)) {
shared = ARY_SHARED(copy);
FL_UNSET_SHARED(copy);
}
FL_SET_EMBED(copy);
- ary_memcpy(copy, 0, RARRAY_LEN(orig), RARRAY_CONST_PTR_TRANSIENT(orig));
+ ary_memcpy(copy, 0, RARRAY_LEN(orig), RARRAY_CONST_PTR(orig));
if (shared) {
rb_ary_decrement_share(shared);
}
@@ -3786,17 +3457,16 @@ rb_ary_replace(VALUE copy, VALUE orig)
else {
VALUE shared = ary_make_shared(orig);
if (ARY_OWNS_HEAP_P(copy)) {
- ary_heap_free(copy);
+ RARRAY_PTR_USE(copy, ptr, ruby_sized_xfree(ptr, ARY_HEAP_SIZE(copy)));
}
else {
rb_ary_unshare_safe(copy);
}
FL_UNSET_EMBED(copy);
- ARY_SET_PTR(copy, ARY_HEAP_PTR(orig));
- ARY_SET_LEN(copy, ARY_HEAP_LEN(orig));
+ ARY_SET_PTR(copy, RARRAY_CONST_PTR(orig));
+ ARY_SET_LEN(copy, RARRAY_LEN(orig));
rb_ary_set_shared(copy, shared);
}
- ary_verify(copy);
return copy;
}
@@ -3814,20 +3484,16 @@ VALUE
rb_ary_clear(VALUE ary)
{
rb_ary_modify_check(ary);
+ ARY_SET_LEN(ary, 0);
if (ARY_SHARED_P(ary)) {
if (!ARY_EMBED_P(ary)) {
rb_ary_unshare(ary);
FL_SET_EMBED(ary);
- ARY_SET_EMBED_LEN(ary, 0);
}
}
- else {
- ARY_SET_LEN(ary, 0);
- if (ARY_DEFAULT_SIZE * 2 < ARY_CAPA(ary)) {
- ary_resize_capa(ary, ARY_DEFAULT_SIZE * 2);
- }
+ else if (ARY_DEFAULT_SIZE * 2 < ARY_CAPA(ary)) {
+ ary_resize_capa(ary, ARY_DEFAULT_SIZE * 2);
}
- ary_verify(ary);
return ary;
}
@@ -3835,10 +3501,10 @@ rb_ary_clear(VALUE ary)
* call-seq:
* ary.fill(obj) -> ary
* ary.fill(obj, start [, length]) -> ary
- * ary.fill(obj, range) -> ary
- * ary.fill {|index| block} -> ary
- * ary.fill(start [, length]) {|index| block} -> ary
- * ary.fill(range) {|index| block} -> ary
+ * ary.fill(obj, range ) -> ary
+ * ary.fill { |index| block } -> ary
+ * ary.fill(start [, length] ) { |index| block } -> ary
+ * ary.fill(range) { |index| block } -> ary
*
* The first three forms set the selected elements of +self+ (which
* may be the entire array) to +obj+.
@@ -3857,17 +3523,19 @@ rb_ary_clear(VALUE ary)
* a.fill("x") #=> ["x", "x", "x", "x"]
* a.fill("z", 2, 2) #=> ["x", "x", "z", "z"]
* a.fill("y", 0..1) #=> ["y", "y", "z", "z"]
- * a.fill {|i| i*i} #=> [0, 1, 4, 9]
- * a.fill(-2) {|i| i*i*i} #=> [0, 1, 8, 27]
+ * a.fill { |i| i*i } #=> [0, 1, 4, 9]
+ * a.fill(-2) { |i| i*i*i } #=> [0, 1, 8, 27]
*/
static VALUE
rb_ary_fill(int argc, VALUE *argv, VALUE ary)
{
- VALUE item = Qundef, arg1, arg2;
+ VALUE item, arg1, arg2;
long beg = 0, end = 0, len = 0;
+ int block_p = FALSE;
if (rb_block_given_p()) {
+ block_p = TRUE;
rb_scan_args(argc, argv, "02", &arg1, &arg2);
argc += 1; /* hackish */
}
@@ -3909,7 +3577,7 @@ rb_ary_fill(int argc, VALUE *argv, VALUE ary)
ARY_SET_LEN(ary, end);
}
- if (item == Qundef) {
+ if (block_p) {
VALUE v;
long i;
@@ -3960,69 +3628,38 @@ rb_ary_plus(VALUE x, VALUE y)
len = xlen + ylen;
z = rb_ary_new2(len);
- ary_memcpy(z, 0, xlen, RARRAY_CONST_PTR_TRANSIENT(x));
- ary_memcpy(z, xlen, ylen, RARRAY_CONST_PTR_TRANSIENT(y));
+ ary_memcpy(z, 0, xlen, RARRAY_CONST_PTR(x));
+ ary_memcpy(z, xlen, ylen, RARRAY_CONST_PTR(y));
ARY_SET_LEN(z, len);
return z;
}
-static VALUE
-ary_append(VALUE x, VALUE y)
-{
- long n = RARRAY_LEN(y);
- if (n > 0) {
- rb_ary_splice(x, RARRAY_LEN(x), 0, RARRAY_CONST_PTR_TRANSIENT(y), n);
- }
- return x;
-}
-
/*
* call-seq:
- * ary.concat(other_ary1, other_ary2, ...) -> ary
- *
- * Appends the elements of <code>other_ary</code>s to +self+.
+ * ary.concat(other_ary) -> ary
*
- * [ "a", "b" ].concat( ["c", "d"]) #=> [ "a", "b", "c", "d" ]
- * [ "a" ].concat( ["b"], ["c", "d"]) #=> [ "a", "b", "c", "d" ]
- * [ "a" ].concat #=> [ "a" ]
+ * Appends the elements of +other_ary+ to +self+.
*
+ * [ "a", "b" ].concat( ["c", "d"] ) #=> [ "a", "b", "c", "d" ]
* a = [ 1, 2, 3 ]
- * a.concat( [ 4, 5 ])
+ * a.concat( [ 4, 5 ] )
* a #=> [ 1, 2, 3, 4, 5 ]
*
- * a = [ 1, 2 ]
- * a.concat(a, a) #=> [1, 2, 1, 2, 1, 2]
- *
* See also Array#+.
*/
-static VALUE
-rb_ary_concat_multi(int argc, VALUE *argv, VALUE ary)
-{
- rb_ary_modify_check(ary);
-
- if (argc == 1) {
- rb_ary_concat(ary, argv[0]);
- }
- else if (argc > 1) {
- int i;
- VALUE args = rb_ary_tmp_new(argc);
- for (i = 0; i < argc; i++) {
- rb_ary_concat(args, argv[i]);
- }
- ary_append(ary, args);
- }
-
- ary_verify(ary);
- return ary;
-}
-
VALUE
rb_ary_concat(VALUE x, VALUE y)
{
- return ary_append(x, to_ary(y));
+ rb_ary_modify_check(x);
+ y = to_ary(y);
+ if (RARRAY_LEN(y) > 0) {
+ rb_ary_splice(x, RARRAY_LEN(x), 0, y);
+ }
+ return x;
}
+
/*
* call-seq:
* ary * int -> new_ary
@@ -4068,16 +3705,16 @@ rb_ary_times(VALUE ary, VALUE times)
ary2 = ary_new(rb_obj_class(ary), len);
ARY_SET_LEN(ary2, len);
- ptr = RARRAY_CONST_PTR_TRANSIENT(ary);
+ ptr = RARRAY_CONST_PTR(ary);
t = RARRAY_LEN(ary);
if (0 < t) {
ary_memcpy(ary2, 0, t, ptr);
while (t <= len/2) {
- ary_memcpy(ary2, t, t, RARRAY_CONST_PTR_TRANSIENT(ary2));
+ ary_memcpy(ary2, t, t, RARRAY_CONST_PTR(ary2));
t *= 2;
}
if (t < len) {
- ary_memcpy(ary2, t, len-t, RARRAY_CONST_PTR_TRANSIENT(ary2));
+ ary_memcpy(ary2, t, len-t, RARRAY_CONST_PTR(ary2));
}
}
out:
@@ -4163,7 +3800,6 @@ recursive_equal(VALUE ary1, VALUE ary2, int recur)
if (recur) return Qtrue; /* Subtle! */
- /* rb_equal() can evacuate ptrs */
p1 = RARRAY_CONST_PTR(ary1);
p2 = RARRAY_CONST_PTR(ary2);
len1 = RARRAY_LEN(ary1);
@@ -4176,8 +3812,8 @@ recursive_equal(VALUE ary1, VALUE ary2, int recur)
return Qfalse;
if (len1 < i)
return Qtrue;
- p1 = RARRAY_CONST_PTR(ary1) + i;
- p2 = RARRAY_CONST_PTR(ary2) + i;
+ p1 = RARRAY_CONST_PTR(ary1) + i;
+ p2 = RARRAY_CONST_PTR(ary2) + i;
}
else {
return Qfalse;
@@ -4214,7 +3850,7 @@ rb_ary_equal(VALUE ary1, VALUE ary2)
return rb_equal(ary2, ary1);
}
if (RARRAY_LEN(ary1) != RARRAY_LEN(ary2)) return Qfalse;
- if (RARRAY_CONST_PTR_TRANSIENT(ary1) == RARRAY_CONST_PTR_TRANSIENT(ary2)) return Qtrue;
+ if (RARRAY_CONST_PTR(ary1) == RARRAY_CONST_PTR(ary2)) return Qtrue;
return rb_exec_recursive_paired(recursive_equal, ary1, ary2, ary2);
}
@@ -4245,13 +3881,13 @@ rb_ary_eql(VALUE ary1, VALUE ary2)
if (ary1 == ary2) return Qtrue;
if (!RB_TYPE_P(ary2, T_ARRAY)) return Qfalse;
if (RARRAY_LEN(ary1) != RARRAY_LEN(ary2)) return Qfalse;
- if (RARRAY_CONST_PTR_TRANSIENT(ary1) == RARRAY_CONST_PTR_TRANSIENT(ary2)) return Qtrue;
+ if (RARRAY_CONST_PTR(ary1) == RARRAY_CONST_PTR(ary2)) return Qtrue;
return rb_exec_recursive_paired(recursive_eql, ary1, ary2, ary2);
}
/*
* call-seq:
- * ary.hash -> integer
+ * ary.hash -> fixnum
*
* Compute a hash-code for this array.
*
@@ -4275,7 +3911,7 @@ rb_ary_hash(VALUE ary)
h = rb_hash_uint(h, NUM2LONG(n));
}
h = rb_hash_end(h);
- return ST2FIX(h);
+ return LONG2FIX(h);
}
/*
@@ -4298,27 +3934,17 @@ rb_ary_includes(VALUE ary, VALUE item)
for (i=0; i<RARRAY_LEN(ary); i++) {
e = RARRAY_AREF(ary, i);
- if (rb_equal(e, item)) {
+ switch (rb_equal_opt(e, item)) {
+ case Qundef:
+ if (rb_equal(e, item)) return Qtrue;
+ break;
+ case Qtrue:
return Qtrue;
}
}
return Qfalse;
}
-static VALUE
-rb_ary_includes_by_eql(VALUE ary, VALUE item)
-{
- long i;
- VALUE e;
-
- for (i=0; i<RARRAY_LEN(ary); i++) {
- e = RARRAY_AREF(ary, i);
- if (rb_eql(item, e)) {
- return Qtrue;
- }
- }
- return Qfalse;
-}
static VALUE
recursive_cmp(VALUE ary1, VALUE ary2, int recur)
@@ -4394,16 +4020,17 @@ ary_add_hash(VALUE hash, VALUE ary)
for (i=0; i<RARRAY_LEN(ary); i++) {
VALUE elt = RARRAY_AREF(ary, i);
- rb_hash_add_new_element(hash, elt, elt);
+ if (rb_hash_lookup2(hash, elt, Qundef) == Qundef) {
+ rb_hash_aset(hash, elt, elt);
+ }
}
return hash;
}
static inline VALUE
-ary_tmp_hash_new(VALUE ary)
+ary_tmp_hash_new(void)
{
- long size = RARRAY_LEN(ary);
- VALUE hash = rb_hash_new_with_size(size);
+ VALUE hash = rb_hash_new();
RBASIC_CLEAR_CLASS(hash);
return hash;
@@ -4412,7 +4039,7 @@ ary_tmp_hash_new(VALUE ary)
static VALUE
ary_make_hash(VALUE ary)
{
- VALUE hash = ary_tmp_hash_new(ary);
+ VALUE hash = ary_tmp_hash_new();
return ary_add_hash(hash, ary);
}
@@ -4423,7 +4050,9 @@ ary_add_hash_by(VALUE hash, VALUE ary)
for (i = 0; i < RARRAY_LEN(ary); ++i) {
VALUE v = rb_ary_elt(ary, i), k = rb_yield(v);
- rb_hash_add_new_element(hash, k, v);
+ if (rb_hash_lookup2(hash, k, Qundef) == Qundef) {
+ rb_hash_aset(hash, k, v);
+ }
}
return hash;
}
@@ -4431,19 +4060,19 @@ ary_add_hash_by(VALUE hash, VALUE ary)
static VALUE
ary_make_hash_by(VALUE ary)
{
- VALUE hash = ary_tmp_hash_new(ary);
+ VALUE hash = ary_tmp_hash_new();
return ary_add_hash_by(hash, ary);
}
static inline void
ary_recycle_hash(VALUE hash)
{
- assert(RBASIC_CLASS(hash) == 0);
- if (RHASH_ST_TABLE_P(hash)) {
- st_table *tbl = RHASH_ST_TABLE(hash);
+ if (RHASH(hash)->ntbl) {
+ st_table *tbl = RHASH(hash)->ntbl;
+ RHASH(hash)->ntbl = 0;
st_free_table(tbl);
- RHASH_ST_CLEAR(hash);
}
+ RB_GC_GUARD(hash);
}
/*
@@ -4461,8 +4090,6 @@ ary_recycle_hash(VALUE hash)
* [ 1, 1, 2, 2, 3, 3, 4, 5 ] - [ 1, 2, 4 ] #=> [ 3, 3, 5 ]
*
* If you need set-like behavior, see the library class Set.
- *
- * See also Array#difference.
*/
static VALUE
@@ -4472,21 +4099,11 @@ rb_ary_diff(VALUE ary1, VALUE ary2)
VALUE hash;
long i;
- ary2 = to_ary(ary2);
+ hash = ary_make_hash(to_ary(ary2));
ary3 = rb_ary_new();
- if (RARRAY_LEN(ary1) <= SMALL_ARRAY_LEN || RARRAY_LEN(ary2) <= SMALL_ARRAY_LEN) {
- for (i=0; i<RARRAY_LEN(ary1); i++) {
- VALUE elt = rb_ary_elt(ary1, i);
- if (rb_ary_includes_by_eql(ary2, elt)) continue;
- rb_ary_push(ary3, elt);
- }
- return ary3;
- }
-
- hash = ary_make_hash(ary2);
for (i=0; i<RARRAY_LEN(ary1); i++) {
- if (rb_hash_stlike_lookup(hash, RARRAY_AREF(ary1, i), NULL)) continue;
+ if (st_lookup(rb_hash_tbl_raw(hash), RARRAY_AREF(ary1, i), 0)) continue;
rb_ary_push(ary3, rb_ary_elt(ary1, i));
}
ary_recycle_hash(hash);
@@ -4495,71 +4112,15 @@ rb_ary_diff(VALUE ary1, VALUE ary2)
/*
* call-seq:
- * ary.difference(other_ary1, other_ary2, ...) -> ary
- *
- * Array Difference
- *
- * Returns a new array that is a copy of the receiver, removing any items
- * that also appear in any of the arrays given as arguments.
- * The order is preserved from the original array.
- *
- * It compares elements using their #hash and #eql? methods for efficiency.
- *
- * [ 1, 1, 2, 2, 3, 3, 4, 5 ].difference([ 1, 2, 4 ]) #=> [ 3, 3, 5 ]
- * [ 1, 'c', :s, 'yep' ].difference([ 1 ], [ 'a', 'c' ]) #=> [ :s, "yep" ]
- *
- * If you need set-like behavior, see the library class Set.
- *
- * See also Array#-.
- */
-
-static VALUE
-rb_ary_difference_multi(int argc, VALUE *argv, VALUE ary)
-{
- VALUE ary_diff;
- long i, length;
- volatile VALUE t0;
- bool *is_hash = ALLOCV_N(bool, t0, argc);
- ary_diff = rb_ary_new();
- length = RARRAY_LEN(ary);
-
- for (i = 0; i < argc; i++) {
- argv[i] = to_ary(argv[i]);
- is_hash[i] = (length > SMALL_ARRAY_LEN && RARRAY_LEN(argv[i]) > SMALL_ARRAY_LEN);
- if (is_hash[i]) argv[i] = ary_make_hash(argv[i]);
- }
-
- for (i = 0; i < RARRAY_LEN(ary); i++) {
- int j;
- VALUE elt = rb_ary_elt(ary, i);
- for (j = 0; j < argc; j++){
- if (is_hash[j]) {
- if (rb_hash_stlike_lookup(argv[j], RARRAY_AREF(ary, i), NULL))
- break;
- }
- else {
- if (rb_ary_includes_by_eql(argv[j], elt)) break;
- }
- }
- if (j == argc) rb_ary_push(ary_diff, elt);
- }
-
- ALLOCV_END(t0);
-
- return ary_diff;
-}
-
-
-/*
- * call-seq:
* ary & other_ary -> new_ary
*
- * Set Intersection --- Returns a new array containing unique elements common to the
- * two arrays. The order is preserved from the original array.
+ * Set Intersection --- Returns a new array containing elements common to the
+ * two arrays, excluding any duplicates. The order is preserved from the
+ * original array.
*
* It compares elements using their #hash and #eql? methods for efficiency.
*
- * [ 1, 1, 3, 5 ] & [ 3, 2, 1 ] #=> [ 1, 3 ]
+ * [ 1, 1, 3, 5 ] & [ 1, 2, 3 ] #=> [ 1, 3 ]
* [ 'a', 'b', 'b', 'z' ] & [ 'a', 'b', 'c' ] #=> [ 'a', 'b' ]
*
* See also Array#uniq.
@@ -4570,29 +4131,20 @@ static VALUE
rb_ary_and(VALUE ary1, VALUE ary2)
{
VALUE hash, ary3, v;
+ st_table *table;
st_data_t vv;
long i;
ary2 = to_ary(ary2);
ary3 = rb_ary_new();
- if (RARRAY_LEN(ary1) == 0 || RARRAY_LEN(ary2) == 0) return ary3;
-
- if (RARRAY_LEN(ary1) <= SMALL_ARRAY_LEN && RARRAY_LEN(ary2) <= SMALL_ARRAY_LEN) {
- for (i=0; i<RARRAY_LEN(ary1); i++) {
- v = RARRAY_AREF(ary1, i);
- if (!rb_ary_includes_by_eql(ary2, v)) continue;
- if (rb_ary_includes_by_eql(ary3, v)) continue;
- rb_ary_push(ary3, v);
- }
- return ary3;
- }
-
+ if (RARRAY_LEN(ary2) == 0) return ary3;
hash = ary_make_hash(ary2);
+ table = rb_hash_tbl_raw(hash);
for (i=0; i<RARRAY_LEN(ary1); i++) {
v = RARRAY_AREF(ary1, i);
vv = (st_data_t)v;
- if (rb_hash_stlike_delete(hash, &vv, 0)) {
+ if (st_delete(table, &vv, 0)) {
rb_ary_push(ary3, v);
}
}
@@ -4609,217 +4161,40 @@ ary_hash_orset(st_data_t *key, st_data_t *value, st_data_t arg, int existing)
return ST_CONTINUE;
}
-static void
-rb_ary_union(VALUE ary_union, VALUE ary)
-{
- long i;
- for (i = 0; i < RARRAY_LEN(ary); i++) {
- VALUE elt = rb_ary_elt(ary, i);
- if (rb_ary_includes_by_eql(ary_union, elt)) continue;
- rb_ary_push(ary_union, elt);
- }
-}
-
-static void
-rb_ary_union_hash(VALUE hash, VALUE ary2)
-{
- long i;
- for (i = 0; i < RARRAY_LEN(ary2); i++) {
- VALUE elt = RARRAY_AREF(ary2, i);
- if (!rb_hash_stlike_update(hash, (st_data_t)elt, ary_hash_orset, (st_data_t)elt)) {
- RB_OBJ_WRITTEN(hash, Qundef, elt);
- }
- }
-}
-
/*
* call-seq:
* ary | other_ary -> new_ary
*
* Set Union --- Returns a new array by joining +ary+ with +other_ary+,
- * excluding any duplicates and preserving the order from the given arrays.
+ * excluding any duplicates and preserving the order from the original array.
*
* It compares elements using their #hash and #eql? methods for efficiency.
*
* [ "a", "b", "c" ] | [ "c", "d", "a" ] #=> [ "a", "b", "c", "d" ]
- * [ "c", "d", "a" ] | [ "a", "b", "c" ] #=> [ "c", "d", "a", "b" ]
*
- * See also Array#union.
+ * See also Array#uniq.
*/
static VALUE
rb_ary_or(VALUE ary1, VALUE ary2)
{
VALUE hash, ary3;
+ long i;
ary2 = to_ary(ary2);
- if (RARRAY_LEN(ary1) + RARRAY_LEN(ary2) <= SMALL_ARRAY_LEN) {
- ary3 = rb_ary_new();
- rb_ary_union(ary3, ary1);
- rb_ary_union(ary3, ary2);
- return ary3;
- }
-
hash = ary_make_hash(ary1);
- rb_ary_union_hash(hash, ary2);
+ for (i=0; i<RARRAY_LEN(ary2); i++) {
+ VALUE elt = RARRAY_AREF(ary2, i);
+ if (!st_update(RHASH_TBL_RAW(hash), (st_data_t)elt, ary_hash_orset, (st_data_t)elt)) {
+ RB_OBJ_WRITTEN(hash, Qundef, elt);
+ }
+ }
ary3 = rb_hash_values(hash);
ary_recycle_hash(hash);
return ary3;
}
-/*
- * call-seq:
- * ary.union(other_ary1, other_ary2, ...) -> ary
- *
- * Set Union --- Returns a new array by joining <code>other_ary</code>s with +self+,
- * excluding any duplicates and preserving the order from the given arrays.
- *
- * It compares elements using their #hash and #eql? methods for efficiency.
- *
- * [ "a", "b", "c" ].union( [ "c", "d", "a" ] ) #=> [ "a", "b", "c", "d" ]
- * [ "a" ].union( ["e", "b"], ["a", "c", "b"] ) #=> [ "a", "e", "b", "c" ]
- * [ "a" ].union #=> [ "a" ]
- *
- * See also Array#|.
- */
-
-static VALUE
-rb_ary_union_multi(int argc, VALUE *argv, VALUE ary)
-{
- int i;
- long sum;
- VALUE hash, ary_union;
-
- sum = RARRAY_LEN(ary);
- for (i = 0; i < argc; i++){
- argv[i] = to_ary(argv[i]);
- sum += RARRAY_LEN(argv[i]);
- }
-
- if (sum <= SMALL_ARRAY_LEN) {
- ary_union = rb_ary_new();
-
- rb_ary_union(ary_union, ary);
- for (i = 0; i < argc; i++) rb_ary_union(ary_union, argv[i]);
-
- return ary_union;
- }
-
- hash = ary_make_hash(ary);
- for (i = 0; i < argc; i++) rb_ary_union_hash(hash, argv[i]);
-
- ary_union = rb_hash_values(hash);
- ary_recycle_hash(hash);
- return ary_union;
-}
-
-/*
- * call-seq:
- * ary.max -> obj
- * ary.max {|a, b| block} -> obj
- * ary.max(n) -> array
- * ary.max(n) {|a, b| block} -> array
- *
- * Returns the object in _ary_ with the maximum value. The
- * first form assumes all objects implement <code>Comparable</code>;
- * the second uses the block to return <em>a <=> b</em>.
- *
- * ary = %w(albatross dog horse)
- * ary.max #=> "horse"
- * ary.max {|a, b| a.length <=> b.length} #=> "albatross"
- *
- * If the +n+ argument is given, maximum +n+ elements are returned
- * as an array.
- *
- * ary = %w[albatross dog horse]
- * ary.max(2) #=> ["horse", "dog"]
- * ary.max(2) {|a, b| a.length <=> b.length } #=> ["albatross", "horse"]
- */
-static VALUE
-rb_ary_max(int argc, VALUE *argv, VALUE ary)
-{
- struct cmp_opt_data cmp_opt = { 0, 0 };
- VALUE result = Qundef, v;
- VALUE num;
- long i;
-
- if (rb_check_arity(argc, 0, 1) && !NIL_P(num = argv[0]))
- return rb_nmin_run(ary, num, 0, 1, 1);
-
- if (rb_block_given_p()) {
- for (i = 0; i < RARRAY_LEN(ary); i++) {
- v = RARRAY_AREF(ary, i);
- if (result == Qundef || rb_cmpint(rb_yield_values(2, v, result), v, result) > 0) {
- result = v;
- }
- }
- }
- else {
- for (i = 0; i < RARRAY_LEN(ary); i++) {
- v = RARRAY_AREF(ary, i);
- if (result == Qundef || OPTIMIZED_CMP(v, result, cmp_opt) > 0) {
- result = v;
- }
- }
- }
- if (result == Qundef) return Qnil;
- return result;
-}
-
-/*
- * call-seq:
- * ary.min -> obj
- * ary.min {| a,b | block } -> obj
- * ary.min(n) -> array
- * ary.min(n) {| a,b | block } -> array
- *
- * Returns the object in _ary_ with the minimum value. The
- * first form assumes all objects implement <code>Comparable</code>;
- * the second uses the block to return <em>a <=> b</em>.
- *
- * ary = %w(albatross dog horse)
- * ary.min #=> "albatross"
- * ary.min {|a, b| a.length <=> b.length} #=> "dog"
- *
- * If the +n+ argument is given, minimum +n+ elements are returned
- * as an array.
- *
- * ary = %w[albatross dog horse]
- * ary.min(2) #=> ["albatross", "dog"]
- * ary.min(2) {|a, b| a.length <=> b.length } #=> ["dog", "horse"]
- */
-static VALUE
-rb_ary_min(int argc, VALUE *argv, VALUE ary)
-{
- struct cmp_opt_data cmp_opt = { 0, 0 };
- VALUE result = Qundef, v;
- VALUE num;
- long i;
-
- if (rb_check_arity(argc, 0, 1) && !NIL_P(num = argv[0]))
- return rb_nmin_run(ary, num, 0, 0, 1);
-
- if (rb_block_given_p()) {
- for (i = 0; i < RARRAY_LEN(ary); i++) {
- v = RARRAY_AREF(ary, i);
- if (result == Qundef || rb_cmpint(rb_yield_values(2, v, result), v, result) < 0) {
- result = v;
- }
- }
- }
- else {
- for (i = 0; i < RARRAY_LEN(ary); i++) {
- v = RARRAY_AREF(ary, i);
- if (result == Qundef || OPTIMIZED_CMP(v, result, cmp_opt) < 0) {
- result = v;
- }
- }
- }
- if (result == Qundef) return Qnil;
- return result;
-}
-
static int
push_value(st_data_t key, st_data_t val, st_data_t ary)
{
@@ -4830,7 +4205,7 @@ push_value(st_data_t key, st_data_t val, st_data_t ary)
/*
* call-seq:
* ary.uniq! -> ary or nil
- * ary.uniq! {|item| ...} -> ary or nil
+ * ary.uniq! { |item| ... } -> ary or nil
*
* Removes duplicate elements from +self+.
*
@@ -4850,7 +4225,7 @@ push_value(st_data_t key, st_data_t val, st_data_t ary)
* b.uniq! # => nil
*
* c = [["student","sam"], ["student","george"], ["teacher","matz"]]
- * c.uniq! {|s| s.first} # => [["student", "sam"], ["teacher", "matz"]]
+ * c.uniq! { |s| s.first } # => [["student", "sam"], ["teacher", "matz"]]
*
*/
@@ -4879,7 +4254,7 @@ rb_ary_uniq_bang(VALUE ary)
FL_SET_EMBED(ary);
}
ary_resize_capa(ary, hash_size);
- rb_hash_foreach(hash, push_value, ary);
+ st_foreach(rb_hash_tbl_raw(hash), push_value, ary);
ary_recycle_hash(hash);
return ary;
@@ -4888,7 +4263,7 @@ rb_ary_uniq_bang(VALUE ary)
/*
* call-seq:
* ary.uniq -> new_ary
- * ary.uniq {|item| ...} -> new_ary
+ * ary.uniq { |item| ... } -> new_ary
*
* Returns a new array by removing duplicate values in +self+.
*
@@ -4902,7 +4277,7 @@ rb_ary_uniq_bang(VALUE ary)
* a.uniq # => ["a", "b", "c"]
*
* b = [["student","sam"], ["student","george"], ["teacher","matz"]]
- * b.uniq {|s| s.first} # => [["student", "sam"], ["teacher", "matz"]]
+ * b.uniq { |s| s.first } # => [["student", "sam"], ["teacher", "matz"]]
*
*/
@@ -4946,14 +4321,14 @@ rb_ary_compact_bang(VALUE ary)
long n;
rb_ary_modify(ary);
- p = t = (VALUE *)RARRAY_CONST_PTR_TRANSIENT(ary); /* WB: no new reference */
+ p = t = (VALUE *)RARRAY_CONST_PTR(ary); /* WB: no new reference */
end = p + RARRAY_LEN(ary);
while (t < end) {
if (NIL_P(*t)) t++;
else *p++ = *t++;
}
- n = p - RARRAY_CONST_PTR_TRANSIENT(ary);
+ n = p - RARRAY_CONST_PTR(ary);
if (RARRAY_LEN(ary) == n) {
return Qnil;
}
@@ -4984,7 +4359,7 @@ rb_ary_compact(VALUE ary)
* call-seq:
* ary.count -> int
* ary.count(obj) -> int
- * ary.count {|item| block} -> int
+ * ary.count { |item| block } -> int
*
* Returns the number of elements.
*
@@ -4997,7 +4372,7 @@ rb_ary_compact(VALUE ary)
* ary = [1, 2, 4, 2]
* ary.count #=> 4
* ary.count(2) #=> 2
- * ary.count {|x| x%2 == 0} #=> 3
+ * ary.count { |x| x%2 == 0 } #=> 3
*
*/
@@ -5006,7 +4381,7 @@ rb_ary_count(int argc, VALUE *argv, VALUE ary)
{
long i, n = 0;
- if (rb_check_arity(argc, 0, 1) == 0) {
+ if (argc == 0) {
VALUE v;
if (!rb_block_given_p())
@@ -5018,8 +4393,9 @@ rb_ary_count(int argc, VALUE *argv, VALUE ary)
}
}
else {
- VALUE obj = argv[0];
+ VALUE obj;
+ rb_scan_args(argc, argv, "1", &obj);
if (rb_block_given_p()) {
rb_warn("given block not used");
}
@@ -5085,7 +4461,7 @@ flatten(VALUE ary, int level, int *modified)
st_free_table(memo);
- RBASIC_SET_CLASS(result, rb_obj_class(ary));
+ RBASIC_SET_CLASS(result, rb_class_of(ary));
return result;
}
@@ -5115,7 +4491,7 @@ rb_ary_flatten_bang(int argc, VALUE *argv, VALUE ary)
int mod = 0, level = -1;
VALUE result, lv;
- lv = (rb_check_arity(argc, 0, 1) ? argv[0] : Qnil);
+ rb_scan_args(argc, argv, "01", &lv);
rb_ary_modify_check(ary);
if (!NIL_P(lv)) level = NUM2INT(lv);
if (level == 0) return Qnil;
@@ -5158,12 +4534,11 @@ static VALUE
rb_ary_flatten(int argc, VALUE *argv, VALUE ary)
{
int mod = 0, level = -1;
- VALUE result;
+ VALUE result, lv;
- if (rb_check_arity(argc, 0, 1) && !NIL_P(argv[0])) {
- level = NUM2INT(argv[0]);
- if (level == 0) return ary_make_shared_copy(ary);
- }
+ rb_scan_args(argc, argv, "01", &lv);
+ if (!NIL_P(lv)) level = NUM2INT(lv);
+ if (level == 0) return ary_make_shared_copy(ary);
result = flatten(ary, level, &mod);
OBJ_INFECT(result, ary);
@@ -5216,8 +4591,8 @@ rb_ary_shuffle_bang(int argc, VALUE *argv, VALUE ary)
while (i) {
long j = RAND_UPTO(i);
VALUE tmp;
- if (len != RARRAY_LEN(ary) || ptr != RARRAY_CONST_PTR_TRANSIENT(ary)) {
- rb_raise(rb_eRuntimeError, "modified during shuffle");
+ if (len != RARRAY_LEN(ary) || ptr != RARRAY_CONST_PTR(ary)) {
+ rb_raise(rb_eRuntimeError, "modified during shuffle");
}
tmp = ptr[--i];
ptr[i] = ptr[j];
@@ -5269,14 +4644,11 @@ rb_ary_shuffle(int argc, VALUE *argv, VALUE ary)
* If the array is empty the first form returns +nil+ and the second form
* returns an empty array.
*
+ * The optional +rng+ argument will be used as the random number generator.
+ *
* a = [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
* a.sample #=> 7
* a.sample(4) #=> [6, 4, 2, 5]
- *
- * The optional +rng+ argument will be used as the random number generator.
- *
- * a.sample(random: Random.new(1)) #=> 6
- * a.sample(4, random: Random.new(1)) #=> [6, 10, 9, 2]
*/
@@ -5287,7 +4659,6 @@ rb_ary_sample(int argc, VALUE *argv, VALUE ary)
VALUE opts, randgen = rb_cRandom;
long n, len, i, j, k, idx[10];
long rnds[numberof(idx)];
- long memo_threshold;
if (OPTHASH_GIVEN_P(opts)) {
VALUE rnd;
@@ -5300,7 +4671,7 @@ rb_ary_sample(int argc, VALUE *argv, VALUE ary)
}
}
len = RARRAY_LEN(ary);
- if (rb_check_arity(argc, 0, 1) == 0) {
+ if (argc == 0) {
if (len < 2)
i = 0;
else
@@ -5308,7 +4679,7 @@ rb_ary_sample(int argc, VALUE *argv, VALUE ary)
return rb_ary_elt(ary, i);
}
- nv = argv[0];
+ rb_scan_args(argc, argv, "1", &nv);
n = NUM2LONG(nv);
if (n < 0) rb_raise(rb_eArgError, "negative sample number");
if (n > len) n = len;
@@ -5347,11 +4718,6 @@ rb_ary_sample(int argc, VALUE *argv, VALUE ary)
}
return rb_ary_new_from_args(3, RARRAY_AREF(ary, i), RARRAY_AREF(ary, j), RARRAY_AREF(ary, k));
}
- memo_threshold =
- len < 2560 ? len / 128 :
- len < 5120 ? len / 64 :
- len < 10240 ? len / 32 :
- len / 16;
if (n <= numberof(idx)) {
long sorted[numberof(idx)];
sorted[0] = idx[0] = rnds[0];
@@ -5365,43 +4731,11 @@ rb_ary_sample(int argc, VALUE *argv, VALUE ary)
sorted[j] = idx[i] = k;
}
result = rb_ary_new_capa(n);
- RARRAY_PTR_USE_TRANSIENT(result, ptr_result, {
- for (i=0; i<n; i++) {
- ptr_result[i] = RARRAY_AREF(ary, idx[i]);
- }
- });
- }
- else if (n <= memo_threshold / 2) {
- long max_idx = 0;
-#undef RUBY_UNTYPED_DATA_WARNING
-#define RUBY_UNTYPED_DATA_WARNING 0
- VALUE vmemo = Data_Wrap_Struct(0, 0, st_free_table, 0);
- st_table *memo = st_init_numtable_with_size(n);
- DATA_PTR(vmemo) = memo;
- result = rb_ary_new_capa(n);
RARRAY_PTR_USE(result, ptr_result, {
for (i=0; i<n; i++) {
- long r = RAND_UPTO(len-i) + i;
- ptr_result[i] = r;
- if (r > max_idx) max_idx = r;
+ ptr_result[i] = RARRAY_AREF(ary, idx[i]);
}
- len = RARRAY_LEN(ary);
- if (len <= max_idx) n = 0;
- else if (n > len) n = len;
- RARRAY_PTR_USE_TRANSIENT(ary, ptr_ary, {
- for (i=0; i<n; i++) {
- long j2 = j = ptr_result[i];
- long i2 = i;
- st_data_t value;
- if (st_lookup(memo, (st_data_t)i, &value)) i2 = (long)value;
- if (st_lookup(memo, (st_data_t)j, &value)) j2 = (long)value;
- st_insert(memo, (st_data_t)j, (st_data_t)i2);
- ptr_result[i] = ptr_ary[j2];
- }
- });
});
- DATA_PTR(vmemo) = 0;
- st_free_table(memo);
}
else {
result = rb_ary_dup(ary);
@@ -5431,16 +4765,16 @@ rb_ary_cycle_size(VALUE self, VALUE args, VALUE eobj)
n = RARRAY_AREF(args, 0);
}
if (RARRAY_LEN(self) == 0) return INT2FIX(0);
- if (n == Qnil) return DBL2NUM(HUGE_VAL);
+ if (n == Qnil) return DBL2NUM(INFINITY);
mul = NUM2LONG(n);
if (mul <= 0) return INT2FIX(0);
n = LONG2FIX(mul);
- return rb_fix_mul_fix(rb_ary_length(self), n);
+ return rb_funcallv(rb_ary_length(self), '*', 1, &n);
}
/*
* call-seq:
- * ary.cycle(n=nil) {|obj| block} -> nil
+ * ary.cycle(n=nil) { |obj| block } -> nil
* ary.cycle(n=nil) -> Enumerator
*
* Calls the given block for each element +n+ times or forever if +nil+ is
@@ -5453,8 +4787,8 @@ rb_ary_cycle_size(VALUE self, VALUE args, VALUE eobj)
* If no block is given, an Enumerator is returned instead.
*
* a = ["a", "b", "c"]
- * a.cycle {|x| puts x} # print, a, b, c, a, b, c,.. forever.
- * a.cycle(2) {|x| puts x} # print, a, b, c, a, b, c.
+ * a.cycle { |x| puts x } # print, a, b, c, a, b, c,.. forever.
+ * a.cycle(2) { |x| puts x } # print, a, b, c, a, b, c.
*
*/
@@ -5462,15 +4796,16 @@ static VALUE
rb_ary_cycle(int argc, VALUE *argv, VALUE ary)
{
long n, i;
+ VALUE nv = Qnil;
- rb_check_arity(argc, 0, 1);
+ rb_scan_args(argc, argv, "01", &nv);
RETURN_SIZED_ENUMERATOR(ary, argc, argv, rb_ary_cycle_size);
- if (argc == 0 || NIL_P(argv[0])) {
+ if (NIL_P(nv)) {
n = -1;
}
else {
- n = NUM2LONG(argv[0]);
+ n = NUM2LONG(nv);
if (n <= 0) return Qnil;
}
@@ -5482,6 +4817,8 @@ rb_ary_cycle(int argc, VALUE *argv, VALUE ary)
return Qnil;
}
+#define tmpbuf(n, size) rb_str_tmp_new((n)*(size))
+#define tmpbuf_discard(s) (rb_str_resize((s), 0L), RBASIC_SET_CLASS_RAW(s, rb_cString))
#define tmpary(n) rb_ary_tmp_new(n)
#define tmpary_discard(a) (ary_discard(a), RBASIC_SET_CLASS_RAW(a, rb_cArray))
@@ -5494,9 +4831,11 @@ static int
yield_indexed_values(const VALUE values, const long r, const long *const p)
{
const VALUE result = rb_ary_new2(r);
+ VALUE *const result_array = RARRAY_PTR(result);
+ const VALUE *const values_array = RARRAY_CONST_PTR(values);
long i;
- for (i = 0; i < r; i++) RARRAY_ASET(result, i, RARRAY_AREF(values, p[i]));
+ for (i = 0; i < r; i++) result_array[i] = values_array[p[i]];
ARY_SET_LEN(result, r);
rb_yield(result);
return !RBASIC(values)->klass;
@@ -5505,8 +4844,8 @@ yield_indexed_values(const VALUE values, const long r, const long *const p)
/*
* Compute permutations of +r+ elements of the set <code>[0..n-1]</code>.
*
- * When we have a complete permutation of array indices, copy the values
- * at those indices into a new array and yield that array.
+ * When we have a complete permutation of array indexes, copy the values
+ * at those indexes into a new array and yield that array.
*
* n: the size of the set
* r: the number of elements in each permutation
@@ -5556,16 +4895,10 @@ permute0(const long n, const long r, long *const p, char *const used, const VALU
static VALUE
descending_factorial(long from, long how_many)
{
- VALUE cnt;
- if (how_many > 0) {
- cnt = LONG2FIX(from);
- while (--how_many > 0) {
- long v = --from;
- cnt = rb_int_mul(cnt, LONG2FIX(v));
- }
- }
- else {
- cnt = LONG2FIX(how_many == 0);
+ VALUE cnt = LONG2FIX(how_many >= 0);
+ while (how_many-- > 0) {
+ VALUE v = LONG2FIX(from--);
+ cnt = rb_funcallv(cnt, '*', 1, &v);
}
return cnt;
}
@@ -5573,23 +4906,16 @@ descending_factorial(long from, long how_many)
static VALUE
binomial_coefficient(long comb, long size)
{
- VALUE r;
- long i;
+ VALUE r, v;
if (comb > size-comb) {
comb = size-comb;
}
if (comb < 0) {
return LONG2FIX(0);
}
- else if (comb == 0) {
- return LONG2FIX(1);
- }
- r = LONG2FIX(size);
- for (i = 1; i < comb; ++i) {
- r = rb_int_mul(r, LONG2FIX(size - i));
- r = rb_int_idiv(r, LONG2FIX(i + 1));
- }
- return r;
+ r = descending_factorial(size, comb);
+ v = descending_factorial(comb, comb);
+ return rb_funcallv(r, id_div, 1, &v);
}
static VALUE
@@ -5603,9 +4929,9 @@ rb_ary_permutation_size(VALUE ary, VALUE args, VALUE eobj)
/*
* call-seq:
- * ary.permutation {|p| block} -> ary
+ * ary.permutation { |p| block } -> ary
* ary.permutation -> Enumerator
- * ary.permutation(n) {|p| block} -> ary
+ * ary.permutation(n) { |p| block } -> ary
* ary.permutation(n) -> Enumerator
*
* When invoked with a block, yield all permutations of length +n+ of the
@@ -5632,13 +4958,13 @@ rb_ary_permutation_size(VALUE ary, VALUE args, VALUE eobj)
static VALUE
rb_ary_permutation(int argc, VALUE *argv, VALUE ary)
{
+ VALUE num;
long r, n, i;
n = RARRAY_LEN(ary); /* Array length */
RETURN_SIZED_ENUMERATOR(ary, argc, argv, rb_ary_permutation_size); /* Return enumerator if no block */
- r = n;
- if (rb_check_arity(argc, 0, 1) && !NIL_P(argv[0]))
- r = NUM2LONG(argv[0]); /* Permutation size from argument */
+ rb_scan_args(argc, argv, "01", &num);
+ r = NIL_P(num) ? n : NUM2LONG(num); /* Permutation size from argument */
if (r < 0 || n < r) {
/* no permutations: yield nothing */
@@ -5699,7 +5025,7 @@ rb_ary_combination_size(VALUE ary, VALUE args, VALUE eobj)
/*
* call-seq:
- * ary.combination(n) {|c| block} -> ary
+ * ary.combination(n) { |c| block } -> ary
* ary.combination(n) -> Enumerator
*
* When invoked with a block, yields all combinations of length +n+ of elements
@@ -5737,7 +5063,7 @@ rb_ary_combination(VALUE ary, VALUE num)
rb_yield(rb_ary_new2(0));
}
else if (n == 1) {
- for (i = 0; i < RARRAY_LEN(ary); i++) {
+ for (i = 0; i < len; i++) {
rb_yield(rb_ary_new3(1, RARRAY_AREF(ary, i)));
}
}
@@ -5758,8 +5084,8 @@ rb_ary_combination(VALUE ary, VALUE num)
* Compute repeated permutations of +r+ elements of the set
* <code>[0..n-1]</code>.
*
- * When we have a complete repeated permutation of array indices, copy the
- * values at those indices into a new array and yield that array.
+ * When we have a complete repeated permutation of array indexes, copy the
+ * values at those indexes into a new array and yield that array.
*
* n: the size of the set
* r: the number of elements in each permutation
@@ -5794,19 +5120,19 @@ rb_ary_repeated_permutation_size(VALUE ary, VALUE args, VALUE eobj)
{
long n = RARRAY_LEN(ary);
long k = NUM2LONG(RARRAY_AREF(args, 0));
+ VALUE v;
if (k < 0) {
return LONG2FIX(0);
}
- if (n <= 0) {
- return LONG2FIX(!k);
- }
- return rb_int_positive_pow(n, (unsigned long)k);
+
+ v = LONG2NUM(k);
+ return rb_funcallv(LONG2NUM(n), id_power, 1, &v);
}
/*
* call-seq:
- * ary.repeated_permutation(n) {|p| block} -> ary
+ * ary.repeated_permutation(n) { |p| block } -> ary
* ary.repeated_permutation(n) -> Enumerator
*
* When invoked with a block, yield all repeated permutations of length +n+ of
@@ -5896,7 +5222,7 @@ rb_ary_repeated_combination_size(VALUE ary, VALUE args, VALUE eobj)
/*
* call-seq:
- * ary.repeated_combination(n) {|c| block} -> ary
+ * ary.repeated_combination(n) { |c| block } -> ary
* ary.repeated_combination(n) -> Enumerator
*
* When invoked with a block, yields all repeated combinations of length +n+ of
@@ -5936,7 +5262,7 @@ rb_ary_repeated_combination(VALUE ary, VALUE num)
rb_yield(rb_ary_new2(0));
}
else if (n == 1) {
- for (i = 0; i < RARRAY_LEN(ary); i++) {
+ for (i = 0; i < len; i++) {
rb_yield(rb_ary_new3(1, RARRAY_AREF(ary, i)));
}
}
@@ -5959,7 +5285,7 @@ rb_ary_repeated_combination(VALUE ary, VALUE num)
/*
* call-seq:
* ary.product(other_ary, ...) -> new_ary
- * ary.product(other_ary, ...) {|p| block} -> ary
+ * ary.product(other_ary, ...) { |p| block } -> ary
*
* Returns an array of all combinations of elements from all arrays.
*
@@ -5982,14 +5308,15 @@ rb_ary_product(int argc, VALUE *argv, VALUE ary)
{
int n = argc+1; /* How many arrays we're operating on */
volatile VALUE t0 = tmpary(n);
- volatile VALUE t1 = Qundef;
+ volatile VALUE t1 = tmpbuf(n, sizeof(int));
VALUE *arrays = RARRAY_PTR(t0); /* The arrays we're computing the product of */
- int *counters = ALLOCV_N(int, t1, n); /* The current position in each one */
+ int *counters = (int*)RSTRING_PTR(t1); /* The current position in each one */
VALUE result = Qnil; /* The array we'll be returning, when no block given */
long i,j;
long resultlen = 1;
RBASIC_CLEAR_CLASS(t0);
+ RBASIC_CLEAR_CLASS(t1);
/* initialize the arrays of arrays */
ARY_SET_LEN(t0, n);
@@ -6060,7 +5387,7 @@ rb_ary_product(int argc, VALUE *argv, VALUE ary)
}
done:
tmpary_discard(t0);
- ALLOCV_END(t1);
+ tmpbuf_discard(t1);
return NIL_P(result) ? ary : result;
}
@@ -6092,7 +5419,7 @@ rb_ary_take(VALUE obj, VALUE n)
/*
* call-seq:
- * ary.take_while {|obj| block} -> new_ary
+ * ary.take_while { |obj| block } -> new_ary
* ary.take_while -> Enumerator
*
* Passes elements to the block until the block returns +nil+ or +false+, then
@@ -6103,7 +5430,7 @@ rb_ary_take(VALUE obj, VALUE n)
* See also Array#drop_while
*
* a = [1, 2, 3, 4, 5, 0]
- * a.take_while {|i| i < 3} #=> [1, 2]
+ * a.take_while { |i| i < 3 } #=> [1, 2]
*
*/
@@ -6151,7 +5478,7 @@ rb_ary_drop(VALUE ary, VALUE n)
/*
* call-seq:
- * ary.drop_while {|obj| block} -> new_ary
+ * ary.drop_while { |obj| block } -> new_ary
* ary.drop_while -> Enumerator
*
* Drops elements up to, but not including, the first element for which the
@@ -6181,31 +5508,20 @@ rb_ary_drop_while(VALUE ary)
/*
* call-seq:
- * ary.any? [{|obj| block} ] -> true or false
- * ary.any?(pattern) -> true or false
+ * ary.any? [{ |obj| block }] -> true or false
*
* See also Enumerable#any?
*/
static VALUE
-rb_ary_any_p(int argc, VALUE *argv, VALUE ary)
+rb_ary_any_p(VALUE ary)
{
long i, len = RARRAY_LEN(ary);
+ const VALUE *ptr = RARRAY_CONST_PTR(ary);
- rb_check_arity(argc, 0, 1);
if (!len) return Qfalse;
- if (argc) {
- if (rb_block_given_p()) {
- rb_warn("given block not used");
- }
- for (i = 0; i < RARRAY_LEN(ary); ++i) {
- if (RTEST(rb_funcall(argv[0], idEqq, 1, RARRAY_AREF(ary, i)))) return Qtrue;
- }
- }
- else if (!rb_block_given_p()) {
- for (i = 0; i < len; ++i) {
- if (RTEST(RARRAY_AREF(ary, i))) return Qtrue;
- }
+ if (!rb_block_given_p()) {
+ for (i = 0; i < len; ++i) if (RTEST(ptr[i])) return Qtrue;
}
else {
for (i = 0; i < RARRAY_LEN(ary); ++i) {
@@ -6216,124 +5532,6 @@ rb_ary_any_p(int argc, VALUE *argv, VALUE ary)
}
/*
- * call-seq:
- * ary.all? [{|obj| block} ] -> true or false
- * ary.all?(pattern) -> true or false
- *
- * See also Enumerable#all?
- */
-
-static VALUE
-rb_ary_all_p(int argc, VALUE *argv, VALUE ary)
-{
- long i, len = RARRAY_LEN(ary);
-
- rb_check_arity(argc, 0, 1);
- if (!len) return Qtrue;
- if (argc) {
- if (rb_block_given_p()) {
- rb_warn("given block not used");
- }
- for (i = 0; i < RARRAY_LEN(ary); ++i) {
- if (!RTEST(rb_funcall(argv[0], idEqq, 1, RARRAY_AREF(ary, i)))) return Qfalse;
- }
- }
- else if (!rb_block_given_p()) {
- for (i = 0; i < len; ++i) {
- if (!RTEST(RARRAY_AREF(ary, i))) return Qfalse;
- }
- }
- else {
- for (i = 0; i < RARRAY_LEN(ary); ++i) {
- if (!RTEST(rb_yield(RARRAY_AREF(ary, i)))) return Qfalse;
- }
- }
- return Qtrue;
-}
-
-/*
- * call-seq:
- * ary.none? [{|obj| block} ] -> true or false
- * ary.none?(pattern) -> true or false
- *
- * See also Enumerable#none?
- */
-
-static VALUE
-rb_ary_none_p(int argc, VALUE *argv, VALUE ary)
-{
- long i, len = RARRAY_LEN(ary);
-
- rb_check_arity(argc, 0, 1);
- if (!len) return Qtrue;
- if (argc) {
- if (rb_block_given_p()) {
- rb_warn("given block not used");
- }
- for (i = 0; i < RARRAY_LEN(ary); ++i) {
- if (RTEST(rb_funcall(argv[0], idEqq, 1, RARRAY_AREF(ary, i)))) return Qfalse;
- }
- }
- else if (!rb_block_given_p()) {
- for (i = 0; i < len; ++i) {
- if (RTEST(RARRAY_AREF(ary, i))) return Qfalse;
- }
- }
- else {
- for (i = 0; i < RARRAY_LEN(ary); ++i) {
- if (RTEST(rb_yield(RARRAY_AREF(ary, i)))) return Qfalse;
- }
- }
- return Qtrue;
-}
-
-/*
- * call-seq:
- * ary.one? [{|obj| block} ] -> true or false
- * ary.one?(pattern) -> true or false
- *
- * See also Enumerable#one?
- */
-
-static VALUE
-rb_ary_one_p(int argc, VALUE *argv, VALUE ary)
-{
- long i, len = RARRAY_LEN(ary);
- VALUE result = Qfalse;
-
- rb_check_arity(argc, 0, 1);
- if (!len) return Qfalse;
- if (argc) {
- if (rb_block_given_p()) {
- rb_warn("given block not used");
- }
- for (i = 0; i < RARRAY_LEN(ary); ++i) {
- if (RTEST(rb_funcall(argv[0], idEqq, 1, RARRAY_AREF(ary, i)))) {
- if (result) return Qfalse;
- result = Qtrue;
- }
- }
- }
- else if (!rb_block_given_p()) {
- for (i = 0; i < len; ++i) {
- if (RTEST(RARRAY_AREF(ary, i))) {
- if (result) return Qfalse;
- result = Qtrue;
- }
- }
- }
- else {
- for (i = 0; i < RARRAY_LEN(ary); ++i) {
- if (RTEST(rb_yield(RARRAY_AREF(ary, i)))) {
- if (result) return Qfalse;
- result = Qtrue;
- }
- }
- }
- return result;
-}
-
-/*
* call-seq:
* ary.dig(idx, ...) -> object
*
@@ -6345,11 +5543,11 @@ rb_ary_one_p(int argc, VALUE *argv, VALUE ary)
*
* a.dig(0, 1, 1) #=> 3
* a.dig(1, 2, 3) #=> nil
- * a.dig(0, 0, 0) #=> TypeError: Integer does not have #dig method
+ * a.dig(0, 0, 0) #=> NoMethodError, undefined method `dig' for 1:Fixnum
* [42, {foo: :bar}].dig(1, :foo) #=> :bar
*/
-static VALUE
+VALUE
rb_ary_dig(int argc, VALUE *argv, VALUE self)
{
rb_check_arity(argc, 1, UNLIMITED_ARGUMENTS);
@@ -6359,178 +5557,6 @@ rb_ary_dig(int argc, VALUE *argv, VALUE self)
return rb_obj_dig(argc, argv, self, Qnil);
}
-static inline VALUE
-finish_exact_sum(long n, VALUE r, VALUE v, int z)
-{
- if (n != 0)
- v = rb_fix_plus(LONG2FIX(n), v);
- if (r != Qundef) {
- /* r can be an Integer when mathn is loaded */
- if (FIXNUM_P(r))
- v = rb_fix_plus(r, v);
- else if (RB_TYPE_P(r, T_BIGNUM))
- v = rb_big_plus(r, v);
- else
- v = rb_rational_plus(r, v);
- }
- else if (!n && z) {
- v = rb_fix_plus(LONG2FIX(0), v);
- }
- return v;
-}
-
-/*
- * call-seq:
- * ary.sum(init=0) -> number
- * ary.sum(init=0) {|e| expr } -> number
- *
- * Returns the sum of elements.
- * For example, [e1, e2, e3].sum returns init + e1 + e2 + e3.
- *
- * If a block is given, the block is applied to each element
- * before addition.
- *
- * If <i>ary</i> is empty, it returns <i>init</i>.
- *
- * [].sum #=> 0
- * [].sum(0.0) #=> 0.0
- * [1, 2, 3].sum #=> 6
- * [3, 5.5].sum #=> 8.5
- * [2.5, 3.0].sum(0.0) {|e| e * e } #=> 15.25
- * [Object.new].sum #=> TypeError
- *
- * The (arithmetic) mean value of an array can be obtained as follows.
- *
- * mean = ary.sum(0.0) / ary.length
- *
- * This method can be used for non-numeric objects by
- * explicit <i>init</i> argument.
- *
- * ["a", "b", "c"].sum("") #=> "abc"
- * [[1], [[2]], [3]].sum([]) #=> [1, [2], 3]
- *
- * However, Array#join and Array#flatten is faster than Array#sum for
- * array of strings and array of arrays.
- *
- * ["a", "b", "c"].join #=> "abc"
- * [[1], [[2]], [3]].flatten(1) #=> [1, [2], 3]
- *
- *
- * Array#sum method may not respect method redefinition of "+" methods
- * such as Integer#+.
- *
- */
-
-static VALUE
-rb_ary_sum(int argc, VALUE *argv, VALUE ary)
-{
- VALUE e, v, r;
- long i, n;
- int block_given;
-
- v = (rb_check_arity(argc, 0, 1) ? argv[0] : LONG2FIX(0));
-
- block_given = rb_block_given_p();
-
- if (RARRAY_LEN(ary) == 0)
- return v;
-
- n = 0;
- r = Qundef;
- for (i = 0; i < RARRAY_LEN(ary); i++) {
- e = RARRAY_AREF(ary, i);
- if (block_given)
- e = rb_yield(e);
- if (FIXNUM_P(e)) {
- n += FIX2LONG(e); /* should not overflow long type */
- if (!FIXABLE(n)) {
- v = rb_big_plus(LONG2NUM(n), v);
- n = 0;
- }
- }
- else if (RB_TYPE_P(e, T_BIGNUM))
- v = rb_big_plus(e, v);
- else if (RB_TYPE_P(e, T_RATIONAL)) {
- if (r == Qundef)
- r = e;
- else
- r = rb_rational_plus(r, e);
- }
- else
- goto not_exact;
- }
- v = finish_exact_sum(n, r, v, argc!=0);
- return v;
-
- not_exact:
- v = finish_exact_sum(n, r, v, i!=0);
-
- if (RB_FLOAT_TYPE_P(e)) {
- /*
- * Kahan-Babuska balancing compensated summation algorithm
- * See http://link.springer.com/article/10.1007/s00607-005-0139-x
- */
- double f, c;
-
- f = NUM2DBL(v);
- c = 0.0;
- goto has_float_value;
- for (; i < RARRAY_LEN(ary); i++) {
- double x, t;
- e = RARRAY_AREF(ary, i);
- if (block_given)
- e = rb_yield(e);
- if (RB_FLOAT_TYPE_P(e))
- has_float_value:
- x = RFLOAT_VALUE(e);
- else if (FIXNUM_P(e))
- x = FIX2LONG(e);
- else if (RB_TYPE_P(e, T_BIGNUM))
- x = rb_big2dbl(e);
- else if (RB_TYPE_P(e, T_RATIONAL))
- x = rb_num2dbl(e);
- else
- goto not_float;
-
- if (isnan(f)) continue;
- if (isnan(x)) {
- f = x;
- continue;
- }
- if (isinf(x)) {
- if (isinf(f) && signbit(x) != signbit(f))
- f = NAN;
- else
- f = x;
- continue;
- }
- if (isinf(f)) continue;
-
- t = f + x;
- if (fabs(f) >= fabs(x))
- c += ((f - t) + x);
- else
- c += ((x - t) + f);
- f = t;
- }
- f += c;
- return DBL2NUM(f);
-
- not_float:
- v = DBL2NUM(f);
- }
-
- goto has_some_value;
- for (; i < RARRAY_LEN(ary); i++) {
- e = RARRAY_AREF(ary, i);
- if (block_given)
- e = rb_yield(e);
- has_some_value:
- v = rb_funcall(v, idPLUS, 1, e);
- }
- return v;
-}
-
/*
* Arrays are ordered, integer-indexed collections of any object.
*
@@ -6564,12 +5590,11 @@ rb_ary_sum(int argc, VALUE *argv, VALUE ary)
* This method is safe to use with mutable objects such as hashes, strings or
* other arrays:
*
- * Array.new(4) {Hash.new} #=> [{}, {}, {}, {}]
- * Array.new(4) {|i| i.to_s } #=> ["0", "1", "2", "3"]
+ * Array.new(4) { Hash.new } #=> [{}, {}, {}, {}]
*
* This is also a quick way to build up multi-dimensional arrays:
*
- * empty_table = Array.new(3) {Array.new(3)}
+ * empty_table = Array.new(3) { Array.new(3) }
* #=> [[nil, nil, nil], [nil, nil, nil], [nil, nil, nil]]
*
* An array can also be created by using the Array() method, provided by
@@ -6716,7 +5741,7 @@ rb_ary_sum(int argc, VALUE *argv, VALUE ary)
* Note that this operation leaves the array unchanged.
*
* arr = [1, 2, 3, 4, 5]
- * arr.each {|a| print a -= 10, " "}
+ * arr.each { |a| print a -= 10, " " }
* # prints: -9 -8 -7 -6 -5
* #=> [1, 2, 3, 4, 5]
*
@@ -6725,15 +5750,15 @@ rb_ary_sum(int argc, VALUE *argv, VALUE ary)
*
* words = %w[first second third fourth fifth sixth]
* str = ""
- * words.reverse_each {|word| str += "#{word} "}
+ * words.reverse_each { |word| str += "#{word} " }
* p str #=> "sixth fifth fourth third second first "
*
* The #map method can be used to create a new array based on the original
* array, but with the values modified by the supplied block:
*
- * arr.map {|a| 2*a} #=> [2, 4, 6, 8, 10]
+ * arr.map { |a| 2*a } #=> [2, 4, 6, 8, 10]
* arr #=> [1, 2, 3, 4, 5]
- * arr.map! {|a| a**2} #=> [1, 4, 9, 16, 25]
+ * arr.map! { |a| a**2 } #=> [1, 4, 9, 16, 25]
* arr #=> [1, 4, 9, 16, 25]
*
* == Selecting Items from an Array
@@ -6747,9 +5772,9 @@ rb_ary_sum(int argc, VALUE *argv, VALUE ary)
* === Non-destructive Selection
*
* arr = [1, 2, 3, 4, 5, 6]
- * arr.select {|a| a > 3} #=> [4, 5, 6]
- * arr.reject {|a| a < 3} #=> [3, 4, 5, 6]
- * arr.drop_while {|a| a < 4} #=> [4, 5, 6]
+ * arr.select { |a| a > 3 } #=> [4, 5, 6]
+ * arr.reject { |a| a < 3 } #=> [3, 4, 5, 6]
+ * arr.drop_while { |a| a < 4 } #=> [4, 5, 6]
* arr #=> [1, 2, 3, 4, 5, 6]
*
* === Destructive Selection
@@ -6760,11 +5785,11 @@ rb_ary_sum(int argc, VALUE *argv, VALUE ary)
* Similar to #select vs. #reject, #delete_if and #keep_if have the exact
* opposite result when supplied with the same block:
*
- * arr.delete_if {|a| a < 4} #=> [4, 5, 6]
+ * arr.delete_if { |a| a < 4 } #=> [4, 5, 6]
* arr #=> [4, 5, 6]
*
* arr = [1, 2, 3, 4, 5, 6]
- * arr.keep_if {|a| a < 4} #=> [1, 2, 3]
+ * arr.keep_if { |a| a < 4 } #=> [1, 2, 3]
* arr #=> [1, 2, 3]
*
*/
@@ -6789,6 +5814,7 @@ Init_Array(void)
rb_define_method(rb_cArray, "to_a", rb_ary_to_a, 0);
rb_define_method(rb_cArray, "to_h", rb_ary_to_h, 0);
rb_define_method(rb_cArray, "to_ary", rb_ary_to_ary_m, 0);
+ rb_define_method(rb_cArray, "frozen?", rb_ary_frozen_p, 0);
rb_define_method(rb_cArray, "==", rb_ary_equal, 1);
rb_define_method(rb_cArray, "eql?", rb_ary_eql, 1);
@@ -6800,16 +5826,12 @@ Init_Array(void)
rb_define_method(rb_cArray, "fetch", rb_ary_fetch, -1);
rb_define_method(rb_cArray, "first", rb_ary_first, -1);
rb_define_method(rb_cArray, "last", rb_ary_last, -1);
- rb_define_method(rb_cArray, "concat", rb_ary_concat_multi, -1);
- rb_define_method(rb_cArray, "union", rb_ary_union_multi, -1);
- rb_define_method(rb_cArray, "difference", rb_ary_difference_multi, -1);
+ rb_define_method(rb_cArray, "concat", rb_ary_concat, 1);
rb_define_method(rb_cArray, "<<", rb_ary_push, 1);
rb_define_method(rb_cArray, "push", rb_ary_push_m, -1);
- rb_define_alias(rb_cArray, "append", "push");
rb_define_method(rb_cArray, "pop", rb_ary_pop_m, -1);
rb_define_method(rb_cArray, "shift", rb_ary_shift_m, -1);
rb_define_method(rb_cArray, "unshift", rb_ary_unshift_m, -1);
- rb_define_alias(rb_cArray, "prepend", "unshift");
rb_define_method(rb_cArray, "insert", rb_ary_insert, -1);
rb_define_method(rb_cArray, "each", rb_ary_each, 0);
rb_define_method(rb_cArray, "each_index", rb_ary_each_index, 0);
@@ -6834,8 +5856,6 @@ Init_Array(void)
rb_define_method(rb_cArray, "map!", rb_ary_collect_bang, 0);
rb_define_method(rb_cArray, "select", rb_ary_select, 0);
rb_define_method(rb_cArray, "select!", rb_ary_select_bang, 0);
- rb_define_method(rb_cArray, "filter", rb_ary_select, 0);
- rb_define_method(rb_cArray, "filter!", rb_ary_select_bang, 0);
rb_define_method(rb_cArray, "keep_if", rb_ary_keep_if, 0);
rb_define_method(rb_cArray, "values_at", rb_ary_values_at, -1);
rb_define_method(rb_cArray, "delete", rb_ary_delete, 1);
@@ -6864,9 +5884,6 @@ Init_Array(void)
rb_define_method(rb_cArray, "&", rb_ary_and, 1);
rb_define_method(rb_cArray, "|", rb_ary_or, 1);
- rb_define_method(rb_cArray, "max", rb_ary_max, -1);
- rb_define_method(rb_cArray, "min", rb_ary_min, -1);
-
rb_define_method(rb_cArray, "uniq", rb_ary_uniq, 0);
rb_define_method(rb_cArray, "uniq!", rb_ary_uniq_bang, 0);
rb_define_method(rb_cArray, "compact", rb_ary_compact, 0);
@@ -6890,12 +5907,11 @@ Init_Array(void)
rb_define_method(rb_cArray, "drop_while", rb_ary_drop_while, 0);
rb_define_method(rb_cArray, "bsearch", rb_ary_bsearch, 0);
rb_define_method(rb_cArray, "bsearch_index", rb_ary_bsearch_index, 0);
- rb_define_method(rb_cArray, "any?", rb_ary_any_p, -1);
- rb_define_method(rb_cArray, "all?", rb_ary_all_p, -1);
- rb_define_method(rb_cArray, "none?", rb_ary_none_p, -1);
- rb_define_method(rb_cArray, "one?", rb_ary_one_p, -1);
+ rb_define_method(rb_cArray, "any?", rb_ary_any_p, 0);
rb_define_method(rb_cArray, "dig", rb_ary_dig, -1);
- rb_define_method(rb_cArray, "sum", rb_ary_sum, -1);
+ id_cmp = rb_intern("<=>");
id_random = rb_intern("random");
+ id_div = rb_intern("div");
+ id_power = rb_intern("**");
}
diff --git a/ast.c b/ast.c
deleted file mode 100644
index f0e8dd2eaf..0000000000
--- a/ast.c
+++ /dev/null
@@ -1,760 +0,0 @@
-/* indent-tabs-mode: nil */
-#include "ruby.h"
-#include "ruby/encoding.h"
-#include "ruby/util.h"
-#include "internal.h"
-#include "node.h"
-#include "vm_core.h"
-#include "iseq.h"
-
-static VALUE rb_mAST;
-static VALUE rb_cNode;
-
-struct ASTNodeData {
- rb_ast_t *ast;
- NODE *node;
-};
-
-static void
-node_gc_mark(void *ptr)
-{
- struct ASTNodeData *data = (struct ASTNodeData *)ptr;
- rb_gc_mark((VALUE)data->ast);
-}
-
-static const rb_data_type_t rb_node_type = {
- "AST/node",
- {node_gc_mark, RUBY_TYPED_DEFAULT_FREE, 0,},
- 0, 0,
- RUBY_TYPED_FREE_IMMEDIATELY,
-};
-
-static VALUE rb_ast_node_alloc(VALUE klass);
-
-static void
-setup_node(VALUE obj, rb_ast_t *ast, NODE *node)
-{
- struct ASTNodeData *data;
-
- TypedData_Get_Struct(obj, struct ASTNodeData, &rb_node_type, data);
- data->ast = ast;
- data->node = node;
-}
-
-static VALUE
-ast_new_internal(rb_ast_t *ast, NODE *node)
-{
- VALUE obj;
-
- obj = rb_ast_node_alloc(rb_cNode);
- setup_node(obj, ast, node);
-
- return obj;
-}
-
-static VALUE rb_ast_parse_str(VALUE str);
-static VALUE rb_ast_parse_file(VALUE path);
-static VALUE rb_ast_parse_array(VALUE array);
-
-static VALUE
-ast_parse_new(void)
-{
- return rb_parser_set_context(rb_parser_new(), NULL, 0);
-}
-
-static VALUE
-ast_parse_done(rb_ast_t *ast)
-{
- if (!ast->body.root) {
- rb_ast_dispose(ast);
- rb_exc_raise(GET_EC()->errinfo);
- }
-
- return ast_new_internal(ast, (NODE *)ast->body.root);
-}
-
-/*
- * call-seq:
- * RubyVM::AbstractSyntaxTree.parse(string) -> RubyVM::AbstractSyntaxTree::Node
- *
- * Parses the given string into an abstract syntax tree,
- * returning the root node of that tree.
- *
- * SyntaxError is raised if the given string is invalid syntax.
- *
- * RubyVM::AbstractSyntaxTree.parse("x = 1 + 2")
- * # => #<RubyVM::AbstractSyntaxTree::Node(NODE_SCOPE(0) 1:0, 1:9): >
- */
-static VALUE
-rb_ast_s_parse(VALUE module, VALUE str)
-{
- return rb_ast_parse_str(str);
-}
-
-static VALUE
-rb_ast_parse_str(VALUE str)
-{
- rb_ast_t *ast = 0;
-
- StringValue(str);
- ast = rb_parser_compile_string_path(ast_parse_new(), Qnil, str, 1);
- return ast_parse_done(ast);
-}
-
-/*
- * call-seq:
- * RubyVM::AbstractSyntaxTree.parse_file(pathname) -> RubyVM::AbstractSyntaxTree::Node
- *
- * Reads the file from <code>pathname</code>, then parses it like ::parse,
- * returning the root node of the abstract syntax tree.
- *
- * SyntaxError is raised if <code>pathname</code>'s contents are not
- * valid Ruby syntax.
- *
- * RubyVM::AbstractSyntaxTree.parse_file("my-app/app.rb")
- * # => #<RubyVM::AbstractSyntaxTree::Node(NODE_SCOPE(0) 1:0, 31:3): >
- */
-static VALUE
-rb_ast_s_parse_file(VALUE module, VALUE path)
-{
- return rb_ast_parse_file(path);
-}
-
-static VALUE
-rb_ast_parse_file(VALUE path)
-{
- VALUE f;
- rb_ast_t *ast = 0;
- rb_encoding *enc = rb_utf8_encoding();
-
- FilePathValue(path);
- f = rb_file_open_str(path, "r");
- rb_funcall(f, rb_intern("set_encoding"), 2, rb_enc_from_encoding(enc), rb_str_new_cstr("-"));
- ast = rb_parser_compile_file_path(ast_parse_new(), Qnil, f, 1);
- rb_io_close(f);
- return ast_parse_done(ast);
-}
-
-static VALUE
-lex_array(VALUE array, int index)
-{
- VALUE str = rb_ary_entry(array, index);
- if (!NIL_P(str)) {
- StringValue(str);
- if (!rb_enc_asciicompat(rb_enc_get(str))) {
- rb_raise(rb_eArgError, "invalid source encoding");
- }
- }
- return str;
-}
-
-static VALUE
-rb_ast_parse_array(VALUE array)
-{
- rb_ast_t *ast = 0;
-
- array = rb_check_array_type(array);
- ast = rb_parser_compile_generic(ast_parse_new(), lex_array, Qnil, array, 1);
- return ast_parse_done(ast);
-}
-
-static VALUE node_children(rb_ast_t*, NODE*);
-
-static VALUE
-node_find(VALUE self, const int node_id)
-{
- VALUE ary;
- long i;
- struct ASTNodeData *data;
- TypedData_Get_Struct(self, struct ASTNodeData, &rb_node_type, data);
-
- if (nd_node_id(data->node) == node_id) return self;
-
- ary = node_children(data->ast, data->node);
-
- for (i = 0; i < RARRAY_LEN(ary); i++) {
- VALUE child = RARRAY_AREF(ary, i);
-
- if (CLASS_OF(child) == rb_cNode) {
- VALUE result = node_find(child, node_id);
- if (RTEST(result)) return result;
- }
- }
-
- return Qnil;
-}
-
-extern VALUE rb_e_script;
-
-static VALUE
-script_lines(VALUE path)
-{
- VALUE hash, lines;
- ID script_lines;
- CONST_ID(script_lines, "SCRIPT_LINES__");
- if (!rb_const_defined_at(rb_cObject, script_lines)) return Qnil;
- hash = rb_const_get_at(rb_cObject, script_lines);
- if (!RB_TYPE_P(hash, T_HASH)) return Qnil;
- lines = rb_hash_lookup(hash, path);
- if (!RB_TYPE_P(lines, T_ARRAY)) return Qnil;
- return lines;
-}
-
-/*
- * call-seq:
- * RubyVM::AbstractSyntaxTree.of(proc) -> RubyVM::AbstractSyntaxTree::Node
- * RubyVM::AbstractSyntaxTree.of(method) -> RubyVM::AbstractSyntaxTree::Node
- *
- * Returns AST nodes of the given proc or method.
- *
- * RubyVM::AbstractSyntaxTree.of(proc {1 + 2})
- * # => #<RubyVM::AbstractSyntaxTree::Node(NODE_SCOPE(0) 1:35, 1:42): >
- *
- * def hello
- * puts "hello, world"
- * end
- *
- * RubyVM::AbstractSyntaxTree.of(method(:hello))
- * # => #<RubyVM::AbstractSyntaxTree::Node(NODE_SCOPE(0) 1:0, 3:3): >
- */
-static VALUE
-rb_ast_s_of(VALUE module, VALUE body)
-{
- VALUE path, node, lines;
- int node_id;
- const rb_iseq_t *iseq = NULL;
-
- if (rb_obj_is_proc(body)) {
- iseq = vm_proc_iseq(body);
-
- if (!rb_obj_is_iseq((VALUE)iseq)) {
- iseq = NULL;
- }
- }
- else {
- iseq = rb_method_iseq(body);
- }
-
- if (!iseq) return Qnil;
-
- path = rb_iseq_path(iseq);
- node_id = iseq->body->location.node_id;
- if (!NIL_P(lines = script_lines(path))) {
- node = rb_ast_parse_array(lines);
- }
- else if (RSTRING_LEN(path) == 2 && memcmp(RSTRING_PTR(path), "-e", 2) == 0) {
- node = rb_ast_parse_str(rb_e_script);
- }
- else {
- node = rb_ast_parse_file(path);
- }
-
- return node_find(node, node_id);
-}
-
-static VALUE
-rb_ast_node_alloc(VALUE klass)
-{
- struct ASTNodeData *data;
- VALUE obj = TypedData_Make_Struct(klass, struct ASTNodeData, &rb_node_type, data);
-
- return obj;
-}
-
-static const char*
-node_type_to_str(const NODE *node)
-{
- return (ruby_node_name(nd_type(node)) + rb_strlen_lit("NODE_"));
-}
-
-/*
- * call-seq:
- * node.type -> symbol
- *
- * Returns the type of this node as a symbol.
- *
- * root = RubyVM::AbstractSyntaxTree.parse("x = 1 + 2")
- * root.type # => :SCOPE
- * call = root.children[2]
- * call.type # => :OPCALL
- */
-static VALUE
-rb_ast_node_type(VALUE self)
-{
- struct ASTNodeData *data;
- TypedData_Get_Struct(self, struct ASTNodeData, &rb_node_type, data);
-
- return rb_sym_intern_ascii_cstr(node_type_to_str(data->node));
-}
-
-#define NEW_CHILD(ast, node) node ? ast_new_internal(ast, node) : Qnil
-
-static VALUE
-rb_ary_new_from_node_args(rb_ast_t *ast, long n, ...)
-{
- va_list ar;
- VALUE ary;
- long i;
-
- ary = rb_ary_new2(n);
-
- va_start(ar, n);
- for (i=0; i<n; i++) {
- NODE *node;
- node = va_arg(ar, NODE *);
- rb_ary_push(ary, NEW_CHILD(ast, node));
- }
- va_end(ar);
- return ary;
-}
-
-static VALUE
-dump_block(rb_ast_t *ast, NODE *node)
-{
- VALUE ary = rb_ary_new();
- do {
- rb_ary_push(ary, NEW_CHILD(ast, node->nd_head));
- } while (node->nd_next &&
- nd_type(node->nd_next) == NODE_BLOCK &&
- (node = node->nd_next, 1));
- if (node->nd_next) {
- rb_ary_push(ary, NEW_CHILD(ast, node->nd_next));
- }
-
- return ary;
-}
-
-static VALUE
-dump_array(rb_ast_t *ast, NODE *node)
-{
- VALUE ary = rb_ary_new();
- rb_ary_push(ary, NEW_CHILD(ast, node->nd_head));
-
- while (node->nd_next && nd_type(node->nd_next) == NODE_ARRAY) {
- node = node->nd_next;
- rb_ary_push(ary, NEW_CHILD(ast, node->nd_head));
- }
- rb_ary_push(ary, NEW_CHILD(ast, node->nd_next));
-
- return ary;
-}
-
-static VALUE
-var_name(ID id)
-{
- if (!id) return Qnil;
- if (!rb_id2str(id)) return Qnil;
- return ID2SYM(id);
-}
-
-static VALUE
-node_children(rb_ast_t *ast, NODE *node)
-{
- char name[DECIMAL_SIZE_OF_BITS(sizeof(long) * CHAR_BIT) + 2]; /* including '$' */
-
- enum node_type type = nd_type(node);
- switch (type) {
- case NODE_BLOCK:
- return dump_block(ast, node);
- case NODE_IF:
- return rb_ary_new_from_node_args(ast, 3, node->nd_cond, node->nd_body, node->nd_else);
- case NODE_UNLESS:
- return rb_ary_new_from_node_args(ast, 3, node->nd_cond, node->nd_body, node->nd_else);
- case NODE_CASE:
- return rb_ary_new_from_node_args(ast, 2, node->nd_head, node->nd_body);
- case NODE_CASE2:
- return rb_ary_new_from_node_args(ast, 2, node->nd_head, node->nd_body);
- case NODE_WHEN:
- return rb_ary_new_from_node_args(ast, 3, node->nd_head, node->nd_body, node->nd_next);
- case NODE_WHILE:
- goto loop;
- case NODE_UNTIL:
- loop:
- return rb_ary_new_from_node_args(ast, 2, node->nd_cond, node->nd_body);
- case NODE_ITER:
- case NODE_FOR:
- return rb_ary_new_from_node_args(ast, 2, node->nd_iter, node->nd_body);
- case NODE_FOR_MASGN:
- return rb_ary_new_from_node_args(ast, 1, node->nd_var);
- case NODE_BREAK:
- goto jump;
- case NODE_NEXT:
- goto jump;
- case NODE_RETURN:
- jump:
- return rb_ary_new_from_node_args(ast, 1, node->nd_stts);
- case NODE_REDO:
- return rb_ary_new_from_node_args(ast, 0);
- case NODE_RETRY:
- return rb_ary_new_from_node_args(ast, 0);
- case NODE_BEGIN:
- return rb_ary_new_from_node_args(ast, 1, node->nd_body);
- case NODE_RESCUE:
- return rb_ary_new_from_node_args(ast, 3, node->nd_head, node->nd_resq, node->nd_else);
- case NODE_RESBODY:
- return rb_ary_new_from_node_args(ast, 3, node->nd_args, node->nd_body, node->nd_head);
- case NODE_ENSURE:
- return rb_ary_new_from_node_args(ast, 2, node->nd_head, node->nd_ensr);
- case NODE_AND:
- goto andor;
- case NODE_OR:
- andor:
- {
- VALUE ary = rb_ary_new();
-
- while (1) {
- rb_ary_push(ary, NEW_CHILD(ast, node->nd_1st));
- if (!node->nd_2nd || nd_type(node->nd_2nd) != (int)type)
- break;
- node = node->nd_2nd;
- }
- rb_ary_push(ary, NEW_CHILD(ast, node->nd_2nd));
- return ary;
- }
- case NODE_MASGN:
- if (NODE_NAMED_REST_P(node->nd_args)) {
- return rb_ary_new_from_node_args(ast, 3, node->nd_value, node->nd_head, node->nd_args);
- }
- return rb_ary_new_from_node_args(ast, 2, node->nd_value, node->nd_head);
- case NODE_LASGN:
- goto asgn;
- case NODE_DASGN:
- goto asgn;
- case NODE_DASGN_CURR:
- goto asgn;
- case NODE_IASGN:
- goto asgn;
- case NODE_CVASGN:
- asgn:
- if (NODE_REQUIRED_KEYWORD_P(node)) {
- return rb_ary_new_from_args(1, var_name(node->nd_vid));
- }
- return rb_ary_new_from_args(2, var_name(node->nd_vid), NEW_CHILD(ast, node->nd_value));
- case NODE_GASGN:
- goto asgn;
- case NODE_CDECL:
- if (node->nd_vid) {
- return rb_ary_new_from_args(2, ID2SYM(node->nd_vid), NEW_CHILD(ast, node->nd_value));
- }
- return rb_ary_new_from_args(3, NEW_CHILD(ast, node->nd_else), ID2SYM(node->nd_else->nd_mid), NEW_CHILD(ast, node->nd_value));
- case NODE_OP_ASGN1:
- return rb_ary_new_from_args(4, NEW_CHILD(ast, node->nd_recv),
- ID2SYM(node->nd_mid),
- NEW_CHILD(ast, node->nd_args->nd_head),
- NEW_CHILD(ast, node->nd_args->nd_body));
- case NODE_OP_ASGN2:
- return rb_ary_new_from_args(4, NEW_CHILD(ast, node->nd_recv),
- node->nd_next->nd_aid ? Qtrue : Qfalse,
- ID2SYM(node->nd_next->nd_vid),
- NEW_CHILD(ast, node->nd_value));
- case NODE_OP_ASGN_AND:
- return rb_ary_new_from_args(3, NEW_CHILD(ast, node->nd_head), ID2SYM(idANDOP),
- NEW_CHILD(ast, node->nd_value));
- case NODE_OP_ASGN_OR:
- return rb_ary_new_from_args(3, NEW_CHILD(ast, node->nd_head), ID2SYM(idOROP),
- NEW_CHILD(ast, node->nd_value));
- case NODE_OP_CDECL:
- return rb_ary_new_from_args(3, NEW_CHILD(ast, node->nd_head),
- ID2SYM(node->nd_aid),
- NEW_CHILD(ast, node->nd_value));
- case NODE_CALL:
- case NODE_OPCALL:
- case NODE_QCALL:
- return rb_ary_new_from_args(3, NEW_CHILD(ast, node->nd_recv),
- ID2SYM(node->nd_mid),
- NEW_CHILD(ast, node->nd_args));
- case NODE_FCALL:
- return rb_ary_new_from_args(2, ID2SYM(node->nd_mid),
- NEW_CHILD(ast, node->nd_args));
- case NODE_VCALL:
- return rb_ary_new_from_args(1, ID2SYM(node->nd_mid));
- case NODE_SUPER:
- return rb_ary_new_from_node_args(ast, 1, node->nd_args);
- case NODE_ZSUPER:
- return rb_ary_new_from_node_args(ast, 0);
- case NODE_ARRAY:
- goto ary;
- case NODE_VALUES:
- ary:
- return dump_array(ast, node);
- case NODE_ZARRAY:
- return rb_ary_new_from_node_args(ast, 0);
- case NODE_HASH:
- return rb_ary_new_from_node_args(ast, 1, node->nd_head);
- case NODE_YIELD:
- return rb_ary_new_from_node_args(ast, 1, node->nd_head);
- case NODE_LVAR:
- case NODE_DVAR:
- return rb_ary_new_from_args(1, var_name(node->nd_vid));
- case NODE_IVAR:
- case NODE_CONST:
- case NODE_CVAR:
- case NODE_GVAR:
- return rb_ary_new_from_args(1, ID2SYM(node->nd_vid));
- case NODE_NTH_REF:
- snprintf(name, sizeof(name), "$%ld", node->nd_nth);
- return rb_ary_new_from_args(1, ID2SYM(rb_intern(name)));
- case NODE_BACK_REF:
- name[0] = '$';
- name[1] = (char)node->nd_nth;
- name[2] = '\0';
- return rb_ary_new_from_args(1, ID2SYM(rb_intern(name)));
- case NODE_MATCH:
- goto lit;
- case NODE_MATCH2:
- if (node->nd_args) {
- return rb_ary_new_from_node_args(ast, 3, node->nd_recv, node->nd_value, node->nd_args);
- }
- return rb_ary_new_from_node_args(ast, 2, node->nd_recv, node->nd_value);
- case NODE_MATCH3:
- return rb_ary_new_from_node_args(ast, 2, node->nd_recv, node->nd_value);
- case NODE_LIT:
- goto lit;
- case NODE_STR:
- goto lit;
- case NODE_XSTR:
- lit:
- return rb_ary_new_from_args(1, node->nd_lit);
- case NODE_ONCE:
- return rb_ary_new_from_node_args(ast, 1, node->nd_body);
- case NODE_DSTR:
- goto dlit;
- case NODE_DXSTR:
- goto dlit;
- case NODE_DREGX:
- goto dlit;
- case NODE_DSYM:
- dlit:
- return rb_ary_new_from_args(3, node->nd_lit,
- NEW_CHILD(ast, node->nd_next->nd_head),
- NEW_CHILD(ast, node->nd_next->nd_next));
- case NODE_EVSTR:
- return rb_ary_new_from_node_args(ast, 1, node->nd_body);
- case NODE_ARGSCAT:
- return rb_ary_new_from_node_args(ast, 2, node->nd_head, node->nd_body);
- case NODE_ARGSPUSH:
- return rb_ary_new_from_node_args(ast, 2, node->nd_head, node->nd_body);
- case NODE_SPLAT:
- return rb_ary_new_from_node_args(ast, 1, node->nd_head);
- case NODE_BLOCK_PASS:
- return rb_ary_new_from_node_args(ast, 2, node->nd_head, node->nd_body);
- case NODE_DEFN:
- return rb_ary_new_from_args(2, ID2SYM(node->nd_mid), NEW_CHILD(ast, node->nd_defn));
- case NODE_DEFS:
- return rb_ary_new_from_args(3, NEW_CHILD(ast, node->nd_recv), ID2SYM(node->nd_mid), NEW_CHILD(ast, node->nd_defn));
- case NODE_ALIAS:
- return rb_ary_new_from_node_args(ast, 2, node->nd_1st, node->nd_2nd);
- case NODE_VALIAS:
- return rb_ary_new_from_args(2, ID2SYM(node->nd_alias), ID2SYM(node->nd_orig));
- case NODE_UNDEF:
- return rb_ary_new_from_node_args(ast, 1, node->nd_undef);
- case NODE_CLASS:
- return rb_ary_new_from_node_args(ast, 3, node->nd_cpath, node->nd_super, node->nd_body);
- case NODE_MODULE:
- return rb_ary_new_from_node_args(ast, 2, node->nd_cpath, node->nd_body);
- case NODE_SCLASS:
- return rb_ary_new_from_node_args(ast, 2, node->nd_recv, node->nd_body);
- case NODE_COLON2:
- return rb_ary_new_from_args(2, NEW_CHILD(ast, node->nd_head), ID2SYM(node->nd_mid));
- case NODE_COLON3:
- return rb_ary_new_from_args(1, ID2SYM(node->nd_mid));
- case NODE_DOT2:
- goto dot;
- case NODE_DOT3:
- goto dot;
- case NODE_FLIP2:
- goto dot;
- case NODE_FLIP3:
- dot:
- return rb_ary_new_from_node_args(ast, 2, node->nd_beg, node->nd_end);
- case NODE_SELF:
- return rb_ary_new_from_node_args(ast, 0);
- case NODE_NIL:
- return rb_ary_new_from_node_args(ast, 0);
- case NODE_TRUE:
- return rb_ary_new_from_node_args(ast, 0);
- case NODE_FALSE:
- return rb_ary_new_from_node_args(ast, 0);
- case NODE_ERRINFO:
- return rb_ary_new_from_node_args(ast, 0);
- case NODE_DEFINED:
- return rb_ary_new_from_node_args(ast, 1, node->nd_head);
- case NODE_POSTEXE:
- return rb_ary_new_from_node_args(ast, 1, node->nd_body);
- case NODE_ATTRASGN:
- return rb_ary_new_from_args(3, NEW_CHILD(ast, node->nd_recv), ID2SYM(node->nd_mid), NEW_CHILD(ast, node->nd_args));
- case NODE_LAMBDA:
- return rb_ary_new_from_node_args(ast, 1, node->nd_body);
- case NODE_OPT_ARG:
- return rb_ary_new_from_node_args(ast, 2, node->nd_body, node->nd_next);
- case NODE_KW_ARG:
- return rb_ary_new_from_node_args(ast, 2, node->nd_body, node->nd_next);
- case NODE_POSTARG:
- if (NODE_NAMED_REST_P(node->nd_1st)) {
- return rb_ary_new_from_node_args(ast, 2, node->nd_1st, node->nd_2nd);
- }
- return rb_ary_new_from_node_args(ast, 1, node->nd_2nd);
- case NODE_ARGS:
- {
- struct rb_args_info *ainfo = node->nd_ainfo;
- return rb_ary_new_from_args(10,
- INT2NUM(ainfo->pre_args_num),
- NEW_CHILD(ast, ainfo->pre_init),
- NEW_CHILD(ast, ainfo->opt_args),
- var_name(ainfo->first_post_arg),
- INT2NUM(ainfo->post_args_num),
- NEW_CHILD(ast, ainfo->post_init),
- var_name(ainfo->rest_arg),
- NEW_CHILD(ast, ainfo->kw_args),
- NEW_CHILD(ast, ainfo->kw_rest_arg),
- var_name(ainfo->block_arg));
- }
- case NODE_SCOPE:
- {
- ID *tbl = node->nd_tbl;
- int i, size = tbl ? (int)*tbl++ : 0;
- VALUE locals = rb_ary_new_capa(size);
- for (i = 0; i < size; i++) {
- rb_ary_push(locals, var_name(tbl[i]));
- }
- return rb_ary_new_from_args(3, locals, NEW_CHILD(ast, node->nd_args), NEW_CHILD(ast, node->nd_body));
- }
- case NODE_ARGS_AUX:
- case NODE_LAST:
- break;
- }
-
- rb_bug("node_children: unknown node: %s", ruby_node_name(type));
-}
-
-/*
- * call-seq:
- * node.children -> array
- *
- * Returns AST nodes under this one. Each kind of node
- * has different children, depending on what kind of node it is.
- *
- * The returned array may contain other nodes or <code>nil</code>.
- */
-static VALUE
-rb_ast_node_children(VALUE self)
-{
- struct ASTNodeData *data;
- TypedData_Get_Struct(self, struct ASTNodeData, &rb_node_type, data);
-
- return node_children(data->ast, data->node);
-}
-
-/*
- * call-seq:
- * node.first_lineno -> integer
- *
- * The line number in the source code where this AST's text began.
- */
-static VALUE
-rb_ast_node_first_lineno(VALUE self)
-{
- struct ASTNodeData *data;
- TypedData_Get_Struct(self, struct ASTNodeData, &rb_node_type, data);
-
- return INT2NUM(nd_first_lineno(data->node));
-}
-
-/*
- * call-seq:
- * node.first_column -> integer
- *
- * The column number in the source code where this AST's text began.
- */
-static VALUE
-rb_ast_node_first_column(VALUE self)
-{
- struct ASTNodeData *data;
- TypedData_Get_Struct(self, struct ASTNodeData, &rb_node_type, data);
-
- return INT2NUM(nd_first_column(data->node));
-}
-
-/*
- * call-seq:
- * node.last_lineno -> integer
- *
- * The line number in the source code where this AST's text ended.
- */
-static VALUE
-rb_ast_node_last_lineno(VALUE self)
-{
- struct ASTNodeData *data;
- TypedData_Get_Struct(self, struct ASTNodeData, &rb_node_type, data);
-
- return INT2NUM(nd_last_lineno(data->node));
-}
-
-/*
- * call-seq:
- * node.last_column -> integer
- *
- * The column number in the source code where this AST's text ended.
- */
-static VALUE
-rb_ast_node_last_column(VALUE self)
-{
- struct ASTNodeData *data;
- TypedData_Get_Struct(self, struct ASTNodeData, &rb_node_type, data);
-
- return INT2NUM(nd_last_column(data->node));
-}
-
-/*
- * call-seq:
- * node.inspect -> string
- *
- * Returns debugging information about this node as a string.
- */
-static VALUE
-rb_ast_node_inspect(VALUE self)
-{
- VALUE str;
- VALUE cname;
- struct ASTNodeData *data;
- TypedData_Get_Struct(self, struct ASTNodeData, &rb_node_type, data);
-
- cname = rb_class_path(rb_obj_class(self));
- str = rb_str_new2("#<");
-
- rb_str_append(str, cname);
- rb_str_catf(str, ":%s@%d:%d-%d:%d>",
- node_type_to_str(data->node),
- nd_first_lineno(data->node), nd_first_column(data->node),
- nd_last_lineno(data->node), nd_last_column(data->node));
-
- return str;
-}
-
-void
-Init_ast(void)
-{
- /*
- * AbstractSyntaxTree provides methods to parse Ruby code into
- * abstract syntax trees. The nodes in the tree
- * are instances of RubyVM::AbstractSyntaxTree::Node.
- */
- rb_mAST = rb_define_module_under(rb_cRubyVM, "AbstractSyntaxTree");
- /*
- * RubyVM::AbstractSyntaxTree::Node instances are created by parse methods in
- * RubyVM::AbstractSyntaxTree.
- */
- rb_cNode = rb_define_class_under(rb_mAST, "Node", rb_cObject);
-
- rb_undef_alloc_func(rb_cNode);
- rb_define_singleton_method(rb_mAST, "parse", rb_ast_s_parse, 1);
- rb_define_singleton_method(rb_mAST, "parse_file", rb_ast_s_parse_file, 1);
- rb_define_singleton_method(rb_mAST, "of", rb_ast_s_of, 1);
- rb_define_method(rb_cNode, "type", rb_ast_node_type, 0);
- rb_define_method(rb_cNode, "first_lineno", rb_ast_node_first_lineno, 0);
- rb_define_method(rb_cNode, "first_column", rb_ast_node_first_column, 0);
- rb_define_method(rb_cNode, "last_lineno", rb_ast_node_last_lineno, 0);
- rb_define_method(rb_cNode, "last_column", rb_ast_node_last_column, 0);
- rb_define_method(rb_cNode, "children", rb_ast_node_children, 0);
- rb_define_method(rb_cNode, "inspect", rb_ast_node_inspect, 0);
-}
diff --git a/basictest/runner.rb b/basictest/runner.rb
deleted file mode 100755
index 0f398e7acc..0000000000
--- a/basictest/runner.rb
+++ /dev/null
@@ -1,33 +0,0 @@
-#! ./miniruby
-
-exit if defined?(CROSS_COMPILING) and CROSS_COMPILING
-ruby = ENV["RUBY"]
-unless ruby
- load './rbconfig.rb'
- ruby = "./#{RbConfig::CONFIG['ruby_install_name']}#{RbConfig::CONFIG['EXEEXT']}"
-end
-unless File.exist? ruby
- print "#{ruby} is not found.\n"
- print "Try `make' first, then `make test', please.\n"
- exit false
-end
-ARGV[0] and opt = ARGV[0][/\A--run-opt=(.*)/, 1] and ARGV.shift
-
-$stderr.reopen($stdout)
-error = ''
-
-srcdir = File.expand_path('..', File.dirname(__FILE__))
-if env = ENV["RUBYOPT"]
- ENV["RUBYOPT"] = env + " -W1"
-end
-`#{ruby} #{opt} -W1 #{srcdir}/basictest/test.rb #{ARGV.join(' ')}`.each_line do |line|
- if line =~ /^end of test/
- print "\ntest succeeded\n"
- exit true
- end
- error << line if %r:^(basictest/test.rb|not): =~ line
-end
-puts
-print error
-print "test failed\n"
-exit false
diff --git a/basictest/test.rb b/basictest/test.rb
deleted file mode 100755
index 25d52ca1ef..0000000000
--- a/basictest/test.rb
+++ /dev/null
@@ -1,2367 +0,0 @@
-#! /usr/bin/env ruby
-# -*- coding: us-ascii -*-
-
-$testnum=0
-$ntest=0
-$failed = 0
-class Progress
- def initialize
- @color = nil
- @tty = nil
- @quiet = nil
- @verbose = nil
- ARGV.each do |arg|
- case arg
- when /\A--color(?:=(?:always|(auto)|(never)|(.*)))?\z/
- warn "unknown --color argument: #$3" if $3
- @color = $1 ? nil : !$2
- when /\A--tty(=(?:yes|(no)|(.*)))?\z/
- warn "unknown --tty argument: #$3" if $3
- @tty = !$1 || !$2
- true
- when /\A-(q|-quiet)\z/
- @quiet = true
- when /\A-(v|-verbose)\z/
- @verbose = true
- end
- end
- @tty = STDERR.tty? && !STDOUT.tty? && /dumb/ !~ ENV["TERM"] if @tty.nil?
- @eol = @tty && !@verbose ? "\r\e[K\r" : "\n"
- case @color
- when nil
- @color = @tty
- end
- if @color
- # dircolors-like style
- colors = (colors = ENV['TEST_COLORS']) ? Hash[colors.scan(/(\w+)=([^:\n]*)/)] : {}
- begin
- File.read(File.join(__dir__, "../test/colors")).scan(/(\w+)=([^:\n]*)/) do |n, c|
- colors[n] ||= c
- end
- rescue
- end
- @passed = "\e[;#{colors["pass"] || "32"}m"
- @failed = "\e[;#{colors["fail"] || "31"}m"
- @reset = "\e[m"
- else
- @passed = @failed = @reset = ""
- end
- extend(Rotator) if @tty
- end
-
- def passed_string
- "."
- end
- def failed_string
- "#{@failed}F#{@reset}"
- end
- def init_string
- end
- def finish_string
- if @quiet
- @eol
- else
- "#{@passed}#{@ok ? 'OK' : ''} #{$testnum}#{@reset}#{@eol}"
- end
- end
- def pass
- STDERR.print passed_string
- end
- def fail
- @ok = false
- STDERR.print failed_string
- end
- def init
- @ok = true
- STDERR.print init_string
- end
- def finish
- STDERR.print finish_string
- end
-
- module Rotator
- ROTATOR = %w[- \\ | /]
- BS = "\b" * ROTATOR[0].size
- def passed_string
- "#{BS}#{ROTATOR[(@count += 1) % ROTATOR.size]}"
- end
- def failed_string
- "#{BS}#{super}#{ROTATOR[@count % ROTATOR.size]}"
- end
- def init_string
- @count = 0
- " "
- end
- def finish_string
- s = "#{BS}#{' ' * BS.size}#{BS}#{super}"
- s.gsub!(/\n/, "\r\e[2K\r") if @quiet
- s
- end
- end
-end
-PROGRESS = Progress.new
-
-def test_check(what)
- unless $ntest.zero?
- PROGRESS.finish
- end
- STDERR.print "#{$0}:#{what} "
- PROGRESS.init
- $what = what
- $testnum = 0
-end
-
-def test_ok(cond,n=1)
- $testnum+=1
- $ntest+=1
- where = (st = caller(n)) ? st[0] : "caller error! (n=#{n}, trace=#{caller(0).join(', ')}"
- if cond
- PROGRESS.pass
- printf "ok %d (%s)\n", $testnum, where
- else
- PROGRESS.fail
- printf "not ok %s %d -- %s\n", $what, $testnum, where
- $failed+=1
- end
- STDOUT.flush
- STDERR.flush
-end
-
-# make sure conditional operators work
-
-test_check "assignment"
-
-a=[]; a[0] ||= "bar";
-test_ok(a[0] == "bar")
-h={}; h["foo"] ||= "bar";
-test_ok(h["foo"] == "bar")
-
-aa = 5
-aa ||= 25
-test_ok(aa == 5)
-bb ||= 25
-test_ok(bb == 25)
-cc &&=33
-test_ok(cc == nil)
-cc = 5
-cc &&=44
-test_ok(cc == 44)
-
-a = nil; test_ok(a == nil)
-a = 1; test_ok(a == 1)
-a = []; test_ok(a == [])
-a = [1]; test_ok(a == [1])
-a = [nil]; test_ok(a == [nil])
-a = [[]]; test_ok(a == [[]])
-a = [1,2]; test_ok(a == [1,2])
-a = [*[]]; test_ok(a == [])
-a = [*[1]]; test_ok(a == [1])
-a = [*[1,2]]; test_ok(a == [1,2])
-
-a = *[]; test_ok(a == [])
-a = *[1]; test_ok(a == [1])
-a = *[nil]; test_ok(a == [nil])
-a = *[[]]; test_ok(a == [[]])
-a = *[1,2]; test_ok(a == [1,2])
-a = *[*[]]; test_ok(a == [])
-a = *[*[1]]; test_ok(a == [1])
-a = *[*[1,2]]; test_ok(a == [1,2])
-
-a, = nil; test_ok(a == nil)
-a, = 1; test_ok(a == 1)
-a, = []; test_ok(a == nil)
-a, = [1]; test_ok(a == 1)
-a, = [nil]; test_ok(a == nil)
-a, = [[]]; test_ok(a == [])
-a, = 1,2; test_ok(a == 1)
-a, = [1,2]; test_ok(a == 1)
-a, = [*[]]; test_ok(a == nil)
-a, = [*[1]]; test_ok(a == 1)
-a, = *[1,2]; test_ok(a == 1)
-a, = [*[1,2]]; test_ok(a == 1)
-
-a, = *[]; test_ok(a == nil)
-a, = *[1]; test_ok(a == 1)
-a, = *[nil]; test_ok(a == nil)
-a, = *[[]]; test_ok(a == [])
-a, = *[1,2]; test_ok(a == 1)
-a, = *[*[]]; test_ok(a == nil)
-a, = *[*[1]]; test_ok(a == 1)
-a, = *[*[1,2]]; test_ok(a == 1)
-
-*a = nil; test_ok(a == [nil])
-*a = 1; test_ok(a == [1])
-*a = []; test_ok(a == [])
-*a = [1]; test_ok(a == [1])
-*a = [nil]; test_ok(a == [nil])
-*a = [[]]; test_ok(a == [[]])
-*a = [1,2]; test_ok(a == [1,2])
-*a = [*[]]; test_ok(a == [])
-*a = [*[1]]; test_ok(a == [1])
-*a = [*[1,2]]; test_ok(a == [1,2])
-
-*a = *[]; test_ok(a == [])
-*a = *[1]; test_ok(a == [1])
-*a = *[nil]; test_ok(a == [nil])
-*a = *[[]]; test_ok(a == [[]])
-*a = *[1,2]; test_ok(a == [1,2])
-*a = *[*[]]; test_ok(a == [])
-*a = *[*[1]]; test_ok(a == [1])
-*a = *[*[1,2]]; test_ok(a == [1,2])
-
-a,b,*c = nil; test_ok([a,b,c] == [nil,nil,[]])
-a,b,*c = 1; test_ok([a,b,c] == [1,nil,[]])
-a,b,*c = []; test_ok([a,b,c] == [nil,nil,[]])
-a,b,*c = [1]; test_ok([a,b,c] == [1,nil,[]])
-a,b,*c = [nil]; test_ok([a,b,c] == [nil,nil,[]])
-a,b,*c = [[]]; test_ok([a,b,c] == [[],nil,[]])
-a,b,*c = [1,2]; test_ok([a,b,c] == [1,2,[]])
-a,b,*c = [*[]]; test_ok([a,b,c] == [nil,nil,[]])
-a,b,*c = [*[1]]; test_ok([a,b,c] == [1,nil,[]])
-a,b,*c = [*[1,2]]; test_ok([a,b,c] == [1,2,[]])
-
-a,b,*c = *[]; test_ok([a,b,c] == [nil,nil,[]])
-a,b,*c = *[1]; test_ok([a,b,c] == [1,nil,[]])
-a,b,*c = *[nil]; test_ok([a,b,c] == [nil,nil,[]])
-a,b,*c = *[[]]; test_ok([a,b,c] == [[],nil,[]])
-a,b,*c = *[1,2]; test_ok([a,b,c] == [1,2,[]])
-a,b,*c = *[*[]]; test_ok([a,b,c] == [nil,nil,[]])
-a,b,*c = *[*[1]]; test_ok([a,b,c] == [1,nil,[]])
-a,b,*c = *[*[1,2]]; test_ok([a,b,c] == [1,2,[]])
-
-def f; yield nil; end; f {|a| test_ok(a == nil)}
-def f; yield 1; end; f {|a| test_ok(a == 1)}
-def f; yield []; end; f {|a| test_ok(a == [])}
-def f; yield [1]; end; f {|a| test_ok(a == [1])}
-def f; yield [nil]; end; f {|a| test_ok(a == [nil])}
-def f; yield [[]]; end; f {|a| test_ok(a == [[]])}
-def f; yield [*[]]; end; f {|a| test_ok(a == [])}
-def f; yield [*[1]]; end; f {|a| test_ok(a == [1])}
-def f; yield [*[1,2]]; end; f {|a| test_ok(a == [1,2])}
-def f; yield *[]; end; f {|a| test_ok(a == nil)}
-def f; yield *[1]; end; f {|a| test_ok(a == 1)}
-def f; yield *[nil]; end; f {|a| test_ok(a == nil)}
-def f; yield *[[]]; end; f {|a| test_ok(a == [])}
-def f; yield *[*[]]; end; f {|a| test_ok(a == nil)}
-def f; yield *[*[1]]; end; f {|a| test_ok(a == 1)}
-def f; yield *[*[1,2]]; end; f {|a| test_ok(a == 1)}
-
-def f; yield; end; f {|a,| test_ok(a == nil)}
-def f; yield nil; end; f {|a,| test_ok(a == nil)}
-def f; yield 1; end; f {|a,| test_ok(a == 1)}
-def f; yield []; end; f {|a,| test_ok(a == nil)}
-def f; yield [1]; end; f {|a,| test_ok(a == 1)}
-def f; yield [nil]; end; f {|a,| test_ok(a == nil)}
-def f; yield [[]]; end; f {|a,| test_ok(a == [])}
-def f; yield [*[]]; end; f {|a,| test_ok(a == nil)}
-def f; yield [*[1]]; end; f {|a,| test_ok(a == 1)}
-def f; yield [*[1,2]]; end; f {|a,| test_ok(a == 1)}
-
-def f; yield *[]; end; f {|a,| test_ok(a == nil)}
-def f; yield *[1]; end; f {|a,| test_ok(a == 1)}
-def f; yield *[nil]; end; f {|a,| test_ok(a == nil)}
-def f; yield *[[]]; end; f {|a,| test_ok(a == nil)}
-def f; yield *[*[]]; end; f {|a,| test_ok(a == nil)}
-def f; yield *[*[1]]; end; f {|a,| test_ok(a == 1)}
-def f; yield *[*[1,2]]; end; f {|a,| test_ok(a == 1)}
-
-def f; yield; end; f {|*a| test_ok(a == [])}
-def f; yield nil; end; f {|*a| test_ok(a == [nil])}
-def f; yield 1; end; f {|*a| test_ok(a == [1])}
-def f; yield []; end; f {|*a| test_ok(a == [[]])}
-def f; yield [1]; end; f {|*a| test_ok(a == [[1]])}
-def f; yield [nil]; end; f {|*a| test_ok(a == [[nil]])}
-def f; yield [[]]; end; f {|*a| test_ok(a == [[[]]])}
-def f; yield [1,2]; end; f {|*a| test_ok(a == [[1,2]])}
-def f; yield [*[]]; end; f {|*a| test_ok(a == [[]])}
-def f; yield [*[1]]; end; f {|*a| test_ok(a == [[1]])}
-def f; yield [*[1,2]]; end; f {|*a| test_ok(a == [[1,2]])}
-
-def f; yield *[]; end; f {|*a| test_ok(a == [])}
-def f; yield *[1]; end; f {|*a| test_ok(a == [1])}
-def f; yield *[nil]; end; f {|*a| test_ok(a == [nil])}
-def f; yield *[[]]; end; f {|*a| test_ok(a == [[]])}
-def f; yield *[*[]]; end; f {|*a| test_ok(a == [])}
-def f; yield *[*[1]]; end; f {|*a| test_ok(a == [1])}
-def f; yield *[*[1,2]]; end; f {|*a| test_ok(a == [1,2])}
-
-def f; yield; end; f {|a,b,*c| test_ok([a,b,c] == [nil,nil,[]])}
-def f; yield nil; end; f {|a,b,*c| test_ok([a,b,c] == [nil,nil,[]])}
-def f; yield 1; end; f {|a,b,*c| test_ok([a,b,c] == [1,nil,[]])}
-def f; yield []; end; f {|a,b,*c| test_ok([a,b,c] == [nil,nil,[]])}
-def f; yield [1]; end; f {|a,b,*c| test_ok([a,b,c] == [1,nil,[]])}
-def f; yield [nil]; end; f {|a,b,*c| test_ok([a,b,c] == [nil,nil,[]])}
-def f; yield [[]]; end; f {|a,b,*c| test_ok([a,b,c] == [[],nil,[]])}
-def f; yield [*[]]; end; f {|a,b,*c| test_ok([a,b,c] == [nil,nil,[]])}
-def f; yield [*[1]]; end; f {|a,b,*c| test_ok([a,b,c] == [1,nil,[]])}
-def f; yield [*[1,2]]; end; f {|a,b,*c| test_ok([a,b,c] == [1,2,[]])}
-
-def f; yield *[]; end; f {|a,b,*c| test_ok([a,b,c] == [nil,nil,[]])}
-def f; yield *[1]; end; f {|a,b,*c| test_ok([a,b,c] == [1,nil,[]])}
-def f; yield *[nil]; end; f {|a,b,*c| test_ok([a,b,c] == [nil,nil,[]])}
-def f; yield *[[]]; end; f {|a,b,*c| test_ok([a,b,c] == [nil,nil,[]])}
-def f; yield *[*[]]; end; f {|a,b,*c| test_ok([a,b,c] == [nil,nil,[]])}
-def f; yield *[*[1]]; end; f {|a,b,*c| test_ok([a,b,c] == [1,nil,[]])}
-def f; yield *[*[1,2]]; end; f {|a,b,*c| test_ok([a,b,c] == [1,2,[]])}
-
-def r; return; end; a = r(); test_ok(a == nil)
-def r; return nil; end; a = r(); test_ok(a == nil)
-def r; return 1; end; a = r(); test_ok(a == 1)
-def r; return []; end; a = r(); test_ok(a == [])
-def r; return [1]; end; a = r(); test_ok(a == [1])
-def r; return [nil]; end; a = r(); test_ok(a == [nil])
-def r; return [[]]; end; a = r(); test_ok(a == [[]])
-def r; return [*[]]; end; a = r(); test_ok(a == [])
-def r; return [*[1]]; end; a = r(); test_ok(a == [1])
-def r; return [*[1,2]]; end; a = r(); test_ok(a == [1,2])
-
-def r; return *[]; end; a = r(); test_ok(a == [])
-def r; return *[1]; end; a = r(); test_ok(a == [1])
-def r; return *[nil]; end; a = r(); test_ok(a == [nil])
-def r; return *[[]]; end; a = r(); test_ok(a == [[]])
-def r; return *[*[]]; end; a = r(); test_ok(a == [])
-def r; return *[*[1]]; end; a = r(); test_ok(a == [1])
-def r; return *[*[1,2]]; end; a = r(); test_ok(a == [1,2])
-
-def r; return *[[]]; end; a = *r(); test_ok(a == [[]])
-def r; return *[*[1,2]]; end; a = *r(); test_ok(a == [1,2])
-
-def r; return; end; *a = r(); test_ok(a == [nil])
-def r; return nil; end; *a = r(); test_ok(a == [nil])
-def r; return 1; end; *a = r(); test_ok(a == [1])
-def r; return []; end; *a = r(); test_ok(a == [])
-def r; return [1]; end; *a = r(); test_ok(a == [1])
-def r; return [nil]; end; *a = r(); test_ok(a == [nil])
-def r; return [[]]; end; *a = r(); test_ok(a == [[]])
-def r; return [1,2]; end; *a = r(); test_ok(a == [1,2])
-def r; return [*[]]; end; *a = r(); test_ok(a == [])
-def r; return [*[1]]; end; *a = r(); test_ok(a == [1])
-def r; return [*[1,2]]; end; *a = r(); test_ok(a == [1,2])
-
-def r; return *[]; end; *a = r(); test_ok(a == [])
-def r; return *[1]; end; *a = r(); test_ok(a == [1])
-def r; return *[nil]; end; *a = r(); test_ok(a == [nil])
-def r; return *[[]]; end; *a = r(); test_ok(a == [[]])
-def r; return *[1,2]; end; *a = r(); test_ok(a == [1,2])
-def r; return *[*[]]; end; *a = r(); test_ok(a == [])
-def r; return *[*[1]]; end; *a = r(); test_ok(a == [1])
-def r; return *[*[1,2]]; end; *a = r(); test_ok(a == [1,2])
-
-def r; return *[[]]; end; *a = *r(); test_ok(a == [[]])
-def r; return *[1,2]; end; *a = *r(); test_ok(a == [1,2])
-def r; return *[*[1,2]]; end; *a = *r(); test_ok(a == [1,2])
-
-def r; return; end; a,b,*c = r(); test_ok([a,b,c] == [nil,nil,[]])
-def r; return nil; end; a,b,*c = r(); test_ok([a,b,c] == [nil,nil,[]])
-def r; return 1; end; a,b,*c = r(); test_ok([a,b,c] == [1,nil,[]])
-def r; return []; end; a,b,*c = r(); test_ok([a,b,c] == [nil,nil,[]])
-def r; return [1]; end; a,b,*c = r(); test_ok([a,b,c] == [1,nil,[]])
-def r; return [nil]; end; a,b,*c = r(); test_ok([a,b,c] == [nil,nil,[]])
-def r; return [[]]; end; a,b,*c = r(); test_ok([a,b,c] == [[],nil,[]])
-def r; return [1,2]; end; a,b,*c = r(); test_ok([a,b,c] == [1,2,[]])
-def r; return [*[]]; end; a,b,*c = r(); test_ok([a,b,c] == [nil,nil,[]])
-def r; return [*[1]]; end; a,b,*c = r(); test_ok([a,b,c] == [1,nil,[]])
-def r; return [*[1,2]]; end; a,b,*c = r(); test_ok([a,b,c] == [1,2,[]])
-
-def r; return *[]; end; a,b,*c = r(); test_ok([a,b,c] == [nil,nil,[]])
-def r; return *[1]; end; a,b,*c = r(); test_ok([a,b,c] == [1,nil,[]])
-def r; return *[nil]; end; a,b,*c = r(); test_ok([a,b,c] == [nil,nil,[]])
-def r; return *[[]]; end; a,b,*c = r(); test_ok([a,b,c] == [[],nil,[]])
-def r; return *[1,2]; end; a,b,*c = r(); test_ok([a,b,c] == [1,2,[]])
-def r; return *[*[]]; end; a,b,*c = r(); test_ok([a,b,c] == [nil,nil,[]])
-def r; return *[*[1]]; end; a,b,*c = r(); test_ok([a,b,c] == [1,nil,[]])
-def r; return *[*[1,2]]; end; a,b,*c = r(); test_ok([a,b,c] == [1,2,[]])
-
-f = lambda {|r,| test_ok([] == r)}
-f.call([], *[])
-
-f = lambda {|r,*l| test_ok([] == r); test_ok([1] == l)}
-f.call([], *[1])
-
-f = lambda{|x| x}
-test_ok(f.call(42) == 42)
-test_ok(f.call([42]) == [42])
-test_ok(f.call([[42]]) == [[42]])
-test_ok(f.call([42,55]) == [42,55])
-
-f = lambda{|x,| x}
-test_ok(f.call(42) == 42)
-test_ok(f.call([42]) == [42])
-test_ok(f.call([[42]]) == [[42]])
-test_ok(f.call([42,55]) == [42,55])
-
-f = lambda{|*x| x}
-test_ok(f.call(42) == [42])
-test_ok(f.call([42]) == [[42]])
-test_ok(f.call([[42]]) == [[[42]]])
-test_ok(f.call([42,55]) == [[42,55]])
-test_ok(f.call(42,55) == [42,55])
-
-f = lambda { |a, b=42, *c| [a,b,c] }
-test_ok(f.call(1 ) == [1,42,[ ]] )
-test_ok(f.call(1,43 ) == [1,43,[ ]] )
-test_ok(f.call(1,43,44) == [1,43,[44]] )
-
-f = lambda { |a, b=(a|16), *c, &block| [a,b,c,block&&block[]] }
-test_ok(f.call(8 ) == [8,24,[ ],nil] )
-test_ok(f.call(8,43 ) == [8,43,[ ],nil] )
-test_ok(f.call(8,43,44) == [8,43,[44],nil] )
-test_ok(f.call(8 ){45} == [8,24,[ ],45 ] )
-test_ok(f.call(8,43 ){45} == [8,43,[ ],45 ] )
-test_ok(f.call(8,43,44){45} == [8,43,[44],45 ] )
-
-f = lambda { |a, b=42, *c, d| [a,b,c,d] }
-test_ok(f.call(1 ,99) == [1,42,[ ],99] )
-test_ok(f.call(1,43 ,99) == [1,43,[ ],99] )
-test_ok(f.call(1,43,44,99) == [1,43,[44],99] )
-
-f = lambda { |a, b=(a|16), &block| [a,b,block&&block[]] }
-test_ok(f.call(8 ) == [8,24,nil] )
-test_ok(f.call(8,43) == [8,43,nil] )
-test_ok(f.call(8,43) == [8,43,nil] )
-test_ok(f.call(8 ){45} == [8,24,45 ] )
-test_ok(f.call(8,43){45} == [8,43,45 ] )
-test_ok(f.call(8,43){45} == [8,43,45 ] )
-
-f = lambda { |a, b=42, d| [a,b,d] }
-test_ok(f.call(1 ,99) == [1,42,99] )
-test_ok(f.call(1,43,99) == [1,43,99] )
-test_ok(f.call(1,43,99) == [1,43,99] )
-
-f = lambda { |b=42, *c, &block| [b,c,block&&block[]] }
-test_ok(f.call( ) == [42,[ ],nil] )
-test_ok(f.call(43 ) == [43,[ ],nil] )
-test_ok(f.call(43,44) == [43,[44],nil] )
-test_ok(f.call( ){45} == [42,[ ],45 ] )
-test_ok(f.call(43 ){45} == [43,[ ],45 ] )
-test_ok(f.call(43,44){45} == [43,[44],45 ] )
-
-f = lambda { |b=42, *c, d| [b,c,d] }
-test_ok(f.call( 99) == [42,[ ],99] )
-test_ok(f.call(43 ,99) == [43,[ ],99] )
-test_ok(f.call(43,44,99) == [43,[44],99] )
-
-f = lambda { |b=42, &block| [b,block&&block[]] }
-test_ok(f.call( ) == [42,nil] )
-test_ok(f.call(43) == [43,nil] )
-test_ok(f.call(43) == [43,nil] )
-test_ok(f.call( ){45} == [42,45 ] )
-test_ok(f.call(43){45} == [43,45 ] )
-test_ok(f.call(43){45} == [43,45 ] )
-
-f = lambda { |b=42, d| [b,d] }
-test_ok(f.call( 99) == [42,99] )
-test_ok(f.call(43,99) == [43,99] )
-test_ok(f.call(43,99) == [43,99] )
-
-
-a,=*[1]
-test_ok(a == 1)
-a,=*[[1]]
-test_ok(a == [1])
-a,=*[[[1]]]
-test_ok(a == [[1]])
-
-x, (y, z) = 1, 2, 3
-test_ok([1,2,nil] == [x,y,z])
-x, (y, z) = 1, [2,3]
-test_ok([1,2,3] == [x,y,z])
-x, (y, z) = 1, [2]
-test_ok([1,2,nil] == [x,y,z])
-
-a = loop do break; end; test_ok(a == nil)
-a = loop do break nil; end; test_ok(a == nil)
-a = loop do break 1; end; test_ok(a == 1)
-a = loop do break []; end; test_ok(a == [])
-a = loop do break [1]; end; test_ok(a == [1])
-a = loop do break [nil]; end; test_ok(a == [nil])
-a = loop do break [[]]; end; test_ok(a == [[]])
-a = loop do break [*[]]; end; test_ok(a == [])
-a = loop do break [*[1]]; end; test_ok(a == [1])
-a = loop do break [*[1,2]]; end; test_ok(a == [1,2])
-
-a = loop do break *[]; end; test_ok(a == [])
-a = loop do break *[1]; end; test_ok(a == [1])
-a = loop do break *[nil]; end; test_ok(a == [nil])
-a = loop do break *[[]]; end; test_ok(a == [[]])
-a = loop do break *[*[]]; end; test_ok(a == [])
-a = loop do break *[*[1]]; end; test_ok(a == [1])
-a = loop do break *[*[1,2]]; end; test_ok(a == [1,2])
-
-*a = loop do break; end; test_ok(a == [nil])
-*a = loop do break nil; end; test_ok(a == [nil])
-*a = loop do break 1; end; test_ok(a == [1])
-*a = loop do break []; end; test_ok(a == [])
-*a = loop do break [1]; end; test_ok(a == [1])
-*a = loop do break [nil]; end; test_ok(a == [nil])
-*a = loop do break [[]]; end; test_ok(a == [[]])
-*a = loop do break [1,2]; end; test_ok(a == [1,2])
-*a = loop do break [*[]]; end; test_ok(a == [])
-*a = loop do break [*[1]]; end; test_ok(a == [1])
-*a = loop do break [*[1,2]]; end; test_ok(a == [1,2])
-
-*a = loop do break *[]; end; test_ok(a == [])
-*a = loop do break *[1]; end; test_ok(a == [1])
-*a = loop do break *[nil]; end; test_ok(a == [nil])
-*a = loop do break *[[]]; end; test_ok(a == [[]])
-*a = loop do break *[1,2]; end; test_ok(a == [1,2])
-*a = loop do break *[*[]]; end; test_ok(a == [])
-*a = loop do break *[*[1]]; end; test_ok(a == [1])
-*a = loop do break *[*[1,2]]; end; test_ok(a == [1,2])
-
-*a = *loop do break *[[]]; end; test_ok(a == [[]])
-*a = *loop do break *[1,2]; end; test_ok(a == [1,2])
-*a = *loop do break *[*[1,2]]; end; test_ok(a == [1,2])
-
-a,b,*c = loop do break; end; test_ok([a,b,c] == [nil,nil,[]])
-a,b,*c = loop do break nil; end; test_ok([a,b,c] == [nil,nil,[]])
-a,b,*c = loop do break 1; end; test_ok([a,b,c] == [1,nil,[]])
-a,b,*c = loop do break []; end; test_ok([a,b,c] == [nil,nil,[]])
-a,b,*c = loop do break [1]; end; test_ok([a,b,c] == [1,nil,[]])
-a,b,*c = loop do break [nil]; end; test_ok([a,b,c] == [nil,nil,[]])
-a,b,*c = loop do break [[]]; end; test_ok([a,b,c] == [[],nil,[]])
-a,b,*c = loop do break [1,2]; end; test_ok([a,b,c] == [1,2,[]])
-a,b,*c = loop do break [*[]]; end; test_ok([a,b,c] == [nil,nil,[]])
-a,b,*c = loop do break [*[1]]; end; test_ok([a,b,c] == [1,nil,[]])
-a,b,*c = loop do break [*[1,2]]; end; test_ok([a,b,c] == [1,2,[]])
-
-a,b,*c = loop do break *[]; end; test_ok([a,b,c] == [nil,nil,[]])
-a,b,*c = loop do break *[1]; end; test_ok([a,b,c] == [1,nil,[]])
-a,b,*c = loop do break *[nil]; end; test_ok([a,b,c] == [nil,nil,[]])
-a,b,*c = loop do break *[[]]; end; test_ok([a,b,c] == [[],nil,[]])
-a,b,*c = loop do break *[1,2]; end; test_ok([a,b,c] == [1,2,[]])
-a,b,*c = loop do break *[*[]]; end; test_ok([a,b,c] == [nil,nil,[]])
-a,b,*c = loop do break *[*[1]]; end; test_ok([a,b,c] == [1,nil,[]])
-a,b,*c = loop do break *[*[1,2]]; end; test_ok([a,b,c] == [1,2,[]])
-
-def r(val); a = yield(); test_ok(a == val, 2); end
-r(nil){next}
-r(nil){next nil}
-r(1){next 1}
-r([]){next []}
-r([1]){next [1]}
-r([nil]){next [nil]}
-r([[]]){next [[]]}
-r([]){next [*[]]}
-r([1]){next [*[1]]}
-r([1,2]){next [*[1,2]]}
-
-r([]){next *[]}
-r([1]){next *[1]}
-r([nil]){next *[nil]}
-r([[]]){next *[[]]}
-r([]){next *[*[]]}
-r([1]){next *[*[1]]}
-r([1,2]){next *[*[1,2]]}
-
-def r(val); *a = yield(); test_ok(a == val, 2); end
-r([nil]){next}
-r([nil]){next nil}
-r([1]){next 1}
-r([]){next []}
-r([1]){next [1]}
-r([nil]){next [nil]}
-r([[]]){next [[]]}
-r([1,2]){next [1,2]}
-r([]){next [*[]]}
-r([1]){next [*[1]]}
-r([1,2]){next [*[1,2]]}
-
-def r(val); *a = *yield(); test_ok(a == val, 2); end
-r([[]]){next *[[]]}
-r([1,2]){next *[1,2]}
-r([1,2]){next *[*[1,2]]}
-
-def r(val); a,b,*c = yield(); test_ok([a,b,c] == val, 2); end
-r([nil,nil,[]]){next}
-r([nil,nil,[]]){next nil}
-r([1,nil,[]]){next 1}
-r([nil,nil,[]]){next []}
-r([1,nil,[]]){next [1]}
-r([nil,nil,[]]){next [nil]}
-r([[],nil,[]]){next [[]]}
-r([1,2,[]]){next [1,2]}
-r([nil,nil,[]]){next [*[]]}
-r([1,nil,[]]){next [*[1]]}
-r([1,2,[]]){next [*[1,2]]}
-
-def r(val); a,b,*c = *yield(); test_ok([a,b,c] == val, 2); end
-r([[],nil,[]]){next *[[]]}
-r([1,2,[]]){next *[1,2]}
-r([1,2,[]]){next *[*[1,2]]}
-
-test_check "condition"
-
-$x = '0';
-
-$x == $x && test_ok(true)
-$x != $x && test_ok(false)
-$x == $x || test_ok(false)
-$x != $x || test_ok(true)
-
-# first test to see if we can run the tests.
-
-test_check "if/unless";
-
-$x = 'test';
-test_ok(if $x == $x then true else false end)
-$bad = false
-unless $x == $x
- $bad = true
-end
-test_ok(!$bad)
-test_ok(unless $x != $x then true else false end)
-
-test_check "case"
-
-case 5
-when 1, 2, 3, 4, 6, 7, 8
- test_ok(false)
-when 5
- test_ok(true)
-end
-
-case 5
-when 5
- test_ok(true)
-when 1..10
- test_ok(false)
-end
-
-case 5
-when 1..10
- test_ok(true)
-else
- test_ok(false)
-end
-
-case 5
-when 5
- test_ok(true)
-else
- test_ok(false)
-end
-
-case "foobar"
-when /^f.*r$/
- test_ok(true)
-else
- test_ok(false)
-end
-
-test_check "while/until";
-
-while_tmp = "while_tmp.#{$$}"
-tmp = open(while_tmp, "w")
-tmp.print "tvi925\n";
-tmp.print "tvi920\n";
-tmp.print "vt100\n";
-tmp.print "Amiga\n";
-tmp.print "paper\n";
-tmp.close
-
-# test break
-
-tmp = open(while_tmp, "r")
-test_ok(tmp.kind_of?(File))
-
-while line = tmp.gets()
- break if /vt100/ =~ line
-end
-
-test_ok(!tmp.eof? && /vt100/ =~ line)
-tmp.close
-
-# test next
-$bad = false
-tmp = open(while_tmp, "r")
-while line = tmp.gets()
- next if /vt100/ =~ line
- $bad = 1 if /vt100/ =~ line
-end
-test_ok(!(!tmp.eof? || /vt100/ =~ line || $bad))
-tmp.close
-
-# test redo
-$bad = false
-tmp = open(while_tmp, "r")
-while line = tmp.gets()
- lastline = line
- line = line.gsub(/vt100/, 'VT100')
- if lastline != line
- line.gsub!('VT100', 'Vt100')
- redo
- end
- $bad = 1 if /vt100/ =~ line
- $bad = 1 if /VT100/ =~ line
-end
-test_ok(tmp.eof? && !$bad)
-tmp.close
-
-sum=0
-for i in 1..10
- sum += i
- i -= 1
- if i > 0
- redo
- end
-end
-test_ok(sum == 220)
-
-# test interval
-$bad = false
-tmp = open(while_tmp, "r")
-while line = tmp.gets()
- break if 3
- case line
- when /vt100/, /Amiga/, /paper/
- $bad = true
- end
-end
-test_ok(!$bad)
-tmp.close
-
-File.unlink while_tmp or `/bin/rm -f "#{while_tmp}"`
-test_ok(!File.exist?(while_tmp))
-
-i = 0
-until i>4
- i+=1
-end
-test_ok(i>4)
-
-
-# exception handling
-test_check "exception";
-
-begin
- raise "this must be handled"
- test_ok(false)
-rescue
- test_ok(true)
-end
-
-$bad = true
-begin
- raise "this must be handled no.2"
-rescue
- if $bad
- $bad = false
- retry
- test_ok(false)
- end
-end
-test_ok(true)
-
-# exception in rescue clause
-$string = "this must be handled no.3"
-begin
- begin
- raise "exception in rescue clause"
- rescue
- raise $string
- end
- test_ok(false)
-rescue => e
- test_ok($! == e)
- test_ok(e.message == $string)
- test_ok(e != $string)
-end
-
-# exception in ensure clause
-begin
- begin
- raise "this must be handled no.4"
- ensure
- raise "exception in ensure clause"
- end
- test_ok(false)
-rescue
- test_ok(true)
-end
-
-$bad = true
-begin
- begin
- raise "this must be handled no.5"
- ensure
- $bad = false
- end
-rescue
-end
-test_ok(!$bad)
-
-$bad = true
-begin
- begin
- raise "this must be handled no.6"
- ensure
- $bad = false
- end
-rescue
-end
-test_ok(!$bad)
-
-$bad = true
-while true
- begin
- break
- ensure
- $bad = false
- end
-end
-test_ok(!$bad)
-
-test_ok(catch(:foo) {
- loop do
- loop do
- throw :foo, true
- break
- end
- break
- test_ok(false) # should not reach here
- end
- false
- })
-
-test_check "array"
-test_ok([1, 2] + [3, 4] == [1, 2, 3, 4])
-test_ok([1, 2] * 2 == [1, 2, 1, 2])
-test_ok([1, 2] * ":" == "1:2")
-
-test_ok([1, 2].hash == [1, 2].hash)
-
-test_ok([1,2,3] & [2,3,4] == [2,3])
-test_ok([1,2,3] | [2,3,4] == [1,2,3,4])
-test_ok([1,2,3] - [2,3] == [1])
-
-$x = [0, 1, 2, 3, 4, 5]
-test_ok($x[2] == 2)
-test_ok($x[1..3] == [1, 2, 3])
-test_ok($x[1,3] == [1, 2, 3])
-
-$x[0, 2] = 10
-test_ok($x[0] == 10 && $x[1] == 2)
-
-$x[0, 0] = -1
-test_ok($x[0] == -1 && $x[1] == 10)
-
-$x[-1, 1] = 20
-test_ok($x[-1] == 20 && $x.pop == 20)
-
-# array and/or
-test_ok(([1,2,3]&[2,4,6]) == [2])
-test_ok(([1,2,3]|[2,4,6]) == [1,2,3,4,6])
-
-# compact
-$x = [nil, 1, nil, nil, 5, nil, nil]
-$x.compact!
-test_ok($x == [1, 5])
-
-# uniq
-$x = [1, 1, 4, 2, 5, 4, 5, 1, 2]
-$x.uniq!
-test_ok($x == [1, 4, 2, 5])
-
-# empty?
-test_ok(!$x.empty?)
-$x = []
-test_ok($x.empty?)
-
-# sort
-$x = ["it", "came", "to", "pass", "that", "..."]
-$x = $x.sort.join(" ")
-test_ok($x == "... came it pass that to")
-$x = [2,5,3,1,7]
-$x.sort!{|a,b| a<=>b} # sort with condition
-test_ok($x == [1,2,3,5,7])
-$x.sort!{|a,b| b-a} # reverse sort
-test_ok($x == [7,5,3,2,1])
-
-# split test
-$x = "The Book of Mormon"
-test_ok($x.split(//).reverse!.join == $x.reverse)
-test_ok($x.reverse == $x.reverse!)
-test_ok("1 byte string".split(//).reverse.join(":") == "g:n:i:r:t:s: :e:t:y:b: :1")
-$x = "a b c d"
-test_ok($x.split == ['a', 'b', 'c', 'd'])
-test_ok($x.split(' ') == ['a', 'b', 'c', 'd'])
-test_ok(defined? "a".chomp)
-test_ok("abc".scan(/./) == ["a", "b", "c"])
-test_ok("1a2b3c".scan(/(\d.)/) == [["1a"], ["2b"], ["3c"]])
-# non-greedy match
-test_ok("a=12;b=22".scan(/(.*?)=(\d*);?/) == [["a", "12"], ["b", "22"]])
-
-$x = [1]
-test_ok(($x * 5).join(":") == '1:1:1:1:1')
-test_ok(($x * 1).join(":") == '1')
-test_ok(($x * 0).join(":") == '')
-
-*$x = *(1..7).to_a
-test_ok($x.size == 7)
-test_ok($x == [1, 2, 3, 4, 5, 6, 7])
-
-$x = [1,2,3]
-$x[1,0] = $x
-test_ok($x == [1,1,2,3,2,3])
-
-$x = [1,2,3]
-$x[-1,0] = $x
-test_ok($x == [1,2,1,2,3,3])
-
-$x = [1,2,3]
-$x.concat($x)
-test_ok($x == [1,2,3,1,2,3])
-
-test_check "hash"
-$x = {1=>2, 2=>4, 3=>6}
-
-test_ok($x[1] == 2)
-
-test_ok(begin
- for k,v in $x
- raise if k*2 != v
- end
- true
- rescue
- false
- end)
-
-test_ok($x.length == 3)
-test_ok($x.has_key?(1))
-test_ok($x.has_value?(4))
-test_ok($x.values_at(2,3) == [4,6])
-test_ok($x == {1=>2, 2=>4, 3=>6})
-
-$z = $x.keys.sort.join(":")
-test_ok($z == "1:2:3")
-
-$z = $x.values.sort.join(":")
-test_ok($z == "2:4:6")
-test_ok($x == $x)
-
-$x.shift
-test_ok($x.length == 2)
-
-$z = [1,2]
-$x[$z] = 256
-test_ok($x[$z] == 256)
-
-$x = Hash.new(0)
-$x[1] = 1
-test_ok($x[1] == 1)
-test_ok($x[2] == 0)
-
-$x = Hash.new([])
-test_ok($x[22] == [])
-test_ok($x[22].equal?($x[22]))
-
-$x = Hash.new{[]}
-test_ok($x[22] == [])
-test_ok(!$x[22].equal?($x[22]))
-
-$x = Hash.new{|h,k| $z = k; h[k] = k*2}
-$z = 0
-test_ok($x[22] == 44)
-test_ok($z == 22)
-$z = 0
-test_ok($x[22] == 44)
-test_ok($z == 0)
-$x.default = 5
-test_ok($x[23] == 5)
-
-$x = Hash.new
-def $x.default(k)
- $z = k
- self[k] = k*2
-end
-$z = 0
-test_ok($x[22] == 44)
-test_ok($z == 22)
-$z = 0
-test_ok($x[22] == 44)
-test_ok($z == 0)
-
-test_check "iterator"
-
-test_ok(!iterator?)
-
-def ttt
- test_ok(iterator?)
-end
-ttt{}
-
-# yield at top level
-test_ok(!defined?(yield))
-
-$x = [1, 2, 3, 4]
-$y = []
-
-# iterator over array
-for i in $x
- $y.push i
-end
-test_ok($x == $y)
-
-# nested iterator
-def tt
- 1.upto(10) {|i|
- yield i
- }
-end
-
-i=0
-tt{|i| break if i == 5}
-test_ok(i == 0)
-
-def tt2(dummy)
- yield 1
-end
-
-def tt3(&block)
- tt2(raise(ArgumentError,""),&block)
-end
-
-$x = false
-begin
- tt3{}
-rescue ArgumentError
- $x = true
-rescue Exception
-end
-test_ok($x)
-
-def tt4 &block
- tt2(raise(ArgumentError,""),&block)
-end
-$x = false
-begin
- tt4{}
-rescue ArgumentError
- $x = true
-rescue Exception
-end
-test_ok($x)
-
-# iterator break/redo/next/retry
-done = true
-loop{
- break
- done = false # should not reach here
-}
-test_ok(done)
-
-done = false
-$bad = false
-loop {
- break if done
- done = true
- next
- $bad = true # should not reach here
-}
-test_ok(!$bad)
-
-done = false
-$bad = false
-loop {
- break if done
- done = true
- redo
- $bad = true # should not reach here
-}
-test_ok(!$bad)
-
-$x = []
-for i in 1 .. 7
- $x.push i
-end
-test_ok($x.size == 7)
-test_ok($x == [1, 2, 3, 4, 5, 6, 7])
-
-# append method to built-in class
-class Array
- def iter_test1
- collect{|e| [e, yield(e)]}.sort{|a,b|a[1]<=>b[1]}
- end
- def iter_test2
- a = collect{|e| [e, yield(e)]}
- a.sort{|a,b|a[1]<=>b[1]}
- end
-end
-$x = [[1,2],[3,4],[5,6]]
-test_ok($x.iter_test1{|x|x} == $x.iter_test2{|x|x})
-
-class IterTest
- def initialize(e); @body = e; end
-
- def each0(&block); @body.each(&block); end
- def each1(&block); @body.each {|*x| block.call(*x) } end
- def each2(&block); @body.each {|*x| block.call(x) } end
- def each3(&block); @body.each {|x| block.call(*x) } end
- def each4(&block); @body.each {|x| block.call(x) } end
- def each5; @body.each {|*x| yield(*x) } end
- def each6; @body.each {|*x| yield(x) } end
- def each7; @body.each {|x| yield(*x) } end
- def each8; @body.each {|x| yield(x) } end
-
- def f(a)
- a
- end
-end
-test_ok(IterTest.new(nil).method(:f).to_proc.call([1]) == [1])
-m = /\w+/.match("abc")
-test_ok(IterTest.new(nil).method(:f).to_proc.call([m]) == [m])
-
-IterTest.new([0]).each0 {|x| test_ok(x == 0)}
-IterTest.new([1]).each1 {|x| test_ok(x == 1)}
-IterTest.new([2]).each2 {|x| test_ok(x == [2])}
-#IterTest.new([3]).each3 {|x| test_ok(x == 3)}
-IterTest.new([4]).each4 {|x| test_ok(x == 4)}
-IterTest.new([5]).each5 {|x| test_ok(x == 5)}
-IterTest.new([6]).each6 {|x| test_ok(x == [6])}
-#IterTest.new([7]).each7 {|x| test_ok(x == 7)}
-IterTest.new([8]).each8 {|x| test_ok(x == 8)}
-
-IterTest.new([[0]]).each0 {|x| test_ok(x == [0])}
-IterTest.new([[1]]).each1 {|x| test_ok(x == [1])}
-IterTest.new([[2]]).each2 {|x| test_ok(x == [[2]])}
-IterTest.new([[3]]).each3 {|x| test_ok(x == 3)}
-IterTest.new([[4]]).each4 {|x| test_ok(x == [4])}
-IterTest.new([[5]]).each5 {|x| test_ok(x == [5])}
-IterTest.new([[6]]).each6 {|x| test_ok(x == [[6]])}
-IterTest.new([[7]]).each7 {|x| test_ok(x == 7)}
-IterTest.new([[8]]).each8 {|x| test_ok(x == [8])}
-
-IterTest.new([[0,0]]).each0 {|*x| test_ok(x == [[0,0]])}
-IterTest.new([[8,8]]).each8 {|*x| test_ok(x == [[8,8]])}
-
-def m0(v)
- v
-end
-
-def m1
- m0(block_given?)
-end
-test_ok(m1{p 'test'})
-test_ok(!m1)
-
-def m
- m0(block_given?,&Proc.new{})
-end
-test_ok(m1{p 'test'})
-test_ok(!m1)
-
-class C
- include Enumerable
- def initialize
- @a = [1,2,3]
- end
- def each(&block)
- @a.each(&block)
- end
-end
-
-test_ok(C.new.collect{|n| n} == [1,2,3])
-
-test_ok(Proc == lambda{}.class)
-test_ok(Proc == Proc.new{}.class)
-lambda{|a|test_ok(a==1)}.call(1)
-def block_test(klass, &block)
- test_ok(klass === block)
-end
-
-block_test(NilClass)
-block_test(Proc){}
-
-def call_argument_test(state, proc, *args)
- x = state
- begin
- proc.call(*args)
- rescue ArgumentError
- x = !x
- end
- test_ok(x,2)
-end
-
-call_argument_test(true, lambda{||})
-call_argument_test(false, lambda{||}, 1)
-call_argument_test(true, lambda{|a,|}, 1)
-call_argument_test(false, lambda{|a,|})
-call_argument_test(false, lambda{|a,|}, 1,2)
-
-call_argument_test(true, Proc.new{||})
-call_argument_test(true, Proc.new{||}, 1)
-call_argument_test(true, Proc.new{|a,|}, 1)
-call_argument_test(true, Proc.new{|a,|})
-call_argument_test(true, Proc.new{|a,|}, 1,2)
-
-def block_get(&block)
- block
-end
-
-test_ok(Proc == block_get{}.class)
-call_argument_test(true, block_get{||})
-call_argument_test(true, block_get{||}, 1)
-call_argument_test(true, block_get{|a,|}, 1)
-call_argument_test(true, block_get{|a,|})
-call_argument_test(true, block_get{|a,|}, 1,2)
-
-call_argument_test(true, block_get(&lambda{||}))
-call_argument_test(false, block_get(&lambda{||}),1)
-call_argument_test(true, block_get(&lambda{|a,|}),1)
-call_argument_test(false, block_get(&lambda{|a,|}),1,2)
-
-blk = block_get{11}
-test_ok(blk.class == Proc)
-test_ok(blk.to_proc.class == Proc)
-test_ok(blk.clone.call == 11)
-test_ok(block_get(&blk).class == Proc)
-
-lmd = lambda{44}
-test_ok(lmd.class == Proc)
-test_ok(lmd.to_proc.class == Proc)
-test_ok(lmd.clone.call == 44)
-test_ok(block_get(&lmd).class == Proc)
-
-test_ok(Proc.new{|a,| a}.yield(1,2,3) == 1)
-call_argument_test(true, Proc.new{|a,|}, 1,2)
-
-test_ok(Proc.new{|&b| b.call(10)}.call {|x| x} == 10)
-test_ok(Proc.new{|a,&b| b.call(a)}.call(12) {|x| x} == 12)
-
-def test_return1
- Proc.new {
- return 55
- }.yield + 5
-end
-test_ok(test_return1() == 55)
-def test_return2
- lambda {
- return 55
- }.call + 5
-end
-test_ok(test_return2() == 60)
-
-def proc_call(&b)
- b.call
-end
-def proc_yield()
- yield
-end
-def proc_return1
- lambda{return 42}.call+1
-end
-test_ok(proc_return1() == 43)
-def proc_return2
- ->{return 42}.call+1
-end
-test_ok(proc_return2() == 43)
-def proc_return3
- proc_call{return 42}+1
-end
-test_ok(proc_return3() == 42)
-def proc_return4
- proc_yield{return 42}+1
-end
-test_ok(proc_return4() == 42)
-
-def ljump_test(state, proc, *args)
- x = state
- begin
- proc.call(*args)
- rescue LocalJumpError
- x = !x
- end
- test_ok(x,2)
-end
-
-ljump_test(false, block_get{break})
-ljump_test(true, lambda{break})
-
-def exit_value_test(&block)
- block.call
-rescue LocalJumpError
- $!.exit_value
-end
-
-test_ok(45 == exit_value_test{break 45})
-
-test_ok(55 == begin
- block_get{break 55}.call
- rescue LocalJumpError
- $!.exit_value
- end)
-
-def block_call(&block)
- block.call
-end
-
-def test_b1
- block_call{break 11}
-end
-test_ok(test_b1() == 11)
-
-def ljump_rescue(r)
- begin
- yield
- rescue LocalJumpError => e
- r if /from proc-closure/ =~ e.message
- end
-end
-
-def test_b2
- ljump_rescue(22) do
- block_get{break 21}.call
- end
-end
-test_ok(test_b2() == 22)
-
-def test_b3
- ljump_rescue(33) do
- Proc.new{break 31}.yield
- end
-end
-test_ok(test_b3() == 33)
-
-def test_b4
- lambda{break 44}.call
-end
-test_ok(test_b4() == 44)
-
-def test_b5
- ljump_rescue(55) do
- b = block_get{break 54}
- block_call(&b)
- end
-end
-test_ok(test_b5() == 55)
-
-def test_b6
- b = lambda{break 67}
- block_call(&b)
- 66
-end
-test_ok(test_b6() == 66)
-
-def util_r7
- block_get{break 78}
-end
-
-def test_b7
- b = util_r7()
- ljump_rescue(77) do
- block_call(&b)
- end
-end
-test_ok(test_b7() == 77)
-
-def util_b8(&block)
- block_call(&block)
-end
-
-def test_b8
- util_b8{break 88}
-end
-test_ok(test_b8() == 88)
-
-def util_b9(&block)
- lambda{block.call; 98}.call
-end
-
-def test_b9
- util_b9{break 99}
-end
-test_ok(test_b9() == 99)
-
-def util_b10
- util_b9{break 100}
-end
-
-def test_b10
- util_b10()
-end
-test_ok(test_b10() == 100)
-
-def test_b11
- ljump_rescue(111) do
- loop do
- Proc.new{break 110}.yield
- break 112
- end
- end
-end
-test_ok(test_b11() == 111)
-
-def test_b12
- loop do
- break lambda{break 122}.call
- break 121
- end
-end
-test_ok(test_b12() == 122)
-
-def test_b13
- ljump_rescue(133) do
- while true
- Proc.new{break 130}.yield
- break 131
- end
- end
-end
-test_ok(test_b13() == 133)
-
-def test_b14
- while true
- break lambda{break 144}.call
- break 143
- end
-end
-test_ok(test_b14() == 144)
-
-def test_b15
- [0].each {|c| yield 1 }
- 156
-end
-test_ok(test_b15{|e| break 155 } == 155)
-
-def marity_test(m)
- method = method(m)
- test_ok(method.arity == method.to_proc.arity, 2)
-end
-marity_test(:test_ok)
-marity_test(:marity_test)
-marity_test(:p)
-
-lambda(&method(:test_ok)).call(true)
-lambda(&block_get{|a,n| test_ok(a,n)}).call(true, 2)
-
-class ITER_TEST1
- def a
- block_given?
- end
-end
-
-class ITER_TEST2 < ITER_TEST1
- def a
- test_ok(super)
- super
- end
-end
-test_ok(ITER_TEST2.new.a {})
-
-class ITER_TEST3
- def foo x
- return yield if block_given?
- x
- end
-end
-
-class ITER_TEST4 < ITER_TEST3
- def foo x
- test_ok(super == yield)
- test_ok(super(x, &nil) == x)
- end
-end
-
-ITER_TEST4.new.foo(44){55}
-
-class ITER_TEST5
- def tt(aa)
- aa
- end
-
- def uu(a)
- class << self
- define_method(:tt) do |sym|
- super(sym)
- end
- end
- end
-
- def xx(*x)
- x.size
- end
-end
-
-a = ITER_TEST5.new
-a.uu(12)
-test_ok(a.tt(1) == 1)
-
-class ITER_TEST6 < ITER_TEST5
- def xx(*a)
- a << 12
- super
- end
-end
-
-test_ok(ITER_TEST6.new.xx([24]) == 2)
-
-test_check "float"
-test_ok(2.6.floor == 2)
-test_ok((-2.6).floor == -3)
-test_ok(2.6.ceil == 3)
-test_ok((-2.6).ceil == -2)
-test_ok(2.6.truncate == 2)
-test_ok((-2.6).truncate == -2)
-test_ok(2.6.round == 3)
-test_ok((-2.4).truncate == -2)
-test_ok((13.4 % 1 - 0.4).abs < 0.0001)
-nan = 0.0/0
-def nan_test(x,y)
- test_ok(x != y)
- test_ok((x < y) == false)
- test_ok((x > y) == false)
- test_ok((x <= y) == false)
- test_ok((x >= y) == false)
-end
-nan_test(nan, nan)
-nan_test(nan, 0)
-nan_test(nan, 1)
-nan_test(nan, -1)
-nan_test(nan, 1000)
-nan_test(nan, -1000)
-nan_test(nan, 1_000_000_000_000)
-nan_test(nan, -1_000_000_000_000)
-nan_test(nan, 100.0);
-nan_test(nan, -100.0);
-nan_test(nan, 0.001);
-nan_test(nan, -0.001);
-nan_test(nan, 1.0/0);
-nan_test(nan, -1.0/0);
-
-#s = "3.7517675036461267e+17"
-#test_ok(s == sprintf("%.16e", s.to_f))
-f = 3.7517675036461267e+17
-test_ok(f == sprintf("%.16e", f).to_f)
-
-
-test_check "bignum"
-def fact(n)
- return 1 if n == 0
- f = 1
- while n>0
- f *= n
- n -= 1
- end
- return f
-end
-$x = fact(40)
-test_ok($x == $x)
-test_ok($x == fact(40))
-test_ok($x < $x+2)
-test_ok($x > $x-2)
-test_ok($x == 815915283247897734345611269596115894272000000000)
-test_ok($x != 815915283247897734345611269596115894272000000001)
-test_ok($x+1 == 815915283247897734345611269596115894272000000001)
-test_ok($x/fact(20) == 335367096786357081410764800000)
-$x = -$x
-test_ok($x == -815915283247897734345611269596115894272000000000)
-test_ok(2-(2**32) == -(2**32-2))
-test_ok(2**32 - 5 == (2**32-3)-2)
-
-$good = true;
-for i in 1000..1014
- $good = false if ((1 << i) != (2**i))
-end
-test_ok($good)
-
-$good = true;
-n1= 1 << 1000
-for i in 1000..1014
- $good = false if ((1 << i) != n1)
- n1 *= 2
-end
-test_ok($good)
-
-$good = true;
-n2=n1
-for i in 1..10
- n1 = n1 / 2
- n2 = n2 >> 1
- $good = false if (n1 != n2)
-end
-test_ok($good)
-
-$good = true;
-for i in 4000..4096
- n1 = 1 << i;
- if (n1**2-1) / (n1+1) != (n1-1)
- $good = false
- end
-end
-test_ok($good)
-
-b = 10**80
-a = b * 9 + 7
-test_ok(7 == a.modulo(b))
-test_ok(-b + 7 == a.modulo(-b))
-test_ok(b + -7 == (-a).modulo(b))
-test_ok(-7 == (-a).modulo(-b))
-test_ok(7 == a.remainder(b))
-test_ok(7 == a.remainder(-b))
-test_ok(-7 == (-a).remainder(b))
-test_ok(-7 == (-a).remainder(-b))
-
-test_ok(10**40+10**20 == 10000000000000000000100000000000000000000)
-test_ok(10**40/10**20 == 100000000000000000000)
-
-a = 677330545177305025495135714080
-b = 14269972710765292560
-test_ok(a % b == 0)
-test_ok(-a % b == 0)
-
-def shift_test(a)
- b = a / (2 ** 32)
- c = a >> 32
- test_ok(b == c)
-
- b = a * (2 ** 32)
- c = a << 32
- test_ok(b == c)
-end
-
-shift_test(-4518325415524767873)
-shift_test(-0xfffffffffffffffff)
-
-test_check "string & char"
-
-test_ok("abcd" == "abcd")
-test_ok("abcd" =~ /abcd/)
-test_ok("abcd" === "abcd")
-# compile time string concatenation
-test_ok("ab" "cd" == "abcd")
-test_ok("#{22}aa" "cd#{44}" == "22aacd44")
-test_ok("#{22}aa" "cd#{44}" "55" "#{66}" == "22aacd445566")
-test_ok("abc" !~ /^$/)
-test_ok("abc\n" !~ /^$/)
-test_ok("abc" !~ /^d*$/)
-test_ok(("abc" =~ /d*$/) == 3)
-test_ok("" =~ /^$/)
-test_ok("\n" =~ /^$/)
-test_ok("a\n\n" =~ /^$/)
-test_ok("abcabc" =~ /.*a/ && $& == "abca")
-test_ok("abcabc" =~ /.*c/ && $& == "abcabc")
-test_ok("abcabc" =~ /.*?a/ && $& == "a")
-test_ok("abcabc" =~ /.*?c/ && $& == "abc")
-test_ok(/(.|\n)*?\n(b|\n)/ =~ "a\nb\n\n" && $& == "a\nb")
-
-test_ok(/^(ab+)+b/ =~ "ababb" && $& == "ababb")
-test_ok(/^(?:ab+)+b/ =~ "ababb" && $& == "ababb")
-test_ok(/^(ab+)+/ =~ "ababb" && $& == "ababb")
-test_ok(/^(?:ab+)+/ =~ "ababb" && $& == "ababb")
-
-test_ok(/(\s+\d+){2}/ =~ " 1 2" && $& == " 1 2")
-test_ok(/(?:\s+\d+){2}/ =~ " 1 2" && $& == " 1 2")
-
-$x = <<END;
-ABCD
-ABCD
-END
-$x.gsub!(/((.|\n)*?)B((.|\n)*?)D/, '\1\3')
-test_ok($x == "AC\nAC\n")
-
-test_ok("foobar" =~ /foo(?=(bar)|(baz))/)
-test_ok("foobaz" =~ /foo(?=(bar)|(baz))/)
-
-$foo = "abc"
-test_ok("#$foo = abc" == "abc = abc")
-test_ok("#{$foo} = abc" == "abc = abc")
-
-foo = "abc"
-test_ok("#{foo} = abc" == "abc = abc")
-
-test_ok('-' * 5 == '-----')
-test_ok('-' * 1 == '-')
-test_ok('-' * 0 == '')
-
-foo = '-'
-test_ok(foo * 5 == '-----')
-test_ok(foo * 1 == '-')
-test_ok(foo * 0 == '')
-
-$x = "a.gif"
-test_ok($x.sub(/.*\.([^\.]+)$/, '\1') == "gif")
-test_ok($x.sub(/.*\.([^\.]+)$/, 'b.\1') == "b.gif")
-test_ok($x.sub(/.*\.([^\.]+)$/, '\2') == "")
-test_ok($x.sub(/.*\.([^\.]+)$/, 'a\2b') == "ab")
-test_ok($x.sub(/.*\.([^\.]+)$/, '<\&>') == "<a.gif>")
-
-# character constants(assumes ASCII)
-test_ok("a"[0] == ?a)
-test_ok(?a == ?a)
-test_ok(?\C-a == "\1")
-test_ok(?\M-a == "\341")
-test_ok(?\M-\C-a == "\201")
-test_ok("a".upcase![0] == ?A)
-test_ok("A".downcase![0] == ?a)
-test_ok("abc".tr!("a-z", "A-Z") == "ABC")
-test_ok("aabbcccc".tr_s!("a-z", "A-Z") == "ABC")
-test_ok("abcc".squeeze!("a-z") == "abc")
-test_ok("abcd".delete!("bc") == "ad")
-
-$x = "abcdef"
-$y = [ ?a, ?b, ?c, ?d, ?e, ?f ]
-$bad = false
-$x.each_byte {|i|
- if i.chr != $y.shift
- $bad = true
- break
- end
-}
-test_ok(!$bad)
-
-s = "a string"
-s[0..s.size]="another string"
-test_ok(s == "another string")
-
-s = <<EOS
-#{
-[1,2,3].join(",")
-}
-EOS
-test_ok(s == "1,2,3\n")
-test_ok("Just".to_i(36) == 926381)
-test_ok("-another".to_i(36) == -23200231779)
-test_ok(1299022.to_s(36) == "ruby")
-test_ok(-1045307475.to_s(36) == "-hacker")
-test_ok("Just_another_Ruby_hacker".to_i(36) == 265419172580680477752431643787347)
-test_ok(-265419172580680477752431643787347.to_s(36) == "-justanotherrubyhacker")
-
-a = []
-(0..255).each {|n|
- ch = [n].pack("C")
- a.push ch if /a#{Regexp.quote ch}b/x =~ "ab"
-}
-test_ok(a.size == 0)
-
-test_check "assignment"
-a = nil
-test_ok(defined?(a))
-test_ok(a == nil)
-
-# multiple asignment
-a, b = 1, 2
-test_ok(a == 1 && b == 2)
-
-a, b = b, a
-test_ok(a == 2 && b == 1)
-
-a, = 1,2
-test_ok(a == 1)
-
-a, *b = 1, 2, 3
-test_ok(a == 1 && b == [2, 3])
-
-a, (b, c), d = 1, [2, 3], 4
-test_ok(a == 1 && b == 2 && c == 3 && d == 4)
-
-*a = 1, 2, 3
-test_ok(a == [1, 2, 3])
-
-*a = 4
-test_ok(a == [4])
-
-*a = nil
-test_ok(a == [nil])
-
-test_check "call"
-def aaa(a, b=100, *rest)
- res = [a, b]
- res += rest if rest
- return res
-end
-
-# not enough argument
-begin
- aaa() # need at least 1 arg
- test_ok(false)
-rescue
- test_ok(true)
-end
-
-begin
- aaa # no arg given (exception raised)
- test_ok(false)
-rescue
- test_ok(true)
-end
-
-test_ok(aaa(1) == [1, 100])
-test_ok(aaa(1, 2) == [1, 2])
-test_ok(aaa(1, 2, 3, 4) == [1, 2, 3, 4])
-test_ok(aaa(1, *[2, 3, 4]) == [1, 2, 3, 4])
-
-test_check "proc"
-$proc = Proc.new{|i| i}
-test_ok($proc.call(2) == 2)
-test_ok($proc.call(3) == 3)
-
-$proc = Proc.new{|i| i*2}
-test_ok($proc.call(2) == 4)
-test_ok($proc.call(3) == 6)
-
-Proc.new{
- iii=5 # nested local variable
- $proc = Proc.new{|i|
- iii = i
- }
- $proc2 = Proc.new {
- $x = iii # nested variables shared by procs
- }
- # scope of nested variables
- test_ok(defined?(iii))
-}.call
-test_ok(!defined?(iii)) # out of scope
-
-loop{iii=5; test_ok(eval("defined? iii")); break}
-loop {
- iii = 10
- def dyna_var_check
- loop {
- test_ok(!defined?(iii))
- break
- }
- end
- dyna_var_check
- break
-}
-$x=0
-$proc.call(5)
-$proc2.call
-test_ok($x == 5)
-
-if defined? Process.kill
- test_check "signal"
-
- $x = 0
- trap "SIGINT", Proc.new{|sig| $x = 2}
- Process.kill "SIGINT", $$
- 100.times {
- sleep 0.1
- break if $x != 0
- }
- test_ok($x == 2)
-
- trap "SIGINT", Proc.new{raise "Interrupt"}
-
- x = false
- begin
- Process.kill "SIGINT", $$
- sleep 0.1
- rescue
- x = $!
- end
- test_ok(x && /Interrupt/ =~ x.message)
-end
-
-test_check "eval"
-test_ok(eval("") == nil)
-$bad=false
-eval 'while false; $bad = true; print "foo\n" end'
-test_ok(!$bad)
-
-test_ok(eval('Object'))
-test_ok(eval('true'))
-test_ok(!eval('nil'))
-test_ok(!eval('false'))
-
-$foo = 'test_ok(true)'
-begin
- eval $foo
-rescue
- test_ok(false)
-end
-
-test_ok(eval("$foo") == 'test_ok(true)')
-test_ok(eval("true") == true)
-i = 5
-test_ok(eval("i == 5"))
-test_ok(eval("i") == 5)
-test_ok(eval("defined? i"))
-
-# eval with binding
-def test_ev
- local1 = "local1"
- lambda {
- local2 = "local2"
- return binding
- }.call
-end
-
-$x = test_ev
-test_ok(eval("local1", $x) == "local1") # normal local var
-test_ok(eval("local2", $x) == "local2") # nested local var
-$bad = true
-begin
- p eval("local1")
-rescue NameError # must raise error
- $bad = false
-end
-test_ok(!$bad)
-
-module EvTest
- EVTEST1 = 25
- evtest2 = 125
- $x = binding
-end
-test_ok(eval("EVTEST1", $x) == 25) # constant in module
-test_ok(eval("evtest2", $x) == 125) # local var in module
-$bad = true
-begin
- eval("EVTEST1")
-rescue NameError # must raise error
- $bad = false
-end
-test_ok(!$bad)
-
-x = binding #! YARV Limitation: Proc.new{}
-eval "i4 = 1", x
-test_ok(eval("i4", x) == 1)
-x = Proc.new{binding}.call #! YARV Limitation: Proc.new{Proc.new{}}.call
-eval "i4 = 22", x
-test_ok(eval("i4", x) == 22)
-$x = []
-x = Proc.new{binding}.call #! YARV Limitation: Proc.new{Proc.new{}}.call
-eval "(0..9).each{|i5| $x[i5] = Proc.new{i5*2}}", x
-test_ok($x[4].call == 8)
-
-x = binding
-eval "i = 1", x
-test_ok(eval("i", x) == 1)
-x = Proc.new{binding}.call
-eval "i = 22", x
-test_ok(eval("i", x) == 22)
-$x = []
-x = Proc.new{binding}.call
-eval "(0..9).each{|i5| $x[i5] = Proc.new{i5*2}}", x
-test_ok($x[4].call == 8)
-x = Proc.new{binding}.call
-eval "for i6 in 1..1; j6=i6; end", x
-test_ok(eval("defined? i6", x))
-test_ok(eval("defined? j6", x))
-
-Proc.new {
- p = binding
- eval "foo11 = 1", p
- foo22 = 5
- Proc.new{foo11=22}.call
- Proc.new{foo22=55}.call
- test_ok(eval("foo11", p) == eval("foo11"))
- test_ok(eval("foo11") == 1)
- test_ok(eval("foo22", p) == eval("foo22"))
- test_ok(eval("foo22") == 55)
-}.call if false #! YARV Limitation
-
-#! YARV Limitation: p1 = Proc.new{i7 = 0; Proc.new{i7}}.call
-p1 = Proc.new{i7 = 0; binding}.call
-#! YARV Limitation: test_ok(p1.call == 0)
-eval "i7=5", p1
-#! YARV Limitation: test_ok(p1.call == 5)
-test_ok(!defined?(i7))
-
-if false #! YARV Limitation
-p1 = Proc.new{i7 = 0; Proc.new{i7}}.call
-i7 = nil
-test_ok(p1.call == 0)
-eval "i7=1", p1
-test_ok(p1.call == 1)
-eval "i7=5", p1
-test_ok(p1.call == 5)
-test_ok(i7 == nil)
-end
-
-test_check "system"
-test_ok(`echo foobar` == "foobar\n")
-test_ok(`./miniruby -e 'print "foobar"'` == 'foobar')
-
-script_tmp = "script_tmp.#{$$}"
-tmp = open(script_tmp, "w")
-tmp.print "print $zzz\n";
-tmp.close
-
-test_ok(`./miniruby -s #{script_tmp} -zzz` == 'true')
-test_ok(`./miniruby -s #{script_tmp} -zzz=555` == '555')
-
-tmp = open(script_tmp, "w")
-tmp.print "#! /usr/local/bin/ruby -s\n";
-tmp.print "print $zzz\n";
-tmp.close
-
-test_ok(`./miniruby #{script_tmp} -zzz=678` == '678')
-
-tmp = open(script_tmp, "w")
-tmp.print "this is a leading junk\n";
-tmp.print "#! /usr/local/bin/ruby -s\n";
-tmp.print "print $zzz\n";
-tmp.print "__END__\n";
-tmp.print "this is a trailing junk\n";
-tmp.close
-
-test_ok(`./miniruby -x #{script_tmp}` == '')
-test_ok(`./miniruby -x #{script_tmp} -zzz=555` == '555')
-
-tmp = open(script_tmp, "w")
-for i in 1..5
- tmp.print i, "\n"
-end
-tmp.close
-
-`./miniruby -i.bak -pe '$_.sub!(/^[0-9]+$/){$&.to_i * 5}' #{script_tmp}`
-done = true
-tmp = open(script_tmp, "r")
-while tmp.gets
- if $_.to_i % 5 != 0
- done = false
- break
- end
-end
-tmp.close
-test_ok(done)
-
-File.unlink script_tmp or `/bin/rm -f "#{script_tmp}"`
-File.unlink "#{script_tmp}.bak" or `/bin/rm -f "#{script_tmp}.bak"`
-
-test_check "const"
-TEST1 = 1
-TEST2 = 2
-
-module Const
- TEST3 = 3
- TEST4 = 4
-end
-
-module Const2
- TEST3 = 6
- TEST4 = 8
-end
-
-include Const
-
-test_ok([TEST1,TEST2,TEST3,TEST4] == [1,2,3,4])
-
-include Const2
-STDERR.print "intentionally redefines TEST3, TEST4\n" if $VERBOSE
-test_ok([TEST1,TEST2,TEST3,TEST4] == [1,2,6,8])
-
-
-test_ok((String <=> Object) == -1)
-test_ok((Object <=> String) == 1)
-test_ok((Array <=> String) == nil)
-
-test_check "clone"
-foo = Object.new
-def foo.test
- "test"
-end
-bar = foo.clone
-def bar.test2
- "test2"
-end
-
-test_ok(bar.test2 == "test2")
-test_ok(bar.test == "test")
-test_ok(foo.test == "test")
-
-begin
- foo.test2
- test_ok false
-rescue NoMethodError
- test_ok true
-end
-
-module M001; end
-module M002; end
-module M003; include M002; end
-module M002; include M001; end
-module M003; include M002; end
-
-test_ok(M003.ancestors == [M003, M002, M001])
-
-test_check "marshal"
-$x = [1,2,3,[4,5,"foo"],{1=>"bar"},2.5,fact(30)]
-$y = Marshal.dump($x)
-test_ok($x == Marshal.load($y))
-
-StrClone=String.clone;
-test_ok(Marshal.load(Marshal.dump(StrClone.new("abc"))).class == StrClone)
-
-[[1,2,3,4], [81, 2, 118, 3146]].each { |w,x,y,z|
- a = (x.to_f + y.to_f / z.to_f) * Math.exp(w.to_f / (x.to_f + y.to_f / z.to_f))
- ma = Marshal.dump(a)
- b = Marshal.load(ma)
- test_ok(a == b)
-}
-
-test_check "pack"
-
-$format = "c2x5CCxsdils_l_a6";
-# Need the expression in here to force ary[5] to be numeric. This avoids
-# test2 failing because ary2 goes str->numeric->str and ary does not.
-ary = [1,-100,127,128,32767,987.654321098 / 100.0,12345,123456,-32767,-123456,"abcdef"]
-$x = ary.pack($format)
-ary2 = $x.unpack($format)
-
-test_ok(ary.length == ary2.length)
-test_ok(ary.join(':') == ary2.join(':'))
-test_ok($x =~ /def/)
-
-$x = [-1073741825]
-test_ok($x.pack("q").unpack("q") == $x)
-
-test_check "math"
-test_ok(Math.sqrt(4) == 2)
-
-include Math
-test_ok(sqrt(4) == 2)
-
-test_check "struct"
-struct_test = Struct.new("Test", :foo, :bar)
-test_ok(struct_test == Struct::Test)
-
-test = struct_test.new(1, 2)
-test_ok(test.foo == 1 && test.bar == 2)
-test_ok(test[0] == 1 && test[1] == 2)
-
-a, b = test.to_a
-test_ok(a == 1 && b == 2)
-
-test[0] = 22
-test_ok(test.foo == 22)
-
-test.bar = 47
-test_ok(test.bar == 47)
-
-test_check "variable"
-test_ok($$.instance_of?(Integer))
-
-# read-only variable
-begin
- $$ = 5
- test_ok false
-rescue NameError
- test_ok true
-end
-
-foobar = "foobar"
-$_ = foobar
-test_ok($_ == foobar)
-
-class Gods
- @@rule = "Uranus" # private to Gods
- def ruler0
- @@rule
- end
-
- def self.ruler1 # <= per method definition style
- @@rule
- end
- class << self # <= multiple method definition style
- def ruler2
- @@rule
- end
- end
-end
-
-module Olympians
- @@rule ="Zeus"
- def ruler3
- @@rule
- end
-end
-
-class Titans < Gods
- @@rule = "Cronus" # do not affect @@rule in Gods
- include Olympians
- def ruler4
- @@rule
- end
-end
-
-test_ok(Gods.new.ruler0 == "Cronus")
-test_ok(Gods.ruler1 == "Cronus")
-test_ok(Gods.ruler2 == "Cronus")
-test_ok(Titans.ruler1 == "Cronus")
-test_ok(Titans.ruler2 == "Cronus")
-atlas = Titans.new
-test_ok(atlas.ruler0 == "Cronus")
-test_ok(atlas.ruler3 == "Zeus")
-test_ok(atlas.ruler4 == "Cronus")
-
-test_check "trace"
-$x = 1234
-$y = 0
-trace_var :$x, Proc.new{$y = $x}
-$x = 40414
-test_ok($y == $x)
-
-untrace_var :$x
-$x = 19660208
-test_ok($y != $x)
-
-trace_var :$x, Proc.new{$x *= 2}
-$x = 5
-test_ok($x == 10)
-
-untrace_var :$x
-
-test_check "defined?"
-
-test_ok(defined?($x)) # global variable
-test_ok(defined?($x) == 'global-variable')# returns description
-
-foo=5
-test_ok(defined?(foo)) # local variable
-
-test_ok(defined?(Array)) # constant
-test_ok(defined?(Object.new)) # method
-test_ok(!defined?(Object.print))# private method
-test_ok(defined?(1 == 2)) # operator expression
-
-class Foo
- def foo
- p :foo
- end
- protected :foo
- def bar(f)
- test_ok(defined?(self.foo))
- test_ok(defined?(f.foo))
- end
-end
-f = Foo.new
-test_ok(defined?(f.foo) == nil)
-f.bar(f)
-
-def defined_test
- return !defined?(yield)
-end
-
-test_ok(defined_test) # not iterator
-test_ok(!defined_test{}) # called as iterator
-
-test_check "alias"
-class Alias0
- def foo; "foo" end
-end
-class Alias1 < Alias0
- alias bar foo
- def foo; "foo+" + super end
-end
-class Alias2 < Alias1
- alias baz foo
- undef foo
-end
-
-x = Alias2.new
-test_ok(x.bar == "foo")
-test_ok(x.baz == "foo+foo")
-
-# test_check for cache
-test_ok(x.baz == "foo+foo")
-
-class Alias3 < Alias2
- def foo
- defined? super
- end
- def bar
- defined? super
- end
- def quux
- defined? super
- end
-end
-x = Alias3.new
-test_ok(!x.foo)
-test_ok(x.bar)
-test_ok(!x.quux)
-
-test_check "path"
-test_ok(File.basename("a") == "a")
-test_ok(File.basename("a/b") == "b")
-test_ok(File.basename("a/b/") == "b")
-test_ok(File.basename("/") == "/")
-test_ok(File.basename("//") == "/")
-test_ok(File.basename("///") == "/")
-test_ok(File.basename("a/b////") == "b")
-test_ok(File.basename("a.rb", ".rb") == "a")
-test_ok(File.basename("a.rb///", ".rb") == "a")
-test_ok(File.basename("a.rb///", ".*") == "a")
-test_ok(File.basename("a.rb///", ".c") == "a.rb")
-test_ok(File.dirname("a") == ".")
-test_ok(File.dirname("/") == "/")
-test_ok(File.dirname("/a") == "/")
-test_ok(File.dirname("a/b") == "a")
-test_ok(File.dirname("a/b/c") == "a/b")
-test_ok(File.dirname("/a/b/c") == "/a/b")
-test_ok(File.dirname("/a/b/") == "/a")
-test_ok(File.dirname("/a/b///") == "/a")
-case Dir.pwd
-when %r'\A\w:'
- test_ok(/\A\w:\/\z/ =~ File.expand_path(".", "/"))
- test_ok(/\A\w:\/a\z/ =~ File.expand_path("a", "/"))
- dosish = true
-when %r'\A//'
- test_ok(%r'\A//[^/]+/[^/]+\z' =~ File.expand_path(".", "/"))
- test_ok(%r'\A//[^/]+/[^/]+/a\z' =~ File.expand_path(".", "/"))
- dosish = true
-else
- test_ok(File.expand_path(".", "/") == "/")
- test_ok(File.expand_path("sub", "/") == "/sub")
-end
-if dosish
- test_ok(File.expand_path("/", "//machine/share/sub") == "//machine/share")
- test_ok(File.expand_path("/dir", "//machine/share/sub") == "//machine/share/dir")
- test_ok(File.expand_path("/", "z:/sub") == "z:/")
- test_ok(File.expand_path("/dir", "z:/sub") == "z:/dir")
-end
-test_ok(File.expand_path(".", "//") == "//")
-test_ok(File.expand_path("sub", "//") == "//sub")
-
-# test_check "Proc#binding"
-ObjectSpace.each_object(Proc){|o|
- begin
- b = o.binding
- eval 'self', b
- rescue ArgumentError
- end
-}
-
-test_check "gc"
-begin
- 1.upto(10000) {
- tmp = [0,1,2,3,4,5,6,7,8,9]
- }
- tmp = nil
- test_ok true
-rescue
- test_ok false
-end
-class S
- def initialize(a)
- @a = a
- end
-end
-l=nil
-100000.times {
- l = S.new(l)
-}
-GC.start
-test_ok true # reach here or dumps core
-l = []
-100000.times {
- l.push([l])
-}
-GC.start
-test_ok true # reach here or dumps core
-
-ObjectSpace.each_object{|o|
- o.class.name
-}
-
-test_ok true # reach here or dumps core
-
-PROGRESS.finish
-if $failed > 0
- printf "not ok/test: %d failed %d\n", $ntest, $failed
-else
- printf "end of test(test: %d)\n", $ntest
-end
diff --git a/benchmark/README.md b/benchmark/README.md
deleted file mode 100644
index 24a2669143..0000000000
--- a/benchmark/README.md
+++ /dev/null
@@ -1,72 +0,0 @@
-# ruby/benchmark
-
-This directory has benchmark definitions to be run with
-[benchmark\_driver.gem](https://github.com/benchmark-driver/benchmark-driver).
-
-## Normal usage
-
-Execute `gem install benchmark_driver` and run a command like:
-
-```bash
-# Run a benchmark script with the ruby in the $PATH
-benchmark-driver benchmark/app_fib.rb
-
-# Run benchmark scripts with multiple Ruby executables or options
-benchmark-driver benchmark/*.rb -e /path/to/ruby -e '/path/to/ruby --jit'
-
-# Or compare Ruby versions managed by rbenv
-benchmark-driver benchmark/*.rb --rbenv '2.5.1;2.6.0-preview2 --jit'
-
-# You can collect many metrics in many ways
-benchmark-driver benchmark/*.rb --runner memory --output markdown
-
-# Some are defined with YAML for complex setup or accurate measurement
-benchmark-driver benchmark/*.yml
-```
-
-See also:
-
-```console
-Usage: benchmark-driver [options] RUBY|YAML...
- -r, --runner TYPE Specify runner type: ips, time, memory, once (default: ips)
- -o, --output TYPE Specify output type: compare, simple, markdown, record (default: compare)
- -e, --executables EXECS Ruby executables (e1::path1 arg1; e2::path2 arg2;...)
- --rbenv VERSIONS Ruby executables in rbenv (x.x.x arg1;y.y.y arg2;...)
- --repeat-count NUM Try benchmark NUM times and use the fastest result or the worst memory usage
- --repeat-result TYPE Yield "best", "average" or "worst" result with --repeat-count (default: best)
- --bundler Install and use gems specified in Gemfile
- --filter REGEXP Filter out benchmarks with given regexp
- --run-duration SECONDS Warmup estimates loop_count to run for this duration (default: 3)
- -v, --verbose Verbose mode. Multiple -v options increase visilibity (max: 2)
-```
-
-## make benchmark
-
-Using `make benchmark`, `make update-benchmark-driver` automatically downloads
-the supported version of benchmark\_driver, and it runs benchmarks with the downloaded
-benchmark\_driver.
-
-```bash
-# Run all benchmarks with the ruby in the $PATH and the built ruby
-make benchmark
-
-# Or compare with specific ruby binary
-make benchmark COMPARE_RUBY="/path/to/ruby --jit"
-
-# Run vm1 benchmarks
-make benchmark ITEM=vm1
-
-# Run some limited benchmarks in ITEM-matched files
-make benchmark ITEM=vm1 OPTS=--filter=block
-
-# You can specify the benchmark by an exact filename instead of using the default argument:
-# ARGS = $$(find $(srcdir)/benchmark -maxdepth 1 -name '*$(ITEM)*.yml' -o -name '*$(ITEM)*.rb')
-make benchmark ARGS=../benchmark/erb_render.yml
-
-# You can specify any option via $OPTS
-make benchmark OPTS="--help"
-
-# With `make benchmark`, some special runner plugins are available:
-# -r peak, -r size, -r total, -r utime, -r stime, -r cutime, -r cstime
-make benchmark ITEM=vm2_bigarray OPTS="-r peak"
-```
diff --git a/benchmark/app_erb.yml b/benchmark/app_erb.yml
deleted file mode 100644
index 31e29b7644..0000000000
--- a/benchmark/app_erb.yml
+++ /dev/null
@@ -1,23 +0,0 @@
-#
-# Create many HTML strings with ERB.
-#
-prelude: |
- require 'erb'
-
- data = <<erb
- <html>
- <head> <%= title %> </head>
- <body>
- <h1> <%= title %> </h1>
- <p>
- <%= content %>
- </p>
- </body>
- </html>
- erb
-
- title = "hello world!"
- content = "hello world!\n" * 10
-benchmark:
- app_erb: ERB.new(data).result(binding)
-loop_count: 15000
diff --git a/benchmark/app_pentomino.rb b/benchmark/app_pentomino.rb
deleted file mode 100644
index 47be7b203f..0000000000
--- a/benchmark/app_pentomino.rb
+++ /dev/null
@@ -1,130 +0,0 @@
-#!/usr/local/bin/ruby
-# This program is contributed by Shin Nishiyama
-
-
-# modified by K.Sasada
-
-NP = 5
-ROW = 8 + NP
-COL = 8
-
-$p = []
-$b = []
-$no = 0
-
-def piece(n, a, nb)
- nb.each{|x|
- a[n] = x
- if n == NP-1
- $p << [a.sort]
- else
- nbc=nb.dup
- [-ROW, -1, 1, ROW].each{|d|
- if x+d > 0 and not a.include?(x+d) and not nbc.include?(x+d)
- nbc << x+d
- end
- }
- nbc.delete x
- piece(n+1,a[0..n],nbc)
- end
- }
-end
-
-def kikaku(a)
- a.collect {|x| x - a[0]}
-end
-def ud(a)
- kikaku(a.collect {|x| ((x+NP)%ROW)-ROW*((x+NP)/ROW) }.sort)
-end
-def rl(a)
- kikaku(a.collect {|x| ROW*((x+NP)/ROW)+ROW-((x+NP)%ROW)}.sort)
-end
-def xy(a)
- kikaku(a.collect {|x| ROW*((x+NP)%ROW) + (x+NP)/ROW }.sort)
-end
-
-def mkpieces
- piece(0,[],[0])
- $p.each do |a|
- a0 = a[0]
- a[1] = ud(a0)
- a[2] = rl(a0)
- a[3] = ud(rl(a0))
- a[4] = xy(a0)
- a[5] = ud(xy(a0))
- a[6] = rl(xy(a0))
- a[7] = ud(rl(xy(a0)))
- a.sort!
- a.uniq!
- end
- $p.uniq!.sort! {|x,y| x[0] <=> y[0] }
-end
-
-def mkboard
- (0...ROW*COL).each{|i|
- if i % ROW >= ROW-NP
- $b[i] = -2
- else
- $b[i] = -1
- end
- $b[3*ROW+3]=$b[3*ROW+4]=$b[4*ROW+3]=$b[4*ROW+4]=-2
- }
-end
-
-def pboard
- return # skip print
- print "No. #$no\n"
- (0...COL).each{|i|
- print "|"
- (0...ROW-NP).each{|j|
- x = $b[i*ROW+j]
- if x < 0
- print "..|"
- else
- printf "%2d|",x+1
- end
- }
- print "\n"
- }
- print "\n"
-end
-
-$pnum=[]
-def setpiece(a,pos)
- if a.length == $p.length then
- $no += 1
- pboard
- return
- end
- while $b[pos] != -1
- pos += 1
- end
- ($pnum - a).each do |i|
- $p[i].each do |x|
- f = 0
- x.each{|s|
- if $b[pos+s] != -1
- f=1
- break
- end
- }
- if f == 0 then
- x.each{|s|
- $b[pos+s] = i
- }
- a << i
- setpiece(a.dup, pos)
- a.pop
- x.each{|s|
- $b[pos+s] = -1
- }
- end
- end
- end
-end
-
-mkpieces
-mkboard
-$p[4] = [$p[4][0]]
-$pnum = (0...$p.length).to_a
-setpiece([],0)
diff --git a/benchmark/array_sample_100k_10.rb b/benchmark/array_sample_100k_10.rb
deleted file mode 100644
index 5f41ecc32b..0000000000
--- a/benchmark/array_sample_100k_10.rb
+++ /dev/null
@@ -1,2 +0,0 @@
-arr = [*0...100000]
-10_000.times {arr.sample 10}
diff --git a/benchmark/array_sample_100k_11.rb b/benchmark/array_sample_100k_11.rb
deleted file mode 100644
index 18b1715319..0000000000
--- a/benchmark/array_sample_100k_11.rb
+++ /dev/null
@@ -1,2 +0,0 @@
-arr = [*0...100000]
-10_000.times {arr.sample 11}
diff --git a/benchmark/array_sample_100k__100.rb b/benchmark/array_sample_100k__100.rb
deleted file mode 100644
index 22863afe89..0000000000
--- a/benchmark/array_sample_100k__100.rb
+++ /dev/null
@@ -1,2 +0,0 @@
-arr = [*0...100000]
-10_000.times {arr.sample 100}
diff --git a/benchmark/array_sample_100k__1k.rb b/benchmark/array_sample_100k__1k.rb
deleted file mode 100644
index 4cd79e6c67..0000000000
--- a/benchmark/array_sample_100k__1k.rb
+++ /dev/null
@@ -1,2 +0,0 @@
-arr = [*0...100000]
-10_000.times {arr.sample 1000}
diff --git a/benchmark/array_sample_100k__6k.rb b/benchmark/array_sample_100k__6k.rb
deleted file mode 100644
index b3d264249e..0000000000
--- a/benchmark/array_sample_100k__6k.rb
+++ /dev/null
@@ -1,2 +0,0 @@
-arr = [*0...100000]
-10_000.times {arr.sample 6000}
diff --git a/benchmark/array_sample_100k___10k.rb b/benchmark/array_sample_100k___10k.rb
deleted file mode 100644
index 5dd55ec058..0000000000
--- a/benchmark/array_sample_100k___10k.rb
+++ /dev/null
@@ -1,2 +0,0 @@
-arr = [*0...100000]
-10_000.times {arr.sample 10_000}
diff --git a/benchmark/array_sample_100k___50k.rb b/benchmark/array_sample_100k___50k.rb
deleted file mode 100644
index 1506732c3c..0000000000
--- a/benchmark/array_sample_100k___50k.rb
+++ /dev/null
@@ -1,2 +0,0 @@
-arr = [*0...100000]
-10_000.times {arr.sample 50_000}
diff --git a/benchmark/array_small_and.rb b/benchmark/array_small_and.rb
deleted file mode 100644
index e53a6edae6..0000000000
--- a/benchmark/array_small_and.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-MIN_SIZE = ENV.fetch('SMALL_ARRAY_MIN', 0).to_i
-MAX_SIZE = ENV.fetch('SMALL_ARRAY_MAX', 16).to_i
-ITERATIONS = ENV.fetch('SMALL_ARRAY_ITERATIONS', 100).to_i
-
-ARRAYS = (MIN_SIZE..MAX_SIZE).map do |size1|
- (MIN_SIZE..MAX_SIZE).map do |size2|
- [Array.new(size1) { rand(MAX_SIZE) }, Array.new(size2) { rand(MAX_SIZE) }]
- end
-end
-
-ITERATIONS.times do
- ARRAYS.each do |group|
- group.each do |arr1, arr2|
- arr1 & arr2
- end
- end
-end
diff --git a/benchmark/array_small_diff.rb b/benchmark/array_small_diff.rb
deleted file mode 100644
index 9661ee48db..0000000000
--- a/benchmark/array_small_diff.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-MIN_SIZE = ENV.fetch('SMALL_ARRAY_MIN', 0).to_i
-MAX_SIZE = ENV.fetch('SMALL_ARRAY_MAX', 16).to_i
-ITERATIONS = ENV.fetch('SMALL_ARRAY_ITERATIONS', 100).to_i
-
-ARRAYS = (MIN_SIZE..MAX_SIZE).map do |size1|
- (MIN_SIZE..MAX_SIZE).map do |size2|
- [Array.new(size1) { rand(MAX_SIZE) }, Array.new(size2) { rand(MAX_SIZE) }]
- end
-end
-
-ITERATIONS.times do
- ARRAYS.each do |group|
- group.each do |arr1, arr2|
- arr1 - arr2
- end
- end
-end
diff --git a/benchmark/array_small_or.rb b/benchmark/array_small_or.rb
deleted file mode 100644
index c58b5fd1ff..0000000000
--- a/benchmark/array_small_or.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-MIN_SIZE = ENV.fetch('SMALL_ARRAY_MIN', 0).to_i
-MAX_SIZE = ENV.fetch('SMALL_ARRAY_MAX', 16).to_i
-ITERATIONS = ENV.fetch('SMALL_ARRAY_ITERATIONS', 100).to_i
-
-ARRAYS = (MIN_SIZE..MAX_SIZE).map do |size1|
- (MIN_SIZE..MAX_SIZE).map do |size2|
- [Array.new(size1) { rand(MAX_SIZE) }, Array.new(size2) { rand(MAX_SIZE) }]
- end
-end
-
-ITERATIONS.times do
- ARRAYS.each do |group|
- group.each do |arr1, arr2|
- arr1 | arr2
- end
- end
-end
diff --git a/benchmark/array_sort_block.rb b/benchmark/array_sort_block.rb
deleted file mode 100644
index 3579786056..0000000000
--- a/benchmark/array_sort_block.rb
+++ /dev/null
@@ -1,2 +0,0 @@
-ary = Array.new(1000) { rand(1000) }
-10000.times { ary.sort { |a, b| a <=> b } }
diff --git a/benchmark/array_sort_float.rb b/benchmark/array_sort_float.rb
deleted file mode 100644
index 9a6e2f8bd2..0000000000
--- a/benchmark/array_sort_float.rb
+++ /dev/null
@@ -1,2 +0,0 @@
-arr = Array.new(1000) { rand }
-10000.times { arr.sort }
diff --git a/benchmark/array_values_at_int.rb b/benchmark/array_values_at_int.rb
deleted file mode 100644
index 6cb394cb9f..0000000000
--- a/benchmark/array_values_at_int.rb
+++ /dev/null
@@ -1,2 +0,0 @@
-ary = Array.new(10000) {|i| i}
-100000.times { ary.values_at(500) }
diff --git a/benchmark/array_values_at_range.rb b/benchmark/array_values_at_range.rb
deleted file mode 100644
index 5b53806d1c..0000000000
--- a/benchmark/array_values_at_range.rb
+++ /dev/null
@@ -1,2 +0,0 @@
-ary = Array.new(10000) {|i| i}
-100000.times { ary.values_at(1..2000) }
diff --git a/benchmark/bighash.rb b/benchmark/bighash.rb
deleted file mode 100644
index e2ad5a5c94..0000000000
--- a/benchmark/bighash.rb
+++ /dev/null
@@ -1 +0,0 @@
-h = {}; 5000000.times {|n| h[n] = n }
diff --git a/benchmark/app_answer.rb b/benchmark/bm_app_answer.rb
index 3cd8a8fd37..3cd8a8fd37 100644
--- a/benchmark/app_answer.rb
+++ b/benchmark/bm_app_answer.rb
diff --git a/benchmark/app_aobench.rb b/benchmark/bm_app_aobench.rb
index 2bd6acfaf8..2bd6acfaf8 100644
--- a/benchmark/app_aobench.rb
+++ b/benchmark/bm_app_aobench.rb
diff --git a/benchmark/bm_app_erb.rb b/benchmark/bm_app_erb.rb
new file mode 100644
index 0000000000..77c66a7949
--- /dev/null
+++ b/benchmark/bm_app_erb.rb
@@ -0,0 +1,26 @@
+#
+# Create many HTML strings with ERB.
+#
+
+require 'erb'
+
+data = DATA.read
+max = 15_000
+title = "hello world!"
+content = "hello world!\n" * 10
+
+max.times{
+ ERB.new(data).result(binding)
+}
+
+__END__
+
+<html>
+ <head> <%= title %> </head>
+ <body>
+ <h1> <%= title %> </h1>
+ <p>
+ <%= content %>
+ </p>
+ </body>
+</html>
diff --git a/benchmark/app_factorial.rb b/benchmark/bm_app_factorial.rb
index 45f471dfdb..45f471dfdb 100644
--- a/benchmark/app_factorial.rb
+++ b/benchmark/bm_app_factorial.rb
diff --git a/benchmark/app_fib.rb b/benchmark/bm_app_fib.rb
index 34a7b2e725..34a7b2e725 100644
--- a/benchmark/app_fib.rb
+++ b/benchmark/bm_app_fib.rb
diff --git a/benchmark/app_lc_fizzbuzz.rb b/benchmark/bm_app_lc_fizzbuzz.rb
index f09574bbeb..f09574bbeb 100644
--- a/benchmark/app_lc_fizzbuzz.rb
+++ b/benchmark/bm_app_lc_fizzbuzz.rb
diff --git a/benchmark/app_mandelbrot.rb b/benchmark/bm_app_mandelbrot.rb
index 801b75e8e2..801b75e8e2 100644
--- a/benchmark/app_mandelbrot.rb
+++ b/benchmark/bm_app_mandelbrot.rb
diff --git a/benchmark/bm_app_pentomino.rb b/benchmark/bm_app_pentomino.rb
new file mode 100644
index 0000000000..59c63f358e
--- /dev/null
+++ b/benchmark/bm_app_pentomino.rb
@@ -0,0 +1,259 @@
+#!/usr/local/bin/ruby
+# This program is contributed by Shin Nishiyama
+
+
+# modified by K.Sasada
+
+NP = 5
+ROW = 8 + NP
+COL = 8
+
+$p = []
+$b = []
+$no = 0
+
+def piece(n, a, nb)
+ nb.each{|x|
+ a[n] = x
+ if n == NP-1
+ $p << [a.sort]
+ else
+ nbc=nb.dup
+ [-ROW, -1, 1, ROW].each{|d|
+ if x+d > 0 and not a.include?(x+d) and not nbc.include?(x+d)
+ nbc << x+d
+ end
+ }
+ nbc.delete x
+ piece(n+1,a[0..n],nbc)
+ end
+ }
+end
+
+def kikaku(a)
+ a.collect {|x| x - a[0]}
+end
+def ud(a)
+ kikaku(a.collect {|x| ((x+NP)%ROW)-ROW*((x+NP)/ROW) }.sort)
+end
+def rl(a)
+ kikaku(a.collect {|x| ROW*((x+NP)/ROW)+ROW-((x+NP)%ROW)}.sort)
+end
+def xy(a)
+ kikaku(a.collect {|x| ROW*((x+NP)%ROW) + (x+NP)/ROW }.sort)
+end
+
+def mkpieces
+ piece(0,[],[0])
+ $p.each do |a|
+ a0 = a[0]
+ a[1] = ud(a0)
+ a[2] = rl(a0)
+ a[3] = ud(rl(a0))
+ a[4] = xy(a0)
+ a[5] = ud(xy(a0))
+ a[6] = rl(xy(a0))
+ a[7] = ud(rl(xy(a0)))
+ a.sort!
+ a.uniq!
+ end
+ $p.uniq!.sort! {|x,y| x[0] <=> y[0] }
+end
+
+def mkboard
+ (0...ROW*COL).each{|i|
+ if i % ROW >= ROW-NP
+ $b[i] = -2
+ else
+ $b[i] = -1
+ end
+ $b[3*ROW+3]=$b[3*ROW+4]=$b[4*ROW+3]=$b[4*ROW+4]=-2
+ }
+end
+
+def pboard
+ return # skip print
+ print "No. #$no\n"
+ (0...COL).each{|i|
+ print "|"
+ (0...ROW-NP).each{|j|
+ x = $b[i*ROW+j]
+ if x < 0
+ print "..|"
+ else
+ printf "%2d|",x+1
+ end
+ }
+ print "\n"
+ }
+ print "\n"
+end
+
+$pnum=[]
+def setpiece(a,pos)
+ if a.length == $p.length then
+ $no += 1
+ pboard
+ return
+ end
+ while $b[pos] != -1
+ pos += 1
+ end
+ ($pnum - a).each do |i|
+ $p[i].each do |x|
+ f = 0
+ x.each{|s|
+ if $b[pos+s] != -1
+ f=1
+ break
+ end
+ }
+ if f == 0 then
+ x.each{|s|
+ $b[pos+s] = i
+ }
+ a << i
+ setpiece(a.dup, pos)
+ a.pop
+ x.each{|s|
+ $b[pos+s] = -1
+ }
+ end
+ end
+ end
+end
+
+mkpieces
+mkboard
+$p[4] = [$p[4][0]]
+$pnum = (0...$p.length).to_a
+setpiece([],0)
+
+
+__END__
+
+# original
+
+NP = 5
+ROW = 8 + NP
+COL = 8
+
+$p = []
+$b = []
+$no = 0
+
+def piece(n,a,nb)
+ for x in nb
+ a[n] = x
+ if n == NP-1
+ $p << [a.sort]
+ else
+ nbc=nb.dup
+ for d in [-ROW, -1, 1, ROW]
+ if x+d > 0 and not a.include?(x+d) and not nbc.include?(x+d)
+ nbc << x+d
+ end
+ end
+ nbc.delete x
+ piece(n+1,a[0..n],nbc)
+ end
+ end
+end
+
+def kikaku(a)
+ a.collect {|x| x - a[0]}
+end
+def ud(a)
+ kikaku(a.collect {|x| ((x+NP)%ROW)-ROW*((x+NP)/ROW) }.sort)
+end
+def rl(a)
+ kikaku(a.collect {|x| ROW*((x+NP)/ROW)+ROW-((x+NP)%ROW)}.sort)
+end
+def xy(a)
+ kikaku(a.collect {|x| ROW*((x+NP)%ROW) + (x+NP)/ROW }.sort)
+end
+
+def mkpieces
+ piece(0,[],[0])
+ $p.each do |a|
+ a0 = a[0]
+ a[1] = ud(a0)
+ a[2] = rl(a0)
+ a[3] = ud(rl(a0))
+ a[4] = xy(a0)
+ a[5] = ud(xy(a0))
+ a[6] = rl(xy(a0))
+ a[7] = ud(rl(xy(a0)))
+ a.sort!
+ a.uniq!
+ end
+ $p.uniq!.sort! {|x,y| x[0] <=> y[0] }
+end
+
+def mkboard
+ for i in 0...ROW*COL
+ if i % ROW >= ROW-NP
+ $b[i] = -2
+ else
+ $b[i] = -1
+ end
+ $b[3*ROW+3]=$b[3*ROW+4]=$b[4*ROW+3]=$b[4*ROW+4]=-2
+ end
+end
+
+def pboard
+ print "No. #$no\n"
+ for i in 0...COL
+ print "|"
+ for j in 0...ROW-NP
+ x = $b[i*ROW+j]
+ if x < 0
+ print "..|"
+ else
+ printf "%2d|",x+1
+ end
+ end
+ print "\n"
+ end
+ print "\n"
+end
+
+$pnum=[]
+def setpiece(a,pos)
+ if a.length == $p.length then
+ $no += 1
+ pboard
+ return
+ end
+ while $b[pos] != -1
+ pos += 1
+ end
+ ($pnum - a).each do |i|
+ $p[i].each do |x|
+ f = 0
+ for s in x do
+ if $b[pos+s] != -1
+ f=1
+ break
+ end
+ end
+ if f == 0 then
+ for s in x do
+ $b[pos+s] = i
+ end
+ a << i
+ setpiece(a.dup, pos)
+ a.pop
+ for s in x do
+ $b[pos+s] = -1
+ end
+ end
+ end
+ end
+end
+
+mkpieces
+mkboard
+$p[4] = [$p[4][0]]
+$pnum = (0...$p.length).to_a
+setpiece([],0)
diff --git a/benchmark/app_raise.rb b/benchmark/bm_app_raise.rb
index 5db8f95d50..5db8f95d50 100644
--- a/benchmark/app_raise.rb
+++ b/benchmark/bm_app_raise.rb
diff --git a/benchmark/app_strconcat.rb b/benchmark/bm_app_strconcat.rb
index 7eed7c1aed..7eed7c1aed 100644
--- a/benchmark/app_strconcat.rb
+++ b/benchmark/bm_app_strconcat.rb
diff --git a/benchmark/app_tak.rb b/benchmark/bm_app_tak.rb
index efe5380f4e..efe5380f4e 100644
--- a/benchmark/app_tak.rb
+++ b/benchmark/bm_app_tak.rb
diff --git a/benchmark/app_tarai.rb b/benchmark/bm_app_tarai.rb
index 4c146f5ccf..4c146f5ccf 100644
--- a/benchmark/app_tarai.rb
+++ b/benchmark/bm_app_tarai.rb
diff --git a/benchmark/app_uri.rb b/benchmark/bm_app_uri.rb
index 586edfd5dc..586edfd5dc 100644
--- a/benchmark/app_uri.rb
+++ b/benchmark/bm_app_uri.rb
diff --git a/benchmark/array_shift.rb b/benchmark/bm_array_shift.rb
index 798bb9e3f4..798bb9e3f4 100644
--- a/benchmark/array_shift.rb
+++ b/benchmark/bm_array_shift.rb
diff --git a/benchmark/hash_aref_dsym.rb b/benchmark/bm_hash_aref_dsym.rb
index af4f8c36d4..af4f8c36d4 100644
--- a/benchmark/hash_aref_dsym.rb
+++ b/benchmark/bm_hash_aref_dsym.rb
diff --git a/benchmark/hash_aref_dsym_long.rb b/benchmark/bm_hash_aref_dsym_long.rb
index 9d7759379e..9d7759379e 100644
--- a/benchmark/hash_aref_dsym_long.rb
+++ b/benchmark/bm_hash_aref_dsym_long.rb
diff --git a/benchmark/hash_aref_fix.rb b/benchmark/bm_hash_aref_fix.rb
index 1346890582..1346890582 100644
--- a/benchmark/hash_aref_fix.rb
+++ b/benchmark/bm_hash_aref_fix.rb
diff --git a/benchmark/hash_aref_flo.rb b/benchmark/bm_hash_aref_flo.rb
index 2217274c82..2217274c82 100644
--- a/benchmark/hash_aref_flo.rb
+++ b/benchmark/bm_hash_aref_flo.rb
diff --git a/benchmark/hash_aref_miss.rb b/benchmark/bm_hash_aref_miss.rb
index b0913dd4bb..b0913dd4bb 100644
--- a/benchmark/hash_aref_miss.rb
+++ b/benchmark/bm_hash_aref_miss.rb
diff --git a/benchmark/hash_aref_str.rb b/benchmark/bm_hash_aref_str.rb
index 19439b061b..19439b061b 100644
--- a/benchmark/hash_aref_str.rb
+++ b/benchmark/bm_hash_aref_str.rb
diff --git a/benchmark/hash_aref_sym.rb b/benchmark/bm_hash_aref_sym.rb
index f75d163fe6..f75d163fe6 100644
--- a/benchmark/hash_aref_sym.rb
+++ b/benchmark/bm_hash_aref_sym.rb
diff --git a/benchmark/hash_aref_sym_long.rb b/benchmark/bm_hash_aref_sym_long.rb
index 9dab8df7be..9dab8df7be 100644
--- a/benchmark/hash_aref_sym_long.rb
+++ b/benchmark/bm_hash_aref_sym_long.rb
diff --git a/benchmark/hash_flatten.rb b/benchmark/bm_hash_flatten.rb
index e944aae9f2..e944aae9f2 100644
--- a/benchmark/hash_flatten.rb
+++ b/benchmark/bm_hash_flatten.rb
diff --git a/benchmark/hash_ident_flo.rb b/benchmark/bm_hash_ident_flo.rb
index 0c7edfed3e..0c7edfed3e 100644
--- a/benchmark/hash_ident_flo.rb
+++ b/benchmark/bm_hash_ident_flo.rb
diff --git a/benchmark/hash_ident_num.rb b/benchmark/bm_hash_ident_num.rb
index b226736c6f..b226736c6f 100644
--- a/benchmark/hash_ident_num.rb
+++ b/benchmark/bm_hash_ident_num.rb
diff --git a/benchmark/hash_ident_obj.rb b/benchmark/bm_hash_ident_obj.rb
index 4b3b58edec..4b3b58edec 100644
--- a/benchmark/hash_ident_obj.rb
+++ b/benchmark/bm_hash_ident_obj.rb
diff --git a/benchmark/hash_ident_str.rb b/benchmark/bm_hash_ident_str.rb
index 8582b38e31..8582b38e31 100644
--- a/benchmark/hash_ident_str.rb
+++ b/benchmark/bm_hash_ident_str.rb
diff --git a/benchmark/hash_ident_sym.rb b/benchmark/bm_hash_ident_sym.rb
index 4c81e3d28e..4c81e3d28e 100644
--- a/benchmark/hash_ident_sym.rb
+++ b/benchmark/bm_hash_ident_sym.rb
diff --git a/benchmark/hash_keys.rb b/benchmark/bm_hash_keys.rb
index 6863cd01f9..6863cd01f9 100644
--- a/benchmark/hash_keys.rb
+++ b/benchmark/bm_hash_keys.rb
diff --git a/benchmark/hash_shift.rb b/benchmark/bm_hash_shift.rb
index a645671a5b..a645671a5b 100644
--- a/benchmark/hash_shift.rb
+++ b/benchmark/bm_hash_shift.rb
diff --git a/benchmark/hash_shift_u16.rb b/benchmark/bm_hash_shift_u16.rb
index ec800d0342..ec800d0342 100644
--- a/benchmark/hash_shift_u16.rb
+++ b/benchmark/bm_hash_shift_u16.rb
diff --git a/benchmark/hash_shift_u24.rb b/benchmark/bm_hash_shift_u24.rb
index de4e0fa696..de4e0fa696 100644
--- a/benchmark/hash_shift_u24.rb
+++ b/benchmark/bm_hash_shift_u24.rb
diff --git a/benchmark/hash_shift_u32.rb b/benchmark/bm_hash_shift_u32.rb
index 656aa55583..656aa55583 100644
--- a/benchmark/hash_shift_u32.rb
+++ b/benchmark/bm_hash_shift_u32.rb
diff --git a/benchmark/hash_to_proc.rb b/benchmark/bm_hash_to_proc.rb
index 2b675bf509..2b675bf509 100644
--- a/benchmark/hash_to_proc.rb
+++ b/benchmark/bm_hash_to_proc.rb
diff --git a/benchmark/hash_values.rb b/benchmark/bm_hash_values.rb
index 069441302f..069441302f 100644
--- a/benchmark/hash_values.rb
+++ b/benchmark/bm_hash_values.rb
diff --git a/benchmark/io_file_create.rb b/benchmark/bm_io_file_create.rb
index 2f205c1333..2f205c1333 100644
--- a/benchmark/io_file_create.rb
+++ b/benchmark/bm_io_file_create.rb
diff --git a/benchmark/io_file_read.rb b/benchmark/bm_io_file_read.rb
index b9e796ed30..b9e796ed30 100644
--- a/benchmark/io_file_read.rb
+++ b/benchmark/bm_io_file_read.rb
diff --git a/benchmark/io_file_write.rb b/benchmark/bm_io_file_write.rb
index aa1be0e5fe..aa1be0e5fe 100644
--- a/benchmark/io_file_write.rb
+++ b/benchmark/bm_io_file_write.rb
diff --git a/benchmark/io_nonblock_noex.rb b/benchmark/bm_io_nonblock_noex.rb
index da9357fdc6..da9357fdc6 100644
--- a/benchmark/io_nonblock_noex.rb
+++ b/benchmark/bm_io_nonblock_noex.rb
diff --git a/benchmark/io_nonblock_noex2.rb b/benchmark/bm_io_nonblock_noex2.rb
index 56819d049b..56819d049b 100644
--- a/benchmark/io_nonblock_noex2.rb
+++ b/benchmark/bm_io_nonblock_noex2.rb
diff --git a/benchmark/io_select.rb b/benchmark/bm_io_select.rb
index 19248daeb1..19248daeb1 100644
--- a/benchmark/io_select.rb
+++ b/benchmark/bm_io_select.rb
diff --git a/benchmark/io_select2.rb b/benchmark/bm_io_select2.rb
index 10e37d71b2..10e37d71b2 100644
--- a/benchmark/io_select2.rb
+++ b/benchmark/bm_io_select2.rb
diff --git a/benchmark/io_select3.rb b/benchmark/bm_io_select3.rb
index 7d0ba1f092..7d0ba1f092 100644
--- a/benchmark/io_select3.rb
+++ b/benchmark/bm_io_select3.rb
diff --git a/benchmark/loop_for.rb b/benchmark/bm_loop_for.rb
index 0fc4cc1511..0fc4cc1511 100644
--- a/benchmark/loop_for.rb
+++ b/benchmark/bm_loop_for.rb
diff --git a/benchmark/loop_generator.rb b/benchmark/bm_loop_generator.rb
index d3375c744c..d3375c744c 100644
--- a/benchmark/loop_generator.rb
+++ b/benchmark/bm_loop_generator.rb
diff --git a/benchmark/loop_times.rb b/benchmark/bm_loop_times.rb
index 521f72ad1a..521f72ad1a 100644
--- a/benchmark/loop_times.rb
+++ b/benchmark/bm_loop_times.rb
diff --git a/benchmark/loop_whileloop.rb b/benchmark/bm_loop_whileloop.rb
index 0072822c06..0072822c06 100644
--- a/benchmark/loop_whileloop.rb
+++ b/benchmark/bm_loop_whileloop.rb
diff --git a/benchmark/loop_whileloop2.rb b/benchmark/bm_loop_whileloop2.rb
index 47d02dffc4..47d02dffc4 100644
--- a/benchmark/loop_whileloop2.rb
+++ b/benchmark/bm_loop_whileloop2.rb
diff --git a/benchmark/marshal_dump_flo.rb b/benchmark/bm_marshal_dump_flo.rb
index 9b8d0c6afb..9b8d0c6afb 100644
--- a/benchmark/marshal_dump_flo.rb
+++ b/benchmark/bm_marshal_dump_flo.rb
diff --git a/benchmark/marshal_dump_load_geniv.rb b/benchmark/bm_marshal_dump_load_geniv.rb
index 8252ad90fa..8252ad90fa 100644
--- a/benchmark/marshal_dump_load_geniv.rb
+++ b/benchmark/bm_marshal_dump_load_geniv.rb
diff --git a/benchmark/marshal_dump_load_time.rb b/benchmark/bm_marshal_dump_load_time.rb
index e29743b791..e29743b791 100644
--- a/benchmark/marshal_dump_load_time.rb
+++ b/benchmark/bm_marshal_dump_load_time.rb
diff --git a/benchmark/bm_require.rb b/benchmark/bm_require.rb
new file mode 100644
index 0000000000..b8abc88f41
--- /dev/null
+++ b/benchmark/bm_require.rb
@@ -0,0 +1,7 @@
+$:.push File.join(File.dirname(__FILE__), "bm_require.data")
+
+1.upto(10000) do |i|
+ require "c#{i}"
+end
+
+$:.pop
diff --git a/benchmark/bm_require_thread.rb b/benchmark/bm_require_thread.rb
new file mode 100644
index 0000000000..e54db6c6e5
--- /dev/null
+++ b/benchmark/bm_require_thread.rb
@@ -0,0 +1,15 @@
+$:.push File.join(File.dirname(__FILE__), "bm_require.data")
+
+i=0
+t = Thread.new do
+ while true
+ i = i+1 # dummy loop
+ end
+end
+
+1.upto(100) do |i|
+ require "c#{i}"
+end
+
+$:.pop
+t.kill
diff --git a/benchmark/securerandom.rb b/benchmark/bm_securerandom.rb
index a082ea6d5b..a082ea6d5b 100644
--- a/benchmark/securerandom.rb
+++ b/benchmark/bm_securerandom.rb
diff --git a/benchmark/so_ackermann.rb b/benchmark/bm_so_ackermann.rb
index 7db5be9050..7db5be9050 100644
--- a/benchmark/so_ackermann.rb
+++ b/benchmark/bm_so_ackermann.rb
diff --git a/benchmark/so_array.rb b/benchmark/bm_so_array.rb
index 2b8fce8f99..2b8fce8f99 100644
--- a/benchmark/so_array.rb
+++ b/benchmark/bm_so_array.rb
diff --git a/benchmark/so_binary_trees.rb b/benchmark/bm_so_binary_trees.rb
index b1693e4109..b1693e4109 100644
--- a/benchmark/so_binary_trees.rb
+++ b/benchmark/bm_so_binary_trees.rb
diff --git a/benchmark/so_concatenate.rb b/benchmark/bm_so_concatenate.rb
index 873214de7c..873214de7c 100644
--- a/benchmark/so_concatenate.rb
+++ b/benchmark/bm_so_concatenate.rb
diff --git a/benchmark/bm_so_count_words.rb b/benchmark/bm_so_count_words.rb
new file mode 100644
index 0000000000..65f6337a4a
--- /dev/null
+++ b/benchmark/bm_so_count_words.rb
@@ -0,0 +1,19 @@
+#!/usr/bin/ruby
+# -*- mode: ruby -*-
+# $Id: wc-ruby.code,v 1.4 2004/11/13 07:43:32 bfulgham Exp $
+# http://www.bagley.org/~doug/shootout/
+# with help from Paul Brannan
+
+input = open(File.join(File.dirname($0), 'wc.input'), 'rb')
+
+nl = nw = nc = 0
+while true
+ tmp = input.read(4096) or break
+ data = tmp << (input.gets || "")
+ nc += data.length
+ nl += data.count("\n")
+ ((data.strip! || data).tr!("\n", " ") || data).squeeze!
+ nw += data.count(" ") + 1
+end
+# STDERR.puts "#{nl} #{nw} #{nc}"
+
diff --git a/benchmark/so_exception.rb b/benchmark/bm_so_exception.rb
index deb003a594..deb003a594 100644
--- a/benchmark/so_exception.rb
+++ b/benchmark/bm_so_exception.rb
diff --git a/benchmark/so_fannkuch.rb b/benchmark/bm_so_fannkuch.rb
index bac5ecd44c..bac5ecd44c 100644
--- a/benchmark/so_fannkuch.rb
+++ b/benchmark/bm_so_fannkuch.rb
diff --git a/benchmark/bm_so_fasta.rb b/benchmark/bm_so_fasta.rb
new file mode 100644
index 0000000000..3f759ba7ae
--- /dev/null
+++ b/benchmark/bm_so_fasta.rb
@@ -0,0 +1,81 @@
+# The Computer Language Shootout
+# http://shootout.alioth.debian.org/
+# Contributed by Sokolov Yura
+
+$last = 42.0
+def gen_random (max,im=139968,ia=3877,ic=29573)
+ (max * ($last = ($last * ia + ic) % im)) / im
+end
+
+alu =
+ "GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGG"+
+ "GAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGA"+
+ "CCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAAT"+
+ "ACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCA"+
+ "GCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG"+
+ "AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC"+
+ "AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA"
+
+iub = [
+ ["a", 0.27],
+ ["c", 0.12],
+ ["g", 0.12],
+ ["t", 0.27],
+
+ ["B", 0.02],
+ ["D", 0.02],
+ ["H", 0.02],
+ ["K", 0.02],
+ ["M", 0.02],
+ ["N", 0.02],
+ ["R", 0.02],
+ ["S", 0.02],
+ ["V", 0.02],
+ ["W", 0.02],
+ ["Y", 0.02],
+]
+homosapiens = [
+ ["a", 0.3029549426680],
+ ["c", 0.1979883004921],
+ ["g", 0.1975473066391],
+ ["t", 0.3015094502008],
+]
+
+def make_repeat_fasta(id, desc, src, n)
+ puts ">#{id} #{desc}"
+ v = nil
+ width = 60
+ l = src.length
+ s = src * ((n / l) + 1)
+ s.slice!(n, l)
+ puts(s.scan(/.{1,#{width}}/).join("\n"))
+end
+
+def make_random_fasta(id, desc, table, n)
+ puts ">#{id} #{desc}"
+ rand, v = nil,nil
+ width = 60
+ chunk = 1 * width
+ prob = 0.0
+ table.each{|v| v[1]= (prob += v[1])}
+ for i in 1..(n/width)
+ puts((1..width).collect{
+ rand = gen_random(1.0)
+ table.find{|v| v[1]>rand}[0]
+ }.join)
+ end
+ if n%width != 0
+ puts((1..(n%width)).collect{
+ rand = gen_random(1.0)
+ table.find{|v| v[1]>rand}[0]
+ }.join)
+ end
+end
+
+
+n = (ARGV[0] or 250_000).to_i
+
+make_repeat_fasta('ONE', 'Homo sapiens alu', alu, n*2)
+make_random_fasta('TWO', 'IUB ambiguity codes', iub, n*3)
+make_random_fasta('THREE', 'Homo sapiens frequency', homosapiens, n*5)
+
diff --git a/benchmark/bm_so_k_nucleotide.rb b/benchmark/bm_so_k_nucleotide.rb
new file mode 100644
index 0000000000..dadab3e79c
--- /dev/null
+++ b/benchmark/bm_so_k_nucleotide.rb
@@ -0,0 +1,48 @@
+# The Computer Language Shootout
+# http://shootout.alioth.debian.org
+#
+# contributed by jose fco. gonzalez
+# modified by Sokolov Yura
+
+seq = String.new
+
+def frecuency( seq,length )
+ n, table = seq.length - length + 1, Hash.new(0)
+ f, i = nil, nil
+ (0 ... length).each do |f|
+ (f ... n).step(length) do |i|
+ table[seq[i,length]] += 1
+ end
+ end
+ [n,table]
+
+end
+
+def sort_by_freq( seq,length )
+ n,table = frecuency( seq,length )
+ a, b, v = nil, nil, nil
+ table.sort{|a,b| b[1] <=> a[1]}.each do |v|
+ puts "%s %.3f" % [v[0].upcase,((v[1]*100).to_f/n)]
+ end
+ puts
+end
+
+def find_seq( seq,s )
+ n,table = frecuency( seq,s.length )
+ puts "#{table[s].to_s}\t#{s.upcase}"
+end
+
+input = open(File.join(File.dirname($0), 'fasta.output.100000'), 'rb')
+
+line = input.gets while line !~ /^>THREE/
+line = input.gets
+
+while (line !~ /^>/) & line do
+ seq << line.chomp
+ line = input.gets
+end
+
+[1,2].each {|i| sort_by_freq( seq,i ) }
+
+%w(ggt ggta ggtatt ggtattttaatt ggtattttaatttatagt).each{|s| find_seq( seq,s) }
+
diff --git a/benchmark/so_lists.rb b/benchmark/bm_so_lists.rb
index e8f4a2a5f7..e8f4a2a5f7 100644
--- a/benchmark/so_lists.rb
+++ b/benchmark/bm_so_lists.rb
diff --git a/benchmark/so_mandelbrot.rb b/benchmark/bm_so_mandelbrot.rb
index 76331c64b8..76331c64b8 100644
--- a/benchmark/so_mandelbrot.rb
+++ b/benchmark/bm_so_mandelbrot.rb
diff --git a/benchmark/so_matrix.rb b/benchmark/bm_so_matrix.rb
index e2c5c8e559..e2c5c8e559 100644
--- a/benchmark/so_matrix.rb
+++ b/benchmark/bm_so_matrix.rb
diff --git a/benchmark/bm_so_meteor_contest.rb b/benchmark/bm_so_meteor_contest.rb
new file mode 100644
index 0000000000..17e9c046a8
--- /dev/null
+++ b/benchmark/bm_so_meteor_contest.rb
@@ -0,0 +1,564 @@
+#!/usr/bin/env ruby
+#
+# The Computer Language Shootout
+# http://shootout.alioth.debian.org
+# contributed by Kevin Barnes (Ruby novice)
+
+# PROGRAM: the main body is at the bottom.
+# 1) read about the problem here: http://www-128.ibm.com/developerworks/java/library/j-javaopt/
+# 2) see how I represent a board as a bitmask by reading the blank_board comments
+# 3) read as your mental paths take you
+
+def print *args
+end
+
+# class to represent all information about a particular rotation of a particular piece
+class Rotation
+ # an array (by location) containing a bit mask for how the piece maps at the given location.
+ # if the rotation is invalid at that location the mask will contain false
+ attr_reader :start_masks
+
+ # maps a direction to a relative location. these differ depending on whether it is an even or
+ # odd row being mapped from
+ @@rotation_even_adder = { :west => -1, :east => 1, :nw => -7, :ne => -6, :sw => 5, :se => 6 }
+ @@rotation_odd_adder = { :west => -1, :east => 1, :nw => -6, :ne => -5, :sw => 6, :se => 7 }
+
+ def initialize( directions )
+ @even_offsets, @odd_offsets = normalize_offsets( get_values( directions ))
+
+ @even_mask = mask_for_offsets( @even_offsets)
+ @odd_mask = mask_for_offsets( @odd_offsets)
+
+ @start_masks = Array.new(60)
+
+ # create the rotational masks by placing the base mask at the location and seeing if
+ # 1) it overlaps the boundaries and 2) it produces a prunable board. if either of these
+ # is true the piece cannot be placed
+ 0.upto(59) do | offset |
+ mask = is_even(offset) ? (@even_mask << offset) : (@odd_mask << offset)
+ if (blank_board & mask == 0 && !prunable(blank_board | mask, 0, true)) then
+ imask = compute_required( mask, offset)
+ @start_masks[offset] = [ mask, imask, imask | mask ]
+ else
+ @start_masks[offset] = false
+ end
+ end
+ end
+
+ def compute_required( mask, offset )
+ board = blank_board
+ 0.upto(offset) { | i | board |= 1 << i }
+ board |= mask
+ return 0 if (!prunable(board | mask, offset))
+ board = flood_fill(board,58)
+ count = 0
+ imask = 0
+ 0.upto(59) do | i |
+ if (board[i] == 0) then
+ imask |= (1 << i)
+ count += 1
+ end
+ end
+ (count > 0 && count < 5) ? imask : 0
+ end
+
+ def flood_fill( board, location)
+ return board if (board[location] == 1)
+ board |= 1 << location
+ row, col = location.divmod(6)
+ board = flood_fill( board, location - 1) if (col > 0)
+ board = flood_fill( board, location + 1) if (col < 4)
+ if (row % 2 == 0) then
+ board = flood_fill( board, location - 7) if (col > 0 && row > 0)
+ board = flood_fill( board, location - 6) if (row > 0)
+ board = flood_fill( board, location + 6) if (row < 9)
+ board = flood_fill( board, location + 5) if (col > 0 && row < 9)
+ else
+ board = flood_fill( board, location - 5) if (col < 4 && row > 0)
+ board = flood_fill( board, location - 6) if (row > 0)
+ board = flood_fill( board, location + 6) if (row < 9)
+ board = flood_fill( board, location + 7) if (col < 4 && row < 9)
+ end
+ board
+ end
+
+ # given a location, produces a list of relative locations covered by the piece at this rotation
+ def offsets( location)
+ if is_even( location) then
+ @even_offsets.collect { | value | value + location }
+ else
+ @odd_offsets.collect { | value | value + location }
+ end
+ end
+
+ # returns a set of offsets relative to the top-left most piece of the rotation (by even or odd rows)
+ # this is hard to explain. imagine we have this partial board:
+ # 0 0 0 0 0 x [positions 0-5]
+ # 0 0 1 1 0 x [positions 6-11]
+ # 0 0 1 0 0 x [positions 12-17]
+ # 0 1 0 0 0 x [positions 18-23]
+ # 0 1 0 0 0 x [positions 24-29]
+ # 0 0 0 0 0 x [positions 30-35]
+ # ...
+ # The top-left of the piece is at position 8, the
+ # board would be passed as a set of positions (values array) containing [8,9,14,19,25] not necessarily in that
+ # sorted order. Since that array starts on an odd row, the offsets for an odd row are: [0,1,6,11,17] obtained
+ # by subtracting 8 from everything. Now imagine the piece shifted up and to the right so it's on an even row:
+ # 0 0 0 1 1 x [positions 0-5]
+ # 0 0 1 0 0 x [positions 6-11]
+ # 0 0 1 0 0 x [positions 12-17]
+ # 0 1 0 0 0 x [positions 18-23]
+ # 0 0 0 0 0 x [positions 24-29]
+ # 0 0 0 0 0 x [positions 30-35]
+ # ...
+ # Now the positions are [3,4,8,14,19] which after subtracting the lowest value (3) gives [0,1,5,11,16] thus, the
+ # offsets for this particular piece are (in even, odd order) [0,1,5,11,16],[0,1,6,11,17] which is what
+ # this function would return
+ def normalize_offsets( values)
+ min = values.min
+ even_min = is_even(min)
+ other_min = even_min ? min + 6 : min + 7
+ other_values = values.collect do | value |
+ if is_even(value) then
+ value + 6 - other_min
+ else
+ value + 7 - other_min
+ end
+ end
+ values.collect! { | value | value - min }
+
+ if even_min then
+ [values, other_values]
+ else
+ [other_values, values]
+ end
+ end
+
+ # produce a bitmask representation of an array of offset locations
+ def mask_for_offsets( offsets )
+ mask = 0
+ offsets.each { | value | mask = mask + ( 1 << value ) }
+ mask
+ end
+
+ # finds a "safe" position that a position as described by a list of directions can be placed
+ # without falling off any edge of the board. the values returned a location to place the first piece
+ # at so it will fit after making the described moves
+ def start_adjust( directions )
+ south = east = 0;
+ directions.each do | direction |
+ east += 1 if ( direction == :sw || direction == :nw || direction == :west )
+ south += 1 if ( direction == :nw || direction == :ne )
+ end
+ south * 6 + east
+ end
+
+ # given a set of directions places the piece (as defined by a set of directions) on the board at
+ # a location that will not take it off the edge
+ def get_values ( directions )
+ start = start_adjust(directions)
+ values = [ start ]
+ directions.each do | direction |
+ if (start % 12 >= 6) then
+ start += @@rotation_odd_adder[direction]
+ else
+ start += @@rotation_even_adder[direction]
+ end
+ values += [ start ]
+ end
+
+ # some moves take you back to an existing location, we'll strip duplicates
+ values.uniq
+ end
+end
+
+# describes a piece and caches information about its rotations to as to be efficient for iteration
+# ATTRIBUTES:
+# rotations -- all the rotations of the piece
+# type -- a numeic "name" of the piece
+# masks -- an array by location of all legal rotational masks (a n inner array) for that location
+# placed -- the mask that this piece was last placed at (not a location, but the actual mask used)
+class Piece
+ attr_reader :rotations, :type, :masks
+ attr_accessor :placed
+
+ # transform hashes that change one direction into another when you either flip or rotate a set of directions
+ @@flip_converter = { :west => :west, :east => :east, :nw => :sw, :ne => :se, :sw => :nw, :se => :ne }
+ @@rotate_converter = { :west => :nw, :east => :se, :nw => :ne, :ne => :east, :sw => :west, :se => :sw }
+
+ def initialize( directions, type )
+ @type = type
+ @rotations = Array.new();
+ @map = {}
+
+ generate_rotations( directions )
+ directions.collect! { | value | @@flip_converter[value] }
+ generate_rotations( directions )
+
+ # creates the masks AND a map that returns [location, rotation] for any given mask
+ # this is used when a board is found and we want to draw it, otherwise the map is unused
+ @masks = Array.new();
+ 0.upto(59) do | i |
+ even = true
+ @masks[i] = @rotations.collect do | rotation |
+ mask = rotation.start_masks[i]
+ @map[mask[0]] = [ i, rotation ] if (mask)
+ mask || nil
+ end
+ @masks[i].compact!
+ end
+ end
+
+ # rotates a set of directions through all six angles and adds a Rotation to the list for each one
+ def generate_rotations( directions )
+ 6.times do
+ rotations.push( Rotation.new(directions))
+ directions.collect! { | value | @@rotate_converter[value] }
+ end
+ end
+
+ # given a board string, adds this piece to the board at whatever location/rotation
+ # important: the outbound board string is 5 wide, the normal location notation is six wide (padded)
+ def fill_string( board_string)
+ location, rotation = @map[@placed]
+ rotation.offsets(location).each do | offset |
+ row, col = offset.divmod(6)
+ board_string[ row*5 + col, 1 ] = @type.to_s
+ end
+ end
+end
+
+# a blank bit board having this form:
+#
+# 0 0 0 0 0 1
+# 0 0 0 0 0 1
+# 0 0 0 0 0 1
+# 0 0 0 0 0 1
+# 0 0 0 0 0 1
+# 0 0 0 0 0 1
+# 0 0 0 0 0 1
+# 0 0 0 0 0 1
+# 0 0 0 0 0 1
+# 0 0 0 0 0 1
+# 1 1 1 1 1 1
+#
+# where left lest significant bit is the top left and the most significant is the lower right
+# the actual board only consists of the 0 places, the 1 places are blockers to keep things from running
+# off the edges or bottom
+def blank_board
+ 0b111111100000100000100000100000100000100000100000100000100000100000
+end
+
+def full_board
+ 0b111111111111111111111111111111111111111111111111111111111111111111
+end
+
+# determines if a location (bit position) is in an even row
+def is_even( location)
+ (location % 12) < 6
+end
+
+# support function that create three utility maps:
+# $converter -- for each row an array that maps a five bit row (via array mapping)
+# to the a a five bit representation of the bits below it
+# $bit_count -- maps a five bit row (via array mapping) to the number of 1s in the row
+# @@new_regions -- maps a five bit row (via array mapping) to an array of "region" arrays
+# a region array has three values the first is a mask of bits in the region,
+# the second is the count of those bits and the third is identical to the first
+# examples:
+# 0b10010 => [ 0b01100, 2, 0b01100 ], [ 0b00001, 1, 0b00001]
+# 0b01010 => [ 0b10000, 1, 0b10000 ], [ 0b00100, 1, 0b00100 ], [ 0b00001, 1, 0b00001]
+# 0b10001 => [ 0b01110, 3, 0b01110 ]
+def create_collector_support
+ odd_map = [0b11, 0b110, 0b1100, 0b11000, 0b10000]
+ even_map = [0b1, 0b11, 0b110, 0b1100, 0b11000]
+
+ all_odds = Array.new(0b100000)
+ all_evens = Array.new(0b100000)
+ bit_counts = Array.new(0b100000)
+ new_regions = Array.new(0b100000)
+ 0.upto(0b11111) do | i |
+ bit_count = odd = even = 0
+ 0.upto(4) do | bit |
+ if (i[bit] == 1) then
+ bit_count += 1
+ odd |= odd_map[bit]
+ even |= even_map[bit]
+ end
+ end
+ all_odds[i] = odd
+ all_evens[i] = even
+ bit_counts[i] = bit_count
+ new_regions[i] = create_regions( i)
+ end
+
+ $converter = []
+ 10.times { | row | $converter.push((row % 2 == 0) ? all_evens : all_odds) }
+ $bit_counts = bit_counts
+ $regions = new_regions.collect { | set | set.collect { | value | [ value, bit_counts[value], value] } }
+end
+
+# determines if a board is punable, meaning that there is no possibility that it
+# can be filled up with pieces. A board is prunable if there is a grouping of unfilled spaces
+# that are not a multiple of five. The following board is an example of a prunable board:
+# 0 0 1 0 0
+# 0 1 0 0 0
+# 1 1 0 0 0
+# 0 1 0 0 0
+# 0 0 0 0 0
+# ...
+#
+# This board is prunable because the top left corner is only 3 bits in area, no piece will ever fit it
+# parameters:
+# board -- an initial bit board (6 bit padded rows, see blank_board for format)
+# location -- starting location, everything above and to the left is already full
+# slotting -- set to true only when testing initial pieces, when filling normally
+# additional assumptions are possible
+#
+# Algorithm:
+# The algorithm starts at the top row (as determined by location) and iterates a row at a time
+# maintainng counts of active open areas (kept in the collector array) each collector contains
+# three values at the start of an iteration:
+# 0: mask of bits that would be adjacent to the collector in this row
+# 1: the number of bits collected so far
+# 2: a scratch space starting as zero, but used during the computation to represent
+# the empty bits in the new row that are adjacent (position 0)
+# The exact procedure is described in-code
+def prunable( board, location, slotting = false)
+ collectors = []
+ # loop across the rows
+ (location / 6).to_i.upto(9) do | row_on |
+ # obtain a set of regions representing the bits of the current row.
+ regions = $regions[(board >> (row_on * 6)) & 0b11111]
+ converter = $converter[row_on]
+
+ # track the number of collectors at the start of the cycle so that
+ # we don't compute against newly created collectors, only existing collectors
+ initial_collector_count = collectors.length
+
+ # loop against the regions. For each region of the row
+ # we will see if it connects to one or more existing collectors.
+ # if it connects to 1 collector, the bits from the region are added to the
+ # bits of the collector and the mask is placed in collector[2]
+ # If the region overlaps more than one collector then all the collectors
+ # it overlaps with are merged into the first one (the others are set to nil in the array)
+ # if NO collectors are found then the region is copied as a new collector
+ regions.each do | region |
+ collector_found = nil
+ region_mask = region[2]
+ initial_collector_count.times do | collector_num |
+ collector = collectors[collector_num]
+ if (collector) then
+ collector_mask = collector[0]
+ if (collector_mask & region_mask != 0) then
+ if (collector_found) then
+ collector_found[0] |= collector_mask
+ collector_found[1] += collector[1]
+ collector_found[2] |= collector[2]
+ collectors[collector_num] = nil
+ else
+ collector_found = collector
+ collector[1] += region[1]
+ collector[2] |= region_mask
+ end
+ end
+ end
+ end
+ if (collector_found == nil) then
+ collectors.push(Array.new(region))
+ end
+ end
+
+ # check the existing collectors, if any collector overlapped no bits in the region its [2] value will
+ # be zero. The size of any such reaason is tested if it is not a multiple of five true is returned since
+ # the board is prunable. if it is a multiple of five it is removed.
+ # Collector that are still active have a new adjacent value [0] set based n the matched bits
+ # and have [2] cleared out for the next cycle.
+ collectors.length.times do | collector_num |
+ collector = collectors[collector_num]
+ if (collector) then
+ if (collector[2] == 0) then
+ return true if (collector[1] % 5 != 0)
+ collectors[collector_num] = nil
+ else
+ # if a collector matches all bits in the row then we can return unprunable early for the
+ # following reasons:
+ # 1) there can be no more unavailable bits bince we fill from the top left downward
+ # 2) all previous regions have been closed or joined so only this region can fail
+ # 3) this region must be good since there can never be only 1 region that is nuot
+ # a multiple of five
+ # this rule only applies when filling normally, so we ignore the rule if we are "slotting"
+ # in pieces to see what configurations work for them (the only other time this algorithm is used).
+ return false if (collector[2] == 0b11111 && !slotting)
+ collector[0] = converter[collector[2]]
+ collector[2] = 0
+ end
+ end
+ end
+
+ # get rid of all the empty converters for the next round
+ collectors.compact!
+ end
+ return false if (collectors.length <= 1) # 1 collector or less and the region is fine
+ collectors.any? { | collector | (collector[1] % 5) != 0 } # more than 1 and we test them all for bad size
+end
+
+# creates a region given a row mask. see prunable for what a "region" is
+def create_regions( value )
+ regions = []
+ cur_region = 0
+ 5.times do | bit |
+ if (value[bit] == 0) then
+ cur_region |= 1 << bit
+ else
+ if (cur_region != 0 ) then
+ regions.push( cur_region)
+ cur_region = 0;
+ end
+ end
+ end
+ regions.push(cur_region) if (cur_region != 0)
+ regions
+end
+
+# find up to the counted number of solutions (or all solutions) and prints the final result
+def find_all
+ find_top( 1)
+ find_top( 0)
+ print_results
+end
+
+# show the board
+def print_results
+ print "#{@boards_found} solutions found\n\n"
+ print_full_board( @min_board)
+ print "\n"
+ print_full_board( @max_board)
+ print "\n"
+end
+
+# finds solutions. This special version of the main function is only used for the top level
+# the reason for it is basically to force a particular ordering on how the rotations are tested for
+# the first piece. It is called twice, first looking for placements of the odd rotations and then
+# looking for placements of the even locations.
+#
+# WHY?
+# Since any found solution has an inverse we want to maximize finding solutions that are not already found
+# as an inverse. The inverse will ALWAYS be 3 one of the piece configurations that is exactly 3 rotations away
+# (an odd number). Checking even vs odd then produces a higher probability of finding more pieces earlier
+# in the cycle. We still need to keep checking all the permutations, but our probability of finding one will
+# diminsh over time. Since we are TOLD how many to search for this lets us exit before checking all pieces
+# this bennifit is very great when seeking small numbers of solutions and is 0 when looking for more than the
+# maximum number
+def find_top( rotation_skip)
+ board = blank_board
+ (@pieces.length-1).times do
+ piece = @pieces.shift
+ piece.masks[0].each do | mask, imask, cmask |
+ if ((rotation_skip += 1) % 2 == 0) then
+ piece.placed = mask
+ find( 1, 1, board | mask)
+ end
+ end
+ @pieces.push(piece)
+ end
+ piece = @pieces.shift
+ @pieces.push(piece)
+end
+
+# the normail find routine, iterates through the available pieces, checks all rotations at the current location
+# and adds any boards found. depth is achieved via recursion. the overall approach is described
+# here: http://www-128.ibm.com/developerworks/java/library/j-javaopt/
+# parameters:
+# start_location -- where to start looking for place for the next piece at
+# placed -- number of pieces placed
+# board -- current state of the board
+#
+# see in-code comments
+def find( start_location, placed, board)
+ # find the next location to place a piece by looking for an empty bit
+ while board[start_location] == 1
+ start_location += 1
+ end
+
+ @pieces.length.times do
+ piece = @pieces.shift
+ piece.masks[start_location].each do | mask, imask, cmask |
+ if ( board & cmask == imask) then
+ piece.placed = mask
+ if (placed == 9) then
+ add_board
+ else
+ find( start_location + 1, placed + 1, board | mask)
+ end
+ end
+ end
+ @pieces.push(piece)
+ end
+end
+
+# print the board
+def print_full_board( board_string)
+ 10.times do | row |
+ print " " if (row % 2 == 1)
+ 5.times do | col |
+ print "#{board_string[row*5 + col,1]} "
+ end
+ print "\n"
+ end
+end
+
+# when a board is found we "draw it" into a string and then flip that string, adding both to
+# the list (hash) of solutions if they are unique.
+def add_board
+ board_string = "99999999999999999999999999999999999999999999999999"
+ @all_pieces.each { | piece | piece.fill_string( board_string ) }
+ save( board_string)
+ save( board_string.reverse)
+end
+
+# adds a board string to the list (if new) and updates the current best/worst board
+def save( board_string)
+ if (@all_boards[board_string] == nil) then
+ @min_board = board_string if (board_string < @min_board)
+ @max_board = board_string if (board_string > @max_board)
+ @all_boards.store(board_string,true)
+ @boards_found += 1
+
+ # the exit motif is a time saver. Ideally the function should return, but those tests
+ # take noticeable time (performance).
+ if (@boards_found == @stop_count) then
+ print_results
+ exit(0)
+ end
+ end
+end
+
+
+##
+## MAIN BODY :)
+##
+create_collector_support
+@pieces = [
+ Piece.new( [ :nw, :ne, :east, :east ], 2),
+ Piece.new( [ :ne, :se, :east, :ne ], 7),
+ Piece.new( [ :ne, :east, :ne, :nw ], 1),
+ Piece.new( [ :east, :sw, :sw, :se ], 6),
+ Piece.new( [ :east, :ne, :se, :ne ], 5),
+ Piece.new( [ :east, :east, :east, :se ], 0),
+ Piece.new( [ :ne, :nw, :se, :east, :se ], 4),
+ Piece.new( [ :se, :se, :se, :west ], 9),
+ Piece.new( [ :se, :se, :east, :se ], 8),
+ Piece.new( [ :east, :east, :sw, :se ], 3)
+ ];
+
+@all_pieces = Array.new( @pieces)
+
+@min_board = "99999999999999999999999999999999999999999999999999"
+@max_board = "00000000000000000000000000000000000000000000000000"
+@stop_count = ARGV[0].to_i || 2089
+@all_boards = {}
+@boards_found = 0
+
+find_all ######## DO IT!!!
+
diff --git a/benchmark/so_nbody.rb b/benchmark/bm_so_nbody.rb
index d6c5bb9e61..d6c5bb9e61 100644
--- a/benchmark/so_nbody.rb
+++ b/benchmark/bm_so_nbody.rb
diff --git a/benchmark/so_nested_loop.rb b/benchmark/bm_so_nested_loop.rb
index a0513f8c47..a0513f8c47 100644
--- a/benchmark/so_nested_loop.rb
+++ b/benchmark/bm_so_nested_loop.rb
diff --git a/benchmark/so_nsieve.rb b/benchmark/bm_so_nsieve.rb
index a65cc78233..a65cc78233 100644
--- a/benchmark/so_nsieve.rb
+++ b/benchmark/bm_so_nsieve.rb
diff --git a/benchmark/so_nsieve_bits.rb b/benchmark/bm_so_nsieve_bits.rb
index 6f958ee44e..6f958ee44e 100644
--- a/benchmark/so_nsieve_bits.rb
+++ b/benchmark/bm_so_nsieve_bits.rb
diff --git a/benchmark/so_object.rb b/benchmark/bm_so_object.rb
index e8607c7199..e8607c7199 100644
--- a/benchmark/so_object.rb
+++ b/benchmark/bm_so_object.rb
diff --git a/benchmark/so_partial_sums.rb b/benchmark/bm_so_partial_sums.rb
index 630b45cb8d..630b45cb8d 100644
--- a/benchmark/so_partial_sums.rb
+++ b/benchmark/bm_so_partial_sums.rb
diff --git a/benchmark/bm_so_pidigits.rb b/benchmark/bm_so_pidigits.rb
new file mode 100644
index 0000000000..c7d6fbfb4d
--- /dev/null
+++ b/benchmark/bm_so_pidigits.rb
@@ -0,0 +1,92 @@
+# The Great Computer Language Shootout
+# http://shootout.alioth.debian.org/
+#
+# contributed by Gabriele Renzi
+
+class PiDigitSpigot
+
+ def initialize()
+ @z = Transformation.new 1,0,0,1
+ @x = Transformation.new 0,0,0,0
+ @inverse = Transformation.new 0,0,0,0
+ end
+
+ def next!
+ @y = @z.extract(3)
+ if safe? @y
+ @z = produce(@y)
+ @y
+ else
+ @z = consume @x.next!()
+ next!()
+ end
+ end
+
+ def safe?(digit)
+ digit == @z.extract(4)
+ end
+
+ def produce(i)
+ @inverse.qrst(10,-10*i,0,1).compose(@z)
+ end
+
+ def consume(a)
+ @z.compose(a)
+ end
+end
+
+
+class Transformation
+ attr_reader :q, :r, :s, :t
+ def initialize (q, r, s, t)
+ @q,@r,@s,@t,@k = q,r,s,t,0
+ end
+
+ def next!()
+ @q = @k = @k + 1
+ @r = 4 * @k + 2
+ @s = 0
+ @t = 2 * @k + 1
+ self
+ end
+
+ def extract(j)
+ (@q * j + @r) / (@s * j + @t)
+ end
+
+ def compose(a)
+ self.class.new( @q * a.q,
+ @q * a.r + r * a.t,
+ @s * a.q + t * a.s,
+ @s * a.r + t * a.t
+ )
+ end
+
+ def qrst *args
+ initialize *args
+ self
+ end
+
+
+end
+
+
+WIDTH = 10
+n = 2_500 # Integer(ARGV[0])
+j = 0
+
+digits = PiDigitSpigot.new
+
+while n > 0
+ if n >= WIDTH
+ WIDTH.times {print digits.next!}
+ j += WIDTH
+ else
+ n.times {print digits.next!}
+ (WIDTH-n).times {print " "}
+ j += n
+ end
+ puts "\t:"+j.to_s
+ n -= WIDTH
+end
+
diff --git a/benchmark/so_random.rb b/benchmark/bm_so_random.rb
index a66b9e8e63..a66b9e8e63 100644
--- a/benchmark/so_random.rb
+++ b/benchmark/bm_so_random.rb
diff --git a/benchmark/bm_so_reverse_complement.rb b/benchmark/bm_so_reverse_complement.rb
new file mode 100644
index 0000000000..82ea666994
--- /dev/null
+++ b/benchmark/bm_so_reverse_complement.rb
@@ -0,0 +1,30 @@
+#!/usr/bin/ruby
+# The Great Computer Language Shootout
+# http://shootout.alioth.debian.org/
+#
+# Contributed by Peter Bjarke Olsen
+# Modified by Doug King
+
+seq=Array.new
+
+def revcomp(seq)
+ seq.reverse!.tr!('wsatugcyrkmbdhvnATUGCYRKMBDHVN','WSTAACGRYMKVHDBNTAACGRYMKVHDBN')
+ stringlen=seq.length
+ 0.step(stringlen-1,60) {|x| print seq.slice(x,60) , "\n"}
+end
+
+input = open(File.join(File.dirname($0), 'fasta.output.2500000'), 'rb')
+
+while input.gets
+ if $_ =~ />/
+ if seq.length != 0
+ revcomp(seq.join)
+ seq=Array.new
+ end
+ puts $_
+ else
+ $_.sub(/\n/,'')
+ seq.push $_
+ end
+end
+revcomp(seq.join)
diff --git a/benchmark/so_sieve.rb b/benchmark/bm_so_sieve.rb
index 43dc302648..43dc302648 100644
--- a/benchmark/so_sieve.rb
+++ b/benchmark/bm_so_sieve.rb
diff --git a/benchmark/so_spectralnorm.rb b/benchmark/bm_so_spectralnorm.rb
index 6b97206689..6b97206689 100644
--- a/benchmark/so_spectralnorm.rb
+++ b/benchmark/bm_so_spectralnorm.rb
diff --git a/benchmark/bm_vm1_attr_ivar.rb b/benchmark/bm_vm1_attr_ivar.rb
new file mode 100644
index 0000000000..16906f3605
--- /dev/null
+++ b/benchmark/bm_vm1_attr_ivar.rb
@@ -0,0 +1,14 @@
+class C
+ attr_reader :a, :b
+ def initialize
+ @a = nil
+ @b = nil
+ end
+end
+obj = C.new
+i = 0
+while i<30_000_000 # while loop 1
+ i += 1
+ j = obj.a
+ k = obj.b
+end
diff --git a/benchmark/bm_vm1_attr_ivar_set.rb b/benchmark/bm_vm1_attr_ivar_set.rb
new file mode 100644
index 0000000000..7e7a6b48c0
--- /dev/null
+++ b/benchmark/bm_vm1_attr_ivar_set.rb
@@ -0,0 +1,14 @@
+class C
+ attr_accessor :a, :b
+ def initialize
+ @a = nil
+ @b = nil
+ end
+end
+obj = C.new
+i = 0
+while i<30_000_000 # while loop 1
+ i += 1
+ obj.a = 1
+ obj.b = 2
+end
diff --git a/benchmark/bm_vm1_block.rb b/benchmark/bm_vm1_block.rb
new file mode 100644
index 0000000000..a9f56b15ea
--- /dev/null
+++ b/benchmark/bm_vm1_block.rb
@@ -0,0 +1,10 @@
+def m
+ yield
+end
+
+i = 0
+while i<30_000_000 # while loop 1
+ i += 1
+ m{
+ }
+end
diff --git a/benchmark/bm_vm1_const.rb b/benchmark/bm_vm1_const.rb
new file mode 100644
index 0000000000..ac59ebccf1
--- /dev/null
+++ b/benchmark/bm_vm1_const.rb
@@ -0,0 +1,8 @@
+Const = 1
+
+i = 0
+while i<30_000_000 # while loop 1
+ i += 1
+ j = Const
+ k = Const
+end
diff --git a/benchmark/bm_vm1_ensure.rb b/benchmark/bm_vm1_ensure.rb
new file mode 100644
index 0000000000..a1596145f2
--- /dev/null
+++ b/benchmark/bm_vm1_ensure.rb
@@ -0,0 +1,11 @@
+i = 0
+while i<30_000_000 # benchmark loop 1
+ i += 1
+ begin
+ begin
+ ensure
+ end
+ ensure
+ end
+end
+
diff --git a/benchmark/bm_vm1_float_simple.rb b/benchmark/bm_vm1_float_simple.rb
new file mode 100644
index 0000000000..d4581439ff
--- /dev/null
+++ b/benchmark/bm_vm1_float_simple.rb
@@ -0,0 +1,7 @@
+i = 0.0; f = 0.0
+while i<30_000_000
+ i += 1
+ f += 0.1; f -= 0.1
+ f += 0.1; f -= 0.1
+ f += 0.1; f -= 0.1
+end
diff --git a/benchmark/bm_vm1_gc_short_lived.rb b/benchmark/bm_vm1_gc_short_lived.rb
new file mode 100644
index 0000000000..e78bca5668
--- /dev/null
+++ b/benchmark/bm_vm1_gc_short_lived.rb
@@ -0,0 +1,10 @@
+i = 0
+while i<30_000_000 # while loop 1
+ a = '' # short-lived String
+ b = ''
+ c = ''
+ d = ''
+ e = ''
+ f = ''
+ i+=1
+end
diff --git a/benchmark/bm_vm1_gc_short_with_complex_long.rb b/benchmark/bm_vm1_gc_short_with_complex_long.rb
new file mode 100644
index 0000000000..b66052dee0
--- /dev/null
+++ b/benchmark/bm_vm1_gc_short_with_complex_long.rb
@@ -0,0 +1,27 @@
+def nested_hash h, n
+ if n == 0
+ ''
+ else
+ 10.times{
+ h[Object.new] = nested_hash(h, n-1)
+ }
+ end
+end
+
+long_lived = Hash.new
+nested_hash long_lived, 6
+
+GC.start
+GC.start
+
+i = 0
+while i<30_000_000 # while loop 1
+ a = '' # short-lived String
+ b = ''
+ c = ''
+ d = ''
+ e = ''
+ f = ''
+ i+=1
+end
+
diff --git a/benchmark/bm_vm1_gc_short_with_long.rb b/benchmark/bm_vm1_gc_short_with_long.rb
new file mode 100644
index 0000000000..298dbc845b
--- /dev/null
+++ b/benchmark/bm_vm1_gc_short_with_long.rb
@@ -0,0 +1,13 @@
+long_lived = Array.new(1_000_000){|i| "#{i}"}
+GC.start
+GC.start
+i = 0
+while i<30_000_000 # while loop 1
+ a = '' # short-lived String
+ b = ''
+ c = ''
+ d = ''
+ e = ''
+ f = ''
+ i+=1
+end
diff --git a/benchmark/bm_vm1_gc_short_with_symbol.rb b/benchmark/bm_vm1_gc_short_with_symbol.rb
new file mode 100644
index 0000000000..6b15c1b7bf
--- /dev/null
+++ b/benchmark/bm_vm1_gc_short_with_symbol.rb
@@ -0,0 +1,15 @@
+# make many symbols
+50_000.times{|i| sym = "sym#{i}".to_sym}
+GC.start
+GC.start
+
+i = 0
+while i<30_000_000 # while loop 1
+ a = '' # short-lived String
+ b = ''
+ c = ''
+ d = ''
+ e = ''
+ f = ''
+ i+=1
+end
diff --git a/benchmark/bm_vm1_gc_wb_ary.rb b/benchmark/bm_vm1_gc_wb_ary.rb
new file mode 100644
index 0000000000..881528845b
--- /dev/null
+++ b/benchmark/bm_vm1_gc_wb_ary.rb
@@ -0,0 +1,12 @@
+short_lived_ary = []
+
+if RUBY_VERSION >= "2.2.0"
+ GC.start(full_mark: false, immediate_mark: true, lazy_sweep: false)
+end
+
+i = 0
+short_lived = ''
+while i<30_000_000 # while loop 1
+ short_lived_ary[0] = short_lived # write barrier
+ i+=1
+end
diff --git a/benchmark/bm_vm1_gc_wb_ary_promoted.rb b/benchmark/bm_vm1_gc_wb_ary_promoted.rb
new file mode 100644
index 0000000000..3c8279c956
--- /dev/null
+++ b/benchmark/bm_vm1_gc_wb_ary_promoted.rb
@@ -0,0 +1,14 @@
+long_lived = []
+
+if RUBY_VERSION > "2.2.0"
+ 3.times{ GC.start(full_mark: false, immediate_mark: true, lazy_sweep: false) }
+elsif
+ GC.start
+end
+
+i = 0
+short_lived = ''
+while i<30_000_000 # while loop 1
+ long_lived[0] = short_lived # write barrier
+ i+=1
+end
diff --git a/benchmark/bm_vm1_gc_wb_obj.rb b/benchmark/bm_vm1_gc_wb_obj.rb
new file mode 100644
index 0000000000..a4067af36b
--- /dev/null
+++ b/benchmark/bm_vm1_gc_wb_obj.rb
@@ -0,0 +1,15 @@
+class C
+ attr_accessor :foo
+end
+short_lived_obj = C.new
+
+if RUBY_VERSION >= "2.2.0"
+ GC.start(full_mark: false, immediate_mark: true, lazy_sweep: false)
+end
+
+i = 0
+short_lived = ''
+while i<30_000_000 # while loop 1
+ short_lived_obj.foo = short_lived # write barrier
+ i+=1
+end
diff --git a/benchmark/bm_vm1_gc_wb_obj_promoted.rb b/benchmark/bm_vm1_gc_wb_obj_promoted.rb
new file mode 100644
index 0000000000..eee07a0248
--- /dev/null
+++ b/benchmark/bm_vm1_gc_wb_obj_promoted.rb
@@ -0,0 +1,17 @@
+class C
+ attr_accessor :foo
+end
+long_lived = C.new
+
+if RUBY_VERSION >= "2.2.0"
+ 3.times{ GC.start(full_mark: false, immediate_mark: true, lazy_sweep: false) }
+elsif
+ GC.start
+end
+
+i = 0
+short_lived = ''
+while i<30_000_000 # while loop 1
+ long_lived.foo = short_lived # write barrier
+ i+=1
+end
diff --git a/benchmark/bm_vm1_ivar.rb b/benchmark/bm_vm1_ivar.rb
new file mode 100644
index 0000000000..68a73cf92f
--- /dev/null
+++ b/benchmark/bm_vm1_ivar.rb
@@ -0,0 +1,8 @@
+@a = 1
+
+i = 0
+while i<30_000_000 # while loop 1
+ i += 1
+ j = @a
+ k = @a
+end
diff --git a/benchmark/bm_vm1_ivar_set.rb b/benchmark/bm_vm1_ivar_set.rb
new file mode 100644
index 0000000000..bd81b06c34
--- /dev/null
+++ b/benchmark/bm_vm1_ivar_set.rb
@@ -0,0 +1,6 @@
+i = 0
+while i<30_000_000 # while loop 1
+ i += 1
+ @a = 1
+ @b = 2
+end
diff --git a/benchmark/bm_vm1_length.rb b/benchmark/bm_vm1_length.rb
new file mode 100644
index 0000000000..353de3ab0e
--- /dev/null
+++ b/benchmark/bm_vm1_length.rb
@@ -0,0 +1,9 @@
+a = 'abc'
+b = [1, 2, 3]
+i = 0
+while i<30_000_000 # while loop 1
+ i += 1
+ a.length
+ b.length
+end
+
diff --git a/benchmark/bm_vm1_lvar_init.rb b/benchmark/bm_vm1_lvar_init.rb
new file mode 100644
index 0000000000..36f2068811
--- /dev/null
+++ b/benchmark/bm_vm1_lvar_init.rb
@@ -0,0 +1,18 @@
+def m v
+ unless v
+ # unreachable code
+ v1 = v2 = v3 = v4 = v5 = v6 = v7 = v8 = v9 = v10 =
+ v11 = v12 = v13 = v14 = v15 = v16 = v17 = v18 = v19 = v20 =
+ v21 = v22 = v23 = v24 = v25 = v26 = v27 = v28 = v29 = v30 =
+ v31 = v32 = v33 = v34 = v35 = v36 = v37 = v38 = v39 = v40 =
+ v41 = v42 = v43 = v44 = v45 = v46 = v47 = v48 = v49 = v50 = 1
+ end
+end
+
+i = 0
+
+while i<30_000_000 # while loop 1
+ i += 1
+ m i
+end
+
diff --git a/benchmark/bm_vm1_lvar_set.rb b/benchmark/bm_vm1_lvar_set.rb
new file mode 100644
index 0000000000..222e864134
--- /dev/null
+++ b/benchmark/bm_vm1_lvar_set.rb
@@ -0,0 +1,5 @@
+i = 0
+while i<30_000_000 # while loop 1
+ i += 1
+ a = b = c = d = e = f = g = h = j = k = l = m = n = o = p = q = r = 1
+end
diff --git a/benchmark/bm_vm1_neq.rb b/benchmark/bm_vm1_neq.rb
new file mode 100644
index 0000000000..bbb4ae07a4
--- /dev/null
+++ b/benchmark/bm_vm1_neq.rb
@@ -0,0 +1,8 @@
+i = 0
+obj1 = Object.new
+obj2 = Object.new
+
+while i<30_000_000 # while loop 1
+ i += 1
+ obj1 != obj2
+end
diff --git a/benchmark/bm_vm1_not.rb b/benchmark/bm_vm1_not.rb
new file mode 100644
index 0000000000..b09ecdcc21
--- /dev/null
+++ b/benchmark/bm_vm1_not.rb
@@ -0,0 +1,7 @@
+i = 0
+obj = Object.new
+
+while i<30_000_000 # while loop 1
+ i += 1
+ !obj
+end
diff --git a/benchmark/bm_vm1_rescue.rb b/benchmark/bm_vm1_rescue.rb
new file mode 100644
index 0000000000..b0d3e2bdfa
--- /dev/null
+++ b/benchmark/bm_vm1_rescue.rb
@@ -0,0 +1,7 @@
+i = 0
+while i<30_000_000 # while loop 1
+ i += 1
+ begin
+ rescue
+ end
+end
diff --git a/benchmark/bm_vm1_simplereturn.rb b/benchmark/bm_vm1_simplereturn.rb
new file mode 100644
index 0000000000..63f9f21675
--- /dev/null
+++ b/benchmark/bm_vm1_simplereturn.rb
@@ -0,0 +1,9 @@
+def m
+ return 1
+end
+i = 0
+while i<30_000_000 # while loop 1
+ i += 1
+ m
+end
+
diff --git a/benchmark/bm_vm1_swap.rb b/benchmark/bm_vm1_swap.rb
new file mode 100644
index 0000000000..918f8b2112
--- /dev/null
+++ b/benchmark/bm_vm1_swap.rb
@@ -0,0 +1,8 @@
+a = 1
+b = 2
+i = 0
+while i<30_000_000 # while loop 1
+ i += 1
+ a, b = b, a
+end
+
diff --git a/benchmark/bm_vm1_yield.rb b/benchmark/bm_vm1_yield.rb
new file mode 100644
index 0000000000..775597cea6
--- /dev/null
+++ b/benchmark/bm_vm1_yield.rb
@@ -0,0 +1,10 @@
+def m
+ i = 0
+ while i<30_000_000 # while loop 1
+ i += 1
+ yield
+ end
+end
+
+m{}
+
diff --git a/benchmark/bm_vm2_array.rb b/benchmark/bm_vm2_array.rb
new file mode 100644
index 0000000000..df9037c83c
--- /dev/null
+++ b/benchmark/bm_vm2_array.rb
@@ -0,0 +1,5 @@
+i = 0
+while i<6_000_000 # benchmark loop 2
+ i += 1
+ a = [1,2,3,4,5,6,7,8,9,10]
+end
diff --git a/benchmark/bm_vm2_bigarray.rb b/benchmark/bm_vm2_bigarray.rb
new file mode 100644
index 0000000000..b02509d6a2
--- /dev/null
+++ b/benchmark/bm_vm2_bigarray.rb
@@ -0,0 +1,106 @@
+i = 0
+while i<6_000_000 # benchmark loop 2
+ i += 1
+ a = [
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ 1,2,3,4,5,6,7,8,9,10,
+ ]
+end
diff --git a/benchmark/bm_vm2_bighash.rb b/benchmark/bm_vm2_bighash.rb
new file mode 100644
index 0000000000..5e3f437bb8
--- /dev/null
+++ b/benchmark/bm_vm2_bighash.rb
@@ -0,0 +1,5 @@
+i = 0
+while i<60_000 # benchmark loop 2
+ i += 1
+ a = {0=>0, 1=>1, 2=>2, 3=>3, 4=>4, 5=>5, 6=>6, 7=>7, 8=>8, 9=>9, 10=>10, 11=>11, 12=>12, 13=>13, 14=>14, 15=>15, 16=>16, 17=>17, 18=>18, 19=>19, 20=>20, 21=>21, 22=>22, 23=>23, 24=>24, 25=>25, 26=>26, 27=>27, 28=>28, 29=>29, 30=>30, 31=>31, 32=>32, 33=>33, 34=>34, 35=>35, 36=>36, 37=>37, 38=>38, 39=>39, 40=>40, 41=>41, 42=>42, 43=>43, 44=>44, 45=>45, 46=>46, 47=>47, 48=>48, 49=>49, 50=>50, 51=>51, 52=>52, 53=>53, 54=>54, 55=>55, 56=>56, 57=>57, 58=>58, 59=>59, 60=>60, 61=>61, 62=>62, 63=>63, 64=>64, 65=>65, 66=>66, 67=>67, 68=>68, 69=>69, 70=>70, 71=>71, 72=>72, 73=>73, 74=>74, 75=>75, 76=>76, 77=>77, 78=>78, 79=>79, 80=>80, 81=>81, 82=>82, 83=>83, 84=>84, 85=>85, 86=>86, 87=>87, 88=>88, 89=>89, 90=>90, 91=>91, 92=>92, 93=>93, 94=>94, 95=>95, 96=>96, 97=>97, 98=>98, 99=>99, 100=>100, 101=>101, 102=>102, 103=>103, 104=>104, 105=>105, 106=>106, 107=>107, 108=>108, 109=>109, 110=>110, 111=>111, 112=>112, 113=>113, 114=>114, 115=>115, 116=>116, 117=>117, 118=>118, 119=>119, 120=>120, 121=>121, 122=>122, 123=>123, 124=>124, 125=>125, 126=>126, 127=>127, 128=>128, 129=>129, 130=>130, 131=>131, 132=>132, 133=>133, 134=>134, 135=>135, 136=>136, 137=>137, 138=>138, 139=>139, 140=>140, 141=>141, 142=>142, 143=>143, 144=>144, 145=>145, 146=>146, 147=>147, 148=>148, 149=>149, 150=>150, 151=>151, 152=>152, 153=>153, 154=>154, 155=>155, 156=>156, 157=>157, 158=>158, 159=>159, 160=>160, 161=>161, 162=>162, 163=>163, 164=>164, 165=>165, 166=>166, 167=>167, 168=>168, 169=>169, 170=>170, 171=>171, 172=>172, 173=>173, 174=>174, 175=>175, 176=>176, 177=>177, 178=>178, 179=>179, 180=>180, 181=>181, 182=>182, 183=>183, 184=>184, 185=>185, 186=>186, 187=>187, 188=>188, 189=>189, 190=>190, 191=>191, 192=>192, 193=>193, 194=>194, 195=>195, 196=>196, 197=>197, 198=>198, 199=>199, 200=>200, 201=>201, 202=>202, 203=>203, 204=>204, 205=>205, 206=>206, 207=>207, 208=>208, 209=>209, 210=>210, 211=>211, 212=>212, 213=>213, 214=>214, 215=>215, 216=>216, 217=>217, 218=>218, 219=>219, 220=>220, 221=>221, 222=>222, 223=>223, 224=>224, 225=>225, 226=>226, 227=>227, 228=>228, 229=>229, 230=>230, 231=>231, 232=>232, 233=>233, 234=>234, 235=>235, 236=>236, 237=>237, 238=>238, 239=>239, 240=>240, 241=>241, 242=>242, 243=>243, 244=>244, 245=>245, 246=>246, 247=>247, 248=>248, 249=>249, 250=>250, 251=>251, 252=>252, 253=>253, 254=>254, 255=>255, 256=>256, 257=>257, 258=>258, 259=>259, 260=>260, 261=>261, 262=>262, 263=>263, 264=>264, 265=>265, 266=>266, 267=>267, 268=>268, 269=>269, 270=>270, 271=>271, 272=>272, 273=>273, 274=>274, 275=>275, 276=>276, 277=>277, 278=>278, 279=>279, 280=>280, 281=>281, 282=>282, 283=>283, 284=>284, 285=>285, 286=>286, 287=>287, 288=>288, 289=>289, 290=>290, 291=>291, 292=>292, 293=>293, 294=>294, 295=>295, 296=>296, 297=>297, 298=>298, 299=>299, 300=>300, 301=>301, 302=>302, 303=>303, 304=>304, 305=>305, 306=>306, 307=>307, 308=>308, 309=>309, 310=>310, 311=>311, 312=>312, 313=>313, 314=>314, 315=>315, 316=>316, 317=>317, 318=>318, 319=>319, 320=>320, 321=>321, 322=>322, 323=>323, 324=>324, 325=>325, 326=>326, 327=>327, 328=>328, 329=>329, 330=>330, 331=>331, 332=>332, 333=>333, 334=>334, 335=>335, 336=>336, 337=>337, 338=>338, 339=>339, 340=>340, 341=>341, 342=>342, 343=>343, 344=>344, 345=>345, 346=>346, 347=>347, 348=>348, 349=>349, 350=>350, 351=>351, 352=>352, 353=>353, 354=>354, 355=>355, 356=>356, 357=>357, 358=>358, 359=>359, 360=>360, 361=>361, 362=>362, 363=>363, 364=>364, 365=>365, 366=>366, 367=>367, 368=>368, 369=>369, 370=>370, 371=>371, 372=>372, 373=>373, 374=>374, 375=>375, 376=>376, 377=>377, 378=>378, 379=>379, 380=>380, 381=>381, 382=>382, 383=>383, 384=>384, 385=>385, 386=>386, 387=>387, 388=>388, 389=>389, 390=>390, 391=>391, 392=>392, 393=>393, 394=>394, 395=>395, 396=>396, 397=>397, 398=>398, 399=>399, 400=>400, 401=>401, 402=>402, 403=>403, 404=>404, 405=>405, 406=>406, 407=>407, 408=>408, 409=>409, 410=>410, 411=>411, 412=>412, 413=>413, 414=>414, 415=>415, 416=>416, 417=>417, 418=>418, 419=>419, 420=>420, 421=>421, 422=>422, 423=>423, 424=>424, 425=>425, 426=>426, 427=>427, 428=>428, 429=>429, 430=>430, 431=>431, 432=>432, 433=>433, 434=>434, 435=>435, 436=>436, 437=>437, 438=>438, 439=>439, 440=>440, 441=>441, 442=>442, 443=>443, 444=>444, 445=>445, 446=>446, 447=>447, 448=>448, 449=>449, 450=>450, 451=>451, 452=>452, 453=>453, 454=>454, 455=>455, 456=>456, 457=>457, 458=>458, 459=>459, 460=>460, 461=>461, 462=>462, 463=>463, 464=>464, 465=>465, 466=>466, 467=>467, 468=>468, 469=>469, 470=>470, 471=>471, 472=>472, 473=>473, 474=>474, 475=>475, 476=>476, 477=>477, 478=>478, 479=>479, 480=>480, 481=>481, 482=>482, 483=>483, 484=>484, 485=>485, 486=>486, 487=>487, 488=>488, 489=>489, 490=>490, 491=>491, 492=>492, 493=>493, 494=>494, 495=>495, 496=>496, 497=>497, 498=>498, 499=>499, 500=>500,}
+end
diff --git a/benchmark/bm_vm2_case.rb b/benchmark/bm_vm2_case.rb
new file mode 100644
index 0000000000..adc6e4df0a
--- /dev/null
+++ b/benchmark/bm_vm2_case.rb
@@ -0,0 +1,14 @@
+i = 0
+while i<6_000_000 # while loop 2
+ case :foo
+ when :bar
+ raise
+ when :baz
+ raise
+ when :boo
+ raise
+ when :foo
+ i += 1
+ end
+end
+
diff --git a/benchmark/bm_vm2_case_lit.rb b/benchmark/bm_vm2_case_lit.rb
new file mode 100644
index 0000000000..c62b294e0e
--- /dev/null
+++ b/benchmark/bm_vm2_case_lit.rb
@@ -0,0 +1,19 @@
+i = 0
+@ret = [ "foo", true, false, :sym, 6, nil, 0.1, 0xffffffffffffffff ]
+def foo(i)
+ @ret[i % @ret.size]
+end
+
+while i<6_000_000 # while loop 2
+ case foo(i)
+ when "foo" then :foo
+ when true then true
+ when false then false
+ when :sym then :sym
+ when 6 then :fix
+ when nil then nil
+ when 0.1 then :float
+ when 0xffffffffffffffff then :big
+ end
+ i += 1
+end
diff --git a/benchmark/bm_vm2_defined_method.rb b/benchmark/bm_vm2_defined_method.rb
new file mode 100644
index 0000000000..053ed6c912
--- /dev/null
+++ b/benchmark/bm_vm2_defined_method.rb
@@ -0,0 +1,9 @@
+class Object
+ define_method(:m){}
+end
+
+i = 0
+while i<6_000_000 # benchmark loop 2
+ i += 1
+ m; m; m; m; m; m; m; m;
+end
diff --git a/benchmark/bm_vm2_dstr.rb b/benchmark/bm_vm2_dstr.rb
new file mode 100644
index 0000000000..58c0f7bbc3
--- /dev/null
+++ b/benchmark/bm_vm2_dstr.rb
@@ -0,0 +1,6 @@
+i = 0
+x = y = 'z'
+while i<6_000_000 # benchmark loop 2
+ i += 1
+ str = "foo#{x}bar#{y}baz"
+end
diff --git a/benchmark/bm_vm2_eval.rb b/benchmark/bm_vm2_eval.rb
new file mode 100644
index 0000000000..307cfc28ef
--- /dev/null
+++ b/benchmark/bm_vm2_eval.rb
@@ -0,0 +1,6 @@
+i = 0
+while i<6_000_000 # benchmark loop 2
+ i += 1
+ eval("1")
+end
+
diff --git a/benchmark/bm_vm2_method.rb b/benchmark/bm_vm2_method.rb
new file mode 100644
index 0000000000..a8ccff7138
--- /dev/null
+++ b/benchmark/bm_vm2_method.rb
@@ -0,0 +1,9 @@
+def m
+ nil
+end
+
+i = 0
+while i<6_000_000 # benchmark loop 2
+ i += 1
+ m; m; m; m; m; m; m; m;
+end
diff --git a/benchmark/bm_vm2_method_missing.rb b/benchmark/bm_vm2_method_missing.rb
new file mode 100644
index 0000000000..2badc73101
--- /dev/null
+++ b/benchmark/bm_vm2_method_missing.rb
@@ -0,0 +1,12 @@
+class C
+ def method_missing mid
+ end
+end
+
+obj = C.new
+
+i = 0
+while i<6_000_000 # benchmark loop 2
+ i += 1
+ obj.m; obj.m; obj.m; obj.m; obj.m; obj.m; obj.m; obj.m;
+end
diff --git a/benchmark/bm_vm2_method_with_block.rb b/benchmark/bm_vm2_method_with_block.rb
new file mode 100644
index 0000000000..b4efb4f520
--- /dev/null
+++ b/benchmark/bm_vm2_method_with_block.rb
@@ -0,0 +1,9 @@
+def m
+ nil
+end
+
+i = 0
+while i<6_000_000 # benchmark loop 2
+ i += 1
+ m{}; m{}; m{}; m{}; m{}; m{}; m{}; m{};
+end
diff --git a/benchmark/bm_vm2_mutex.rb b/benchmark/bm_vm2_mutex.rb
new file mode 100644
index 0000000000..7362f738c5
--- /dev/null
+++ b/benchmark/bm_vm2_mutex.rb
@@ -0,0 +1,9 @@
+require 'thread'
+
+m = Mutex.new
+
+i = 0
+while i<6_000_000 # benchmark loop 2
+ i += 1
+ m.synchronize{}
+end
diff --git a/benchmark/bm_vm2_newlambda.rb b/benchmark/bm_vm2_newlambda.rb
new file mode 100644
index 0000000000..6422c9b0d0
--- /dev/null
+++ b/benchmark/bm_vm2_newlambda.rb
@@ -0,0 +1,5 @@
+i = 0
+while i<6_000_000 # benchmark loop 2
+ i += 1
+ lambda {}
+end
diff --git a/benchmark/bm_vm2_poly_method.rb b/benchmark/bm_vm2_poly_method.rb
new file mode 100644
index 0000000000..c82c0e4bce
--- /dev/null
+++ b/benchmark/bm_vm2_poly_method.rb
@@ -0,0 +1,20 @@
+class C1
+ def m
+ 1
+ end
+end
+class C2
+ def m
+ 2
+ end
+end
+
+o1 = C1.new
+o2 = C2.new
+
+i = 0
+while i<6_000_000 # benchmark loop 2
+ o = (i % 2 == 0) ? o1 : o2
+ o.m; o.m; o.m; o.m; o.m; o.m; o.m; o.m
+ i += 1
+end
diff --git a/benchmark/bm_vm2_poly_method_ov.rb b/benchmark/bm_vm2_poly_method_ov.rb
new file mode 100644
index 0000000000..aa5fd1dd38
--- /dev/null
+++ b/benchmark/bm_vm2_poly_method_ov.rb
@@ -0,0 +1,20 @@
+class C1
+ def m
+ 1
+ end
+end
+class C2
+ def m
+ 2
+ end
+end
+
+o1 = C1.new
+o2 = C2.new
+
+i = 0
+while i<6_000_000 # benchmark loop 2
+ o = (i % 2 == 0) ? o1 : o2
+# o.m; o.m; o.m; o.m; o.m; o.m; o.m; o.m
+ i += 1
+end
diff --git a/benchmark/bm_vm2_proc.rb b/benchmark/bm_vm2_proc.rb
new file mode 100644
index 0000000000..65e5217371
--- /dev/null
+++ b/benchmark/bm_vm2_proc.rb
@@ -0,0 +1,14 @@
+def m &b
+ b
+end
+
+pr = m{
+ a = 1
+}
+
+i = 0
+while i<6_000_000 # benchmark loop 2
+ i += 1
+ pr.call
+end
+
diff --git a/benchmark/bm_vm2_raise1.rb b/benchmark/bm_vm2_raise1.rb
new file mode 100644
index 0000000000..aa5387987f
--- /dev/null
+++ b/benchmark/bm_vm2_raise1.rb
@@ -0,0 +1,18 @@
+def rec n
+ if n > 0
+ rec n-1
+ else
+ raise
+ end
+end
+
+i = 0
+while i<6_000_000 # benchmark loop 2
+ i += 1
+
+ begin
+ rec 1
+ rescue
+ # ignore
+ end
+end
diff --git a/benchmark/bm_vm2_raise2.rb b/benchmark/bm_vm2_raise2.rb
new file mode 100644
index 0000000000..1f61c63157
--- /dev/null
+++ b/benchmark/bm_vm2_raise2.rb
@@ -0,0 +1,18 @@
+def rec n
+ if n > 0
+ rec n-1
+ else
+ raise
+ end
+end
+
+i = 0
+while i<6_000_000 # benchmark loop 2
+ i += 1
+
+ begin
+ rec 10
+ rescue
+ # ignore
+ end
+end
diff --git a/benchmark/bm_vm2_regexp.rb b/benchmark/bm_vm2_regexp.rb
new file mode 100644
index 0000000000..55f9e957a3
--- /dev/null
+++ b/benchmark/bm_vm2_regexp.rb
@@ -0,0 +1,6 @@
+i = 0
+str = 'xxxhogexxx'
+while i<6_000_000 # benchmark loop 2
+ /hoge/ =~ str
+ i += 1
+end
diff --git a/benchmark/bm_vm2_send.rb b/benchmark/bm_vm2_send.rb
new file mode 100644
index 0000000000..6a3ab6fdab
--- /dev/null
+++ b/benchmark/bm_vm2_send.rb
@@ -0,0 +1,12 @@
+class C
+ def m
+ end
+end
+
+o = C.new
+
+i = 0
+while i<6_000_000 # benchmark loop 2
+ i += 1
+ o.__send__ :m
+end
diff --git a/benchmark/bm_vm2_string_literal.rb b/benchmark/bm_vm2_string_literal.rb
new file mode 100644
index 0000000000..1d73036849
--- /dev/null
+++ b/benchmark/bm_vm2_string_literal.rb
@@ -0,0 +1,5 @@
+i = 0
+while i<6_000_000 # benchmark loop 2
+ i += 1
+ x = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
+end
diff --git a/benchmark/bm_vm2_struct_big_aref_hi.rb b/benchmark/bm_vm2_struct_big_aref_hi.rb
new file mode 100644
index 0000000000..22cb26b0a5
--- /dev/null
+++ b/benchmark/bm_vm2_struct_big_aref_hi.rb
@@ -0,0 +1,7 @@
+s = Struct.new(*('a'..'z').map { |x| x.to_sym })
+x = s.new
+i = 0
+while i<6_000_000 # benchmark loop 2
+ i += 1
+ x.z # x[25]
+end
diff --git a/benchmark/bm_vm2_struct_big_aref_lo.rb b/benchmark/bm_vm2_struct_big_aref_lo.rb
new file mode 100644
index 0000000000..5e61a7087e
--- /dev/null
+++ b/benchmark/bm_vm2_struct_big_aref_lo.rb
@@ -0,0 +1,7 @@
+s = Struct.new(*('a'..'z').map { |x| x.to_sym })
+x = s.new
+i = 0
+while i<6_000_000 # benchmark loop 2
+ i += 1
+ x.k # x[10]
+end
diff --git a/benchmark/bm_vm2_struct_big_aset.rb b/benchmark/bm_vm2_struct_big_aset.rb
new file mode 100644
index 0000000000..5a1c3d16f3
--- /dev/null
+++ b/benchmark/bm_vm2_struct_big_aset.rb
@@ -0,0 +1,7 @@
+s = Struct.new(*('a'..'z').map { |x| x.to_sym })
+x = s.new
+i = 0
+while i<6_000_000 # benchmark loop 2
+ i += 1
+ x.k = i # x[10] = i
+end
diff --git a/benchmark/bm_vm2_struct_big_href_hi.rb b/benchmark/bm_vm2_struct_big_href_hi.rb
new file mode 100644
index 0000000000..fff940a80a
--- /dev/null
+++ b/benchmark/bm_vm2_struct_big_href_hi.rb
@@ -0,0 +1,7 @@
+s = Struct.new(*('a'..'z').map { |x| x.to_sym })
+x = s.new
+i = 0
+while i<6_000_000 # benchmark loop 2
+ i += 1
+ x[:z]
+end
diff --git a/benchmark/bm_vm2_struct_big_href_lo.rb b/benchmark/bm_vm2_struct_big_href_lo.rb
new file mode 100644
index 0000000000..5e4085d59d
--- /dev/null
+++ b/benchmark/bm_vm2_struct_big_href_lo.rb
@@ -0,0 +1,7 @@
+s = Struct.new(*('a'..'z').map { |x| x.to_sym })
+x = s.new
+i = 0
+while i<6_000_000 # benchmark loop 2
+ i += 1
+ x[:k]
+end
diff --git a/benchmark/bm_vm2_struct_big_hset.rb b/benchmark/bm_vm2_struct_big_hset.rb
new file mode 100644
index 0000000000..9c0cee4141
--- /dev/null
+++ b/benchmark/bm_vm2_struct_big_hset.rb
@@ -0,0 +1,7 @@
+s = Struct.new(*('a'..'z').map { |x| x.to_sym })
+x = s.new
+i = 0
+while i<6_000_000 # benchmark loop 2
+ i += 1
+ x[:k] = i
+end
diff --git a/benchmark/bm_vm2_struct_small_aref.rb b/benchmark/bm_vm2_struct_small_aref.rb
new file mode 100644
index 0000000000..8eaa555b41
--- /dev/null
+++ b/benchmark/bm_vm2_struct_small_aref.rb
@@ -0,0 +1,7 @@
+s = Struct.new(:a, :b, :c)
+x = s.new
+i = 0
+while i<6_000_000 # benchmark loop 2
+ i += 1
+ x.a
+end
diff --git a/benchmark/bm_vm2_struct_small_aset.rb b/benchmark/bm_vm2_struct_small_aset.rb
new file mode 100644
index 0000000000..ecd0f95669
--- /dev/null
+++ b/benchmark/bm_vm2_struct_small_aset.rb
@@ -0,0 +1,7 @@
+s = Struct.new(:a, :b, :c)
+x = s.new
+i = 0
+while i<6_000_000 # benchmark loop 2
+ i += 1
+ x.a = i
+end
diff --git a/benchmark/bm_vm2_struct_small_href.rb b/benchmark/bm_vm2_struct_small_href.rb
new file mode 100644
index 0000000000..2c88fee6bf
--- /dev/null
+++ b/benchmark/bm_vm2_struct_small_href.rb
@@ -0,0 +1,7 @@
+s = Struct.new(:a, :b, :c)
+x = s.new
+i = 0
+while i<6_000_000 # benchmark loop 2
+ i += 1
+ x[:a]
+end
diff --git a/benchmark/bm_vm2_struct_small_hset.rb b/benchmark/bm_vm2_struct_small_hset.rb
new file mode 100644
index 0000000000..33c36d20f1
--- /dev/null
+++ b/benchmark/bm_vm2_struct_small_hset.rb
@@ -0,0 +1,7 @@
+s = Struct.new(:a, :b, :c)
+x = s.new
+i = 0
+while i<6_000_000 # benchmark loop 2
+ i += 1
+ x[:a] = 1
+end
diff --git a/benchmark/bm_vm2_super.rb b/benchmark/bm_vm2_super.rb
new file mode 100644
index 0000000000..afd8579e7b
--- /dev/null
+++ b/benchmark/bm_vm2_super.rb
@@ -0,0 +1,20 @@
+
+class C
+ def m
+ 1
+ end
+end
+
+class CC < C
+ def m
+ super()
+ end
+end
+
+obj = CC.new
+
+i = 0
+while i<6_000_000 # benchmark loop 2
+ obj.m
+ i += 1
+end
diff --git a/benchmark/bm_vm2_unif1.rb b/benchmark/bm_vm2_unif1.rb
new file mode 100644
index 0000000000..1774625942
--- /dev/null
+++ b/benchmark/bm_vm2_unif1.rb
@@ -0,0 +1,8 @@
+i = 0
+def m a, b
+end
+
+while i<6_000_000 # benchmark loop 2
+ i += 1
+ m 100, 200
+end
diff --git a/benchmark/bm_vm2_zsuper.rb b/benchmark/bm_vm2_zsuper.rb
new file mode 100644
index 0000000000..2a43e62217
--- /dev/null
+++ b/benchmark/bm_vm2_zsuper.rb
@@ -0,0 +1,20 @@
+i = 0
+
+class C
+ def m a
+ 1
+ end
+end
+
+class CC < C
+ def m a
+ super
+ end
+end
+
+obj = CC.new
+
+while i<6_000_000 # benchmark loop 2
+ obj.m 10
+ i += 1
+end
diff --git a/benchmark/vm3_backtrace.rb b/benchmark/bm_vm3_backtrace.rb
index 0fbf73e1ca..0fbf73e1ca 100644
--- a/benchmark/vm3_backtrace.rb
+++ b/benchmark/bm_vm3_backtrace.rb
diff --git a/benchmark/vm3_clearmethodcache.rb b/benchmark/bm_vm3_clearmethodcache.rb
index 9661323cd2..9661323cd2 100644
--- a/benchmark/vm3_clearmethodcache.rb
+++ b/benchmark/bm_vm3_clearmethodcache.rb
diff --git a/benchmark/vm3_gc.rb b/benchmark/bm_vm3_gc.rb
index e668026915..e668026915 100644
--- a/benchmark/vm3_gc.rb
+++ b/benchmark/bm_vm3_gc.rb
diff --git a/benchmark/vm_symbol_block_pass.rb b/benchmark/bm_vm_symbol_block_pass.rb
index 1d433353e1..1d433353e1 100644
--- a/benchmark/vm_symbol_block_pass.rb
+++ b/benchmark/bm_vm_symbol_block_pass.rb
diff --git a/benchmark/vm_thread_alive_check1.rb b/benchmark/bm_vm_thread_alive_check1.rb
index c993accdda..c993accdda 100644
--- a/benchmark/vm_thread_alive_check1.rb
+++ b/benchmark/bm_vm_thread_alive_check1.rb
diff --git a/benchmark/vm_thread_close.rb b/benchmark/bm_vm_thread_close.rb
index 3e9a265ce8..3e9a265ce8 100644
--- a/benchmark/vm_thread_close.rb
+++ b/benchmark/bm_vm_thread_close.rb
diff --git a/benchmark/vm_thread_create_join.rb b/benchmark/bm_vm_thread_create_join.rb
index 393cd45df9..393cd45df9 100644
--- a/benchmark/vm_thread_create_join.rb
+++ b/benchmark/bm_vm_thread_create_join.rb
diff --git a/benchmark/bm_vm_thread_mutex1.rb b/benchmark/bm_vm_thread_mutex1.rb
new file mode 100644
index 0000000000..5c9f85dfb7
--- /dev/null
+++ b/benchmark/bm_vm_thread_mutex1.rb
@@ -0,0 +1,21 @@
+# one thread, one mutex (no contention)
+
+require 'thread'
+m = Mutex.new
+r = 0
+max = 2000
+lmax = max * max
+(1..1).map{
+ Thread.new{
+ i = 0
+ while i<lmax
+ i += 1
+ m.synchronize{
+ r += 1
+ }
+ end
+ }
+}.each{|e|
+ e.join
+}
+raise r.to_s if r != max * max
diff --git a/benchmark/bm_vm_thread_mutex2.rb b/benchmark/bm_vm_thread_mutex2.rb
new file mode 100644
index 0000000000..10de59054f
--- /dev/null
+++ b/benchmark/bm_vm_thread_mutex2.rb
@@ -0,0 +1,21 @@
+# two threads, one mutex
+
+require 'thread'
+m = Mutex.new
+r = 0
+max = 2000
+lmax = (max * max)/2
+(1..2).map{
+ Thread.new{
+ i = 0
+ while i<lmax
+ i += 1
+ m.synchronize{
+ r += 1
+ }
+ end
+ }
+}.each{|e|
+ e.join
+}
+raise r.to_s if r != max * max
diff --git a/benchmark/bm_vm_thread_mutex3.rb b/benchmark/bm_vm_thread_mutex3.rb
new file mode 100644
index 0000000000..7f9a44b39d
--- /dev/null
+++ b/benchmark/bm_vm_thread_mutex3.rb
@@ -0,0 +1,20 @@
+# 1000 threads, one mutex
+
+require 'thread'
+m = Mutex.new
+r = 0
+max = 2000
+(1..max).map{
+ Thread.new{
+ i = 0
+ while i<max
+ i += 1
+ m.synchronize{
+ r += 1
+ }
+ end
+ }
+}.each{|e|
+ e.join
+}
+raise r.to_s if r != max * max
diff --git a/benchmark/vm_thread_pass.rb b/benchmark/bm_vm_thread_pass.rb
index b5b3c0bc85..b5b3c0bc85 100644
--- a/benchmark/vm_thread_pass.rb
+++ b/benchmark/bm_vm_thread_pass.rb
diff --git a/benchmark/bm_vm_thread_pass_flood.rb b/benchmark/bm_vm_thread_pass_flood.rb
new file mode 100644
index 0000000000..27157d1a6f
--- /dev/null
+++ b/benchmark/bm_vm_thread_pass_flood.rb
@@ -0,0 +1,8 @@
+1000.times{
+ Thread.new{loop{Thread.pass}}
+}
+
+i = 0
+while i<10000
+ i += 1
+end
diff --git a/benchmark/vm_thread_pipe.rb b/benchmark/bm_vm_thread_pipe.rb
index 112a621905..112a621905 100644
--- a/benchmark/vm_thread_pipe.rb
+++ b/benchmark/bm_vm_thread_pipe.rb
diff --git a/benchmark/bm_vm_thread_queue.rb b/benchmark/bm_vm_thread_queue.rb
new file mode 100644
index 0000000000..37381ae62b
--- /dev/null
+++ b/benchmark/bm_vm_thread_queue.rb
@@ -0,0 +1,18 @@
+require 'thread'
+
+n = 1_000_000
+q = Queue.new
+consumer = Thread.new{
+ while q.pop
+ # consuming
+ end
+}
+
+producer = Thread.new{
+ n.times{
+ q.push true
+ }
+ q.push nil
+}
+
+consumer.join
diff --git a/benchmark/dir_empty_p.rb b/benchmark/dir_empty_p.rb
deleted file mode 100644
index 8329c757cf..0000000000
--- a/benchmark/dir_empty_p.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-require 'tmpdir'
-max = 100_000
-Dir.mktmpdir('bm_dir_empty_p') do |dir|
- max.times { Dir.empty?(dir) }
-end
diff --git a/benchmark/driver.rb b/benchmark/driver.rb
new file mode 100644
index 0000000000..defe3c30be
--- /dev/null
+++ b/benchmark/driver.rb
@@ -0,0 +1,400 @@
+#
+# Ruby Benchmark driver
+#
+
+first = true
+
+begin
+ require 'optparse'
+rescue LoadError
+ if first
+ first = false
+ $:.unshift File.join(File.dirname(__FILE__), '../lib')
+ retry
+ else
+ raise
+ end
+end
+
+require 'benchmark'
+require 'pp'
+
+class BenchmarkDriver
+ def self.benchmark(opt)
+ driver = self.new(opt[:execs], opt[:dir], opt)
+ begin
+ driver.run
+ ensure
+ driver.show_results
+ end
+ end
+
+ def self.load(input, type, opt)
+ attrs = [:executables, :results]
+ case type
+ when 'yaml'
+ require 'yaml'
+ h = YAML.load(input)
+ when 'json'
+ require 'json'
+ h = JSON.load(input)
+ else
+ h = eval(input.read)
+ end
+ obj = allocate
+ obj.instance_variable_set("@execs", h[:executables] || h["executables"])
+ obj.instance_variable_set("@results", h[:results] || h["results"])
+ obj.instance_variable_set("@opt", opt)
+ obj
+ end
+
+ def output *args
+ puts(*args)
+ @output and @output.puts(*args)
+ end
+
+ def message *args
+ output(*args) if @verbose
+ end
+
+ def message_print *args
+ if @verbose
+ print(*args)
+ STDOUT.flush
+ @output and @output.print(*args)
+ end
+ end
+
+ def progress_message *args
+ unless STDOUT.tty?
+ STDERR.print(*args)
+ STDERR.flush
+ end
+ end
+
+ def initialize execs, dir, opt = {}
+ @execs = execs.map{|e|
+ e.strip!
+ next if e.empty?
+
+ if /(.+)::(.+)/ =~ e
+ # ex) ruby-a::/path/to/ruby-a
+ label = $1.strip
+ path = $2
+ version = `#{path} -v`.chomp
+ else
+ path = e
+ version = label = `#{path} -v`.chomp
+ end
+ [path, label, version]
+ }.compact
+
+ @dir = dir
+ @repeat = opt[:repeat] || 1
+ @repeat = 1 if @repeat < 1
+ @pattern = opt[:pattern] || nil
+ @exclude = opt[:exclude] || nil
+ @verbose = opt[:quiet] ? false : (opt[:verbose] || false)
+ @output = opt[:output] ? open(opt[:output], 'w') : nil
+ @loop_wl1 = @loop_wl2 = nil
+ @ruby_arg = opt[:ruby_arg] || nil
+ @opt = opt
+
+ # [[name, [[r-1-1, r-1-2, ...], [r-2-1, r-2-2, ...]]], ...]
+ @results = []
+
+ if @verbose
+ @start_time = Time.now
+ message @start_time
+ @execs.each_with_index{|(path, label, version), i|
+ message "target #{i}: " + (label == version ? "#{label}" : "#{label} (#{version})") + " at \"#{path}\""
+ }
+ end
+ end
+
+ def adjusted_results name, results
+ s = nil
+ results.each_with_index{|e, i|
+ r = e.min
+ case name
+ when /^vm1_/
+ if @loop_wl1
+ r -= @loop_wl1[i]
+ r = 0 if r < 0
+ s = '*'
+ end
+ when /^vm2_/
+ if @loop_wl2
+ r -= @loop_wl2[i]
+ r = 0 if r < 0
+ s = '*'
+ end
+ end
+ yield r
+ }
+ s
+ end
+
+ def show_results
+ case @opt[:format]
+ when :tsv
+ strformat = "\t%1$s"
+ numformat = "\t%1$*2$.3f"
+ minwidth = 0
+ name_width = 0
+ when :markdown
+ markdown = true
+ strformat = "|%1$-*2$s"
+ numformat = "|%1$*2$.3f"
+ when :plain
+ strformat = " %1$-*2$s"
+ numformat = " %1$*2$.3f"
+ end
+
+ name_width ||= @results.map {|v,*| v.size}.max
+ minwidth ||= 7
+ width = @execs.map{|(_, v)| [v.size, minwidth].max}
+
+ output
+
+ if @verbose
+ message '-----------------------------------------------------------'
+ message 'raw data:'
+ message
+ message PP.pp(@results, "", 79)
+ message
+ message "Elapsed time: #{Time.now - @start_time} (sec)"
+ end
+
+ if rawdata_output = @opt[:rawdata_output]
+ h = {}
+ h[:cpuinfo] = File.read('/proc/cpuinfo') if File.exist?('/proc/cpuinfo')
+ h[:executables] = @execs
+ h[:results] = @results
+ if (type = File.extname(rawdata_output)).empty?
+ type = rawdata_output
+ rawdata_output = @output.path.sub(/\.[^.\/]+\z/, '') << '.' << rawdata_output
+ end
+ case type
+ when 'yaml'
+ require 'yaml'
+ h = YAML.dump(h)
+ when 'json'
+ require 'json'
+ h = JSON.pretty_generate(h)
+ else
+ require 'pp'
+ h = h.pretty_inspect
+ end
+ open(rawdata_output, 'w') {|f| f.puts h}
+ end
+
+ output '-----------------------------------------------------------'
+ output 'benchmark results:'
+
+ if @verbose and @repeat > 1
+ output "minimum results in each #{@repeat} measurements."
+ end
+
+ output "Execution time (sec)"
+ output if markdown
+ output ["name".ljust(name_width), @execs.map.with_index{|(_, v), i| sprintf(strformat, v, width[i])}].join("").rstrip
+ output ["-"*name_width, width.map{|n|":".rjust(n, "-")}].join("|") if markdown
+ @results.each{|v, result|
+ rets = []
+ s = adjusted_results(v, result){|r|
+ rets << sprintf(numformat, r, width[rets.size])
+ }
+ v += s if s
+ output [v.ljust(name_width), rets].join("")
+ }
+
+ if @execs.size > 1
+ output
+ output "Speedup ratio: compare with the result of `#{@execs[0][1]}' (greater is better)"
+ output if markdown
+ output ["name".ljust(name_width), @execs[1..-1].map.with_index{|(_, v), i| sprintf(strformat, v, width[i])}].join("").rstrip
+ output ["-"*name_width, width[1..-1].map{|n|":".rjust(n, "-")}].join("|") if markdown
+ @results.each{|v, result|
+ rets = []
+ first_value = nil
+ s = adjusted_results(v, result){|r|
+ if first_value
+ if r == 0
+ rets << "Error"
+ else
+ rets << sprintf(numformat, first_value/r, width[rets.size+1])
+ end
+ else
+ first_value = r
+ end
+ }
+ v += s if s
+ output [v.ljust(name_width), rets].join("")
+ }
+ end
+
+ if @opt[:output]
+ output
+ output "Log file: #{@opt[:output]}"
+ end
+ end
+
+ def files
+ flag = {}
+ @files = Dir.glob(File.join(@dir, 'bm*.rb')).map{|file|
+ next if @pattern && /#{@pattern}/ !~ File.basename(file)
+ next if @exclude && /#{@exclude}/ =~ File.basename(file)
+ case file
+ when /bm_(vm[12])_/, /bm_loop_(whileloop2?).rb/
+ flag[$1] = true
+ end
+ file
+ }.compact
+
+ if flag['vm1'] && !flag['whileloop']
+ @files << File.join(@dir, 'bm_loop_whileloop.rb')
+ elsif flag['vm2'] && !flag['whileloop2']
+ @files << File.join(@dir, 'bm_loop_whileloop2.rb')
+ end
+
+ @files.sort!
+ progress_message "total: #{@files.size * @repeat} trial(s) (#{@repeat} trial(s) for #{@files.size} benchmark(s))\n"
+ @files
+ end
+
+ def run
+ files.each_with_index{|file, i|
+ @i = i
+ r = measure_file(file)
+
+ if /bm_loop_whileloop.rb/ =~ file
+ @loop_wl1 = r[1].map{|e| e.min}
+ elsif /bm_loop_whileloop2.rb/ =~ file
+ @loop_wl2 = r[1].map{|e| e.min}
+ end
+ }
+ end
+
+ def measure_file file
+ name = File.basename(file, '.rb').sub(/^bm_/, '')
+ prepare_file = File.join(File.dirname(file), "prepare_#{name}.rb")
+ load prepare_file if FileTest.exist?(prepare_file)
+
+ if @verbose
+ output
+ output '-----------------------------------------------------------'
+ output name
+ output
+ output File.read(file)
+ output
+ end
+
+ result = [name]
+ result << @execs.map{|(e, v)|
+ (0...@repeat).map{
+ message_print "#{v}\t"
+ progress_message '.'
+
+ m = measure(e, file)
+ message "#{m}"
+ m
+ }
+ }
+ @results << result
+ result
+ end
+
+ unless defined?(File::NULL)
+ if File.exist?('/dev/null')
+ File::NULL = '/dev/null'
+ end
+ end
+
+ def measure executable, file
+ cmd = "#{executable} #{@ruby_arg} #{file}"
+
+ m = Benchmark.measure{
+ system(cmd, out: File::NULL)
+ }
+
+ if $? != 0
+ output "\`#{cmd}\' exited with abnormal status (#{$?})"
+ 0
+ else
+ m.real
+ end
+ end
+end
+
+if __FILE__ == $0
+ opt = {
+ :execs => [],
+ :dir => File.dirname(__FILE__),
+ :repeat => 1,
+ :output => nil,
+ :raw_output => nil,
+ :format => :tsv,
+ }
+ formats = {
+ :tsv => ".tsv",
+ :markdown => ".md",
+ :plain => ".txt",
+ }
+
+ parser = OptionParser.new{|o|
+ o.on('-e', '--executables [EXECS]',
+ "Specify benchmark one or more targets (e1::path1; e2::path2; e3::path3;...)"){|e|
+ e.split(/;/).each{|path|
+ opt[:execs] << path
+ }
+ }
+ o.on('-d', '--directory [DIRECTORY]', "Benchmark suites directory"){|d|
+ opt[:dir] = d
+ }
+ o.on('-p', '--pattern [PATTERN]', "Benchmark name pattern"){|p|
+ opt[:pattern] = p
+ }
+ o.on('-x', '--exclude [PATTERN]', "Benchmark exclude pattern"){|e|
+ opt[:exclude] = e
+ }
+ o.on('-r', '--repeat-count [NUM]', "Repeat count"){|n|
+ opt[:repeat] = n.to_i
+ }
+ o.on('-o', '--output-file [FILE]', "Output file"){|f|
+ opt[:output] = f
+ }
+ o.on('--ruby-arg [ARG]', "Optional argument for ruby"){|a|
+ opt[:ruby_arg] = a
+ }
+ o.on('--rawdata-output [FILE]', 'output rawdata'){|r|
+ opt[:rawdata_output] = r
+ }
+ o.on('--load-rawdata=FILE', 'input rawdata'){|r|
+ opt[:rawdata_input] = r
+ }
+ o.on('-f', "--format=FORMAT", "output format (#{formats.keys.join(",")})", formats.keys){|r|
+ opt[:format] = r
+ }
+ o.on('-v', '--verbose'){|v|
+ opt[:verbose] = v
+ }
+ o.on('-q', '--quiet', "Run without notify information except result table."){|q|
+ opt[:quiet] = q
+ opt[:verbose] = false
+ }
+ }
+
+ parser.parse!(ARGV)
+ opt[:output] ||= "bmlog-#{Time.now.strftime('%Y%m%d-%H%M%S')}.#{$$}#{formats[opt[:format]]}"
+
+ if input = opt[:rawdata_input]
+ b = open(input) {|f|
+ BenchmarkDriver.load(f, File.extname(input)[1..-1], opt)
+ }
+ b.show_results
+ else
+ BenchmarkDriver.benchmark(opt)
+ end
+end
+
diff --git a/benchmark/enum_lazy_grep_v_100.rb b/benchmark/enum_lazy_grep_v_100.rb
deleted file mode 100644
index 8832392e65..0000000000
--- a/benchmark/enum_lazy_grep_v_100.rb
+++ /dev/null
@@ -1,4 +0,0 @@
-grep_data = (1..10).to_a * 1000
-N = 100
-enum = grep_data.lazy.grep_v(->(i){i == 0}).grep_v(->(i){i == 0})
-N.times {enum.each {}}
diff --git a/benchmark/enum_lazy_grep_v_20.rb b/benchmark/enum_lazy_grep_v_20.rb
deleted file mode 100644
index 329509fa8f..0000000000
--- a/benchmark/enum_lazy_grep_v_20.rb
+++ /dev/null
@@ -1,4 +0,0 @@
-grep_data = (1..10).to_a * 1000
-N = 100
-enum = grep_data.lazy.grep_v(->(i){i > 2}).grep_v(->(i){i > 2})
-N.times {enum.each {}}
diff --git a/benchmark/enum_lazy_grep_v_50.rb b/benchmark/enum_lazy_grep_v_50.rb
deleted file mode 100644
index 02ea4d4e71..0000000000
--- a/benchmark/enum_lazy_grep_v_50.rb
+++ /dev/null
@@ -1,4 +0,0 @@
-grep_data = (1..10).to_a * 1000
-N = 100
-enum = grep_data.lazy.grep_v(->(i){i > 5}).grep_v(->(i){i > 5})
-N.times {enum.each {}}
diff --git a/benchmark/enum_lazy_uniq_100.rb b/benchmark/enum_lazy_uniq_100.rb
deleted file mode 100644
index 2e6434d9c4..0000000000
--- a/benchmark/enum_lazy_uniq_100.rb
+++ /dev/null
@@ -1,4 +0,0 @@
-uniq_data = (1..10_000).to_a
-N = 100
-enum = uniq_data.lazy.uniq {|i| i % 10000}.uniq {|i| i % 10000}
-N.times {enum.each {}}
diff --git a/benchmark/enum_lazy_uniq_20.rb b/benchmark/enum_lazy_uniq_20.rb
deleted file mode 100644
index 75e6398fee..0000000000
--- a/benchmark/enum_lazy_uniq_20.rb
+++ /dev/null
@@ -1,4 +0,0 @@
-uniq_data = (1..10_000).to_a
-N = 100
-enum = uniq_data.lazy.uniq {|i| i % 2000}.uniq {|i| i % 2000}
-N.times {enum.each {}}
diff --git a/benchmark/enum_lazy_uniq_50.rb b/benchmark/enum_lazy_uniq_50.rb
deleted file mode 100644
index 59a39b78ff..0000000000
--- a/benchmark/enum_lazy_uniq_50.rb
+++ /dev/null
@@ -1,4 +0,0 @@
-uniq_data = (1..10_000).to_a
-N = 100
-enum = uniq_data.lazy.uniq {|i| i % 5000}.uniq {|i| i % 5000}
-N.times {enum.each {}}
diff --git a/benchmark/erb_render.yml b/benchmark/erb_render.yml
deleted file mode 100644
index 15f6c3880b..0000000000
--- a/benchmark/erb_render.yml
+++ /dev/null
@@ -1,24 +0,0 @@
-prelude: |
- require 'erb'
-
- data = <<erb
- <html>
- <head> <%= title %> </head>
- <body>
- <h1> <%= title %> </h1>
- <p>
- <%= content %>
- </p>
- </body>
- </html>
- erb
-
- title = "hello world!"
- content = "hello world!\n" * 10
-
- src = "def self.render(title, content); #{ERB.new(data).src}; end"
- mod = Module.new
- mod.instance_eval(src, "(ERB)")
-benchmark:
- erb_render: mod.render(title, content)
-loop_count: 1500000
diff --git a/benchmark/fiber_chain.rb b/benchmark/fiber_chain.rb
deleted file mode 100755
index 7e0a7f9d45..0000000000
--- a/benchmark/fiber_chain.rb
+++ /dev/null
@@ -1,40 +0,0 @@
-# Check performance of fiber creation and transfer.
-
-def make_link(previous)
- Fiber.new do
- while message = previous.resume
- Fiber.yield(message)
- end
- end
-end
-
-def make_chain(length, &block)
- chain = Fiber.new(&block)
-
- (length - 1).times do
- chain = make_link(chain)
- end
-
- return chain
-end
-
-def run_benchmark(length, repeats, message = :hello)
- chain = nil
-
- chain = make_chain(length) do
- while true
- Fiber.yield(message)
- end
- end
-
- repeats.times do
- abort "invalid result" unless chain.resume == message
- end
-end
-
-n = (ARGV[0] || 1000).to_i
-m = (ARGV[1] || 1000).to_i
-
-5.times do
- run_benchmark(n, m)
-end
diff --git a/benchmark/file_chmod.rb b/benchmark/file_chmod.rb
deleted file mode 100644
index 1cd4760c9d..0000000000
--- a/benchmark/file_chmod.rb
+++ /dev/null
@@ -1,9 +0,0 @@
-# chmod file
-require 'tempfile'
-max = 200_000
-tmp = Tempfile.new('chmod')
-path = tmp.path
-max.times do
- File.chmod(0777, path)
-end
-tmp.close!
diff --git a/benchmark/file_rename.rb b/benchmark/file_rename.rb
deleted file mode 100644
index bbb44aebac..0000000000
--- a/benchmark/file_rename.rb
+++ /dev/null
@@ -1,11 +0,0 @@
-# rename file
-require 'tempfile'
-
-max = 100_000
-tmp = [ Tempfile.new('rename-a'), Tempfile.new('rename-b') ]
-a, b = tmp.map { |x| x.path }
-tmp.each { |t| t.close } # Windows can't rename files without closing them
-max.times do
- File.rename(a, b)
- File.rename(b, a)
-end
diff --git a/benchmark/gc/aobench.rb b/benchmark/gc/aobench.rb
index 275f58b924..2eed7abc83 100644
--- a/benchmark/gc/aobench.rb
+++ b/benchmark/gc/aobench.rb
@@ -1 +1 @@
-require_relative '../app_aobench'
+require_relative '../bm_app_aobench.rb'
diff --git a/benchmark/gc/binary_trees.rb b/benchmark/gc/binary_trees.rb
index 83347cdd20..af8ea722aa 100644
--- a/benchmark/gc/binary_trees.rb
+++ b/benchmark/gc/binary_trees.rb
@@ -1 +1 @@
-require_relative '../so_binary_trees'
+require_relative '../bm_so_binary_trees.rb'
diff --git a/benchmark/gc/gcbench.rb b/benchmark/gc/gcbench.rb
index 23d0b91c6c..09a404466a 100644
--- a/benchmark/gc/gcbench.rb
+++ b/benchmark/gc/gcbench.rb
@@ -3,12 +3,11 @@ require 'pp'
require 'optparse'
$list = true
-$gcprof = false
+$gcprof = true
opt = OptionParser.new
opt.on('-q'){$list = false}
opt.on('-d'){$gcprof = false}
-opt.on('-p'){$gcprof = true}
opt.parse!(ARGV)
script = File.join(File.dirname(__FILE__), ARGV.shift)
diff --git a/benchmark/gc/pentomino.rb b/benchmark/gc/pentomino.rb
index 8ebdff7d1d..94ba74be89 100644
--- a/benchmark/gc/pentomino.rb
+++ b/benchmark/gc/pentomino.rb
@@ -1 +1 @@
-require_relative '../app_pentomino'
+require_relative '../bm_app_pentomino.rb'
diff --git a/benchmark/hash_literal_small2.rb b/benchmark/hash_literal_small2.rb
deleted file mode 100644
index c188529260..0000000000
--- a/benchmark/hash_literal_small2.rb
+++ /dev/null
@@ -1,3 +0,0 @@
-# frozen_string_literal: true
-
-1_000_000.times.map { { "foo" => "bar", "bar" => "baz" } }
diff --git a/benchmark/hash_literal_small4.rb b/benchmark/hash_literal_small4.rb
deleted file mode 100644
index 739f71b5b0..0000000000
--- a/benchmark/hash_literal_small4.rb
+++ /dev/null
@@ -1,3 +0,0 @@
-# frozen_string_literal: true
-
-1_000_000.times.map { { "foo" => "bar", "bar" => "baz", "baz" => "lol", "lol" => "lgtm" } }
diff --git a/benchmark/hash_literal_small8.rb b/benchmark/hash_literal_small8.rb
deleted file mode 100644
index 53d80af535..0000000000
--- a/benchmark/hash_literal_small8.rb
+++ /dev/null
@@ -1,3 +0,0 @@
-# frozen_string_literal: true
-
-1_000_000.times.map { { "foo" => "bar", "bar" => "baz", "baz" => "lol", "lol" => "lgtm", "lgtm" => "nope", "nope" => "ok", "ok" => "again", "again" => "wait" } }
diff --git a/benchmark/hash_long.rb b/benchmark/hash_long.rb
deleted file mode 100644
index 03d9109602..0000000000
--- a/benchmark/hash_long.rb
+++ /dev/null
@@ -1,4 +0,0 @@
-k1 = "Ping Pong Ping Pong Ping Pong Ping Pong Ping Pong Ping Pong Ping Pong Ping Pong Ping Pong Ping Pong";
-k2 = "Pong Ping Pong Ping Pong Ping Pong Ping Pong Ping Pong Ping Pong Ping Pong Ping Pong Ping Pong Ping";
-h = {k1 => 0, k2 => 0};
-3000000.times{|i| k = i % 2 ? k2 : k1; h [k] = h[k] + 1}
diff --git a/benchmark/hash_small2.rb b/benchmark/hash_small2.rb
deleted file mode 100644
index 45485d9c71..0000000000
--- a/benchmark/hash_small2.rb
+++ /dev/null
@@ -1 +0,0 @@
-1000000.times.map{|i| a={}; 2.times{|j| a[j]=j}; a}
diff --git a/benchmark/hash_small4.rb b/benchmark/hash_small4.rb
deleted file mode 100644
index acd4084334..0000000000
--- a/benchmark/hash_small4.rb
+++ /dev/null
@@ -1 +0,0 @@
-1000000.times.map{|i| a={}; 4.times{|j| a[j]=j}; a}
diff --git a/benchmark/hash_small8.rb b/benchmark/hash_small8.rb
deleted file mode 100644
index 9cffcc91b6..0000000000
--- a/benchmark/hash_small8.rb
+++ /dev/null
@@ -1 +0,0 @@
-1000000.times.map{|i| a={}; 8.times{|j| a[j]=j}; a}
diff --git a/benchmark/int_quo.rb b/benchmark/int_quo.rb
deleted file mode 100644
index e22a3f8c30..0000000000
--- a/benchmark/int_quo.rb
+++ /dev/null
@@ -1 +0,0 @@
-5000000.times { 42.quo(3) }
diff --git a/benchmark/io_copy_stream_write.rb b/benchmark/io_copy_stream_write.rb
deleted file mode 100644
index 3fd87250a4..0000000000
--- a/benchmark/io_copy_stream_write.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-# The goal of this is to use a synthetic (non-IO) reader
-# to trigger the read/write loop of IO.copy_stream,
-# bypassing in-kernel mechanisms like sendfile for zero copy,
-# so we wrap the /dev/zero IO object:
-
-class Zero
- def initialize
- @n = 100000
- @in = File.open('/dev/zero', 'rb')
- end
-
- def read(len, buf)
- return if (@n -= 1) == 0
- @in.read(len, buf)
- end
-end
-
-begin
- src = Zero.new
- dst = File.open(IO::NULL, 'wb')
- n = IO.copy_stream(src, dst)
-rescue Errno::ENOENT
- # not *nix
-end if IO.respond_to?(:copy_stream) && IO.const_defined?(:NULL)
diff --git a/benchmark/io_copy_stream_write_socket.rb b/benchmark/io_copy_stream_write_socket.rb
deleted file mode 100644
index 11f369bd0d..0000000000
--- a/benchmark/io_copy_stream_write_socket.rb
+++ /dev/null
@@ -1,35 +0,0 @@
-# The goal of this is to use a synthetic (non-IO) reader
-# to trigger the read/write loop of IO.copy_stream,
-# bypassing in-kernel mechanisms like sendfile for zero copy,
-# so we wrap the /dev/zero IO object:
-class Zero
- def initialize
- @n = 100000
- @in = File.open('/dev/zero', 'rb')
- end
-
- def read(len, buf)
- return if (@n -= 1) == 0
- @in.read(len, buf)
- end
-end
-
-begin
- require 'socket'
- src = Zero.new
- rd, wr = UNIXSocket.pair
- pid = fork do
- wr.close
- buf = String.new
- while rd.read(16384, buf)
- end
- end
- rd.close
- IO.copy_stream(src, wr)
-rescue Errno::ENOENT, NotImplementedError, NameError
- # not *nix: missing /dev/zero, fork, or UNIXSocket
-rescue LoadError # no socket?
-ensure
- wr.close if wr
- Process.waitpid(pid) if pid
-end if IO.respond_to?(:copy_stream)
diff --git a/benchmark/io_pipe_rw.rb b/benchmark/io_pipe_rw.rb
deleted file mode 100644
index 6862a8ae61..0000000000
--- a/benchmark/io_pipe_rw.rb
+++ /dev/null
@@ -1,13 +0,0 @@
-# Measure uncontended GVL performance via read/write with 1:1 threading
-# If we switch to M:N threading, this will benchmark something else...
-r, w = IO.pipe
-src = '0'.freeze
-dst = String.new
-i = 0
-while i < 1_000_000
- i += 1
- w.write(src)
- r.read(1, dst)
-end
-w.close
-r.close
diff --git a/benchmark/lib/benchmark_driver/output/driver.rb b/benchmark/lib/benchmark_driver/output/driver.rb
deleted file mode 100644
index d22236e9fb..0000000000
--- a/benchmark/lib/benchmark_driver/output/driver.rb
+++ /dev/null
@@ -1,36 +0,0 @@
-require 'benchmark_driver/output/simple'
-
-# This replicates the legacy benchmark/driver.rb behavior.
-class BenchmarkDriver::Output::Driver < BenchmarkDriver::Output::Simple
- def initialize(*)
- super
- @stdout = $stdout
- @strio = StringIO.new
- $stdout = IOMultiplexer.new(@stdout, @strio)
- end
-
- def with_benchmark(*)
- super
- ensure
- logfile = "bmlog-#{Time.now.strftime('%Y%m%d-%H%M%S')}.#{$$}.log"
- puts "\nLog file: #{logfile}"
-
- $stdout = @stdout
- File.write(logfile, @strio.tap(&:rewind).read)
- end
-
- class IOMultiplexer
- def initialize(io1, io2)
- @io1 = io1
- @io2 = io2
- end
-
- [:write, :sync, :sync=, :puts, :print, :flush].each do |method|
- define_method(method) do |*args|
- @io1.send(method, *args)
- @io2.send(method, *args)
- end
- end
- end
- private_constant :IOMultiplexer
-end
diff --git a/benchmark/lib/benchmark_driver/runner/cstime.rb b/benchmark/lib/benchmark_driver/runner/cstime.rb
deleted file mode 100644
index 3c3453e527..0000000000
--- a/benchmark/lib/benchmark_driver/runner/cstime.rb
+++ /dev/null
@@ -1,22 +0,0 @@
-require 'benchmark_driver/runner/total'
-
-class BenchmarkDriver::Runner::Cstime < BenchmarkDriver::Runner::Total
- METRIC = BenchmarkDriver::Metric.new(name: 'cstime', unit: 's', larger_better: false)
-
- # JobParser returns this, `BenchmarkDriver::Runner.runner_for` searches "*::Job"
- Job = Class.new(BenchmarkDriver::DefaultJob)
- # Dynamically fetched and used by `BenchmarkDriver::JobParser.parse`
- JobParser = BenchmarkDriver::DefaultJobParser.for(klass: Job, metrics: [METRIC])
-
- private
-
- # Overriding BenchmarkDriver::Runner::Total#metric
- def metric
- METRIC
- end
-
- # Overriding BenchmarkDriver::Runner::Total#target
- def target
- :cstime
- end
-end
diff --git a/benchmark/lib/benchmark_driver/runner/cutime.rb b/benchmark/lib/benchmark_driver/runner/cutime.rb
deleted file mode 100644
index e139962ef2..0000000000
--- a/benchmark/lib/benchmark_driver/runner/cutime.rb
+++ /dev/null
@@ -1,22 +0,0 @@
-require 'benchmark_driver/runner/total'
-
-class BenchmarkDriver::Runner::Cutime < BenchmarkDriver::Runner::Total
- METRIC = BenchmarkDriver::Metric.new(name: 'cutime', unit: 's', larger_better: false)
-
- # JobParser returns this, `BenchmarkDriver::Runner.runner_for` searches "*::Job"
- Job = Class.new(BenchmarkDriver::DefaultJob)
- # Dynamically fetched and used by `BenchmarkDriver::JobParser.parse`
- JobParser = BenchmarkDriver::DefaultJobParser.for(klass: Job, metrics: [METRIC])
-
- private
-
- # Overriding BenchmarkDriver::Runner::Total#metric
- def metric
- METRIC
- end
-
- # Overriding BenchmarkDriver::Runner::Total#target
- def target
- :cutime
- end
-end
diff --git a/benchmark/lib/benchmark_driver/runner/peak.rb b/benchmark/lib/benchmark_driver/runner/peak.rb
deleted file mode 100644
index 0ba8af42c5..0000000000
--- a/benchmark/lib/benchmark_driver/runner/peak.rb
+++ /dev/null
@@ -1,151 +0,0 @@
-require 'benchmark_driver/struct'
-require 'benchmark_driver/metric'
-require 'benchmark_driver/default_job'
-require 'benchmark_driver/default_job_parser'
-require 'tempfile'
-
-class BenchmarkDriver::Runner::Peak
- METRIC = BenchmarkDriver::Metric.new(
- name: 'Peak memory usage', unit: 'bytes', larger_better: false, worse_word: 'larger',
- )
-
- # JobParser returns this, `BenchmarkDriver::Runner.runner_for` searches "*::Job"
- Job = Class.new(BenchmarkDriver::DefaultJob)
- # Dynamically fetched and used by `BenchmarkDriver::JobParser.parse`
- JobParser = BenchmarkDriver::DefaultJobParser.for(klass: Job, metrics: [METRIC])
-
- # @param [BenchmarkDriver::Config::RunnerConfig] config
- # @param [BenchmarkDriver::Output] output
- # @param [BenchmarkDriver::Context] contexts
- def initialize(config:, output:, contexts:)
- @config = config
- @output = output
- @contexts = contexts
- end
-
- # This method is dynamically called by `BenchmarkDriver::JobRunner.run`
- # @param [Array<BenchmarkDriver::Runner::Peak::Job>] jobs
- def run(jobs)
- if jobs.any? { |job| job.loop_count.nil? }
- jobs = jobs.map do |job|
- job.loop_count ? job : Job.new(job.to_h.merge(loop_count: 1))
- end
- end
-
- @output.with_benchmark do
- jobs.each do |job|
- @output.with_job(name: job.name) do
- job.runnable_contexts(@contexts).each do |context|
- value = BenchmarkDriver::Repeater.with_repeat(config: @config, larger_better: false) do
- run_benchmark(job, context: context)
- end
- @output.with_context(name: context.name, executable: context.executable, gems: context.gems, prelude: context.prelude) do
- @output.report(values: { metric => value }, loop_count: job.loop_count)
- end
- end
- end
- end
- end
- end
-
- private
-
- # @param [BenchmarkDriver::Runner::Ips::Job] job - loop_count is not nil
- # @param [BenchmarkDriver::Context] context
- # @return [BenchmarkDriver::Metrics]
- def run_benchmark(job, context:)
- benchmark = BenchmarkScript.new(
- preludes: [context.prelude, job.prelude],
- script: job.script,
- teardown: job.teardown,
- loop_count: job.loop_count,
- )
-
- memory_status = File.expand_path('../../../../test/lib/memory_status', __dir__)
- Tempfile.open(['benchmark_driver-', '.rb']) do |f|
- with_script(benchmark.render) do |path|
- output = IO.popen([*context.executable.command, path, f.path, target, memory_status], &:read)
- if $?.success?
- Integer(f.read)
- else
- $stdout.print(output)
- BenchmarkDriver::Result::ERROR
- end
- end
- end
- end
-
- # Overridden by BenchmarkDriver::Runner::Size
- def target
- 'peak'
- end
-
- # Overridden by BenchmarkDriver::Runner::Size
- def metric
- METRIC
- end
-
- def with_script(script)
- if @config.verbose >= 2
- sep = '-' * 30
- $stdout.puts "\n\n#{sep}[Script begin]#{sep}\n#{script}#{sep}[Script end]#{sep}\n\n"
- end
-
- Tempfile.open(['benchmark_driver-', '.rb']) do |f|
- f.puts script
- f.close
- return yield(f.path)
- end
- end
-
- # @param [String] prelude
- # @param [String] script
- # @param [String] teardown
- # @param [Integer] loop_count
- BenchmarkScript = ::BenchmarkDriver::Struct.new(:preludes, :script, :teardown, :loop_count) do
- def render
- prelude = preludes.reject(&:nil?).reject(&:empty?).join("\n")
- <<-RUBY
-#{prelude}
-#{while_loop(script, loop_count)}
-#{teardown}
-
-result_file, target, memory_status = ARGV
-require_relative memory_status
-
-ms = Memory::Status.new
-case target.to_sym
-when :peak
- key = ms.respond_to?(:hwm) ? :hwm : :peak
-when :size
- key = ms.respond_to?(:rss) ? :rss : :size
-else
- raise('unexpected target: ' + target)
-end
-
-File.write(result_file, ms[key])
- RUBY
- end
-
- private
-
- def while_loop(content, times)
- if !times.is_a?(Integer) || times <= 0
- raise ArgumentError.new("Unexpected times: #{times.inspect}")
- end
-
- if times > 1
- <<-RUBY
-__bmdv_i = 0
-while __bmdv_i < #{times}
- #{content}
- __bmdv_i += 1
-end
- RUBY
- else
- content
- end
- end
- end
- private_constant :BenchmarkScript
-end
diff --git a/benchmark/lib/benchmark_driver/runner/size.rb b/benchmark/lib/benchmark_driver/runner/size.rb
deleted file mode 100644
index 1b31f901c7..0000000000
--- a/benchmark/lib/benchmark_driver/runner/size.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-require 'benchmark_driver/runner/peak'
-
-# Actually the same as BenchmarkDriver::Runner::Memory
-class BenchmarkDriver::Runner::Size < BenchmarkDriver::Runner::Peak
- METRIC = BenchmarkDriver::Metric.new(
- name: 'Max resident set size', unit: 'bytes', larger_better: false, worse_word: 'larger',
- )
-
- # JobParser returns this, `BenchmarkDriver::Runner.runner_for` searches "*::Job"
- Job = Class.new(BenchmarkDriver::DefaultJob)
- # Dynamically fetched and used by `BenchmarkDriver::JobParser.parse`
- JobParser = BenchmarkDriver::DefaultJobParser.for(klass: Job, metrics: [METRIC])
-
- private
-
- # Overriding BenchmarkDriver::Runner::Peak#metric
- def metric
- METRIC
- end
-
- # Overriding BenchmarkDriver::Runner::Peak#target
- def target
- 'size'
- end
-end
diff --git a/benchmark/lib/benchmark_driver/runner/stime.rb b/benchmark/lib/benchmark_driver/runner/stime.rb
deleted file mode 100644
index 4577fb0bf8..0000000000
--- a/benchmark/lib/benchmark_driver/runner/stime.rb
+++ /dev/null
@@ -1,22 +0,0 @@
-require 'benchmark_driver/runner/total'
-
-class BenchmarkDriver::Runner::Stime < BenchmarkDriver::Runner::Total
- METRIC = BenchmarkDriver::Metric.new(name: 'stime', unit: 's', larger_better: false)
-
- # JobParser returns this, `BenchmarkDriver::Runner.runner_for` searches "*::Job"
- Job = Class.new(BenchmarkDriver::DefaultJob)
- # Dynamically fetched and used by `BenchmarkDriver::JobParser.parse`
- JobParser = BenchmarkDriver::DefaultJobParser.for(klass: Job, metrics: [METRIC])
-
- private
-
- # Overriding BenchmarkDriver::Runner::Total#metric
- def metric
- METRIC
- end
-
- # Overriding BenchmarkDriver::Runner::Total#target
- def target
- :stime
- end
-end
diff --git a/benchmark/lib/benchmark_driver/runner/total.rb b/benchmark/lib/benchmark_driver/runner/total.rb
deleted file mode 100644
index 64dc14f84e..0000000000
--- a/benchmark/lib/benchmark_driver/runner/total.rb
+++ /dev/null
@@ -1,137 +0,0 @@
-require 'benchmark_driver/struct'
-require 'benchmark_driver/metric'
-require 'benchmark_driver/default_job'
-require 'benchmark_driver/default_job_parser'
-require 'tempfile'
-
-class BenchmarkDriver::Runner::Total
- METRIC = BenchmarkDriver::Metric.new(name: 'Total time', unit: 's', larger_better: false)
-
- # JobParser returns this, `BenchmarkDriver::Runner.runner_for` searches "*::Job"
- Job = Class.new(BenchmarkDriver::DefaultJob)
- # Dynamically fetched and used by `BenchmarkDriver::JobParser.parse`
- JobParser = BenchmarkDriver::DefaultJobParser.for(klass: Job, metrics: [METRIC])
-
- # @param [BenchmarkDriver::Config::RunnerConfig] config
- # @param [BenchmarkDriver::Output] output
- # @param [BenchmarkDriver::Context] contexts
- def initialize(config:, output:, contexts:)
- @config = config
- @output = output
- @contexts = contexts
- end
-
- # This method is dynamically called by `BenchmarkDriver::JobRunner.run`
- # @param [Array<BenchmarkDriver::Runner::Total::Job>] jobs
- def run(jobs)
- if jobs.any? { |job| job.loop_count.nil? }
- raise 'missing loop_count is not supported in Ruby repository'
- end
-
- @output.with_benchmark do
- jobs.each do |job|
- @output.with_job(name: job.name) do
- job.runnable_contexts(@contexts).each do |context|
- duration = BenchmarkDriver::Repeater.with_repeat(config: @config, larger_better: false) do
- run_benchmark(job, context: context)
- end
- @output.with_context(name: context.name, executable: context.executable, gems: context.gems, prelude: context.prelude) do
- @output.report(values: { metric => duration }, duration: duration, loop_count: job.loop_count)
- end
- end
- end
- end
- end
- end
-
- private
-
- # @param [BenchmarkDriver::Runner::Ips::Job] job - loop_count is not nil
- # @param [BenchmarkDriver::Context] context
- # @return [BenchmarkDriver::Metrics]
- def run_benchmark(job, context:)
- benchmark = BenchmarkScript.new(
- preludes: [context.prelude, job.prelude],
- script: job.script,
- teardown: job.teardown,
- loop_count: job.loop_count,
- )
-
- Tempfile.open(['benchmark_driver-', '.rb']) do |f|
- with_script(benchmark.render(result: f.path, target: target)) do |path|
- IO.popen([*context.executable.command, path], &:read) # TODO: print stdout if verbose=2
- if $?.success?
- Float(f.read)
- else
- BenchmarkDriver::Result::ERROR
- end
- end
- end
- end
-
- # This method is overridden by some subclasses
- def metric
- METRIC
- end
-
- # This method is overridden by some subclasses
- def target
- :total
- end
-
- def with_script(script)
- if @config.verbose >= 2
- sep = '-' * 30
- $stdout.puts "\n\n#{sep}[Script begin]#{sep}\n#{script}#{sep}[Script end]#{sep}\n\n"
- end
-
- Tempfile.open(['benchmark_driver-', '.rb']) do |f|
- f.puts script
- f.close
- return yield(f.path)
- end
- end
-
- # @param [String] prelude
- # @param [String] script
- # @param [String] teardown
- # @param [Integer] loop_count
- BenchmarkScript = ::BenchmarkDriver::Struct.new(:preludes, :script, :teardown, :loop_count) do
- # @param [String] result - A file to write result
- def render(result:, target:)
- prelude = preludes.reject(&:nil?).reject(&:empty?).join("\n")
- <<-RUBY
-#{prelude}
-
-require 'benchmark'
-__bmdv_result = Benchmark.measure {
- #{while_loop(script, loop_count)}
-}
-
-#{teardown}
-
-File.write(#{result.dump}, __bmdv_result.#{target})
- RUBY
- end
-
- private
-
- def while_loop(content, times)
- if !times.is_a?(Integer) || times <= 0
- raise ArgumentError.new("Unexpected times: #{times.inspect}")
- elsif times == 1
- return content
- end
-
- # TODO: execute in batch
- <<-RUBY
-__bmdv_i = 0
-while __bmdv_i < #{times}
- #{content}
- __bmdv_i += 1
-end
- RUBY
- end
- end
- private_constant :BenchmarkScript
-end
diff --git a/benchmark/lib/benchmark_driver/runner/utime.rb b/benchmark/lib/benchmark_driver/runner/utime.rb
deleted file mode 100644
index b61d83a188..0000000000
--- a/benchmark/lib/benchmark_driver/runner/utime.rb
+++ /dev/null
@@ -1,22 +0,0 @@
-require 'benchmark_driver/runner/total'
-
-class BenchmarkDriver::Runner::Utime < BenchmarkDriver::Runner::Total
- METRIC = BenchmarkDriver::Metric.new(name: 'utime', unit: 's', larger_better: false)
-
- # JobParser returns this, `BenchmarkDriver::Runner.runner_for` searches "*::Job"
- Job = Class.new(BenchmarkDriver::DefaultJob)
- # Dynamically fetched and used by `BenchmarkDriver::JobParser.parse`
- JobParser = BenchmarkDriver::DefaultJobParser.for(klass: Job, metrics: [METRIC])
-
- private
-
- # Overriding BenchmarkDriver::Runner::Total#metric
- def metric
- METRIC
- end
-
- # Overriding BenchmarkDriver::Runner::Total#target
- def target
- :utime
- end
-end
diff --git a/benchmark/lib/load.rb b/benchmark/lib/load.rb
deleted file mode 100755
index 4d73a63323..0000000000
--- a/benchmark/lib/load.rb
+++ /dev/null
@@ -1,2 +0,0 @@
-$:.unshift(File.join(__dir__, '../benchmark-driver/lib'))
-require 'benchmark_driver'
diff --git a/benchmark/make_fasta_output.rb b/benchmark/make_fasta_output.rb
new file mode 100644
index 0000000000..b6d787ae27
--- /dev/null
+++ b/benchmark/make_fasta_output.rb
@@ -0,0 +1,19 @@
+# prepare 'fasta.output'
+
+def prepare_fasta_output n
+ filebase = File.join(File.dirname($0), 'fasta.output')
+ script = File.join(File.dirname($0), 'bm_so_fasta.rb')
+ file = "#{filebase}.#{n}"
+
+ unless FileTest.exist?(file)
+ STDERR.puts "preparing #{file}"
+
+ open(file, 'w'){|f|
+ ARGV[0] = n
+ $stdout = f
+ load script
+ $stdout = STDOUT
+ }
+ end
+end
+
diff --git a/benchmark/prepare_require.rb b/benchmark/prepare_require.rb
new file mode 100644
index 0000000000..c4786f04ad
--- /dev/null
+++ b/benchmark/prepare_require.rb
@@ -0,0 +1,25 @@
+require "fileutils"
+
+def prepare
+ num_files = 10000
+
+ basename = File.dirname($0)
+ data_dir = File.join(basename, "bm_require.data")
+
+ # skip if all of files exists
+ if File.exist?(File.join(data_dir, "c#{num_files}.rb"))
+ return
+ end
+
+ FileUtils.mkdir_p(data_dir)
+
+ 1.upto(num_files) do |i|
+ f = File.open("#{data_dir}/c#{i}.rb", "w")
+ f.puts <<-END
+ class C#{i}
+ end
+ END
+ end
+end
+
+prepare
diff --git a/benchmark/prepare_require_thread.rb b/benchmark/prepare_require_thread.rb
new file mode 100644
index 0000000000..339ecb8b39
--- /dev/null
+++ b/benchmark/prepare_require_thread.rb
@@ -0,0 +1,2 @@
+load File.join(File.dirname(__FILE__), "prepare_require.rb")
+
diff --git a/benchmark/prepare_so_count_words.rb b/benchmark/prepare_so_count_words.rb
new file mode 100644
index 0000000000..ee2138cdb2
--- /dev/null
+++ b/benchmark/prepare_so_count_words.rb
@@ -0,0 +1,15 @@
+# prepare 'wc.input'
+
+def prepare_wc_input
+ wcinput = File.join(File.dirname($0), 'wc.input')
+ wcbase = File.join(File.dirname($0), 'wc.input.base')
+ unless FileTest.exist?(wcinput)
+ data = File.read(wcbase)
+ 13.times{
+ data << data
+ }
+ open(wcinput, 'w'){|f| f.write data}
+ end
+end
+
+prepare_wc_input
diff --git a/benchmark/prepare_so_k_nucleotide.rb b/benchmark/prepare_so_k_nucleotide.rb
new file mode 100644
index 0000000000..d83aeb7a7e
--- /dev/null
+++ b/benchmark/prepare_so_k_nucleotide.rb
@@ -0,0 +1,2 @@
+require_relative 'make_fasta_output'
+prepare_fasta_output(100_000)
diff --git a/benchmark/prepare_so_reverse_complement.rb b/benchmark/prepare_so_reverse_complement.rb
new file mode 100644
index 0000000000..da3ec2df14
--- /dev/null
+++ b/benchmark/prepare_so_reverse_complement.rb
@@ -0,0 +1,2 @@
+require_relative 'make_fasta_output'
+prepare_fasta_output(2_500_000)
diff --git a/benchmark/report.rb b/benchmark/report.rb
new file mode 100644
index 0000000000..d2dc56b1e1
--- /dev/null
+++ b/benchmark/report.rb
@@ -0,0 +1,79 @@
+#
+# YARV benchmark driver
+#
+
+require 'yarvutil'
+require 'benchmark'
+require 'rbconfig'
+
+def exec_command type, file, w
+ <<-EOP
+ $DRIVER_PATH = '#{File.dirname($0)}'
+ $LOAD_PATH.replace $LOAD_PATH | #{$LOAD_PATH.inspect}
+ require 'benchmark'
+ require 'yarvutil'
+# print '#{type}'
+ begin
+ puts Benchmark.measure{
+ #{w}('#{file}')
+ }.utime
+ rescue Exception => exec_command_error_variable
+ puts "\t" + exec_command_error_variable.message
+ end
+ EOP
+end
+
+def benchmark cmd
+ rubybin = ENV['RUBY'] || RbConfig.ruby
+
+ IO.popen(rubybin, 'r+'){|io|
+ io.write cmd
+ io.close_write
+ return io.gets
+ }
+end
+
+def ruby_exec file
+ prog = exec_command 'ruby', file, 'load'
+ benchmark prog
+end
+
+def yarv_exec file
+ prog = exec_command 'yarv', file, 'YARVUtil.load_bm'
+ benchmark prog
+end
+
+$wr = $wy = nil
+
+def measure bench
+ file = File.dirname($0) + "/bm_#{bench}.rb"
+ r = ruby_exec(file).to_f
+ y = yarv_exec(file).to_f
+ puts "#{bench}\t#{r}\t#{y}"
+end
+
+def measure2
+ r = ruby_exec.to_f
+ y = yarv_exec.to_f
+ puts r/y
+end
+
+if $0 == __FILE__
+ %w{
+ whileloop
+ whileloop2
+ times
+ const
+ method
+ poly_method
+ block
+ rescue
+ rescue2
+ }.each{|bench|
+ measure bench
+ }
+end
+
+
+
+
diff --git a/benchmark/require.yml b/benchmark/require.yml
deleted file mode 100644
index 711d8e11e9..0000000000
--- a/benchmark/require.yml
+++ /dev/null
@@ -1,36 +0,0 @@
-prelude: |
- require "fileutils"
-
- def prepare
- num_files = 10000
-
- basename = File.dirname($0)
- data_dir = File.join(basename, "bm_require.data")
-
- # skip if all of files exists
- if File.exist?(File.join(data_dir, "c#{num_files}.rb"))
- return
- end
-
- FileUtils.mkdir_p(data_dir)
-
- 1.upto(num_files) do |i|
- f = File.open("#{data_dir}/c#{i}.rb", "w")
- f.puts <<-END
- class C#{i}
- end
- END
- end
- end
-
- prepare
-benchmark:
- require: |
- $:.push File.join(File.dirname(__FILE__), "bm_require.data")
-
- 1.upto(10000) do |i|
- require "c#{i}"
- end
-
- $:.pop
-loop_count: 1
diff --git a/benchmark/require_thread.yml b/benchmark/require_thread.yml
deleted file mode 100644
index 87e0ba888b..0000000000
--- a/benchmark/require_thread.yml
+++ /dev/null
@@ -1,44 +0,0 @@
-prelude: |
- require "fileutils"
-
- def prepare
- num_files = 10000
-
- basename = File.dirname($0)
- data_dir = File.join(basename, "bm_require.data")
-
- # skip if all of files exists
- if File.exist?(File.join(data_dir, "c#{num_files}.rb"))
- return
- end
-
- FileUtils.mkdir_p(data_dir)
-
- 1.upto(num_files) do |i|
- f = File.open("#{data_dir}/c#{i}.rb", "w")
- f.puts <<-END
- class C#{i}
- end
- END
- end
- end
-
- prepare
-benchmark:
- require_thread: |
- $:.push File.join(File.dirname(__FILE__), "bm_require.data")
-
- i=0
- t = Thread.new do
- while true
- i = i+1 # dummy loop
- end
- end
-
- 1.upto(100) do |i|
- require "c#{i}"
- end
-
- $:.pop
- t.kill
-loop_count: 1
diff --git a/benchmark/run.rb b/benchmark/run.rb
new file mode 100644
index 0000000000..0cd2363849
--- /dev/null
+++ b/benchmark/run.rb
@@ -0,0 +1,127 @@
+#
+# Ruby benchmark driver
+#
+
+require 'benchmark'
+require 'rbconfig'
+
+$matzrubyonly = false
+$rubyonly = false
+
+$results = []
+
+# prepare 'wc.input'
+def prepare_wc_input
+ wcinput = File.join(File.dirname($0), 'wc.input')
+ wcbase = File.join(File.dirname($0), 'wc.input.base')
+ unless FileTest.exist?(wcinput)
+ data = File.read(wcbase)
+ 13.times{
+ data << data
+ }
+ open(wcinput, 'w'){|f| f.write data}
+ end
+end
+
+prepare_wc_input
+
+def bm file
+ prog = File.readlines(file).map{|e| e.rstrip}.join("\n")
+ return if prog.empty?
+
+ /[a-z]+_(.+)\.rb/ =~ file
+ bm_name = $1
+ puts '-----------------------------------------------------------' unless $rubyonly || $matzrubyonly
+ puts "#{bm_name}: "
+
+
+puts <<EOS unless $matzrubyonly || $rubyonly
+#{prog}
+--
+EOS
+ begin
+ result = [bm_name]
+ result << matzruby_exec(file) unless $rubyonly
+ result << ruby_exec(file) unless $matzrubyonly
+ $results << result
+
+ rescue Exception => e
+ puts
+ puts "** benchmark failure: #{e}"
+ puts e.backtrace
+ end
+end
+
+def benchmark file, bin
+ m = Benchmark.measure{
+ `#{bin} #{$opts} #{file}`
+ }
+ sec = '%.3f' % m.real
+ puts " #{sec}"
+ sec
+end
+
+def ruby_exec file
+ print 'ruby'
+ benchmark file, $ruby_program
+end
+
+def matzruby_exec file
+ print 'matz'
+ rubylib = ENV['RUBYLIB']
+ ENV['RUBYLIB'] = ''
+ r = benchmark file, $matzruby_program
+ ENV['RUBYLIB'] = rubylib
+ r
+end
+
+if $0 == __FILE__
+ ARGV.each{|arg|
+ case arg
+ when /\A--ruby=(.+)/
+ $ruby_program = $1
+ when /\A--matzruby=(.+)/
+ $matzruby_program = $1
+ when /\A--opts=(.+)/
+ $opts = $1
+ when /\A(-r|--only-ruby)\z/
+ $rubyonly = true
+ when /\A(-m|--only-matzruby)\z/
+ $matzrubyonly = true
+ end
+ }
+ ARGV.delete_if{|arg|
+ /\A-/ =~ arg
+ }
+
+ puts "MatzRuby:"
+ system("#{$matzruby_program} -v")
+ puts "Ruby:"
+ system("#{$ruby_program} -v")
+ puts
+
+ if ARGV.empty?
+ Dir.glob(File.dirname(__FILE__) + '/bm_*.rb').sort.each{|file|
+ bm file
+ }
+ else
+ ARGV.each{|file|
+ Dir.glob(File.join(File.dirname(__FILE__), file + '*')){|ef|
+ # file = "#{File.dirname(__FILE__)}/#{file}.rb"
+ bm ef
+ }
+ }
+ end
+
+ puts
+ puts "-- benchmark summary ---------------------------"
+ $results.each{|res|
+ print res.shift, "\t"
+ (res||[]).each{|result|
+ /([\d\.]+)/ =~ result
+ print $1 + "\t" if $1
+ }
+ puts
+ }
+end
+
diff --git a/benchmark/runc.rb b/benchmark/runc.rb
new file mode 100644
index 0000000000..97c5cef045
--- /dev/null
+++ b/benchmark/runc.rb
@@ -0,0 +1,27 @@
+#
+#
+#
+
+require 'benchmark'
+require 'rbconfig'
+
+$rubybin = ENV['RUBY'] || RbConfig.ruby
+
+def runfile file
+ puts file
+ file = File.join(File.dirname($0), 'contrib', file)
+ Benchmark.bm{|x|
+ x.report('ruby'){
+ system("#{$rubybin} #{file}")
+ }
+ x.report('yarv'){
+ system("#{$rubybin} -rite -I.. #{file}")
+ }
+ }
+end
+
+ARGV.each{|file|
+ runfile file
+}
+
+
diff --git a/benchmark/so_count_words.yml b/benchmark/so_count_words.yml
deleted file mode 100644
index d0a6c8dd3e..0000000000
--- a/benchmark/so_count_words.yml
+++ /dev/null
@@ -1,66 +0,0 @@
-prelude: |
- #!/usr/bin/ruby
- # -*- mode: ruby -*-
-
- wc_input_base = <<EOS
- Subject: Re: Who was Izchak Miller?
- From: "Jane D. Anonymous" <nobody@yale.edu>
- Date: 1996/04/28
- Message-Id: <4lv7bc$oh@news.ycc.yale.edu>
- References: <317C405E.5DFA@panix.com> <4lk6vl$gde@ns.oar.net>
- To: 75176.2330@compuserve.com
- Content-Type: text/plain; charset=us-ascii
- Organization: Yale University
- X-Url: news:4lk6vl$gde@ns.oar.net
- Mime-Version: 1.0
- Newsgroups: rec.games.roguelike.nethack
- X-Mailer: Mozilla 1.1N (Macintosh; I; 68K)
-
- Hello there, Izchak Miller was my father. When I was younger I spent
- many a night, hunched over the keyboard with a cup of tea, playing
- nethack with him and my brother. my dad was a philosopher with a strong
- weakness for fantasy/sci fi. I remember when he started to get involved
- with the Nethack team- my brother's Dungeons and Dragons monster book
- found a regular place beside my dad's desk. it's nice to see him living
- on in the game he loved so much :-).
- Tamar Miller
-
- The following is a really long word of 5000 characters:
-
- wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
- EOS
-
- # prepare 'wc.input'
-
- def prepare_wc_input(wcbase)
- wcinput = File.join(File.dirname($0), 'wc.input')
- unless FileTest.exist?(wcinput)
- data = wcbase.dup
- 13.times{
- data << data
- }
- open(wcinput, 'w'){|f| f.write data}
- end
- end
-
- prepare_wc_input(wc_input_base)
-
-benchmark:
- so_count_words: |
- # $Id: wc-ruby.code,v 1.4 2004/11/13 07:43:32 bfulgham Exp $
- # http://www.bagley.org/~doug/shootout/
- # with help from Paul Brannan
- input = open(File.join(File.dirname($0), 'wc.input'), 'rb')
-
- nl = nw = nc = 0
- while true
- tmp = input.read(4096) or break
- data = tmp << (input.gets || "")
- nc += data.length
- nl += data.count("\n")
- ((data.strip! || data).tr!("\n", " ") || data).squeeze!
- nw += data.count(" ") + 1
- end
- # STDERR.puts "#{nl} #{nw} #{nc}"
-
-loop_count: 1
diff --git a/benchmark/so_fasta.rb b/benchmark/so_fasta.rb
deleted file mode 100644
index dcc6b39507..0000000000
--- a/benchmark/so_fasta.rb
+++ /dev/null
@@ -1,81 +0,0 @@
-# The Computer Language Shootout
-# http://shootout.alioth.debian.org/
-# Contributed by Sokolov Yura
-
-$last = 42.0
-def gen_random(max, im=139968, ia=3877, ic=29573)
- (max * ($last = ($last * ia + ic) % im)) / im
-end
-
-alu =
- "GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGG"+
- "GAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGA"+
- "CCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAAT"+
- "ACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCA"+
- "GCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG"+
- "AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC"+
- "AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA"
-
-iub = [
- ["a", 0.27],
- ["c", 0.12],
- ["g", 0.12],
- ["t", 0.27],
-
- ["B", 0.02],
- ["D", 0.02],
- ["H", 0.02],
- ["K", 0.02],
- ["M", 0.02],
- ["N", 0.02],
- ["R", 0.02],
- ["S", 0.02],
- ["V", 0.02],
- ["W", 0.02],
- ["Y", 0.02],
-]
-homosapiens = [
- ["a", 0.3029549426680],
- ["c", 0.1979883004921],
- ["g", 0.1975473066391],
- ["t", 0.3015094502008],
-]
-
-def make_repeat_fasta(id, desc, src, n)
- puts ">#{id} #{desc}"
- v = nil
- width = 60
- l = src.length
- s = src * ((n / l) + 1)
- s.slice!(n, l)
- puts(s.scan(/.{1,#{width}}/).join("\n"))
-end
-
-def make_random_fasta(id, desc, table, n)
- puts ">#{id} #{desc}"
- rand, v = nil,nil
- width = 60
- chunk = 1 * width
- prob = 0.0
- table.each{|v| v[1]= (prob += v[1])}
- for i in 1..(n/width)
- puts((1..width).collect{
- rand = gen_random(1.0)
- table.find{|v| v[1]>rand}[0]
- }.join)
- end
- if n%width != 0
- puts((1..(n%width)).collect{
- rand = gen_random(1.0)
- table.find{|v| v[1]>rand}[0]
- }.join)
- end
-end
-
-
-n = (ARGV[0] or 250_000).to_i
-
-make_repeat_fasta('ONE', 'Homo sapiens alu', alu, n*2)
-make_random_fasta('TWO', 'IUB ambiguity codes', iub, n*3)
-make_random_fasta('THREE', 'Homo sapiens frequency', homosapiens, n*5)
-
diff --git a/benchmark/so_k_nucleotide.yml b/benchmark/so_k_nucleotide.yml
deleted file mode 100644
index d7df086c39..0000000000
--- a/benchmark/so_k_nucleotide.yml
+++ /dev/null
@@ -1,155 +0,0 @@
-prelude: |
- bm_so_fasta = <<'EOS'
- # The Computer Language Shootout
- # http://shootout.alioth.debian.org/
- # Contributed by Sokolov Yura
-
- $last = 42.0
- def gen_random(max, im=139968, ia=3877, ic=29573)
- (max * ($last = ($last * ia + ic) % im)) / im
- end
-
- alu =
- "GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGG"+
- "GAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGA"+
- "CCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAAT"+
- "ACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCA"+
- "GCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG"+
- "AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC"+
- "AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA"
-
- iub = [
- ["a", 0.27],
- ["c", 0.12],
- ["g", 0.12],
- ["t", 0.27],
-
- ["B", 0.02],
- ["D", 0.02],
- ["H", 0.02],
- ["K", 0.02],
- ["M", 0.02],
- ["N", 0.02],
- ["R", 0.02],
- ["S", 0.02],
- ["V", 0.02],
- ["W", 0.02],
- ["Y", 0.02],
- ]
- homosapiens = [
- ["a", 0.3029549426680],
- ["c", 0.1979883004921],
- ["g", 0.1975473066391],
- ["t", 0.3015094502008],
- ]
-
- def make_repeat_fasta(id, desc, src, n)
- puts ">#{id} #{desc}"
- v = nil
- width = 60
- l = src.length
- s = src * ((n / l) + 1)
- s.slice!(n, l)
- puts(s.scan(/.{1,#{width}}/).join("\n"))
- end
-
- def make_random_fasta(id, desc, table, n)
- puts ">#{id} #{desc}"
- rand, v = nil,nil
- width = 60
- chunk = 1 * width
- prob = 0.0
- table.each{|v| v[1]= (prob += v[1])}
- for i in 1..(n/width)
- puts((1..width).collect{
- rand = gen_random(1.0)
- table.find{|v| v[1]>rand}[0]
- }.join)
- end
- if n%width != 0
- puts((1..(n%width)).collect{
- rand = gen_random(1.0)
- table.find{|v| v[1]>rand}[0]
- }.join)
- end
- end
-
-
- n = (ARGV[0] or 250_000).to_i
-
- make_repeat_fasta('ONE', 'Homo sapiens alu', alu, n*2)
- make_random_fasta('TWO', 'IUB ambiguity codes', iub, n*3)
- make_random_fasta('THREE', 'Homo sapiens frequency', homosapiens, n*5)
- EOS
-benchmark:
- - name: so_k_nucleotide
- prelude: |
- script = File.join(File.dirname($0), 'bm_so_fasta.rb')
- File.write(script, bm_so_fasta)
-
- def prepare_fasta_output n
- filebase = File.join(File.dirname($0), 'fasta.output')
- script = File.join(File.dirname($0), 'bm_so_fasta.rb')
- file = "#{filebase}.#{n}"
-
- unless FileTest.exist?(file)
- STDERR.puts "preparing #{file}"
-
- open(file, 'w'){|f|
- ARGV[0] = n
- $stdout = f
- load script
- $stdout = STDOUT
- }
- end
- end
- prepare_fasta_output(100_000)
- script: |
- # The Computer Language Shootout
- # http://shootout.alioth.debian.org
- #
- # contributed by jose fco. gonzalez
- # modified by Sokolov Yura
-
- seq = String.new
-
- def frecuency( seq,length )
- n, table = seq.length - length + 1, Hash.new(0)
- f, i = nil, nil
- (0 ... length).each do |f|
- (f ... n).step(length) do |i|
- table[seq[i,length]] += 1
- end
- end
- [n,table]
-
- end
-
- def sort_by_freq( seq,length )
- n,table = frecuency( seq,length )
- a, b, v = nil, nil, nil
- table.sort{|a,b| b[1] <=> a[1]}.each do |v|
- puts "%s %.3f" % [v[0].upcase,((v[1]*100).to_f/n)]
- end
- puts
- end
-
- def find_seq( seq,s )
- n,table = frecuency( seq,s.length )
- puts "#{table[s].to_s}\t#{s.upcase}"
- end
-
- input = open(File.join(File.dirname($0), 'fasta.output.100000'), 'rb')
-
- line = input.gets while line !~ /^>THREE/
- line = input.gets
-
- while (line !~ /^>/) & line do
- seq << line.chomp
- line = input.gets
- end
-
- [1,2].each {|i| sort_by_freq( seq,i ) }
-
- %w(ggt ggta ggtatt ggtattttaatt ggtattttaatttatagt).each{|s| find_seq( seq,s) }
- loop_count: 1
diff --git a/benchmark/so_meteor_contest.rb b/benchmark/so_meteor_contest.rb
deleted file mode 100644
index 8c136baa6c..0000000000
--- a/benchmark/so_meteor_contest.rb
+++ /dev/null
@@ -1,563 +0,0 @@
-#!/usr/bin/env ruby
-#
-# The Computer Language Shootout
-# http://shootout.alioth.debian.org
-# contributed by Kevin Barnes (Ruby novice)
-
-# PROGRAM: the main body is at the bottom.
-# 1) read about the problem here: http://www-128.ibm.com/developerworks/java/library/j-javaopt/
-# 2) see how I represent a board as a bitmask by reading the blank_board comments
-# 3) read as your mental paths take you
-
-def print *args
-end
-
-# class to represent all information about a particular rotation of a particular piece
-class Rotation
- # an array (by location) containing a bit mask for how the piece maps at the given location.
- # if the rotation is invalid at that location the mask will contain false
- attr_reader :start_masks
-
- # maps a direction to a relative location. these differ depending on whether it is an even or
- # odd row being mapped from
- @@rotation_even_adder = { :west => -1, :east => 1, :nw => -7, :ne => -6, :sw => 5, :se => 6 }
- @@rotation_odd_adder = { :west => -1, :east => 1, :nw => -6, :ne => -5, :sw => 6, :se => 7 }
-
- def initialize( directions )
- @even_offsets, @odd_offsets = normalize_offsets( get_values( directions ))
-
- @even_mask = mask_for_offsets( @even_offsets)
- @odd_mask = mask_for_offsets( @odd_offsets)
-
- @start_masks = Array.new(60)
-
- # create the rotational masks by placing the base mask at the location and seeing if
- # 1) it overlaps the boundaries and 2) it produces a prunable board. if either of these
- # is true the piece cannot be placed
- 0.upto(59) do | offset |
- mask = is_even(offset) ? (@even_mask << offset) : (@odd_mask << offset)
- if (blank_board & mask == 0 && !prunable(blank_board | mask, 0, true)) then
- imask = compute_required( mask, offset)
- @start_masks[offset] = [ mask, imask, imask | mask ]
- else
- @start_masks[offset] = false
- end
- end
- end
-
- def compute_required( mask, offset )
- board = blank_board
- 0.upto(offset) { | i | board |= 1 << i }
- board |= mask
- return 0 if (!prunable(board | mask, offset))
- board = flood_fill(board,58)
- count = 0
- imask = 0
- 0.upto(59) do | i |
- if (board[i] == 0) then
- imask |= (1 << i)
- count += 1
- end
- end
- (count > 0 && count < 5) ? imask : 0
- end
-
- def flood_fill( board, location)
- return board if (board[location] == 1)
- board |= 1 << location
- row, col = location.divmod(6)
- board = flood_fill( board, location - 1) if (col > 0)
- board = flood_fill( board, location + 1) if (col < 4)
- if (row % 2 == 0) then
- board = flood_fill( board, location - 7) if (col > 0 && row > 0)
- board = flood_fill( board, location - 6) if (row > 0)
- board = flood_fill( board, location + 6) if (row < 9)
- board = flood_fill( board, location + 5) if (col > 0 && row < 9)
- else
- board = flood_fill( board, location - 5) if (col < 4 && row > 0)
- board = flood_fill( board, location - 6) if (row > 0)
- board = flood_fill( board, location + 6) if (row < 9)
- board = flood_fill( board, location + 7) if (col < 4 && row < 9)
- end
- board
- end
-
- # given a location, produces a list of relative locations covered by the piece at this rotation
- def offsets( location)
- if is_even( location) then
- @even_offsets.collect { | value | value + location }
- else
- @odd_offsets.collect { | value | value + location }
- end
- end
-
- # returns a set of offsets relative to the top-left most piece of the rotation (by even or odd rows)
- # this is hard to explain. imagine we have this partial board:
- # 0 0 0 0 0 x [positions 0-5]
- # 0 0 1 1 0 x [positions 6-11]
- # 0 0 1 0 0 x [positions 12-17]
- # 0 1 0 0 0 x [positions 18-23]
- # 0 1 0 0 0 x [positions 24-29]
- # 0 0 0 0 0 x [positions 30-35]
- # ...
- # The top-left of the piece is at position 8, the
- # board would be passed as a set of positions (values array) containing [8,9,14,19,25] not necessarily in that
- # sorted order. Since that array starts on an odd row, the offsets for an odd row are: [0,1,6,11,17] obtained
- # by subtracting 8 from everything. Now imagine the piece shifted up and to the right so it's on an even row:
- # 0 0 0 1 1 x [positions 0-5]
- # 0 0 1 0 0 x [positions 6-11]
- # 0 0 1 0 0 x [positions 12-17]
- # 0 1 0 0 0 x [positions 18-23]
- # 0 0 0 0 0 x [positions 24-29]
- # 0 0 0 0 0 x [positions 30-35]
- # ...
- # Now the positions are [3,4,8,14,19] which after subtracting the lowest value (3) gives [0,1,5,11,16] thus, the
- # offsets for this particular piece are (in even, odd order) [0,1,5,11,16],[0,1,6,11,17] which is what
- # this function would return
- def normalize_offsets( values)
- min = values.min
- even_min = is_even(min)
- other_min = even_min ? min + 6 : min + 7
- other_values = values.collect do | value |
- if is_even(value) then
- value + 6 - other_min
- else
- value + 7 - other_min
- end
- end
- values.collect! { | value | value - min }
-
- if even_min then
- [values, other_values]
- else
- [other_values, values]
- end
- end
-
- # produce a bitmask representation of an array of offset locations
- def mask_for_offsets( offsets )
- mask = 0
- offsets.each { | value | mask = mask + ( 1 << value ) }
- mask
- end
-
- # finds a "safe" position that a position as described by a list of directions can be placed
- # without falling off any edge of the board. the values returned a location to place the first piece
- # at so it will fit after making the described moves
- def start_adjust( directions )
- south = east = 0;
- directions.each do | direction |
- east += 1 if ( direction == :sw || direction == :nw || direction == :west )
- south += 1 if ( direction == :nw || direction == :ne )
- end
- south * 6 + east
- end
-
- # given a set of directions places the piece (as defined by a set of directions) on the board at
- # a location that will not take it off the edge
- def get_values( directions )
- start = start_adjust(directions)
- values = [ start ]
- directions.each do | direction |
- if (start % 12 >= 6) then
- start += @@rotation_odd_adder[direction]
- else
- start += @@rotation_even_adder[direction]
- end
- values += [ start ]
- end
-
- # some moves take you back to an existing location, we'll strip duplicates
- values.uniq
- end
-end
-
-# describes a piece and caches information about its rotations to as to be efficient for iteration
-# ATTRIBUTES:
-# rotations -- all the rotations of the piece
-# type -- a numeic "name" of the piece
-# masks -- an array by location of all legal rotational masks (a n inner array) for that location
-# placed -- the mask that this piece was last placed at (not a location, but the actual mask used)
-class Piece
- attr_reader :rotations, :type, :masks
- attr_accessor :placed
-
- # transform hashes that change one direction into another when you either flip or rotate a set of directions
- @@flip_converter = { :west => :west, :east => :east, :nw => :sw, :ne => :se, :sw => :nw, :se => :ne }
- @@rotate_converter = { :west => :nw, :east => :se, :nw => :ne, :ne => :east, :sw => :west, :se => :sw }
-
- def initialize( directions, type )
- @type = type
- @rotations = Array.new();
- @map = {}
-
- generate_rotations( directions )
- directions.collect! { | value | @@flip_converter[value] }
- generate_rotations( directions )
-
- # creates the masks AND a map that returns [location, rotation] for any given mask
- # this is used when a board is found and we want to draw it, otherwise the map is unused
- @masks = Array.new();
- 0.upto(59) do | i |
- even = true
- @masks[i] = @rotations.collect do | rotation |
- mask = rotation.start_masks[i]
- @map[mask[0]] = [ i, rotation ] if (mask)
- mask || nil
- end
- @masks[i].compact!
- end
- end
-
- # rotates a set of directions through all six angles and adds a Rotation to the list for each one
- def generate_rotations( directions )
- 6.times do
- rotations.push( Rotation.new(directions))
- directions.collect! { | value | @@rotate_converter[value] }
- end
- end
-
- # given a board string, adds this piece to the board at whatever location/rotation
- # important: the outbound board string is 5 wide, the normal location notation is six wide (padded)
- def fill_string( board_string)
- location, rotation = @map[@placed]
- rotation.offsets(location).each do | offset |
- row, col = offset.divmod(6)
- board_string[ row*5 + col, 1 ] = @type.to_s
- end
- end
-end
-
-# a blank bit board having this form:
-#
-# 0 0 0 0 0 1
-# 0 0 0 0 0 1
-# 0 0 0 0 0 1
-# 0 0 0 0 0 1
-# 0 0 0 0 0 1
-# 0 0 0 0 0 1
-# 0 0 0 0 0 1
-# 0 0 0 0 0 1
-# 0 0 0 0 0 1
-# 0 0 0 0 0 1
-# 1 1 1 1 1 1
-#
-# where left lest significant bit is the top left and the most significant is the lower right
-# the actual board only consists of the 0 places, the 1 places are blockers to keep things from running
-# off the edges or bottom
-def blank_board
- 0b111111100000100000100000100000100000100000100000100000100000100000
-end
-
-def full_board
- 0b111111111111111111111111111111111111111111111111111111111111111111
-end
-
-# determines if a location (bit position) is in an even row
-def is_even( location)
- (location % 12) < 6
-end
-
-# support function that create three utility maps:
-# $converter -- for each row an array that maps a five bit row (via array mapping)
-# to the a five bit representation of the bits below it
-# $bit_count -- maps a five bit row (via array mapping) to the number of 1s in the row
-# @@new_regions -- maps a five bit row (via array mapping) to an array of "region" arrays
-# a region array has three values the first is a mask of bits in the region,
-# the second is the count of those bits and the third is identical to the first
-# examples:
-# 0b10010 => [ 0b01100, 2, 0b01100 ], [ 0b00001, 1, 0b00001]
-# 0b01010 => [ 0b10000, 1, 0b10000 ], [ 0b00100, 1, 0b00100 ], [ 0b00001, 1, 0b00001]
-# 0b10001 => [ 0b01110, 3, 0b01110 ]
-def create_collector_support
- odd_map = [0b11, 0b110, 0b1100, 0b11000, 0b10000]
- even_map = [0b1, 0b11, 0b110, 0b1100, 0b11000]
-
- all_odds = Array.new(0b100000)
- all_evens = Array.new(0b100000)
- bit_counts = Array.new(0b100000)
- new_regions = Array.new(0b100000)
- 0.upto(0b11111) do | i |
- bit_count = odd = even = 0
- 0.upto(4) do | bit |
- if (i[bit] == 1) then
- bit_count += 1
- odd |= odd_map[bit]
- even |= even_map[bit]
- end
- end
- all_odds[i] = odd
- all_evens[i] = even
- bit_counts[i] = bit_count
- new_regions[i] = create_regions( i)
- end
-
- $converter = []
- 10.times { | row | $converter.push((row % 2 == 0) ? all_evens : all_odds) }
- $bit_counts = bit_counts
- $regions = new_regions.collect { | set | set.collect { | value | [ value, bit_counts[value], value] } }
-end
-
-# determines if a board is punable, meaning that there is no possibility that it
-# can be filled up with pieces. A board is prunable if there is a grouping of unfilled spaces
-# that are not a multiple of five. The following board is an example of a prunable board:
-# 0 0 1 0 0
-# 0 1 0 0 0
-# 1 1 0 0 0
-# 0 1 0 0 0
-# 0 0 0 0 0
-# ...
-#
-# This board is prunable because the top left corner is only 3 bits in area, no piece will ever fit it
-# parameters:
-# board -- an initial bit board (6 bit padded rows, see blank_board for format)
-# location -- starting location, everything above and to the left is already full
-# slotting -- set to true only when testing initial pieces, when filling normally
-# additional assumptions are possible
-#
-# Algorithm:
-# The algorithm starts at the top row (as determined by location) and iterates a row at a time
-# maintainng counts of active open areas (kept in the collector array) each collector contains
-# three values at the start of an iteration:
-# 0: mask of bits that would be adjacent to the collector in this row
-# 1: the number of bits collected so far
-# 2: a scratch space starting as zero, but used during the computation to represent
-# the empty bits in the new row that are adjacent (position 0)
-# The exact procedure is described in-code
-def prunable( board, location, slotting = false)
- collectors = []
- # loop across the rows
- (location / 6).to_i.upto(9) do | row_on |
- # obtain a set of regions representing the bits of the current row.
- regions = $regions[(board >> (row_on * 6)) & 0b11111]
- converter = $converter[row_on]
-
- # track the number of collectors at the start of the cycle so that
- # we don't compute against newly created collectors, only existing collectors
- initial_collector_count = collectors.length
-
- # loop against the regions. For each region of the row
- # we will see if it connects to one or more existing collectors.
- # if it connects to 1 collector, the bits from the region are added to the
- # bits of the collector and the mask is placed in collector[2]
- # If the region overlaps more than one collector then all the collectors
- # it overlaps with are merged into the first one (the others are set to nil in the array)
- # if NO collectors are found then the region is copied as a new collector
- regions.each do | region |
- collector_found = nil
- region_mask = region[2]
- initial_collector_count.times do | collector_num |
- collector = collectors[collector_num]
- if (collector) then
- collector_mask = collector[0]
- if (collector_mask & region_mask != 0) then
- if (collector_found) then
- collector_found[0] |= collector_mask
- collector_found[1] += collector[1]
- collector_found[2] |= collector[2]
- collectors[collector_num] = nil
- else
- collector_found = collector
- collector[1] += region[1]
- collector[2] |= region_mask
- end
- end
- end
- end
- if (collector_found == nil) then
- collectors.push(Array.new(region))
- end
- end
-
- # check the existing collectors, if any collector overlapped no bits in the region its [2] value will
- # be zero. The size of any such reaason is tested if it is not a multiple of five true is returned since
- # the board is prunable. if it is a multiple of five it is removed.
- # Collector that are still active have a new adjacent value [0] set based n the matched bits
- # and have [2] cleared out for the next cycle.
- collectors.length.times do | collector_num |
- collector = collectors[collector_num]
- if (collector) then
- if (collector[2] == 0) then
- return true if (collector[1] % 5 != 0)
- collectors[collector_num] = nil
- else
- # if a collector matches all bits in the row then we can return unprunable early for the
- # following reasons:
- # 1) there can be no more unavailable bits bince we fill from the top left downward
- # 2) all previous regions have been closed or joined so only this region can fail
- # 3) this region must be good since there can never be only 1 region that is nuot
- # a multiple of five
- # this rule only applies when filling normally, so we ignore the rule if we are "slotting"
- # in pieces to see what configurations work for them (the only other time this algorithm is used).
- return false if (collector[2] == 0b11111 && !slotting)
- collector[0] = converter[collector[2]]
- collector[2] = 0
- end
- end
- end
-
- # get rid of all the empty converters for the next round
- collectors.compact!
- end
- return false if (collectors.length <= 1) # 1 collector or less and the region is fine
- collectors.any? { | collector | (collector[1] % 5) != 0 } # more than 1 and we test them all for bad size
-end
-
-# creates a region given a row mask. see prunable for what a "region" is
-def create_regions( value )
- regions = []
- cur_region = 0
- 5.times do | bit |
- if (value[bit] == 0) then
- cur_region |= 1 << bit
- else
- if (cur_region != 0 ) then
- regions.push( cur_region)
- cur_region = 0;
- end
- end
- end
- regions.push(cur_region) if (cur_region != 0)
- regions
-end
-
-# find up to the counted number of solutions (or all solutions) and prints the final result
-def find_all
- find_top( 1)
- find_top( 0)
- print_results
-end
-
-# show the board
-def print_results
- print "#{@boards_found} solutions found\n\n"
- print_full_board( @min_board)
- print "\n"
- print_full_board( @max_board)
- print "\n"
-end
-
-# finds solutions. This special version of the main function is only used for the top level
-# the reason for it is basically to force a particular ordering on how the rotations are tested for
-# the first piece. It is called twice, first looking for placements of the odd rotations and then
-# looking for placements of the even locations.
-#
-# WHY?
-# Since any found solution has an inverse we want to maximize finding solutions that are not already found
-# as an inverse. The inverse will ALWAYS be 3 one of the piece configurations that is exactly 3 rotations away
-# (an odd number). Checking even vs odd then produces a higher probability of finding more pieces earlier
-# in the cycle. We still need to keep checking all the permutations, but our probability of finding one will
-# diminsh over time. Since we are TOLD how many to search for this lets us exit before checking all pieces
-# this bennifit is very great when seeking small numbers of solutions and is 0 when looking for more than the
-# maximum number
-def find_top( rotation_skip)
- board = blank_board
- (@pieces.length-1).times do
- piece = @pieces.shift
- piece.masks[0].each do | mask, imask, cmask |
- if ((rotation_skip += 1) % 2 == 0) then
- piece.placed = mask
- find( 1, 1, board | mask)
- end
- end
- @pieces.push(piece)
- end
- piece = @pieces.shift
- @pieces.push(piece)
-end
-
-# the normail find routine, iterates through the available pieces, checks all rotations at the current location
-# and adds any boards found. depth is achieved via recursion. the overall approach is described
-# here: http://www-128.ibm.com/developerworks/java/library/j-javaopt/
-# parameters:
-# start_location -- where to start looking for place for the next piece at
-# placed -- number of pieces placed
-# board -- current state of the board
-#
-# see in-code comments
-def find( start_location, placed, board)
- # find the next location to place a piece by looking for an empty bit
- while board[start_location] == 1
- start_location += 1
- end
-
- @pieces.length.times do
- piece = @pieces.shift
- piece.masks[start_location].each do | mask, imask, cmask |
- if ( board & cmask == imask) then
- piece.placed = mask
- if (placed == 9) then
- add_board
- else
- find( start_location + 1, placed + 1, board | mask)
- end
- end
- end
- @pieces.push(piece)
- end
-end
-
-# print the board
-def print_full_board( board_string)
- 10.times do | row |
- print " " if (row % 2 == 1)
- 5.times do | col |
- print "#{board_string[row*5 + col,1]} "
- end
- print "\n"
- end
-end
-
-# when a board is found we "draw it" into a string and then flip that string, adding both to
-# the list (hash) of solutions if they are unique.
-def add_board
- board_string = "99999999999999999999999999999999999999999999999999"
- @all_pieces.each { | piece | piece.fill_string( board_string ) }
- save( board_string)
- save( board_string.reverse)
-end
-
-# adds a board string to the list (if new) and updates the current best/worst board
-def save( board_string)
- if (@all_boards[board_string] == nil) then
- @min_board = board_string if (board_string < @min_board)
- @max_board = board_string if (board_string > @max_board)
- @all_boards.store(board_string,true)
- @boards_found += 1
-
- # the exit motif is a time saver. Ideally the function should return, but those tests
- # take noticeable time (performance).
- if (@boards_found == @stop_count) then
- print_results
- exit(0)
- end
- end
-end
-
-
-##
-## MAIN BODY :)
-##
-create_collector_support
-@pieces = [
- Piece.new( [ :nw, :ne, :east, :east ], 2),
- Piece.new( [ :ne, :se, :east, :ne ], 7),
- Piece.new( [ :ne, :east, :ne, :nw ], 1),
- Piece.new( [ :east, :sw, :sw, :se ], 6),
- Piece.new( [ :east, :ne, :se, :ne ], 5),
- Piece.new( [ :east, :east, :east, :se ], 0),
- Piece.new( [ :ne, :nw, :se, :east, :se ], 4),
- Piece.new( [ :se, :se, :se, :west ], 9),
- Piece.new( [ :se, :se, :east, :se ], 8),
- Piece.new( [ :east, :east, :sw, :se ], 3)
- ];
-
-@all_pieces = Array.new( @pieces)
-
-@min_board = "99999999999999999999999999999999999999999999999999"
-@max_board = "00000000000000000000000000000000000000000000000000"
-@stop_count = ARGV[0].to_i || 2089
-@all_boards = {}
-@boards_found = 0
-
-find_all ######## DO IT!!!
diff --git a/benchmark/so_pidigits.rb b/benchmark/so_pidigits.rb
deleted file mode 100644
index 9a537b2d1c..0000000000
--- a/benchmark/so_pidigits.rb
+++ /dev/null
@@ -1,92 +0,0 @@
-# The Great Computer Language Shootout
-# http://shootout.alioth.debian.org/
-#
-# contributed by Gabriele Renzi
-
-class PiDigitSpigot
-
- def initialize()
- @z = Transformation.new 1,0,0,1
- @x = Transformation.new 0,0,0,0
- @inverse = Transformation.new 0,0,0,0
- end
-
- def next!
- @y = @z.extract(3)
- if safe? @y
- @z = produce(@y)
- @y
- else
- @z = consume @x.next!()
- next!()
- end
- end
-
- def safe?(digit)
- digit == @z.extract(4)
- end
-
- def produce(i)
- @inverse.qrst(10,-10*i,0,1).compose(@z)
- end
-
- def consume(a)
- @z.compose(a)
- end
-end
-
-
-class Transformation
- attr_reader :q, :r, :s, :t
- def initialize(q, r, s, t)
- @q,@r,@s,@t,@k = q,r,s,t,0
- end
-
- def next!()
- @q = @k = @k + 1
- @r = 4 * @k + 2
- @s = 0
- @t = 2 * @k + 1
- self
- end
-
- def extract(j)
- (@q * j + @r) / (@s * j + @t)
- end
-
- def compose(a)
- self.class.new( @q * a.q,
- @q * a.r + r * a.t,
- @s * a.q + t * a.s,
- @s * a.r + t * a.t
- )
- end
-
- def qrst *args
- initialize *args
- self
- end
-
-
-end
-
-
-WIDTH = 10
-n = 2_500 # Integer(ARGV[0])
-j = 0
-
-digits = PiDigitSpigot.new
-
-while n > 0
- if n >= WIDTH
- WIDTH.times {print digits.next!}
- j += WIDTH
- else
- n.times {print digits.next!}
- (WIDTH-n).times {print " "}
- j += n
- end
- puts "\t:"+j.to_s
- n -= WIDTH
-end
-
diff --git a/benchmark/so_reverse_complement.yml b/benchmark/so_reverse_complement.yml
deleted file mode 100644
index de05eedfc4..0000000000
--- a/benchmark/so_reverse_complement.yml
+++ /dev/null
@@ -1,137 +0,0 @@
-prelude: |
- bm_so_fasta = <<'EOS'
- # The Computer Language Shootout
- # http://shootout.alioth.debian.org/
- # Contributed by Sokolov Yura
-
- $last = 42.0
- def gen_random(max, im=139968, ia=3877, ic=29573)
- (max * ($last = ($last * ia + ic) % im)) / im
- end
-
- alu =
- "GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGG"+
- "GAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGA"+
- "CCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAAT"+
- "ACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCA"+
- "GCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG"+
- "AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC"+
- "AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA"
-
- iub = [
- ["a", 0.27],
- ["c", 0.12],
- ["g", 0.12],
- ["t", 0.27],
-
- ["B", 0.02],
- ["D", 0.02],
- ["H", 0.02],
- ["K", 0.02],
- ["M", 0.02],
- ["N", 0.02],
- ["R", 0.02],
- ["S", 0.02],
- ["V", 0.02],
- ["W", 0.02],
- ["Y", 0.02],
- ]
- homosapiens = [
- ["a", 0.3029549426680],
- ["c", 0.1979883004921],
- ["g", 0.1975473066391],
- ["t", 0.3015094502008],
- ]
-
- def make_repeat_fasta(id, desc, src, n)
- puts ">#{id} #{desc}"
- v = nil
- width = 60
- l = src.length
- s = src * ((n / l) + 1)
- s.slice!(n, l)
- puts(s.scan(/.{1,#{width}}/).join("\n"))
- end
-
- def make_random_fasta(id, desc, table, n)
- puts ">#{id} #{desc}"
- rand, v = nil,nil
- width = 60
- chunk = 1 * width
- prob = 0.0
- table.each{|v| v[1]= (prob += v[1])}
- for i in 1..(n/width)
- puts((1..width).collect{
- rand = gen_random(1.0)
- table.find{|v| v[1]>rand}[0]
- }.join)
- end
- if n%width != 0
- puts((1..(n%width)).collect{
- rand = gen_random(1.0)
- table.find{|v| v[1]>rand}[0]
- }.join)
- end
- end
-
-
- n = (ARGV[0] or 250_000).to_i
-
- make_repeat_fasta('ONE', 'Homo sapiens alu', alu, n*2)
- make_random_fasta('TWO', 'IUB ambiguity codes', iub, n*3)
- make_random_fasta('THREE', 'Homo sapiens frequency', homosapiens, n*5)
- EOS
-benchmark:
- - name: so_reverse_complement
- prelude: |
- script = File.join(File.dirname($0), 'bm_so_fasta.rb')
- File.write(script, bm_so_fasta)
-
- def prepare_fasta_output n
- filebase = File.join(File.dirname($0), 'fasta.output')
- script = File.join(File.dirname($0), 'bm_so_fasta.rb')
- file = "#{filebase}.#{n}"
-
- unless FileTest.exist?(file)
- STDERR.puts "preparing #{file}"
-
- open(file, 'w'){|f|
- ARGV[0] = n
- $stdout = f
- load script
- $stdout = STDOUT
- }
- end
- end
- prepare_fasta_output(2_500_000)
- script: |
- # The Great Computer Language Shootout
- # http://shootout.alioth.debian.org/
- #
- # Contributed by Peter Bjarke Olsen
- # Modified by Doug King
-
- seq=Array.new
-
- def revcomp(seq)
- seq.reverse!.tr!('wsatugcyrkmbdhvnATUGCYRKMBDHVN','WSTAACGRYMKVHDBNTAACGRYMKVHDBN')
- stringlen=seq.length
- 0.step(stringlen-1,60) {|x| print seq.slice(x,60) , "\n"}
- end
-
- input = open(File.join(File.dirname($0), 'fasta.output.2500000'), 'rb')
-
- while input.gets
- if $_ =~ />/
- if seq.length != 0
- revcomp(seq.join)
- seq=Array.new
- end
- puts $_
- else
- $_.sub(/\n/,'')
- seq.push $_
- end
- end
- revcomp(seq.join)
- loop_count: 1
diff --git a/benchmark/string_index.rb b/benchmark/string_index.rb
deleted file mode 100644
index 7783111082..0000000000
--- a/benchmark/string_index.rb
+++ /dev/null
@@ -1,3 +0,0 @@
-str1 = "あ" * 1024 + "い" # not single byte optimizable
-str2 = "い"
-100_000.times { str1.index(str2) }
diff --git a/benchmark/string_scan_re.rb b/benchmark/string_scan_re.rb
deleted file mode 100644
index b0d60201a9..0000000000
--- a/benchmark/string_scan_re.rb
+++ /dev/null
@@ -1,2 +0,0 @@
-str = Array.new(1_000, 'abc').join(',')
-1_000.times { str.scan(/abc/) }
diff --git a/benchmark/string_scan_str.rb b/benchmark/string_scan_str.rb
deleted file mode 100644
index 42440bd948..0000000000
--- a/benchmark/string_scan_str.rb
+++ /dev/null
@@ -1,2 +0,0 @@
-str = Array.new(1_000, 'abc').join(',')
-1_000.times { str.scan('abc') }
diff --git a/benchmark/time_subsec.rb b/benchmark/time_subsec.rb
deleted file mode 100644
index 505021c701..0000000000
--- a/benchmark/time_subsec.rb
+++ /dev/null
@@ -1,2 +0,0 @@
-t = Time.now
-4000000.times { t.subsec }
diff --git a/benchmark/vm1_attr_ivar.yml b/benchmark/vm1_attr_ivar.yml
deleted file mode 100644
index f714dd9bd9..0000000000
--- a/benchmark/vm1_attr_ivar.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-prelude: |
- class C
- attr_reader :a, :b
- def initialize
- @a = nil
- @b = nil
- end
- end
- obj = C.new
-benchmark:
- vm1_attr_ivar: |
- j = obj.a
- k = obj.b
-loop_count: 30000000
diff --git a/benchmark/vm1_attr_ivar_set.yml b/benchmark/vm1_attr_ivar_set.yml
deleted file mode 100644
index f383e59ef4..0000000000
--- a/benchmark/vm1_attr_ivar_set.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-prelude: |
- class C
- attr_accessor :a, :b
- def initialize
- @a = nil
- @b = nil
- end
- end
- obj = C.new
-benchmark:
- vm1_attr_ivar_set: |
- obj.a = 1
- obj.b = 2
-loop_count: 30000000
diff --git a/benchmark/vm1_block.yml b/benchmark/vm1_block.yml
deleted file mode 100644
index ac7c940f93..0000000000
--- a/benchmark/vm1_block.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-prelude: |
- def m
- yield
- end
-benchmark:
- vm1_block: |
- m{
- }
-loop_count: 30000000
diff --git a/benchmark/vm1_blockparam.yml b/benchmark/vm1_blockparam.yml
deleted file mode 100644
index 947b8c53d5..0000000000
--- a/benchmark/vm1_blockparam.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-prelude: |
- def m &b
- end
-benchmark:
- vm1_blockparam: |
- m{}
-loop_count: 30000000
diff --git a/benchmark/vm1_blockparam_call.yml b/benchmark/vm1_blockparam_call.yml
deleted file mode 100644
index e2817a3ce2..0000000000
--- a/benchmark/vm1_blockparam_call.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-prelude: |
- def m &b
- b.call
- end
-benchmark:
- vm1_blockparam_call: |
- m{}
-loop_count: 30000000
diff --git a/benchmark/vm1_blockparam_pass.yml b/benchmark/vm1_blockparam_pass.yml
deleted file mode 100644
index ca1bef3369..0000000000
--- a/benchmark/vm1_blockparam_pass.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-prelude: |
- def bp_yield
- yield
- end
-
- def bp_pass &b
- bp_yield &b
- end
-benchmark:
- vm1_blockparam_pass: |
- bp_pass{}
-loop_count: 30000000
diff --git a/benchmark/vm1_blockparam_yield.yml b/benchmark/vm1_blockparam_yield.yml
deleted file mode 100644
index 56ae617798..0000000000
--- a/benchmark/vm1_blockparam_yield.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-prelude: |
- def bp_yield &b
- yield
- end
-benchmark:
- vm1_blockparam_yield: |
- bp_yield{}
-loop_count: 30000000
diff --git a/benchmark/vm1_const.yml b/benchmark/vm1_const.yml
deleted file mode 100644
index b98db1545c..0000000000
--- a/benchmark/vm1_const.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-prelude: |
- Const = 1
-benchmark:
- vm1_const: |
- j = Const
- k = Const
-loop_count: 30000000
diff --git a/benchmark/vm1_ensure.yml b/benchmark/vm1_ensure.yml
deleted file mode 100644
index afbbe38bec..0000000000
--- a/benchmark/vm1_ensure.yml
+++ /dev/null
@@ -1,14 +0,0 @@
-# Not utilizing loop_count since using it for this is too unstable for now
-benchmark:
- vm1_ensure: |
- i = 0
- while i<30_000_000
- i += 1
- begin
- begin
- ensure
- end
- ensure
- end
- end
-loop_count: 1
diff --git a/benchmark/vm1_float_simple.yml b/benchmark/vm1_float_simple.yml
deleted file mode 100644
index 4e9ad1852b..0000000000
--- a/benchmark/vm1_float_simple.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-prelude: |
- f = 0.0
-benchmark:
- vm1_float_simple: |
- f += 0.1; f -= 0.1
- f += 0.1; f -= 0.1
- f += 0.1; f -= 0.1
-loop_count: 30000000
diff --git a/benchmark/vm1_gc_short_lived.yml b/benchmark/vm1_gc_short_lived.yml
deleted file mode 100644
index 8fdcb7371d..0000000000
--- a/benchmark/vm1_gc_short_lived.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-benchmark:
- vm1_gc_short_lived: |
- a = '' # short-lived String
- b = ''
- c = ''
- d = ''
- e = ''
- f = ''
-loop_count: 30000000
diff --git a/benchmark/vm1_gc_short_with_complex_long.yml b/benchmark/vm1_gc_short_with_complex_long.yml
deleted file mode 100644
index c22ea74a60..0000000000
--- a/benchmark/vm1_gc_short_with_complex_long.yml
+++ /dev/null
@@ -1,25 +0,0 @@
-prelude: |
- def nested_hash h, n
- if n == 0
- ''
- else
- 10.times{
- h[Object.new] = nested_hash(h, n-1)
- }
- end
- end
-
- long_lived = Hash.new
- nested_hash long_lived, 6
-
- GC.start
- GC.start
-benchmark:
- vm1_gc_short_with_complex_long: |
- a = '' # short-lived String
- b = ''
- c = ''
- d = ''
- e = ''
- f = ''
-loop_count: 30000000
diff --git a/benchmark/vm1_gc_short_with_long.yml b/benchmark/vm1_gc_short_with_long.yml
deleted file mode 100644
index c731aae548..0000000000
--- a/benchmark/vm1_gc_short_with_long.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-prelude: |
- long_lived = Array.new(1_000_000){|i| "#{i}"}
- GC.start
- GC.start
-benchmark:
- vm1_gc_short_with_long: |
- a = '' # short-lived String
- b = ''
- c = ''
- d = ''
- e = ''
- f = ''
-loop_count: 30000000
diff --git a/benchmark/vm1_gc_short_with_symbol.yml b/benchmark/vm1_gc_short_with_symbol.yml
deleted file mode 100644
index 7fc1abedd8..0000000000
--- a/benchmark/vm1_gc_short_with_symbol.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-prelude: |
- 50_000.times{|i| sym = "sym#{i}".to_sym}
- GC.start
- GC.start
-benchmark:
- vm1_gc_short_with_symbol: |
- a = '' # short-lived String
- b = ''
- c = ''
- d = ''
- e = ''
- f = ''
-loop_count: 30000000
diff --git a/benchmark/vm1_gc_wb_ary.yml b/benchmark/vm1_gc_wb_ary.yml
deleted file mode 100644
index 50fb4b6f84..0000000000
--- a/benchmark/vm1_gc_wb_ary.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-prelude: |
- short_lived_ary = []
-
- if RUBY_VERSION >= "2.2.0"
- GC.start(full_mark: false, immediate_mark: true, immediate_sweep: true)
- end
-
- short_lived = ''
-benchmark:
- vm1_gc_wb_ary: |
- short_lived_ary[0] = short_lived # write barrier
-loop_count: 30000000
diff --git a/benchmark/vm1_gc_wb_ary_promoted.yml b/benchmark/vm1_gc_wb_ary_promoted.yml
deleted file mode 100644
index cf9b5de005..0000000000
--- a/benchmark/vm1_gc_wb_ary_promoted.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-prelude: |
- long_lived = []
-
- if RUBY_VERSION > "2.2.0"
- 3.times{ GC.start(full_mark: false, immediate_mark: true, immediate_sweep: true) }
- elsif
- GC.start
- end
-
- short_lived = ''
-
-benchmark:
- vm1_gc_wb_ary_promoted: |
- long_lived[0] = short_lived # write barrier
-loop_count: 30000000
diff --git a/benchmark/vm1_gc_wb_obj.yml b/benchmark/vm1_gc_wb_obj.yml
deleted file mode 100644
index 9dc08e7e1a..0000000000
--- a/benchmark/vm1_gc_wb_obj.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-prelude: |
- class C
- attr_accessor :foo
- end
- short_lived_obj = C.new
-
- if RUBY_VERSION >= "2.2.0"
- GC.start(full_mark: false, immediate_mark: true, immediate_sweep: true)
- end
-
- short_lived = ''
-benchmark:
- vm1_gc_wb_obj: |
- short_lived_obj.foo = short_lived # write barrier
-loop_count: 30000000
diff --git a/benchmark/vm1_gc_wb_obj_promoted.yml b/benchmark/vm1_gc_wb_obj_promoted.yml
deleted file mode 100644
index 26859d2a52..0000000000
--- a/benchmark/vm1_gc_wb_obj_promoted.yml
+++ /dev/null
@@ -1,17 +0,0 @@
-prelude: |
- class C
- attr_accessor :foo
- end
- long_lived = C.new
-
- if RUBY_VERSION >= "2.2.0"
- 3.times{ GC.start(full_mark: false, immediate_mark: true, immediate_sweep: true) }
- elsif
- GC.start
- end
-
- short_lived = ''
-benchmark:
- vm1_gc_wb_obj_promoted: |
- long_lived.foo = short_lived # write barrier
-loop_count: 30000000
diff --git a/benchmark/vm1_ivar.yml b/benchmark/vm1_ivar.yml
deleted file mode 100644
index 7aa6fac729..0000000000
--- a/benchmark/vm1_ivar.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-prelude: "@a = 1\n"
-benchmark:
- vm1_ivar: |
- j = @a
- k = @a
-loop_count: 30000000
diff --git a/benchmark/vm1_ivar_set.yml b/benchmark/vm1_ivar_set.yml
deleted file mode 100644
index 6f19412d16..0000000000
--- a/benchmark/vm1_ivar_set.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-benchmark:
- vm1_ivar_set: |
- @a = 1
- @b = 2
-loop_count: 30000000
diff --git a/benchmark/vm1_length.yml b/benchmark/vm1_length.yml
deleted file mode 100644
index a18e2ca2e6..0000000000
--- a/benchmark/vm1_length.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-prelude: |
- a = 'abc'
- b = [1, 2, 3]
-benchmark:
- vm1_length: |
- a.length
- b.length
-loop_count: 30000000
diff --git a/benchmark/vm1_lvar_init.yml b/benchmark/vm1_lvar_init.yml
deleted file mode 100644
index 10e2becef9..0000000000
--- a/benchmark/vm1_lvar_init.yml
+++ /dev/null
@@ -1,21 +0,0 @@
-# while loop cost is not removed because `i` is used in the script
-benchmark:
- vm1_lvar_init: |
- def m v
- unless v
- # unreachable code
- v1 = v2 = v3 = v4 = v5 = v6 = v7 = v8 = v9 = v10 =
- v11 = v12 = v13 = v14 = v15 = v16 = v17 = v18 = v19 = v20 =
- v21 = v22 = v23 = v24 = v25 = v26 = v27 = v28 = v29 = v30 =
- v31 = v32 = v33 = v34 = v35 = v36 = v37 = v38 = v39 = v40 =
- v41 = v42 = v43 = v44 = v45 = v46 = v47 = v48 = v49 = v50 = 1
- end
- end
-
- i = 0
-
- while i<30_000_000
- i += 1
- m i
- end
-loop_count: 1
diff --git a/benchmark/vm1_lvar_set.yml b/benchmark/vm1_lvar_set.yml
deleted file mode 100644
index df8f6b6ea4..0000000000
--- a/benchmark/vm1_lvar_set.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-benchmark:
- vm1_lvar_set: |
- a = b = c = d = e = f = g = h = j = k = l = m = n = o = p = q = r = 1
-loop_count: 30000000
diff --git a/benchmark/vm1_neq.yml b/benchmark/vm1_neq.yml
deleted file mode 100644
index 65a8128dda..0000000000
--- a/benchmark/vm1_neq.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-prelude: |
- obj1 = Object.new
- obj2 = Object.new
-benchmark:
- vm1_neq: |
- obj1 != obj2
-loop_count: 30000000
diff --git a/benchmark/vm1_not.yml b/benchmark/vm1_not.yml
deleted file mode 100644
index 0fb7b282a9..0000000000
--- a/benchmark/vm1_not.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-prelude: |
- obj = Object.new
-benchmark:
- vm1_not: |
- !obj
-loop_count: 30000000
diff --git a/benchmark/vm1_rescue.yml b/benchmark/vm1_rescue.yml
deleted file mode 100644
index a175b823af..0000000000
--- a/benchmark/vm1_rescue.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-benchmark:
- vm1_rescue: |
- begin
- rescue
- end
-loop_count: 30000000
diff --git a/benchmark/vm1_simplereturn.yml b/benchmark/vm1_simplereturn.yml
deleted file mode 100644
index 3564aac7e2..0000000000
--- a/benchmark/vm1_simplereturn.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-prelude: |
- def m
- return 1
- end
-benchmark:
- vm1_simplereturn: m
-loop_count: 30000000
diff --git a/benchmark/vm1_swap.yml b/benchmark/vm1_swap.yml
deleted file mode 100644
index fed87ccd62..0000000000
--- a/benchmark/vm1_swap.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-prelude: |
- a = 1
- b = 2
-benchmark:
- vm1_swap: |
- a, b = b, a
-loop_count: 30000000
diff --git a/benchmark/vm1_yield.yml b/benchmark/vm1_yield.yml
deleted file mode 100644
index ae1f9316f9..0000000000
--- a/benchmark/vm1_yield.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-# while loop cost is not removed due to benchmark_driver.gem's limitation
-benchmark:
- vm1_yield: |
- def m
- i = 0
- while i<30_000_000
- i += 1
- yield
- end
- end
-
- m{}
-loop_count: 1
diff --git a/benchmark/vm2_array.yml b/benchmark/vm2_array.yml
deleted file mode 100644
index 7373098d5e..0000000000
--- a/benchmark/vm2_array.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-benchmark:
- vm2_array: |
- a = [1,2,3,4,5,6,7,8,9,10]
-loop_count: 6000000
diff --git a/benchmark/vm2_bigarray.yml b/benchmark/vm2_bigarray.yml
deleted file mode 100644
index 2ad6da3905..0000000000
--- a/benchmark/vm2_bigarray.yml
+++ /dev/null
@@ -1,105 +0,0 @@
-benchmark:
- vm2_bigarray: |
- a = [
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- 1,2,3,4,5,6,7,8,9,10,
- ]
-loop_count: 6000000
diff --git a/benchmark/vm2_bighash.yml b/benchmark/vm2_bighash.yml
deleted file mode 100644
index e9154e4ba9..0000000000
--- a/benchmark/vm2_bighash.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-benchmark:
- vm2_bighash: |
- a = {0=>0, 1=>1, 2=>2, 3=>3, 4=>4, 5=>5, 6=>6, 7=>7, 8=>8, 9=>9, 10=>10, 11=>11, 12=>12, 13=>13, 14=>14, 15=>15, 16=>16, 17=>17, 18=>18, 19=>19, 20=>20, 21=>21, 22=>22, 23=>23, 24=>24, 25=>25, 26=>26, 27=>27, 28=>28, 29=>29, 30=>30, 31=>31, 32=>32, 33=>33, 34=>34, 35=>35, 36=>36, 37=>37, 38=>38, 39=>39, 40=>40, 41=>41, 42=>42, 43=>43, 44=>44, 45=>45, 46=>46, 47=>47, 48=>48, 49=>49, 50=>50, 51=>51, 52=>52, 53=>53, 54=>54, 55=>55, 56=>56, 57=>57, 58=>58, 59=>59, 60=>60, 61=>61, 62=>62, 63=>63, 64=>64, 65=>65, 66=>66, 67=>67, 68=>68, 69=>69, 70=>70, 71=>71, 72=>72, 73=>73, 74=>74, 75=>75, 76=>76, 77=>77, 78=>78, 79=>79, 80=>80, 81=>81, 82=>82, 83=>83, 84=>84, 85=>85, 86=>86, 87=>87, 88=>88, 89=>89, 90=>90, 91=>91, 92=>92, 93=>93, 94=>94, 95=>95, 96=>96, 97=>97, 98=>98, 99=>99, 100=>100, 101=>101, 102=>102, 103=>103, 104=>104, 105=>105, 106=>106, 107=>107, 108=>108, 109=>109, 110=>110, 111=>111, 112=>112, 113=>113, 114=>114, 115=>115, 116=>116, 117=>117, 118=>118, 119=>119, 120=>120, 121=>121, 122=>122, 123=>123, 124=>124, 125=>125, 126=>126, 127=>127, 128=>128, 129=>129, 130=>130, 131=>131, 132=>132, 133=>133, 134=>134, 135=>135, 136=>136, 137=>137, 138=>138, 139=>139, 140=>140, 141=>141, 142=>142, 143=>143, 144=>144, 145=>145, 146=>146, 147=>147, 148=>148, 149=>149, 150=>150, 151=>151, 152=>152, 153=>153, 154=>154, 155=>155, 156=>156, 157=>157, 158=>158, 159=>159, 160=>160, 161=>161, 162=>162, 163=>163, 164=>164, 165=>165, 166=>166, 167=>167, 168=>168, 169=>169, 170=>170, 171=>171, 172=>172, 173=>173, 174=>174, 175=>175, 176=>176, 177=>177, 178=>178, 179=>179, 180=>180, 181=>181, 182=>182, 183=>183, 184=>184, 185=>185, 186=>186, 187=>187, 188=>188, 189=>189, 190=>190, 191=>191, 192=>192, 193=>193, 194=>194, 195=>195, 196=>196, 197=>197, 198=>198, 199=>199, 200=>200, 201=>201, 202=>202, 203=>203, 204=>204, 205=>205, 206=>206, 207=>207, 208=>208, 209=>209, 210=>210, 211=>211, 212=>212, 213=>213, 214=>214, 215=>215, 216=>216, 217=>217, 218=>218, 219=>219, 220=>220, 221=>221, 222=>222, 223=>223, 224=>224, 225=>225, 226=>226, 227=>227, 228=>228, 229=>229, 230=>230, 231=>231, 232=>232, 233=>233, 234=>234, 235=>235, 236=>236, 237=>237, 238=>238, 239=>239, 240=>240, 241=>241, 242=>242, 243=>243, 244=>244, 245=>245, 246=>246, 247=>247, 248=>248, 249=>249, 250=>250, 251=>251, 252=>252, 253=>253, 254=>254, 255=>255, 256=>256, 257=>257, 258=>258, 259=>259, 260=>260, 261=>261, 262=>262, 263=>263, 264=>264, 265=>265, 266=>266, 267=>267, 268=>268, 269=>269, 270=>270, 271=>271, 272=>272, 273=>273, 274=>274, 275=>275, 276=>276, 277=>277, 278=>278, 279=>279, 280=>280, 281=>281, 282=>282, 283=>283, 284=>284, 285=>285, 286=>286, 287=>287, 288=>288, 289=>289, 290=>290, 291=>291, 292=>292, 293=>293, 294=>294, 295=>295, 296=>296, 297=>297, 298=>298, 299=>299, 300=>300, 301=>301, 302=>302, 303=>303, 304=>304, 305=>305, 306=>306, 307=>307, 308=>308, 309=>309, 310=>310, 311=>311, 312=>312, 313=>313, 314=>314, 315=>315, 316=>316, 317=>317, 318=>318, 319=>319, 320=>320, 321=>321, 322=>322, 323=>323, 324=>324, 325=>325, 326=>326, 327=>327, 328=>328, 329=>329, 330=>330, 331=>331, 332=>332, 333=>333, 334=>334, 335=>335, 336=>336, 337=>337, 338=>338, 339=>339, 340=>340, 341=>341, 342=>342, 343=>343, 344=>344, 345=>345, 346=>346, 347=>347, 348=>348, 349=>349, 350=>350, 351=>351, 352=>352, 353=>353, 354=>354, 355=>355, 356=>356, 357=>357, 358=>358, 359=>359, 360=>360, 361=>361, 362=>362, 363=>363, 364=>364, 365=>365, 366=>366, 367=>367, 368=>368, 369=>369, 370=>370, 371=>371, 372=>372, 373=>373, 374=>374, 375=>375, 376=>376, 377=>377, 378=>378, 379=>379, 380=>380, 381=>381, 382=>382, 383=>383, 384=>384, 385=>385, 386=>386, 387=>387, 388=>388, 389=>389, 390=>390, 391=>391, 392=>392, 393=>393, 394=>394, 395=>395, 396=>396, 397=>397, 398=>398, 399=>399, 400=>400, 401=>401, 402=>402, 403=>403, 404=>404, 405=>405, 406=>406, 407=>407, 408=>408, 409=>409, 410=>410, 411=>411, 412=>412, 413=>413, 414=>414, 415=>415, 416=>416, 417=>417, 418=>418, 419=>419, 420=>420, 421=>421, 422=>422, 423=>423, 424=>424, 425=>425, 426=>426, 427=>427, 428=>428, 429=>429, 430=>430, 431=>431, 432=>432, 433=>433, 434=>434, 435=>435, 436=>436, 437=>437, 438=>438, 439=>439, 440=>440, 441=>441, 442=>442, 443=>443, 444=>444, 445=>445, 446=>446, 447=>447, 448=>448, 449=>449, 450=>450, 451=>451, 452=>452, 453=>453, 454=>454, 455=>455, 456=>456, 457=>457, 458=>458, 459=>459, 460=>460, 461=>461, 462=>462, 463=>463, 464=>464, 465=>465, 466=>466, 467=>467, 468=>468, 469=>469, 470=>470, 471=>471, 472=>472, 473=>473, 474=>474, 475=>475, 476=>476, 477=>477, 478=>478, 479=>479, 480=>480, 481=>481, 482=>482, 483=>483, 484=>484, 485=>485, 486=>486, 487=>487, 488=>488, 489=>489, 490=>490, 491=>491, 492=>492, 493=>493, 494=>494, 495=>495, 496=>496, 497=>497, 498=>498, 499=>499, 500=>500,}
-loop_count: 60000
diff --git a/benchmark/vm2_case.yml b/benchmark/vm2_case.yml
deleted file mode 100644
index 7716783c09..0000000000
--- a/benchmark/vm2_case.yml
+++ /dev/null
@@ -1,13 +0,0 @@
-benchmark:
- vm2_case: |
- case :foo
- when :bar
- raise
- when :baz
- raise
- when :boo
- raise
- when :foo
- # noop
- end
-loop_count: 6000000
diff --git a/benchmark/vm2_case_lit.yml b/benchmark/vm2_case_lit.yml
deleted file mode 100644
index c49b8dfe5e..0000000000
--- a/benchmark/vm2_case_lit.yml
+++ /dev/null
@@ -1,23 +0,0 @@
-# loop_count is not utilized since `i` is involved in the script
-benchmark:
- vm2_case_lit: |
- i = 0
- @ret = [ "foo", true, false, :sym, 6, nil, 0.1, 0xffffffffffffffff ]
- def foo(i)
- @ret[i % @ret.size]
- end
-
- while i<6_000_000
- case foo(i)
- when "foo" then :foo
- when true then true
- when false then false
- when :sym then :sym
- when 6 then :fix
- when nil then nil
- when 0.1 then :float
- when 0xffffffffffffffff then :big
- end
- i += 1
- end
-loop_count: 1
diff --git a/benchmark/vm2_defined_method.yml b/benchmark/vm2_defined_method.yml
deleted file mode 100644
index e1b0d55674..0000000000
--- a/benchmark/vm2_defined_method.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-prelude: |
- class Object
- define_method(:m){}
- end
-benchmark:
- vm2_defined_method: |
- m; m; m; m; m; m; m; m;
-loop_count: 6000000
diff --git a/benchmark/vm2_dstr.yml b/benchmark/vm2_dstr.yml
deleted file mode 100644
index f8bd6e0133..0000000000
--- a/benchmark/vm2_dstr.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-prelude: |
- x = y = 'z'
-benchmark:
- vm2_dstr: |
- str = "foo#{x}bar#{y}baz"
-loop_count: 6000000
diff --git a/benchmark/vm2_eval.yml b/benchmark/vm2_eval.yml
deleted file mode 100644
index d506a9c079..0000000000
--- a/benchmark/vm2_eval.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-benchmark:
- vm2_eval: |
- eval("1")
-loop_count: 6000000
diff --git a/benchmark/vm2_fiber_switch.yml b/benchmark/vm2_fiber_switch.yml
deleted file mode 100644
index f3e4c91283..0000000000
--- a/benchmark/vm2_fiber_switch.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-prelude: |
- # based on benchmark for [ruby-core:65518] [Feature #10341] by Knut Franke
- fib = Fiber.new do
- loop { Fiber.yield }
- end
-benchmark:
- vm2_fiber_switch: |
- fib.resume
-loop_count: 6000000
diff --git a/benchmark/vm2_freezestring.yml b/benchmark/vm2_freezestring.yml
deleted file mode 100644
index b78af91a20..0000000000
--- a/benchmark/vm2_freezestring.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-prelude: |
- class String
- def freeze
- -self
- end
- end
-benchmark:
- vm2_freezestring: |
- "tXnL1BP5T1WPXMjuFNLQtallEtRcay1t2lHtJSrlVsDgvunlbtfpr/DGdH0NGYE9".freeze
-loop_count: 6000000
diff --git a/benchmark/vm2_method.yml b/benchmark/vm2_method.yml
deleted file mode 100644
index cc7b9b28ff..0000000000
--- a/benchmark/vm2_method.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-prelude: |
- def m
- nil
- end
-benchmark:
- vm2_method: |
- m; m; m; m; m; m; m; m;
-loop_count: 6000000
diff --git a/benchmark/vm2_method_missing.yml b/benchmark/vm2_method_missing.yml
deleted file mode 100644
index cbfb794b25..0000000000
--- a/benchmark/vm2_method_missing.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-prelude: |
- class C
- def method_missing mid
- end
- end
-
- obj = C.new
-benchmark:
- vm2_method_missing: |
- obj.m; obj.m; obj.m; obj.m; obj.m; obj.m; obj.m; obj.m;
-loop_count: 6000000
diff --git a/benchmark/vm2_method_with_block.yml b/benchmark/vm2_method_with_block.yml
deleted file mode 100644
index 6e522adccc..0000000000
--- a/benchmark/vm2_method_with_block.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-prelude: |
- def m
- nil
- end
-benchmark:
- vm2_method_with_block: |
- m{}; m{}; m{}; m{}; m{}; m{}; m{}; m{};
-loop_count: 6000000
diff --git a/benchmark/vm2_module_ann_const_set.yml b/benchmark/vm2_module_ann_const_set.yml
deleted file mode 100644
index b0becd9d3d..0000000000
--- a/benchmark/vm2_module_ann_const_set.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-benchmark:
- vm2_module_ann_const_set: |
- Module.new.const_set(:X, Module.new)
-loop_count: 6000000
diff --git a/benchmark/vm2_module_const_set.yml b/benchmark/vm2_module_const_set.yml
deleted file mode 100644
index 05a640069c..0000000000
--- a/benchmark/vm2_module_const_set.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-prelude: |
- module M
- end
- $VERBOSE = nil
-benchmark:
- vm2_module_const_set: |
- M.const_set(:X, Module.new)
-loop_count: 6000000
diff --git a/benchmark/vm2_mutex.yml b/benchmark/vm2_mutex.yml
deleted file mode 100644
index c40a90444a..0000000000
--- a/benchmark/vm2_mutex.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-prelude: |
- require 'thread'
-
- m = Thread::Mutex.new
-benchmark:
- vm2_mutex: |
- m.synchronize{}
-loop_count: 6000000
diff --git a/benchmark/vm2_newlambda.yml b/benchmark/vm2_newlambda.yml
deleted file mode 100644
index 93133f9f30..0000000000
--- a/benchmark/vm2_newlambda.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-benchmark:
- vm2_newlambda: |
- lambda {}
-loop_count: 6000000
diff --git a/benchmark/vm2_poly_method.yml b/benchmark/vm2_poly_method.yml
deleted file mode 100644
index 0104bdfb66..0000000000
--- a/benchmark/vm2_poly_method.yml
+++ /dev/null
@@ -1,24 +0,0 @@
-# loop_count is not utilized since `i` is involved in the script
-benchmark:
- vm2_poly_method: |
- class C1
- def m
- 1
- end
- end
- class C2
- def m
- 2
- end
- end
-
- o1 = C1.new
- o2 = C2.new
-
- i = 0
- while i<6_000_000
- o = (i % 2 == 0) ? o1 : o2
- o.m; o.m; o.m; o.m; o.m; o.m; o.m; o.m
- i += 1
- end
-loop_count: 1
diff --git a/benchmark/vm2_poly_method_ov.yml b/benchmark/vm2_poly_method_ov.yml
deleted file mode 100644
index 3748073ba2..0000000000
--- a/benchmark/vm2_poly_method_ov.yml
+++ /dev/null
@@ -1,24 +0,0 @@
-# loop_count is not utilized since `i` is involved in the script
-benchmark:
- vm2_poly_method_ov: |
- class C1
- def m
- 1
- end
- end
- class C2
- def m
- 2
- end
- end
-
- o1 = C1.new
- o2 = C2.new
-
- i = 0
- while i<6_000_000
- o = (i % 2 == 0) ? o1 : o2
- # o.m; o.m; o.m; o.m; o.m; o.m; o.m; o.m
- i += 1
- end
-loop_count: 1
diff --git a/benchmark/vm2_poly_singleton.yml b/benchmark/vm2_poly_singleton.yml
deleted file mode 100644
index e58d7bfb37..0000000000
--- a/benchmark/vm2_poly_singleton.yml
+++ /dev/null
@@ -1,18 +0,0 @@
-# loop_count is not utilized since `i` is involved in the script
-benchmark:
- vm2_poly_singleton: |
- class C1
- def m; 1; end
- end
-
- o1 = C1.new
- o2 = C1.new
- o2.singleton_class
-
- i = 0
- while i<6_000_000 # benchmark loop 2
- o = (i % 2 == 0) ? o1 : o2
- o.m; o.m; o.m; o.m; o.m; o.m; o.m; o.m
- i += 1
- end
-loop_count: 1
diff --git a/benchmark/vm2_proc.yml b/benchmark/vm2_proc.yml
deleted file mode 100644
index 5c36e936d9..0000000000
--- a/benchmark/vm2_proc.yml
+++ /dev/null
@@ -1,12 +0,0 @@
-prelude: |
- def m &b
- b
- end
-
- pr = m{
- a = 1
- }
-benchmark:
- vm2_proc: |
- pr.call
-loop_count: 6000000
diff --git a/benchmark/vm2_raise1.yml b/benchmark/vm2_raise1.yml
deleted file mode 100644
index f6eb308968..0000000000
--- a/benchmark/vm2_raise1.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-prelude: |
- def rec n
- if n > 0
- rec n-1
- else
- raise
- end
- end
-benchmark:
- vm2_raise1: |
- begin
- rec 1
- rescue
- # ignore
- end
-loop_count: 6000000
diff --git a/benchmark/vm2_raise2.yml b/benchmark/vm2_raise2.yml
deleted file mode 100644
index 7d51b1b314..0000000000
--- a/benchmark/vm2_raise2.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-prelude: |
- def rec n
- if n > 0
- rec n-1
- else
- raise
- end
- end
-benchmark:
- vm2_raise2: |
- begin
- rec 10
- rescue
- # ignore
- end
-loop_count: 6000000
diff --git a/benchmark/vm2_regexp.yml b/benchmark/vm2_regexp.yml
deleted file mode 100644
index 0f3968a99b..0000000000
--- a/benchmark/vm2_regexp.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-prelude: |
- str = 'xxxhogexxx'
-benchmark:
- vm2_regexp: |
- /hoge/ =~ str
-loop_count: 6000000
diff --git a/benchmark/vm2_send.yml b/benchmark/vm2_send.yml
deleted file mode 100644
index 44a12a27d9..0000000000
--- a/benchmark/vm2_send.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-prelude: |
- class C
- def m
- end
- end
-
- o = C.new
-benchmark:
- vm2_send: |
- o.__send__ :m
-loop_count: 6000000
diff --git a/benchmark/vm2_string_literal.yml b/benchmark/vm2_string_literal.yml
deleted file mode 100644
index 54b0aec1fe..0000000000
--- a/benchmark/vm2_string_literal.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-benchmark:
- vm2_string_literal: |
- x = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
-loop_count: 6000000
diff --git a/benchmark/vm2_struct_big_aref_hi.yml b/benchmark/vm2_struct_big_aref_hi.yml
deleted file mode 100644
index eed1846d28..0000000000
--- a/benchmark/vm2_struct_big_aref_hi.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-prelude: |
- s = Struct.new(*('a'..'z').map { |x| x.to_sym })
- x = s.new
-benchmark:
- vm2_struct_big_aref_hi: |
- x.z # x[25]
-loop_count: 6000000
diff --git a/benchmark/vm2_struct_big_aref_lo.yml b/benchmark/vm2_struct_big_aref_lo.yml
deleted file mode 100644
index 0915435b76..0000000000
--- a/benchmark/vm2_struct_big_aref_lo.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-prelude: |
- s = Struct.new(*('a'..'z').map { |x| x.to_sym })
- x = s.new
-benchmark:
- vm2_struct_big_aref_lo: |
- x.k # x[10]
-loop_count: 6000000
diff --git a/benchmark/vm2_struct_big_aset.yml b/benchmark/vm2_struct_big_aset.yml
deleted file mode 100644
index 6af50103d3..0000000000
--- a/benchmark/vm2_struct_big_aset.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-# loop_count is not utilized since `i` is involved in the script
-benchmark:
- vm2_struct_big_aset: |
- s = Struct.new(*('a'..'z').map { |x| x.to_sym })
- x = s.new
- i = 0
- while i<6_000_000
- i += 1
- x.k = i # x[10] = i
- end
-loop_count: 1
diff --git a/benchmark/vm2_struct_big_href_hi.yml b/benchmark/vm2_struct_big_href_hi.yml
deleted file mode 100644
index 60aa7fddf3..0000000000
--- a/benchmark/vm2_struct_big_href_hi.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-prelude: |
- s = Struct.new(*('a'..'z').map { |x| x.to_sym })
- x = s.new
-benchmark:
- vm2_struct_big_href_hi: |
- x[:z]
-loop_count: 6000000
diff --git a/benchmark/vm2_struct_big_href_lo.yml b/benchmark/vm2_struct_big_href_lo.yml
deleted file mode 100644
index c55c0bd16c..0000000000
--- a/benchmark/vm2_struct_big_href_lo.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-prelude: |
- s = Struct.new(*('a'..'z').map { |x| x.to_sym })
- x = s.new
-benchmark:
- vm2_struct_big_href_lo: |
- x[:k]
-loop_count: 6000000
diff --git a/benchmark/vm2_struct_big_hset.yml b/benchmark/vm2_struct_big_hset.yml
deleted file mode 100644
index d199c5bd47..0000000000
--- a/benchmark/vm2_struct_big_hset.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-# loop_count is not utilized since `i` is involved in the script
-benchmark:
- vm2_struct_big_hset: |
- s = Struct.new(*('a'..'z').map { |x| x.to_sym })
- x = s.new
- i = 0
- while i<6_000_000
- i += 1
- x[:k] = i
- end
-loop_count: 1
diff --git a/benchmark/vm2_struct_small_aref.yml b/benchmark/vm2_struct_small_aref.yml
deleted file mode 100644
index 83381bed3a..0000000000
--- a/benchmark/vm2_struct_small_aref.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-prelude: |
- s = Struct.new(:a, :b, :c)
- x = s.new
-benchmark:
- vm2_struct_small_aref: |
- x.a
-loop_count: 6000000
diff --git a/benchmark/vm2_struct_small_aset.yml b/benchmark/vm2_struct_small_aset.yml
deleted file mode 100644
index 3e84a61dd0..0000000000
--- a/benchmark/vm2_struct_small_aset.yml
+++ /dev/null
@@ -1,11 +0,0 @@
-# loop_count is not utilized since `i` is involved in the script
-benchmark:
- vm2_struct_small_aset: |
- s = Struct.new(:a, :b, :c)
- x = s.new
- i = 0
- while i<6_000_000
- i += 1
- x.a = i
- end
-loop_count: 1
diff --git a/benchmark/vm2_struct_small_href.yml b/benchmark/vm2_struct_small_href.yml
deleted file mode 100644
index b744f070d1..0000000000
--- a/benchmark/vm2_struct_small_href.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-prelude: |
- s = Struct.new(:a, :b, :c)
- x = s.new
-benchmark:
- vm2_struct_small_href: |
- x[:a]
-loop_count: 6000000
diff --git a/benchmark/vm2_struct_small_hset.yml b/benchmark/vm2_struct_small_hset.yml
deleted file mode 100644
index d43845d6e0..0000000000
--- a/benchmark/vm2_struct_small_hset.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-prelude: |
- s = Struct.new(:a, :b, :c)
- x = s.new
-benchmark:
- vm2_struct_small_hset: |
- x[:a] = 1
-loop_count: 6000000
diff --git a/benchmark/vm2_super.yml b/benchmark/vm2_super.yml
deleted file mode 100644
index 674743762a..0000000000
--- a/benchmark/vm2_super.yml
+++ /dev/null
@@ -1,17 +0,0 @@
-prelude: |
- class C
- def m
- 1
- end
- end
-
- class CC < C
- def m
- super()
- end
- end
-
- obj = CC.new
-benchmark:
- vm2_super: obj.m
-loop_count: 6000000
diff --git a/benchmark/vm2_unif1.yml b/benchmark/vm2_unif1.yml
deleted file mode 100644
index caef13279f..0000000000
--- a/benchmark/vm2_unif1.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-prelude: |
- def m a, b
- end
-benchmark:
- vm2_unif1: |
- m 100, 200
-loop_count: 6000000
diff --git a/benchmark/vm2_zsuper.yml b/benchmark/vm2_zsuper.yml
deleted file mode 100644
index f760cfd48e..0000000000
--- a/benchmark/vm2_zsuper.yml
+++ /dev/null
@@ -1,18 +0,0 @@
-prelude: |
- class C
- def m a
- 1
- end
- end
-
- class CC < C
- def m a
- super
- end
- end
-
- obj = CC.new
-benchmark:
- vm2_zsuper: |
- obj.m 10
-loop_count: 6000000
diff --git a/benchmark/vm3_gc_old_full.rb b/benchmark/vm3_gc_old_full.rb
deleted file mode 100644
index cfdfc8c5a5..0000000000
--- a/benchmark/vm3_gc_old_full.rb
+++ /dev/null
@@ -1,4 +0,0 @@
-old_object = Array.new(1_000_000){''}
-100.times do
- GC.start
-end
diff --git a/benchmark/vm3_gc_old_immediate.rb b/benchmark/vm3_gc_old_immediate.rb
deleted file mode 100644
index ad22feb655..0000000000
--- a/benchmark/vm3_gc_old_immediate.rb
+++ /dev/null
@@ -1,4 +0,0 @@
-old_object = Array.new(1_000_000){''}
-30_000.times do
- GC.start(full_mark: false, immediate_sweep: true)
-end
diff --git a/benchmark/vm3_gc_old_lazy.rb b/benchmark/vm3_gc_old_lazy.rb
deleted file mode 100644
index b74d44baf1..0000000000
--- a/benchmark/vm3_gc_old_lazy.rb
+++ /dev/null
@@ -1,4 +0,0 @@
-old_object = Array.new(1_000_000){''}
-30_000.times do
- GC.start(full_mark: false, immediate_sweep: false)
-end
diff --git a/benchmark/vm_thread_condvar1.rb b/benchmark/vm_thread_condvar1.rb
deleted file mode 100644
index cf5706b23e..0000000000
--- a/benchmark/vm_thread_condvar1.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-# two threads, two mutex, two condvar ping-pong
-require 'thread'
-m1 = Mutex.new
-m2 = Mutex.new
-cv1 = ConditionVariable.new
-cv2 = ConditionVariable.new
-max = 100000
-i = 0
-wait = nil
-m2.synchronize do
- wait = Thread.new do
- m1.synchronize do
- m2.synchronize { cv2.signal }
- while (i += 1) < max
- cv1.wait(m1)
- cv2.signal
- end
- end
- end
- cv2.wait(m2)
-end
-m1.synchronize do
- while i < max
- cv1.signal
- cv2.wait(m1)
- end
-end
-wait.join
diff --git a/benchmark/vm_thread_condvar2.rb b/benchmark/vm_thread_condvar2.rb
deleted file mode 100644
index 7c8dc19481..0000000000
--- a/benchmark/vm_thread_condvar2.rb
+++ /dev/null
@@ -1,35 +0,0 @@
-# many threads, one mutex, many condvars
-require 'thread'
-m = Mutex.new
-cv1 = ConditionVariable.new
-cv2 = ConditionVariable.new
-max = 1000
-n = 100
-waiting = 0
-scvs = []
-waiters = n.times.map do |i|
- start_cv = ConditionVariable.new
- scvs << start_cv
- start_mtx = Mutex.new
- start_mtx.synchronize do
- th = Thread.new(start_mtx, start_cv) do |sm, scv|
- m.synchronize do
- sm.synchronize { scv.signal }
- max.times do
- cv2.signal if (waiting += 1) == n
- cv1.wait(m)
- end
- end
- end
- start_cv.wait(start_mtx)
- th
- end
-end
-m.synchronize do
- max.times do
- cv2.wait(m) until waiting == n
- waiting = 0
- cv1.broadcast
- end
-end
-waiters.each(&:join)
diff --git a/benchmark/vm_thread_mutex1.rb b/benchmark/vm_thread_mutex1.rb
deleted file mode 100644
index 66e42c85e1..0000000000
--- a/benchmark/vm_thread_mutex1.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# one thread, one mutex (no contention)
-
-require 'thread'
-m = Thread::Mutex.new
-r = 0
-max = 2000
-lmax = max * max
-(1..1).map{
- Thread.new{
- i = 0
- while i<lmax
- i += 1
- m.synchronize{
- r += 1
- }
- end
- }
-}.each{|e|
- e.join
-}
-raise r.to_s if r != max * max
diff --git a/benchmark/vm_thread_mutex2.rb b/benchmark/vm_thread_mutex2.rb
deleted file mode 100644
index 6e6c804c31..0000000000
--- a/benchmark/vm_thread_mutex2.rb
+++ /dev/null
@@ -1,21 +0,0 @@
-# two threads, one mutex
-
-require 'thread'
-m = Thread::Mutex.new
-r = 0
-max = 2000
-lmax = (max * max)/2
-(1..2).map{
- Thread.new{
- i = 0
- while i<lmax
- i += 1
- m.synchronize{
- r += 1
- }
- end
- }
-}.each{|e|
- e.join
-}
-raise r.to_s if r != max * max
diff --git a/benchmark/vm_thread_mutex3.rb b/benchmark/vm_thread_mutex3.rb
deleted file mode 100644
index c750dc542a..0000000000
--- a/benchmark/vm_thread_mutex3.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# 1000 threads, one mutex
-
-require 'thread'
-m = Thread::Mutex.new
-r = 0
-max = 2000
-(1..max).map{
- Thread.new{
- i = 0
- while i<max
- i += 1
- m.synchronize{
- r += 1
- }
- end
- }
-}.each{|e|
- e.join
-}
-raise r.to_s if r != max * max
diff --git a/benchmark/vm_thread_pass_flood.rb b/benchmark/vm_thread_pass_flood.rb
deleted file mode 100644
index a660aafc18..0000000000
--- a/benchmark/vm_thread_pass_flood.rb
+++ /dev/null
@@ -1,10 +0,0 @@
-# n.b. this is a good test for GVL when pinned to a single CPU
-
-1000.times{
- Thread.new{loop{Thread.pass}}
-}
-
-i = 0
-while i<10000
- i += 1
-end
diff --git a/benchmark/vm_thread_queue.rb b/benchmark/vm_thread_queue.rb
deleted file mode 100644
index 274ceda366..0000000000
--- a/benchmark/vm_thread_queue.rb
+++ /dev/null
@@ -1,18 +0,0 @@
-require 'thread'
-
-n = 1_000_000
-q = Thread::Queue.new
-consumer = Thread.new{
- while q.pop
- # consuming
- end
-}
-
-producer = Thread.new{
- n.times{
- q.push true
- }
- q.push nil
-}
-
-consumer.join
diff --git a/benchmark/vm_thread_sized_queue.rb b/benchmark/vm_thread_sized_queue.rb
deleted file mode 100644
index 7b9af5482b..0000000000
--- a/benchmark/vm_thread_sized_queue.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-require 'thread'
-# on producer, one consumer
-
-n = 1_000_000
-q = Thread::SizedQueue.new(100)
-consumer = Thread.new{
- while q.pop
- # consuming
- end
-}
-
-producer = Thread.new{
- while n > 0
- q.push true
- n -= 1
- end
- q.push nil
-}
-
-consumer.join
diff --git a/benchmark/vm_thread_sized_queue2.rb b/benchmark/vm_thread_sized_queue2.rb
deleted file mode 100644
index de9f55e978..0000000000
--- a/benchmark/vm_thread_sized_queue2.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-require 'thread'
-# one producer, many consumers
-n = 1_000_000
-m = 10
-q = Thread::SizedQueue.new(100)
-consumers = m.times.map do
- Thread.new do
- while q.pop
- # consuming
- end
- end
-end
-
-producer = Thread.new do
- while n > 0
- q.push true
- n -= 1
- end
- m.times { q.push nil }
-end
-
-producer.join
-consumers.each(&:join)
diff --git a/benchmark/vm_thread_sized_queue3.rb b/benchmark/vm_thread_sized_queue3.rb
deleted file mode 100644
index ce5f1796d8..0000000000
--- a/benchmark/vm_thread_sized_queue3.rb
+++ /dev/null
@@ -1,22 +0,0 @@
-require 'thread'
-# many producers, one consumer
-n = 1_000_000
-m = 10
-q = Thread::SizedQueue.new(100)
-consumer = Thread.new do
- while q.pop
- # consuming
- end
-end
-
-producers = m.times.map do
- Thread.new do
- while n > 0
- q.push true
- n -= 1
- end
- end
-end
-producers.each(&:join)
-q.push nil
-consumer.join
diff --git a/benchmark/vm_thread_sized_queue4.rb b/benchmark/vm_thread_sized_queue4.rb
deleted file mode 100644
index a9b7d80ec0..0000000000
--- a/benchmark/vm_thread_sized_queue4.rb
+++ /dev/null
@@ -1,26 +0,0 @@
-require 'thread'
-# many producers, many consumers
-nr = 1_000_000
-n = 10
-m = 10
-q = Thread::SizedQueue.new(100)
-consumers = n.times.map do
- Thread.new do
- while q.pop
- # consuming
- end
- end
-end
-
-producers = m.times.map do
- Thread.new do
- while nr > 0
- q.push true
- nr -= 1
- end
- end
-end
-
-producers.each(&:join)
-n.times { q.push nil }
-consumers.each(&:join)
diff --git a/benchmark/wc.input.base b/benchmark/wc.input.base
new file mode 100644
index 0000000000..41143fbac0
--- /dev/null
+++ b/benchmark/wc.input.base
@@ -0,0 +1,25 @@
+Subject: Re: Who was Izchak Miller?
+From: "Jane D. Anonymous" <nobody@yale.edu>
+Date: 1996/04/28
+Message-Id: <4lv7bc$oh@news.ycc.yale.edu>
+References: <317C405E.5DFA@panix.com> <4lk6vl$gde@ns.oar.net>
+To: 75176.2330@compuserve.com
+Content-Type: text/plain; charset=us-ascii
+Organization: Yale University
+X-Url: news:4lk6vl$gde@ns.oar.net
+Mime-Version: 1.0
+Newsgroups: rec.games.roguelike.nethack
+X-Mailer: Mozilla 1.1N (Macintosh; I; 68K)
+
+Hello there, Izchak Miller was my father. When I was younger I spent
+many a night, hunched over the keyboard with a cup of tea, playing
+nethack with him and my brother. my dad was a philosopher with a strong
+weakness for fantasy/sci fi. I remember when he started to get involved
+with the Nethack team- my brother's Dungeons and Dragons monster book
+found a regular place beside my dad's desk. it's nice to see him living
+on in the game he loved so much :-).
+ Tamar Miller
+
+The following is a really long word of 5000 characters:
+
+wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
diff --git a/bignum.c b/bignum.c
index ee3b49fd04..cdb84c600d 100644
--- a/bignum.c
+++ b/bignum.c
@@ -12,7 +12,6 @@
#include "internal.h"
#include "ruby/thread.h"
#include "ruby/util.h"
-#include "id.h"
#ifdef HAVE_STRINGS_H
#include <strings.h>
@@ -23,7 +22,7 @@
#ifdef HAVE_IEEEFP_H
#include <ieeefp.h>
#endif
-#include "ruby_assert.h"
+#include <assert.h>
#if defined(HAVE_LIBGMP) && defined(HAVE_GMP_H)
#define USE_GMP
@@ -32,9 +31,7 @@
#define RB_BIGNUM_TYPE_P(x) RB_TYPE_P((x), T_BIGNUM)
-#ifndef RUBY_INTEGER_UNIFICATION
VALUE rb_cBignum;
-#endif
const char ruby_digitmap[] = "0123456789abcdefghijklmnopqrstuvwxyz";
#ifndef SIZEOF_BDIGIT_DBL
@@ -65,6 +62,7 @@ STATIC_ASSERT(sizeof_long_and_sizeof_bdigit, SIZEOF_BDIGIT % SIZEOF_LONG == 0);
#else
# define HOST_BIGENDIAN_P 0
#endif
+#define ALIGNOF(type) ((int)offsetof(struct { char f1; type f2; }, f2))
/* (!LSHIFTABLE(d, n) ? 0 : (n)) is same as n but suppress a warning, C4293, by Visual Studio. */
#define LSHIFTABLE(d, n) ((n) < sizeof(d) * CHAR_BIT)
#define LSHIFTX(d, n) (!LSHIFTABLE(d, n) ? 0 : ((d) << (!LSHIFTABLE(d, n) ? 0 : (n))))
@@ -112,7 +110,7 @@ STATIC_ASSERT(sizeof_long_and_sizeof_bdigit, SIZEOF_BDIGIT % SIZEOF_LONG == 0);
#define BIGNUM_SET_NEGATIVE_SIGN(b) BIGNUM_SET_SIGN(b, 0)
#define BIGNUM_SET_POSITIVE_SIGN(b) BIGNUM_SET_SIGN(b, 1)
-#define bignew(len,sign) bignew_1(rb_cInteger,(len),(sign))
+#define bignew(len,sign) bignew_1(rb_cBignum,(len),(sign))
#define BDIGITS_ZERO(ptr, n) do { \
BDIGIT *bdigitz_zero_ptr = (ptr); \
@@ -138,11 +136,6 @@ STATIC_ASSERT(sizeof_long_and_sizeof_bdigit, SIZEOF_BDIGIT % SIZEOF_LONG == 0);
#define GMP_DIV_DIGITS 20
#define GMP_BIG2STR_DIGITS 20
#define GMP_STR2BIG_DIGITS 20
-#ifdef USE_GMP
-# define NAIVE_MUL_DIGITS GMP_MUL_DIGITS
-#else
-# define NAIVE_MUL_DIGITS KARATSUBA_MUL_DIGITS
-#endif
typedef void (mulfunc_t)(BDIGIT *zds, size_t zn, const BDIGIT *xds, size_t xn, const BDIGIT *yds, size_t yn, BDIGIT *wds, size_t wn);
@@ -385,7 +378,6 @@ bdigitdbl2bary(BDIGIT *ds, size_t n, BDIGIT_DBL num)
static int
bary_cmp(const BDIGIT *xds, size_t xn, const BDIGIT *yds, size_t yn)
{
- size_t i;
BARY_TRUNC(xds, xn);
BARY_TRUNC(yds, yn);
@@ -394,12 +386,11 @@ bary_cmp(const BDIGIT *xds, size_t xn, const BDIGIT *yds, size_t yn)
if (xn > yn)
return 1;
- for (i = 0; i < xn; i++)
- if (xds[xn - i - 1] != yds[yn - i - 1])
- break;
- if (i == xn)
+ while (xn-- && xds[xn] == yds[xn])
+ ;
+ if (xn == (size_t)-1)
return 0;
- return xds[xn - i - 1] < yds[yn - i - 1] ? -1 : 1;
+ return xds[xn] < yds[xn] ? -1 : 1;
}
static BDIGIT
@@ -420,22 +411,22 @@ bary_small_lshift(BDIGIT *zds, const BDIGIT *xds, size_t n, int shift)
static void
bary_small_rshift(BDIGIT *zds, const BDIGIT *xds, size_t n, int shift, BDIGIT higher_bdigit)
{
- size_t i;
BDIGIT_DBL num = 0;
+ BDIGIT x;
assert(0 <= shift && shift < BITSPERDIG);
num = BIGUP(higher_bdigit);
- for (i = 0; i < n; i++) {
- BDIGIT x = xds[n - i - 1];
- num = (num | x) >> shift;
- zds[n - i - 1] = BIGLO(num);
+ while (n--) {
+ num = (num | xds[n]) >> shift;
+ x = xds[n];
+ zds[n] = BIGLO(num);
num = BIGUP(x);
}
}
static int
-bary_zero_p(const BDIGIT *xds, size_t xn)
+bary_zero_p(BDIGIT *xds, size_t xn)
{
if (xn == 0)
return 1;
@@ -448,9 +439,8 @@ bary_zero_p(const BDIGIT *xds, size_t xn)
static void
bary_neg(BDIGIT *ds, size_t n)
{
- size_t i;
- for (i = 0; i < n; i++)
- ds[n - i - 1] = BIGLO(~ds[n - i - 1]);
+ while (n--)
+ ds[n] = BIGLO(~ds[n]);
}
static int
@@ -620,12 +610,8 @@ static int
bytes_2comp(unsigned char *buf, size_t len)
{
size_t i;
- for (i = 0; i < len; i++) {
- signed char c = buf[i];
- signed int d = ~c;
- unsigned int e = d & 0xFF;
- buf[i] = e;
- }
+ for (i = 0; i < len; i++)
+ buf[i] = ~buf[i];
for (i = 0; i < len; i++) {
buf[i]++;
if (buf[i] != 0)
@@ -675,7 +661,7 @@ bary_pack(int sign, BDIGIT *ds, size_t num_bdigits, void *words, size_t numwords
return ((1 < de - dp || CLEAR_LOWBITS(d, 8) != 0) ? 2 : 1) * sign;
}
#if defined(HAVE_UINT16_T) && 2 <= SIZEOF_BDIGIT
- if (wordsize == 2 && (uintptr_t)words % RUBY_ALIGNOF(uint16_t) == 0) {
+ if (wordsize == 2 && (uintptr_t)words % ALIGNOF(uint16_t) == 0) {
uint16_t u = (uint16_t)(d = dp[0]);
if (need_swap) u = swap16(u);
*((uint16_t *)words) = u;
@@ -683,7 +669,7 @@ bary_pack(int sign, BDIGIT *ds, size_t num_bdigits, void *words, size_t numwords
}
#endif
#if defined(HAVE_UINT32_T) && 4 <= SIZEOF_BDIGIT
- if (wordsize == 4 && (uintptr_t)words % RUBY_ALIGNOF(uint32_t) == 0) {
+ if (wordsize == 4 && (uintptr_t)words % ALIGNOF(uint32_t) == 0) {
uint32_t u = (uint32_t)(d = dp[0]);
if (need_swap) u = swap32(u);
*((uint32_t *)words) = u;
@@ -691,7 +677,7 @@ bary_pack(int sign, BDIGIT *ds, size_t num_bdigits, void *words, size_t numwords
}
#endif
#if defined(HAVE_UINT64_T) && 8 <= SIZEOF_BDIGIT
- if (wordsize == 8 && (uintptr_t)words % RUBY_ALIGNOF(uint64_t) == 0) {
+ if (wordsize == 8 && (uintptr_t)words % ALIGNOF(uint64_t) == 0) {
uint64_t u = (uint64_t)(d = dp[0]);
if (need_swap) u = swap64(u);
*((uint64_t *)words) = u;
@@ -706,7 +692,7 @@ bary_pack(int sign, BDIGIT *ds, size_t num_bdigits, void *words, size_t numwords
return (1 < de - dp || FILL_LOWBITS(d, 8) != -1) ? -2 : -1;
}
#if defined(HAVE_UINT16_T) && 2 <= SIZEOF_BDIGIT
- if (wordsize == 2 && (uintptr_t)words % RUBY_ALIGNOF(uint16_t) == 0) {
+ if (wordsize == 2 && (uintptr_t)words % ALIGNOF(uint16_t) == 0) {
uint16_t u = (uint16_t)(d = -(BDIGIT_DBL_SIGNED)dp[0]);
if (need_swap) u = swap16(u);
*((uint16_t *)words) = u;
@@ -715,7 +701,7 @@ bary_pack(int sign, BDIGIT *ds, size_t num_bdigits, void *words, size_t numwords
}
#endif
#if defined(HAVE_UINT32_T) && 4 <= SIZEOF_BDIGIT
- if (wordsize == 4 && (uintptr_t)words % RUBY_ALIGNOF(uint32_t) == 0) {
+ if (wordsize == 4 && (uintptr_t)words % ALIGNOF(uint32_t) == 0) {
uint32_t u = (uint32_t)(d = -(BDIGIT_DBL_SIGNED)dp[0]);
if (need_swap) u = swap32(u);
*((uint32_t *)words) = u;
@@ -724,7 +710,7 @@ bary_pack(int sign, BDIGIT *ds, size_t num_bdigits, void *words, size_t numwords
}
#endif
#if defined(HAVE_UINT64_T) && 8 <= SIZEOF_BDIGIT
- if (wordsize == 8 && (uintptr_t)words % RUBY_ALIGNOF(uint64_t) == 0) {
+ if (wordsize == 8 && (uintptr_t)words % ALIGNOF(uint64_t) == 0) {
uint64_t u = (uint64_t)(d = -(BDIGIT_DBL_SIGNED)dp[0]);
if (need_swap) u = swap64(u);
*((uint64_t *)words) = u;
@@ -767,7 +753,7 @@ bary_pack(int sign, BDIGIT *ds, size_t num_bdigits, void *words, size_t numwords
}
#endif
if (nails == 0 && SIZEOF_BDIGIT == sizeof(BDIGIT) &&
- wordsize % SIZEOF_BDIGIT == 0 && (uintptr_t)words % RUBY_ALIGNOF(BDIGIT) == 0) {
+ wordsize % SIZEOF_BDIGIT == 0 && (uintptr_t)words % ALIGNOF(BDIGIT) == 0) {
size_t bdigits_per_word = wordsize / SIZEOF_BDIGIT;
size_t src_num_bdigits = de - dp;
size_t dst_num_bdigits = numwords * bdigits_per_word;
@@ -910,6 +896,8 @@ bary_pack(int sign, BDIGIT *ds, size_t num_bdigits, void *words, size_t numwords
}
if ((flags & INTEGER_PACK_2COMP) && (sign < 0 && numwords != 0)) {
+ unsigned char *buf;
+
int word_num_partialbits;
size_t word_num_fullbytes;
@@ -1087,13 +1075,6 @@ integer_unpack_single_bdigit(BDIGIT u, size_t size, int flags, BDIGIT *dp)
return sign;
}
-#ifdef HAVE_BUILTIN___BUILTIN_ASSUME_ALIGNED
-#define reinterpret_cast(type, value) (type) \
- __builtin_assume_aligned((value), sizeof(*(type)NULL));
-#else
-#define reinterpret_cast(type, value) (type)value
-#endif
-
static int
bary_unpack_internal(BDIGIT *bdigits, size_t num_bdigits, const void *words, size_t numwords, size_t wordsize, size_t nails, int flags, int nlp_bits)
{
@@ -1114,24 +1095,23 @@ bary_unpack_internal(BDIGIT *bdigits, size_t num_bdigits, const void *words, siz
return integer_unpack_single_bdigit(*(uint8_t *)buf, sizeof(uint8_t), flags, dp);
}
#if defined(HAVE_UINT16_T) && 2 <= SIZEOF_BDIGIT
- if (wordsize == 2 && (uintptr_t)words % RUBY_ALIGNOF(uint16_t) == 0) {
- uint16_t u = *reinterpret_cast(const uint16_t *, buf);
+ if (wordsize == 2 && (uintptr_t)words % ALIGNOF(uint16_t) == 0) {
+ uint16_t u = *(uint16_t *)buf;
return integer_unpack_single_bdigit(need_swap ? swap16(u) : u, sizeof(uint16_t), flags, dp);
}
#endif
#if defined(HAVE_UINT32_T) && 4 <= SIZEOF_BDIGIT
- if (wordsize == 4 && (uintptr_t)words % RUBY_ALIGNOF(uint32_t) == 0) {
- uint32_t u = *reinterpret_cast(const uint32_t *, buf);
+ if (wordsize == 4 && (uintptr_t)words % ALIGNOF(uint32_t) == 0) {
+ uint32_t u = *(uint32_t *)buf;
return integer_unpack_single_bdigit(need_swap ? swap32(u) : u, sizeof(uint32_t), flags, dp);
}
#endif
#if defined(HAVE_UINT64_T) && 8 <= SIZEOF_BDIGIT
- if (wordsize == 8 && (uintptr_t)words % RUBY_ALIGNOF(uint64_t) == 0) {
- uint64_t u = *reinterpret_cast(const uint64_t *, buf);
+ if (wordsize == 8 && (uintptr_t)words % ALIGNOF(uint64_t) == 0) {
+ uint64_t u = *(uint64_t *)buf;
return integer_unpack_single_bdigit(need_swap ? swap64(u) : u, sizeof(uint64_t), flags, dp);
}
#endif
-#undef reinterpret_cast
}
#if !defined(WORDS_BIGENDIAN)
if (nails == 0 && SIZEOF_BDIGIT == sizeof(BDIGIT) &&
@@ -1447,9 +1427,7 @@ bary_add_one(BDIGIT *ds, size_t n)
{
size_t i;
for (i = 0; i < n; i++) {
- BDIGIT_DBL n = ds[i];
- n += 1;
- ds[i] = BIGLO(n);
+ ds[i] = BIGLO(ds[i]+1);
if (ds[i] != 0)
return 0;
}
@@ -1517,16 +1495,15 @@ bigdivrem_mulsub(BDIGIT *zds, size_t zn, BDIGIT x, const BDIGIT *yds, size_t yn)
i = 0;
do {
- BDIGIT_DBL_SIGNED ee;
+ BDIGIT_DBL ee;
t2 += (BDIGIT_DBL)yds[i] * x;
ee = num - BIGLO(t2);
- num = (BDIGIT_DBL_SIGNED)zds[i] + ee;
+ num = (BDIGIT_DBL)zds[i] + ee;
if (ee) zds[i] = BIGLO(num);
num = BIGDN(num);
t2 = BIGDN(t2);
} while (++i < yn);
- num -= (BDIGIT_DBL_SIGNED)t2;
- num += (BDIGIT_DBL_SIGNED)zds[yn]; /* borrow from high digit; don't update */
+ num += zds[i] - t2; /* borrow from high digit; don't update */
return num;
}
@@ -2508,8 +2485,13 @@ bary_mul_toom3_start(BDIGIT *zds, size_t zn, const BDIGIT *xds, size_t xn, const
static void
bary_mul(BDIGIT *zds, size_t zn, const BDIGIT *xds, size_t xn, const BDIGIT *yds, size_t yn)
{
+#ifdef USE_GMP
+ const size_t naive_threshold = GMP_MUL_DIGITS;
+#else
+ const size_t naive_threshold = KARATSUBA_MUL_DIGITS;
+#endif
if (xn <= yn) {
- if (xn < NAIVE_MUL_DIGITS) {
+ if (xn < naive_threshold) {
if (xds == yds && xn == yn)
bary_sq_fast(zds, zn, xds, xn);
else
@@ -2518,7 +2500,7 @@ bary_mul(BDIGIT *zds, size_t zn, const BDIGIT *xds, size_t xn, const BDIGIT *yds
}
}
else {
- if (yn < NAIVE_MUL_DIGITS) {
+ if (yn < naive_threshold) {
bary_short_mul(zds, zn, yds, yn, xds, xn);
return;
}
@@ -2594,9 +2576,10 @@ bigdivrem_single1(BDIGIT *qds, const BDIGIT *xds, size_t xn, BDIGIT x_higher_bdi
size_t i;
BDIGIT_DBL t2;
t2 = x_higher_bdigit;
- for (i = 0; i < xn; i++) {
- t2 = BIGUP(t2) + xds[xn - i - 1];
- qds[xn - i - 1] = (BDIGIT)(t2 / y);
+ i = xn;
+ while (i--) {
+ t2 = BIGUP(t2) + xds[i];
+ qds[i] = (BDIGIT)(t2 / y);
t2 %= y;
}
return (BDIGIT)t2;
@@ -2995,7 +2978,7 @@ static VALUE
bignew_1(VALUE klass, size_t len, int sign)
{
NEWOBJ_OF(big, struct RBignum, klass, T_BIGNUM | (RGENGC_WB_PROTECTED_BIGNUM ? FL_WB_PROTECTED : 0));
- BIGNUM_SET_SIGN(big, sign);
+ BIGNUM_SET_SIGN(big, sign?1:0);
if (len <= BIGNUM_EMBED_LEN_MAX) {
RBASIC(big)->flags |= BIGNUM_EMBED_FLAG;
BIGNUM_SET_LEN(big, len);
@@ -3154,7 +3137,7 @@ rb_big_norm(VALUE x)
}
VALUE
-rb_uint2big(uintptr_t n)
+rb_uint2big(VALUE n)
{
long i;
VALUE big = bignew(bdigit_roomof(SIZEOF_VALUE), 1);
@@ -3176,7 +3159,7 @@ rb_uint2big(uintptr_t n)
}
VALUE
-rb_int2big(intptr_t n)
+rb_int2big(SIGNED_VALUE n)
{
long neg = 0;
VALUE u;
@@ -3191,20 +3174,20 @@ rb_int2big(intptr_t n)
}
big = rb_uint2big(u);
if (neg) {
- BIGNUM_SET_NEGATIVE_SIGN(big);
+ BIGNUM_SET_SIGN(big, 0);
}
return big;
}
VALUE
-rb_uint2inum(uintptr_t n)
+rb_uint2inum(VALUE n)
{
if (POSFIXABLE(n)) return LONG2FIX(n);
return rb_uint2big(n);
}
VALUE
-rb_int2inum(intptr_t n)
+rb_int2inum(SIGNED_VALUE n)
{
if (FIXABLE(n)) return LONG2FIX(n);
return rb_int2big(n);
@@ -3702,44 +3685,16 @@ rb_integer_unpack(const void *words, size_t numwords, size_t wordsize, size_t na
#define conv_digit(c) (ruby_digit36_to_number_table[(unsigned char)(c)])
-NORETURN(static inline void invalid_radix(int base));
-NORETURN(static inline void invalid_integer(VALUE s));
-
-static inline int
-valid_radix_p(int base)
-{
- return (1 < base && base <= 36);
-}
-
-static inline void
-invalid_radix(int base)
-{
- rb_raise(rb_eArgError, "invalid radix %d", base);
-}
-
-static inline void
-invalid_integer(VALUE s)
-{
- rb_raise(rb_eArgError, "invalid value for Integer(): %+"PRIsVALUE, s);
-}
-
-static int
-str2big_scan_digits(const char *s, const char *str, int base, int badcheck, size_t *num_digits_p, ssize_t *len_p)
+static void
+str2big_scan_digits(const char *s, const char *str, int base, int badcheck, size_t *num_digits_p, size_t *len_p)
{
char nondigit = 0;
size_t num_digits = 0;
const char *digits_start = str;
const char *digits_end = str;
- ssize_t len = *len_p;
int c;
- if (!len) {
- *num_digits_p = 0;
- *len_p = 0;
- return TRUE;
- }
-
if (badcheck && *str == '_') goto bad;
while ((c = *str++) != 0) {
@@ -3749,32 +3704,27 @@ str2big_scan_digits(const char *s, const char *str, int base, int badcheck, size
break;
}
nondigit = (char) c;
+ continue;
}
- else if ((c = conv_digit(c)) < 0 || c >= base) {
+ else if ((c = conv_digit(c)) < 0) {
break;
}
- else {
- nondigit = 0;
- num_digits++;
- digits_end = str;
- }
- if (len > 0 && !--len) break;
+ if (c >= base) break;
+ nondigit = 0;
+ num_digits++;
+ digits_end = str;
}
- if (badcheck && nondigit) goto bad;
- if (badcheck && len) {
+ if (badcheck) {
str--;
- while (*str && ISSPACE(*str)) {
- str++;
- if (len > 0 && !--len) break;
- }
- if (len && *str) {
+ if (s+1 < str && str[-1] == '_') goto bad;
+ while (*str && ISSPACE(*str)) str++;
+ if (*str) {
bad:
- return FALSE;
+ rb_invalid_str(s, "Integer()");
}
}
*num_digits_p = num_digits;
*len_p = digits_end - digits_start;
- return TRUE;
}
static VALUE
@@ -4008,96 +3958,56 @@ str2big_gmp(
VALUE
rb_cstr_to_inum(const char *str, int base, int badcheck)
{
- char *end;
- VALUE ret = rb_cstr_parse_inum(str, -1, (badcheck ? NULL : &end), base);
- if (NIL_P(ret)) {
- if (badcheck) rb_invalid_str(str, "Integer()");
- ret = INT2FIX(0);
- }
- return ret;
-}
-
-/*
- * Parse +str+ as Ruby Integer, i.e., underscores, 0d and 0b prefixes.
- *
- * str: pointer to the string to be parsed.
- * should be NUL-terminated if +len+ is negative.
- * len: length of +str+ if >= 0. if +len+ is negative, +str+ should
- * be NUL-terminated.
- * endp: if non-NULL, the address after parsed part is stored. if
- * NULL, Qnil is returned when +str+ is not valid as an Integer.
- * ndigits: if non-NULL, the number of parsed digits is stored.
- * base: see +rb_cstr_to_inum+
- * flags: bitwise OR of below flags:
- * RB_INT_PARSE_SIGN: allow preceding spaces and +/- sign
- * RB_INT_PARSE_UNDERSCORE: allow an underscore between digits
- * RB_INT_PARSE_PREFIX: allow preceding prefix
- */
-
-VALUE
-rb_int_parse_cstr(const char *str, ssize_t len, char **endp, size_t *ndigits,
- int base, int flags)
-{
- const char *const s = str;
+ const char *s = str;
char sign = 1;
int c;
- VALUE z = Qnil;
+ VALUE z;
- unsigned long val;
- int ov;
+ int bits_per_digit;
const char *digits_start, *digits_end;
- size_t num_digits = 0;
+ size_t num_digits;
size_t num_bdigits;
- const ssize_t len0 = len;
- const int badcheck = !endp;
-
-#define ADV(n) do {\
- if (len > 0 && len <= (n)) goto bad; \
- str += (n); \
- len -= (n); \
- } while (0)
-#define ASSERT_LEN() do {\
- assert(len != 0); \
- if (len0 >= 0) assert(s + len0 == str + len); \
- } while (0)
+ size_t len;
if (!str) {
- bad:
- if (endp) *endp = (char *)str;
- if (ndigits) *ndigits = num_digits;
- return z;
+ if (badcheck) {
+ bad:
+ rb_invalid_str(s, "Integer()");
+ }
+ return INT2FIX(0);
}
- if (len && (flags & RB_INT_PARSE_SIGN)) {
- while (ISSPACE(*str)) ADV(1);
+ while (ISSPACE(*str)) str++;
- if (str[0] == '+') {
- ADV(1);
- }
- else if (str[0] == '-') {
- ADV(1);
- sign = 0;
- }
- ASSERT_LEN();
+ if (str[0] == '+') {
+ str++;
+ }
+ else if (str[0] == '-') {
+ str++;
+ sign = 0;
+ }
+ if (str[0] == '+' || str[0] == '-') {
+ if (badcheck) goto bad;
+ return INT2FIX(0);
}
if (base <= 0) {
- if (str[0] == '0' && len > 1) {
+ if (str[0] == '0') {
switch (str[1]) {
case 'x': case 'X':
base = 16;
- ADV(2);
+ str += 2;
break;
case 'b': case 'B':
base = 2;
- ADV(2);
+ str += 2;
break;
case 'o': case 'O':
base = 8;
- ADV(2);
+ str += 2;
break;
case 'd': case 'D':
base = 10;
- ADV(2);
+ str += 2;
break;
default:
base = 8;
@@ -4110,75 +4020,59 @@ rb_int_parse_cstr(const char *str, ssize_t len, char **endp, size_t *ndigits,
base = 10;
}
}
- else if (len == 1 || !(flags & RB_INT_PARSE_PREFIX)) {
- /* no prefix */
- }
else if (base == 2) {
if (str[0] == '0' && (str[1] == 'b'||str[1] == 'B')) {
- ADV(2);
+ str += 2;
}
}
else if (base == 8) {
if (str[0] == '0' && (str[1] == 'o'||str[1] == 'O')) {
- ADV(2);
+ str += 2;
}
}
else if (base == 10) {
if (str[0] == '0' && (str[1] == 'd'||str[1] == 'D')) {
- ADV(2);
+ str += 2;
}
}
else if (base == 16) {
if (str[0] == '0' && (str[1] == 'x'||str[1] == 'X')) {
- ADV(2);
+ str += 2;
}
}
- if (!valid_radix_p(base)) {
- invalid_radix(base);
+ if (base < 2 || 36 < base) {
+ rb_raise(rb_eArgError, "invalid radix %d", base);
}
- if (!len) goto bad;
- num_digits = str - s;
- if (*str == '0' && len != 1) { /* squeeze preceding 0s */
+ if (*str == '0') { /* squeeze preceding 0s */
int us = 0;
- const char *end = len < 0 ? NULL : str + len;
- ++num_digits;
- while ((c = *++str) == '0' ||
- ((flags & RB_INT_PARSE_UNDERSCORE) && c == '_')) {
+ while ((c = *++str) == '0' || c == '_') {
if (c == '_') {
if (++us >= 2)
break;
}
else {
- ++num_digits;
us = 0;
}
- if (str == end) break;
}
- if (!c || ISSPACE(c)) --str;
- if (end) len = end - str;
- ASSERT_LEN();
+ if (!(c = *str) || ISSPACE(c)) --str;
}
c = *str;
c = conv_digit(c);
if (c < 0 || c >= base) {
- if (!badcheck && num_digits) z = INT2FIX(0);
- goto bad;
- }
-
- if (ndigits) *ndigits = num_digits;
- val = ruby_scan_digits(str, len, base, &num_digits, &ov);
- if (!ov) {
- const char *end = &str[num_digits];
- if (num_digits > 0 && *end == '_' && (flags & RB_INT_PARSE_UNDERSCORE))
- goto bigparse;
- if (endp) *endp = (char *)end;
- if (ndigits) *ndigits += num_digits;
+ if (badcheck) goto bad;
+ return INT2FIX(0);
+ }
+
+ bits_per_digit = bit_length(base-1);
+ if (bits_per_digit * strlen(str) <= sizeof(long) * CHAR_BIT) {
+ char *end;
+ unsigned long val = STRTOUL(str, &end, base);
+
+ if (str < end && *end == '_') goto bigparse;
if (badcheck) {
- if (num_digits == 0) return Qnil; /* no number */
- while (len < 0 ? *end : end < str + len) {
- if (!ISSPACE(*end)) return Qnil; /* trailing garbage */
- end++;
- }
+ if (end == str) goto bad; /* no number */
+ while (*end && ISSPACE(*end)) end++;
+ if (*end) goto bad; /* trailing garbage */
}
if (POSFIXABLE(val)) {
@@ -4197,15 +4091,12 @@ rb_int_parse_cstr(const char *str, ssize_t len, char **endp, size_t *ndigits,
bigparse:
digits_start = str;
- if (!str2big_scan_digits(s, str, base, badcheck, &num_digits, &len))
- goto bad;
- if (endp) *endp = (char *)(str + len);
- if (ndigits) *ndigits += num_digits;
+ str2big_scan_digits(s, str, base, badcheck, &num_digits, &len);
digits_end = digits_start + len;
if (POW2_P(base)) {
z = str2big_poweroftwo(sign, digits_start, digits_end, num_digits,
- bit_length(base-1));
+ bits_per_digit);
}
else {
int digits_per_bdigits_dbl;
@@ -4233,38 +4124,35 @@ rb_int_parse_cstr(const char *str, ssize_t len, char **endp, size_t *ndigits,
}
VALUE
-rb_cstr_parse_inum(const char *str, ssize_t len, char **endp, int base)
-{
- return rb_int_parse_cstr(str, len, endp, NULL, base,
- RB_INT_PARSE_DEFAULT);
-}
-
-VALUE
-rb_str_convert_to_inum(VALUE str, int base, int badcheck, int raise_exception)
+rb_str_to_inum(VALUE str, int base, int badcheck)
{
- VALUE ret;
- const char *s;
+ char *s;
long len;
- char *end;
+ VALUE v = 0;
+ VALUE ret;
StringValue(str);
rb_must_asciicompat(str);
- RSTRING_GETMEM(str, s, len);
- ret = rb_cstr_parse_inum(s, len, (badcheck ? NULL : &end), base);
- if (NIL_P(ret)) {
- if (badcheck) {
- if (!raise_exception) return Qnil;
- invalid_integer(str);
- }
- ret = INT2FIX(0);
+ if (badcheck) {
+ s = StringValueCStr(str);
}
- return ret;
-}
+ else {
+ s = RSTRING_PTR(str);
+ }
+ if (s) {
+ len = RSTRING_LEN(str);
+ if (s[len]) { /* no sentinel somehow */
+ char *p = ALLOCV(v, len+1);
-VALUE
-rb_str_to_inum(VALUE str, int base, int badcheck)
-{
- return rb_str_convert_to_inum(str, base, badcheck, TRUE);
+ MEMCPY(p, s, char, len);
+ p[len] = '\0';
+ s = p;
+ }
+ }
+ ret = rb_cstr_to_inum(s, base, badcheck);
+ if (v)
+ ALLOCV_END(v);
+ return ret;
}
VALUE
@@ -4274,25 +4162,22 @@ rb_str2big_poweroftwo(VALUE arg, int base, int badcheck)
const char *s, *str;
const char *digits_start, *digits_end;
size_t num_digits;
- ssize_t len;
+ size_t len;
VALUE z;
- if (!valid_radix_p(base) || !POW2_P(base)) {
- invalid_radix(base);
+ if (base < 2 || 36 < base || !POW2_P(base)) {
+ rb_raise(rb_eArgError, "invalid radix %d", base);
}
rb_must_asciicompat(arg);
s = str = StringValueCStr(arg);
- len = RSTRING_LEN(arg);
if (*str == '-') {
- len--;
str++;
positive_p = 0;
}
digits_start = str;
- if (!str2big_scan_digits(s, str, base, badcheck, &num_digits, &len))
- invalid_integer(arg);
+ str2big_scan_digits(s, str, base, badcheck, &num_digits, &len);
digits_end = digits_start + len;
z = str2big_poweroftwo(positive_p, digits_start, digits_end, num_digits,
@@ -4310,28 +4195,25 @@ rb_str2big_normal(VALUE arg, int base, int badcheck)
const char *s, *str;
const char *digits_start, *digits_end;
size_t num_digits;
- ssize_t len;
+ size_t len;
VALUE z;
int digits_per_bdigits_dbl;
size_t num_bdigits;
- if (!valid_radix_p(base)) {
- invalid_radix(base);
+ if (base < 2 || 36 < base) {
+ rb_raise(rb_eArgError, "invalid radix %d", base);
}
rb_must_asciicompat(arg);
- s = str = StringValuePtr(arg);
- len = RSTRING_LEN(arg);
- if (len > 0 && *str == '-') {
- len--;
+ s = str = StringValueCStr(arg);
+ if (*str == '-') {
str++;
positive_p = 0;
}
digits_start = str;
- if (!str2big_scan_digits(s, str, base, badcheck, &num_digits, &len))
- invalid_integer(arg);
+ str2big_scan_digits(s, str, base, badcheck, &num_digits, &len);
digits_end = digits_start + len;
maxpow_in_bdigit_dbl(base, &digits_per_bdigits_dbl);
@@ -4352,28 +4234,25 @@ rb_str2big_karatsuba(VALUE arg, int base, int badcheck)
const char *s, *str;
const char *digits_start, *digits_end;
size_t num_digits;
- ssize_t len;
+ size_t len;
VALUE z;
int digits_per_bdigits_dbl;
size_t num_bdigits;
- if (!valid_radix_p(base)) {
- invalid_radix(base);
+ if (base < 2 || 36 < base) {
+ rb_raise(rb_eArgError, "invalid radix %d", base);
}
rb_must_asciicompat(arg);
- s = str = StringValuePtr(arg);
- len = RSTRING_LEN(arg);
- if (len > 0 && *str == '-') {
- len--;
+ s = str = StringValueCStr(arg);
+ if (*str == '-') {
str++;
positive_p = 0;
}
digits_start = str;
- if (!str2big_scan_digits(s, str, base, badcheck, &num_digits, &len))
- invalid_integer(arg);
+ str2big_scan_digits(s, str, base, badcheck, &num_digits, &len);
digits_end = digits_start + len;
maxpow_in_bdigit_dbl(base, &digits_per_bdigits_dbl);
@@ -4395,28 +4274,25 @@ rb_str2big_gmp(VALUE arg, int base, int badcheck)
const char *s, *str;
const char *digits_start, *digits_end;
size_t num_digits;
- ssize_t len;
+ size_t len;
VALUE z;
int digits_per_bdigits_dbl;
size_t num_bdigits;
- if (!valid_radix_p(base)) {
- invalid_radix(base);
+ if (base < 2 || 36 < base) {
+ rb_raise(rb_eArgError, "invalid radix %d", base);
}
rb_must_asciicompat(arg);
- s = str = StringValuePtr(arg);
- len = RSTRING_LEN(arg);
- if (len > 0 && *str == '-') {
- len--;
+ s = str = StringValueCStr(arg);
+ if (*str == '-') {
str++;
positive_p = 0;
}
digits_start = str;
- if (!str2big_scan_digits(s, str, base, badcheck, &num_digits, &len))
- invalid_integer(arg);
+ str2big_scan_digits(s, str, base, badcheck, &num_digits, &len);
digits_end = digits_start + len;
maxpow_in_bdigit_dbl(base, &digits_per_bdigits_dbl);
@@ -4470,7 +4346,7 @@ rb_ll2big(LONG_LONG n)
}
big = rb_ull2big(u);
if (neg) {
- BIGNUM_SET_NEGATIVE_SIGN(big);
+ BIGNUM_SET_SIGN(big, 0);
}
return big;
}
@@ -4491,46 +4367,6 @@ rb_ll2inum(LONG_LONG n)
#endif /* HAVE_LONG_LONG */
-#ifdef HAVE_INT128_T
-static VALUE
-rb_uint128t2big(uint128_t n)
-{
- long i;
- VALUE big = bignew(bdigit_roomof(SIZEOF_INT128_T), 1);
- BDIGIT *digits = BDIGITS(big);
-
- for (i = 0; i < bdigit_roomof(SIZEOF_INT128_T); i++) {
- digits[i] = BIGLO(RSHIFT(n ,BITSPERDIG*i));
- }
-
- i = bdigit_roomof(SIZEOF_INT128_T);
- while (i-- && !digits[i]) ;
- BIGNUM_SET_LEN(big, i+1);
- return big;
-}
-
-MJIT_FUNC_EXPORTED VALUE
-rb_int128t2big(int128_t n)
-{
- int neg = 0;
- uint128_t u;
- VALUE big;
-
- if (n < 0) {
- u = 1 + (uint128_t)(-(n + 1)); /* u = -n avoiding overflow */
- neg = 1;
- }
- else {
- u = n;
- }
- big = rb_uint128t2big(u);
- if (neg) {
- BIGNUM_SET_NEGATIVE_SIGN(big);
- }
- return big;
-}
-#endif
-
VALUE
rb_cstr2inum(const char *str, int base)
{
@@ -4739,9 +4575,8 @@ big2str_2bdigits(struct big2str_struct *b2s, BDIGIT *xds, size_t xn, size_t tail
p = buf;
j = sizeof(buf);
do {
- BDIGIT_DBL idx = num % b2s->base;
+ p[--j] = ruby_digitmap[num % b2s->base];
num /= b2s->base;
- p[--j] = ruby_digitmap[idx];
} while (num);
len = sizeof(buf) - j;
big2str_alloc(b2s, len + taillen);
@@ -4751,9 +4586,8 @@ big2str_2bdigits(struct big2str_struct *b2s, BDIGIT *xds, size_t xn, size_t tail
p = b2s->ptr;
j = b2s->hbase2_numdigits;
do {
- BDIGIT_DBL idx = num % b2s->base;
+ p[--j] = ruby_digitmap[num % b2s->base];
num /= b2s->base;
- p[--j] = ruby_digitmap[idx];
} while (j);
len = b2s->hbase2_numdigits;
}
@@ -4937,8 +4771,8 @@ big2str_generic(VALUE x, int base)
return rb_usascii_str_new2("0");
}
- if (!valid_radix_p(base))
- invalid_radix(base);
+ if (base < 2 || 36 < base)
+ rb_raise(rb_eArgError, "invalid radix %d", base);
if (xn >= LONG_MAX/BITSPERDIG) {
rb_raise(rb_eRangeError, "bignum too big to convert into `string'");
@@ -5063,8 +4897,8 @@ rb_big2str1(VALUE x, int base)
return rb_usascii_str_new2("0");
}
- if (!valid_radix_p(base))
- invalid_radix(base);
+ if (base < 2 || 36 < base)
+ rb_raise(rb_eArgError, "invalid radix %d", base);
if (xn >= LONG_MAX/BITSPERDIG) {
rb_raise(rb_eRangeError, "bignum too big to convert into `string'");
@@ -5090,12 +4924,38 @@ rb_big2str(VALUE x, int base)
return rb_big2str1(x, base);
}
+/*
+ * call-seq:
+ * big.to_s(base=10) -> string
+ *
+ * Returns a string containing the representation of <i>big</i> radix
+ * <i>base</i> (2 through 36).
+ *
+ * 12345654321.to_s #=> "12345654321"
+ * 12345654321.to_s(2) #=> "1011011111110110111011110000110001"
+ * 12345654321.to_s(8) #=> "133766736061"
+ * 12345654321.to_s(16) #=> "2dfdbbc31"
+ * 78546939656932.to_s(36) #=> "rubyrules"
+ */
+
+static VALUE
+rb_big_to_s(int argc, VALUE *argv, VALUE x)
+{
+ int base;
+
+ if (argc == 0) base = 10;
+ else {
+ VALUE b;
+
+ rb_scan_args(argc, argv, "01", &b);
+ base = NUM2INT(b);
+ }
+ return rb_big2str(x, base);
+}
+
static unsigned long
big2ulong(VALUE x, const char *type)
{
-#if SIZEOF_LONG > SIZEOF_BDIGIT
- size_t i;
-#endif
size_t len = BIGNUM_LEN(x);
unsigned long num;
BDIGIT *ds;
@@ -5110,9 +4970,9 @@ big2ulong(VALUE x, const char *type)
num = (unsigned long)ds[0];
#else
num = 0;
- for (i = 0; i < len; i++) {
+ while (len--) {
num <<= BITSPERDIG;
- num += (unsigned long)ds[len - i - 1]; /* overflow is already checked */
+ num += (unsigned long)ds[len]; /* overflow is already checked */
}
#endif
return num;
@@ -5127,8 +4987,10 @@ rb_big2ulong(VALUE x)
return num;
}
else {
- if (num <= 1+(unsigned long)(-(LONG_MIN+1)))
- return -(long)(num-1)-1;
+ if (num <= LONG_MAX)
+ return -(long)num;
+ if (num == 1+(unsigned long)(-(LONG_MIN+1)))
+ return LONG_MIN;
}
rb_raise(rb_eRangeError, "bignum out of range of unsigned long");
}
@@ -5143,8 +5005,10 @@ rb_big2long(VALUE x)
return num;
}
else {
- if (num <= 1+(unsigned long)(-(LONG_MIN+1)))
- return -(long)(num-1)-1;
+ if (num <= LONG_MAX)
+ return -(long)num;
+ if (num == 1+(unsigned long)(-(LONG_MIN+1)))
+ return LONG_MIN;
}
rb_raise(rb_eRangeError, "bignum too big to convert into `long'");
}
@@ -5154,9 +5018,6 @@ rb_big2long(VALUE x)
static unsigned LONG_LONG
big2ull(VALUE x, const char *type)
{
-#if SIZEOF_LONG_LONG > SIZEOF_BDIGIT
- size_t i;
-#endif
size_t len = BIGNUM_LEN(x);
unsigned LONG_LONG num;
BDIGIT *ds = BDIGITS(x);
@@ -5169,9 +5030,9 @@ big2ull(VALUE x, const char *type)
num = (unsigned LONG_LONG)ds[0];
#else
num = 0;
- for (i = 0; i < len; i++) {
+ while (len--) {
num = BIGUP(num);
- num += ds[len - i - 1];
+ num += ds[len];
}
#endif
return num;
@@ -5186,8 +5047,10 @@ rb_big2ull(VALUE x)
return num;
}
else {
- if (num <= 1+(unsigned LONG_LONG)(-(LLONG_MIN+1)))
- return -(LONG_LONG)(num-1)-1;
+ if (num <= LLONG_MAX)
+ return -(LONG_LONG)num;
+ if (num == 1+(unsigned LONG_LONG)(-(LLONG_MIN+1)))
+ return LLONG_MIN;
}
rb_raise(rb_eRangeError, "bignum out of range of unsigned long long");
}
@@ -5202,8 +5065,10 @@ rb_big2ll(VALUE x)
return num;
}
else {
- if (num <= 1+(unsigned LONG_LONG)(-(LLONG_MIN+1)))
- return -(LONG_LONG)(num-1)-1;
+ if (num <= LLONG_MAX)
+ return -(LONG_LONG)num;
+ if (num == 1+(unsigned LONG_LONG)(-(LLONG_MIN+1)))
+ return LLONG_MIN;
}
rb_raise(rb_eRangeError, "bignum too big to convert into `long long'");
}
@@ -5278,13 +5143,8 @@ big2dbl(VALUE x)
}
}
if (carry) {
- BDIGIT mask = BDIGMAX;
- BDIGIT bit = 1;
- mask <<= bits;
- bit <<= bits;
- dl &= mask;
- dl += bit;
- dl = BIGLO(dl);
+ dl &= BDIGMAX << bits;
+ dl = BIGLO(dl + ((BDIGIT)1 << bits));
if (!dl) d += 1;
}
}
@@ -5299,7 +5159,7 @@ big2dbl(VALUE x)
}
}
}
- if (BIGNUM_NEGATIVE_P(x)) d = -d;
+ if (!BIGNUM_SIGN(x)) d = -d;
return d;
}
@@ -5318,6 +5178,21 @@ rb_big2dbl(VALUE x)
return d;
}
+/*
+ * call-seq:
+ * big.to_f -> float
+ *
+ * Converts <i>big</i> to a <code>Float</code>. If <i>big</i> doesn't
+ * fit in a <code>Float</code>, the result is infinity.
+ *
+ */
+
+static VALUE
+rb_big_to_f(VALUE x)
+{
+ return DBL2NUM(rb_big2dbl(x));
+}
+
VALUE
rb_integer_float_cmp(VALUE x, VALUE y)
{
@@ -5400,32 +5275,52 @@ rb_integer_float_eq(VALUE x, VALUE y)
return rb_big_eq(x, y);
}
+/*
+ * call-seq:
+ * big <=> numeric -> -1, 0, +1 or nil
+ *
+ * Comparison---Returns -1, 0, or +1 depending on whether +big+ is
+ * less than, equal to, or greater than +numeric+. This is the
+ * basis for the tests in Comparable.
+ *
+ * +nil+ is returned if the two values are incomparable.
+ *
+ */
+
VALUE
rb_big_cmp(VALUE x, VALUE y)
{
+ int cmp;
+
if (FIXNUM_P(y)) {
- x = bigfixize(x);
+ x = bignorm(x);
if (FIXNUM_P(x)) {
- /* SIGNED_VALUE and Fixnum have same sign-bits, same
- * order */
- SIGNED_VALUE sx = (SIGNED_VALUE)x, sy = (SIGNED_VALUE)y;
- if (sx < sy) return INT2FIX(-1);
- return INT2FIX(sx > sy);
+ if (FIX2LONG(x) > FIX2LONG(y)) return INT2FIX(1);
+ if (FIX2LONG(x) < FIX2LONG(y)) return INT2FIX(-1);
+ return INT2FIX(0);
+ }
+ else {
+ if (BIGNUM_NEGATIVE_P(x)) return INT2FIX(-1);
+ return INT2FIX(1);
}
}
else if (RB_BIGNUM_TYPE_P(y)) {
- if (BIGNUM_SIGN(x) == BIGNUM_SIGN(y)) {
- int cmp = bary_cmp(BDIGITS(x), BIGNUM_LEN(x), BDIGITS(y), BIGNUM_LEN(y));
- return INT2FIX(BIGNUM_SIGN(x) ? cmp : -cmp);
- }
}
else if (RB_FLOAT_TYPE_P(y)) {
return rb_integer_float_cmp(x, y);
}
else {
- return rb_num_coerce_cmp(x, y, idCmp);
+ return rb_num_coerce_cmp(x, y, rb_intern("<=>"));
}
- return INT2FIX(BIGNUM_SIGN(x) ? 1 : -1);
+
+ if (BIGNUM_SIGN(x) > BIGNUM_SIGN(y)) return INT2FIX(1);
+ if (BIGNUM_SIGN(x) < BIGNUM_SIGN(y)) return INT2FIX(-1);
+
+ cmp = bary_cmp(BDIGITS(x), BIGNUM_LEN(x), BDIGITS(y), BIGNUM_LEN(y));
+ if (BIGNUM_SIGN(x))
+ return INT2FIX(cmp);
+ else
+ return INT2FIX(-cmp);
}
enum big_op_t {
@@ -5441,7 +5336,7 @@ big_op(VALUE x, VALUE y, enum big_op_t op)
VALUE rel;
int n;
- if (RB_INTEGER_TYPE_P(y)) {
+ if (FIXNUM_P(y) || RB_BIGNUM_TYPE_P(y)) {
rel = rb_big_cmp(x, y);
}
else if (RB_FLOAT_TYPE_P(y)) {
@@ -5451,9 +5346,9 @@ big_op(VALUE x, VALUE y, enum big_op_t op)
ID id = 0;
switch (op) {
case big_op_gt: id = '>'; break;
- case big_op_ge: id = idGE; break;
+ case big_op_ge: id = rb_intern(">="); break;
case big_op_lt: id = '<'; break;
- case big_op_le: id = idLE; break;
+ case big_op_le: id = rb_intern("<="); break;
}
return rb_num_coerce_relop(x, y, id);
}
@@ -5470,26 +5365,58 @@ big_op(VALUE x, VALUE y, enum big_op_t op)
return Qundef;
}
-VALUE
-rb_big_gt(VALUE x, VALUE y)
+/*
+ * call-seq:
+ * big > real -> true or false
+ *
+ * Returns <code>true</code> if the value of <code>big</code> is
+ * greater than that of <code>real</code>.
+ */
+
+static VALUE
+big_gt(VALUE x, VALUE y)
{
return big_op(x, y, big_op_gt);
}
-VALUE
-rb_big_ge(VALUE x, VALUE y)
+/*
+ * call-seq:
+ * big >= real -> true or false
+ *
+ * Returns <code>true</code> if the value of <code>big</code> is
+ * greater than or equal to that of <code>real</code>.
+ */
+
+static VALUE
+big_ge(VALUE x, VALUE y)
{
return big_op(x, y, big_op_ge);
}
-VALUE
-rb_big_lt(VALUE x, VALUE y)
+/*
+ * call-seq:
+ * big < real -> true or false
+ *
+ * Returns <code>true</code> if the value of <code>big</code> is
+ * less than that of <code>real</code>.
+ */
+
+static VALUE
+big_lt(VALUE x, VALUE y)
{
return big_op(x, y, big_op_lt);
}
-VALUE
-rb_big_le(VALUE x, VALUE y)
+/*
+ * call-seq:
+ * big <= real -> true or false
+ *
+ * Returns <code>true</code> if the value of <code>big</code> is
+ * less than or equal to that of <code>real</code>.
+ */
+
+static VALUE
+big_le(VALUE x, VALUE y)
{
return big_op(x, y, big_op_le);
}
@@ -5499,8 +5426,8 @@ rb_big_le(VALUE x, VALUE y)
* big == obj -> true or false
*
* Returns <code>true</code> only if <i>obj</i> has the same value
- * as <i>big</i>. Contrast this with <code>Integer#eql?</code>, which
- * requires <i>obj</i> to be a <code>Integer</code>.
+ * as <i>big</i>. Contrast this with <code>Bignum#eql?</code>, which
+ * requires <i>obj</i> to be a <code>Bignum</code>.
*
* 68719476736 == 68719476736.0 #=> true
*/
@@ -5509,7 +5436,8 @@ VALUE
rb_big_eq(VALUE x, VALUE y)
{
if (FIXNUM_P(y)) {
- return bignorm(x) == y ? Qtrue : Qfalse;
+ if (bignorm(x) == y) return Qtrue;
+ y = rb_int2big(FIX2LONG(y));
}
else if (RB_BIGNUM_TYPE_P(y)) {
}
@@ -5525,6 +5453,17 @@ rb_big_eq(VALUE x, VALUE y)
return Qtrue;
}
+/*
+ * call-seq:
+ * big.eql?(obj) -> true or false
+ *
+ * Returns <code>true</code> only if <i>obj</i> is a
+ * <code>Bignum</code> with the same value as <i>big</i>. Contrast this
+ * with <code>Bignum#==</code>, which performs type conversions.
+ *
+ * 68719476736.eql?(68719476736.0) #=> false
+ */
+
VALUE
rb_big_eql(VALUE x, VALUE y)
{
@@ -5535,18 +5474,37 @@ rb_big_eql(VALUE x, VALUE y)
return Qtrue;
}
+/*
+ * call-seq:
+ * -big -> integer
+ *
+ * Unary minus (returns an integer whose value is 0-big)
+ */
+
VALUE
rb_big_uminus(VALUE x)
{
VALUE z = rb_big_clone(x);
- BIGNUM_NEGATE(z);
+ BIGNUM_SET_SIGN(z, !BIGNUM_SIGN(x));
return bignorm(z);
}
-VALUE
-rb_big_comp(VALUE x)
+/*
+ * call-seq:
+ * ~big -> integer
+ *
+ * Inverts the bits in big. As Bignums are conceptually infinite
+ * length, the result acts as if it had an infinite number of one
+ * bits to the left. In hex representations, this is displayed
+ * as two periods to the left of the digits.
+ *
+ * sprintf("%X", ~0x1122334455) #=> "..FEEDDCCBBAA"
+ */
+
+static VALUE
+rb_big_neg(VALUE x)
{
VALUE z = rb_big_clone(x);
BDIGIT *ds = BDIGITS(z);
@@ -5626,7 +5584,7 @@ bigsub_int(VALUE x, long y0)
assert(xn == zn);
num = (BDIGIT_DBL_SIGNED)xds[0] - y;
if (xn == 1 && num < 0) {
- BIGNUM_NEGATE(z);
+ BIGNUM_SET_SIGN(z, !BIGNUM_SIGN(x));
zds[0] = (BDIGIT)-num;
RB_GC_GUARD(x);
return bignorm(z);
@@ -5689,7 +5647,7 @@ bigsub_int(VALUE x, long y0)
assert(num == 0 || num == -1);
if (num < 0) {
get2comp(z);
- BIGNUM_NEGATE(z);
+ BIGNUM_SET_SIGN(z, !BIGNUM_SIGN(x));
}
RB_GC_GUARD(x);
return bignorm(z);
@@ -5805,6 +5763,13 @@ bigadd(VALUE x, VALUE y, int sign)
return z;
}
+/*
+ * call-seq:
+ * big + other -> Numeric
+ *
+ * Adds big and other, returning the result.
+ */
+
VALUE
rb_big_plus(VALUE x, VALUE y)
{
@@ -5834,6 +5799,13 @@ rb_big_plus(VALUE x, VALUE y)
}
}
+/*
+ * call-seq:
+ * big - other -> Numeric
+ *
+ * Subtracts other from big, returning the result.
+ */
+
VALUE
rb_big_minus(VALUE x, VALUE y)
{
@@ -5878,10 +5850,17 @@ bigsq(VALUE x)
xds = BDIGITS(x);
zds = BDIGITS(z);
- if (xn < NAIVE_MUL_DIGITS)
+#ifdef USE_GMP
+ if (xn < GMP_MUL_DIGITS)
+ bary_sq_fast(zds, zn, xds, xn);
+ else
+ bary_mul(zds, zn, xds, xn, xds, xn);
+#else
+ if (xn < KARATSUBA_MUL_DIGITS)
bary_sq_fast(zds, zn, xds, xn);
else
bary_mul(zds, zn, xds, xn, xds, xn);
+#endif
RB_GC_GUARD(x);
return z;
@@ -5914,6 +5893,13 @@ bigmul0(VALUE x, VALUE y)
return z;
}
+/*
+ * call-seq:
+ * big * other -> Numeric
+ *
+ * Multiplies big and other, returning the result.
+ */
+
VALUE
rb_big_mul(VALUE x, VALUE y)
{
@@ -5963,7 +5949,7 @@ bigdivrem(VALUE x, VALUE y, volatile VALUE *divp, volatile VALUE *modp)
zds = BDIGITS(z);
dd = bigdivrem_single(zds, xds, xn, dd);
if (modp) {
- *modp = rb_uint2big((uintptr_t)dd);
+ *modp = rb_uint2big((VALUE)dd);
BIGNUM_SET_SIGN(*modp, BIGNUM_SIGN(x));
}
if (divp) *divp = z;
@@ -6053,15 +6039,12 @@ rb_big_divide(VALUE x, VALUE y, ID op)
}
else if (RB_FLOAT_TYPE_P(y)) {
if (op == '/') {
- double dx = rb_big2dbl(x);
- return rb_flo_div_flo(DBL2NUM(dx), y);
+ return DBL2NUM(rb_big2dbl(x) / RFLOAT_VALUE(y));
}
else {
- VALUE v;
double dy = RFLOAT_VALUE(y);
if (dy == 0.0) rb_num_zerodiv();
- v = rb_big_divide(x, y, '/');
- return rb_dbl2big(RFLOAT_VALUE(v));
+ return rb_dbl2big(rb_big2dbl(x) / dy);
}
}
else {
@@ -6072,18 +6055,43 @@ rb_big_divide(VALUE x, VALUE y, ID op)
return bignorm(z);
}
+/*
+ * call-seq:
+ * big / other -> Numeric
+ *
+ * Performs division: the class of the resulting object depends on
+ * the class of <code>numeric</code> and on the magnitude of the
+ * result.
+ */
+
VALUE
rb_big_div(VALUE x, VALUE y)
{
return rb_big_divide(x, y, '/');
}
+/*
+ * call-seq:
+ * big.div(other) -> integer
+ *
+ * Performs integer division: returns integer value.
+ */
+
VALUE
rb_big_idiv(VALUE x, VALUE y)
{
return rb_big_divide(x, y, rb_intern("div"));
}
+/*
+ * call-seq:
+ * big % other -> Numeric
+ * big.modulo(other) -> Numeric
+ *
+ * Returns big modulo other. See Numeric.divmod for more
+ * information.
+ */
+
VALUE
rb_big_modulo(VALUE x, VALUE y)
{
@@ -6100,7 +6108,16 @@ rb_big_modulo(VALUE x, VALUE y)
return bignorm(z);
}
-VALUE
+/*
+ * call-seq:
+ * big.remainder(numeric) -> number
+ *
+ * Returns the remainder after dividing <i>big</i> by <i>numeric</i>.
+ *
+ * -1234567890987654321.remainder(13731) #=> -6966
+ * -1234567890987654321.remainder(13731.24) #=> -9906.22531493148
+ */
+static VALUE
rb_big_remainder(VALUE x, VALUE y)
{
VALUE z;
@@ -6116,6 +6133,13 @@ rb_big_remainder(VALUE x, VALUE y)
return bignorm(z);
}
+/*
+ * call-seq:
+ * big.divmod(numeric) -> array
+ *
+ * See <code>Numeric#divmod</code>.
+ *
+ */
VALUE
rb_big_divmod(VALUE x, VALUE y)
{
@@ -6142,11 +6166,10 @@ big_shift(VALUE x, long n)
return x;
}
-enum {DBL_BIGDIG = ((DBL_MANT_DIG + BITSPERDIG) / BITSPERDIG)};
-
-static double
+static VALUE
big_fdiv(VALUE x, VALUE y, long ey)
{
+#define DBL_BIGDIG ((DBL_MANT_DIG + BITSPERDIG) / BITSPERDIG)
VALUE z;
long l, ex;
@@ -6154,8 +6177,6 @@ big_fdiv(VALUE x, VALUE y, long ey)
l = BIGNUM_LEN(x);
ex = l * BITSPERDIG - nlz(BDIGITS(x)[l-1]);
ex -= 2 * DBL_BIGDIG * BITSPERDIG;
- if (ex > BITSPERDIG) ex -= BITSPERDIG;
- else if (ex > 0) ex = 0;
if (ex) x = big_shift(x, ex);
bigdivrem(x, y, &z, 0);
@@ -6163,14 +6184,14 @@ big_fdiv(VALUE x, VALUE y, long ey)
#if SIZEOF_LONG > SIZEOF_INT
{
/* Visual C++ can't be here */
- if (l > INT_MAX) return HUGE_VAL;
- if (l < INT_MIN) return 0.0;
+ if (l > INT_MAX) return DBL2NUM(INFINITY);
+ if (l < INT_MIN) return DBL2NUM(0.0);
}
#endif
- return ldexp(big2dbl(z), (int)l);
+ return DBL2NUM(ldexp(big2dbl(z), (int)l));
}
-static double
+static VALUE
big_fdiv_int(VALUE x, VALUE y)
{
long l, ey;
@@ -6182,7 +6203,7 @@ big_fdiv_int(VALUE x, VALUE y)
return big_fdiv(x, y, ey);
}
-static double
+static VALUE
big_fdiv_float(VALUE x, VALUE y)
{
int i;
@@ -6190,11 +6211,23 @@ big_fdiv_float(VALUE x, VALUE y)
return big_fdiv(x, y, i - DBL_MANT_DIG);
}
-double
-rb_big_fdiv_double(VALUE x, VALUE y)
+/*
+ * call-seq:
+ * big.fdiv(numeric) -> float
+ *
+ * Returns the floating point result of dividing <i>big</i> by
+ * <i>numeric</i>.
+ *
+ * -1234567890987654321.fdiv(13731) #=> -89910996357705.5
+ * -1234567890987654321.fdiv(13731.24) #=> -89909424858035.7
+ *
+ */
+
+
+VALUE
+rb_big_fdiv(VALUE x, VALUE y)
{
double dx, dy;
- VALUE v;
dx = big2dbl(x);
if (FIXNUM_P(y)) {
@@ -6203,27 +6236,35 @@ rb_big_fdiv_double(VALUE x, VALUE y)
return big_fdiv_int(x, rb_int2big(FIX2LONG(y)));
}
else if (RB_BIGNUM_TYPE_P(y)) {
- return big_fdiv_int(x, y);
+ dy = rb_big2dbl(y);
+ if (isinf(dx) || isinf(dy))
+ return big_fdiv_int(x, y);
}
else if (RB_FLOAT_TYPE_P(y)) {
dy = RFLOAT_VALUE(y);
if (isnan(dy))
- return dy;
+ return y;
if (isinf(dx))
return big_fdiv_float(x, y);
}
else {
- return NUM2DBL(rb_num_coerce_bin(x, y, rb_intern("fdiv")));
+ return rb_num_coerce_bin(x, y, rb_intern("fdiv"));
}
- v = rb_flo_div_flo(DBL2NUM(dx), DBL2NUM(dy));
- return NUM2DBL(v);
+ return DBL2NUM(dx / dy);
}
-VALUE
-rb_big_fdiv(VALUE x, VALUE y)
-{
- return DBL2NUM(rb_big_fdiv_double(x, y));
-}
+/*
+ * call-seq:
+ * big ** exponent -> numeric
+ *
+ * Raises _big_ to the _exponent_ power (which may be an integer, float,
+ * or anything that will coerce to a number). The result may be
+ * a Fixnum, Bignum, or Float
+ *
+ * 123456789 ** 2 #=> 15241578750190521
+ * 123456789 ** 1.2 #=> 5126464716.09932
+ * 123456789 ** -2 #=> 6.5610001194102e-17
+ */
VALUE
rb_big_pow(VALUE x, VALUE y)
@@ -6233,12 +6274,10 @@ rb_big_pow(VALUE x, VALUE y)
again:
if (y == INT2FIX(0)) return INT2FIX(1);
- if (y == INT2FIX(1)) return x;
if (RB_FLOAT_TYPE_P(y)) {
d = RFLOAT_VALUE(y);
- if ((BIGNUM_NEGATIVE_P(x) && !BIGZEROP(x))) {
- return rb_dbl_complex_new_polar_pi(pow(-rb_big2dbl(x), d), d);
- }
+ if ((!BIGNUM_SIGN(x) && !BIGZEROP(x)) && d != round(d))
+ return rb_funcall(rb_complex_raw1(x), rb_intern("**"), 1, y);
}
else if (RB_BIGNUM_TYPE_P(y)) {
y = bignorm(y);
@@ -6250,13 +6289,8 @@ rb_big_pow(VALUE x, VALUE y)
else if (FIXNUM_P(y)) {
yy = FIX2LONG(y);
- if (yy < 0) {
- x = rb_big_pow(x, INT2NUM(-yy));
- if (RB_INTEGER_TYPE_P(x))
- return rb_rational_raw(INT2FIX(1), x);
- else
- return DBL2NUM(1.0 / NUM2DBL(x));
- }
+ if (yy < 0)
+ return rb_funcall(rb_rational_raw1(x), rb_intern("**"), 1, y);
else {
VALUE z = 0;
SIGNED_VALUE mask;
@@ -6281,7 +6315,7 @@ rb_big_pow(VALUE x, VALUE y)
}
}
else {
- return rb_num_coerce_bin(x, y, idPow);
+ return rb_num_coerce_bin(x, y, rb_intern("**"));
}
return DBL2NUM(pow(rb_big2dbl(x), d));
}
@@ -6341,6 +6375,13 @@ bigand_int(VALUE x, long xn, BDIGIT hibitsx, long y)
return bignorm(z);
}
+/*
+ * call-seq:
+ * big & numeric -> integer
+ *
+ * Performs bitwise +and+ between _big_ and _numeric_.
+ */
+
VALUE
rb_big_and(VALUE x, VALUE y)
{
@@ -6353,7 +6394,7 @@ rb_big_and(VALUE x, VALUE y)
BDIGIT tmph;
long tmpn;
- if (!RB_INTEGER_TYPE_P(y)) {
+ if (!FIXNUM_P(y) && !RB_BIGNUM_TYPE_P(y)) {
return rb_num_coerce_bit(x, y, '&');
}
@@ -6460,6 +6501,13 @@ bigor_int(VALUE x, long xn, BDIGIT hibitsx, long y)
return bignorm(z);
}
+/*
+ * call-seq:
+ * big | numeric -> integer
+ *
+ * Performs bitwise +or+ between _big_ and _numeric_.
+ */
+
VALUE
rb_big_or(VALUE x, VALUE y)
{
@@ -6472,7 +6520,7 @@ rb_big_or(VALUE x, VALUE y)
BDIGIT tmph;
long tmpn;
- if (!RB_INTEGER_TYPE_P(y)) {
+ if (!FIXNUM_P(y) && !RB_BIGNUM_TYPE_P(y)) {
return rb_num_coerce_bit(x, y, '|');
}
@@ -6553,6 +6601,12 @@ bigxor_int(VALUE x, long xn, BDIGIT hibitsx, long y)
RB_GC_GUARD(x);
return bignorm(z);
}
+/*
+ * call-seq:
+ * big ^ numeric -> integer
+ *
+ * Performs bitwise +exclusive or+ between _big_ and _numeric_.
+ */
VALUE
rb_big_xor(VALUE x, VALUE y)
@@ -6566,7 +6620,7 @@ rb_big_xor(VALUE x, VALUE y)
BDIGIT tmph;
long tmpn;
- if (!RB_INTEGER_TYPE_P(y)) {
+ if (!FIXNUM_P(y) && !RB_BIGNUM_TYPE_P(y)) {
return rb_num_coerce_bit(x, y, '^');
}
@@ -6602,6 +6656,13 @@ rb_big_xor(VALUE x, VALUE y)
return bignorm(z);
}
+/*
+ * call-seq:
+ * big << numeric -> integer
+ *
+ * Shifts big left _numeric_ positions (right if _numeric_ is negative).
+ */
+
VALUE
rb_big_lshift(VALUE x, VALUE y)
{
@@ -6632,6 +6693,14 @@ rb_big_lshift(VALUE x, VALUE y)
}
}
+
+/*
+ * call-seq:
+ * big >> numeric -> integer
+ *
+ * Shifts big right _numeric_ positions (left if _numeric_ is negative).
+ */
+
VALUE
rb_big_rshift(VALUE x, VALUE y)
{
@@ -6662,7 +6731,26 @@ rb_big_rshift(VALUE x, VALUE y)
}
}
-VALUE
+/*
+ * call-seq:
+ * big[n] -> 0, 1
+ *
+ * Bit Reference---Returns the <em>n</em>th bit in the (assumed) binary
+ * representation of <i>big</i>, where <i>big</i>[0] is the least
+ * significant bit.
+ *
+ * a = 9**15
+ * 50.downto(0) do |n|
+ * print a[n]
+ * end
+ *
+ * <em>produces:</em>
+ *
+ * 000101110110100000111000011110010100111100010111001
+ *
+ */
+
+static VALUE
rb_big_aref(VALUE x, VALUE y)
{
BDIGIT *xds;
@@ -6672,7 +6760,7 @@ rb_big_aref(VALUE x, VALUE y)
BDIGIT bit;
if (RB_BIGNUM_TYPE_P(y)) {
- if (BIGNUM_NEGATIVE_P(y))
+ if (!BIGNUM_SIGN(y))
return INT2FIX(0);
bigtrunc(y);
if (BIGSIZE(y) > sizeof(size_t)) {
@@ -6707,13 +6795,22 @@ rb_big_aref(VALUE x, VALUE y)
return (xds[s1] & bit) ? INT2FIX(1) : INT2FIX(0);
}
-VALUE
+/*
+ * call-seq:
+ * big.hash -> fixnum
+ *
+ * Compute a hash based on the value of _big_.
+ *
+ * See also Object#hash.
+ */
+
+static VALUE
rb_big_hash(VALUE x)
{
st_index_t hash;
hash = rb_memhash(BDIGITS(x), sizeof(BDIGIT)*BIGNUM_LEN(x)) ^ BIGNUM_SIGN(x);
- return ST2FIX(hash);
+ return INT2FIX(hash);
}
/*
@@ -6731,47 +6828,95 @@ rb_big_hash(VALUE x)
*/
static VALUE
-rb_int_coerce(VALUE x, VALUE y)
+rb_big_coerce(VALUE x, VALUE y)
{
- if (RB_INTEGER_TYPE_P(y)) {
- return rb_assoc_new(y, x);
+ if (FIXNUM_P(y)) {
+ y = rb_int2big(FIX2LONG(y));
}
- else {
- x = rb_Float(x);
- y = rb_Float(y);
- return rb_assoc_new(y, x);
+ else if (!RB_BIGNUM_TYPE_P(y)) {
+ rb_raise(rb_eTypeError, "can't coerce %"PRIsVALUE" to Bignum",
+ rb_obj_class(y));
}
+ return rb_assoc_new(y, x);
}
-VALUE
+/*
+ * call-seq:
+ * big.abs -> aBignum
+ * big.magnitude -> aBignum
+ *
+ * Returns the absolute value of <i>big</i>.
+ *
+ * -1234567890987654321.abs #=> 1234567890987654321
+ */
+
+static VALUE
rb_big_abs(VALUE x)
{
- if (BIGNUM_NEGATIVE_P(x)) {
+ if (!BIGNUM_SIGN(x)) {
x = rb_big_clone(x);
- BIGNUM_SET_POSITIVE_SIGN(x);
+ BIGNUM_SET_SIGN(x, 1);
}
return x;
}
-int
-rb_big_sign(VALUE x)
-{
- return BIGNUM_SIGN(x);
-}
+/*
+ * call-seq:
+ * big.size -> integer
+ *
+ * Returns the number of bytes in the machine representation of
+ * <i>big</i>.
+ *
+ * (256**10 - 1).size #=> 12
+ * (256**20 - 1).size #=> 20
+ * (256**40 - 1).size #=> 40
+ */
-size_t
+static VALUE
rb_big_size(VALUE big)
{
- return BIGSIZE(big);
+ return SIZET2NUM(BIGSIZE(big));
}
-VALUE
-rb_big_size_m(VALUE big)
-{
- return SIZET2NUM(rb_big_size(big));
-}
+/*
+ * call-seq:
+ * int.bit_length -> integer
+ *
+ * Returns the number of bits of the value of <i>int</i>.
+ *
+ * "the number of bits" means that
+ * the bit position of the highest bit which is different to the sign bit.
+ * (The bit position of the bit 2**n is n+1.)
+ * If there is no such bit (zero or minus one), zero is returned.
+ *
+ * I.e. This method returns ceil(log2(int < 0 ? -int : int+1)).
+ *
+ * (-2**10000-1).bit_length #=> 10001
+ * (-2**10000).bit_length #=> 10000
+ * (-2**10000+1).bit_length #=> 10000
+ *
+ * (-2**1000-1).bit_length #=> 1001
+ * (-2**1000).bit_length #=> 1000
+ * (-2**1000+1).bit_length #=> 1000
+ *
+ * (2**1000-1).bit_length #=> 1000
+ * (2**1000).bit_length #=> 1001
+ * (2**1000+1).bit_length #=> 1001
+ *
+ * (2**10000-1).bit_length #=> 10000
+ * (2**10000).bit_length #=> 10001
+ * (2**10000+1).bit_length #=> 10001
+ *
+ * This method can be used to detect overflow in Array#pack as follows.
+ *
+ * if n.bit_length < 32
+ * [n].pack("l") # no overflow
+ * else
+ * raise "overflow"
+ * end
+ */
-VALUE
+static VALUE
rb_big_bit_length(VALUE big)
{
int nlz_bits;
@@ -6812,7 +6957,14 @@ rb_big_bit_length(VALUE big)
INTEGER_PACK_LSWORD_FIRST|INTEGER_PACK_NATIVE_BYTE_ORDER);
}
-VALUE
+/*
+ * call-seq:
+ * big.odd? -> true or false
+ *
+ * Returns <code>true</code> if <i>big</i> is an odd number.
+ */
+
+static VALUE
rb_big_odd_p(VALUE num)
{
if (BIGNUM_LEN(num) != 0 && BDIGITS(num)[0] & 1) {
@@ -6821,315 +6973,20 @@ rb_big_odd_p(VALUE num)
return Qfalse;
}
-VALUE
-rb_big_even_p(VALUE num)
-{
- if (BIGNUM_LEN(num) != 0 && BDIGITS(num)[0] & 1) {
- return Qfalse;
- }
- return Qtrue;
-}
-
-unsigned long rb_ulong_isqrt(unsigned long);
-#if SIZEOF_BDIGIT*2 > SIZEOF_LONG
-BDIGIT rb_bdigit_dbl_isqrt(BDIGIT_DBL);
-# ifdef ULL_TO_DOUBLE
-# define BDIGIT_DBL_TO_DOUBLE(n) ULL_TO_DOUBLE(n)
-# endif
-#else
-# define rb_bdigit_dbl_isqrt(x) (BDIGIT)rb_ulong_isqrt(x)
-#endif
-#ifndef BDIGIT_DBL_TO_DOUBLE
-# define BDIGIT_DBL_TO_DOUBLE(n) (double)(n)
-#endif
-
-static BDIGIT *
-estimate_initial_sqrt(VALUE *xp, const size_t xn, const BDIGIT *nds, size_t len)
-{
- enum {dbl_per_bdig = roomof(DBL_MANT_DIG,BITSPERDIG)};
- const int zbits = nlz(nds[len-1]);
- VALUE x = *xp = bignew_1(0, xn, 1); /* division may release the GVL */
- BDIGIT *xds = BDIGITS(x);
- BDIGIT_DBL d = bary2bdigitdbl(nds+len-dbl_per_bdig, dbl_per_bdig);
- BDIGIT lowbits = 1;
- int rshift = (int)((BITSPERDIG*2-zbits+(len&BITSPERDIG&1) - DBL_MANT_DIG + 1) & ~1);
- double f;
-
- if (rshift > 0) {
- lowbits = (BDIGIT)d & ~(~(BDIGIT)1U << rshift);
- d >>= rshift;
- }
- else if (rshift < 0) {
- d <<= -rshift;
- d |= nds[len-dbl_per_bdig-1] >> (BITSPERDIG+rshift);
- }
- f = sqrt(BDIGIT_DBL_TO_DOUBLE(d));
- d = (BDIGIT_DBL)ceil(f);
- if (BDIGIT_DBL_TO_DOUBLE(d) == f) {
- if (lowbits || (lowbits = !bary_zero_p(nds, len-dbl_per_bdig)))
- ++d;
- }
- else {
- lowbits = 1;
- }
- rshift /= 2;
- rshift += (2-(len&1))*BITSPERDIG/2;
- if (rshift >= 0) {
- d <<= rshift;
- }
- BDIGITS_ZERO(xds, xn-2);
- bdigitdbl2bary(&xds[xn-2], 2, d);
-
- if (!lowbits) return NULL; /* special case, exact result */
- return xds;
-}
-
-VALUE
-rb_big_isqrt(VALUE n)
-{
- BDIGIT *nds = BDIGITS(n);
- size_t len = BIGNUM_LEN(n);
- size_t xn = (len+1) / 2;
- VALUE x;
- BDIGIT *xds;
-
- if (len <= 2) {
- BDIGIT sq = rb_bdigit_dbl_isqrt(bary2bdigitdbl(nds, len));
-#if SIZEOF_BDIGIT > SIZEOF_LONG
- return ULL2NUM(sq);
-#else
- return ULONG2NUM(sq);
-#endif
- }
- else if ((xds = estimate_initial_sqrt(&x, xn, nds, len)) != 0) {
- size_t tn = xn + BIGDIVREM_EXTRA_WORDS;
- VALUE t = bignew_1(0, tn, 1);
- BDIGIT *tds = BDIGITS(t);
- tn = BIGNUM_LEN(t);
-
- /* t = n/x */
- while (bary_divmod_branch(tds, tn, NULL, 0, nds, len, xds, xn),
- bary_cmp(tds, tn, xds, xn) < 0) {
- int carry;
- BARY_TRUNC(tds, tn);
- /* x = (x+t)/2 */
- carry = bary_add(xds, xn, xds, xn, tds, tn);
- bary_small_rshift(xds, xds, xn, 1, carry);
- tn = BIGNUM_LEN(t);
- }
- rb_big_realloc(t, 0);
- rb_gc_force_recycle(t);
- }
- RBASIC_SET_CLASS_RAW(x, rb_cInteger);
- return x;
-}
-
-#ifdef USE_GMP
-static void
-bary_powm_gmp(BDIGIT *zds, size_t zn, const BDIGIT *xds, size_t xn, const BDIGIT *yds, size_t yn, const BDIGIT *mds, size_t mn)
-{
- const size_t nails = (sizeof(BDIGIT)-SIZEOF_BDIGIT)*CHAR_BIT;
- mpz_t z, x, y, m;
- size_t count;
- mpz_init(x);
- mpz_init(y);
- mpz_init(m);
- mpz_init(z);
- mpz_import(x, xn, -1, sizeof(BDIGIT), 0, nails, xds);
- mpz_import(y, yn, -1, sizeof(BDIGIT), 0, nails, yds);
- mpz_import(m, mn, -1, sizeof(BDIGIT), 0, nails, mds);
- mpz_powm(z, x, y, m);
- mpz_export(zds, &count, -1, sizeof(BDIGIT), 0, nails, z);
- BDIGITS_ZERO(zds+count, zn-count);
- mpz_clear(x);
- mpz_clear(y);
- mpz_clear(m);
- mpz_clear(z);
-}
-#endif
-
-static VALUE
-int_pow_tmp3(VALUE x, VALUE y, VALUE m, int nega_flg)
-{
-#ifdef USE_GMP
- VALUE z;
- size_t xn, yn, mn, zn;
-
- if (FIXNUM_P(x)) {
- x = rb_int2big(FIX2LONG(x));
- }
- if (FIXNUM_P(y)) {
- y = rb_int2big(FIX2LONG(y));
- }
- assert(RB_BIGNUM_TYPE_P(m));
- xn = BIGNUM_LEN(x);
- yn = BIGNUM_LEN(y);
- mn = BIGNUM_LEN(m);
- zn = mn;
- z = bignew(zn, 1);
- bary_powm_gmp(BDIGITS(z), zn, BDIGITS(x), xn, BDIGITS(y), yn, BDIGITS(m), mn);
- if (nega_flg & BIGNUM_POSITIVE_P(z)) {
- z = rb_big_minus(z, m);
- }
- RB_GC_GUARD(x);
- RB_GC_GUARD(y);
- RB_GC_GUARD(m);
- return rb_big_norm(z);
-#else
- VALUE tmp = LONG2FIX(1L);
- long yy;
-
- for (/*NOP*/; ! FIXNUM_P(y); y = rb_big_rshift(y, LONG2FIX(1L))) {
- if (RTEST(rb_int_odd_p(y))) {
- tmp = rb_int_mul(tmp, x);
- tmp = rb_int_modulo(tmp, m);
- }
- x = rb_int_mul(x, x);
- x = rb_int_modulo(x, m);
- }
- for (yy = FIX2LONG(y); yy; yy >>= 1L) {
- if (yy & 1L) {
- tmp = rb_int_mul(tmp, x);
- tmp = rb_int_modulo(tmp, m);
- }
- x = rb_int_mul(x, x);
- x = rb_int_modulo(x, m);
- }
-
- if (nega_flg && rb_int_positive_p(tmp)) {
- tmp = rb_int_minus(tmp, m);
- }
- return tmp;
-#endif
-}
-
/*
- * Integer#pow
+ * call-seq:
+ * big.even? -> true or false
+ *
+ * Returns <code>true</code> if <i>big</i> is an even number.
*/
static VALUE
-int_pow_tmp1(VALUE x, VALUE y, long mm, int nega_flg)
-{
- long xx = FIX2LONG(x);
- long tmp = 1L;
- long yy;
-
- for (/*NOP*/; ! FIXNUM_P(y); y = rb_big_rshift(y, LONG2FIX(1L))) {
- if (RTEST(rb_int_odd_p(y))) {
- tmp = (tmp * xx) % mm;
- }
- xx = (xx * xx) % mm;
- }
- for (yy = FIX2LONG(y); yy; yy >>= 1L) {
- if (yy & 1L) {
- tmp = (tmp * xx) % mm;
- }
- xx = (xx * xx) % mm;
- }
-
- if (nega_flg && tmp) {
- tmp -= mm;
- }
- return LONG2FIX(tmp);
-}
-
-static VALUE
-int_pow_tmp2(VALUE x, VALUE y, long mm, int nega_flg)
-{
- long tmp = 1L;
- long yy;
-#ifdef DLONG
- const DLONG m = mm;
- long tmp2 = tmp;
- long xx = FIX2LONG(x);
-# define MUL_MODULO(a, b, c) (long)(((DLONG)(a) * (DLONG)(b)) % (c))
-#else
- const VALUE m = LONG2FIX(mm);
- VALUE tmp2 = LONG2FIX(tmp);
- VALUE xx = x;
-# define MUL_MODULO(a, b, c) rb_int_modulo(rb_fix_mul_fix((a), (b)), (c))
-#endif
-
- for (/*NOP*/; ! FIXNUM_P(y); y = rb_big_rshift(y, LONG2FIX(1L))) {
- if (RTEST(rb_int_odd_p(y))) {
- tmp2 = MUL_MODULO(tmp2, xx, m);
- }
- xx = MUL_MODULO(xx, xx, m);
- }
- for (yy = FIX2LONG(y); yy; yy >>= 1L) {
- if (yy & 1L) {
- tmp2 = MUL_MODULO(tmp2, xx, m);
- }
- xx = MUL_MODULO(xx, xx, m);
- }
-
-#ifdef DLONG
- tmp = tmp2;
-#else
- tmp = FIX2LONG(tmp2);
-#endif
- if (nega_flg && tmp) {
- tmp -= mm;
- }
- return LONG2FIX(tmp);
-}
-
-/*
- * Document-method: Integer#pow
- * call-seq:
- * integer.pow(numeric) -> numeric
- * integer.pow(integer, integer) -> integer
- *
- * Returns (modular) exponentiation as:
- *
- * a.pow(b) #=> same as a**b
- * a.pow(b, m) #=> same as (a**b) % m, but avoids huge temporary values
- */
-VALUE
-rb_int_powm(int const argc, VALUE * const argv, VALUE const num)
+rb_big_even_p(VALUE num)
{
- rb_check_arity(argc, 1, 2);
-
- if (argc == 1) {
- return rb_int_pow(num, argv[0]);
- }
- else {
- VALUE const a = num;
- VALUE const b = argv[0];
- VALUE m = argv[1];
- int nega_flg = 0;
- if ( ! RB_INTEGER_TYPE_P(b)) {
- rb_raise(rb_eTypeError, "Integer#pow() 2nd argument not allowed unless a 1st argument is integer");
- }
- if (rb_int_negative_p(b)) {
- rb_raise(rb_eRangeError, "Integer#pow() 1st argument cannot be negative when 2nd argument specified");
- }
- if (!RB_INTEGER_TYPE_P(m)) {
- rb_raise(rb_eTypeError, "Integer#pow() 2nd argument not allowed unless all arguments are integers");
- }
-
- if (rb_int_negative_p(m)) {
- m = rb_int_uminus(m);
- nega_flg = 1;
- }
-
- if (FIXNUM_P(m)) {
- long const half_val = (long)HALF_LONG_MSB;
- long const mm = FIX2LONG(m);
- if (!mm) rb_num_zerodiv();
- if (mm <= half_val) {
- return int_pow_tmp1(rb_int_modulo(a, m), b, mm, nega_flg);
- }
- else {
- return int_pow_tmp2(rb_int_modulo(a, m), b, mm, nega_flg);
- }
- }
- else {
- if (rb_bigzero_p(m)) rb_num_zerodiv();
- return int_pow_tmp3(rb_int_modulo(a, m), b, m, nega_flg);
- }
+ if (BIGNUM_LEN(num) != 0 && BDIGITS(num)[0] & 1) {
+ return Qfalse;
}
- UNREACHABLE_RETURN(Qnil);
+ return Qtrue;
}
/*
@@ -7153,18 +7010,51 @@ rb_int_powm(int const argc, VALUE * const argv, VALUE const num)
void
Init_Bignum(void)
{
-#ifndef RUBY_INTEGER_UNIFICATION
- rb_cBignum = rb_cInteger;
-#endif
- /* An obsolete class, use Integer */
- rb_define_const(rb_cObject, "Bignum", rb_cInteger);
- rb_deprecate_constant(rb_cObject, "Bignum");
-
- rb_define_method(rb_cInteger, "coerce", rb_int_coerce, 1);
+ rb_cBignum = rb_define_class("Bignum", rb_cInteger);
+
+ rb_define_method(rb_cBignum, "to_s", rb_big_to_s, -1);
+ rb_define_alias(rb_cBignum, "inspect", "to_s");
+ rb_define_method(rb_cBignum, "coerce", rb_big_coerce, 1);
+ rb_define_method(rb_cBignum, "-@", rb_big_uminus, 0);
+ rb_define_method(rb_cBignum, "+", rb_big_plus, 1);
+ rb_define_method(rb_cBignum, "-", rb_big_minus, 1);
+ rb_define_method(rb_cBignum, "*", rb_big_mul, 1);
+ rb_define_method(rb_cBignum, "/", rb_big_div, 1);
+ rb_define_method(rb_cBignum, "%", rb_big_modulo, 1);
+ rb_define_method(rb_cBignum, "div", rb_big_idiv, 1);
+ rb_define_method(rb_cBignum, "divmod", rb_big_divmod, 1);
+ rb_define_method(rb_cBignum, "modulo", rb_big_modulo, 1);
+ rb_define_method(rb_cBignum, "remainder", rb_big_remainder, 1);
+ rb_define_method(rb_cBignum, "fdiv", rb_big_fdiv, 1);
+ rb_define_method(rb_cBignum, "**", rb_big_pow, 1);
+ rb_define_method(rb_cBignum, "&", rb_big_and, 1);
+ rb_define_method(rb_cBignum, "|", rb_big_or, 1);
+ rb_define_method(rb_cBignum, "^", rb_big_xor, 1);
+ rb_define_method(rb_cBignum, "~", rb_big_neg, 0);
+ rb_define_method(rb_cBignum, "<<", rb_big_lshift, 1);
+ rb_define_method(rb_cBignum, ">>", rb_big_rshift, 1);
+ rb_define_method(rb_cBignum, "[]", rb_big_aref, 1);
+
+ rb_define_method(rb_cBignum, "<=>", rb_big_cmp, 1);
+ rb_define_method(rb_cBignum, "==", rb_big_eq, 1);
+ rb_define_method(rb_cBignum, ">", big_gt, 1);
+ rb_define_method(rb_cBignum, ">=", big_ge, 1);
+ rb_define_method(rb_cBignum, "<", big_lt, 1);
+ rb_define_method(rb_cBignum, "<=", big_le, 1);
+ rb_define_method(rb_cBignum, "===", rb_big_eq, 1);
+ rb_define_method(rb_cBignum, "eql?", rb_big_eql, 1);
+ rb_define_method(rb_cBignum, "hash", rb_big_hash, 0);
+ rb_define_method(rb_cBignum, "to_f", rb_big_to_f, 0);
+ rb_define_method(rb_cBignum, "abs", rb_big_abs, 0);
+ rb_define_method(rb_cBignum, "magnitude", rb_big_abs, 0);
+ rb_define_method(rb_cBignum, "size", rb_big_size, 0);
+ rb_define_method(rb_cBignum, "bit_length", rb_big_bit_length, 0);
+ rb_define_method(rb_cBignum, "odd?", rb_big_odd_p, 0);
+ rb_define_method(rb_cBignum, "even?", rb_big_even_p, 0);
#ifdef USE_GMP
/* The version of loaded GMP. */
- rb_define_const(rb_cInteger, "GMP_VERSION", rb_sprintf("GMP %s", gmp_version));
+ rb_define_const(rb_cBignum, "GMP_VERSION", rb_sprintf("GMP %s", gmp_version));
#endif
power_cache_init();
diff --git a/bin/bundle b/bin/bundle
deleted file mode 100755
index 1a0b06b005..0000000000
--- a/bin/bundle
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/usr/bin/env ruby
-#
-# This file was generated by RubyGems.
-#
-# The application 'bundler' is installed as part of a gem, and
-# this file is here to facilitate running it.
-#
-
-require 'rubygems'
-
-version = ">= 0.a"
-
-str = ARGV.first
-if str
- str = str.b[/\A_(.*)_\z/, 1]
- if str and Gem::Version.correct?(str)
- version = str
- ARGV.shift
- end
-end
-
-if Gem.respond_to?(:activate_bin_path)
-load Gem.activate_bin_path('bundler', 'bundle', version)
-else
-gem "bundler", version
-load Gem.bin_path("bundler", "bundle", version)
-end
diff --git a/bin/bundler b/bin/bundler
deleted file mode 100755
index e15eb39ed7..0000000000
--- a/bin/bundler
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/usr/bin/env ruby
-#
-# This file was generated by RubyGems.
-#
-# The application 'bundler' is installed as part of a gem, and
-# this file is here to facilitate running it.
-#
-
-require 'rubygems'
-
-version = ">= 0.a"
-
-str = ARGV.first
-if str
- str = str.b[/\A_(.*)_\z/, 1]
- if str and Gem::Version.correct?(str)
- version = str
- ARGV.shift
- end
-end
-
-if Gem.respond_to?(:activate_bin_path)
-load Gem.activate_bin_path('bundler', 'bundler', version)
-else
-gem "bundler", version
-load Gem.bin_path("bundler", "bundler", version)
-end
diff --git a/bin/erb b/bin/erb
index d5e51ee969..6a88c3b26a 100755
--- a/bin/erb
+++ b/bin/erb
@@ -75,7 +75,6 @@ class ERB
when '-r' # require
require ARGV.req_arg
when '-S' # security level
- warn 'warning: -S option of erb command is deprecated. Please do not use this.'
arg = ARGV.req_arg
raise "invalid safe_level #{arg.dump}" unless arg =~ /\A[0-1]\z/
safe_level = arg.to_i
@@ -113,26 +112,22 @@ class ERB
-v enable verbose mode
-d set $DEBUG to true
-r library load a library
+ -S safe_level set $SAFE (0..1)
-E ex[:in] set default external/internal encodings
- -U set default encoding to UTF-8
+ -U set default encoding to UTF-8.
-T trim_mode specify trim_mode (0..2, -)
- -P disable ruby code evaluation for lines beginning with %
+ -P ignore lines which start with "%"
var=value set variable
EOU
exit 1
end
- $<.set_encoding(Encoding::UTF_8, nil)
+ $<.set_encoding(Encoding::ASCII_8BIT, nil)
src = $<.read
filename = $FILENAME
exit 2 unless src
trim = trim_mode_opt(trim_mode, disable_percent)
- if safe_level.nil?
- erb = factory.new(src.untaint, trim_mode: trim)
- else
- # [deprecated] This will be removed at Ruby 2.7.
- erb = factory.new(src.untaint, safe_level, trim_mode: trim)
- end
+ erb = factory.new(src.untaint, safe_level, trim)
erb.filename = filename
if output
if number
diff --git a/bin/irb b/bin/irb
index ae6d358c9d..c64ee85fbd 100755
--- a/bin/irb
+++ b/bin/irb
@@ -1,27 +1,11 @@
#!/usr/bin/env ruby
#
-# This file was generated by RubyGems.
+# irb.rb - interactive ruby
+# $Release Version: 0.9.6 $
+# $Revision$
+# by Keiju ISHITSUKA(keiju@ruby-lang.org)
#
-# The application 'irb' is installed as part of a gem, and
-# this file is here to facilitate running it.
-#
-
-require 'rubygems'
-
-version = ">= 0.a"
-str = ARGV.first
-if str
- str = str.b[/\A_(.*)_\z/, 1]
- if str and Gem::Version.correct?(str)
- version = str
- ARGV.shift
- end
-end
+require "irb"
-if Gem.respond_to?(:activate_bin_path)
-load Gem.activate_bin_path('irb', 'irb', version)
-else
-gem "irb", version
-load Gem.bin_path("irb", "irb", version)
-end
+IRB.start(__FILE__)
diff --git a/bin/rdoc b/bin/rdoc
index 8fa948cddb..aaa23292df 100755
--- a/bin/rdoc
+++ b/bin/rdoc
@@ -1,27 +1,44 @@
#!/usr/bin/env ruby
#
-# This file was generated by RubyGems.
-#
-# The application 'rdoc' is installed as part of a gem, and
-# this file is here to facilitate running it.
+# RDoc: Documentation tool for source code
+# (see lib/rdoc/rdoc.rb for more information)
#
+# Copyright (c) 2003 Dave Thomas
+# Released under the same terms as Ruby
-require 'rubygems'
+begin
+ gem 'rdoc'
+rescue NameError => e # --disable-gems
+ raise unless e.name == :gem
+rescue Gem::LoadError
+end
-version = ">= 0.a"
+require 'rdoc/rdoc'
-str = ARGV.first
-if str
- str = str.b[/\A_(.*)_\z/, 1]
- if str and Gem::Version.correct?(str)
- version = str
- ARGV.shift
+begin
+ r = RDoc::RDoc.new
+ r.document ARGV
+rescue Errno::ENOSPC
+ $stderr.puts 'Ran out of space creating documentation'
+ $stderr.puts
+ $stderr.puts 'Please free up some space and try again'
+rescue SystemExit
+ raise
+rescue Exception => e
+ if $DEBUG_RDOC then
+ $stderr.puts e.message
+ $stderr.puts "#{e.backtrace.join "\n\t"}"
+ $stderr.puts
+ elsif Interrupt === e then
+ $stderr.puts
+ $stderr.puts 'Interrupted'
+ else
+ $stderr.puts "uh-oh! RDoc had a problem:"
+ $stderr.puts e.message
+ $stderr.puts
+ $stderr.puts "run with --debug for full backtrace"
end
-end
-if Gem.respond_to?(:activate_bin_path)
-load Gem.activate_bin_path('rdoc', 'rdoc', version)
-else
-gem "rdoc", version
-load Gem.bin_path("rdoc", "rdoc", version)
+ exit 1
end
+
diff --git a/bin/ri b/bin/ri
index 0cc2f73bb6..7fbed0c099 100755
--- a/bin/ri
+++ b/bin/ri
@@ -1,27 +1,12 @@
#!/usr/bin/env ruby
-#
-# This file was generated by RubyGems.
-#
-# The application 'rdoc' is installed as part of a gem, and
-# this file is here to facilitate running it.
-#
-require 'rubygems'
-
-version = ">= 0.a"
-
-str = ARGV.first
-if str
- str = str.b[/\A_(.*)_\z/, 1]
- if str and Gem::Version.correct?(str)
- version = str
- ARGV.shift
- end
+begin
+ gem 'rdoc'
+rescue NameError => e # --disable-gems
+ raise unless e.name == :gem
+rescue Gem::LoadError
end
-if Gem.respond_to?(:activate_bin_path)
-load Gem.activate_bin_path('rdoc', 'ri', version)
-else
-gem "rdoc", version
-load Gem.bin_path("rdoc", "ri", version)
-end
+require 'rdoc/ri/driver'
+
+RDoc::RI::Driver.run ARGV
diff --git a/bootstraptest/runner.rb b/bootstraptest/runner.rb
index 58619fae7e..5eb468a338 100755
--- a/bootstraptest/runner.rb
+++ b/bootstraptest/runner.rb
@@ -6,7 +6,6 @@
# Never use optparse in this file.
# Never use test/unit in this file.
# Never use Ruby extensions in this file.
-# Maintain Ruby 1.8 compatibility for now
begin
require 'fileutils'
@@ -61,7 +60,6 @@ end
def main
@ruby = File.expand_path('miniruby')
@verbose = false
- $VERBOSE = false
$stress = false
@color = nil
@tty = nil
@@ -255,25 +253,30 @@ def show_progress(message = '')
end
end
rescue Interrupt
- $stderr.puts "\##{@count} #{@location}"
- raise
+ raise Interrupt
rescue Exception => err
$stderr.print 'E'
$stderr.puts if @verbose
error err.message, message
end
-def assert_check(testsrc, message = '', opt = '', **argh)
+# NativeClient is special. The binary is cross-compiled. But runs on the build environment.
+# So RUBY_PLATFORM in this process is not useful to detect it.
+def nacl?
+ @ruby and File.basename(@ruby.split(/\s/).first)['sel_ldr']
+end
+
+def assert_check(testsrc, message = '', opt = '')
show_progress(message) {
- result = get_result_string(testsrc, opt, **argh)
+ result = get_result_string(testsrc, opt)
check_coredump
yield(result)
}
end
-def assert_equal(expected, testsrc, message = '', opt = '', **argh)
+def assert_equal(expected, testsrc, message = '')
newtest
- assert_check(testsrc, message, opt, **argh) {|result|
+ assert_check(testsrc, message) {|result|
if expected == result
nil
else
@@ -314,10 +317,13 @@ def assert_valid_syntax(testsrc, message = '')
}
end
-def assert_normal_exit(testsrc, *rest, timeout: nil, **opt)
+def assert_normal_exit(testsrc, *rest)
newtest
+ opt = {}
+ opt = rest.pop if Hash === rest.last
message, ignore_signals = rest
message ||= ''
+ timeout = opt[:timeout]
show_progress(message) {
faildesc = nil
filename = make_srcfile(testsrc)
@@ -341,7 +347,7 @@ def assert_normal_exit(testsrc, *rest, timeout: nil, **opt)
$stderr.reopen(old_stderr)
old_stderr.close
end
- if status && status.signaled?
+ if status&.signaled?
signo = status.termsig
signame = Signal.list.invert[signo]
unless ignore_signals and ignore_signals.include?(signame)
@@ -367,7 +373,6 @@ def assert_normal_exit(testsrc, *rest, timeout: nil, **opt)
end
def assert_finish(timeout_seconds, testsrc, message = '')
- timeout_seconds *= 3 if RubyVM::MJIT.enabled? # for --jit-wait
newtest
show_progress(message) {
faildesc = nil
@@ -376,24 +381,12 @@ def assert_finish(timeout_seconds, testsrc, message = '')
pid = io.pid
waited = false
tlimit = Time.now + timeout_seconds
- diff = timeout_seconds
- while diff > 0
+ while Time.now < tlimit
if Process.waitpid pid, Process::WNOHANG
waited = true
break
end
- if io.respond_to?(:read_nonblock)
- if IO.select([io], nil, nil, diff)
- begin
- io.read_nonblock(1024)
- rescue Errno::EAGAIN, IO::WaitReadable, EOFError
- break
- end while true
- end
- else
- sleep 0.1
- end
- diff = tlimit - Time.now
+ sleep 0.1
end
if !waited
Process.kill(:KILL, pid)
@@ -411,7 +404,7 @@ def flunk(message = '')
end
def pretty(src, desc, result)
- src = src.sub(/\A\s*\n/, '')
+ src = src.sub(/\A.*\n/, '')
(/\n/ =~ src ? "\n#{adjust_indent(src)}" : src) + " #=> #{desc}"
end
@@ -425,19 +418,18 @@ def untabify(str)
str.gsub(/^\t+/) {' ' * (8 * $&.size) }
end
-def make_srcfile(src, frozen_string_literal: nil)
+def make_srcfile(src)
filename = 'bootstraptest.tmp.rb'
File.open(filename, 'w') {|f|
- f.puts "#frozen_string_literal:true" if frozen_string_literal
f.puts "GC.stress = true" if $stress
f.puts "print(begin; #{src}; end)"
}
filename
end
-def get_result_string(src, opt = '', **argh)
+def get_result_string(src, opt = '')
if @ruby
- filename = make_srcfile(src, **argh)
+ filename = make_srcfile(src)
begin
`#{@ruby} -W0 #{opt} #{filename}`
ensure
diff --git a/bootstraptest/test_env.rb b/bootstraptest/test_env.rb
deleted file mode 100644
index 7d1b45b75e..0000000000
--- a/bootstraptest/test_env.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-assert_equal "true", %q{
- ENV["ENVTEST"] = "\u{e9 3042 d76c}"
- env = ENV["ENVTEST"]
- env.valid_encoding?
-}
-
-# different encoding is used for PATH
-assert_equal "true", %q{
- ENV["PATH"] = "\u{e9 3042 d76c}"
- env = ENV["PATH"]
- env.valid_encoding?
-}
diff --git a/bootstraptest/test_eval.rb b/bootstraptest/test_eval.rb
index 8e90ac2728..bf7478006d 100644
--- a/bootstraptest/test_eval.rb
+++ b/bootstraptest/test_eval.rb
@@ -109,7 +109,7 @@ assert_equal %q{foo}, %q{
}
}
assert_equal %q{1}, %q{
- class Integer
+ class Fixnum
Const = 1
end
1.instance_eval %{
diff --git a/bootstraptest/test_exception.rb b/bootstraptest/test_exception.rb
index 0fb6f552b8..35c8d25e37 100644
--- a/bootstraptest/test_exception.rb
+++ b/bootstraptest/test_exception.rb
@@ -402,7 +402,7 @@ assert_equal 'nil', %q{
exc.inspect
}, '[ruby-dev:32608]'
-assert_equal 'divided by 0', %q{
+assert_equal 'exception class/object expected', %q{
class ZeroDivisionError
def self.new(message)
42
diff --git a/bootstraptest/test_flow.rb b/bootstraptest/test_flow.rb
index 9da6d45cbd..0390062a24 100644
--- a/bootstraptest/test_flow.rb
+++ b/bootstraptest/test_flow.rb
@@ -589,13 +589,3 @@ assert_equal "foo", %q{
end
Bug6460.new.m1
}, '[ruby-dev:46372]'
-
-assert_equal "foo", %q{
- obj = "foo"
- if obj || any1
- any2 = any2
- else
- raise obj.inspect
- end
- obj
-}, '[ruby-core:87830]'
diff --git a/bootstraptest/test_fork.rb b/bootstraptest/test_fork.rb
index 83923dad97..1cd9f7ac6c 100644
--- a/bootstraptest/test_fork.rb
+++ b/bootstraptest/test_fork.rb
@@ -21,9 +21,7 @@ assert_finish 10, %q{
end
}, '[ruby-core:22158]'
-# temporarily stop this test to enable explicit failure when
-# timer thread couldn't be created (r61706 and r61717).
-assert_normal_exit(<<'End', '[ruby-dev:37934]') if false
+assert_normal_exit(<<'End', '[ruby-dev:37934]')
main = Thread.current
Thread.new { sleep 0.01 until main.stop?; Thread.kill main }
Process.setrlimit(:NPROC, 1) if defined?(Process::RLIMIT_NPROC)
diff --git a/bootstraptest/test_insns.rb b/bootstraptest/test_insns.rb
deleted file mode 100644
index 88f36bd0c2..0000000000
--- a/bootstraptest/test_insns.rb
+++ /dev/null
@@ -1,420 +0,0 @@
-# C0 coverage of each instructions
-
-# :NOTE: This is for development purpose; never consider this file as
-# ISeq compilation specification.
-
-begin
- # This library brings some additional coverage.
- # Not mandatory.
- require 'rbconfig/sizeof'
-rescue LoadError
- # OK, just skip
-else
- $FIXNUM_MAX = RbConfig::LIMITS["FIXNUM_MAX"]
- $FIXNUM_MIN = RbConfig::LIMITS["FIXNUM_MIN"]
-end
-
-fsl = { frozen_string_literal: true } # used later
-tests = [
- # insn , expression to generate such insn
- [ 'nop', %q{ raise rescue true }, ],
-
- [ 'setlocal *, 0', %q{ x = true }, ],
- [ 'setlocal *, 1', %q{ x = nil; -> { x = true }.call }, ],
- [ 'setlocal', %q{ x = nil; -> { -> { x = true }.() }.() }, ],
- [ 'getlocal *, 0', %q{ x = true; x }, ],
- [ 'getlocal *, 1', %q{ x = true; -> { x }.call }, ],
- [ 'getlocal', %q{ x = true; -> { -> { x }.() }.() }, ],
-
- [ 'setblockparam', <<~'},', ], # {
- def m&b
- b = # here
- proc { true }
- end
- m { false }.call
- },
- [ 'getblockparam', <<~'},', ], # {
- def m&b
- b # here
- end
- m { true }.call
- },
- [ 'getblockparamproxy', <<~'},', ], # {
- def m&b
- b # here
- .call
- end
- m { true }
- },
-
- [ 'setspecial', %q{ true if true..true }, ],
- [ 'getspecial', %q{ $&.nil? }, ],
- [ 'getspecial', %q{ $`.nil? }, ],
- [ 'getspecial', %q{ $'.nil? }, ],
- [ 'getspecial', %q{ $+.nil? }, ],
- [ 'getspecial', %q{ $1.nil? }, ],
- [ 'getspecial', %q{ $128.nil? }, ],
-
- [ 'getglobal', %q{ String === $0 }, ],
- [ 'getglobal', %q{ $_.nil? }, ],
- [ 'setglobal', %q{ $0 = "true" }, ],
-
- [ 'setinstancevariable', %q{ @x = true }, ],
- [ 'getinstancevariable', %q{ @x = true; @x }, ],
-
- [ 'setclassvariable', %q{ @@x = true }, ],
- [ 'getclassvariable', %q{ @@x = true; @@x }, ],
-
- [ 'setconstant', %q{ X = true }, ],
- [ 'setconstant', %q{ Object::X = true }, ],
- [ 'getconstant', %q{ X = true; X }, ],
- [ 'getconstant', %q{ X = true; Object::X }, ],
-
- [ 'getinlinecache / setinlinecache', %q{ def x; X; end; X = true; x; x; x }, ],
-
- [ 'putnil', %q{ $~ == nil }, ],
- [ 'putself', %q{ $~ != self }, ],
- [ 'putobject INT2FIX(0)', %q{ $~ != 0 }, ],
- [ 'putobject INT2FIX(1)', %q{ $~ != 1 }, ],
- [ 'putobject', %q{ $~ != -1 }, ],
- [ 'putobject', %q{ $~ != /x/ }, ],
- [ 'putobject', %q{ $~ != :x }, ],
- [ 'putobject', %q{ $~ != (1..2) }, ],
- [ 'putobject', %q{ $~ != true }, ],
- [ 'putobject', %q{ /(?<x>x)/ =~ "x"; x == "x" }, ],
-
- [ 'putspecialobject', %q{ {//=>true}[//] }, ],
- [ 'putiseq', %q{ -> { true }.() }, ],
- [ 'putstring', %q{ "true" }, ],
- [ 'tostring / concatstrings', %q{ "#{true}" }, ],
- [ 'freezestring', %q{ "#{true}" }, fsl, ],
- [ 'freezestring', %q{ "#{true}" }, '-d', fsl, ],
- [ 'toregexp', %q{ /#{true}/ =~ "true" && $~ }, ],
- [ 'intern', %q{ :"#{true}" }, ],
-
- [ 'newarray', %q{ ["true"][0] }, ],
- [ 'duparray', %q{ [ true ][0] }, ],
- [ 'expandarray', %q{ y = [ true, false, nil ]; x, = y; x }, ],
- [ 'expandarray', %q{ y = [ true, false, nil ]; x, *z = y; x }, ],
- [ 'expandarray', %q{ y = [ true, false, nil ]; x, *z, w = y; x }, ],
- [ 'splatarray', %q{ x, = *(y = true), false; x }, ],
- [ 'concatarray', %q{ ["t", "r", *x = "u", "e"].join }, ],
- [ 'concatarray', <<~'},', ], # {
- class X; def to_a; ['u']; end; end
- ['t', 'r', *X.new, 'e'].join
- },
- [ 'concatarray', <<~'},', ], # {
- r = false
- t = [true, nil]
- q, w, e = r, *t # here
- w
- },
-
- [ 'newhash', %q{ x = {}; x[x] = true }, ],
- [ 'newhash', %q{ x = true; { x => x }[x] }, ],
- [ 'newhashfromarray', %q{ { a: true }[:a] }, ],
- [ 'newrange', %q{ x = 1; [*(0..x)][0] == 0 }, ],
- [ 'newrange', %q{ x = 1; [*(0...x)][0] == 0 }, ],
-
- [ 'pop', %q{ def x; true; end; x }, ],
- [ 'dup', %q{ x = y = true; x }, ],
- [ 'dupn', %q{ Object::X ||= true }, ],
- [ 'reverse', %q{ q, (w, e), r = 1, [2, 3], 4; e == 3 }, ],
- [ 'swap', <<~'},', ], # {
- x = [[false, true]]
- for i, j in x # here
- ;
- end
- j
- },
-
- [ 'topn', %q{ x, y = [], 0; x[*y], = [true, false]; x[0] }, ],
- [ 'setn', %q{ x, y = [], 0; x[*y] = true ; x[0] }, ],
- [ 'adjuststack', %q{ x = [true]; x[0] ||= nil; x[0] }, ],
-
- [ 'defined', %q{ !defined?(x) }, ],
- [ 'checkkeyword', %q{ def x x:rand;x end; x x: true }, ],
- [ 'checktype', %q{ x = true; "#{x}" }, ],
- [ 'checkmatch', <<~'},', ], # {
- x = y = true
- case x
- when false
- y = false
- when true # here
- y = nil
- end
- y == nil
- },
- [ 'checkmatch', <<~'},', ], # {
- x, y = true, [false]
- case x
- when *y # here
- z = false
- else
- z = true
- end
- z
- },
- [ 'checkmatch', <<~'},', ], # {
- x = false
- begin
- raise
- rescue # here
- x = true
- end
- x
- },
-
- [ 'defineclass', %q{ module X; true end }, ],
- [ 'defineclass', %q{ X = Module.new; module X; true end }, ],
- [ 'defineclass', %q{ class X; true end }, ],
- [ 'defineclass', %q{ X = Class.new; class X; true end }, ],
- [ 'defineclass', %q{ X = Class.new; class Y < X; true end }, ],
- [ 'defineclass', %q{ X = Class.new; class << X; true end }, ],
- [ 'defineclass', <<~'},', ], # {
- X = Class.new
- Y = Class.new(X)
- class Y < X
- true
- end
- },
-
- [ 'opt_send_without_block', %q{ true.to_s }, ],
- [ 'send', %q{ true.tap {|i| i.to_s } }, ],
- [ 'leave', %q{ def x; true; end; x }, ],
- [ 'invokesuper', <<~'},', ], # {
- class X < String
- def empty?
- super # here
- end
- end
- X.new.empty?
- },
- [ 'invokeblock', <<~'},', ], # {
- def x
- return yield self # here
- end
- x do
- true
- end
- },
-
- [ 'opt_str_freeze', %q{ 'true'.freeze }, ],
- [ 'opt_str_uminus', %q{ -'true' }, ],
- [ 'opt_str_freeze', <<~'},', ], # {
- class String
- def freeze
- true
- end
- end
- 'true'.freeze
- },
-
- [ 'opt_newarray_max', %q{ [ ].max.nil? }, ],
- [ 'opt_newarray_max', %q{ [1, x = 2, 3].max == 3 }, ],
- [ 'opt_newarray_max', <<~'},', ], # {
- class Array
- def max
- true
- end
- end
- [1, x = 2, 3].max
- },
- [ 'opt_newarray_min', %q{ [ ].min.nil? }, ],
- [ 'opt_newarray_min', %q{ [3, x = 2, 1].min == 1 }, ],
- [ 'opt_newarray_min', <<~'},', ], # {
- class Array
- def min
- true
- end
- end
- [3, x = 2, 1].min
- },
-
- [ 'throw', %q{ false.tap { break true } }, ],
- [ 'branchif', %q{ x = nil; x ||= true }, ],
- [ 'branchif', %q{ x = true; x ||= nil; x }, ],
- [ 'branchunless', %q{ x = 1; x &&= true }, ],
- [ 'branchunless', %q{ x = nil; x &&= true; x.nil? }, ],
- [ 'branchnil', %q{ x = true; x&.to_s }, ],
- [ 'branchnil', %q{ x = nil; (x&.to_s).nil? }, ],
- [ 'jump', <<~'},', ], # {
- y = 1
- x = if y == 0 then nil elsif y == 1 then true else nil end
- x
- },
- [ 'jump', <<~'},', ], # {
- # ultra complicated situation: this ||= assignment only generates
- # 15 instructions, not including the class definition.
- class X; attr_accessor :x; end
- x = X.new
- x&.x ||= true # here
- },
-
- [ 'once', %q{ /#{true}/o =~ "true" && $~ }, ],
- [ 'once', <<~'},', ], # {
- def once expr
- return /#{expr}/o # here
- end
- x = once(true); x = once(false); x = once(nil);
- x =~ "true" && $~
- },
- [ 'once', <<~'},', ], # {
- # recursive once
- def once n
- return %r/#{
- if n == 0
- true
- else
- once(n-1) # here
- end
- }/ox
- end
- x = once(128); x = once(7); x = once(16);
- x =~ "true" && $~
- },
- [ 'once', <<~'},', ], # {
- # inter-thread lockup situation
- def once n
- return Thread.start n do |m|
- Thread.pass
- next %r/#{
- sleep m # here
- true
- }/ox
- end
- end
- x = once(1); y = once(0.1); z = y.value
- z =~ "true" && $~
- },
-
- [ 'opt_case_dispatch', %q{ case 0 when 1.1 then false else true end }, ],
- [ 'opt_case_dispatch', %q{ case 1.0 when 1.1 then false else true end }, ],
-
- [ 'opt_plus', %q{ 1 + 1 == 2 }, ],
- if defined? $FIXNUM_MAX then
- [ 'opt_plus', %Q{ #{ $FIXNUM_MAX } + 1 == #{ $FIXNUM_MAX + 1 } }, ]
- end,
- [ 'opt_plus', %q{ 1.0 + 1.0 == 2.0 }, ],
- [ 'opt_plus', %q{ x = +0.0.next_float; x + x >= x }, ],
- [ 'opt_plus', %q{ 't' + 'rue' }, ],
- [ 'opt_plus', %q{ ( ['t'] + ['r', ['u', ['e'], ], ] ).join }, ],
- [ 'opt_plus', %q{ Time.at(1) + 1 == Time.at(2) }, ],
- [ 'opt_minus', %q{ 1 - 1 == 0 }, ],
- if defined? $FIXNUM_MIN then
- [ 'opt_minus', %Q{ #{ $FIXNUM_MIN } - 1 == #{ $FIXNUM_MIN - 1 } }, ]
- end,
- [ 'opt_minus', %q{ 1.0 - 1.0 == 0.0 }, ],
- [ 'opt_minus', %q{ x = -0.0.prev_float; x - x == 0.0 }, ],
- [ 'opt_minus', %q{ ( [false, true] - [false] )[0] }, ],
- [ 'opt_mult', %q{ 1 * 1 == 1 }, ],
- [ 'opt_mult', %q{ 1.0 * 1.0 == 1.0 }, ],
- [ 'opt_mult', %q{ x = +0.0.next_float; x * x <= x }, ],
- [ 'opt_mult', %q{ ( "ruet" * 3 )[7,4] }, ],
- [ 'opt_div', %q{ 1 / 1 == 1 }, ],
- [ 'opt_div', %q{ 1.0 / 1.0 == 1.0 }, ],
- [ 'opt_div', %q{ x = +0.0.next_float; x / x >= x }, ],
- [ 'opt_div', %q{ x = 1/2r; x / x == 1 }, ],
- [ 'opt_mod', %q{ 1 % 1 == 0 }, ],
- [ 'opt_mod', %q{ 1.0 % 1.0 == 0.0 }, ],
- [ 'opt_mod', %q{ x = +0.0.next_float; x % x == 0.0 }, ],
- [ 'opt_mod', %q{ '%s' % [ true ] }, ],
-
- [ 'opt_eq', %q{ 1 == 1 }, ],
- [ 'opt_eq', <<~'},', ], # {
- class X; def == other; true; end; end
- X.new == true
- },
- [ 'opt_neq', %q{ 1 != 0 }, ],
- [ 'opt_neq', <<~'},', ], # {
- class X; def != other; true; end; end
- X.new != true
- },
-
- [ 'opt_lt', %q{ -1 < 0 }, ],
- [ 'opt_lt', %q{ -1.0 < 0.0 }, ],
- [ 'opt_lt', %q{ -0.0.prev_float < 0.0 }, ],
- [ 'opt_lt', %q{ ?a < ?z }, ],
- [ 'opt_le', %q{ -1 <= 0 }, ],
- [ 'opt_le', %q{ -1.0 <= 0.0 }, ],
- [ 'opt_le', %q{ -0.0.prev_float <= 0.0 }, ],
- [ 'opt_le', %q{ ?a <= ?z }, ],
- [ 'opt_gt', %q{ 1 > 0 }, ],
- [ 'opt_gt', %q{ 1.0 > 0.0 }, ],
- [ 'opt_gt', %q{ +0.0.next_float > 0.0 }, ],
- [ 'opt_gt', %q{ ?z > ?a }, ],
- [ 'opt_ge', %q{ 1 >= 0 }, ],
- [ 'opt_ge', %q{ 1.0 >= 0.0 }, ],
- [ 'opt_ge', %q{ +0.0.next_float >= 0.0 }, ],
- [ 'opt_ge', %q{ ?z >= ?a }, ],
-
- [ 'opt_ltlt', %q{ '' << 'true' }, ],
- [ 'opt_ltlt', %q{ ([] << 'true').join }, ],
- [ 'opt_ltlt', %q{ (1 << 31) == 2147483648 }, ],
-
- [ 'opt_aref', %q{ ['true'][0] }, ],
- [ 'opt_aref', %q{ { 0 => 'true'}[0] }, ],
- [ 'opt_aref', %q{ 'true'[0] == ?t }, ],
- [ 'opt_aset', %q{ [][0] = true }, ],
- [ 'opt_aset', %q{ {}[0] = true }, ],
- [ 'opt_aset', %q{ x = 'frue'; x[0] = 't'; x }, ],
- [ 'opt_aset', <<~'},', ], # {
- # opt_aref / opt_aset mixup situation
- class X; def x; {}; end; end
- x = X.new
- x&.x[true] ||= true # here
- },
-
- [ 'opt_aref_with', %q{ { 'true' => true }['true'] }, ],
- [ 'opt_aref_with', %q{ Struct.new(:nil).new['nil'].nil? }, ],
- [ 'opt_aset_with', %q{ {}['true'] = true }, ],
- [ 'opt_aset_with', %q{ Struct.new(:true).new['true'] = true }, ],
-
- [ 'opt_length', %q{ 'true' .length == 4 }, ],
- [ 'opt_length', %q{ :true .length == 4 }, ],
- [ 'opt_length', %q{ [ 'true' ] .length == 1 }, ],
- [ 'opt_length', %q{ { 'true' => 1 }.length == 1 }, ],
- [ 'opt_size', %q{ 'true' .size == 4 }, ],
- [ 'opt_size', %q{ 1.size >= 4 }, ],
- [ 'opt_size', %q{ [ 'true' ] .size == 1 }, ],
- [ 'opt_size', %q{ { 'true' => 1 }.size == 1 }, ],
- [ 'opt_empty_p', %q{ ''.empty? }, ],
- [ 'opt_empty_p', %q{ [].empty? }, ],
- [ 'opt_empty_p', %q{ {}.empty? }, ],
- [ 'opt_empty_p', %q{ Queue.new.empty? }, ],
-
- [ 'opt_succ', %q{ 1.succ == 2 }, ],
- if defined? $FIXNUM_MAX then
- [ 'opt_succ',%Q{ #{ $FIXNUM_MAX }.succ == #{ $FIXNUM_MAX + 1 } }, ]
- end,
- [ 'opt_succ', %q{ '1'.succ == '2' }, ],
- [ 'opt_succ', %q{ x = Time.at(0); x.succ == Time.at(1) }, ],
-
- [ 'opt_not', %q{ ! false }, ],
- [ 'opt_neq', <<~'},', ], # {
- class X; def !; true; end; end
- ! X.new
- },
-
- [ 'opt_regexpmatch1', %q{ /true/ =~ 'true' && $~ }, ],
- [ 'opt_regexpmatch1', <<~'},', ], # {
- class Regexp; def =~ other; true; end; end
- /true/ =~ 'true'
- },
- [ 'opt_regexpmatch2', %q{ 'true' =~ /true/ && $~ }, ],
- [ 'opt_regexpmatch2', <<~'},', ], # {
- class String; def =~ other; true; end; end
- 'true' =~ /true/
- },
-
- [ 'opt_call_c_function', 'Struct.new(:x).new.x = true', ],
-]
-
-# normal path
-tests.compact.each {|(insn, expr, *a)| assert_equal 'true', expr, insn, *a }
-
-# with trace
-tests.compact.each {|(insn, expr, *a)|
- progn = "set_trace_func(proc{})\n" + expr
- assert_equal 'true', progn, insn, *a
-}
diff --git a/bootstraptest/test_io.rb b/bootstraptest/test_io.rb
index 89c00d0b88..1d2b19368a 100644
--- a/bootstraptest/test_io.rb
+++ b/bootstraptest/test_io.rb
@@ -52,7 +52,7 @@ assert_equal 'ok', %q{
STDIN.reopen(rw)
STDIN.reopen(save)
rw.close
- File.unlink(tmpname)
+ File.unlink(tmpname) unless RUBY_PLATFORM['nacl']
:ok
}
@@ -69,7 +69,7 @@ assert_equal 'ok', %q{
STDIN.print "a"
STDIN.reopen(save)
rw.close
- File.unlink(tmpname)
+ File.unlink(tmpname) unless RUBY_PLATFORM['nacl']
:ok
}
diff --git a/bootstraptest/test_literal.rb b/bootstraptest/test_literal.rb
index 9b3c10d519..aa65bddae1 100644
--- a/bootstraptest/test_literal.rb
+++ b/bootstraptest/test_literal.rb
@@ -15,17 +15,17 @@ assert_equal 'sym', ':sym'
assert_equal ':sym', ':sym.inspect'
assert_equal 'Symbol', ':sym.class'
assert_equal '1234', '1234'
-assert_equal 'Integer', '1234.class'
+assert_equal 'Fixnum', '1234.class'
assert_equal '1234', '1_2_3_4'
-assert_equal 'Integer', '1_2_3_4.class'
+assert_equal 'Fixnum', '1_2_3_4.class'
assert_equal '18', '0x12'
-assert_equal 'Integer', '0x12.class'
+assert_equal 'Fixnum', '0x12.class'
assert_equal '15', '0o17'
-assert_equal 'Integer', '0o17.class'
+assert_equal 'Fixnum', '0o17.class'
assert_equal '5', '0b101'
-assert_equal 'Integer', '0b101.class'
+assert_equal 'Fixnum', '0b101.class'
assert_equal '123456789012345678901234567890', '123456789012345678901234567890'
-assert_equal 'Integer', '123456789012345678901234567890.class'
+assert_equal 'Bignum', '123456789012345678901234567890.class'
assert_equal '2.0', '2.0'
assert_equal 'Float', '1.3.class'
@@ -65,8 +65,10 @@ assert_equal ':a3c', ':"a#{1+2}c".inspect'
assert_equal 'Symbol', ':"a#{1+2}c".class'
# xstring
-assert_equal "foo\n", %q(`echo foo`)
-assert_equal "foo\n", %q(s = "foo"; `echo #{s}`)
+unless nacl?
+ assert_equal "foo\n", %q(`echo foo`)
+ assert_equal "foo\n", %q(s = "foo"; `echo #{s}`)
+end
# regexp
assert_equal '', '//.source'
@@ -97,7 +99,7 @@ assert_equal '[3]', '[3].inspect'
assert_equal '3', 'a = [3]; a[0]'
assert_equal 'Array', '[1,2].class'
assert_equal '2', '[1,2].size'
-assert_equal '[1, 2]', '[1,2].inspect'
+assert_equal '[1, 2]', '[1,2].inspect'
assert_equal 'Array', '[1,2,3,4,5].class'
assert_equal '5', '[1,2,3,4,5].size'
assert_equal '[1, 2, 3, 4, 5]', '[1,2,3,4,5].inspect'
@@ -167,7 +169,7 @@ assert_equal 'a', 'r = ("a".."c"); r.begin'
assert_equal 'c', 'r = ("a".."c"); r.end'
assert_equal 'String', '__FILE__.class'
-assert_equal 'Integer', '__LINE__.class'
+assert_equal 'Fixnum', '__LINE__.class'
###
@@ -223,24 +225,6 @@ assert_equal 'ok', %q{ # long hash literal (optimized)
:ok
}
-assert_equal 'ok', %q{ # Bug #15536
- eval <<-END
- {
- **{
- a0: nil, a1: nil, a2: nil, a3: nil, a4: nil, a5: nil, a6: nil, a7: nil, a8: nil,
- },
- a0: nil, a1: nil, a2: nil, a3: nil, a4: nil, a5: nil, a6: nil, a7: nil, a8: nil,
- **{
- c: nil
- },
- b0: nil, b1: nil, b2: nil, b3: nil, b4: nil, b5: nil, b6: nil, b7: nil, b8: nil,
- b9: nil, b10: nil, b11: nil, b12: nil, b13: nil, b14: nil, b15: nil, b16: nil,
- b17: nil, b18: nil, b19: nil, b20: nil, b21: nil,
- }
- END
- :ok
-}
-
assert_equal 'ok', %q{
[print(:ok), exit] # void literal with side-effect
:dummy
diff --git a/bootstraptest/test_objectspace.rb b/bootstraptest/test_objectspace.rb
index 24a1a0ce2c..862a94e376 100644
--- a/bootstraptest/test_objectspace.rb
+++ b/bootstraptest/test_objectspace.rb
@@ -35,7 +35,7 @@ assert_normal_exit %q{
assert_normal_exit %q{
ObjectSpace.define_finalizer("") do
- Thread::Mutex.new.lock
+ Mutex.new.lock
end
}, '[ruby-dev:44049]'
diff --git a/bootstraptest/test_proc.rb b/bootstraptest/test_proc.rb
index 1e384411dc..c23394e8d2 100644
--- a/bootstraptest/test_proc.rb
+++ b/bootstraptest/test_proc.rb
@@ -224,14 +224,14 @@ assert_equal %q{[[nil, []], [1, []], [1, [2]], [1, [2, 3]]]}, %q{
Proc.new{|a, *b| [a, b]}.call(1, 2, 3),
]
}
-assert_equal %q{1}, %q{
+assert_equal %q{0}, %q{
pr = proc{
$SAFE
}
$SAFE = 1
pr.call
}
-assert_equal %q{[1, 1]}, %q{
+assert_equal %q{[1, 0]}, %q{
pr = proc{
$SAFE += 1
}
diff --git a/bootstraptest/test_thread.rb b/bootstraptest/test_thread.rb
index d16295de8b..d64f44be49 100644
--- a/bootstraptest/test_thread.rb
+++ b/bootstraptest/test_thread.rb
@@ -25,9 +25,8 @@ rescue ThreadError => e
:ok if /can't create Thread/ =~ e.message
end
}
-assert_equal %q{ok}, %q{
-begin
- :ok if 5000 == 5000.times{|e|
+assert_equal %q{5000}, %q{
+ 5000.times{|e|
(1..2).map{
Thread.new{
}
@@ -35,13 +34,9 @@ begin
e.join()
}
}
-rescue ThreadError => e
- :ok if /can't create Thread/ =~ e.message
-end
}
-assert_equal %q{ok}, %q{
-begin
- :ok if 5000 == 5000.times{|e|
+assert_equal %q{5000}, %q{
+ 5000.times{|e|
(1..2).map{
Thread.new{
}
@@ -49,9 +44,6 @@ begin
e.join(1000000000)
}
}
-rescue ThreadError => e
- :ok if /can't create Thread/ =~ e.message
-end
}
assert_equal %q{ok}, %q{
begin
@@ -347,7 +339,7 @@ assert_equal 'ok', %q{
assert_equal 'ok', %q{
begin
- m1, m2 = Thread::Mutex.new, Thread::Mutex.new
+ m1, m2 = Mutex.new, Mutex.new
f1 = f2 = false
Thread.new { m1.lock; f2 = true; sleep 0.001 until f1; m2.lock }
m2.lock; f1 = true; sleep 0.001 until f2; m1.lock
@@ -358,32 +350,32 @@ assert_equal 'ok', %q{
}
assert_equal 'ok', %q{
- m = Thread::Mutex.new
+ m = Mutex.new
Thread.new { m.lock }; sleep 0.1; m.lock
:ok
}
assert_equal 'ok', %q{
- m = Thread::Mutex.new
+ m = Mutex.new
Thread.new { m.lock }; m.lock
:ok
}
assert_equal 'ok', %q{
- m = Thread::Mutex.new
+ m = Mutex.new
Thread.new { m.lock }.join; m.lock
:ok
}
assert_equal 'ok', %q{
- m = Thread::Mutex.new
+ m = Mutex.new
Thread.new { m.lock; sleep 0.2 }
sleep 0.1; m.lock
:ok
}
assert_equal 'ok', %q{
- m = Thread::Mutex.new
+ m = Mutex.new
Thread.new { m.lock; sleep 0.2; m.unlock }
sleep 0.1; m.lock
:ok
@@ -409,7 +401,7 @@ assert_equal 'ok', %{
open("zzz.rb", "w") do |f|
f.puts <<-'end;' # do
begin
- m = Thread::Mutex.new
+ m = Mutex.new
parent = Thread.current
th1 = Thread.new { m.lock; sleep }
sleep 0.01 until th1.stop?
@@ -437,8 +429,8 @@ assert_equal 'ok', %{
assert_finish 3, %q{
require 'thread'
- lock = Thread::Mutex.new
- cond = Thread::ConditionVariable.new
+ lock = Mutex.new
+ cond = ConditionVariable.new
t = Thread.new do
lock.synchronize do
cond.wait(lock)
diff --git a/ccan/list/list.h b/ccan/list/list.h
index 59ab45ee53..ca9f9f1f7f 100644
--- a/ccan/list/list.h
+++ b/ccan/list/list.h
@@ -57,7 +57,7 @@ struct list_head
* Example:
* static struct list_head my_list = LIST_HEAD_INIT(my_list);
*/
-#define LIST_HEAD_INIT(name) { { &(name).n, &(name).n } }
+#define LIST_HEAD_INIT(name) { { &name.n, &name.n } }
/**
* LIST_HEAD - define and initialize an empty list_head
@@ -238,21 +238,6 @@ static inline int list_empty_nodebug(const struct list_head *h)
#endif
/**
- * list_empty_nocheck - is a list empty?
- * @h: the list_head
- *
- * If the list is empty, returns true. This doesn't perform any
- * debug check for list consistency, so it can be called without
- * locks, racing with the list being modified. This is ok for
- * checks where an incorrect result is not an issue (optimized
- * bail out path for example).
- */
-static inline bool list_empty_nocheck(const struct list_head *h)
-{
- return h->n.next == &h->n;
-}
-
-/**
* list_del - delete an entry from an (unknown) linked list.
* @n: the list_node to delete from the list.
*
@@ -662,12 +647,12 @@ static inline void list_prepend_list_(struct list_head *to,
* so you can break and continue as normal.
*
* WARNING! Being the low-level macro that it is, this wrapper doesn't know
- * nor care about the type of @i. The only assumption made is that @i points
+ * nor care about the type of @i. The only assumtion made is that @i points
* to a chunk of memory that at some @offset, relative to @i, contains a
- * properly filled `struct list_node' which in turn contains pointers to
- * memory chunks and it's turtles all the way down. With all that in mind
+ * properly filled `struct node_list' which in turn contains pointers to
+ * memory chunks and it's turtles all the way down. Whith all that in mind
* remember that given the wrong pointer/offset couple this macro will
- * happily churn all you memory until SEGFAULT stops it, in other words
+ * happilly churn all you memory untill SEGFAULT stops it, in other words
* caveat emptor.
*
* It is worth mentioning that one of legitimate use-cases for that wrapper
diff --git a/class.c b/class.c
index 9244f020f3..a72f4dcebd 100644
--- a/class.c
+++ b/class.c
@@ -274,7 +274,7 @@ clone_method_i(ID key, VALUE value, void *data)
struct clone_const_arg {
VALUE klass;
- struct rb_id_table *tbl;
+ st_table *tbl;
};
static int
@@ -285,14 +285,14 @@ clone_const(ID key, const rb_const_entry_t *ce, struct clone_const_arg *arg)
RB_OBJ_WRITTEN(arg->klass, Qundef, ce->value);
RB_OBJ_WRITTEN(arg->klass, Qundef, ce->file);
- rb_id_table_insert(arg->tbl, key, (VALUE)nce);
- return ID_TABLE_CONTINUE;
+ st_insert(arg->tbl, key, (st_data_t)nce);
+ return ST_CONTINUE;
}
-static enum rb_id_table_iterator_result
-clone_const_i(ID key, VALUE value, void *data)
+static int
+clone_const_i(st_data_t key, st_data_t value, st_data_t data)
{
- return clone_const(key, (const rb_const_entry_t *)value, data);
+ return clone_const((ID)key, (const rb_const_entry_t *)value, (struct clone_const_arg *)data);
}
static void
@@ -346,9 +346,10 @@ rb_mod_init_copy(VALUE clone, VALUE orig)
if (RCLASS_CONST_TBL(orig)) {
struct clone_const_arg arg;
- arg.tbl = RCLASS_CONST_TBL(clone) = rb_id_table_create(0);
+ RCLASS_CONST_TBL(clone) = st_init_numtable();
arg.klass = clone;
- rb_id_table_foreach(RCLASS_CONST_TBL(orig), clone_const_i, &arg);
+ arg.tbl = RCLASS_CONST_TBL(clone);
+ st_foreach(RCLASS_CONST_TBL(orig), clone_const_i, (st_data_t)&arg);
}
if (RCLASS_M_TBL(orig)) {
struct clone_method_arg arg;
@@ -392,9 +393,10 @@ rb_singleton_class_clone_and_attach(VALUE obj, VALUE attach)
}
if (RCLASS_CONST_TBL(klass)) {
struct clone_const_arg arg;
- arg.tbl = RCLASS_CONST_TBL(clone) = rb_id_table_create(0);
+ RCLASS_CONST_TBL(clone) = st_init_numtable();
arg.klass = clone;
- rb_id_table_foreach(RCLASS_CONST_TBL(klass), clone_const_i, &arg);
+ arg.tbl = RCLASS_CONST_TBL(clone);
+ st_foreach(RCLASS_CONST_TBL(klass), clone_const_i, (st_data_t)&arg);
}
if (attach != Qundef) {
rb_singleton_class_attached(clone, attach);
@@ -547,11 +549,6 @@ Init_class_hierarchy(void)
{
rb_cBasicObject = boot_defclass("BasicObject", 0);
rb_cObject = boot_defclass("Object", rb_cBasicObject);
- rb_gc_register_mark_object(rb_cObject);
-
- /* resolve class name ASAP for order-independence */
- rb_class_name(rb_cObject);
-
rb_cModule = boot_defclass("Module", rb_cObject);
rb_cClass = boot_defclass("Class", rb_cModule);
@@ -616,7 +613,7 @@ rb_define_class_id(ID id, VALUE super)
* \return the value \c Class#inherited's returns
* \pre Each of \a super and \a klass must be a \c Class object.
*/
-MJIT_FUNC_EXPORTED VALUE
+VALUE
rb_class_inherited(VALUE super, VALUE klass)
{
ID inherited;
@@ -631,12 +628,12 @@ rb_class_inherited(VALUE super, VALUE klass)
* Defines a top-level class.
* \param name name of the class
* \param super a class from which the new class will derive.
+ * NULL means \c Object class.
* \return the created class
* \throw TypeError if the constant name \a name is already taken but
* the constant is not a \c Class.
- * \throw TypeError if the class is already defined but the class can not
+ * \throw NameError if the class is already defined but the class can not
* be reopened because its superclass is not \a super.
- * \throw ArgumentError if the \a super is NULL.
* \post top-level constant named \a name refers the returned class.
*
* \note if a class named \a name is already defined and its superclass is
@@ -661,7 +658,7 @@ rb_define_class(const char *name, VALUE super)
return klass;
}
if (!super) {
- rb_raise(rb_eArgError, "no super class for `%s'", name);
+ rb_warn("no super class for `%s', Object assumed", name);
}
klass = rb_define_class_id(id, super);
rb_vm_add_root_module(id, klass);
@@ -733,8 +730,8 @@ rb_define_class_id_under(VALUE outer, ID id, VALUE super)
return klass;
}
if (!super) {
- rb_raise(rb_eArgError, "no super class for `%"PRIsVALUE"::%"PRIsVALUE"'",
- rb_class_path(outer), rb_id2str(id));
+ rb_warn("no super class for `%"PRIsVALUE"::%"PRIsVALUE"', Object assumed",
+ rb_class_path(outer), rb_id2str(id));
}
klass = rb_define_class_id(id, super);
rb_set_class_path_string(klass, outer, rb_id2str(id));
@@ -826,7 +823,7 @@ rb_include_class_new(VALUE module, VALUE super)
RCLASS_IV_TBL(module) = st_init_numtable();
}
if (!RCLASS_CONST_TBL(module)) {
- RCLASS_CONST_TBL(module) = rb_id_table_create(0);
+ RCLASS_CONST_TBL(module) = st_init_numtable();
}
RCLASS_IV_TBL(klass) = RCLASS_IV_TBL(module);
RCLASS_CONST_TBL(klass) = RCLASS_CONST_TBL(module);
@@ -849,23 +846,18 @@ rb_include_class_new(VALUE module, VALUE super)
static int include_modules_at(const VALUE klass, VALUE c, VALUE module, int search_super);
-static void
-ensure_includable(VALUE klass, VALUE module)
-{
- rb_class_modify_check(klass);
- Check_Type(module, T_MODULE);
- if (!NIL_P(rb_refinement_module_get_refined_class(module))) {
- rb_raise(rb_eArgError, "refinement module is not allowed");
- }
- OBJ_INFECT(klass, module);
-}
-
void
rb_include_module(VALUE klass, VALUE module)
{
int changed = 0;
- ensure_includable(klass, module);
+ rb_frozen_class_p(klass);
+
+ if (!RB_TYPE_P(module, T_MODULE)) {
+ Check_Type(module, T_MODULE);
+ }
+
+ OBJ_INFECT(klass, module);
changed = include_modules_at(klass, RCLASS_ORIGIN(klass), module, TRUE);
if (changed < 0)
@@ -888,7 +880,6 @@ include_modules_at(const VALUE klass, VALUE c, VALUE module, int search_super)
while (module) {
int superclass_seen = FALSE;
- struct rb_id_table *tbl;
if (RCLASS_ORIGIN(module) != module)
goto skip;
@@ -926,12 +917,8 @@ include_modules_at(const VALUE klass, VALUE c, VALUE module, int search_super)
rb_id_table_foreach(RMODULE_M_TBL(module), add_refined_method_entry_i, (void *)refined_class);
FL_SET(c, RMODULE_INCLUDED_INTO_REFINEMENT);
}
-
- tbl = RMODULE_M_TBL(module);
- if (tbl && rb_id_table_size(tbl)) method_changed = 1;
-
- tbl = RMODULE_CONST_TBL(module);
- if (tbl && rb_id_table_size(tbl)) constant_changed = 1;
+ if (RMODULE_M_TBL(module) && rb_id_table_size(RMODULE_M_TBL(module))) method_changed = 1;
+ if (RMODULE_CONST_TBL(module) && RMODULE_CONST_TBL(module)->num_entries) constant_changed = 1;
skip:
module = RCLASS_SUPER(module);
}
@@ -975,7 +962,11 @@ rb_prepend_module(VALUE klass, VALUE module)
VALUE origin;
int changed = 0;
- ensure_includable(klass, module);
+ rb_frozen_class_p(klass);
+
+ Check_Type(module, T_MODULE);
+
+ OBJ_INFECT(klass, module);
origin = RCLASS_ORIGIN(klass);
if (origin == klass) {
@@ -1097,51 +1088,46 @@ rb_mod_ancestors(VALUE mod)
return ary;
}
-static void
-ins_methods_push(st_data_t name, st_data_t ary)
-{
- rb_ary_push((VALUE)ary, ID2SYM((ID)name));
-}
-
static int
-ins_methods_i(st_data_t name, st_data_t type, st_data_t ary)
+ins_methods_push(ID name, rb_method_visibility_t visi, VALUE ary, rb_method_visibility_t expected_visi)
{
- switch ((rb_method_visibility_t)type) {
+ if (visi == METHOD_VISI_UNDEF) return ST_CONTINUE;
+
+ switch (expected_visi) {
case METHOD_VISI_UNDEF:
- case METHOD_VISI_PRIVATE:
+ if (visi != METHOD_VISI_PRIVATE) rb_ary_push(ary, ID2SYM(name));
break;
- default: /* everything but private */
- ins_methods_push(name, ary);
+ case METHOD_VISI_PRIVATE:
+ case METHOD_VISI_PROTECTED:
+ case METHOD_VISI_PUBLIC:
+ if (visi == expected_visi) rb_ary_push(ary, ID2SYM(name));
break;
}
return ST_CONTINUE;
}
static int
+ins_methods_i(st_data_t name, st_data_t type, st_data_t ary)
+{
+ return ins_methods_push((ID)name, (rb_method_visibility_t)type, (VALUE)ary, METHOD_VISI_UNDEF); /* everything but private */
+}
+
+static int
ins_methods_prot_i(st_data_t name, st_data_t type, st_data_t ary)
{
- if ((rb_method_visibility_t)type == METHOD_VISI_PROTECTED) {
- ins_methods_push(name, ary);
- }
- return ST_CONTINUE;
+ return ins_methods_push((ID)name, (rb_method_visibility_t)type, (VALUE)ary, METHOD_VISI_PROTECTED);
}
static int
ins_methods_priv_i(st_data_t name, st_data_t type, st_data_t ary)
{
- if ((rb_method_visibility_t)type == METHOD_VISI_PRIVATE) {
- ins_methods_push(name, ary);
- }
- return ST_CONTINUE;
+ return ins_methods_push((ID)name, (rb_method_visibility_t)type, (VALUE)ary, METHOD_VISI_PRIVATE);
}
static int
ins_methods_pub_i(st_data_t name, st_data_t type, st_data_t ary)
{
- if ((rb_method_visibility_t)type == METHOD_VISI_PUBLIC) {
- ins_methods_push(name, ary);
- }
- return ST_CONTINUE;
+ return ins_methods_push((ID)name, (rb_method_visibility_t)type, (VALUE)ary, METHOD_VISI_PUBLIC);
}
struct method_entry_arg {
@@ -1178,10 +1164,17 @@ static VALUE
class_instance_method_list(int argc, const VALUE *argv, VALUE mod, int obj, int (*func) (st_data_t, st_data_t, st_data_t))
{
VALUE ary;
- int recur = TRUE, prepended = 0;
+ int recur, prepended = 0;
struct method_entry_arg me_arg;
- if (rb_check_arity(argc, 0, 1)) recur = RTEST(argv[0]);
+ if (argc == 0) {
+ recur = TRUE;
+ }
+ else {
+ VALUE r;
+ rb_scan_args(argc, argv, "01", &r);
+ recur = RTEST(r);
+ }
if (!recur && RCLASS_ORIGIN(mod) != mod) {
mod = RCLASS_ORIGIN(mod);
@@ -1410,21 +1403,25 @@ rb_obj_public_methods(int argc, const VALUE *argv, VALUE obj)
VALUE
rb_obj_singleton_methods(int argc, const VALUE *argv, VALUE obj)
{
- VALUE ary, klass, origin;
+ VALUE recur, ary, klass, origin;
struct method_entry_arg me_arg;
struct rb_id_table *mtbl;
- int recur = TRUE;
- if (rb_check_arity(argc, 0, 1)) recur = RTEST(argv[0]);
+ if (argc == 0) {
+ recur = Qtrue;
+ }
+ else {
+ rb_scan_args(argc, argv, "01", &recur);
+ }
klass = CLASS_OF(obj);
origin = RCLASS_ORIGIN(klass);
me_arg.list = st_init_numtable();
- me_arg.recur = recur;
+ me_arg.recur = RTEST(recur);
if (klass && FL_TEST(klass, FL_SINGLETON)) {
if ((mtbl = RCLASS_M_TBL(origin)) != 0) rb_id_table_foreach(mtbl, method_entry_i, &me_arg);
klass = RCLASS_SUPER(klass);
}
- if (recur) {
+ if (RTEST(recur)) {
while (klass && (FL_TEST(klass, FL_SINGLETON) || RB_TYPE_P(klass, T_ICLASS))) {
if (klass != origin && (mtbl = RCLASS_M_TBL(klass)) != 0) rb_id_table_foreach(mtbl, method_entry_i, &me_arg);
klass = RCLASS_SUPER(klass);
@@ -1524,23 +1521,6 @@ rb_undef_method(VALUE klass, const char *name)
rb_add_method(klass, rb_intern(name), VM_METHOD_TYPE_UNDEF, 0, METHOD_VISI_UNDEF);
}
-static enum rb_id_table_iterator_result
-undef_method_i(ID name, VALUE value, void *data)
-{
- VALUE klass = (VALUE)data;
- rb_add_method(klass, name, VM_METHOD_TYPE_UNDEF, 0, METHOD_VISI_UNDEF);
- return ID_TABLE_CONTINUE;
-}
-
-void
-rb_undef_methods_from(VALUE klass, VALUE super)
-{
- struct rb_id_table *mtbl = RCLASS_M_TBL(super);
- if (mtbl) {
- rb_id_table_foreach(mtbl, undef_method_i, (void *)klass);
- }
-}
-
/*!
* \}
*/
@@ -1598,18 +1578,13 @@ singleton_class_of(VALUE obj)
switch (BUILTIN_TYPE(obj)) {
case T_FLOAT: case T_BIGNUM: case T_SYMBOL:
goto no_singleton;
- case T_STRING:
- if (FL_TEST_RAW(obj, RSTRING_FSTR)) goto no_singleton;
- break;
}
}
klass = RBASIC(obj)->klass;
if (!(FL_TEST(klass, FL_SINGLETON) &&
rb_ivar_get(klass, id_attached) == obj)) {
- rb_serial_t serial = RCLASS_SERIAL(klass);
klass = rb_make_metaclass(obj, klass);
- RCLASS_SERIAL(klass) = serial;
}
if (OBJ_TAINTED(obj)) {
@@ -1618,7 +1593,7 @@ singleton_class_of(VALUE obj)
else {
FL_UNSET(klass, FL_TAINT);
}
- RB_FL_SET_RAW(klass, RB_OBJ_FROZEN_RAW(obj));
+ if (OBJ_FROZEN(obj)) OBJ_FREEZE_RAW(klass);
return klass;
}
@@ -1661,7 +1636,7 @@ rb_singleton_class_get(VALUE obj)
* Returns the singleton class of \a obj. Creates it if necessary.
*
* \param obj an arbitrary object.
- * \throw TypeError if \a obj is a Integer or a Symbol.
+ * \throw TypeError if \a obj is a Fixnum or a Symbol.
* \return the singleton class.
*
* \post \a obj has its own singleton class.
@@ -1762,135 +1737,18 @@ rb_define_attr(VALUE klass, const char *name, int read, int write)
rb_attr(klass, rb_intern(name), read, write, FALSE);
}
-MJIT_FUNC_EXPORTED VALUE
-rb_keyword_error_new(const char *error, VALUE keys)
-{
- long i = 0, len = RARRAY_LEN(keys);
- VALUE error_message = rb_sprintf("%s keyword%.*s", error, len > 1, "s");
-
- if (len > 0) {
- rb_str_cat_cstr(error_message, ": ");
- while (1) {
- const VALUE k = RARRAY_AREF(keys, i);
- Check_Type(k, T_SYMBOL); /* wrong hash is given to rb_get_kwargs */
- rb_str_append(error_message, rb_sym2str(k));
- if (++i >= len) break;
- rb_str_cat_cstr(error_message, ", ");
- }
- }
-
- return rb_exc_new_str(rb_eArgError, error_message);
-}
-
-NORETURN(static void rb_keyword_error(const char *error, VALUE keys));
-static void
-rb_keyword_error(const char *error, VALUE keys)
-{
- rb_exc_raise(rb_keyword_error_new(error, keys));
-}
-
-NORETURN(static void unknown_keyword_error(VALUE hash, const ID *table, int keywords));
-static void
-unknown_keyword_error(VALUE hash, const ID *table, int keywords)
-{
- int i;
- for (i = 0; i < keywords; i++) {
- st_data_t key = ID2SYM(table[i]);
- rb_hash_stlike_delete(hash, &key, NULL);
- }
- rb_keyword_error("unknown", rb_hash_keys(hash));
-}
-
-
-static int
-separate_symbol(st_data_t key, st_data_t value, st_data_t arg)
-{
- VALUE *kwdhash = (VALUE *)arg;
- if (!SYMBOL_P(key)) kwdhash++;
- if (!*kwdhash) *kwdhash = rb_hash_new();
- rb_hash_aset(*kwdhash, (VALUE)key, (VALUE)value);
- return ST_CONTINUE;
-}
-
-VALUE
-rb_extract_keywords(VALUE *orighash)
-{
- VALUE parthash[2] = {0, 0};
- VALUE hash = *orighash;
-
- if (RHASH_EMPTY_P(hash)) {
- *orighash = 0;
- return hash;
- }
- rb_hash_foreach(hash, separate_symbol, (st_data_t)&parthash);
- *orighash = parthash[1];
- if (parthash[1] && RBASIC_CLASS(hash) != rb_cHash) {
- RBASIC_SET_CLASS(parthash[1], RBASIC_CLASS(hash));
- }
- return parthash[0];
-}
-
int
-rb_get_kwargs(VALUE keyword_hash, const ID *table, int required, int optional, VALUE *values)
+rb_obj_basic_to_s_p(VALUE obj)
{
- int i = 0, j;
- int rest = 0;
- VALUE missing = Qnil;
- st_data_t key;
-
-#define extract_kwarg(keyword, val) \
- (key = (st_data_t)(keyword), values ? \
- rb_hash_stlike_delete(keyword_hash, &key, (val)) : \
- rb_hash_stlike_lookup(keyword_hash, key, (val)))
-
- if (NIL_P(keyword_hash)) keyword_hash = 0;
-
- if (optional < 0) {
- rest = 1;
- optional = -1-optional;
- }
- if (values) {
- for (j = 0; j < required + optional; j++) {
- values[j] = Qundef;
- }
- }
- if (required) {
- for (; i < required; i++) {
- VALUE keyword = ID2SYM(table[i]);
- if (keyword_hash) {
- st_data_t val;
- if (extract_kwarg(keyword, &val)) {
- if (values) values[i] = (VALUE)val;
- continue;
- }
- }
- if (NIL_P(missing)) missing = rb_ary_tmp_new(1);
- rb_ary_push(missing, keyword);
- }
- if (!NIL_P(missing)) {
- rb_keyword_error("missing", missing);
- }
- }
- j = i;
- if (optional && keyword_hash) {
- for (i = 0; i < optional; i++) {
- st_data_t val;
- if (extract_kwarg(ID2SYM(table[required+i]), &val)) {
- if (values) values[required+i] = (VALUE)val;
- j++;
- }
- }
- }
- if (!rest && keyword_hash) {
- if (RHASH_SIZE(keyword_hash) > (unsigned int)(values ? 0 : j)) {
- unknown_keyword_error(keyword_hash, table, required+optional);
- }
- }
- return j;
-#undef extract_kwarg
+ const rb_method_entry_t *me = rb_method_entry(CLASS_OF(obj), rb_intern("to_s"));
+ if (me && me->def && me->def->type == VM_METHOD_TYPE_CFUNC &&
+ me->def->body.cfunc.func == rb_any_to_s)
+ return 1;
+ return 0;
}
-#undef rb_scan_args
+#include <stdarg.h>
+
int
rb_scan_args(int argc, const VALUE *argv, const char *fmt, ...)
{
@@ -1900,8 +1758,8 @@ rb_scan_args(int argc, const VALUE *argv, const char *fmt, ...)
va_list vargs;
int f_var = 0, f_hash = 0, f_block = 0;
int n_lead = 0, n_opt = 0, n_trail = 0, n_mand;
- int argi = 0, last_idx = -1;
- VALUE hash = Qnil, last_hash = 0;
+ int argi = 0;
+ VALUE hash = Qnil;
if (ISDIGIT(*p)) {
n_lead = *p - '0';
@@ -1909,16 +1767,22 @@ rb_scan_args(int argc, const VALUE *argv, const char *fmt, ...)
if (ISDIGIT(*p)) {
n_opt = *p - '0';
p++;
+ if (ISDIGIT(*p)) {
+ n_trail = *p - '0';
+ p++;
+ goto block_arg;
+ }
}
}
if (*p == '*') {
f_var = 1;
p++;
+ if (ISDIGIT(*p)) {
+ n_trail = *p - '0';
+ p++;
+ }
}
- if (ISDIGIT(*p)) {
- n_trail = *p - '0';
- p++;
- }
+ block_arg:
if (*p == ':') {
f_hash = 1;
p++;
@@ -1952,8 +1816,7 @@ rb_scan_args(int argc, const VALUE *argv, const char *fmt, ...)
hash = rb_check_hash_type(last);
if (!NIL_P(hash)) {
VALUE opts = rb_extract_keywords(&hash);
- if (!(last_hash = hash)) argc--;
- else last_idx = argc - 1;
+ if (!hash) argc--;
hash = opts ? opts : Qnil;
}
}
@@ -1961,14 +1824,14 @@ rb_scan_args(int argc, const VALUE *argv, const char *fmt, ...)
/* capture leading mandatory arguments */
for (i = n_lead; i-- > 0; ) {
var = va_arg(vargs, VALUE *);
- if (var) *var = (argi == last_idx) ? last_hash : argv[argi];
+ if (var) *var = argv[argi];
argi++;
}
/* capture optional arguments */
for (i = n_opt; i-- > 0; ) {
var = va_arg(vargs, VALUE *);
if (argi < argc - n_trail) {
- if (var) *var = (argi == last_idx) ? last_hash : argv[argi];
+ if (var) *var = argv[argi];
argi++;
}
else {
@@ -1981,11 +1844,7 @@ rb_scan_args(int argc, const VALUE *argv, const char *fmt, ...)
var = va_arg(vargs, VALUE *);
if (0 < n_var) {
- if (var) {
- int f_last = (last_idx + 1 == argc - n_trail);
- *var = rb_ary_new4(n_var-f_last, &argv[argi]);
- if (f_last) rb_ary_push(*var, last_hash);
- }
+ if (var) *var = rb_ary_new4(n_var, &argv[argi]);
argi += n_var;
}
else {
@@ -1995,7 +1854,7 @@ rb_scan_args(int argc, const VALUE *argv, const char *fmt, ...)
/* capture trailing mandatory arguments */
for (i = n_trail; i-- > 0; ) {
var = va_arg(vargs, VALUE *);
- if (var) *var = (argi == last_idx) ? last_hash : argv[argi];
+ if (var) *var = argv[argi];
argi++;
}
/* capture an option hash - phase 2: assignment */
@@ -2023,6 +1882,134 @@ rb_scan_args(int argc, const VALUE *argv, const char *fmt, ...)
return argc;
}
+VALUE
+rb_keyword_error_new(const char *error, VALUE keys)
+{
+ const char *msg = "";
+ VALUE error_message;
+
+ if (RARRAY_LEN(keys) == 1) {
+ keys = RARRAY_AREF(keys, 0);
+ }
+ else {
+ keys = rb_ary_join(keys, rb_usascii_str_new2(", "));
+ msg = "s";
+ }
+
+ error_message = rb_sprintf("%s keyword%s: %"PRIsVALUE, error, msg, keys);
+
+ return rb_exc_new_str(rb_eArgError, error_message);
+}
+
+NORETURN(static void rb_keyword_error(const char *error, VALUE keys));
+static void
+rb_keyword_error(const char *error, VALUE keys)
+{
+ rb_exc_raise(rb_keyword_error_new(error, keys));
+}
+
+NORETURN(static void unknown_keyword_error(VALUE hash, const ID *table, int keywords));
+static void
+unknown_keyword_error(VALUE hash, const ID *table, int keywords)
+{
+ st_table *tbl = rb_hash_tbl_raw(hash);
+ VALUE keys;
+ int i;
+ for (i = 0; i < keywords; i++) {
+ st_data_t key = ID2SYM(table[i]);
+ st_delete(tbl, &key, NULL);
+ }
+ keys = rb_funcallv(hash, rb_intern("keys"), 0, 0);
+ if (!RB_TYPE_P(keys, T_ARRAY)) rb_raise(rb_eArgError, "unknown keyword");
+ rb_keyword_error("unknown", keys);
+}
+
+static int
+separate_symbol(st_data_t key, st_data_t value, st_data_t arg)
+{
+ VALUE *kwdhash = (VALUE *)arg;
+
+ if (!SYMBOL_P(key)) kwdhash++;
+ if (!*kwdhash) *kwdhash = rb_hash_new();
+ rb_hash_aset(*kwdhash, (VALUE)key, (VALUE)value);
+ return ST_CONTINUE;
+}
+
+VALUE
+rb_extract_keywords(VALUE *orighash)
+{
+ VALUE parthash[2] = {0, 0};
+ VALUE hash = *orighash;
+
+ if (RHASH_EMPTY_P(hash)) {
+ *orighash = 0;
+ return hash;
+ }
+ st_foreach(rb_hash_tbl_raw(hash), separate_symbol, (st_data_t)&parthash);
+ *orighash = parthash[1];
+ return parthash[0];
+}
+
+int
+rb_get_kwargs(VALUE keyword_hash, const ID *table, int required, int optional, VALUE *values)
+{
+ int i = 0, j;
+ int rest = 0;
+ VALUE missing = Qnil;
+ st_data_t key;
+
+#define extract_kwarg(keyword, val) \
+ (key = (st_data_t)(keyword), values ? \
+ st_delete(rb_hash_tbl_raw(keyword_hash), &key, (val)) : \
+ st_lookup(rb_hash_tbl_raw(keyword_hash), key, (val)))
+
+ if (NIL_P(keyword_hash)) keyword_hash = 0;
+
+ if (optional < 0) {
+ rest = 1;
+ optional = -1-optional;
+ }
+ if (values) {
+ for (j = 0; j < required + optional; j++) {
+ values[j] = Qundef;
+ }
+ }
+ if (required) {
+ for (; i < required; i++) {
+ VALUE keyword = ID2SYM(table[i]);
+ if (keyword_hash) {
+ st_data_t val;
+ if (extract_kwarg(keyword, &val)) {
+ if (values) values[i] = (VALUE)val;
+ continue;
+ }
+ }
+ if (NIL_P(missing)) missing = rb_ary_tmp_new(1);
+ rb_ary_push(missing, keyword);
+ }
+ if (!NIL_P(missing)) {
+ rb_keyword_error("missing", missing);
+ }
+ }
+ j = i;
+ if (optional && keyword_hash) {
+ for (i = 0; i < optional; i++) {
+ st_data_t val;
+ if (extract_kwarg(ID2SYM(table[required+i]), &val)) {
+ if (values) values[required+i] = (VALUE)val;
+ j++;
+ }
+ }
+ }
+ if (!rest && keyword_hash) {
+ if (RHASH_SIZE(keyword_hash) > (unsigned int)j) {
+ unknown_keyword_error(keyword_hash, table, required+optional);
+ }
+ }
+ return j;
+#undef extract_kwarg
+}
+
int
rb_class_has_methods(VALUE c)
{
diff --git a/common.mk b/common.mk
index c5947ff766..232d278b3c 100644
--- a/common.mk
+++ b/common.mk
@@ -2,7 +2,7 @@ bin: $(PROGRAM) $(WPROGRAM)
lib: $(LIBRUBY)
dll: $(LIBRUBY_SO)
-.SUFFIXES: .inc .h .c .y .i .$(ASMEXT) .$(DTRACE_EXT)
+.SUFFIXES: .inc .h .c .y .i .$(DTRACE_EXT)
# V=0 quiet, V=1 verbose. other values don't work.
V = 0
@@ -11,58 +11,37 @@ Q = $(Q1:0=@)
ECHO0 = $(ECHO1:0=echo)
ECHO = @$(ECHO0)
-mflags = $(MFLAGS)
-gnumake_recursive =
-enable_shared = $(ENABLE_SHARED:no=)
+UNICODE_VERSION = 8.0.0
-UNICODE_VERSION = 12.1.0
-UNICODE_EMOJI_VERSION = 12.0
-UNICODE_BETA = YES
-
-### set the following environment variable or uncomment the line if
-### the Unicode data files should be updated completely on every update ('make up',...).
-# ALWAYS_UPDATE_UNICODE = yes
-UNICODE_DATA_DIR = enc/unicode/data/$(UNICODE_VERSION)/ucd
-UNICODE_SRC_DATA_DIR = $(srcdir)/$(UNICODE_DATA_DIR)
-UNICODE_SRC_EMOJI_DATA_DIR = $(srcdir)/enc/unicode/data/emoji/$(UNICODE_EMOJI_VERSION)
-UNICODE_HDR_DIR = $(srcdir)/enc/unicode/$(UNICODE_VERSION)
-UNICODE_DATA_HEADERS = \
- $(UNICODE_HDR_DIR)/casefold.h \
- $(UNICODE_HDR_DIR)/name2ctype.h \
- $(empty)
-
-RUBY_RELEASE_DATE = $(RUBY_RELEASE_YEAR)-$(RUBY_RELEASE_MONTH)-$(RUBY_RELEASE_DAY)
RUBYLIB = $(PATH_SEPARATOR)
RUBYOPT = -
RUN_OPTS = --disable-gems
-INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir) -I$(srcdir) -I$(UNICODE_HDR_DIR)
-
GEM_HOME =
GEM_PATH =
GEM_VENDOR =
-BENCHMARK_DRIVER_GIT_URL = https://github.com/benchmark-driver/benchmark-driver
-BENCHMARK_DRIVER_GIT_REF = v0.14.11
-SIMPLECOV_GIT_URL = https://github.com/colszowka/simplecov.git
-SIMPLECOV_GIT_REF = v0.15.0
-SIMPLECOV_HTML_GIT_URL = https://github.com/colszowka/simplecov-html.git
-SIMPLECOV_HTML_GIT_REF = v0.10.2
-DOCLIE_GIT_URL = https://github.com/ms-ati/docile.git
+SPEC_GIT_BASE = git://github.com/ruby
+MSPEC_GIT_URL = $(SPEC_GIT_BASE)/mspec.git
+RUBYSPEC_GIT_URL = $(SPEC_GIT_BASE)/rubyspec.git
+
+SIMPLECOV_GIT_URL = git://github.com/colszowka/simplecov.git
+SIMPLECOV_GIT_REF = v0.10.0
+SIMPLECOV_HTML_GIT_URL = git://github.com/colszowka/simplecov-html.git
+SIMPLECOV_HTML_GIT_REF = v0.10.0
+DOCLIE_GIT_URL = git://github.com/ms-ati/docile.git
DOCLIE_GIT_REF = v1.1.5
STATIC_RUBY = static-ruby
-TIMESTAMPDIR = $(EXTOUT)/.timestamp
EXTCONF = extconf.rb
LIBRUBY_EXTS = ./.libruby-with-ext.time
REVISION_H = ./.revision.time
-PLATFORM_D = $(TIMESTAMPDIR)/.$(PLATFORM_DIR).time
-ENC_TRANS_D = $(TIMESTAMPDIR)/.enc-trans.time
+PLATFORM_D = ./$(PLATFORM_DIR)/.time
+ENC_TRANS_D = ./enc/trans/.time
RDOCOUT = $(EXTOUT)/rdoc
HTMLOUT = $(EXTOUT)/html
CAPIOUT = doc/capi
-INSTALL_DOC_OPTS = --rdoc-output="$(RDOCOUT)" --html-output="$(HTMLOUT)"
INITOBJS = dmyext.$(OBJEXT) dmyenc.$(OBJEXT)
NORMALMAINOBJ = main.$(OBJEXT)
@@ -71,19 +50,12 @@ DLDOBJS = $(INITOBJS)
EXTSOLIBS =
MINIOBJS = $(ARCHMINIOBJS) miniinit.$(OBJEXT) dmyext.$(OBJEXT) miniprelude.$(OBJEXT)
ENC_MK = enc.mk
-MAKE_ENC = -f $(ENC_MK) V="$(V)" UNICODE_HDR_DIR="$(UNICODE_HDR_DIR)" \
- RUBY="$(MINIRUBY)" MINIRUBY="$(MINIRUBY)" $(mflags)
COMMONOBJS = array.$(OBJEXT) \
- ast.$(OBJEXT) \
bignum.$(OBJEXT) \
class.$(OBJEXT) \
compar.$(OBJEXT) \
- compile.$(OBJEXT) \
complex.$(OBJEXT) \
- cont.$(OBJEXT) \
- debug.$(OBJEXT) \
- debug_counter.$(OBJEXT) \
dir.$(OBJEXT) \
dln_find.$(OBJEXT) \
encoding.$(OBJEXT) \
@@ -91,23 +63,20 @@ COMMONOBJS = array.$(OBJEXT) \
enumerator.$(OBJEXT) \
error.$(OBJEXT) \
eval.$(OBJEXT) \
+ load.$(OBJEXT) \
+ proc.$(OBJEXT) \
file.$(OBJEXT) \
gc.$(OBJEXT) \
hash.$(OBJEXT) \
inits.$(OBJEXT) \
io.$(OBJEXT) \
- iseq.$(OBJEXT) \
- load.$(OBJEXT) \
marshal.$(OBJEXT) \
math.$(OBJEXT) \
- mjit.$(OBJEXT) \
- mjit_compile.$(OBJEXT) \
node.$(OBJEXT) \
numeric.$(OBJEXT) \
object.$(OBJEXT) \
pack.$(OBJEXT) \
parse.$(OBJEXT) \
- proc.$(OBJEXT) \
process.$(OBJEXT) \
random.$(OBJEXT) \
range.$(OBJEXT) \
@@ -128,18 +97,20 @@ COMMONOBJS = array.$(OBJEXT) \
string.$(OBJEXT) \
struct.$(OBJEXT) \
symbol.$(OBJEXT) \
- thread.$(OBJEXT) \
time.$(OBJEXT) \
transcode.$(OBJEXT) \
- transient_heap.$(OBJEXT) \
util.$(OBJEXT) \
variable.$(OBJEXT) \
version.$(OBJEXT) \
+ compile.$(OBJEXT) \
+ debug.$(OBJEXT) \
+ iseq.$(OBJEXT) \
vm.$(OBJEXT) \
- vm_backtrace.$(OBJEXT) \
vm_dump.$(OBJEXT) \
+ vm_backtrace.$(OBJEXT) \
vm_trace.$(OBJEXT) \
- $(COROUTINE_OBJ) \
+ thread.$(OBJEXT) \
+ cont.$(OBJEXT) \
$(DTRACE_OBJ) \
$(BUILTIN_ENCOBJS) \
$(BUILTIN_TRANSOBJS) \
@@ -156,7 +127,7 @@ ALLOBJS = $(NORMALMAINOBJ) $(MINIOBJS) $(COMMONOBJS) $(INITOBJS)
GOLFOBJS = goruby.$(OBJEXT) golf_prelude.$(OBJEXT)
DEFAULT_PRELUDES = $(GEM_PRELUDE)
-PRELUDE_SCRIPTS = $(srcdir)/prelude.rb $(DEFAULT_PRELUDES)
+PRELUDE_SCRIPTS = $(srcdir)/prelude.rb $(srcdir)/enc/prelude.rb $(DEFAULT_PRELUDES)
GEM_PRELUDE = $(srcdir)/gem_prelude.rb
PRELUDES = {$(srcdir)}prelude.c {$(srcdir)}miniprelude.c
GOLFPRELUDES = {$(srcdir)}golf_prelude.c
@@ -178,9 +149,12 @@ INSTRUBY_ARGS = $(SCRIPT_ARGS) \
INSTALL_PROG_MODE = 0755
INSTALL_DATA_MODE = 0644
+PRE_LIBRUBY_UPDATE = $(MINIRUBY) -e 'ARGV[1] or File.unlink(ARGV[0]) rescue nil' -- \
+ $(LIBRUBY_EXTS) $(LIBRUBY_SO_UPDATE)
+
TESTSDIR = $(srcdir)/test
-TEST_EXCLUDES = --excludes-dir=$(TESTSDIR)/excludes --name=!/memory_leak/
-EXCLUDE_TESTFRAMEWORK = --exclude=/testunit/ --exclude=/minitest/
+TEST_EXCLUDES = --excludes=$(TESTSDIR)/excludes -x /memory_leak/
+EXCLUDE_TESTFRAMEWORK = -x /testunit/ -x /minitest/
TESTWORKDIR = testwork
TESTOPTS = $(RUBY_TESTOPTS)
@@ -190,55 +164,15 @@ COMPILE_PRELUDE = $(srcdir)/tool/generic_erb.rb $(srcdir)/template/prelude.c.tmp
SHOWFLAGS = showflags
-MAKE_LINK = $(MINIRUBY) -rfileutils -e "include FileUtils::Verbose" \
- -e "src, dest = ARGV" \
- -e "exit if File.identical?(src, dest) or cmp(src, dest) rescue nil" \
- -e "def noraise; yield; rescue; rescue NotImplementedError; end" \
- -e "noraise {ln_sf('../'*dest.count('/')+src, dest)} or" \
- -e "noraise {ln(src, dest)} or" \
- -e "cp(src, dest)"
-
-
all: $(SHOWFLAGS) main docs
-main: $(SHOWFLAGS) exts $(ENCSTATIC:static=lib)encs
+main: $(SHOWFLAGS) $(ENCSTATIC:static=lib)encs exts
@$(NULLCMD)
-mjit-headers: $(MJIT_SUPPORT)-mjit-headers
-no-mjit-headers: PHONY
-yes-mjit-headers: mjit_config.h PHONY
-
-mjit.$(OBJEXT): mjit_config.h
-mjit_config.h: Makefile
-
-
-# These rules using MJIT_HEADER_SUFFIX must be in common.mk, not
-# Makefile.in, in order to override the macro in defs/universal.mk.
-
-# Other `-Dxxx`s preceding `-DMJIT_HEADER` will be removed in transform_mjit_header.rb.
-# So `-DMJIT_HEADER` should be passed first when rb_mjit_header.h is generated.
-$(TIMESTAMPDIR)/$(MJIT_HEADER:.h=)$(MJIT_HEADER_SUFFIX).time: probes.h vm.$(OBJEXT) \
- $(TIMESTAMPDIR)/$(arch)/.time
- $(ECHO) building $(@F:.time=.h)
- $(Q) $(CPP) -DMJIT_HEADER $(MJIT_HEADER_FLAGS) $(CFLAGS) $(XCFLAGS) $(CPPFLAGS) $(srcdir)/vm.c $(CPPOUTFLAG)$(@F:.time=.h).new
- $(Q) $(IFCHANGE) "--timestamp=$@" $(@F:.time=.h) $(@F:.time=.h).new
-
-$(MJIT_HEADER:.h=)$(MJIT_HEADER_SUFFIX).h: $(TIMESTAMPDIR)/$(MJIT_HEADER:.h=)$(MJIT_HEADER_SUFFIX).time
-
-$(MJIT_MIN_HEADER:.h=)$(MJIT_HEADER_SUFFIX).h: \
- $(TIMESTAMPDIR)/$(MJIT_HEADER:.h=)$(MJIT_HEADER_SUFFIX).time \
- $(srcdir)/tool/transform_mjit_header.rb $(PREP) \
- $(MJIT_HEADER:.h=)$(MJIT_HEADER_SUFFIX).h
- $(ECHO) building $@
- $(MINIRUBY) $(srcdir)/tool/transform_mjit_header.rb "$(CC) $(ARCH_FLAG)" $(MJIT_HEADER:.h=)$(MJIT_HEADER_ARCH).h $@
- $(Q) $(MAKEDIRS) $(MJIT_HEADER_INSTALL_DIR)
- $(Q) $(MAKE_LINK) $@ $(MJIT_HEADER_INSTALL_DIR)/$(@F)
-
.PHONY: showflags
exts enc trans: $(SHOWFLAGS)
showflags:
$(MESSAGE_BEGIN) \
- " BASERUBY = $(BASERUBY)" \
" CC = $(CC)" \
" LD = $(LD)" \
" LDSHARED = $(LDSHARED)" \
@@ -247,9 +181,6 @@ showflags:
" CPPFLAGS = $(CPPFLAGS)" \
" DLDFLAGS = $(DLDFLAGS)" \
" SOLIBS = $(SOLIBS)" \
- " LANG = $(LANG)" \
- " LC_ALL = $(LC_ALL)" \
- " LC_CTYPE = $(LC_CTYPE)" \
$(MESSAGE_END)
-@$(CC_VERSION)
@@ -259,43 +190,20 @@ showconfig:
$(configure_args) \
$(ECHO_END)
-EXTS_NOTE = -f $(EXTS_MK) $(mflags) RUBY="$(MINIRUBY)" top_srcdir="$(srcdir)" note
-
exts: build-ext
EXTS_MK = exts.mk
-$(EXTS_MK): ext/configure-ext.mk $(TIMESTAMPDIR)/$(arch)/.time $(srcdir)/template/exts.mk.tmpl
- $(Q)$(MAKE) -f ext/configure-ext.mk $(mflags) V=$(V) EXTSTATIC=$(EXTSTATIC) \
- gnumake=$(gnumake) MINIRUBY="$(MINIRUBY)" \
- EXTLDFLAGS="$(EXTLDFLAGS)" srcdir="$(srcdir)"
+$(EXTS_MK): $(MKFILES) all-incs $(PREP) $(RBCONFIG) $(LIBRUBY)
$(ECHO) generating makefile $@
- $(Q)$(MINIRUBY) $(srcdir)/tool/generic_erb.rb -o $@ -c \
- $(srcdir)/template/exts.mk.tmpl --gnumake=$(gnumake)
-
-ext/configure-ext.mk: $(PREP) all-incs $(MKFILES) $(RBCONFIG) $(LIBRUBY) \
- $(srcdir)/template/configure-ext.mk.tmpl
- $(ECHO) generating makefiles $@
- $(Q)$(MAKEDIRS) $(@D)
- $(Q)$(MINIRUBY) $(srcdir)/tool/generic_erb.rb -o $@ -c \
- $(srcdir)/template/$(@F).tmpl --srcdir="$(srcdir)" \
- --miniruby="$(MINIRUBY)" --script-args='$(SCRIPT_ARGS)'
+ $(Q)$(MINIRUBY) $(srcdir)/ext/extmk.rb --make="$(MAKE)" --command-output=$(EXTS_MK) $(EXTMK_ARGS) configure
configure-ext: $(EXTS_MK)
build-ext: $(EXTS_MK)
- $(Q)$(MAKE) -f $(EXTS_MK) $(mflags) libdir="$(libdir)" LIBRUBY_EXTS=$(LIBRUBY_EXTS) \
- EXTENCS="$(ENCOBJS)" UPDATE_LIBRARIES=no $(EXTSTATIC)
- $(Q)$(MAKE) $(EXTS_NOTE)
-
-exts-note: $(EXTS_MK)
- $(Q)$(MAKE) $(EXTS_NOTE)
-
-ext/extinit.c: $(srcdir)/template/extinit.c.tmpl
- $(Q)$(MINIRUBY) $(srcdir)/tool/generic_erb.rb -o $@ -c \
- $(srcdir)/template/extinit.c.tmpl $(EXTINITS)
+ $(Q)$(MAKE) -f $(EXTS_MK) $(MFLAGS) libdir="$(libdir)" LIBRUBY_EXTS=$(LIBRUBY_EXTS) \
+ ENCOBJS="$(ENCOBJS)" UPDATE_LIBRARIES=no $(EXTSTATIC)
prog: program wprogram
-programs: $(PROGRAM) $(WPROGRAM)
$(PREP): $(MKFILES)
@@ -304,23 +212,15 @@ miniruby$(EXEEXT): config.status $(ALLOBJS) $(ARCHFILE)
objs: $(ALLOBJS)
GORUBY = go$(RUBY_INSTALL_NAME)
-GOLF = $(GORUBY)
-golf: $(GOLF)
-$(GOLF): $(LIBRUBY) $(GOLFOBJS) PHONY
- $(Q) $(MAKE) $(mflags) \
- GOLF=_dummy_golf_target_to_avoid_conflict_just_in_case_ \
- MAINOBJ=goruby.$(OBJEXT) \
- EXTOBJS="golf_prelude.$(OBJEXT) $(EXTOBJS)" \
- PROGRAM=$(GORUBY)$(EXEEXT) \
- V=$(V) \
- program
+golf: $(LIBRUBY) $(GOLFOBJS) PHONY
+ $(Q) $(MAKE) $(MFLAGS) MAINOBJ="$(GOLFOBJS)" PROGRAM=$(GORUBY)$(EXEEXT) program
capi: $(CAPIOUT)/.timestamp PHONY
$(CAPIOUT)/.timestamp: Doxyfile $(PREP)
$(Q) $(MAKEDIRS) "$(@D)"
$(ECHO) generating capi
-$(Q) $(DOXYGEN) -b
- $(Q) $(MINIRUBY) -e 'File.open(ARGV[0], "w"){'"|f|"' f.puts(Time.now)}' "$@"
+ $(Q) $(MINIRUBY) -e 'File.open(ARGV[0], "w"){|f| f.puts(Time.now)}' "$@"
Doxyfile: $(srcdir)/template/Doxyfile.tmpl $(PREP) $(srcdir)/tool/generic_erb.rb $(RBCONFIG)
$(ECHO) generating $@
@@ -335,22 +235,18 @@ $(PROGRAM) $(WPROGRAM): $(LIBRUBY) $(MAINOBJ) $(OBJS) $(EXTOBJS) $(SETUP) $(PREP
$(LIBRUBY_A): $(LIBRUBY_A_OBJS) $(MAINOBJ) $(INITOBJS) $(ARCHFILE)
-$(LIBRUBY_SO): $(OBJS) $(DLDOBJS) $(LIBRUBY_A) $(PREP) $(BUILTIN_ENCOBJS)
+$(LIBRUBY_SO): $(OBJS) $(DLDOBJS) $(LIBRUBY_A) $(PREP) $(LIBRUBY_SO_UPDATE) $(BUILTIN_ENCOBJS)
$(LIBRUBY_EXTS):
@exit > $@
$(STATIC_RUBY)$(EXEEXT): $(MAINOBJ) $(DLDOBJS) $(EXTOBJS) $(LIBRUBY_A)
$(Q)$(RM) $@
- $(PURIFY) $(CC) $(MAINOBJ) $(DLDOBJS) $(LIBRUBY_A) $(MAINLIBS) $(EXTLIBS) $(LIBS) $(OUTFLAG)$@ $(LDFLAGS) $(XLDFLAGS)
+ $(PURIFY) $(CC) $(MAINOBJ) $(DLDOBJS) $(EXTOBJS) $(LIBRUBY_A) $(MAINLIBS) $(EXTLIBS) $(LIBS) $(OUTFLAG)$@ $(LDFLAGS) $(XLDFLAGS)
ruby.imp: $(COMMONOBJS)
- $(Q){ \
- $(NM) -Pgp $(COMMONOBJS) | \
- awk 'BEGIN{print "#!"}; $$2~/^[BDT]$$/&&$$1!~/^$(SYMBOL_PREFIX)(Init_|InitVM_|ruby_static_id_|.*_threadptr_|rb_ec_)|^\./{print $$1}'; \
- ($(CHDIR) $(srcdir) && \
- exec sed -n '/^MJIT_FUNC_EXPORTED/!d;N;s/.*\n\(rb_[a-zA-Z_0-9]*\).*/$(SYMBOL_PREFIX)\1/p' cont.c gc.c thread*c vm*.c) \
- } | \
+ $(Q)$(NM) -Pgp $(COMMONOBJS) | \
+ awk 'BEGIN{print "#!"}; $$2~/^[BDT]$$/&&$$1!~/^(Init_|ruby_static_id_|.*_threadptr_|\.)/{print $$1}' | \
sort -u -o $@
install: install-$(INSTALLDOC)
@@ -361,7 +257,7 @@ $(ruby_pc): $(srcdir)/template/ruby.pc.in config.status
install-all: docs pre-install-all do-install-all post-install-all
pre-install-all:: all pre-install-local pre-install-ext pre-install-doc
do-install-all: pre-install-all
- $(INSTRUBY) --make="$(MAKE)" $(INSTRUBY_ARGS) --install=all $(INSTALL_DOC_OPTS)
+ $(INSTRUBY) --make="$(MAKE)" $(INSTRUBY_ARGS) --install=all --rdoc-output="$(RDOCOUT)"
post-install-all:: post-install-local post-install-ext post-install-doc
@$(NULLCMD)
@@ -443,7 +339,7 @@ what-where-all: no-install-all
no-install-all: pre-no-install-all dont-install-all post-no-install-all
pre-no-install-all:: pre-no-install-local pre-no-install-ext pre-no-install-doc
dont-install-all: $(PROGRAM)
- $(INSTRUBY) -n --make="$(MAKE)" $(INSTRUBY_ARGS) --install=all $(INSTALL_DOC_OPTS)
+ $(INSTRUBY) -n --make="$(MAKE)" $(INSTRUBY_ARGS) --install=all --rdoc-output="$(RDOCOUT)"
post-no-install-all:: post-no-install-local post-no-install-ext post-no-install-doc
@$(NULLCMD)
@@ -530,7 +426,7 @@ post-no-install-man::
install-doc: rdoc pre-install-doc do-install-doc post-install-doc
pre-install-doc:: install-prereq
do-install-doc: $(PROGRAM) pre-install-doc
- $(INSTRUBY) --make="$(MAKE)" $(INSTRUBY_ARGS) --install=rdoc $(INSTALL_DOC_OPTS)
+ $(INSTRUBY) --make="$(MAKE)" $(INSTRUBY_ARGS) --install=rdoc --rdoc-output="$(RDOCOUT)"
post-install-doc::
@$(NULLCMD)
@@ -543,15 +439,15 @@ post-install-gem::
rdoc: PHONY main
@echo Generating RDoc documentation
- $(Q) $(XRUBY) "$(srcdir)/libexec/rdoc" --root "$(srcdir)" --page-dir "$(srcdir)/doc" --encoding=UTF-8 --no-force-update --all --ri --op "$(RDOCOUT)" $(RDOCFLAGS) "$(srcdir)"
+ $(Q) $(XRUBY) "$(srcdir)/bin/rdoc" --root "$(srcdir)" --page-dir "$(srcdir)/doc" --encoding=UTF-8 --no-force-update --all --ri --op "$(RDOCOUT)" --debug $(RDOCFLAGS) "$(srcdir)"
html: PHONY main
@echo Generating RDoc HTML files
- $(Q) $(XRUBY) "$(srcdir)/libexec/rdoc" --root "$(srcdir)" --page-dir "$(srcdir)/doc" --encoding=UTF-8 --no-force-update --all --op "$(HTMLOUT)" $(RDOCFLAGS) "$(srcdir)"
+ $(Q) $(XRUBY) "$(srcdir)/bin/rdoc" --root "$(srcdir)" --page-dir "$(srcdir)/doc" --encoding=UTF-8 --no-force-update --all --op "$(HTMLOUT)" --debug $(RDOCFLAGS) "$(srcdir)"
rdoc-coverage: PHONY main
@echo Generating RDoc coverage report
- $(Q) $(XRUBY) "$(srcdir)/libexec/rdoc" --root "$(srcdir)" --encoding=UTF-8 --all --quiet -C $(RDOCFLAGS) "$(srcdir)"
+ $(Q) $(XRUBY) "$(srcdir)/bin/rdoc" --root "$(srcdir)" --encoding=UTF-8 --all --quiet -C $(RDOCFLAGS) "$(srcdir)"
RDOCBENCHOUT=/tmp/rdocbench
@@ -569,7 +465,7 @@ what-where-doc: no-install-doc
no-install-doc: pre-no-install-doc dont-install-doc post-no-install-doc
pre-no-install-doc:: install-prereq
dont-install-doc:: $(PREP)
- $(INSTRUBY) -n --make="$(MAKE)" $(INSTRUBY_ARGS) --install=rdoc $(INSTALL_DOC_OPTS)
+ $(INSTRUBY) -n --make="$(MAKE)" $(INSTRUBY_ARGS) --install=rdoc --rdoc-output="$(RDOCOUT)"
post-no-install-doc::
@$(NULLCMD)
@@ -580,12 +476,11 @@ install-prereq: $(CLEAR_INSTALLED_LIST) yes-fake sudo-precheck PHONY
clear-installed-list: PHONY
@> $(INSTALLED_LIST) set MAKE="$(MAKE)"
-clean: clean-ext clean-enc clean-golf clean-docs clean-extout clean-local clean-platform clean-spec
+clean: clean-ext clean-enc clean-golf clean-rdoc clean-capi clean-extout clean-local clean-platform
clean-local:: clean-runnable
$(Q)$(RM) $(OBJS) $(MINIOBJS) $(MAINOBJ) $(LIBRUBY_A) $(LIBRUBY_SO) $(LIBRUBY) $(LIBRUBY_ALIASES)
$(Q)$(RM) $(PROGRAM) $(WPROGRAM) miniruby$(EXEEXT) dmyext.$(OBJEXT) dmyenc.$(OBJEXT) $(ARCHFILE) .*.time
- $(Q)$(RM) y.tab.c y.output encdb.h transdb.h config.log rbconfig.rb $(ruby_pc)
- $(Q)$(RM) probes.h probes.$(OBJEXT) probes.stamp ruby-glommed.$(OBJEXT) ruby.imp
+ $(Q)$(RM) y.tab.c y.output encdb.h transdb.h config.log rbconfig.rb $(ruby_pc) probes.h probes.$(OBJEXT) probes.stamp ruby-glommed.$(OBJEXT)
$(Q)$(RM) GNUmakefile.old Makefile.old $(arch)-fake.rb bisect.sh $(ENC_TRANS_D)
-$(Q) $(RMDIR) enc/jis enc/trans enc 2> $(NULL) || exit 0
clean-runnable:: PHONY
@@ -602,10 +497,8 @@ clean-platform: PHONY
clean-extout: PHONY
-$(Q)$(RMDIR) $(EXTOUT)/$(arch) $(EXTOUT) 2> $(NULL) || exit 0
clean-docs: clean-rdoc clean-html clean-capi
-clean-spec: PHONY
-clean-rubyspec: clean-spec
-distclean: distclean-ext distclean-enc distclean-golf distclean-docs distclean-extout distclean-local distclean-platform distclean-spec
+distclean: distclean-ext distclean-enc distclean-golf distclean-extout distclean-local distclean-platform
distclean-local:: clean-local
$(Q)$(RM) $(MKFILES) yasmdata.rb *.inc $(PRELUDES)
$(Q)$(RM) config.cache config.status config.status.lineno
@@ -613,71 +506,29 @@ distclean-local:: clean-local
-$(Q)$(RMALL) $(srcdir)/autom4te.cache
distclean-ext:: PHONY
distclean-golf: clean-golf
-distclean-rdoc: clean-rdoc
-distclean-html: clean-html
-distclean-capi: clean-capi
-distclean-docs: clean-docs
+distclean-rdoc: PHONY
+distclean-html: PHONY
+distclean-capi: PHONY
distclean-extout: clean-extout
distclean-platform: clean-platform
-distclean-spec: clean-spec
-distclean-rubyspec: distclean-spec
realclean:: realclean-ext realclean-local realclean-enc realclean-golf realclean-extout
-realclean-local:: distclean-local realclean-srcs-local
-
-clean-srcs:: clean-srcs-local clean-srcs-ext
-realclean-srcs:: realclean-srcs-local realclean-srcs-ext
-
-clean-srcs-local::
+realclean-local:: distclean-local
$(Q)$(RM) parse.c parse.h lex.c enc/trans/newline.c revision.h
- $(Q)$(RM) id.c id.h probes.dmyh probes.h
- $(Q)$(RM) encdb.h transdb.h verconf.h ruby-runner.h
- $(Q)$(RM) mjit_config.h rb_mjit_header.h
- $(Q)$(RM) $(MJIT_MIN_HEADER) $(MJIT_MIN_HEADER:.h=)$(MJIT_HEADER_SUFFIX:%=*).h
-
-realclean-srcs-local:: clean-srcs-local
+ $(Q)$(RM) id.c id.h probes.dmyh
$(Q)$(CHDIR) $(srcdir) && $(exec) $(RM) parse.c parse.h lex.c enc/trans/newline.c $(PRELUDES) revision.h
$(Q)$(CHDIR) $(srcdir) && $(exec) $(RM) id.c id.h probes.dmyh
- $(Q)$(CHDIR) $(srcdir) && $(exec) $(RM) configure aclocal.m4 tool/config.guess tool/config.sub gems/*.gem
-
-clean-srcs-ext::
-realclean-srcs-ext:: clean-srcs-ext
-
+ $(Q)$(CHDIR) $(srcdir) && $(exec) $(RM) configure tool/config.guess tool/config.sub gems/*.gem
realclean-ext:: PHONY
realclean-golf: distclean-golf
$(Q)$(RM) $(GOLFPRELUDES)
-realclean-rdoc: distclean-rdoc
-realclean-html: distclean-html
-realclean-capi: distclean-capi
-realclean-docs: distclean-docs
+realclean-capi: PHONY
realclean-extout: distclean-extout
-realclean-platform: distclean-platform
-realclean-spec: distclean-spec
-realclean-rubyspec: realclean-spec
-clean-ext:: ext/clean gems/clean timestamp/clean
-distclean-ext:: ext/distclean gems/distclean timestamp/distclean
-realclean-ext:: ext/realclean gems/realclean timestamp/realclean
-
-ext/clean.mk ext/distclean.mk ext/realclean.mk::
-ext/clean gems/clean:: ext/clean.mk
-ext/distclean gems/distclean:: ext/distclean.mk
-ext/realclean gems/realclean:: ext/realclean.mk
-
-timestamp/clean:: ext/clean gems/clean
-timestamp/distclean:: ext/distclean gems/distclean
-timestamp/realclean:: ext/realclean gems/realclean
-
-timestamp/clean timestamp/distclean timestamp/realclean::
- $(Q)$(RM) $(TIMESTAMPDIR)/.*.time $(TIMESTAMPDIR)/$(arch)/.time
- $(Q)$(RMDIRS) $(TIMESTAMPDIR)/$(arch) 2> $(NULL) || exit 0
-
-clean-ext::
- -$(Q)$(RM) ext/extinit.$(OBJEXT)
-
-distclean-ext realclean-ext::
- -$(Q)$(RM) $(EXTS_MK) ext/extinit.* ext/configure-ext.mk
- -$(Q)$(RMDIR) ext 2> $(NULL) || exit 0
+clean-ext distclean-ext realclean-ext::
+ $(Q)$(RM) $(EXTS_MK)
+ $(Q)$(RM) $(EXTOUT)/.timestamp/.*.time
+ $(Q)$(RMDIR) $(EXTOUT)/.timestamp 2> $(NULL) || exit 0
clean-enc distclean-enc realclean-enc: PHONY
@@ -703,12 +554,7 @@ clean-platform:
$(Q) $(RM) $(PLATFORM_D)
-$(Q) $(RMDIR) $(PLATFORM_DIR) 2> $(NULL) || exit 0
-RUBYSPEC_CAPIEXT = spec/ruby/optional/capi/ext
-clean-spec: PHONY
- -$(Q) $(RM) $(RUBYSPEC_CAPIEXT)/*.$(OBJEXT) $(RUBYSPEC_CAPIEXT)/*.$(DLEXT)
- -$(Q) $(RMDIRS) $(RUBYSPEC_CAPIEXT) 2> $(NULL) || exit 0
-
-check: main test test-testframework test-almost test-spec
+check: main test test-testframework test-almost
$(ECHO) check succeeded
check-ruby: test test-ruby
@@ -727,17 +573,17 @@ $(arch)-fake.rb: $(srcdir)/template/fake.rb.in $(srcdir)/tool/generic_erb.rb ver
btest: $(TEST_RUNNABLE)-btest
no-btest: PHONY
yes-btest: fake miniruby$(EXEEXT) PHONY
- $(Q)$(exec) $(BOOTSTRAPRUBY) "$(srcdir)/bootstraptest/runner.rb" --ruby="$(BTESTRUBY) $(RUN_OPTS)" $(OPTS) $(TESTOPTS) $(BTESTS)
+ $(Q)$(exec) $(BOOTSTRAPRUBY) "$(srcdir)/bootstraptest/runner.rb" --ruby="$(BTESTRUBY) $(RUN_OPTS)" $(OPTS) $(TESTOPTS)
btest-ruby: $(TEST_RUNNABLE)-btest-ruby
no-btest-ruby: PHONY
yes-btest-ruby: prog PHONY
- $(Q)$(exec) $(RUNRUBY) "$(srcdir)/bootstraptest/runner.rb" --ruby="$(PROGRAM) -I$(srcdir)/lib $(RUN_OPTS)" -q $(OPTS) $(TESTOPTS) $(BTESTS)
+ $(Q)$(exec) $(RUNRUBY) "$(srcdir)/bootstraptest/runner.rb" --ruby="$(PROGRAM) -I$(srcdir)/lib $(RUN_OPTS)" -q $(OPTS) $(TESTOPTS)
-test-basic: $(TEST_RUNNABLE)-test-basic
-no-test-basic: PHONY
-yes-test-basic: prog PHONY
- $(Q)$(exec) $(RUNRUBY) "$(srcdir)/basictest/runner.rb" --run-opt=$(RUN_OPTS) $(OPTS) $(TESTOPTS)
+test-sample: $(TEST_RUNNABLE)-test-sample
+no-test-sample: PHONY
+yes-test-sample: prog PHONY
+ $(Q)$(exec) $(RUNRUBY) "$(srcdir)/tool/rubytest.rb" --run-opt=$(RUN_OPTS) $(OPTS) $(TESTOPTS)
test-knownbugs: test-knownbug
test-knownbug: $(TEST_RUNNABLE)-test-knownbug
@@ -747,61 +593,44 @@ yes-test-knownbug: prog PHONY
test-testframework: $(TEST_RUNNABLE)-test-testframework
yes-test-testframework: prog PHONY
- $(gnumake_recursive)$(Q)$(exec) $(RUNRUBY) "$(srcdir)/test/runner.rb" --ruby="$(RUNRUBY)" $(TESTOPTS) testunit minitest
+ $(Q)$(exec) $(RUNRUBY) "$(srcdir)/test/runner.rb" --ruby="$(RUNRUBY)" $(TESTOPTS) testunit minitest
no-test-testframework: PHONY
-test-sample: test-basic # backward compatibility for mswin-build
-test-short: btest-ruby test-knownbug test-basic
-test: test-short
+test: test-sample btest-ruby test-knownbug
# $ make test-all TESTOPTS="--help" displays more detail
# for example, make test-all TESTOPTS="-j2 -v -n test-name -- test-file-name"
test-all: $(TEST_RUNNABLE)-test-all
-yes-test-all: programs PHONY
- $(gnumake_recursive)$(Q)$(exec) $(RUNRUBY) "$(srcdir)/test/runner.rb" --ruby="$(RUNRUBY)" $(TEST_EXCLUDES) $(TESTOPTS) $(TESTS)
+yes-test-all: prog PHONY
+ $(Q)$(exec) $(RUNRUBY) "$(srcdir)/test/runner.rb" --ruby="$(RUNRUBY)" $(TEST_EXCLUDES) $(TESTOPTS) $(TESTS)
TESTS_BUILD = mkmf
no-test-all: PHONY
- $(gnumake_recursive)$(MINIRUBY) -I"$(srcdir)/lib" "$(srcdir)/test/runner.rb" $(TESTOPTS) $(TESTS_BUILD)
+ $(MINIRUBY) -I"$(srcdir)/lib" "$(srcdir)/test/runner.rb" $(TESTOPTS) $(TESTS_BUILD)
test-almost: $(TEST_RUNNABLE)-test-almost
yes-test-almost: prog PHONY
- $(gnumake_recursive)$(Q)$(exec) $(RUNRUBY) "$(srcdir)/test/runner.rb" --ruby="$(RUNRUBY)" $(TEST_EXCLUDES) $(TESTOPTS) $(EXCLUDE_TESTFRAMEWORK) $(TESTS)
+ $(Q)$(exec) $(RUNRUBY) "$(srcdir)/test/runner.rb" --ruby="$(RUNRUBY)" $(TEST_EXCLUDES) $(TESTOPTS) $(EXCLUDE_TESTFRAMEWORK) $(TESTS)
no-test-almost: PHONY
test-ruby: $(TEST_RUNNABLE)-test-ruby
no-test-ruby: PHONY
yes-test-ruby: prog encs PHONY
- $(gnumake_recursive)$(RUNRUBY) "$(srcdir)/test/runner.rb" $(TEST_EXCLUDES) $(TESTOPTS) -- ruby -ext-
+ $(RUNRUBY) "$(srcdir)/test/runner.rb" $(TEST_EXCLUDES) $(TESTOPTS) -- ruby -ext-
extconf: $(PREP)
$(Q) $(MAKEDIRS) "$(EXTCONFDIR)"
$(RUNRUBY) -C "$(EXTCONFDIR)" $(EXTCONF) $(EXTCONFARGS)
$(RBCONFIG): $(srcdir)/tool/mkconfig.rb config.status $(srcdir)/version.h
- $(Q)$(BOOTSTRAPRUBY) -n \
- -e 'BEGIN{version=ARGV.shift;mis=ARGV.dup}' \
- -e 'END{abort "UNICODE version mismatch: #{mis}" unless mis.empty?}' \
- -e '(mis.delete(ARGF.path); ARGF.close) if /ONIG_UNICODE_VERSION_STRING +"#{Regexp.quote(version)}"/o' \
- $(UNICODE_VERSION) $(UNICODE_DATA_HEADERS)
- $(Q)$(BOOTSTRAPRUBY) $(srcdir)/tool/mkconfig.rb \
+ $(Q)$(BOOTSTRAPRUBY) $(srcdir)/tool/mkconfig.rb -timestamp=$@ \
-arch=$(arch) -version=$(RUBY_PROGRAM_VERSION) \
-install_name=$(RUBY_INSTALL_NAME) \
- -so_name=$(RUBY_SO_NAME) \
- -unicode_version=$(UNICODE_VERSION) \
- -unicode_emoji_version=$(UNICODE_EMOJI_VERSION) \
- > rbconfig.tmp
- $(IFCHANGE) "--timestamp=$@" rbconfig.rb rbconfig.tmp
-
-test-rubyspec: test-spec
-yes-test-rubyspec: yes-test-spec
+ -so_name=$(RUBY_SO_NAME) rbconfig.rb
-test-spec-precheck: $(arch)-fake.rb programs
+test-rubyspec-precheck:
-test-spec: $(TEST_RUNNABLE)-test-spec
-yes-test-spec: test-spec-precheck
- $(gnumake_recursive)$(Q) \
- $(RUNRUBY) -r./$(arch)-fake $(srcdir)/spec/mspec/bin/mspec run -B $(srcdir)/spec/default.mspec $(MSPECOPT) $(SPECOPTS)
-no-test-spec:
+test-rubyspec: test-rubyspec-precheck $(arch)-fake.rb
+ $(RUNRUBY) -r./$(arch)-fake $(srcdir)/spec/mspec/bin/mspec run -B $(srcdir)/spec/default.mspec $(MSPECOPT)
RUNNABLE = $(LIBRUBY_RELATIVE:no=un)-runnable
runnable: $(RUNNABLE) prog $(srcdir)/tool/mkrunnable.rb PHONY
@@ -812,13 +641,14 @@ encs: enc trans
libencs: libenc libtrans
encs enc trans libencs libenc libtrans: $(SHOWFLAGS) $(ENC_MK) $(LIBRUBY) $(PREP) PHONY
$(ECHO) making $@
- $(Q) $(MAKE) $(MAKE_ENC) $@
+ $(Q) $(MAKE) -f $(ENC_MK) V="$(V)" \
+ RUBY="$(MINIRUBY)" MINIRUBY="$(MINIRUBY)" \
+ $(MFLAGS) $@
libenc enc: {$(VPATH)}encdb.h
libtrans trans: {$(VPATH)}transdb.h
-# Use MINIRUBY which loads fake.rb for cross compiling
$(ENC_MK): $(srcdir)/enc/make_encmake.rb $(srcdir)/enc/Makefile.in $(srcdir)/enc/depend \
$(srcdir)/enc/encinit.c.erb $(srcdir)/lib/mkmf.rb $(RBCONFIG) fake
$(ECHO) generating $@
@@ -832,10 +662,9 @@ $(ENC_MK): $(srcdir)/enc/make_encmake.rb $(srcdir)/enc/Makefile.in $(srcdir)/enc
.PHONY: clean clean-ext clean-local clean-enc clean-golf clean-rdoc clean-html clean-extout
.PHONY: distclean distclean-ext distclean-local distclean-enc distclean-golf distclean-extout
.PHONY: realclean realclean-ext realclean-local realclean-enc realclean-golf realclean-extout
-.PHONY: exam check test test-short test-all btest btest-ruby test-basic test-knownbug
-.PHONY: run runruby parse benchmark gdb gdb-ruby
-.PHONY: update-mspec update-rubyspec test-rubyspec test-spec
-.PHONY: touch-unicode-files
+.PHONY: check test test-all btest btest-ruby test-sample test-knownbug
+.PHONY: run runruby parse benchmark benchmark-each tbench gdb gdb-ruby
+.PHONY: update-mspec update-rubyspec test-rubyspec
PHONY:
@@ -847,39 +676,19 @@ PHONY:
$(Q)$(BASERUBY) $(srcdir)/tool/id2token.rb --path-separator=.$(PATH_SEPARATOR)./ --vpath=$(VPATH) id.h $(SRC_FILE) > parse.tmp.y
$(Q)$(YACC) -d $(YFLAGS) -o y.tab.c parse.tmp.y
$(Q)$(RM) parse.tmp.y
- $(Q)sed -f $(srcdir)/tool/ytab.sed -e "/^#/s|parse\.tmp\.[iy]|$(SRC_FILE)|" -e "/^#/s!y\.tab\.c!$@!" y.tab.c > $@.new
+ $(Q)sed -f $(srcdir)/tool/ytab.sed -e "/^#/s!parse\.tmp\.[iy]!parse.y!" -e "/^#/s!y\.tab\.c!$@!" y.tab.c > $@.new
$(Q)$(MV) $@.new $@
$(Q)sed -e "/^#line.*y\.tab\.h/d;/^#line.*parse.*\.y/d" y.tab.h > $(@:.c=.h)
$(Q)$(RM) y.tab.c y.tab.h
$(PLATFORM_D):
- $(Q) $(MAKEDIRS) $(PLATFORM_DIR) $(@D)
- @exit > $@
-
-exe/$(PROGRAM): ruby-runner.c ruby-runner.h exe/.time miniruby$(EXEEXT) {$(VPATH)}config.h
- $(Q) $(CC) $(CFLAGS) $(CPPFLAGS) -DRUBY_INSTALL_NAME=$(@F) $(COUTFLAG)ruby-runner.$(OBJEXT) -c $(CSRCFLAG)$(srcdir)/ruby-runner.c
- $(Q) $(PURIFY) $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(OUTFLAG)$@ ruby-runner.$(OBJEXT) $(LIBS)
- $(Q) $(POSTLINK)
- $(Q) ./miniruby$(EXEEXT) \
- -e 'prog, dest = ARGV; dest += "/ruby"' \
- -e 'unless prog=="ruby"' \
- -e ' begin File.unlink(dest); rescue Errno::ENOENT; end' \
- -e ' File.symlink(prog, dest)' \
- -e 'end' \
- $(@F) $(@D)
-
-exe/.time:
- $(Q) $(MAKEDIRS) $(@D)
+ $(Q) $(MAKEDIRS) $(PLATFORM_DIR)
@exit > $@
$(BUILTIN_ENCOBJS) $(BUILTIN_TRANSOBJS): $(ENC_TRANS_D)
$(ENC_TRANS_D):
- $(Q) $(MAKEDIRS) enc/trans $(@D)
- @exit > $@
-
-$(TIMESTAMPDIR)/$(arch)/.time:
- $(Q)$(MAKEDIRS) $(@D) $(EXTOUT)/$(arch)
+ $(Q) $(MAKEDIRS) enc/trans
@exit > $@
###
@@ -893,7 +702,7 @@ RUBY_H_INCLUDES = {$(VPATH)}ruby.h {$(VPATH)}config.h {$(VPATH)}defines.h \
acosh.$(OBJEXT): {$(VPATH)}acosh.c
alloca.$(OBJEXT): {$(VPATH)}alloca.c {$(VPATH)}config.h
-crypt.$(OBJEXT): {$(VPATH)}crypt.c {$(VPATH)}crypt.h {$(VPATH)}missing/des_tables.c
+crypt.$(OBJEXT): {$(VPATH)}crypt.c
dup2.$(OBJEXT): {$(VPATH)}dup2.c
erf.$(OBJEXT): {$(VPATH)}erf.c
explicit_bzero.$(OBJEXT): {$(VPATH)}explicit_bzero.c
@@ -909,15 +718,11 @@ strerror.$(OBJEXT): {$(VPATH)}strerror.c
strlcat.$(OBJEXT): {$(VPATH)}strlcat.c
strlcpy.$(OBJEXT): {$(VPATH)}strlcpy.c
strstr.$(OBJEXT): {$(VPATH)}strstr.c
+strtod.$(OBJEXT): {$(VPATH)}strtod.c
+strtol.$(OBJEXT): {$(VPATH)}strtol.c
nt.$(OBJEXT): {$(VPATH)}nt.c
ia64.$(OBJEXT): {$(VPATH)}ia64.s
$(CC) $(CFLAGS) -c $<
-.coroutine_obj $(COROUTINE_OBJ): \
- {$(VPATH)}$(COROUTINE_H:.h=).$(ASMEXT) \
- $(COROUTINE_H:/Context.h=/.time)
-$(COROUTINE_H:/Context.h=/.time):
- $(Q) $(MAKEDIRS) $(@D)
- @exit > $@
###
@@ -931,8 +736,7 @@ compile.$(OBJEXT): {$(VPATH)}opt_sc.inc {$(VPATH)}optunifs.inc
win32/win32.$(OBJEXT): {$(VPATH)}win32/win32.c {$(VPATH)}win32/file.h \
{$(VPATH)}dln.h {$(VPATH)}dln_find.c {$(VPATH)}encindex.h \
- {$(VPATH)}internal.h {$(VPATH)}util.h $(RUBY_H_INCLUDES) \
- {$(VPATH)}vm.h $(PLATFORM_D)
+ {$(VPATH)}internal.h {$(VPATH)}util.h $(RUBY_H_INCLUDES) $(PLATFORM_D)
win32/file.$(OBJEXT): {$(VPATH)}win32/file.c {$(VPATH)}win32/file.h \
$(RUBY_H_INCLUDES) $(PLATFORM_D)
@@ -951,51 +755,33 @@ $(OBJS): {$(VPATH)}config.h {$(VPATH)}missing.h
INSNS2VMOPT = --srcdir="$(srcdir)"
-srcs_vpath = {$(VPATH)}
-
-# TODO: dependencies on tool/ruby_vm scripts.
-inc_common_headers = $(srcdir)/tool/ruby_vm/views/_copyright.erb $(srcdir)/tool/ruby_vm/views/_notice.erb
-$(srcs_vpath)opt_sc.inc: $(srcdir)/tool/ruby_vm/views/opt_sc.inc.erb $(inc_common_headers)
-$(srcs_vpath)optinsn.inc: $(srcdir)/tool/ruby_vm/views/optinsn.inc.erb $(inc_common_headers)
-$(srcs_vpath)optunifs.inc: $(srcdir)/tool/ruby_vm/views/optunifs.inc.erb $(inc_common_headers)
-$(srcs_vpath)insns.inc: $(srcdir)/tool/ruby_vm/views/insns.inc.erb $(inc_common_headers)
-$(srcs_vpath)insns_info.inc: $(srcdir)/tool/ruby_vm/views/insns_info.inc.erb $(inc_common_headers) \
- $(srcdir)/tool/ruby_vm/views/_insn_type_chars.erb $(srcdir)/tool/ruby_vm/views/_insn_name_info.erb \
- $(srcdir)/tool/ruby_vm/views/_insn_len_info.erb $(srcdir)/tool/ruby_vm/views/_insn_operand_info.erb \
- $(srcdir)/tool/ruby_vm/views/_attributes.erb $(srcdir)/tool/ruby_vm/views/_insn_stack_increase.erb
-$(srcs_vpath)vmtc.inc: $(srcdir)/tool/ruby_vm/views/vmtc.inc.erb $(inc_common_headers)
-$(srcs_vpath)vm.inc: $(srcdir)/tool/ruby_vm/views/vm.inc.erb $(inc_common_headers) \
- $(srcdir)/tool/ruby_vm/views/_insn_entry.erb $(srcdir)/tool/ruby_vm/views/_trace_instruction.erb
-$(srcs_vpath)mjit_compile.inc: $(srcdir)/tool/ruby_vm/views/mjit_compile.inc.erb $(inc_common_headers) \
- $(srcdir)/tool/ruby_vm/views/_mjit_compile_insn.erb $(srcdir)/tool/ruby_vm/views/_mjit_compile_send.erb \
- $(srcdir)/tool/ruby_vm/views/_mjit_compile_ivar.erb \
- $(srcdir)/tool/ruby_vm/views/_mjit_compile_insn_body.erb $(srcdir)/tool/ruby_vm/views/_mjit_compile_pc_and_sp.erb
-
-common-srcs: $(srcs_vpath)parse.c $(srcs_vpath)lex.c $(srcs_vpath)enc/trans/newline.c $(srcs_vpath)id.c \
- srcs-lib srcs-ext incs
-
-missing-srcs: $(srcdir)/missing/des_tables.c
-
-srcs: common-srcs missing-srcs srcs-enc
+{$(VPATH)}minsns.inc: $(srcdir)/template/minsns.inc.tmpl
+
+{$(VPATH)}opt_sc.inc: $(srcdir)/template/opt_sc.inc.tmpl
+
+{$(VPATH)}optinsn.inc: $(srcdir)/template/optinsn.inc.tmpl
+
+{$(VPATH)}optunifs.inc: $(srcdir)/template/optunifs.inc.tmpl
+
+{$(VPATH)}insns.inc: $(srcdir)/template/insns.inc.tmpl
+
+{$(VPATH)}insns_info.inc: $(srcdir)/template/insns_info.inc.tmpl
+
+{$(VPATH)}vmtc.inc: $(srcdir)/template/vmtc.inc.tmpl
+
+{$(VPATH)}vm.inc: $(srcdir)/template/vm.inc.tmpl
+
+common-srcs: {$(VPATH)}parse.c {$(VPATH)}lex.c {$(VPATH)}enc/trans/newline.c {$(VPATH)}id.c \
+ srcs-lib srcs-ext
+
+srcs: common-srcs srcs-enc
EXT_SRCS = $(srcdir)/ext/ripper/ripper.c \
- $(srcdir)/ext/rbconfig/sizeof/sizes.c \
- $(srcdir)/ext/rbconfig/sizeof/limits.c \
- $(srcdir)/ext/socket/constdefs.c \
- $(srcdir)/ext/etc/constdefs.h \
- # EXT_SRCS
+ $(srcdir)/ext/rbconfig/sizeof/sizes.c
srcs-ext: $(EXT_SRCS)
-realclean-srcs-ext::
- $(Q)$(RM) $(EXT_SRCS)
-
-EXTRA_SRCS = $(srcdir)/ext/json/parser/parser.c \
- $(srcdir)/ext/date/zonetab.h \
- $(empty)
-srcs-extra: $(EXTRA_SRCS)
-realclean-srcs-extra::
- $(Q)$(RM) $(EXTRA_SRCS)
+srcs-extra: $(srcdir)/ext/json/parser/parser.c
LIB_SRCS = $(srcdir)/lib/unicode_normalize/tables.rb
@@ -1003,13 +789,12 @@ srcs-lib: $(LIB_SRCS)
srcs-enc: $(ENC_MK)
$(ECHO) making srcs under enc
- $(Q) $(MAKE) $(MAKE_ENC) srcs
+ $(Q) $(MAKE) -f $(ENC_MK) RUBY="$(MINIRUBY)" MINIRUBY="$(MINIRUBY)" $(MFLAGS) srcs
all-incs: incs {$(VPATH)}encdb.h {$(VPATH)}transdb.h
incs: $(INSNS) {$(VPATH)}node_name.inc {$(VPATH)}known_errors.inc \
{$(VPATH)}vm_call_iseq_optimized.inc $(srcdir)/revision.h \
- $(REVISION_H) \
- $(UNICODE_DATA_HEADERS) $(srcdir)/enc/jis/props.h \
+ $(REVISION_H) enc/unicode/name2ctype.h enc/jis/props.h \
{$(VPATH)}id.h {$(VPATH)}probes.dmyh
insns: $(INSNS)
@@ -1024,9 +809,9 @@ id.c: $(srcdir)/tool/generic_erb.rb $(srcdir)/template/id.c.tmpl $(srcdir)/defs/
$(Q) $(BASERUBY) $(srcdir)/tool/generic_erb.rb --output=$@ \
$(srcdir)/template/id.c.tmpl
-node_name.inc: $(srcdir)/tool/node_name.rb $(srcdir)/node.h
+node_name.inc: {$(VPATH)}node.h
$(ECHO) generating $@
- $(Q) $(BASERUBY) -n $(srcdir)/tool/node_name.rb < $(srcdir)/node.h > $@
+ $(Q) $(BASERUBY) -n $(srcdir)/tool/node_name.rb < $? > $@
encdb.h: $(PREP) $(srcdir)/tool/generic_erb.rb $(srcdir)/template/encdb.h.tmpl
$(ECHO) generating $@
@@ -1052,25 +837,19 @@ $(MINIPRELUDE_C): $(COMPILE_PRELUDE)
$(srcdir)/template/prelude.c.tmpl
$(PRELUDE_C): $(COMPILE_PRELUDE) \
- $(PRELUDE_SCRIPTS)
+ {$(srcdir)}lib/rubygems/defaults.rb \
+ {$(srcdir)}lib/rubygems/core_ext/kernel_gem.rb \
+ $(PRELUDE_SCRIPTS) $(LIB_SRCS)
$(ECHO) generating $@
$(Q) $(BASERUBY) $(srcdir)/tool/generic_erb.rb -I$(srcdir) -c -o $@ \
$(srcdir)/template/prelude.c.tmpl $(PRELUDE_SCRIPTS)
-$(GOLF_PRELUDE_C): $(COMPILE_PRELUDE) {$(srcdir)}golf_prelude.rb
+{$(VPATH)}golf_prelude.c: $(COMPILE_PRELUDE) {$(srcdir)}golf_prelude.rb
$(ECHO) generating $@
$(Q) $(BASERUBY) $(srcdir)/tool/generic_erb.rb -I$(srcdir) -c -o $@ \
$(srcdir)/template/prelude.c.tmpl golf_prelude.rb
-MAINCPPFLAGS = $(ENABLE_DEBUG_ENV:yes=-DRUBY_DEBUG_ENV=1)
-
-$(MAINOBJ): $(srcdir)/$(MAINSRC)
- $(ECHO) compiling $(srcdir)/$(MAINSRC)
- $(Q) $(CC) $(MAINCPPFLAGS) $(CFLAGS) $(XCFLAGS) $(CPPFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$(srcdir)/$(MAINSRC)
-
-{$(VPATH)}probes.dmyh: {$(srcdir)}probes.d $(srcdir)/tool/gen_dummy_probes.rb
-
-probes.dmyh:
+probes.dmyh: {$(srcdir)}probes.d $(srcdir)/tool/gen_dummy_probes.rb
$(BASERUBY) $(srcdir)/tool/gen_dummy_probes.rb $(srcdir)/probes.d > $@
probes.h: {$(VPATH)}probes.$(DTRACE_EXT)
@@ -1082,58 +861,32 @@ preludes: {$(VPATH)}miniprelude.c
preludes: {$(srcdir)}golf_prelude.c
$(srcdir)/revision.h:
- $(Q)$(gnumake:yes=#) $(RM) $(@F)
- $(Q)$(gnumake:yes=#) exit > $@ || exit > $(@F)
+ @exit > $@
-$(REVISION_H): $(srcdir)/version.h $(srcdir)/tool/file2lastrev.rb $(REVISION_FORCE)
- -$(Q) $(BASERUBY) $(srcdir)/tool/file2lastrev.rb -q --revision.h "$(srcdir)" > revision.tmp
+$(REVISION_H): $(srcdir)/version.h $(srcdir)/ChangeLog $(srcdir)/tool/file2lastrev.rb $(REVISION_FORCE)
+ -$(Q) $(BASERUBY) $(srcdir)/tool/file2lastrev.rb --revision.h "$(srcdir)" > revision.tmp
$(Q)$(IFCHANGE) "--timestamp=$@" "$(srcdir)/revision.h" revision.tmp
-$(srcdir)/ext/ripper/ripper.c: $(srcdir)/ext/ripper/tools/preproc.rb $(srcdir)/parse.y id.h
+$(srcdir)/ext/ripper/ripper.c: parse.y id.h
$(ECHO) generating $@
- $(Q) VPATH=$${PWD-`pwd`} && $(CHDIR) $(@D) && \
- sed -e 's/{\$$([^(){}]*)[^{}]*}//g' -e /AUTOGENERATED/q depend | \
- $(exec) $(MAKE) -f - $(mflags) \
- Q=$(Q) ECHO=$(ECHO) RM="$(RM)" top_srcdir=../.. srcdir=. VPATH="$${VPATH}" \
+ $(Q) $(CHDIR) $(@D) && \
+ sed /AUTOGENERATED/q depend | \
+ $(exec) $(MAKE) -f - $(MFLAGS) \
+ Q=$(Q) ECHO=$(ECHO) RM="$(RM)" top_srcdir=../.. srcdir=. VPATH="$(PWD)" \
RUBY="$(BASERUBY)" PATH_SEPARATOR="$(PATH_SEPARATOR)"
$(srcdir)/ext/json/parser/parser.c: $(srcdir)/ext/json/parser/parser.rl
$(ECHO) generating $@
- $(Q) $(CHDIR) $(@D) && $(exec) $(MAKE) -f prereq.mk $(mflags) \
+ $(Q) $(CHDIR) $(@D) && $(exec) $(MAKE) -f prereq.mk $(MFLAGS) \
Q=$(Q) ECHO=$(ECHO) top_srcdir=../../.. srcdir=. VPATH=../../.. BASERUBY="$(BASERUBY)"
-$(srcdir)/ext/date/zonetab.h: $(srcdir)/ext/date/zonetab.list
- $(ECHO) generating $@
- $(Q) $(CHDIR) $(@D) && $(exec) $(MAKE) -f prereq.mk $(mflags) \
- Q=$(Q) ECHO=$(ECHO) top_srcdir=../.. srcdir=. VPATH=../.. BASERUBY="$(BASERUBY)"
-
$(srcdir)/ext/rbconfig/sizeof/sizes.c: $(srcdir)/ext/rbconfig/sizeof/depend \
- $(srcdir)/tool/generic_erb.rb $(srcdir)/template/sizes.c.tmpl $(srcdir)/configure.ac
- $(ECHO) generating $@
- $(Q) $(CHDIR) $(@D) && \
- sed '/AUTOGENERATED/q' depend | \
- $(exec) $(MAKE) -f - $(mflags) \
- Q=$(Q) ECHO=$(ECHO) top_srcdir=../../.. srcdir=. VPATH=../../.. RUBY="$(BASERUBY)" $(@F)
-
-$(srcdir)/ext/rbconfig/sizeof/limits.c: $(srcdir)/ext/rbconfig/sizeof/depend \
- $(srcdir)/tool/generic_erb.rb $(srcdir)/template/limits.c.tmpl
+ $(srcdir)/tool/generic_erb.rb $(srcdir)/template/sizes.c.tmpl $(srcdir)/configure.in
$(ECHO) generating $@
$(Q) $(CHDIR) $(@D) && \
- sed '/AUTOGENERATED/q' depend | \
- $(exec) $(MAKE) -f - $(mflags) \
- Q=$(Q) ECHO=$(ECHO) top_srcdir=../../.. srcdir=. VPATH=../../.. RUBY="$(BASERUBY)" $(@F)
-
-$(srcdir)/ext/socket/constdefs.c: $(srcdir)/ext/socket/depend
- $(Q) $(CHDIR) $(@D) && \
- sed '/AUTOGENERATED/q' depend | \
- $(exec) $(MAKE) -f - $(mflags) \
- Q=$(Q) ECHO=$(ECHO) top_srcdir=../.. srcdir=. VPATH=../.. RUBY="$(BASERUBY)"
-
-$(srcdir)/ext/etc/constdefs.h: $(srcdir)/ext/etc/depend
- $(Q) $(CHDIR) $(@D) && \
- sed '/AUTOGENERATED/q' depend | \
- $(exec) $(MAKE) -f - $(mflags) \
- Q=$(Q) ECHO=$(ECHO) top_srcdir=../.. srcdir=. VPATH=../.. RUBY="$(BASERUBY)"
+ sed /AUTOGENERATED/q depend | \
+ $(exec) $(MAKE) -f - $(MFLAGS) \
+ Q=$(Q) ECHO=$(ECHO) top_srcdir=../../.. srcdir=. VPATH=../../.. RUBY="$(BASERUBY)"
##
@@ -1144,7 +897,7 @@ runruby: $(PROGRAM) PHONY
$(RUNRUBY) $(TESTRUN_SCRIPT)
parse: fake miniruby$(EXEEXT) PHONY
- $(BTESTRUBY) --dump=parsetree_with_comment,insns $(TESTRUN_SCRIPT)
+ $(BTESTRUBY) $(srcdir)/tool/parse.rb $(TESTRUN_SCRIPT)
bisect: PHONY
$(srcdir)/tool/bisect.sh miniruby $(srcdir)
@@ -1154,19 +907,27 @@ bisect-ruby: PHONY
COMPARE_RUBY = $(BASERUBY)
ITEM =
-ARGS = $$(find $(srcdir)/benchmark -maxdepth 1 -name '*$(ITEM)*.yml' -o -name '*$(ITEM)*.rb' | sort)
OPTS =
# You can pass several options through OPTS environment variable.
-# $ make benchmark ARGS="--help" displays more detail.
+# $ make benchmark OPTS="--help" displays more detail.
# for example,
# $ make benchmark COMPARE_RUBY="ruby-trunk" OPTS="-e ruby-2.2.2"
# This command compares trunk and built-ruby and 2.2.2
-benchmark: miniruby$(EXEEXT) update-benchmark-driver PHONY
- $(BASERUBY) -rrubygems -I$(srcdir)/benchmark/lib $(srcdir)/benchmark/benchmark-driver/exe/benchmark-driver \
- --executables="compare-ruby::$(COMPARE_RUBY) -I$(EXTOUT)/common --disable-gem" \
- --executables="built-ruby::$(MINIRUBY) -r$(srcdir)/prelude --disable-gem" \
- $(ARGS) $(OPTS)
+benchmark: $(PROGRAM) PHONY
+ $(BASERUBY) $(srcdir)/benchmark/driver.rb -v \
+ --executables="$(COMPARE_RUBY); built-ruby::$(RUNRUBY)" \
+ --pattern='bm_' --directory=$(srcdir)/benchmark $(OPTS)
+
+benchmark-each: $(PROGRAM) PHONY
+ $(BASERUBY) $(srcdir)/benchmark/driver.rb -v \
+ --executables="$(COMPARE_RUBY); built-ruby::$(RUNRUBY)" \
+ --pattern=$(ITEM) --directory=$(srcdir)/benchmark $(OPTS)
+
+tbench: $(PROGRAM) PHONY
+ $(BASERUBY) $(srcdir)/benchmark/driver.rb -v \
+ --executables="$(COMPARE_RUBY); built-ruby::$(RUNRUBY)" \
+ --pattern='bmx_' --directory=$(srcdir)/benchmark $(OPTS)
run.gdb:
echo set breakpoint pending on > run.gdb
@@ -1189,53 +950,32 @@ gdb: miniruby$(EXEEXT) run.gdb PHONY
gdb-ruby: $(PROGRAM) run.gdb PHONY
$(Q) $(RUNRUBY_COMMAND) $(RUNRUBY_DEBUGGER) -- $(TESTRUN_SCRIPT)
-LLDB_INIT = command script import -r $(srcdir)/misc/lldb_cruby.py
-
-lldb: miniruby$(EXEEXT) PHONY
- lldb -o '$(LLDB_INIT)' miniruby$(EXEEXT) -- $(TESTRUN_SCRIPT)
-
-lldb-ruby: $(PROGRAM) PHONY
- lldb $(enable_shared:yes=-o 'target modules add ${LIBRUBY_SO}') -o '$(LLDB_INIT)' $(PROGRAM) -- $(TESTRUN_SCRIPT)
-
-DISTPKGS = gzip,zip,all
dist:
- $(BASERUBY) $(srcdir)/tool/make-snapshot \
- -srcdir=$(srcdir) -packages=$(DISTPKGS) \
- -unicode-version=$(UNICODE_VERSION) \
- tmp $(RELNAME)
-
-up:: update-remote
+ $(BASERUBY) $(srcdir)/tool/make-snapshot -srcdir=$(srcdir) tmp $(RELNAME)
up::
- -$(Q)$(MAKE) $(mflags) Q=$(Q) REVISION_FORCE=PHONY "$(REVISION_H)"
+ -$(Q)$(MAKE) $(MFLAGS) Q=$(Q) REVISION_FORCE=PHONY "$(REVISION_H)"
up::
- -$(Q)$(MAKE) $(mflags) Q=$(Q) after-update
+ -$(Q)$(MAKE) $(MFLAGS) Q=$(Q) after-update
-after-update:: extract-extlibs
-
-update-remote:: update-src update-download
-update-download:: update-unicode update-gems download-extlibs
-
-update-mspec:
-update-rubyspec:
+after-update:: update-unicode update-gems extract-extlibs
update-config_files: PHONY
- $(Q) $(BASERUBY) -C "$(srcdir)" tool/downloader.rb -d tool --cache-dir=$(CACHE_DIR) -e gnu \
+ $(Q) $(BASERUBY) -C "$(srcdir)/tool" \
+ ../tool/downloader.rb -e gnu \
config.guess config.sub
update-gems: PHONY
$(ECHO) Downloading bundled gem files...
- $(Q) $(BASERUBY) -C "$(srcdir)" \
- -I./tool -rdownloader -answ \
+ $(Q) $(BASERUBY) -C "$(srcdir)/gems" \
+ -I../tool -rdownloader -answ \
-e 'gem, ver = *$$F' \
- -e 'old = Dir.glob("gems/#{gem}-*.gem")' \
+ -e 'old = Dir.glob("#{gem}-*.gem")' \
-e 'gem = "#{gem}-#{ver}.gem"' \
- -e 'Downloader::RubyGems.download(gem, "gems", nil) and' \
- -e '(old.delete("gems/#{gem}"); !old.empty?) and' \
- -e 'File.unlink(*old) and' \
- -e 'FileUtils.rm_rf(old.map{'"|n|"'n.chomp(".gem")})' \
- gems/bundled_gems
+ -e 'Downloader::RubyGems.download(gem, nil, nil) and' \
+ -e 'File.unlink(*(old-[gem]))' \
+ bundled_gems
extract-gems: PHONY
$(ECHO) Extracting bundled gem files...
@@ -1245,169 +985,45 @@ extract-gems: PHONY
-e 'Gem.unpack("#{gem}-#{ver}.gem")' \
bundled_gems
-update-bundled_gems: PHONY
- $(Q) $(RUNRUBY) -rrubygems \
- -pla \
- -e '(gem,src), = Gem::SpecFetcher.fetcher.detect(:latest) {'"|s|" \
- -e 's.platform=="ruby"&&s.name==$$F[0]' \
- -e '}' \
- -e 'gem = src.fetch_spec(gem)' \
- -e '$$_ = [gem.name, gem.version, gem.metadata["source_code_uri"]||gem.homepage].join(" ")' \
- "$(srcdir)/gems/bundled_gems" | \
- "$(IFCHANGE)" "$(srcdir)/gems/bundled_gems" -
-
-test-bundled-gems-precheck: $(arch)-fake.rb programs
-
-test-bundled-gems-fetch: $(PREP)
- $(Q) $(BASERUBY) -C $(srcdir)/gems ../tool/fetch-bundled_gems.rb src bundled_gems
-
-test-bundled-gems-prepare: test-bundled-gems-precheck test-bundled-gems-fetch
- $(XRUBY) -C "$(srcdir)" bin/gem install --no-document \
- --install-dir .bundle --conservative "bundler" "minitest:~> 5" 'test-unit' 'rake' 'hoe' 'yard' 'pry' 'packnga'
-
-PREPARE_BUNDLED_GEMS = test-bundled-gems-prepare
-test-bundled-gems: $(TEST_RUNNABLE)-test-bundled-gems
-yes-test-bundled-gems: test-bundled-gems-run
-no-test-bundled-gems:
-test-bundled-gems-run: $(PREPARE_BUNDLED_GEMS)
-
-test-bundler-precheck: $(arch)-fake.rb programs
-
-yes-test-bundler-prepare: test-bundler-precheck
- $(XRUBY) -C "$(srcdir)" bin/gem install --no-document \
- --install-dir .bundle --conservative "rspec:~> 3.5"
-
-RSPECOPTS = --format progress
-BUNDLER_SPECS =
-test-bundler: $(TEST_RUNNABLE)-test-bundler
-yes-test-bundler: yes-test-bundler-prepare
- $(gnumake_recursive)$(Q) \
- $(XRUBY) -C $(srcdir) -Ispec/bundler .bundle/bin/rspec \
- --require spec_helper $(RSPECOPTS) spec/bundler/$(BUNDLER_SPECS)
-no-test-bundler:
-
-UNICODE_FILES = $(UNICODE_SRC_DATA_DIR)/UnicodeData.txt \
- $(UNICODE_SRC_DATA_DIR)/CompositionExclusions.txt \
- $(UNICODE_SRC_DATA_DIR)/NormalizationTest.txt \
- $(UNICODE_SRC_DATA_DIR)/CaseFolding.txt \
- $(UNICODE_SRC_DATA_DIR)/SpecialCasing.txt \
- $(empty)
-
-UNICODE_PROPERTY_FILES = \
- $(UNICODE_SRC_DATA_DIR)/Blocks.txt \
- $(UNICODE_SRC_DATA_DIR)/DerivedAge.txt \
- $(UNICODE_SRC_DATA_DIR)/DerivedCoreProperties.txt \
- $(UNICODE_SRC_DATA_DIR)/PropList.txt \
- $(UNICODE_SRC_DATA_DIR)/PropertyAliases.txt \
- $(UNICODE_SRC_DATA_DIR)/PropertyValueAliases.txt \
- $(UNICODE_SRC_DATA_DIR)/Scripts.txt \
- $(empty)
-
-UNICODE_AUXILIARY_FILES = \
- $(UNICODE_SRC_DATA_DIR)/auxiliary/GraphemeBreakProperty.txt \
- $(UNICODE_SRC_DATA_DIR)/auxiliary/GraphemeBreakTest.txt \
- $(empty)
-
-UNICODE_EMOJI_FILES = \
- $(UNICODE_SRC_EMOJI_DATA_DIR)/emoji-data.txt \
- $(UNICODE_SRC_EMOJI_DATA_DIR)/emoji-sequences.txt \
- $(UNICODE_SRC_EMOJI_DATA_DIR)/emoji-test.txt \
- $(UNICODE_SRC_EMOJI_DATA_DIR)/emoji-variation-sequences.txt \
- $(UNICODE_SRC_EMOJI_DATA_DIR)/emoji-zwj-sequences.txt \
- $(empty)
-
-update-unicode: $(UNICODE_FILES) $(UNICODE_PROPERTY_FILES)
-
-CACHE_DIR = $(srcdir)/.downloaded-cache
-UNICODE_DOWNLOAD = \
- $(BASERUBY) $(srcdir)/tool/downloader.rb \
- --cache-dir=$(CACHE_DIR) \
- --unicode-beta $(UNICODE_BETA) \
- -d $(UNICODE_SRC_DATA_DIR) \
- -p $(UNICODE_VERSION)/ucd \
- -e $(ALWAYS_UPDATE_UNICODE:yes=-a) unicode
-UNICODE_AUXILIARY_DOWNLOAD = \
- $(BASERUBY) $(srcdir)/tool/downloader.rb \
- --cache-dir=$(CACHE_DIR) \
- --unicode-beta $(UNICODE_BETA) \
- -d $(UNICODE_SRC_DATA_DIR)/auxiliary \
- -p $(UNICODE_VERSION)/ucd/auxiliary \
- -e $(ALWAYS_UPDATE_UNICODE:yes=-a) unicode
-UNICODE_EMOJI_DOWNLOAD = \
- $(BASERUBY) $(srcdir)/tool/downloader.rb \
- --cache-dir=$(CACHE_DIR) \
- --unicode-beta $(UNICODE_BETA) \
- -d $(UNICODE_SRC_EMOJI_DATA_DIR) \
- -p emoji/$(UNICODE_EMOJI_VERSION) \
- -e $(ALWAYS_UPDATE_UNICODE:yes=-a) unicode
-
-$(UNICODE_PROPERTY_FILES): update-unicode-property-files
-update-unicode-property-files:
- $(ECHO) Downloading Unicode $(UNICODE_VERSION) property files...
- $(Q) $(UNICODE_DOWNLOAD) $(UNICODE_PROPERTY_FILES)
- $(ECHO) Downloading Unicode $(UNICODE_VERSION) auxiliary files...
- $(Q) $(MAKEDIRS) "$(UNICODE_SRC_DATA_DIR)/auxiliary"
- $(Q) $(UNICODE_AUXILIARY_DOWNLOAD) $(UNICODE_AUXILIARY_FILES)
- $(ECHO) Downloading Unicode emoji $(UNICODE_EMOJI_VERSION) files...
- $(Q) $(MAKEDIRS) "$(UNICODE_SRC_EMOJI_DATA_DIR)"
- $(Q) $(UNICODE_EMOJI_DOWNLOAD) $(UNICODE_EMOJI_FILES)
-
-$(UNICODE_FILES): update-unicode-files
-update-unicode-files:
- $(ECHO) Downloading Unicode $(UNICODE_VERSION) data files...
- $(Q) $(MAKEDIRS) "$(UNICODE_SRC_DATA_DIR)"
- $(Q) $(UNICODE_DOWNLOAD) $(UNICODE_FILES)
+UPDATE_LIBRARIES = no
-$(srcdir)/$(HAVE_BASERUBY:yes=lib/unicode_normalize/tables.rb): \
- $(UNICODE_SRC_DATA_DIR)/.unicode-tables.time
+### set the following environment variable or uncomment the line if
+### the Unicode data files are updated every minute.
+# ALWAYS_UPDATE_UNICODE = yes
-$(UNICODE_SRC_DATA_DIR)/$(ALWAYS_UPDATE_UNICODE:yes=.unicode-tables.time): \
- $(UNICODE_FILES) $(UNICODE_PROPERTY_FILES)
+UNICODE_FILES = $(srcdir)/enc/unicode/data/$(UNICODE_VERSION)/UnicodeData.txt \
+ $(srcdir)/enc/unicode/data/$(UNICODE_VERSION)/CompositionExclusions.txt \
+ $(srcdir)/enc/unicode/data/$(UNICODE_VERSION)/NormalizationTest.txt
-touch-unicode-files:
- $(MAKEDIRS) $(UNICODE_SRC_DATA_DIR)
- touch $(UNICODE_SRC_DATA_DIR)/.unicode-tables.time $(UNICODE_DATA_HEADERS)
+update-unicode: $(UNICODE_FILES) PHONY
-$(UNICODE_SRC_DATA_DIR)/.unicode-tables.time: $(srcdir)/tool/generic_erb.rb \
- $(srcdir)/template/unicode_norm_gen.tmpl \
- $(ALWAYS_UPDATE_UNICODE:yes=update-unicode)
- $(Q) $(MAKE) $(@D)
+UNICODE_FILES_DEPS0 = $(UPDATE_LIBRARIES:yes=download-unicode-data)
+UNICODE_FILES_DEPS = $(UNICODE_FILES_DEPS0:no=)
+$(UNICODE_FILES): $(UNICODE_FILES_DEPS)
+
+download-unicode-data: ./.unicode-$(UNICODE_VERSION).time
+./.unicode-$(UNICODE_VERSION).time: PHONY
+ $(ECHO) Downloading Unicode $(UNICODE_VERSION) data files...
+ $(Q) $(MAKEDIRS) "$(srcdir)/enc/unicode/data/$(UNICODE_VERSION)"
+ $(Q) $(BASERUBY) -C "$(srcdir)" tool/downloader.rb \
+ -d enc/unicode/data/$(UNICODE_VERSION) \
+ -e $(ALWAYS_UPDATE_UNICODE:yes=-a) unicode \
+ $(UNICODE_VERSION)/ucd/UnicodeData.txt \
+ $(UNICODE_VERSION)/ucd/CompositionExclusions.txt \
+ $(UNICODE_VERSION)/ucd/NormalizationTest.txt
+ @exit > $@
+
+$(srcdir)/$(HAVE_BASERUBY:yes=lib/unicode_normalize/tables.rb): \
+ $(UNICODE_FILES_DEPS:download-unicode-data=./.unicode-tables.time)
+
+./.unicode-tables.time: $(srcdir)/tool/generic_erb.rb \
+ $(UNICODE_FILES) $(UNICODE_FILES_DEPS) \
+ $(srcdir)/template/unicode_norm_gen.tmpl
$(Q) $(BASERUBY) $(srcdir)/tool/generic_erb.rb \
-c -t$@ -o $(srcdir)/lib/unicode_normalize/tables.rb \
-I $(srcdir) \
$(srcdir)/template/unicode_norm_gen.tmpl \
- $(UNICODE_DATA_DIR) lib/unicode_normalize
-
-$(UNICODE_SRC_DATA_DIR):
- $(Q) $(exec) $(MAKEDIRS) $@ || exit && echo $(MAKE)
-
-$(UNICODE_HDR_DIR)/$(ALWAYS_UPDATE_UNICODE:yes=name2ctype.h): \
- $(srcdir)/tool/enc-unicode.rb \
- $(UNICODE_SRC_DATA_DIR)/UnicodeData.txt \
- $(UNICODE_PROPERTY_FILES)
-
-$(UNICODE_HDR_DIR)/name2ctype.h:
- $(MAKEDIRS) $(@D)
- $(BOOTSTRAPRUBY) $(srcdir)/tool/enc-unicode.rb --header \
- $(UNICODE_SRC_DATA_DIR) $(UNICODE_SRC_EMOJI_DATA_DIR) > $@.new
- $(MV) $@.new $@
-
-# the next non-comment line was:
-# $(UNICODE_HDR_DIR)/casefold.h: $(srcdir)/enc/unicode/case-folding.rb \
-# but was changed to make sure CI works on systems that don't have gperf
-unicode-up: $(UNICODE_DATA_HEADERS)
-
-$(UNICODE_HDR_DIR)/$(ALWAYS_UPDATE_UNICODE:yes=casefold.h): \
- $(srcdir)/enc/unicode/case-folding.rb \
- $(UNICODE_SRC_DATA_DIR)/UnicodeData.txt \
- $(UNICODE_SRC_DATA_DIR)/SpecialCasing.txt \
- $(UNICODE_SRC_DATA_DIR)/CaseFolding.txt
-
-$(UNICODE_HDR_DIR)/casefold.h:
- $(MAKEDIRS) $(@D)
- $(Q) $(BASERUBY) $(srcdir)/enc/unicode/case-folding.rb \
- --output-file=$@ \
- --mapping-data-directory=$(UNICODE_SRC_DATA_DIR)
+ enc/unicode/data/$(UNICODE_VERSION) lib/unicode_normalize
download-extlibs:
$(Q) $(BASERUBY) -C $(srcdir) -w tool/extlibs.rb --download ext
@@ -1436,14 +1052,12 @@ info-arch: PHONY
change: PHONY
$(BASERUBY) -C "$(srcdir)" ./tool/change_maker.rb $(CHANGES) > change.log
-exam: check
+exam: check test-rubyspec
-love: sudo-precheck up all test exam install
+love: sudo-precheck up all test install check
@echo love is all you need
-great: exam
-
-yes-test-all no-test-all: sudo-precheck
+yes-test-all: sudo-precheck
sudo-precheck: PHONY
@$(SUDO) echo > $(NULL)
@@ -1459,37 +1073,32 @@ help: PHONY
" Makefile of Ruby" \
"" \
"targets:" \
- " all (default): builds all of below" \
- " miniruby: builds only miniruby" \
- " encs: builds encodings" \
- " exts: builds extensions" \
- " main: builds encodings, extensions and ruby" \
- " docs: builds documents" \
- " install-capi: builds C API documents" \
- " run: runs test.rb by miniruby" \
- " runruby: runs test.rb by ruby you just built" \
- " gdb: runs test.rb by miniruby under gdb" \
- " gdb-ruby: runs test.rb by ruby under gdb" \
- " check: equals make test test-all test-spec" \
- " exam: equals make check" \
- " test: ruby core tests" \
- " test-all: all ruby tests [TESTOPTS=-j4 TESTS=<test files>]" \
- " test-spec: run the Ruby spec suite" \
- " test-rubyspec: same as test-spec" \
- " test-bundler: run the Bundler spec" \
- " test-bundled-gems: run the test suite of bundled gems" \
- " up: update local copy and autogenerated files" \
- " benchmark: benchmark this ruby and COMPARE_RUBY." \
- " gcbench: gc benchmark [GCBENCH_ITEM=<item_name>]" \
- " gcbench-rdoc: gc benchmark with GCBENCH_ITEM=rdoc" \
- " install: install all ruby distributions" \
- " install-nodoc: install without rdoc" \
- " install-cross: install cross compiling stuff" \
- " clean: clean for tarball" \
- " distclean: clean for repository" \
- " change: make change log template" \
- " golf: for golfers" \
- " goruby: same as golf" \
+ " all (default): builds all of below" \
+ " miniruby: builds only miniruby" \
+ " encs: builds encodings" \
+ " exts: builds extensions" \
+ " main: builds encodings, extensions and ruby" \
+ " docs: builds documents" \
+ " run: runs test.rb by miniruby" \
+ " runruby: runs test.rb by ruby you just built" \
+ " gdb: runs test.rb by miniruby under gdb" \
+ " gdb-ruby: runs test.rb by ruby under gdb" \
+ " check: equals make test test-all" \
+ " exam: equals make check test-rubyspec" \
+ " test: ruby core tests" \
+ " test-all: all ruby tests [TESTOPTS=-j4 TESTS=\"<test files>\"]" \
+ " test-rubyspec: run RubySpec test suite" \
+ " update-rubyspec: update local copy of RubySpec" \
+ " benchmark: benchmark this ruby and COMPARE_RUBY." \
+ " gcbench: gc benchmark [GCBENCH_ITEM=<item_name>]" \
+ " gcbench-rdoc: gc benchmark with GCBENCH_ITEM=rdoc" \
+ " install: install all ruby distributions" \
+ " install-nodoc: install without rdoc" \
+ " install-cross: install cross compiling staff" \
+ " clean: clean for tarball" \
+ " distclean: clean for repository" \
+ " change: make change log template" \
+ " golf: for golfers" \
"" \
"see DeveloperHowto for more detail: " \
" https://bugs.ruby-lang.org/projects/ruby/wiki/DeveloperHowto" \
@@ -1499,72 +1108,35 @@ help: PHONY
addr2line.$(OBJEXT): {$(VPATH)}addr2line.c
addr2line.$(OBJEXT): {$(VPATH)}addr2line.h
addr2line.$(OBJEXT): {$(VPATH)}config.h
-addr2line.$(OBJEXT): {$(VPATH)}defines.h
addr2line.$(OBJEXT): {$(VPATH)}missing.h
array.$(OBJEXT): $(hdrdir)/ruby/ruby.h
array.$(OBJEXT): $(top_srcdir)/include/ruby.h
array.$(OBJEXT): {$(VPATH)}array.c
array.$(OBJEXT): {$(VPATH)}config.h
-array.$(OBJEXT): {$(VPATH)}debug_counter.h
array.$(OBJEXT): {$(VPATH)}defines.h
array.$(OBJEXT): {$(VPATH)}encoding.h
-array.$(OBJEXT): {$(VPATH)}gc.h
array.$(OBJEXT): {$(VPATH)}id.h
array.$(OBJEXT): {$(VPATH)}intern.h
array.$(OBJEXT): {$(VPATH)}internal.h
array.$(OBJEXT): {$(VPATH)}io.h
array.$(OBJEXT): {$(VPATH)}missing.h
-array.$(OBJEXT): {$(VPATH)}onigmo.h
array.$(OBJEXT): {$(VPATH)}oniguruma.h
-array.$(OBJEXT): {$(VPATH)}probes.dmyh
array.$(OBJEXT): {$(VPATH)}probes.h
-array.$(OBJEXT): {$(VPATH)}ruby_assert.h
array.$(OBJEXT): {$(VPATH)}st.h
array.$(OBJEXT): {$(VPATH)}subst.h
-array.$(OBJEXT): {$(VPATH)}transient_heap.h
array.$(OBJEXT): {$(VPATH)}util.h
-ast.$(OBJEXT): $(CCAN_DIR)/check_type/check_type.h
-ast.$(OBJEXT): $(CCAN_DIR)/container_of/container_of.h
-ast.$(OBJEXT): $(CCAN_DIR)/list/list.h
-ast.$(OBJEXT): $(CCAN_DIR)/str/str.h
-ast.$(OBJEXT): $(hdrdir)/ruby/ruby.h
-ast.$(OBJEXT): $(top_srcdir)/include/ruby.h
-ast.$(OBJEXT): {$(VPATH)}ast.c
-ast.$(OBJEXT): {$(VPATH)}config.h
-ast.$(OBJEXT): {$(VPATH)}defines.h
-ast.$(OBJEXT): {$(VPATH)}encoding.h
-ast.$(OBJEXT): {$(VPATH)}id.h
-ast.$(OBJEXT): {$(VPATH)}intern.h
-ast.$(OBJEXT): {$(VPATH)}internal.h
-ast.$(OBJEXT): {$(VPATH)}iseq.h
-ast.$(OBJEXT): {$(VPATH)}method.h
-ast.$(OBJEXT): {$(VPATH)}missing.h
-ast.$(OBJEXT): {$(VPATH)}node.h
-ast.$(OBJEXT): {$(VPATH)}onigmo.h
-ast.$(OBJEXT): {$(VPATH)}oniguruma.h
-ast.$(OBJEXT): {$(VPATH)}ruby_assert.h
-ast.$(OBJEXT): {$(VPATH)}ruby_atomic.h
-ast.$(OBJEXT): {$(VPATH)}st.h
-ast.$(OBJEXT): {$(VPATH)}subst.h
-ast.$(OBJEXT): {$(VPATH)}thread_$(THREAD_MODEL).h
-ast.$(OBJEXT): {$(VPATH)}thread_native.h
-ast.$(OBJEXT): {$(VPATH)}util.h
-ast.$(OBJEXT): {$(VPATH)}vm_core.h
-ast.$(OBJEXT): {$(VPATH)}vm_opts.h
+array.$(OBJEXT): {$(VPATH)}vm_opts.h
bignum.$(OBJEXT): $(hdrdir)/ruby/ruby.h
bignum.$(OBJEXT): $(top_srcdir)/include/ruby.h
bignum.$(OBJEXT): {$(VPATH)}bignum.c
bignum.$(OBJEXT): {$(VPATH)}config.h
bignum.$(OBJEXT): {$(VPATH)}defines.h
bignum.$(OBJEXT): {$(VPATH)}encoding.h
-bignum.$(OBJEXT): {$(VPATH)}id.h
bignum.$(OBJEXT): {$(VPATH)}intern.h
bignum.$(OBJEXT): {$(VPATH)}internal.h
bignum.$(OBJEXT): {$(VPATH)}io.h
bignum.$(OBJEXT): {$(VPATH)}missing.h
-bignum.$(OBJEXT): {$(VPATH)}onigmo.h
bignum.$(OBJEXT): {$(VPATH)}oniguruma.h
-bignum.$(OBJEXT): {$(VPATH)}ruby_assert.h
bignum.$(OBJEXT): {$(VPATH)}st.h
bignum.$(OBJEXT): {$(VPATH)}subst.h
bignum.$(OBJEXT): {$(VPATH)}thread.h
@@ -1588,9 +1160,7 @@ class.$(OBJEXT): {$(VPATH)}io.h
class.$(OBJEXT): {$(VPATH)}method.h
class.$(OBJEXT): {$(VPATH)}missing.h
class.$(OBJEXT): {$(VPATH)}node.h
-class.$(OBJEXT): {$(VPATH)}onigmo.h
class.$(OBJEXT): {$(VPATH)}oniguruma.h
-class.$(OBJEXT): {$(VPATH)}ruby_assert.h
class.$(OBJEXT): {$(VPATH)}ruby_atomic.h
class.$(OBJEXT): {$(VPATH)}st.h
class.$(OBJEXT): {$(VPATH)}subst.h
@@ -1603,7 +1173,6 @@ compar.$(OBJEXT): $(hdrdir)/ruby/ruby.h
compar.$(OBJEXT): {$(VPATH)}compar.c
compar.$(OBJEXT): {$(VPATH)}config.h
compar.$(OBJEXT): {$(VPATH)}defines.h
-compar.$(OBJEXT): {$(VPATH)}id.h
compar.$(OBJEXT): {$(VPATH)}intern.h
compar.$(OBJEXT): {$(VPATH)}missing.h
compar.$(OBJEXT): {$(VPATH)}st.h
@@ -1621,8 +1190,6 @@ compile.$(OBJEXT): {$(VPATH)}encindex.h
compile.$(OBJEXT): {$(VPATH)}encoding.h
compile.$(OBJEXT): {$(VPATH)}gc.h
compile.$(OBJEXT): {$(VPATH)}id.h
-compile.$(OBJEXT): {$(VPATH)}id_table.h
-compile.$(OBJEXT): {$(VPATH)}insns.def
compile.$(OBJEXT): {$(VPATH)}insns.inc
compile.$(OBJEXT): {$(VPATH)}insns_info.inc
compile.$(OBJEXT): {$(VPATH)}intern.h
@@ -1632,20 +1199,14 @@ compile.$(OBJEXT): {$(VPATH)}iseq.h
compile.$(OBJEXT): {$(VPATH)}method.h
compile.$(OBJEXT): {$(VPATH)}missing.h
compile.$(OBJEXT): {$(VPATH)}node.h
-compile.$(OBJEXT): {$(VPATH)}onigmo.h
compile.$(OBJEXT): {$(VPATH)}oniguruma.h
-compile.$(OBJEXT): {$(VPATH)}opt_sc.inc
compile.$(OBJEXT): {$(VPATH)}optinsn.inc
-compile.$(OBJEXT): {$(VPATH)}optunifs.inc
compile.$(OBJEXT): {$(VPATH)}re.h
-compile.$(OBJEXT): {$(VPATH)}regex.h
-compile.$(OBJEXT): {$(VPATH)}ruby_assert.h
compile.$(OBJEXT): {$(VPATH)}ruby_atomic.h
compile.$(OBJEXT): {$(VPATH)}st.h
compile.$(OBJEXT): {$(VPATH)}subst.h
compile.$(OBJEXT): {$(VPATH)}thread_$(THREAD_MODEL).h
compile.$(OBJEXT): {$(VPATH)}thread_native.h
-compile.$(OBJEXT): {$(VPATH)}util.h
compile.$(OBJEXT): {$(VPATH)}vm_core.h
compile.$(OBJEXT): {$(VPATH)}vm_debug.h
compile.$(OBJEXT): {$(VPATH)}vm_opts.h
@@ -1655,14 +1216,11 @@ complex.$(OBJEXT): {$(VPATH)}complex.c
complex.$(OBJEXT): {$(VPATH)}config.h
complex.$(OBJEXT): {$(VPATH)}defines.h
complex.$(OBJEXT): {$(VPATH)}encoding.h
-complex.$(OBJEXT): {$(VPATH)}id.h
complex.$(OBJEXT): {$(VPATH)}intern.h
complex.$(OBJEXT): {$(VPATH)}internal.h
complex.$(OBJEXT): {$(VPATH)}io.h
complex.$(OBJEXT): {$(VPATH)}missing.h
-complex.$(OBJEXT): {$(VPATH)}onigmo.h
complex.$(OBJEXT): {$(VPATH)}oniguruma.h
-complex.$(OBJEXT): {$(VPATH)}ruby_assert.h
complex.$(OBJEXT): {$(VPATH)}st.h
complex.$(OBJEXT): {$(VPATH)}subst.h
cont.$(OBJEXT): $(CCAN_DIR)/check_type/check_type.h
@@ -1671,7 +1229,6 @@ cont.$(OBJEXT): $(CCAN_DIR)/list/list.h
cont.$(OBJEXT): $(CCAN_DIR)/str/str.h
cont.$(OBJEXT): $(hdrdir)/ruby/ruby.h
cont.$(OBJEXT): $(top_srcdir)/include/ruby.h
-cont.$(OBJEXT): {$(VPATH)}$(COROUTINE_H)
cont.$(OBJEXT): {$(VPATH)}config.h
cont.$(OBJEXT): {$(VPATH)}cont.c
cont.$(OBJEXT): {$(VPATH)}defines.h
@@ -1684,11 +1241,8 @@ cont.$(OBJEXT): {$(VPATH)}internal.h
cont.$(OBJEXT): {$(VPATH)}io.h
cont.$(OBJEXT): {$(VPATH)}method.h
cont.$(OBJEXT): {$(VPATH)}missing.h
-cont.$(OBJEXT): {$(VPATH)}mjit.h
cont.$(OBJEXT): {$(VPATH)}node.h
-cont.$(OBJEXT): {$(VPATH)}onigmo.h
cont.$(OBJEXT): {$(VPATH)}oniguruma.h
-cont.$(OBJEXT): {$(VPATH)}ruby_assert.h
cont.$(OBJEXT): {$(VPATH)}ruby_atomic.h
cont.$(OBJEXT): {$(VPATH)}st.h
cont.$(OBJEXT): {$(VPATH)}subst.h
@@ -1708,7 +1262,6 @@ debug.$(OBJEXT): {$(VPATH)}debug.c
debug.$(OBJEXT): {$(VPATH)}defines.h
debug.$(OBJEXT): {$(VPATH)}encoding.h
debug.$(OBJEXT): {$(VPATH)}eval_intern.h
-debug.$(OBJEXT): {$(VPATH)}gc.h
debug.$(OBJEXT): {$(VPATH)}id.h
debug.$(OBJEXT): {$(VPATH)}intern.h
debug.$(OBJEXT): {$(VPATH)}internal.h
@@ -1716,34 +1269,16 @@ debug.$(OBJEXT): {$(VPATH)}io.h
debug.$(OBJEXT): {$(VPATH)}method.h
debug.$(OBJEXT): {$(VPATH)}missing.h
debug.$(OBJEXT): {$(VPATH)}node.h
-debug.$(OBJEXT): {$(VPATH)}onigmo.h
debug.$(OBJEXT): {$(VPATH)}oniguruma.h
-debug.$(OBJEXT): {$(VPATH)}ruby_assert.h
debug.$(OBJEXT): {$(VPATH)}ruby_atomic.h
debug.$(OBJEXT): {$(VPATH)}st.h
debug.$(OBJEXT): {$(VPATH)}subst.h
-debug.$(OBJEXT): {$(VPATH)}symbol.h
debug.$(OBJEXT): {$(VPATH)}thread_$(THREAD_MODEL).h
debug.$(OBJEXT): {$(VPATH)}thread_native.h
debug.$(OBJEXT): {$(VPATH)}util.h
debug.$(OBJEXT): {$(VPATH)}vm_core.h
debug.$(OBJEXT): {$(VPATH)}vm_debug.h
debug.$(OBJEXT): {$(VPATH)}vm_opts.h
-debug_counter.$(OBJEXT): $(hdrdir)/ruby/ruby.h
-debug_counter.$(OBJEXT): $(top_srcdir)/include/ruby.h
-debug_counter.$(OBJEXT): {$(VPATH)}config.h
-debug_counter.$(OBJEXT): {$(VPATH)}debug_counter.c
-debug_counter.$(OBJEXT): {$(VPATH)}debug_counter.h
-debug_counter.$(OBJEXT): {$(VPATH)}defines.h
-debug_counter.$(OBJEXT): {$(VPATH)}encoding.h
-debug_counter.$(OBJEXT): {$(VPATH)}intern.h
-debug_counter.$(OBJEXT): {$(VPATH)}internal.h
-debug_counter.$(OBJEXT): {$(VPATH)}io.h
-debug_counter.$(OBJEXT): {$(VPATH)}missing.h
-debug_counter.$(OBJEXT): {$(VPATH)}onigmo.h
-debug_counter.$(OBJEXT): {$(VPATH)}oniguruma.h
-debug_counter.$(OBJEXT): {$(VPATH)}st.h
-debug_counter.$(OBJEXT): {$(VPATH)}subst.h
dir.$(OBJEXT): $(hdrdir)/ruby/ruby.h
dir.$(OBJEXT): $(top_srcdir)/include/ruby.h
dir.$(OBJEXT): {$(VPATH)}config.h
@@ -1751,25 +1286,20 @@ dir.$(OBJEXT): {$(VPATH)}defines.h
dir.$(OBJEXT): {$(VPATH)}dir.c
dir.$(OBJEXT): {$(VPATH)}encindex.h
dir.$(OBJEXT): {$(VPATH)}encoding.h
-dir.$(OBJEXT): {$(VPATH)}id.h
dir.$(OBJEXT): {$(VPATH)}intern.h
dir.$(OBJEXT): {$(VPATH)}internal.h
dir.$(OBJEXT): {$(VPATH)}io.h
dir.$(OBJEXT): {$(VPATH)}missing.h
-dir.$(OBJEXT): {$(VPATH)}onigmo.h
dir.$(OBJEXT): {$(VPATH)}oniguruma.h
dir.$(OBJEXT): {$(VPATH)}st.h
dir.$(OBJEXT): {$(VPATH)}subst.h
-dir.$(OBJEXT): {$(VPATH)}thread.h
dir.$(OBJEXT): {$(VPATH)}util.h
dln.$(OBJEXT): $(hdrdir)/ruby/ruby.h
-dln.$(OBJEXT): $(top_srcdir)/include/ruby.h
dln.$(OBJEXT): {$(VPATH)}config.h
dln.$(OBJEXT): {$(VPATH)}defines.h
dln.$(OBJEXT): {$(VPATH)}dln.c
dln.$(OBJEXT): {$(VPATH)}dln.h
dln.$(OBJEXT): {$(VPATH)}intern.h
-dln.$(OBJEXT): {$(VPATH)}internal.h
dln.$(OBJEXT): {$(VPATH)}missing.h
dln.$(OBJEXT): {$(VPATH)}st.h
dln.$(OBJEXT): {$(VPATH)}subst.h
@@ -1808,15 +1338,14 @@ enc/trans/newline.$(OBJEXT): {$(VPATH)}missing.h
enc/trans/newline.$(OBJEXT): {$(VPATH)}st.h
enc/trans/newline.$(OBJEXT): {$(VPATH)}subst.h
enc/trans/newline.$(OBJEXT): {$(VPATH)}transcode_data.h
-enc/unicode.$(OBJEXT): $(UNICODE_HDR_DIR)/casefold.h
-enc/unicode.$(OBJEXT): $(UNICODE_HDR_DIR)/name2ctype.h
enc/unicode.$(OBJEXT): $(hdrdir)/ruby/ruby.h
enc/unicode.$(OBJEXT): {$(VPATH)}config.h
enc/unicode.$(OBJEXT): {$(VPATH)}defines.h
enc/unicode.$(OBJEXT): {$(VPATH)}enc/unicode.c
+enc/unicode.$(OBJEXT): {$(VPATH)}enc/unicode/casefold.h
+enc/unicode.$(OBJEXT): {$(VPATH)}enc/unicode/name2ctype.h
enc/unicode.$(OBJEXT): {$(VPATH)}intern.h
enc/unicode.$(OBJEXT): {$(VPATH)}missing.h
-enc/unicode.$(OBJEXT): {$(VPATH)}onigmo.h
enc/unicode.$(OBJEXT): {$(VPATH)}oniguruma.h
enc/unicode.$(OBJEXT): {$(VPATH)}regenc.h
enc/unicode.$(OBJEXT): {$(VPATH)}regint.h
@@ -1847,10 +1376,8 @@ encoding.$(OBJEXT): {$(VPATH)}intern.h
encoding.$(OBJEXT): {$(VPATH)}internal.h
encoding.$(OBJEXT): {$(VPATH)}io.h
encoding.$(OBJEXT): {$(VPATH)}missing.h
-encoding.$(OBJEXT): {$(VPATH)}onigmo.h
encoding.$(OBJEXT): {$(VPATH)}oniguruma.h
encoding.$(OBJEXT): {$(VPATH)}regenc.h
-encoding.$(OBJEXT): {$(VPATH)}ruby_assert.h
encoding.$(OBJEXT): {$(VPATH)}st.h
encoding.$(OBJEXT): {$(VPATH)}subst.h
encoding.$(OBJEXT): {$(VPATH)}util.h
@@ -1865,12 +1392,9 @@ enum.$(OBJEXT): {$(VPATH)}intern.h
enum.$(OBJEXT): {$(VPATH)}internal.h
enum.$(OBJEXT): {$(VPATH)}io.h
enum.$(OBJEXT): {$(VPATH)}missing.h
-enum.$(OBJEXT): {$(VPATH)}onigmo.h
enum.$(OBJEXT): {$(VPATH)}oniguruma.h
enum.$(OBJEXT): {$(VPATH)}st.h
enum.$(OBJEXT): {$(VPATH)}subst.h
-enum.$(OBJEXT): {$(VPATH)}symbol.h
-enum.$(OBJEXT): {$(VPATH)}transient_heap.h
enum.$(OBJEXT): {$(VPATH)}util.h
enumerator.$(OBJEXT): $(hdrdir)/ruby/ruby.h
enumerator.$(OBJEXT): $(top_srcdir)/include/ruby.h
@@ -1878,12 +1402,10 @@ enumerator.$(OBJEXT): {$(VPATH)}config.h
enumerator.$(OBJEXT): {$(VPATH)}defines.h
enumerator.$(OBJEXT): {$(VPATH)}encoding.h
enumerator.$(OBJEXT): {$(VPATH)}enumerator.c
-enumerator.$(OBJEXT): {$(VPATH)}id.h
enumerator.$(OBJEXT): {$(VPATH)}intern.h
enumerator.$(OBJEXT): {$(VPATH)}internal.h
enumerator.$(OBJEXT): {$(VPATH)}io.h
enumerator.$(OBJEXT): {$(VPATH)}missing.h
-enumerator.$(OBJEXT): {$(VPATH)}onigmo.h
enumerator.$(OBJEXT): {$(VPATH)}oniguruma.h
enumerator.$(OBJEXT): {$(VPATH)}st.h
enumerator.$(OBJEXT): {$(VPATH)}subst.h
@@ -1905,9 +1427,7 @@ error.$(OBJEXT): {$(VPATH)}known_errors.inc
error.$(OBJEXT): {$(VPATH)}method.h
error.$(OBJEXT): {$(VPATH)}missing.h
error.$(OBJEXT): {$(VPATH)}node.h
-error.$(OBJEXT): {$(VPATH)}onigmo.h
error.$(OBJEXT): {$(VPATH)}oniguruma.h
-error.$(OBJEXT): {$(VPATH)}ruby_assert.h
error.$(OBJEXT): {$(VPATH)}ruby_atomic.h
error.$(OBJEXT): {$(VPATH)}st.h
error.$(OBJEXT): {$(VPATH)}subst.h
@@ -1937,14 +1457,10 @@ eval.$(OBJEXT): {$(VPATH)}io.h
eval.$(OBJEXT): {$(VPATH)}iseq.h
eval.$(OBJEXT): {$(VPATH)}method.h
eval.$(OBJEXT): {$(VPATH)}missing.h
-eval.$(OBJEXT): {$(VPATH)}mjit.h
eval.$(OBJEXT): {$(VPATH)}node.h
-eval.$(OBJEXT): {$(VPATH)}onigmo.h
eval.$(OBJEXT): {$(VPATH)}oniguruma.h
-eval.$(OBJEXT): {$(VPATH)}probes.dmyh
eval.$(OBJEXT): {$(VPATH)}probes.h
eval.$(OBJEXT): {$(VPATH)}probes_helper.h
-eval.$(OBJEXT): {$(VPATH)}ruby_assert.h
eval.$(OBJEXT): {$(VPATH)}ruby_atomic.h
eval.$(OBJEXT): {$(VPATH)}st.h
eval.$(OBJEXT): {$(VPATH)}subst.h
@@ -1954,9 +1470,6 @@ eval.$(OBJEXT): {$(VPATH)}vm.h
eval.$(OBJEXT): {$(VPATH)}vm_core.h
eval.$(OBJEXT): {$(VPATH)}vm_debug.h
eval.$(OBJEXT): {$(VPATH)}vm_opts.h
-explicit_bzero.$(OBJEXT): {$(VPATH)}config.h
-explicit_bzero.$(OBJEXT): {$(VPATH)}explicit_bzero.c
-explicit_bzero.$(OBJEXT): {$(VPATH)}missing.h
file.$(OBJEXT): $(hdrdir)/ruby/ruby.h
file.$(OBJEXT): $(top_srcdir)/include/ruby.h
file.$(OBJEXT): {$(VPATH)}config.h
@@ -1965,16 +1478,13 @@ file.$(OBJEXT): {$(VPATH)}dln.h
file.$(OBJEXT): {$(VPATH)}encindex.h
file.$(OBJEXT): {$(VPATH)}encoding.h
file.$(OBJEXT): {$(VPATH)}file.c
-file.$(OBJEXT): {$(VPATH)}id.h
file.$(OBJEXT): {$(VPATH)}intern.h
file.$(OBJEXT): {$(VPATH)}internal.h
file.$(OBJEXT): {$(VPATH)}io.h
file.$(OBJEXT): {$(VPATH)}missing.h
-file.$(OBJEXT): {$(VPATH)}onigmo.h
file.$(OBJEXT): {$(VPATH)}oniguruma.h
file.$(OBJEXT): {$(VPATH)}st.h
file.$(OBJEXT): {$(VPATH)}subst.h
-file.$(OBJEXT): {$(VPATH)}thread.h
file.$(OBJEXT): {$(VPATH)}util.h
gc.$(OBJEXT): $(CCAN_DIR)/check_type/check_type.h
gc.$(OBJEXT): $(CCAN_DIR)/container_of/container_of.h
@@ -1985,7 +1495,6 @@ gc.$(OBJEXT): $(top_srcdir)/include/ruby.h
gc.$(OBJEXT): {$(VPATH)}config.h
gc.$(OBJEXT): {$(VPATH)}constant.h
gc.$(OBJEXT): {$(VPATH)}debug.h
-gc.$(OBJEXT): {$(VPATH)}debug_counter.h
gc.$(OBJEXT): {$(VPATH)}defines.h
gc.$(OBJEXT): {$(VPATH)}encoding.h
gc.$(OBJEXT): {$(VPATH)}eval_intern.h
@@ -1998,24 +1507,19 @@ gc.$(OBJEXT): {$(VPATH)}internal.h
gc.$(OBJEXT): {$(VPATH)}io.h
gc.$(OBJEXT): {$(VPATH)}method.h
gc.$(OBJEXT): {$(VPATH)}missing.h
-gc.$(OBJEXT): {$(VPATH)}mjit.h
gc.$(OBJEXT): {$(VPATH)}node.h
-gc.$(OBJEXT): {$(VPATH)}onigmo.h
gc.$(OBJEXT): {$(VPATH)}oniguruma.h
-gc.$(OBJEXT): {$(VPATH)}probes.dmyh
gc.$(OBJEXT): {$(VPATH)}probes.h
gc.$(OBJEXT): {$(VPATH)}re.h
gc.$(OBJEXT): {$(VPATH)}regenc.h
gc.$(OBJEXT): {$(VPATH)}regex.h
gc.$(OBJEXT): {$(VPATH)}regint.h
-gc.$(OBJEXT): {$(VPATH)}ruby_assert.h
gc.$(OBJEXT): {$(VPATH)}ruby_atomic.h
gc.$(OBJEXT): {$(VPATH)}st.h
gc.$(OBJEXT): {$(VPATH)}subst.h
gc.$(OBJEXT): {$(VPATH)}thread.h
gc.$(OBJEXT): {$(VPATH)}thread_$(THREAD_MODEL).h
gc.$(OBJEXT): {$(VPATH)}thread_native.h
-gc.$(OBJEXT): {$(VPATH)}transient_heap.h
gc.$(OBJEXT): {$(VPATH)}util.h
gc.$(OBJEXT): {$(VPATH)}vm_core.h
gc.$(OBJEXT): {$(VPATH)}vm_debug.h
@@ -2030,18 +1534,14 @@ golf_prelude.$(OBJEXT): {$(VPATH)}config.h
golf_prelude.$(OBJEXT): {$(VPATH)}defines.h
golf_prelude.$(OBJEXT): {$(VPATH)}encoding.h
golf_prelude.$(OBJEXT): {$(VPATH)}golf_prelude.c
-golf_prelude.$(OBJEXT): {$(VPATH)}golf_prelude.rb
golf_prelude.$(OBJEXT): {$(VPATH)}id.h
golf_prelude.$(OBJEXT): {$(VPATH)}intern.h
golf_prelude.$(OBJEXT): {$(VPATH)}internal.h
golf_prelude.$(OBJEXT): {$(VPATH)}io.h
-golf_prelude.$(OBJEXT): {$(VPATH)}iseq.h
golf_prelude.$(OBJEXT): {$(VPATH)}method.h
golf_prelude.$(OBJEXT): {$(VPATH)}missing.h
golf_prelude.$(OBJEXT): {$(VPATH)}node.h
-golf_prelude.$(OBJEXT): {$(VPATH)}onigmo.h
golf_prelude.$(OBJEXT): {$(VPATH)}oniguruma.h
-golf_prelude.$(OBJEXT): {$(VPATH)}ruby_assert.h
golf_prelude.$(OBJEXT): {$(VPATH)}ruby_atomic.h
golf_prelude.$(OBJEXT): {$(VPATH)}st.h
golf_prelude.$(OBJEXT): {$(VPATH)}subst.h
@@ -2052,7 +1552,6 @@ golf_prelude.$(OBJEXT): {$(VPATH)}vm_debug.h
golf_prelude.$(OBJEXT): {$(VPATH)}vm_opts.h
goruby.$(OBJEXT): $(hdrdir)/ruby/ruby.h
goruby.$(OBJEXT): $(top_srcdir)/include/ruby.h
-goruby.$(OBJEXT): {$(VPATH)}backward.h
goruby.$(OBJEXT): {$(VPATH)}config.h
goruby.$(OBJEXT): {$(VPATH)}defines.h
goruby.$(OBJEXT): {$(VPATH)}goruby.c
@@ -2066,26 +1565,21 @@ goruby.$(OBJEXT): {$(VPATH)}vm_debug.h
hash.$(OBJEXT): $(hdrdir)/ruby/ruby.h
hash.$(OBJEXT): $(top_srcdir)/include/ruby.h
hash.$(OBJEXT): {$(VPATH)}config.h
-hash.$(OBJEXT): {$(VPATH)}debug_counter.h
hash.$(OBJEXT): {$(VPATH)}defines.h
hash.$(OBJEXT): {$(VPATH)}encoding.h
-hash.$(OBJEXT): {$(VPATH)}gc.h
hash.$(OBJEXT): {$(VPATH)}hash.c
hash.$(OBJEXT): {$(VPATH)}id.h
hash.$(OBJEXT): {$(VPATH)}intern.h
hash.$(OBJEXT): {$(VPATH)}internal.h
hash.$(OBJEXT): {$(VPATH)}io.h
hash.$(OBJEXT): {$(VPATH)}missing.h
-hash.$(OBJEXT): {$(VPATH)}onigmo.h
hash.$(OBJEXT): {$(VPATH)}oniguruma.h
-hash.$(OBJEXT): {$(VPATH)}probes.dmyh
hash.$(OBJEXT): {$(VPATH)}probes.h
-hash.$(OBJEXT): {$(VPATH)}ruby_assert.h
hash.$(OBJEXT): {$(VPATH)}st.h
hash.$(OBJEXT): {$(VPATH)}subst.h
hash.$(OBJEXT): {$(VPATH)}symbol.h
-hash.$(OBJEXT): {$(VPATH)}transient_heap.h
hash.$(OBJEXT): {$(VPATH)}util.h
+hash.$(OBJEXT): {$(VPATH)}vm_opts.h
inits.$(OBJEXT): $(hdrdir)/ruby/ruby.h
inits.$(OBJEXT): $(top_srcdir)/include/ruby.h
inits.$(OBJEXT): {$(VPATH)}config.h
@@ -2096,14 +1590,9 @@ inits.$(OBJEXT): {$(VPATH)}intern.h
inits.$(OBJEXT): {$(VPATH)}internal.h
inits.$(OBJEXT): {$(VPATH)}io.h
inits.$(OBJEXT): {$(VPATH)}missing.h
-inits.$(OBJEXT): {$(VPATH)}onigmo.h
inits.$(OBJEXT): {$(VPATH)}oniguruma.h
inits.$(OBJEXT): {$(VPATH)}st.h
inits.$(OBJEXT): {$(VPATH)}subst.h
-io.$(OBJEXT): $(CCAN_DIR)/check_type/check_type.h
-io.$(OBJEXT): $(CCAN_DIR)/container_of/container_of.h
-io.$(OBJEXT): $(CCAN_DIR)/list/list.h
-io.$(OBJEXT): $(CCAN_DIR)/str/str.h
io.$(OBJEXT): $(hdrdir)/ruby/ruby.h
io.$(OBJEXT): $(top_srcdir)/include/ruby.h
io.$(OBJEXT): {$(VPATH)}config.h
@@ -2116,21 +1605,13 @@ io.$(OBJEXT): {$(VPATH)}intern.h
io.$(OBJEXT): {$(VPATH)}internal.h
io.$(OBJEXT): {$(VPATH)}io.c
io.$(OBJEXT): {$(VPATH)}io.h
-io.$(OBJEXT): {$(VPATH)}method.h
io.$(OBJEXT): {$(VPATH)}missing.h
-io.$(OBJEXT): {$(VPATH)}node.h
-io.$(OBJEXT): {$(VPATH)}onigmo.h
io.$(OBJEXT): {$(VPATH)}oniguruma.h
-io.$(OBJEXT): {$(VPATH)}ruby_assert.h
io.$(OBJEXT): {$(VPATH)}ruby_atomic.h
io.$(OBJEXT): {$(VPATH)}st.h
io.$(OBJEXT): {$(VPATH)}subst.h
io.$(OBJEXT): {$(VPATH)}thread.h
-io.$(OBJEXT): {$(VPATH)}thread_$(THREAD_MODEL).h
-io.$(OBJEXT): {$(VPATH)}thread_native.h
io.$(OBJEXT): {$(VPATH)}util.h
-io.$(OBJEXT): {$(VPATH)}vm_core.h
-io.$(OBJEXT): {$(VPATH)}vm_opts.h
iseq.$(OBJEXT): $(CCAN_DIR)/check_type/check_type.h
iseq.$(OBJEXT): $(CCAN_DIR)/container_of/container_of.h
iseq.$(OBJEXT): $(CCAN_DIR)/list/list.h
@@ -2143,8 +1624,6 @@ iseq.$(OBJEXT): {$(VPATH)}encoding.h
iseq.$(OBJEXT): {$(VPATH)}eval_intern.h
iseq.$(OBJEXT): {$(VPATH)}gc.h
iseq.$(OBJEXT): {$(VPATH)}id.h
-iseq.$(OBJEXT): {$(VPATH)}id_table.h
-iseq.$(OBJEXT): {$(VPATH)}insns.def
iseq.$(OBJEXT): {$(VPATH)}insns.inc
iseq.$(OBJEXT): {$(VPATH)}insns_info.inc
iseq.$(OBJEXT): {$(VPATH)}intern.h
@@ -2154,12 +1633,9 @@ iseq.$(OBJEXT): {$(VPATH)}iseq.c
iseq.$(OBJEXT): {$(VPATH)}iseq.h
iseq.$(OBJEXT): {$(VPATH)}method.h
iseq.$(OBJEXT): {$(VPATH)}missing.h
-iseq.$(OBJEXT): {$(VPATH)}mjit.h
iseq.$(OBJEXT): {$(VPATH)}node.h
iseq.$(OBJEXT): {$(VPATH)}node_name.inc
-iseq.$(OBJEXT): {$(VPATH)}onigmo.h
iseq.$(OBJEXT): {$(VPATH)}oniguruma.h
-iseq.$(OBJEXT): {$(VPATH)}ruby_assert.h
iseq.$(OBJEXT): {$(VPATH)}ruby_atomic.h
iseq.$(OBJEXT): {$(VPATH)}st.h
iseq.$(OBJEXT): {$(VPATH)}subst.h
@@ -2188,11 +1664,8 @@ load.$(OBJEXT): {$(VPATH)}load.c
load.$(OBJEXT): {$(VPATH)}method.h
load.$(OBJEXT): {$(VPATH)}missing.h
load.$(OBJEXT): {$(VPATH)}node.h
-load.$(OBJEXT): {$(VPATH)}onigmo.h
load.$(OBJEXT): {$(VPATH)}oniguruma.h
-load.$(OBJEXT): {$(VPATH)}probes.dmyh
load.$(OBJEXT): {$(VPATH)}probes.h
-load.$(OBJEXT): {$(VPATH)}ruby_assert.h
load.$(OBJEXT): {$(VPATH)}ruby_atomic.h
load.$(OBJEXT): {$(VPATH)}st.h
load.$(OBJEXT): {$(VPATH)}subst.h
@@ -2224,13 +1697,11 @@ localeinit.$(OBJEXT): {$(VPATH)}internal.h
localeinit.$(OBJEXT): {$(VPATH)}io.h
localeinit.$(OBJEXT): {$(VPATH)}localeinit.c
localeinit.$(OBJEXT): {$(VPATH)}missing.h
-localeinit.$(OBJEXT): {$(VPATH)}onigmo.h
localeinit.$(OBJEXT): {$(VPATH)}oniguruma.h
localeinit.$(OBJEXT): {$(VPATH)}st.h
localeinit.$(OBJEXT): {$(VPATH)}subst.h
main.$(OBJEXT): $(hdrdir)/ruby/ruby.h
main.$(OBJEXT): $(top_srcdir)/include/ruby.h
-main.$(OBJEXT): {$(VPATH)}backward.h
main.$(OBJEXT): {$(VPATH)}config.h
main.$(OBJEXT): {$(VPATH)}defines.h
main.$(OBJEXT): {$(VPATH)}intern.h
@@ -2252,7 +1723,6 @@ marshal.$(OBJEXT): {$(VPATH)}internal.h
marshal.$(OBJEXT): {$(VPATH)}io.h
marshal.$(OBJEXT): {$(VPATH)}marshal.c
marshal.$(OBJEXT): {$(VPATH)}missing.h
-marshal.$(OBJEXT): {$(VPATH)}onigmo.h
marshal.$(OBJEXT): {$(VPATH)}oniguruma.h
marshal.$(OBJEXT): {$(VPATH)}st.h
marshal.$(OBJEXT): {$(VPATH)}subst.h
@@ -2267,7 +1737,6 @@ math.$(OBJEXT): {$(VPATH)}internal.h
math.$(OBJEXT): {$(VPATH)}io.h
math.$(OBJEXT): {$(VPATH)}math.c
math.$(OBJEXT): {$(VPATH)}missing.h
-math.$(OBJEXT): {$(VPATH)}onigmo.h
math.$(OBJEXT): {$(VPATH)}oniguruma.h
math.$(OBJEXT): {$(VPATH)}st.h
math.$(OBJEXT): {$(VPATH)}subst.h
@@ -2278,76 +1747,10 @@ miniinit.$(OBJEXT): {$(VPATH)}encoding.h
miniinit.$(OBJEXT): {$(VPATH)}intern.h
miniinit.$(OBJEXT): {$(VPATH)}miniinit.c
miniinit.$(OBJEXT): {$(VPATH)}missing.h
-miniinit.$(OBJEXT): {$(VPATH)}onigmo.h
miniinit.$(OBJEXT): {$(VPATH)}oniguruma.h
miniinit.$(OBJEXT): {$(VPATH)}st.h
miniinit.$(OBJEXT): {$(VPATH)}subst.h
-miniprelude.$(OBJEXT): {$(VPATH)}iseq.h
miniprelude.$(OBJEXT): {$(VPATH)}miniprelude.c
-mjit.$(OBJEXT): $(CCAN_DIR)/check_type/check_type.h
-mjit.$(OBJEXT): $(CCAN_DIR)/container_of/container_of.h
-mjit.$(OBJEXT): $(CCAN_DIR)/list/list.h
-mjit.$(OBJEXT): $(CCAN_DIR)/str/str.h
-mjit.$(OBJEXT): $(hdrdir)/ruby/ruby.h
-mjit.$(OBJEXT): $(top_srcdir)/include/ruby.h
-mjit.$(OBJEXT): {$(VPATH)}config.h
-mjit.$(OBJEXT): {$(VPATH)}constant.h
-mjit.$(OBJEXT): {$(VPATH)}debug.h
-mjit.$(OBJEXT): {$(VPATH)}defines.h
-mjit.$(OBJEXT): {$(VPATH)}dln.h
-mjit.$(OBJEXT): {$(VPATH)}gc.h
-mjit.$(OBJEXT): {$(VPATH)}id.h
-mjit.$(OBJEXT): {$(VPATH)}id_table.h
-mjit.$(OBJEXT): {$(VPATH)}intern.h
-mjit.$(OBJEXT): {$(VPATH)}internal.h
-mjit.$(OBJEXT): {$(VPATH)}method.h
-mjit.$(OBJEXT): {$(VPATH)}missing.h
-mjit.$(OBJEXT): {$(VPATH)}mjit.c
-mjit.$(OBJEXT): {$(VPATH)}mjit.h
-mjit.$(OBJEXT): {$(VPATH)}mjit_config.h
-mjit.$(OBJEXT): {$(VPATH)}mjit_worker.c
-mjit.$(OBJEXT): {$(VPATH)}node.h
-mjit.$(OBJEXT): {$(VPATH)}ruby_assert.h
-mjit.$(OBJEXT): {$(VPATH)}ruby_atomic.h
-mjit.$(OBJEXT): {$(VPATH)}st.h
-mjit.$(OBJEXT): {$(VPATH)}subst.h
-mjit.$(OBJEXT): {$(VPATH)}thread.h
-mjit.$(OBJEXT): {$(VPATH)}thread_$(THREAD_MODEL).h
-mjit.$(OBJEXT): {$(VPATH)}thread_native.h
-mjit.$(OBJEXT): {$(VPATH)}util.h
-mjit.$(OBJEXT): {$(VPATH)}vm_core.h
-mjit.$(OBJEXT): {$(VPATH)}vm_opts.h
-mjit_compile.$(OBJEXT): $(CCAN_DIR)/check_type/check_type.h
-mjit_compile.$(OBJEXT): $(CCAN_DIR)/container_of/container_of.h
-mjit_compile.$(OBJEXT): $(CCAN_DIR)/list/list.h
-mjit_compile.$(OBJEXT): $(CCAN_DIR)/str/str.h
-mjit_compile.$(OBJEXT): $(hdrdir)/ruby/ruby.h
-mjit_compile.$(OBJEXT): $(top_srcdir)/include/ruby.h
-mjit_compile.$(OBJEXT): {$(VPATH)}config.h
-mjit_compile.$(OBJEXT): {$(VPATH)}defines.h
-mjit_compile.$(OBJEXT): {$(VPATH)}id.h
-mjit_compile.$(OBJEXT): {$(VPATH)}insns.def
-mjit_compile.$(OBJEXT): {$(VPATH)}insns.inc
-mjit_compile.$(OBJEXT): {$(VPATH)}insns_info.inc
-mjit_compile.$(OBJEXT): {$(VPATH)}intern.h
-mjit_compile.$(OBJEXT): {$(VPATH)}internal.h
-mjit_compile.$(OBJEXT): {$(VPATH)}iseq.h
-mjit_compile.$(OBJEXT): {$(VPATH)}method.h
-mjit_compile.$(OBJEXT): {$(VPATH)}missing.h
-mjit_compile.$(OBJEXT): {$(VPATH)}mjit.h
-mjit_compile.$(OBJEXT): {$(VPATH)}mjit_compile.c
-mjit_compile.$(OBJEXT): {$(VPATH)}mjit_compile.inc
-mjit_compile.$(OBJEXT): {$(VPATH)}node.h
-mjit_compile.$(OBJEXT): {$(VPATH)}ruby_assert.h
-mjit_compile.$(OBJEXT): {$(VPATH)}ruby_atomic.h
-mjit_compile.$(OBJEXT): {$(VPATH)}st.h
-mjit_compile.$(OBJEXT): {$(VPATH)}subst.h
-mjit_compile.$(OBJEXT): {$(VPATH)}thread_$(THREAD_MODEL).h
-mjit_compile.$(OBJEXT): {$(VPATH)}thread_native.h
-mjit_compile.$(OBJEXT): {$(VPATH)}vm_core.h
-mjit_compile.$(OBJEXT): {$(VPATH)}vm_exec.h
-mjit_compile.$(OBJEXT): {$(VPATH)}vm_insnhelper.h
-mjit_compile.$(OBJEXT): {$(VPATH)}vm_opts.h
node.$(OBJEXT): $(CCAN_DIR)/check_type/check_type.h
node.$(OBJEXT): $(CCAN_DIR)/container_of/container_of.h
node.$(OBJEXT): $(CCAN_DIR)/list/list.h
@@ -2365,9 +1768,7 @@ node.$(OBJEXT): {$(VPATH)}method.h
node.$(OBJEXT): {$(VPATH)}missing.h
node.$(OBJEXT): {$(VPATH)}node.c
node.$(OBJEXT): {$(VPATH)}node.h
-node.$(OBJEXT): {$(VPATH)}onigmo.h
node.$(OBJEXT): {$(VPATH)}oniguruma.h
-node.$(OBJEXT): {$(VPATH)}ruby_assert.h
node.$(OBJEXT): {$(VPATH)}ruby_atomic.h
node.$(OBJEXT): {$(VPATH)}st.h
node.$(OBJEXT): {$(VPATH)}subst.h
@@ -2387,7 +1788,6 @@ numeric.$(OBJEXT): {$(VPATH)}internal.h
numeric.$(OBJEXT): {$(VPATH)}io.h
numeric.$(OBJEXT): {$(VPATH)}missing.h
numeric.$(OBJEXT): {$(VPATH)}numeric.c
-numeric.$(OBJEXT): {$(VPATH)}onigmo.h
numeric.$(OBJEXT): {$(VPATH)}oniguruma.h
numeric.$(OBJEXT): {$(VPATH)}st.h
numeric.$(OBJEXT): {$(VPATH)}subst.h
@@ -2404,13 +1804,12 @@ object.$(OBJEXT): {$(VPATH)}internal.h
object.$(OBJEXT): {$(VPATH)}io.h
object.$(OBJEXT): {$(VPATH)}missing.h
object.$(OBJEXT): {$(VPATH)}object.c
-object.$(OBJEXT): {$(VPATH)}onigmo.h
object.$(OBJEXT): {$(VPATH)}oniguruma.h
-object.$(OBJEXT): {$(VPATH)}probes.dmyh
object.$(OBJEXT): {$(VPATH)}probes.h
object.$(OBJEXT): {$(VPATH)}st.h
object.$(OBJEXT): {$(VPATH)}subst.h
object.$(OBJEXT): {$(VPATH)}util.h
+object.$(OBJEXT): {$(VPATH)}vm_opts.h
pack.$(OBJEXT): $(hdrdir)/ruby/ruby.h
pack.$(OBJEXT): $(top_srcdir)/include/ruby.h
pack.$(OBJEXT): {$(VPATH)}config.h
@@ -2420,7 +1819,6 @@ pack.$(OBJEXT): {$(VPATH)}intern.h
pack.$(OBJEXT): {$(VPATH)}internal.h
pack.$(OBJEXT): {$(VPATH)}io.h
pack.$(OBJEXT): {$(VPATH)}missing.h
-pack.$(OBJEXT): {$(VPATH)}onigmo.h
pack.$(OBJEXT): {$(VPATH)}oniguruma.h
pack.$(OBJEXT): {$(VPATH)}pack.c
pack.$(OBJEXT): {$(VPATH)}st.h
@@ -2438,12 +1836,10 @@ parse.$(OBJEXT): {$(VPATH)}io.h
parse.$(OBJEXT): {$(VPATH)}lex.c
parse.$(OBJEXT): {$(VPATH)}missing.h
parse.$(OBJEXT): {$(VPATH)}node.h
-parse.$(OBJEXT): {$(VPATH)}onigmo.h
parse.$(OBJEXT): {$(VPATH)}oniguruma.h
parse.$(OBJEXT): {$(VPATH)}parse.c
parse.$(OBJEXT): {$(VPATH)}parse.h
parse.$(OBJEXT): {$(VPATH)}parse.y
-parse.$(OBJEXT): {$(VPATH)}probes.dmyh
parse.$(OBJEXT): {$(VPATH)}probes.h
parse.$(OBJEXT): {$(VPATH)}regenc.h
parse.$(OBJEXT): {$(VPATH)}regex.h
@@ -2451,6 +1847,7 @@ parse.$(OBJEXT): {$(VPATH)}st.h
parse.$(OBJEXT): {$(VPATH)}subst.h
parse.$(OBJEXT): {$(VPATH)}symbol.h
parse.$(OBJEXT): {$(VPATH)}util.h
+parse.$(OBJEXT): {$(VPATH)}vm_opts.h
prelude.$(OBJEXT): $(CCAN_DIR)/check_type/check_type.h
prelude.$(OBJEXT): $(CCAN_DIR)/container_of/container_of.h
prelude.$(OBJEXT): $(CCAN_DIR)/list/list.h
@@ -2460,20 +1857,15 @@ prelude.$(OBJEXT): $(top_srcdir)/include/ruby.h
prelude.$(OBJEXT): {$(VPATH)}config.h
prelude.$(OBJEXT): {$(VPATH)}defines.h
prelude.$(OBJEXT): {$(VPATH)}encoding.h
-prelude.$(OBJEXT): {$(VPATH)}gem_prelude.rb
prelude.$(OBJEXT): {$(VPATH)}id.h
prelude.$(OBJEXT): {$(VPATH)}intern.h
prelude.$(OBJEXT): {$(VPATH)}internal.h
prelude.$(OBJEXT): {$(VPATH)}io.h
-prelude.$(OBJEXT): {$(VPATH)}iseq.h
prelude.$(OBJEXT): {$(VPATH)}method.h
prelude.$(OBJEXT): {$(VPATH)}missing.h
prelude.$(OBJEXT): {$(VPATH)}node.h
-prelude.$(OBJEXT): {$(VPATH)}onigmo.h
prelude.$(OBJEXT): {$(VPATH)}oniguruma.h
prelude.$(OBJEXT): {$(VPATH)}prelude.c
-prelude.$(OBJEXT): {$(VPATH)}prelude.rb
-prelude.$(OBJEXT): {$(VPATH)}ruby_assert.h
prelude.$(OBJEXT): {$(VPATH)}ruby_atomic.h
prelude.$(OBJEXT): {$(VPATH)}st.h
prelude.$(OBJEXT): {$(VPATH)}subst.h
@@ -2501,10 +1893,8 @@ proc.$(OBJEXT): {$(VPATH)}iseq.h
proc.$(OBJEXT): {$(VPATH)}method.h
proc.$(OBJEXT): {$(VPATH)}missing.h
proc.$(OBJEXT): {$(VPATH)}node.h
-proc.$(OBJEXT): {$(VPATH)}onigmo.h
proc.$(OBJEXT): {$(VPATH)}oniguruma.h
proc.$(OBJEXT): {$(VPATH)}proc.c
-proc.$(OBJEXT): {$(VPATH)}ruby_assert.h
proc.$(OBJEXT): {$(VPATH)}ruby_atomic.h
proc.$(OBJEXT): {$(VPATH)}st.h
proc.$(OBJEXT): {$(VPATH)}subst.h
@@ -2523,7 +1913,6 @@ process.$(OBJEXT): {$(VPATH)}config.h
process.$(OBJEXT): {$(VPATH)}defines.h
process.$(OBJEXT): {$(VPATH)}dln.h
process.$(OBJEXT): {$(VPATH)}encoding.h
-process.$(OBJEXT): {$(VPATH)}hrtime.h
process.$(OBJEXT): {$(VPATH)}id.h
process.$(OBJEXT): {$(VPATH)}intern.h
process.$(OBJEXT): {$(VPATH)}internal.h
@@ -2531,10 +1920,8 @@ process.$(OBJEXT): {$(VPATH)}io.h
process.$(OBJEXT): {$(VPATH)}method.h
process.$(OBJEXT): {$(VPATH)}missing.h
process.$(OBJEXT): {$(VPATH)}node.h
-process.$(OBJEXT): {$(VPATH)}onigmo.h
process.$(OBJEXT): {$(VPATH)}oniguruma.h
process.$(OBJEXT): {$(VPATH)}process.c
-process.$(OBJEXT): {$(VPATH)}ruby_assert.h
process.$(OBJEXT): {$(VPATH)}ruby_atomic.h
process.$(OBJEXT): {$(VPATH)}st.h
process.$(OBJEXT): {$(VPATH)}subst.h
@@ -2554,7 +1941,6 @@ random.$(OBJEXT): {$(VPATH)}intern.h
random.$(OBJEXT): {$(VPATH)}internal.h
random.$(OBJEXT): {$(VPATH)}io.h
random.$(OBJEXT): {$(VPATH)}missing.h
-random.$(OBJEXT): {$(VPATH)}onigmo.h
random.$(OBJEXT): {$(VPATH)}oniguruma.h
random.$(OBJEXT): {$(VPATH)}random.c
random.$(OBJEXT): {$(VPATH)}ruby_atomic.h
@@ -2572,7 +1958,6 @@ range.$(OBJEXT): {$(VPATH)}intern.h
range.$(OBJEXT): {$(VPATH)}internal.h
range.$(OBJEXT): {$(VPATH)}io.h
range.$(OBJEXT): {$(VPATH)}missing.h
-range.$(OBJEXT): {$(VPATH)}onigmo.h
range.$(OBJEXT): {$(VPATH)}oniguruma.h
range.$(OBJEXT): {$(VPATH)}range.c
range.$(OBJEXT): {$(VPATH)}st.h
@@ -2582,15 +1967,12 @@ rational.$(OBJEXT): $(top_srcdir)/include/ruby.h
rational.$(OBJEXT): {$(VPATH)}config.h
rational.$(OBJEXT): {$(VPATH)}defines.h
rational.$(OBJEXT): {$(VPATH)}encoding.h
-rational.$(OBJEXT): {$(VPATH)}id.h
rational.$(OBJEXT): {$(VPATH)}intern.h
rational.$(OBJEXT): {$(VPATH)}internal.h
rational.$(OBJEXT): {$(VPATH)}io.h
rational.$(OBJEXT): {$(VPATH)}missing.h
-rational.$(OBJEXT): {$(VPATH)}onigmo.h
rational.$(OBJEXT): {$(VPATH)}oniguruma.h
rational.$(OBJEXT): {$(VPATH)}rational.c
-rational.$(OBJEXT): {$(VPATH)}ruby_assert.h
rational.$(OBJEXT): {$(VPATH)}st.h
rational.$(OBJEXT): {$(VPATH)}subst.h
re.$(OBJEXT): $(hdrdir)/ruby/ruby.h
@@ -2603,7 +1985,6 @@ re.$(OBJEXT): {$(VPATH)}intern.h
re.$(OBJEXT): {$(VPATH)}internal.h
re.$(OBJEXT): {$(VPATH)}io.h
re.$(OBJEXT): {$(VPATH)}missing.h
-re.$(OBJEXT): {$(VPATH)}onigmo.h
re.$(OBJEXT): {$(VPATH)}oniguruma.h
re.$(OBJEXT): {$(VPATH)}re.c
re.$(OBJEXT): {$(VPATH)}re.h
@@ -2618,7 +1999,6 @@ regcomp.$(OBJEXT): {$(VPATH)}config.h
regcomp.$(OBJEXT): {$(VPATH)}defines.h
regcomp.$(OBJEXT): {$(VPATH)}intern.h
regcomp.$(OBJEXT): {$(VPATH)}missing.h
-regcomp.$(OBJEXT): {$(VPATH)}onigmo.h
regcomp.$(OBJEXT): {$(VPATH)}oniguruma.h
regcomp.$(OBJEXT): {$(VPATH)}regcomp.c
regcomp.$(OBJEXT): {$(VPATH)}regenc.h
@@ -2631,7 +2011,6 @@ regenc.$(OBJEXT): {$(VPATH)}config.h
regenc.$(OBJEXT): {$(VPATH)}defines.h
regenc.$(OBJEXT): {$(VPATH)}intern.h
regenc.$(OBJEXT): {$(VPATH)}missing.h
-regenc.$(OBJEXT): {$(VPATH)}onigmo.h
regenc.$(OBJEXT): {$(VPATH)}oniguruma.h
regenc.$(OBJEXT): {$(VPATH)}regenc.c
regenc.$(OBJEXT): {$(VPATH)}regenc.h
@@ -2643,7 +2022,6 @@ regerror.$(OBJEXT): {$(VPATH)}config.h
regerror.$(OBJEXT): {$(VPATH)}defines.h
regerror.$(OBJEXT): {$(VPATH)}intern.h
regerror.$(OBJEXT): {$(VPATH)}missing.h
-regerror.$(OBJEXT): {$(VPATH)}onigmo.h
regerror.$(OBJEXT): {$(VPATH)}oniguruma.h
regerror.$(OBJEXT): {$(VPATH)}regenc.h
regerror.$(OBJEXT): {$(VPATH)}regerror.c
@@ -2655,7 +2033,6 @@ regexec.$(OBJEXT): {$(VPATH)}config.h
regexec.$(OBJEXT): {$(VPATH)}defines.h
regexec.$(OBJEXT): {$(VPATH)}intern.h
regexec.$(OBJEXT): {$(VPATH)}missing.h
-regexec.$(OBJEXT): {$(VPATH)}onigmo.h
regexec.$(OBJEXT): {$(VPATH)}oniguruma.h
regexec.$(OBJEXT): {$(VPATH)}regenc.h
regexec.$(OBJEXT): {$(VPATH)}regexec.c
@@ -2667,7 +2044,6 @@ regparse.$(OBJEXT): {$(VPATH)}config.h
regparse.$(OBJEXT): {$(VPATH)}defines.h
regparse.$(OBJEXT): {$(VPATH)}intern.h
regparse.$(OBJEXT): {$(VPATH)}missing.h
-regparse.$(OBJEXT): {$(VPATH)}onigmo.h
regparse.$(OBJEXT): {$(VPATH)}oniguruma.h
regparse.$(OBJEXT): {$(VPATH)}regenc.h
regparse.$(OBJEXT): {$(VPATH)}regint.h
@@ -2680,22 +2056,17 @@ regsyntax.$(OBJEXT): {$(VPATH)}config.h
regsyntax.$(OBJEXT): {$(VPATH)}defines.h
regsyntax.$(OBJEXT): {$(VPATH)}intern.h
regsyntax.$(OBJEXT): {$(VPATH)}missing.h
-regsyntax.$(OBJEXT): {$(VPATH)}onigmo.h
regsyntax.$(OBJEXT): {$(VPATH)}oniguruma.h
regsyntax.$(OBJEXT): {$(VPATH)}regenc.h
regsyntax.$(OBJEXT): {$(VPATH)}regint.h
regsyntax.$(OBJEXT): {$(VPATH)}regsyntax.c
regsyntax.$(OBJEXT): {$(VPATH)}st.h
regsyntax.$(OBJEXT): {$(VPATH)}subst.h
-ruby-runner.$(OBJEXT): {$(VPATH)}config.h
-ruby-runner.$(OBJEXT): {$(VPATH)}ruby-runner.c
-ruby-runner.$(OBJEXT): {$(VPATH)}ruby-runner.h
ruby.$(OBJEXT): $(CCAN_DIR)/check_type/check_type.h
ruby.$(OBJEXT): $(CCAN_DIR)/container_of/container_of.h
ruby.$(OBJEXT): $(CCAN_DIR)/list/list.h
ruby.$(OBJEXT): $(CCAN_DIR)/str/str.h
ruby.$(OBJEXT): $(hdrdir)/ruby/ruby.h
-ruby.$(OBJEXT): $(hdrdir)/ruby/version.h
ruby.$(OBJEXT): $(top_srcdir)/include/ruby.h
ruby.$(OBJEXT): {$(VPATH)}config.h
ruby.$(OBJEXT): {$(VPATH)}defines.h
@@ -2708,12 +2079,9 @@ ruby.$(OBJEXT): {$(VPATH)}internal.h
ruby.$(OBJEXT): {$(VPATH)}io.h
ruby.$(OBJEXT): {$(VPATH)}method.h
ruby.$(OBJEXT): {$(VPATH)}missing.h
-ruby.$(OBJEXT): {$(VPATH)}mjit.h
ruby.$(OBJEXT): {$(VPATH)}node.h
-ruby.$(OBJEXT): {$(VPATH)}onigmo.h
ruby.$(OBJEXT): {$(VPATH)}oniguruma.h
ruby.$(OBJEXT): {$(VPATH)}ruby.c
-ruby.$(OBJEXT): {$(VPATH)}ruby_assert.h
ruby.$(OBJEXT): {$(VPATH)}ruby_atomic.h
ruby.$(OBJEXT): {$(VPATH)}st.h
ruby.$(OBJEXT): {$(VPATH)}subst.h
@@ -2740,9 +2108,7 @@ safe.$(OBJEXT): {$(VPATH)}io.h
safe.$(OBJEXT): {$(VPATH)}method.h
safe.$(OBJEXT): {$(VPATH)}missing.h
safe.$(OBJEXT): {$(VPATH)}node.h
-safe.$(OBJEXT): {$(VPATH)}onigmo.h
safe.$(OBJEXT): {$(VPATH)}oniguruma.h
-safe.$(OBJEXT): {$(VPATH)}ruby_assert.h
safe.$(OBJEXT): {$(VPATH)}ruby_atomic.h
safe.$(OBJEXT): {$(VPATH)}safe.c
safe.$(OBJEXT): {$(VPATH)}st.h
@@ -2769,7 +2135,6 @@ signal.$(OBJEXT): $(CCAN_DIR)/str/str.h
signal.$(OBJEXT): $(hdrdir)/ruby/ruby.h
signal.$(OBJEXT): $(top_srcdir)/include/ruby.h
signal.$(OBJEXT): {$(VPATH)}config.h
-signal.$(OBJEXT): {$(VPATH)}debug_counter.h
signal.$(OBJEXT): {$(VPATH)}defines.h
signal.$(OBJEXT): {$(VPATH)}encoding.h
signal.$(OBJEXT): {$(VPATH)}eval_intern.h
@@ -2780,9 +2145,7 @@ signal.$(OBJEXT): {$(VPATH)}io.h
signal.$(OBJEXT): {$(VPATH)}method.h
signal.$(OBJEXT): {$(VPATH)}missing.h
signal.$(OBJEXT): {$(VPATH)}node.h
-signal.$(OBJEXT): {$(VPATH)}onigmo.h
signal.$(OBJEXT): {$(VPATH)}oniguruma.h
-signal.$(OBJEXT): {$(VPATH)}ruby_assert.h
signal.$(OBJEXT): {$(VPATH)}ruby_atomic.h
signal.$(OBJEXT): {$(VPATH)}signal.c
signal.$(OBJEXT): {$(VPATH)}st.h
@@ -2802,7 +2165,6 @@ sprintf.$(OBJEXT): {$(VPATH)}intern.h
sprintf.$(OBJEXT): {$(VPATH)}internal.h
sprintf.$(OBJEXT): {$(VPATH)}io.h
sprintf.$(OBJEXT): {$(VPATH)}missing.h
-sprintf.$(OBJEXT): {$(VPATH)}onigmo.h
sprintf.$(OBJEXT): {$(VPATH)}oniguruma.h
sprintf.$(OBJEXT): {$(VPATH)}re.h
sprintf.$(OBJEXT): {$(VPATH)}regex.h
@@ -2823,21 +2185,16 @@ st.$(OBJEXT): {$(VPATH)}intern.h
st.$(OBJEXT): {$(VPATH)}internal.h
st.$(OBJEXT): {$(VPATH)}io.h
st.$(OBJEXT): {$(VPATH)}missing.h
-st.$(OBJEXT): {$(VPATH)}onigmo.h
st.$(OBJEXT): {$(VPATH)}oniguruma.h
st.$(OBJEXT): {$(VPATH)}st.c
st.$(OBJEXT): {$(VPATH)}st.h
st.$(OBJEXT): {$(VPATH)}subst.h
strftime.$(OBJEXT): $(hdrdir)/ruby/ruby.h
-strftime.$(OBJEXT): $(top_srcdir)/include/ruby.h
strftime.$(OBJEXT): {$(VPATH)}config.h
strftime.$(OBJEXT): {$(VPATH)}defines.h
strftime.$(OBJEXT): {$(VPATH)}encoding.h
strftime.$(OBJEXT): {$(VPATH)}intern.h
-strftime.$(OBJEXT): {$(VPATH)}internal.h
-strftime.$(OBJEXT): {$(VPATH)}io.h
strftime.$(OBJEXT): {$(VPATH)}missing.h
-strftime.$(OBJEXT): {$(VPATH)}onigmo.h
strftime.$(OBJEXT): {$(VPATH)}oniguruma.h
strftime.$(OBJEXT): {$(VPATH)}st.h
strftime.$(OBJEXT): {$(VPATH)}strftime.c
@@ -2846,8 +2203,6 @@ strftime.$(OBJEXT): {$(VPATH)}timev.h
string.$(OBJEXT): $(hdrdir)/ruby/ruby.h
string.$(OBJEXT): $(top_srcdir)/include/ruby.h
string.$(OBJEXT): {$(VPATH)}config.h
-string.$(OBJEXT): {$(VPATH)}crypt.h
-string.$(OBJEXT): {$(VPATH)}debug_counter.h
string.$(OBJEXT): {$(VPATH)}defines.h
string.$(OBJEXT): {$(VPATH)}encindex.h
string.$(OBJEXT): {$(VPATH)}encoding.h
@@ -2857,17 +2212,14 @@ string.$(OBJEXT): {$(VPATH)}intern.h
string.$(OBJEXT): {$(VPATH)}internal.h
string.$(OBJEXT): {$(VPATH)}io.h
string.$(OBJEXT): {$(VPATH)}missing.h
-string.$(OBJEXT): {$(VPATH)}onigmo.h
string.$(OBJEXT): {$(VPATH)}oniguruma.h
-string.$(OBJEXT): {$(VPATH)}probes.dmyh
string.$(OBJEXT): {$(VPATH)}probes.h
string.$(OBJEXT): {$(VPATH)}re.h
string.$(OBJEXT): {$(VPATH)}regex.h
-string.$(OBJEXT): {$(VPATH)}ruby_assert.h
string.$(OBJEXT): {$(VPATH)}st.h
string.$(OBJEXT): {$(VPATH)}string.c
string.$(OBJEXT): {$(VPATH)}subst.h
-string.$(OBJEXT): {$(VPATH)}util.h
+string.$(OBJEXT): {$(VPATH)}vm_opts.h
strlcat.$(OBJEXT): {$(VPATH)}config.h
strlcat.$(OBJEXT): {$(VPATH)}missing.h
strlcat.$(OBJEXT): {$(VPATH)}strlcat.c
@@ -2890,16 +2242,13 @@ struct.$(OBJEXT): {$(VPATH)}io.h
struct.$(OBJEXT): {$(VPATH)}method.h
struct.$(OBJEXT): {$(VPATH)}missing.h
struct.$(OBJEXT): {$(VPATH)}node.h
-struct.$(OBJEXT): {$(VPATH)}onigmo.h
struct.$(OBJEXT): {$(VPATH)}oniguruma.h
-struct.$(OBJEXT): {$(VPATH)}ruby_assert.h
struct.$(OBJEXT): {$(VPATH)}ruby_atomic.h
struct.$(OBJEXT): {$(VPATH)}st.h
struct.$(OBJEXT): {$(VPATH)}struct.c
struct.$(OBJEXT): {$(VPATH)}subst.h
struct.$(OBJEXT): {$(VPATH)}thread_$(THREAD_MODEL).h
struct.$(OBJEXT): {$(VPATH)}thread_native.h
-struct.$(OBJEXT): {$(VPATH)}transient_heap.h
struct.$(OBJEXT): {$(VPATH)}vm_core.h
struct.$(OBJEXT): {$(VPATH)}vm_debug.h
struct.$(OBJEXT): {$(VPATH)}vm_opts.h
@@ -2911,21 +2260,19 @@ symbol.$(OBJEXT): {$(VPATH)}encoding.h
symbol.$(OBJEXT): {$(VPATH)}gc.h
symbol.$(OBJEXT): {$(VPATH)}id.c
symbol.$(OBJEXT): {$(VPATH)}id.h
-symbol.$(OBJEXT): {$(VPATH)}id_table.c
-symbol.$(OBJEXT): {$(VPATH)}id_table.h
symbol.$(OBJEXT): {$(VPATH)}intern.h
symbol.$(OBJEXT): {$(VPATH)}internal.h
symbol.$(OBJEXT): {$(VPATH)}io.h
symbol.$(OBJEXT): {$(VPATH)}missing.h
-symbol.$(OBJEXT): {$(VPATH)}onigmo.h
symbol.$(OBJEXT): {$(VPATH)}oniguruma.h
-symbol.$(OBJEXT): {$(VPATH)}probes.dmyh
symbol.$(OBJEXT): {$(VPATH)}probes.h
-symbol.$(OBJEXT): {$(VPATH)}ruby_assert.h
symbol.$(OBJEXT): {$(VPATH)}st.h
symbol.$(OBJEXT): {$(VPATH)}subst.h
symbol.$(OBJEXT): {$(VPATH)}symbol.c
+symbol.$(OBJEXT): {$(VPATH)}id_table.c
+symbol.$(OBJEXT): {$(VPATH)}id_table.h
symbol.$(OBJEXT): {$(VPATH)}symbol.h
+symbol.$(OBJEXT): {$(VPATH)}vm_opts.h
thread.$(OBJEXT): $(CCAN_DIR)/check_type/check_type.h
thread.$(OBJEXT): $(CCAN_DIR)/container_of/container_of.h
thread.$(OBJEXT): $(CCAN_DIR)/list/list.h
@@ -2933,24 +2280,18 @@ thread.$(OBJEXT): $(CCAN_DIR)/str/str.h
thread.$(OBJEXT): $(hdrdir)/ruby/ruby.h
thread.$(OBJEXT): $(top_srcdir)/include/ruby.h
thread.$(OBJEXT): {$(VPATH)}config.h
-thread.$(OBJEXT): {$(VPATH)}debug.h
thread.$(OBJEXT): {$(VPATH)}defines.h
thread.$(OBJEXT): {$(VPATH)}encoding.h
thread.$(OBJEXT): {$(VPATH)}eval_intern.h
thread.$(OBJEXT): {$(VPATH)}gc.h
-thread.$(OBJEXT): {$(VPATH)}hrtime.h
thread.$(OBJEXT): {$(VPATH)}id.h
thread.$(OBJEXT): {$(VPATH)}intern.h
thread.$(OBJEXT): {$(VPATH)}internal.h
thread.$(OBJEXT): {$(VPATH)}io.h
-thread.$(OBJEXT): {$(VPATH)}iseq.h
thread.$(OBJEXT): {$(VPATH)}method.h
thread.$(OBJEXT): {$(VPATH)}missing.h
-thread.$(OBJEXT): {$(VPATH)}mjit.h
thread.$(OBJEXT): {$(VPATH)}node.h
-thread.$(OBJEXT): {$(VPATH)}onigmo.h
thread.$(OBJEXT): {$(VPATH)}oniguruma.h
-thread.$(OBJEXT): {$(VPATH)}ruby_assert.h
thread.$(OBJEXT): {$(VPATH)}ruby_atomic.h
thread.$(OBJEXT): {$(VPATH)}st.h
thread.$(OBJEXT): {$(VPATH)}subst.h
@@ -2969,12 +2310,10 @@ time.$(OBJEXT): $(top_srcdir)/include/ruby.h
time.$(OBJEXT): {$(VPATH)}config.h
time.$(OBJEXT): {$(VPATH)}defines.h
time.$(OBJEXT): {$(VPATH)}encoding.h
-time.$(OBJEXT): {$(VPATH)}id.h
time.$(OBJEXT): {$(VPATH)}intern.h
time.$(OBJEXT): {$(VPATH)}internal.h
time.$(OBJEXT): {$(VPATH)}io.h
time.$(OBJEXT): {$(VPATH)}missing.h
-time.$(OBJEXT): {$(VPATH)}onigmo.h
time.$(OBJEXT): {$(VPATH)}oniguruma.h
time.$(OBJEXT): {$(VPATH)}st.h
time.$(OBJEXT): {$(VPATH)}subst.h
@@ -2989,29 +2328,11 @@ transcode.$(OBJEXT): {$(VPATH)}intern.h
transcode.$(OBJEXT): {$(VPATH)}internal.h
transcode.$(OBJEXT): {$(VPATH)}io.h
transcode.$(OBJEXT): {$(VPATH)}missing.h
-transcode.$(OBJEXT): {$(VPATH)}onigmo.h
transcode.$(OBJEXT): {$(VPATH)}oniguruma.h
transcode.$(OBJEXT): {$(VPATH)}st.h
transcode.$(OBJEXT): {$(VPATH)}subst.h
transcode.$(OBJEXT): {$(VPATH)}transcode.c
transcode.$(OBJEXT): {$(VPATH)}transcode_data.h
-transient_heap.$(OBJEXT): $(hdrdir)/ruby/ruby.h
-transient_heap.$(OBJEXT): $(top_srcdir)/include/ruby.h
-transient_heap.$(OBJEXT): {$(VPATH)}config.h
-transient_heap.$(OBJEXT): {$(VPATH)}debug.h
-transient_heap.$(OBJEXT): {$(VPATH)}debug_counter.h
-transient_heap.$(OBJEXT): {$(VPATH)}defines.h
-transient_heap.$(OBJEXT): {$(VPATH)}gc.h
-transient_heap.$(OBJEXT): {$(VPATH)}intern.h
-transient_heap.$(OBJEXT): {$(VPATH)}internal.h
-transient_heap.$(OBJEXT): {$(VPATH)}missing.h
-transient_heap.$(OBJEXT): {$(VPATH)}node.h
-transient_heap.$(OBJEXT): {$(VPATH)}ruby_assert.h
-transient_heap.$(OBJEXT): {$(VPATH)}st.h
-transient_heap.$(OBJEXT): {$(VPATH)}subst.h
-transient_heap.$(OBJEXT): {$(VPATH)}transient_heap.c
-transient_heap.$(OBJEXT): {$(VPATH)}transient_heap.h
-transient_heap.$(OBJEXT): {$(VPATH)}vm_debug.h
util.$(OBJEXT): $(hdrdir)/ruby/ruby.h
util.$(OBJEXT): $(top_srcdir)/include/ruby.h
util.$(OBJEXT): {$(VPATH)}config.h
@@ -3021,71 +2342,38 @@ util.$(OBJEXT): {$(VPATH)}intern.h
util.$(OBJEXT): {$(VPATH)}internal.h
util.$(OBJEXT): {$(VPATH)}io.h
util.$(OBJEXT): {$(VPATH)}missing.h
-util.$(OBJEXT): {$(VPATH)}onigmo.h
util.$(OBJEXT): {$(VPATH)}oniguruma.h
util.$(OBJEXT): {$(VPATH)}st.h
util.$(OBJEXT): {$(VPATH)}subst.h
util.$(OBJEXT): {$(VPATH)}util.c
util.$(OBJEXT): {$(VPATH)}util.h
-variable.$(OBJEXT): $(CCAN_DIR)/check_type/check_type.h
-variable.$(OBJEXT): $(CCAN_DIR)/container_of/container_of.h
-variable.$(OBJEXT): $(CCAN_DIR)/list/list.h
-variable.$(OBJEXT): $(CCAN_DIR)/str/str.h
variable.$(OBJEXT): $(hdrdir)/ruby/ruby.h
variable.$(OBJEXT): $(top_srcdir)/include/ruby.h
variable.$(OBJEXT): {$(VPATH)}config.h
variable.$(OBJEXT): {$(VPATH)}constant.h
-variable.$(OBJEXT): {$(VPATH)}debug_counter.h
variable.$(OBJEXT): {$(VPATH)}defines.h
variable.$(OBJEXT): {$(VPATH)}encoding.h
variable.$(OBJEXT): {$(VPATH)}id.h
-variable.$(OBJEXT): {$(VPATH)}id_table.h
variable.$(OBJEXT): {$(VPATH)}intern.h
variable.$(OBJEXT): {$(VPATH)}internal.h
variable.$(OBJEXT): {$(VPATH)}io.h
-variable.$(OBJEXT): {$(VPATH)}method.h
variable.$(OBJEXT): {$(VPATH)}missing.h
-variable.$(OBJEXT): {$(VPATH)}node.h
-variable.$(OBJEXT): {$(VPATH)}onigmo.h
variable.$(OBJEXT): {$(VPATH)}oniguruma.h
-variable.$(OBJEXT): {$(VPATH)}ruby_assert.h
-variable.$(OBJEXT): {$(VPATH)}ruby_atomic.h
variable.$(OBJEXT): {$(VPATH)}st.h
variable.$(OBJEXT): {$(VPATH)}subst.h
-variable.$(OBJEXT): {$(VPATH)}thread_$(THREAD_MODEL).h
-variable.$(OBJEXT): {$(VPATH)}thread_native.h
-variable.$(OBJEXT): {$(VPATH)}transient_heap.h
variable.$(OBJEXT): {$(VPATH)}util.h
variable.$(OBJEXT): {$(VPATH)}variable.c
-variable.$(OBJEXT): {$(VPATH)}vm_core.h
-variable.$(OBJEXT): {$(VPATH)}vm_opts.h
-version.$(OBJEXT): $(CCAN_DIR)/check_type/check_type.h
-version.$(OBJEXT): $(CCAN_DIR)/container_of/container_of.h
-version.$(OBJEXT): $(CCAN_DIR)/list/list.h
-version.$(OBJEXT): $(CCAN_DIR)/str/str.h
version.$(OBJEXT): $(hdrdir)/ruby/ruby.h
version.$(OBJEXT): $(hdrdir)/ruby/version.h
-version.$(OBJEXT): $(top_srcdir)/include/ruby.h
version.$(OBJEXT): $(top_srcdir)/revision.h
version.$(OBJEXT): $(top_srcdir)/version.h
version.$(OBJEXT): {$(VPATH)}config.h
version.$(OBJEXT): {$(VPATH)}defines.h
-version.$(OBJEXT): {$(VPATH)}id.h
version.$(OBJEXT): {$(VPATH)}intern.h
-version.$(OBJEXT): {$(VPATH)}internal.h
-version.$(OBJEXT): {$(VPATH)}method.h
version.$(OBJEXT): {$(VPATH)}missing.h
-version.$(OBJEXT): {$(VPATH)}mjit.h
-version.$(OBJEXT): {$(VPATH)}node.h
-version.$(OBJEXT): {$(VPATH)}ruby_assert.h
-version.$(OBJEXT): {$(VPATH)}ruby_atomic.h
version.$(OBJEXT): {$(VPATH)}st.h
version.$(OBJEXT): {$(VPATH)}subst.h
-version.$(OBJEXT): {$(VPATH)}thread_$(THREAD_MODEL).h
-version.$(OBJEXT): {$(VPATH)}thread_native.h
version.$(OBJEXT): {$(VPATH)}version.c
-version.$(OBJEXT): {$(VPATH)}vm_core.h
-version.$(OBJEXT): {$(VPATH)}vm_opts.h
vm.$(OBJEXT): $(CCAN_DIR)/check_type/check_type.h
vm.$(OBJEXT): $(CCAN_DIR)/container_of/container_of.h
vm.$(OBJEXT): $(CCAN_DIR)/list/list.h
@@ -3094,9 +2382,7 @@ vm.$(OBJEXT): $(hdrdir)/ruby/ruby.h
vm.$(OBJEXT): $(top_srcdir)/include/ruby.h
vm.$(OBJEXT): {$(VPATH)}config.h
vm.$(OBJEXT): {$(VPATH)}constant.h
-vm.$(OBJEXT): {$(VPATH)}debug_counter.h
vm.$(OBJEXT): {$(VPATH)}defines.h
-vm.$(OBJEXT): {$(VPATH)}defs/opt_operand.def
vm.$(OBJEXT): {$(VPATH)}encoding.h
vm.$(OBJEXT): {$(VPATH)}eval_intern.h
vm.$(OBJEXT): {$(VPATH)}gc.h
@@ -3104,21 +2390,16 @@ vm.$(OBJEXT): {$(VPATH)}id.h
vm.$(OBJEXT): {$(VPATH)}id_table.h
vm.$(OBJEXT): {$(VPATH)}insns.def
vm.$(OBJEXT): {$(VPATH)}insns.inc
-vm.$(OBJEXT): {$(VPATH)}insns_info.inc
vm.$(OBJEXT): {$(VPATH)}intern.h
vm.$(OBJEXT): {$(VPATH)}internal.h
vm.$(OBJEXT): {$(VPATH)}io.h
vm.$(OBJEXT): {$(VPATH)}iseq.h
vm.$(OBJEXT): {$(VPATH)}method.h
vm.$(OBJEXT): {$(VPATH)}missing.h
-vm.$(OBJEXT): {$(VPATH)}mjit.h
vm.$(OBJEXT): {$(VPATH)}node.h
-vm.$(OBJEXT): {$(VPATH)}onigmo.h
vm.$(OBJEXT): {$(VPATH)}oniguruma.h
-vm.$(OBJEXT): {$(VPATH)}probes.dmyh
vm.$(OBJEXT): {$(VPATH)}probes.h
vm.$(OBJEXT): {$(VPATH)}probes_helper.h
-vm.$(OBJEXT): {$(VPATH)}ruby_assert.h
vm.$(OBJEXT): {$(VPATH)}ruby_atomic.h
vm.$(OBJEXT): {$(VPATH)}st.h
vm.$(OBJEXT): {$(VPATH)}subst.h
@@ -3127,8 +2408,8 @@ vm.$(OBJEXT): {$(VPATH)}thread_native.h
vm.$(OBJEXT): {$(VPATH)}vm.c
vm.$(OBJEXT): {$(VPATH)}vm.h
vm.$(OBJEXT): {$(VPATH)}vm.inc
-vm.$(OBJEXT): {$(VPATH)}vm_args.c
vm.$(OBJEXT): {$(VPATH)}vm_call_iseq_optimized.inc
+vm.$(OBJEXT): {$(VPATH)}vm_args.c
vm.$(OBJEXT): {$(VPATH)}vm_core.h
vm.$(OBJEXT): {$(VPATH)}vm_debug.h
vm.$(OBJEXT): {$(VPATH)}vm_eval.c
@@ -3158,9 +2439,7 @@ vm_backtrace.$(OBJEXT): {$(VPATH)}iseq.h
vm_backtrace.$(OBJEXT): {$(VPATH)}method.h
vm_backtrace.$(OBJEXT): {$(VPATH)}missing.h
vm_backtrace.$(OBJEXT): {$(VPATH)}node.h
-vm_backtrace.$(OBJEXT): {$(VPATH)}onigmo.h
vm_backtrace.$(OBJEXT): {$(VPATH)}oniguruma.h
-vm_backtrace.$(OBJEXT): {$(VPATH)}ruby_assert.h
vm_backtrace.$(OBJEXT): {$(VPATH)}ruby_atomic.h
vm_backtrace.$(OBJEXT): {$(VPATH)}st.h
vm_backtrace.$(OBJEXT): {$(VPATH)}subst.h
@@ -3170,6 +2449,9 @@ vm_backtrace.$(OBJEXT): {$(VPATH)}vm_backtrace.c
vm_backtrace.$(OBJEXT): {$(VPATH)}vm_core.h
vm_backtrace.$(OBJEXT): {$(VPATH)}vm_debug.h
vm_backtrace.$(OBJEXT): {$(VPATH)}vm_opts.h
+vm_call.$(OBJEXT): $(top_srcdir)/include/ruby.h
+vm_call.$(OBJEXT): {$(VPATH)}vm_core.h
+vm_call.$(OBJEXT): {$(VPATH)}vm_call_iseq_optimized.inc
vm_dump.$(OBJEXT): $(CCAN_DIR)/check_type/check_type.h
vm_dump.$(OBJEXT): $(CCAN_DIR)/container_of/container_of.h
vm_dump.$(OBJEXT): $(CCAN_DIR)/list/list.h
@@ -3188,9 +2470,7 @@ vm_dump.$(OBJEXT): {$(VPATH)}iseq.h
vm_dump.$(OBJEXT): {$(VPATH)}method.h
vm_dump.$(OBJEXT): {$(VPATH)}missing.h
vm_dump.$(OBJEXT): {$(VPATH)}node.h
-vm_dump.$(OBJEXT): {$(VPATH)}onigmo.h
vm_dump.$(OBJEXT): {$(VPATH)}oniguruma.h
-vm_dump.$(OBJEXT): {$(VPATH)}ruby_assert.h
vm_dump.$(OBJEXT): {$(VPATH)}ruby_atomic.h
vm_dump.$(OBJEXT): {$(VPATH)}st.h
vm_dump.$(OBJEXT): {$(VPATH)}subst.h
@@ -3215,14 +2495,10 @@ vm_trace.$(OBJEXT): {$(VPATH)}id.h
vm_trace.$(OBJEXT): {$(VPATH)}intern.h
vm_trace.$(OBJEXT): {$(VPATH)}internal.h
vm_trace.$(OBJEXT): {$(VPATH)}io.h
-vm_trace.$(OBJEXT): {$(VPATH)}iseq.h
vm_trace.$(OBJEXT): {$(VPATH)}method.h
vm_trace.$(OBJEXT): {$(VPATH)}missing.h
-vm_trace.$(OBJEXT): {$(VPATH)}mjit.h
vm_trace.$(OBJEXT): {$(VPATH)}node.h
-vm_trace.$(OBJEXT): {$(VPATH)}onigmo.h
vm_trace.$(OBJEXT): {$(VPATH)}oniguruma.h
-vm_trace.$(OBJEXT): {$(VPATH)}ruby_assert.h
vm_trace.$(OBJEXT): {$(VPATH)}ruby_atomic.h
vm_trace.$(OBJEXT): {$(VPATH)}st.h
vm_trace.$(OBJEXT): {$(VPATH)}subst.h
diff --git a/compar.c b/compar.c
index 02529c9960..b040641651 100644
--- a/compar.c
+++ b/compar.c
@@ -10,15 +10,10 @@
**********************************************************************/
#include "ruby/ruby.h"
-#include "id.h"
VALUE rb_mComparable;
-static VALUE
-rb_cmp(VALUE x, VALUE y)
-{
- return rb_funcallv(x, idCmp, 1, &y);
-}
+static ID cmp;
void
rb_cmperr(VALUE x, VALUE y)
@@ -39,7 +34,7 @@ static VALUE
invcmp_recursive(VALUE x, VALUE y, int recursive)
{
if (recursive) return Qnil;
- return rb_cmp(y, x);
+ return rb_check_funcall(y, cmp, 1, &x);
}
VALUE
@@ -59,7 +54,7 @@ static VALUE
cmp_eq_recursive(VALUE arg1, VALUE arg2, int recursive)
{
if (recursive) return Qnil;
- return rb_cmp(arg1, arg2);
+ return rb_funcallv(arg1, cmp, 1, &arg2);
}
/*
@@ -84,12 +79,6 @@ cmp_equal(VALUE x, VALUE y)
return Qfalse;
}
-static int
-cmpint(VALUE x, VALUE y)
-{
- return rb_cmpint(rb_cmp(x, y), x, y);
-}
-
/*
* call-seq:
* obj > other -> true or false
@@ -101,7 +90,9 @@ cmpint(VALUE x, VALUE y)
static VALUE
cmp_gt(VALUE x, VALUE y)
{
- if (cmpint(x, y) > 0) return Qtrue;
+ VALUE c = rb_funcall(x, cmp, 1, y);
+
+ if (rb_cmpint(c, x, y) > 0) return Qtrue;
return Qfalse;
}
@@ -116,7 +107,9 @@ cmp_gt(VALUE x, VALUE y)
static VALUE
cmp_ge(VALUE x, VALUE y)
{
- if (cmpint(x, y) >= 0) return Qtrue;
+ VALUE c = rb_funcall(x, cmp, 1, y);
+
+ if (rb_cmpint(c, x, y) >= 0) return Qtrue;
return Qfalse;
}
@@ -131,7 +124,9 @@ cmp_ge(VALUE x, VALUE y)
static VALUE
cmp_lt(VALUE x, VALUE y)
{
- if (cmpint(x, y) < 0) return Qtrue;
+ VALUE c = rb_funcall(x, cmp, 1, y);
+
+ if (rb_cmpint(c, x, y) < 0) return Qtrue;
return Qfalse;
}
@@ -146,7 +141,9 @@ cmp_lt(VALUE x, VALUE y)
static VALUE
cmp_le(VALUE x, VALUE y)
{
- if (cmpint(x, y) <= 0) return Qtrue;
+ VALUE c = rb_funcall(x, cmp, 1, y);
+
+ if (rb_cmpint(c, x, y) <= 0) return Qtrue;
return Qfalse;
}
@@ -168,45 +165,12 @@ cmp_le(VALUE x, VALUE y)
static VALUE
cmp_between(VALUE x, VALUE min, VALUE max)
{
- if (cmpint(x, min) < 0) return Qfalse;
- if (cmpint(x, max) > 0) return Qfalse;
+ if (RTEST(cmp_lt(x, min))) return Qfalse;
+ if (RTEST(cmp_gt(x, max))) return Qfalse;
return Qtrue;
}
/*
- * call-seq:
- * obj.clamp(min, max) -> obj
- *
- * Returns <i>min</i> if <i>obj</i> <code><=></code> <i>min</i> is less
- * than zero, <i>max</i> if <i>obj</i> <code><=></code> <i>max</i> is
- * greater than zero and <i>obj</i> otherwise.
- *
- * 12.clamp(0, 100) #=> 12
- * 523.clamp(0, 100) #=> 100
- * -3.123.clamp(0, 100) #=> 0
- *
- * 'd'.clamp('a', 'f') #=> 'd'
- * 'z'.clamp('a', 'f') #=> 'f'
- */
-
-static VALUE
-cmp_clamp(VALUE x, VALUE min, VALUE max)
-{
- int c;
-
- if (cmpint(min, max) > 0) {
- rb_raise(rb_eArgError, "min argument must be smaller than max argument");
- }
-
- c = cmpint(x, min);
- if (c == 0) return x;
- if (c < 0) return min;
- c = cmpint(x, max);
- if (c > 0) return max;
- return x;
-}
-
-/*
* The <code>Comparable</code> mixin is used by classes whose objects
* may be ordered. The class must define the <code><=></code> operator,
* which compares the receiver against another object, returning -1, 0,
@@ -258,5 +222,6 @@ Init_Comparable(void)
rb_define_method(rb_mComparable, "<", cmp_lt, 1);
rb_define_method(rb_mComparable, "<=", cmp_le, 1);
rb_define_method(rb_mComparable, "between?", cmp_between, 2);
- rb_define_method(rb_mComparable, "clamp", cmp_clamp, 2);
+
+ cmp = rb_intern("<=>");
}
diff --git a/compile.c b/compile.c
index 4ceb8951b7..bb310426b6 100644
--- a/compile.c
+++ b/compile.c
@@ -9,19 +9,16 @@
**********************************************************************/
-#include "ruby/encoding.h"
-#include "ruby/re.h"
-#include "ruby/util.h"
#include "internal.h"
+#include "ruby/re.h"
#include "encindex.h"
#include <math.h>
+#define USE_INSN_STACK_INCREASE 1
#include "vm_core.h"
-#include "vm_debug.h"
#include "iseq.h"
#include "insns.inc"
#include "insns_info.inc"
-#include "id_table.h"
#include "gc.h"
#ifdef HAVE_DLADDR
@@ -36,11 +33,10 @@
typedef struct iseq_link_element {
enum {
- ISEQ_ELEMENT_ANCHOR,
+ ISEQ_ELEMENT_NONE,
ISEQ_ELEMENT_LABEL,
ISEQ_ELEMENT_INSN,
- ISEQ_ELEMENT_ADJUST,
- ISEQ_ELEMENT_TRACE
+ ISEQ_ELEMENT_ADJUST
} type;
struct iseq_link_element *next;
struct iseq_link_element *prev;
@@ -51,35 +47,23 @@ typedef struct iseq_link_anchor {
LINK_ELEMENT *last;
} LINK_ANCHOR;
-typedef enum {
- LABEL_RESCUE_NONE,
- LABEL_RESCUE_BEG,
- LABEL_RESCUE_END,
- LABEL_RESCUE_TYPE_MAX
-} LABEL_RESCUE_TYPE;
-
typedef struct iseq_label_data {
LINK_ELEMENT link;
int label_no;
int position;
int sc_state;
+ int set;
int sp;
int refcnt;
- unsigned int set: 1;
- unsigned int rescued: 2;
- unsigned int unremovable: 1;
} LABEL;
typedef struct iseq_insn_data {
LINK_ELEMENT link;
enum ruby_vminsn_type insn_id;
+ unsigned int line_no;
int operand_size;
int sc_state;
VALUE *operands;
- struct {
- int line_no;
- rb_event_flag_t events;
- } insn_info;
} INSN;
typedef struct iseq_adjust_data {
@@ -88,12 +72,6 @@ typedef struct iseq_adjust_data {
int line_no;
} ADJUST;
-typedef struct iseq_trace_data {
- LINK_ELEMENT link;
- rb_event_flag_t event;
- long data;
-} TRACE;
-
struct ensure_range {
LABEL *begin;
LABEL *end;
@@ -101,7 +79,7 @@ struct ensure_range {
};
struct iseq_compile_data_ensure_node_stack {
- const NODE *ensure_node;
+ NODE *ensure_node;
struct iseq_compile_data_ensure_node_stack *prev;
struct ensure_range *erange;
};
@@ -156,18 +134,30 @@ struct iseq_compile_data_ensure_node_stack {
#define debug_node_start(node) ((void) \
(compile_debug_print_indent(1) && \
- (ruby_debug_print_node(1, CPDEBUG, "", (const NODE *)(node)), gl_node_level)), \
+ (ruby_debug_print_node(1, CPDEBUG, "", (NODE *)(node)), gl_node_level)), \
gl_node_level++)
#define debug_node_end() gl_node_level --
#else
-#define debugi(header, id) ((void)0)
-#define debugp(header, value) ((void)0)
-#define debugp_verbose(header, value) ((void)0)
-#define debugp_verbose_node(header, value) ((void)0)
-#define debugp_param(header, value) ((void)0)
+static inline ID
+r_id(ID id)
+{
+ return id;
+}
+
+static inline VALUE
+r_value(VALUE value)
+{
+ return value;
+}
+
+#define debugi(header, id) r_id(id)
+#define debugp(header, value) r_value(value)
+#define debugp_verbose(header, value) r_value(value)
+#define debugp_verbose_node(header, value) r_value(value)
+#define debugp_param(header, value) r_value(value)
#define debug_node_start(node) ((void)0)
#define debug_node_end() ((void)0)
#endif
@@ -181,11 +171,12 @@ struct iseq_compile_data_ensure_node_stack {
#define debug_compile(msg, v) (v)
#endif
-#define LVAR_ERRINFO (1)
/* create new label */
#define NEW_LABEL(l) new_label_body(iseq, (l))
-#define LABEL_FORMAT "<L%03d>"
+
+#define iseq_path(iseq) ((iseq)->body->location.path)
+#define iseq_absolute_path(iseq) ((iseq)->body->location.absolute_path)
#define NEW_ISEQ(node, name, type, line_no) \
new_child_iseq(iseq, (node), rb_fstring(name), 0, (type), (line_no))
@@ -201,29 +192,11 @@ struct iseq_compile_data_ensure_node_stack {
#define ADD_INSN(seq, line, insn) \
ADD_ELEM((seq), (LINK_ELEMENT *) new_insn_body(iseq, (line), BIN(insn), 0))
-/* insert an instruction before next */
-#define INSERT_BEFORE_INSN(next, line, insn) \
- ELEM_INSERT_PREV(&(next)->link, (LINK_ELEMENT *) new_insn_body(iseq, (line), BIN(insn), 0))
-
-/* insert an instruction after prev */
-#define INSERT_AFTER_INSN(prev, line, insn) \
- ELEM_INSERT_NEXT(&(prev)->link, (LINK_ELEMENT *) new_insn_body(iseq, (line), BIN(insn), 0))
-
/* add an instruction with some operands (1, 2, 3, 5) */
#define ADD_INSN1(seq, line, insn, op1) \
ADD_ELEM((seq), (LINK_ELEMENT *) \
new_insn_body(iseq, (line), BIN(insn), 1, (VALUE)(op1)))
-/* insert an instruction with some operands (1, 2, 3, 5) before next */
-#define INSERT_BEFORE_INSN1(next, line, insn, op1) \
- ELEM_INSERT_PREV(&(next)->link, (LINK_ELEMENT *) \
- new_insn_body(iseq, (line), BIN(insn), 1, (VALUE)(op1)))
-
-/* insert an instruction with some operands (1, 2, 3, 5) after prev */
-#define INSERT_AFTER_INSN1(prev, line, insn, op1) \
- ELEM_INSERT_NEXT(&(prev)->link, (LINK_ELEMENT *) \
- new_insn_body(iseq, (line), BIN(insn), 1, (VALUE)(op1)))
-
#define LABEL_REF(label) ((label)->refcnt++)
/* add an instruction with label operand (alias of ADD_INSN1) */
@@ -259,52 +232,19 @@ struct iseq_compile_data_ensure_node_stack {
#define ADD_SEND_R(seq, line, id, argc, block, flag, keywords) \
ADD_ELEM((seq), (LINK_ELEMENT *) new_insn_send(iseq, (line), (id), (VALUE)(argc), (block), (VALUE)(flag), (keywords)))
-#define ADD_TRACE(seq, event) \
- ADD_ELEM((seq), (LINK_ELEMENT *)new_trace_body(iseq, (event), 0))
-#define ADD_TRACE_WITH_DATA(seq, event, data) \
- ADD_ELEM((seq), (LINK_ELEMENT *)new_trace_body(iseq, (event), (data)))
-
-
-#define DECL_BRANCH_BASE(branches, first_line, first_column, last_line, last_column, type) \
+#define ADD_TRACE(seq, line, event) \
do { \
- if (ISEQ_COVERAGE(iseq) && \
- ISEQ_BRANCH_COVERAGE(iseq) && \
- (first_line) > 0) { \
- VALUE structure = RARRAY_AREF(ISEQ_BRANCH_COVERAGE(iseq), 0); \
- branches = rb_ary_tmp_new(0); \
- rb_ary_push(structure, branches); \
- rb_ary_push(branches, ID2SYM(rb_intern(type))); \
- rb_ary_push(branches, INT2FIX(first_line)); \
- rb_ary_push(branches, INT2FIX(first_column)); \
- rb_ary_push(branches, INT2FIX(last_line)); \
- rb_ary_push(branches, INT2FIX(last_column)); \
+ if ((event) == RUBY_EVENT_LINE && ISEQ_COVERAGE(iseq) && \
+ (line) != ISEQ_COMPILE_DATA(iseq)->last_coverable_line) { \
+ RARRAY_ASET(ISEQ_COVERAGE(iseq), (line) - 1, INT2FIX(0)); \
+ ISEQ_COMPILE_DATA(iseq)->last_coverable_line = (line); \
+ ADD_INSN1((seq), (line), trace, INT2FIX(RUBY_EVENT_COVERAGE)); \
} \
- } while (0)
-#define ADD_TRACE_BRANCH_COVERAGE(seq, first_line, first_column, last_line, last_column, type, branches) \
- do { \
- if (ISEQ_COVERAGE(iseq) && \
- ISEQ_BRANCH_COVERAGE(iseq) && \
- (first_line) > 0) { \
- VALUE counters = RARRAY_AREF(ISEQ_BRANCH_COVERAGE(iseq), 1); \
- long counter_idx = RARRAY_LEN(counters); \
- rb_ary_push(counters, INT2FIX(0)); \
- rb_ary_push(branches, ID2SYM(rb_intern(type))); \
- rb_ary_push(branches, INT2FIX(first_line)); \
- rb_ary_push(branches, INT2FIX(first_column)); \
- rb_ary_push(branches, INT2FIX(last_line)); \
- rb_ary_push(branches, INT2FIX(last_column)); \
- rb_ary_push(branches, INT2FIX(counter_idx)); \
- ADD_TRACE_WITH_DATA(seq, RUBY_EVENT_COVERAGE_BRANCH, counter_idx); \
- ADD_INSN(seq, last_line, nop); \
+ if (ISEQ_COMPILE_DATA(iseq)->option->trace_instruction) { \
+ ADD_INSN1((seq), (line), trace, INT2FIX(event)); \
} \
} while (0)
-static void iseq_add_getlocal(rb_iseq_t *iseq, LINK_ANCHOR *const seq, int line, int idx, int level);
-static void iseq_add_setlocal(rb_iseq_t *iseq, LINK_ANCHOR *const seq, int line, int idx, int level);
-
-#define ADD_GETLOCAL(seq, line, idx, level) iseq_add_getlocal(iseq, (seq), (line), (idx), (level))
-#define ADD_SETLOCAL(seq, line, idx, level) iseq_add_setlocal(iseq, (seq), (line), (idx), (level))
-
/* add label */
#define ADD_LABEL(seq, label) \
ADD_ELEM((seq), (LINK_ELEMENT *) (label))
@@ -318,15 +258,13 @@ static void iseq_add_setlocal(rb_iseq_t *iseq, LINK_ANCHOR *const seq, int line,
#define ADD_ADJUST_RESTORE(seq, label) \
ADD_ELEM((seq), (LINK_ELEMENT *) new_adjust_body(iseq, (label), -1))
-#define LABEL_UNREMOVABLE(label) \
- ((label) ? (LABEL_REF(label), (label)->unremovable=1) : 0)
#define ADD_CATCH_ENTRY(type, ls, le, iseqv, lc) do { \
VALUE _e = rb_ary_new3(5, (type), \
(VALUE)(ls) | 1, (VALUE)(le) | 1, \
(VALUE)(iseqv), (VALUE)(lc) | 1); \
- LABEL_UNREMOVABLE(ls); \
- LABEL_REF(le); \
- LABEL_REF(lc); \
+ if (ls) LABEL_REF(ls); \
+ if (le) LABEL_REF(le); \
+ if (lc) LABEL_REF(lc); \
rb_ary_push(ISEQ_COMPILE_DATA(iseq)->catch_table_ary, freeze_hide_obj(_e)); \
} while (0)
@@ -336,14 +274,14 @@ static void iseq_add_setlocal(rb_iseq_t *iseq, LINK_ANCHOR *const seq, int line,
iseq_compile_each(iseq, (anchor), (node), 0)))
/* compile node, this node's value will be popped */
-#define COMPILE_POPPED(anchor, desc, node) \
+#define COMPILE_POPED(anchor, desc, node) \
(debug_compile("== " desc "\n", \
iseq_compile_each(iseq, (anchor), (node), 1)))
-/* compile node, which is popped when 'popped' is true */
-#define COMPILE_(anchor, desc, node, popped) \
+/* compile node, which is popped when 'poped' is true */
+#define COMPILE_(anchor, desc, node, poped) \
(debug_compile("== " desc "\n", \
- iseq_compile_each(iseq, (anchor), (node), (popped))))
+ iseq_compile_each(iseq, (anchor), (node), (poped))))
#define COMPILE_RECV(anchor, desc, node) \
(private_recv_p(node) ? \
@@ -356,96 +294,81 @@ static void iseq_add_setlocal(rb_iseq_t *iseq, LINK_ANCHOR *const seq, int line,
#define INSN_OF(insn) \
(((INSN*)(insn))->insn_id)
-#define IS_INSN(link) ((link)->type == ISEQ_ELEMENT_INSN)
-#define IS_LABEL(link) ((link)->type == ISEQ_ELEMENT_LABEL)
-#define IS_ADJUST(link) ((link)->type == ISEQ_ELEMENT_ADJUST)
-#define IS_TRACE(link) ((link)->type == ISEQ_ELEMENT_TRACE)
-#define IS_INSN_ID(iobj, insn) (INSN_OF(iobj) == BIN(insn))
-#define IS_NEXT_INSN_ID(link, insn) \
- ((link)->next && IS_INSN((link)->next) && IS_INSN_ID((link)->next, insn))
-
/* error */
-#if CPDEBUG > 0
-NORETURN(static void append_compile_error(rb_iseq_t *iseq, int line, const char *fmt, ...));
-#endif
+typedef void (*compile_error_func)(VALUE, int, const char *, ...);
static void
-append_compile_error(const rb_iseq_t *iseq, int line, const char *fmt, ...)
+append_compile_error(VALUE file, int line, const char *fmt, ...)
{
- VALUE err_info = ISEQ_COMPILE_DATA(iseq)->err_info;
- VALUE file = rb_iseq_path(iseq);
- VALUE err = err_info == Qtrue ? Qfalse : err_info;
+ VALUE err_info = rb_errinfo();
+ VALUE str = rb_attr_get(err_info, idMesg);
va_list args;
+ if (RSTRING_LEN(str)) rb_str_cat2(str, "\n");
+ if (file) {
+ rb_str_concat(str, file);
+ if (line) rb_str_catf(str, ":%d", line);
+ rb_str_cat2(str, ": ");
+ }
va_start(args, fmt);
- err = rb_syntax_error_append(err, file, line, -1, NULL, fmt, args);
+ rb_str_vcatf(str, fmt, args);
va_end(args);
- if (NIL_P(err_info)) {
- RB_OBJ_WRITE(iseq, &ISEQ_COMPILE_DATA(iseq)->err_info, err);
- rb_set_errinfo(err);
- }
- else if (!err_info) {
- RB_OBJ_WRITE(iseq, &ISEQ_COMPILE_DATA(iseq)->err_info, Qtrue);
- }
- if (compile_debug) rb_exc_fatal(err);
}
-#if 0
-static void
-compile_bug(rb_iseq_t *iseq, int line, const char *fmt, ...)
+NOINLINE(static compile_error_func prepare_compile_error(rb_iseq_t *iseq));
+
+static compile_error_func
+prepare_compile_error(rb_iseq_t *iseq)
{
- va_list args;
- va_start(args, fmt);
- rb_report_bug_valist(rb_iseq_path(iseq), line, fmt, args);
- va_end(args);
- abort();
+ VALUE err_info = ISEQ_COMPILE_DATA(iseq)->err_info;
+ if (compile_debug) return rb_compile_bug_str;
+ if (NIL_P(err_info)) {
+ err_info = rb_exc_new_cstr(rb_eSyntaxError, "");
+ RB_OBJ_WRITE(iseq, &ISEQ_COMPILE_DATA(iseq)->err_info, err_info);
+ }
+ rb_set_errinfo(err_info);
+ return append_compile_error;
}
-#endif
-#define COMPILE_ERROR append_compile_error
+#define COMPILE_ERROR prepare_compile_error(iseq)
-#define ERROR_ARGS_AT(n) iseq, nd_line(n),
+#define ERROR_ARGS_AT(n) ruby_sourcefile_string, nd_line(n),
#define ERROR_ARGS ERROR_ARGS_AT(node)
-#define EXPECT_NODE(prefix, node, ndtype, errval) \
+#define EXPECT_NODE(prefix, node, ndtype) \
do { \
- const NODE *error_node = (node); \
+ NODE *error_node = (node); \
enum node_type error_type = nd_type(error_node); \
if (error_type != (ndtype)) { \
- COMPILE_ERROR(ERROR_ARGS_AT(error_node) \
- prefix ": " #ndtype " is expected, but %s", \
- ruby_node_name(error_type)); \
- return errval; \
+ rb_compile_bug_str(ERROR_ARGS_AT(error_node) \
+ prefix ": " #ndtype " is expected, but %s", \
+ ruby_node_name(error_type)); \
} \
} while (0)
-#define EXPECT_NODE_NONULL(prefix, parent, ndtype, errval) \
+#define EXPECT_NODE_NONULL(prefix, parent, ndtype) \
do { \
- COMPILE_ERROR(ERROR_ARGS_AT(parent) \
- prefix ": must be " #ndtype ", but 0"); \
- return errval; \
+ rb_compile_bug_str(ERROR_ARGS_AT(parent) \
+ prefix ": must be " #ndtype ", but 0"); \
} while (0)
-#define UNKNOWN_NODE(prefix, node, errval) \
+#define UNKNOWN_NODE(prefix, node) \
do { \
- const NODE *error_node = (node); \
- COMPILE_ERROR(ERROR_ARGS_AT(error_node) prefix ": unknown node (%s)", \
- ruby_node_name(nd_type(error_node))); \
- return errval; \
+ NODE *error_node = (node); \
+ rb_compile_bug_str(ERROR_ARGS_AT(error_node) prefix ": unknown node (%s)", \
+ ruby_node_name(nd_type(error_node))); \
} while (0)
#define COMPILE_OK 1
#define COMPILE_NG 0
-#define CHECK(sub) if (!(sub)) {BEFORE_RETURN;return COMPILE_NG;}
-#define BEFORE_RETURN
/* leave name uninitialized so that compiler warn if INIT_ANCHOR is
* missing */
#define DECL_ANCHOR(name) \
- LINK_ANCHOR name[1] = {{{ISEQ_ELEMENT_ANCHOR,},}}
+ LINK_ANCHOR *name, name##_body__ = {{0,},}
#define INIT_ANCHOR(name) \
- (name->last = &name->anchor)
+ (name##_body__.last = &name##_body__.anchor, name = &name##_body__)
static inline VALUE
freeze_hide_obj(VALUE obj)
@@ -473,8 +396,7 @@ freeze_hide_obj(VALUE obj)
#define gl_node_level ISEQ_COMPILE_DATA(iseq)->node_level
#endif
-static void dump_disasm_list_with_cursor(const LINK_ELEMENT *link, const LINK_ELEMENT *curr, const LABEL *dest);
-static void dump_disasm_list(const LINK_ELEMENT *elem);
+static void dump_disasm_list(LINK_ELEMENT *elem);
static int insn_data_length(INSN *iobj);
static int calc_sp_depth(int depth, INSN *iobj);
@@ -482,32 +404,27 @@ static int calc_sp_depth(int depth, INSN *iobj);
static INSN *new_insn_body(rb_iseq_t *iseq, int line_no, enum ruby_vminsn_type insn_id, int argc, ...);
static LABEL *new_label_body(rb_iseq_t *iseq, long line);
static ADJUST *new_adjust_body(rb_iseq_t *iseq, LABEL *label, int line);
-static TRACE *new_trace_body(rb_iseq_t *iseq, rb_event_flag_t event, long data);
-
-static int iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *anchor, const NODE *n, int);
-static int iseq_setup(rb_iseq_t *iseq, LINK_ANCHOR *const anchor);
-static int iseq_setup_insn(rb_iseq_t *iseq, LINK_ANCHOR *const anchor);
-static int iseq_optimize(rb_iseq_t *iseq, LINK_ANCHOR *const anchor);
-static int iseq_insns_unification(rb_iseq_t *iseq, LINK_ANCHOR *const anchor);
+static int iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *anchor, NODE * n, int);
+static int iseq_setup(rb_iseq_t *iseq, LINK_ANCHOR *anchor);
+static int iseq_optimize(rb_iseq_t *iseq, LINK_ANCHOR *anchor);
+static int iseq_insns_unification(rb_iseq_t *iseq, LINK_ANCHOR *anchor);
static int iseq_set_local_table(rb_iseq_t *iseq, const ID *tbl);
static int iseq_set_exception_local_table(rb_iseq_t *iseq);
-static int iseq_set_arguments(rb_iseq_t *iseq, LINK_ANCHOR *const anchor, const NODE *const node);
+static int iseq_set_arguments(rb_iseq_t *iseq, LINK_ANCHOR *anchor, NODE * node);
-static int iseq_set_sequence_stackcaching(rb_iseq_t *iseq, LINK_ANCHOR *const anchor);
-static int iseq_set_sequence(rb_iseq_t *iseq, LINK_ANCHOR *const anchor);
+static int iseq_set_sequence_stackcaching(rb_iseq_t *iseq, LINK_ANCHOR *anchor);
+static int iseq_set_sequence(rb_iseq_t *iseq, LINK_ANCHOR *anchor);
static int iseq_set_exception_table(rb_iseq_t *iseq);
static int iseq_set_optargs_table(rb_iseq_t *iseq);
-static int compile_defined_expr(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node, VALUE needstr);
-
/*
* To make Array to LinkedList, use link_anchor
*/
static void
-verify_list(ISEQ_ARG_DECLARE const char *info, LINK_ANCHOR *const anchor)
+verify_list(ISEQ_ARG_DECLARE const char *info, LINK_ANCHOR *anchor)
{
#if CPDEBUG
int flag = 0;
@@ -542,7 +459,7 @@ verify_list(ISEQ_ARG_DECLARE const char *info, LINK_ANCHOR *const anchor)
* elem1, elem2 => elem1, elem2, elem
*/
static void
-ADD_ELEM(ISEQ_ARG_DECLARE LINK_ANCHOR *const anchor, LINK_ELEMENT *elem)
+ADD_ELEM(ISEQ_ARG_DECLARE LINK_ANCHOR *anchor, LINK_ELEMENT *elem)
{
elem->prev = anchor->last;
anchor->last->next = elem;
@@ -554,7 +471,7 @@ ADD_ELEM(ISEQ_ARG_DECLARE LINK_ANCHOR *const anchor, LINK_ELEMENT *elem)
* elem1, before, elem2 => elem1, before, elem, elem2
*/
static void
-APPEND_ELEM(ISEQ_ARG_DECLARE LINK_ANCHOR *const anchor, LINK_ELEMENT *before, LINK_ELEMENT *elem)
+APPEND_ELEM(ISEQ_ARG_DECLARE LINK_ANCHOR *anchor, LINK_ELEMENT *before, LINK_ELEMENT *elem)
{
elem->prev = before;
elem->next = before->next;
@@ -568,23 +485,25 @@ APPEND_ELEM(ISEQ_ARG_DECLARE LINK_ANCHOR *const anchor, LINK_ELEMENT *before, LI
#define APPEND_ELEM(anchor, before, elem) APPEND_ELEM(iseq, (anchor), (before), (elem))
#endif
-#define ISEQ_LAST_LINE(iseq) (ISEQ_COMPILE_DATA(iseq)->last_line)
-
static int
-iseq_add_mark_object_compile_time(const rb_iseq_t *iseq, VALUE v)
+iseq_add_mark_object(const rb_iseq_t *iseq, VALUE v)
{
if (!SPECIAL_CONST_P(v)) {
- rb_ary_push(ISEQ_COMPILE_DATA(iseq)->mark_ary, v);
+ rb_iseq_add_mark_object(iseq, v);
}
return COMPILE_OK;
}
-static inline VALUE
-freeze_literal(rb_iseq_t *iseq, VALUE lit)
+#define ruby_sourcefile_string (iseq->body->location.path)
+#define ruby_sourcefile RSTRING_PTR(iseq->body->location.path)
+
+static int
+iseq_add_mark_object_compile_time(const rb_iseq_t *iseq, VALUE v)
{
- lit = rb_fstring(lit);
- rb_ary_push(ISEQ_COMPILE_DATA(iseq)->mark_ary, lit);
- return lit;
+ if (!SPECIAL_CONST_P(v)) {
+ rb_ary_push(ISEQ_COMPILE_DATA(iseq)->mark_ary, v);
+ }
+ return COMPILE_OK;
}
static int
@@ -594,9 +513,9 @@ validate_label(st_data_t name, st_data_t label, st_data_t arg)
LABEL *lobj = (LABEL *)label;
if (!lobj->link.next) {
do {
- COMPILE_ERROR(iseq, lobj->position,
+ COMPILE_ERROR(ruby_sourcefile_string, lobj->position,
"%"PRIsVALUE": undefined label",
- rb_sym2str((VALUE)name));
+ rb_id2str((ID)name));
} while (0);
}
return ST_CONTINUE;
@@ -607,37 +526,21 @@ validate_labels(rb_iseq_t *iseq, st_table *labels_table)
{
st_foreach(labels_table, validate_label, (st_data_t)iseq);
st_free_table(labels_table);
+ if (!NIL_P(ISEQ_COMPILE_DATA(iseq)->err_info)) {
+ rb_exc_raise(ISEQ_COMPILE_DATA(iseq)->err_info);
+ }
}
VALUE
-rb_iseq_compile_ifunc(rb_iseq_t *iseq, const struct vm_ifunc *ifunc)
-{
- DECL_ANCHOR(ret);
- INIT_ANCHOR(ret);
-
- (*ifunc->func)(iseq, ret, ifunc->data);
-
- ADD_INSN(ret, ISEQ_COMPILE_DATA(iseq)->last_line, leave);
-
- CHECK(iseq_setup_insn(iseq, ret));
- return iseq_setup(iseq, ret);
-}
-
-VALUE
-rb_iseq_compile_node(rb_iseq_t *iseq, const NODE *node)
+rb_iseq_compile_node(rb_iseq_t *iseq, NODE *node)
{
DECL_ANCHOR(ret);
INIT_ANCHOR(ret);
- if (imemo_type_p((VALUE)node, imemo_ifunc)) {
- rb_raise(rb_eArgError, "unexpected imemo_ifunc");
- }
-
if (node == 0) {
COMPILE(ret, "nil", node);
iseq_set_local_table(iseq, 0);
}
- /* assume node is T_NODE */
else if (nd_type(node) == NODE_SCOPE) {
/* iseq type of top, method, class, block */
iseq_set_local_table(iseq, node->nd_tbl);
@@ -649,78 +552,72 @@ rb_iseq_compile_node(rb_iseq_t *iseq, const NODE *node)
LABEL *start = ISEQ_COMPILE_DATA(iseq)->start_label = NEW_LABEL(0);
LABEL *end = ISEQ_COMPILE_DATA(iseq)->end_label = NEW_LABEL(0);
- start->rescued = LABEL_RESCUE_BEG;
- end->rescued = LABEL_RESCUE_END;
-
- ADD_TRACE(ret, RUBY_EVENT_B_CALL);
- ADD_INSN (ret, FIX2INT(iseq->body->location.first_lineno), nop);
+ ADD_TRACE(ret, FIX2INT(iseq->body->location.first_lineno), RUBY_EVENT_B_CALL);
ADD_LABEL(ret, start);
- CHECK(COMPILE(ret, "block body", node->nd_body));
+ COMPILE(ret, "block body", node->nd_body);
ADD_LABEL(ret, end);
- ADD_TRACE(ret, RUBY_EVENT_B_RETURN);
- ISEQ_COMPILE_DATA(iseq)->last_line = iseq->body->location.code_location.end_pos.lineno;
+ ADD_TRACE(ret, nd_line(node), RUBY_EVENT_B_RETURN);
/* wide range catch handler must put at last */
- ADD_CATCH_ENTRY(CATCH_TYPE_REDO, start, end, NULL, start);
- ADD_CATCH_ENTRY(CATCH_TYPE_NEXT, start, end, NULL, end);
+ ADD_CATCH_ENTRY(CATCH_TYPE_REDO, start, end, 0, start);
+ ADD_CATCH_ENTRY(CATCH_TYPE_NEXT, start, end, 0, end);
break;
}
case ISEQ_TYPE_CLASS:
{
- ADD_TRACE(ret, RUBY_EVENT_CLASS);
- CHECK(COMPILE(ret, "scoped node", node->nd_body));
- ADD_TRACE(ret, RUBY_EVENT_END);
- ISEQ_COMPILE_DATA(iseq)->last_line = nd_line(node);
+ ADD_TRACE(ret, FIX2INT(iseq->body->location.first_lineno), RUBY_EVENT_CLASS);
+ COMPILE(ret, "scoped node", node->nd_body);
+ ADD_TRACE(ret, nd_line(node), RUBY_EVENT_END);
break;
}
case ISEQ_TYPE_METHOD:
{
- ADD_TRACE(ret, RUBY_EVENT_CALL);
- CHECK(COMPILE(ret, "scoped node", node->nd_body));
- ADD_TRACE(ret, RUBY_EVENT_RETURN);
- ISEQ_COMPILE_DATA(iseq)->last_line = nd_line(node);
+ ADD_TRACE(ret, FIX2INT(iseq->body->location.first_lineno), RUBY_EVENT_CALL);
+ COMPILE(ret, "scoped node", node->nd_body);
+ ADD_TRACE(ret, nd_line(node), RUBY_EVENT_RETURN);
break;
}
default: {
- CHECK(COMPILE(ret, "scoped node", node->nd_body));
+ COMPILE(ret, "scoped node", node->nd_body);
break;
}
}
}
+ else if (RB_TYPE_P((VALUE)node, T_IMEMO)) {
+ const struct vm_ifunc *ifunc = (struct vm_ifunc *)node;
+ /* user callback */
+ (*ifunc->func)(iseq, ret, ifunc->data);
+ }
else {
- const char *m;
-#define INVALID_ISEQ_TYPE(type) \
- ISEQ_TYPE_##type: m = #type; goto invalid_iseq_type
switch (iseq->body->type) {
- case INVALID_ISEQ_TYPE(METHOD);
- case INVALID_ISEQ_TYPE(CLASS);
- case INVALID_ISEQ_TYPE(BLOCK);
- case INVALID_ISEQ_TYPE(EVAL);
- case INVALID_ISEQ_TYPE(MAIN);
- case INVALID_ISEQ_TYPE(TOP);
-#undef INVALID_ISEQ_TYPE /* invalid iseq types end */
+ case ISEQ_TYPE_METHOD:
+ case ISEQ_TYPE_CLASS:
+ case ISEQ_TYPE_BLOCK:
+ case ISEQ_TYPE_EVAL:
+ case ISEQ_TYPE_MAIN:
+ case ISEQ_TYPE_TOP:
+ COMPILE_ERROR(ERROR_ARGS "compile/should not be reached: %s:%d",
+ __FILE__, __LINE__);
+ return COMPILE_NG;
case ISEQ_TYPE_RESCUE:
iseq_set_exception_local_table(iseq);
- CHECK(COMPILE(ret, "rescue", node));
+ COMPILE(ret, "rescue", node);
break;
case ISEQ_TYPE_ENSURE:
iseq_set_exception_local_table(iseq);
- CHECK(COMPILE_POPPED(ret, "ensure", node));
+ COMPILE_POPED(ret, "ensure", node);
break;
- case ISEQ_TYPE_PLAIN:
- CHECK(COMPILE(ret, "ensure", node));
+ case ISEQ_TYPE_DEFINED_GUARD:
+ iseq_set_exception_local_table(iseq);
+ COMPILE(ret, "defined guard", node);
break;
default:
- COMPILE_ERROR(ERROR_ARGS "unknown scope: %d", iseq->body->type);
- return COMPILE_NG;
- invalid_iseq_type:
- COMPILE_ERROR(ERROR_ARGS "compile/ISEQ_TYPE_%s should not be reached", m);
- return COMPILE_NG;
+ rb_compile_bug_str(ERROR_ARGS "unknown scope");
}
}
if (iseq->body->type == ISEQ_TYPE_RESCUE || iseq->body->type == ISEQ_TYPE_ENSURE) {
- ADD_GETLOCAL(ret, 0, LVAR_ERRINFO, 0);
+ ADD_INSN2(ret, 0, getlocal, INT2FIX(2), INT2FIX(0));
ADD_INSN1(ret, 0, throw, INT2FIX(0) /* continue throw */ );
}
else {
@@ -734,7 +631,6 @@ rb_iseq_compile_node(rb_iseq_t *iseq, const NODE *node)
validate_labels(iseq, labels_table);
}
#endif
- CHECK(iseq_setup_insn(iseq, ret));
return iseq_setup(iseq, ret);
}
@@ -752,11 +648,26 @@ rb_iseq_translate_threaded_code(rb_iseq_t *iseq)
encoded[i] = (VALUE)table[insn];
i += len;
}
- FL_SET(iseq, ISEQ_TRANSLATED);
#endif
return COMPILE_OK;
}
+#if OPT_DIRECT_THREADED_CODE || OPT_CALL_THREADED_CODE
+static int
+rb_vm_insn_addr2insn(const void *addr) /* cold path */
+{
+ int insn;
+ const void * const *table = rb_vm_get_insns_address_table();
+
+ for (insn = 0; insn < VM_INSTRUCTION_SIZE; insn++) {
+ if (table[insn] == addr) {
+ return insn;
+ }
+ }
+ rb_bug("rb_vm_insn_addr2insn: invalid insn address: %p", addr);
+}
+#endif
+
VALUE *
rb_iseq_original_iseq(const rb_iseq_t *iseq) /* cold path */
{
@@ -856,7 +767,7 @@ compile_data_alloc(rb_iseq_t *iseq, size_t size)
alloc_size *= 2;
}
storage->next = (void *)ALLOC_N(char, alloc_size +
- offsetof(struct iseq_compile_data_storage, buff));
+ SIZEOF_ISEQ_COMPILE_DATA_STORAGE);
storage = ISEQ_COMPILE_DATA(iseq)->storage_current = storage->next;
storage->next = 0;
storage->pos = 0;
@@ -893,17 +804,11 @@ compile_data_alloc_adjust(rb_iseq_t *iseq)
return (ADJUST *)compile_data_alloc(iseq, sizeof(ADJUST));
}
-static TRACE *
-compile_data_alloc_trace(rb_iseq_t *iseq)
-{
- return (TRACE *)compile_data_alloc(iseq, sizeof(TRACE));
-}
-
/*
* elem1, elemX => elem1, elem2, elemX
*/
static void
-ELEM_INSERT_NEXT(LINK_ELEMENT *elem1, LINK_ELEMENT *elem2)
+INSERT_ELEM_NEXT(LINK_ELEMENT *elem1, LINK_ELEMENT *elem2)
{
elem2->next = elem1->next;
elem2->prev = elem1;
@@ -917,7 +822,7 @@ ELEM_INSERT_NEXT(LINK_ELEMENT *elem1, LINK_ELEMENT *elem2)
* elem1, elemX => elemX, elem2, elem1
*/
static void
-ELEM_INSERT_PREV(LINK_ELEMENT *elem1, LINK_ELEMENT *elem2)
+INSERT_ELEM_PREV(LINK_ELEMENT *elem1, LINK_ELEMENT *elem2)
{
elem2->prev = elem1->prev;
elem2->next = elem1;
@@ -931,7 +836,7 @@ ELEM_INSERT_PREV(LINK_ELEMENT *elem1, LINK_ELEMENT *elem2)
* elemX, elem1, elemY => elemX, elem2, elemY
*/
static void
-ELEM_REPLACE(LINK_ELEMENT *elem1, LINK_ELEMENT *elem2)
+REPLACE_ELEM(LINK_ELEMENT *elem1, LINK_ELEMENT *elem2)
{
elem2->prev = elem1->prev;
elem2->next = elem1->next;
@@ -944,7 +849,7 @@ ELEM_REPLACE(LINK_ELEMENT *elem1, LINK_ELEMENT *elem2)
}
static void
-ELEM_REMOVE(LINK_ELEMENT *elem)
+REMOVE_ELEM(LINK_ELEMENT *elem)
{
elem->prev->next = elem->next;
if (elem->next) {
@@ -953,19 +858,19 @@ ELEM_REMOVE(LINK_ELEMENT *elem)
}
static LINK_ELEMENT *
-FIRST_ELEMENT(const LINK_ANCHOR *const anchor)
+FIRST_ELEMENT(LINK_ANCHOR *anchor)
{
return anchor->anchor.next;
}
static LINK_ELEMENT *
-LAST_ELEMENT(LINK_ANCHOR *const anchor)
+LAST_ELEMENT(LINK_ANCHOR *anchor)
{
return anchor->last;
}
static LINK_ELEMENT *
-POP_ELEMENT(ISEQ_ARG_DECLARE LINK_ANCHOR *const anchor)
+POP_ELEMENT(ISEQ_ARG_DECLARE LINK_ANCHOR *anchor)
{
LINK_ELEMENT *elem = anchor->last;
anchor->last = anchor->last->prev;
@@ -977,42 +882,14 @@ POP_ELEMENT(ISEQ_ARG_DECLARE LINK_ANCHOR *const anchor)
#define POP_ELEMENT(anchor) POP_ELEMENT(iseq, (anchor))
#endif
-static LINK_ELEMENT *
-ELEM_FIRST_INSN(LINK_ELEMENT *elem)
-{
- while (elem) {
- switch (elem->type) {
- case ISEQ_ELEMENT_INSN:
- case ISEQ_ELEMENT_ADJUST:
- return elem;
- default:
- elem = elem->next;
- }
- }
- return NULL;
-}
-
-static int
-LIST_INSN_SIZE_ONE(const LINK_ANCHOR *const anchor)
-{
- LINK_ELEMENT *first_insn = ELEM_FIRST_INSN(FIRST_ELEMENT(anchor));
- if (first_insn != NULL &&
- ELEM_FIRST_INSN(first_insn->next) == NULL) {
- return TRUE;
- }
- else {
- return FALSE;
- }
-}
-
static int
-LIST_INSN_SIZE_ZERO(const LINK_ANCHOR *const anchor)
+LIST_SIZE_ZERO(LINK_ANCHOR *anchor)
{
- if (ELEM_FIRST_INSN(FIRST_ELEMENT(anchor)) == NULL) {
- return TRUE;
+ if (anchor->anchor.next == 0) {
+ return 1;
}
else {
- return FALSE;
+ return 0;
}
}
@@ -1024,7 +901,7 @@ LIST_INSN_SIZE_ZERO(const LINK_ANCHOR *const anchor)
* anc2: e4, e5 (broken)
*/
static void
-APPEND_LIST(ISEQ_ARG_DECLARE LINK_ANCHOR *const anc1, LINK_ANCHOR *const anc2)
+APPEND_LIST(ISEQ_ARG_DECLARE LINK_ANCHOR *anc1, LINK_ANCHOR *anc2)
{
if (anc2->anchor.next) {
anc1->last->next = anc2->anchor.next;
@@ -1045,7 +922,7 @@ APPEND_LIST(ISEQ_ARG_DECLARE LINK_ANCHOR *const anc1, LINK_ANCHOR *const anc2)
* anc2: e4, e5 (broken)
*/
static void
-INSERT_LIST(ISEQ_ARG_DECLARE LINK_ANCHOR *const anc1, LINK_ANCHOR *const anc2)
+INSERT_LIST(ISEQ_ARG_DECLARE LINK_ANCHOR *anc1, LINK_ANCHOR *anc2)
{
if (anc2->anchor.next) {
LINK_ELEMENT *first = anc1->anchor.next;
@@ -1068,7 +945,7 @@ INSERT_LIST(ISEQ_ARG_DECLARE LINK_ANCHOR *const anc1, LINK_ANCHOR *const anc2)
#if CPDEBUG && 0
static void
-debug_list(ISEQ_ARG_DECLARE LINK_ANCHOR *const anchor)
+debug_list(ISEQ_ARG_DECLARE LINK_ANCHOR *anchor)
{
LINK_ELEMENT *list = FIRST_ELEMENT(anchor);
printf("----\n");
@@ -1087,23 +964,8 @@ debug_list(ISEQ_ARG_DECLARE LINK_ANCHOR *const anchor)
#if CPDEBUG < 0
#define debug_list(anc) debug_list(iseq, (anc))
#endif
-#else
-#define debug_list(anc) ((void)0)
#endif
-static TRACE *
-new_trace_body(rb_iseq_t *iseq, rb_event_flag_t event, long data)
-{
- TRACE *trace = compile_data_alloc_trace(iseq);
-
- trace->link.type = ISEQ_ELEMENT_TRACE;
- trace->link.next = NULL;
- trace->event = event;
- trace->data = data;
-
- return trace;
-}
-
static LABEL *
new_label_body(rb_iseq_t *iseq, long line)
{
@@ -1116,9 +978,6 @@ new_label_body(rb_iseq_t *iseq, long line)
labelobj->sc_state = 0;
labelobj->sp = -1;
labelobj->refcnt = 0;
- labelobj->set = 0;
- labelobj->rescued = LABEL_RESCUE_NONE;
- labelobj->unremovable = 0;
return labelobj;
}
@@ -1130,7 +989,6 @@ new_adjust_body(rb_iseq_t *iseq, LABEL *label, int line)
adjust->link.next = 0;
adjust->label = label;
adjust->line_no = line;
- LABEL_UNREMOVABLE(label);
return adjust;
}
@@ -1139,14 +997,12 @@ new_insn_core(rb_iseq_t *iseq, int line_no,
int insn_id, int argc, VALUE *argv)
{
INSN *iobj = compile_data_alloc_insn(iseq);
-
/* printf("insn_id: %d, line: %d\n", insn_id, line_no); */
iobj->link.type = ISEQ_ELEMENT_INSN;
iobj->link.next = 0;
iobj->insn_id = insn_id;
- iobj->insn_info.line_no = line_no;
- iobj->insn_info.events = 0;
+ iobj->line_no = line_no;
iobj->operands = argv;
iobj->operand_size = argc;
iobj->sc_state = 0;
@@ -1192,7 +1048,7 @@ new_callinfo(rb_iseq_t *iseq, ID mid, int argc, unsigned int flag, struct rb_cal
iseq->body->ci_size++;
}
- if (!(ci->flag & (VM_CALL_ARGS_SPLAT | VM_CALL_ARGS_BLOCKARG | VM_CALL_KW_SPLAT)) &&
+ if (!(ci->flag & (VM_CALL_ARGS_SPLAT | VM_CALL_ARGS_BLOCKARG)) &&
kw_arg == NULL && !has_blockiseq) {
ci->flag |= VM_CALL_ARGS_SIMPLE;
}
@@ -1210,121 +1066,23 @@ new_insn_send(rb_iseq_t *iseq, int line_no, ID id, VALUE argc, const rb_iseq_t *
}
static rb_iseq_t *
-new_child_iseq(rb_iseq_t *iseq, const NODE *const node,
+new_child_iseq(rb_iseq_t *iseq, NODE *node,
VALUE name, const rb_iseq_t *parent, enum iseq_type type, int line_no)
{
rb_iseq_t *ret_iseq;
- rb_ast_body_t ast;
-
- ast.root = node;
- ast.compile_option = 0;
- ast.line_count = -1;
debugs("[new_child_iseq]> ---------------------------------------\n");
- ret_iseq = rb_iseq_new_with_opt(&ast, name,
- rb_iseq_path(iseq), rb_iseq_realpath(iseq),
+ ret_iseq = rb_iseq_new_with_opt(node, name,
+ iseq_path(iseq), iseq_absolute_path(iseq),
INT2FIX(line_no), parent, type, ISEQ_COMPILE_DATA(iseq)->option);
debugs("[new_child_iseq]< ---------------------------------------\n");
- iseq_add_mark_object_compile_time(iseq, (VALUE)ret_iseq);
+ iseq_add_mark_object(iseq, (VALUE)ret_iseq);
return ret_iseq;
}
-static rb_iseq_t *
-new_child_iseq_ifunc(rb_iseq_t *iseq, const struct vm_ifunc *ifunc,
- VALUE name, const rb_iseq_t *parent, enum iseq_type type, int line_no)
-{
- rb_iseq_t *ret_iseq;
-
- debugs("[new_child_iseq_ifunc]> ---------------------------------------\n");
- ret_iseq = rb_iseq_new_ifunc(ifunc, name,
- rb_iseq_path(iseq), rb_iseq_realpath(iseq),
- INT2FIX(line_no), parent, type, ISEQ_COMPILE_DATA(iseq)->option);
- debugs("[new_child_iseq_ifunc]< ---------------------------------------\n");
- iseq_add_mark_object_compile_time(iseq, (VALUE)ret_iseq);
- return ret_iseq;
-}
-
-static void
-set_catch_except_p(struct rb_iseq_constant_body *body)
-{
- body->catch_except_p = TRUE;
- if (body->parent_iseq != NULL) {
- set_catch_except_p(body->parent_iseq->body);
- }
-}
-
-/* Set body->catch_except_p to TRUE if the ISeq may catch an exception. If it is FALSE,
- JIT-ed code may be optimized. If we are extremely conservative, we should set TRUE
- if catch table exists. But we want to optimize while loop, which always has catch
- table entries for break/next/redo.
-
- So this function sets TRUE for limited ISeqs with break/next/redo catch table entries
- whose child ISeq would really raise an exception. */
-static void
-update_catch_except_flags(struct rb_iseq_constant_body *body)
-{
- unsigned int pos;
- size_t i;
- int insn;
- const struct iseq_catch_table *ct = body->catch_table;
-
- /* This assumes that a block has parent_iseq which may catch an exception from the block, and that
- BREAK/NEXT/REDO catch table entries are used only when `throw` insn is used in the block. */
- pos = 0;
- while (pos < body->iseq_size) {
-#if OPT_DIRECT_THREADED_CODE || OPT_CALL_THREADED_CODE
- insn = rb_vm_insn_addr2insn((void *)body->iseq_encoded[pos]);
-#else
- insn = (int)body->iseq_encoded[pos];
-#endif
- if (insn == BIN(throw)) {
- set_catch_except_p(body);
- break;
- }
- pos += insn_len(insn);
- }
-
- if (ct == NULL)
- return;
-
- for (i = 0; i < ct->size; i++) {
- const struct iseq_catch_table_entry *entry = &ct->entries[i];
- if (entry->type != CATCH_TYPE_BREAK
- && entry->type != CATCH_TYPE_NEXT
- && entry->type != CATCH_TYPE_REDO) {
- body->catch_except_p = TRUE;
- break;
- }
- }
-}
-
-static void
-iseq_insert_nop_between_end_and_cont(rb_iseq_t *iseq)
-{
- VALUE catch_table_ary = ISEQ_COMPILE_DATA(iseq)->catch_table_ary;
- unsigned int i, tlen = (unsigned int)RARRAY_LEN(catch_table_ary);
- const VALUE *tptr = RARRAY_CONST_PTR_TRANSIENT(catch_table_ary);
- for (i = 0; i < tlen; i++) {
- const VALUE *ptr = RARRAY_CONST_PTR_TRANSIENT(tptr[i]);
- LINK_ELEMENT *end = (LINK_ELEMENT *)(ptr[2] & ~1);
- LINK_ELEMENT *cont = (LINK_ELEMENT *)(ptr[4] & ~1);
- LINK_ELEMENT *e;
- for (e = end; e && (IS_LABEL(e) || IS_TRACE(e)); e = e->next) {
- if (e == cont) {
- INSN *nop = new_insn_core(iseq, 0, BIN(nop), 0, 0);
- ELEM_INSERT_NEXT(end, &nop->link);
- break;
- }
- }
- }
-}
-
static int
-iseq_setup_insn(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
+iseq_setup(rb_iseq_t *iseq, LINK_ANCHOR *anchor)
{
- if (RTEST(ISEQ_COMPILE_DATA(iseq)->err_info))
- return COMPILE_NG;
-
/* debugs("[compile step 2] (iseq_array_to_linkedlist)\n"); */
if (compile_debug > 5)
@@ -1350,18 +1108,6 @@ iseq_setup_insn(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
dump_disasm_list(FIRST_ELEMENT(anchor));
}
- debugs("[compile step 3.4 (iseq_insert_nop_between_end_and_cont)]\n");
- iseq_insert_nop_between_end_and_cont(iseq);
-
- return COMPILE_OK;
-}
-
-static int
-iseq_setup(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
-{
- if (RTEST(ISEQ_COMPILE_DATA(iseq)->err_info))
- return COMPILE_NG;
-
debugs("[compile step 4.1 (iseq_set_sequence)]\n");
if (!iseq_set_sequence(iseq, anchor)) return COMPILE_NG;
if (compile_debug > 5)
@@ -1376,8 +1122,6 @@ iseq_setup(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
debugs("[compile step 5 (iseq_translate_threaded_code)] \n");
if (!rb_iseq_translate_threaded_code(iseq)) return COMPILE_NG;
- update_catch_except_flags(iseq->body);
-
if (compile_debug > 1) {
VALUE str = rb_iseq_disasm(iseq);
printf("%s\n", StringValueCStr(str));
@@ -1398,6 +1142,7 @@ iseq_set_exception_local_table(rb_iseq_t *iseq)
CONST_ID(id_dollar_bang, "#$!");
iseq->body->local_table_size = 1;
+ iseq->body->local_size = iseq->body->local_table_size + 1;
ids[0] = id_dollar_bang;
iseq->body->local_table = ids;
return COMPILE_OK;
@@ -1433,8 +1178,7 @@ get_local_var_idx(const rb_iseq_t *iseq, ID id)
int idx = get_dyna_var_idx_at_raw(iseq->body->local_iseq, id);
if (idx < 0) {
- COMPILE_ERROR(iseq, ISEQ_LAST_LINE(iseq),
- "get_local_var_idx: %d", idx);
+ rb_bug("get_local_var_idx: %d", idx);
}
return idx;
@@ -1444,7 +1188,6 @@ static int
get_dyna_var_idx(const rb_iseq_t *iseq, ID id, int *level, int *ls)
{
int lv = 0, idx = -1;
- const rb_iseq_t *const topmost_iseq = iseq;
while (iseq) {
idx = get_dyna_var_idx_at_raw(iseq, id);
@@ -1456,145 +1199,76 @@ get_dyna_var_idx(const rb_iseq_t *iseq, ID id, int *level, int *ls)
}
if (idx < 0) {
- COMPILE_ERROR(topmost_iseq, ISEQ_LAST_LINE(topmost_iseq),
- "get_dyna_var_idx: -1");
+ rb_bug("get_dyna_var_idx: -1");
}
*level = lv;
- *ls = iseq->body->local_table_size;
+ *ls = iseq->body->local_size;
return idx;
}
-static int
-iseq_local_block_param_p(const rb_iseq_t *iseq, unsigned int idx, unsigned int level)
-{
- const struct rb_iseq_constant_body *body;
- while (level > 0) {
- iseq = iseq->body->parent_iseq;
- level--;
- }
- body = iseq->body;
- if (body->local_iseq == iseq && /* local variables */
- body->param.flags.has_block &&
- body->local_table_size - body->param.block_start == idx) {
- return TRUE;
- }
- else {
- return FALSE;
- }
-}
-
-static int
-iseq_block_param_id_p(const rb_iseq_t *iseq, ID id, int *pidx, int *plevel)
-{
- int level, ls;
- int idx = get_dyna_var_idx(iseq, id, &level, &ls);
- if (iseq_local_block_param_p(iseq, ls - idx, level)) {
- *pidx = ls - idx;
- *plevel = level;
- return TRUE;
- }
- else {
- return FALSE;
- }
-}
-
-static void
-iseq_add_getlocal(rb_iseq_t *iseq, LINK_ANCHOR *const seq, int line, int idx, int level)
-{
- if (iseq_local_block_param_p(iseq, idx, level)) {
- ADD_INSN2(seq, line, getblockparam, INT2FIX((idx) + VM_ENV_DATA_SIZE - 1), INT2FIX(level));
- }
- else {
- ADD_INSN2(seq, line, getlocal, INT2FIX((idx) + VM_ENV_DATA_SIZE - 1), INT2FIX(level));
- }
-}
-
-static void
-iseq_add_setlocal(rb_iseq_t *iseq, LINK_ANCHOR *const seq, int line, int idx, int level)
-{
- if (iseq_local_block_param_p(iseq, idx, level)) {
- ADD_INSN2(seq, line, setblockparam, INT2FIX((idx) + VM_ENV_DATA_SIZE - 1), INT2FIX(level));
- }
- else {
- ADD_INSN2(seq, line, setlocal, INT2FIX((idx) + VM_ENV_DATA_SIZE - 1), INT2FIX(level));
- }
-}
-
-
-
static void
iseq_calc_param_size(rb_iseq_t *iseq)
{
- struct rb_iseq_constant_body *const body = iseq->body;
- if (body->param.flags.has_opt ||
- body->param.flags.has_post ||
- body->param.flags.has_rest ||
- body->param.flags.has_block ||
- body->param.flags.has_kw ||
- body->param.flags.has_kwrest) {
+ if (iseq->body->param.flags.has_opt ||
+ iseq->body->param.flags.has_post ||
+ iseq->body->param.flags.has_rest ||
+ iseq->body->param.flags.has_block ||
+ iseq->body->param.flags.has_kw ||
+ iseq->body->param.flags.has_kwrest) {
- if (body->param.flags.has_block) {
- body->param.size = body->param.block_start + 1;
+ if (iseq->body->param.flags.has_block) {
+ iseq->body->param.size = iseq->body->param.block_start + 1;
}
- else if (body->param.flags.has_kwrest) {
- body->param.size = body->param.keyword->rest_start + 1;
+ else if (iseq->body->param.flags.has_kwrest) {
+ iseq->body->param.size = iseq->body->param.keyword->rest_start + 1;
}
- else if (body->param.flags.has_kw) {
- body->param.size = body->param.keyword->bits_start + 1;
+ else if (iseq->body->param.flags.has_kw) {
+ iseq->body->param.size = iseq->body->param.keyword->bits_start + 1;
}
- else if (body->param.flags.has_post) {
- body->param.size = body->param.post_start + body->param.post_num;
+ else if (iseq->body->param.flags.has_post) {
+ iseq->body->param.size = iseq->body->param.post_start + iseq->body->param.post_num;
}
- else if (body->param.flags.has_rest) {
- body->param.size = body->param.rest_start + 1;
+ else if (iseq->body->param.flags.has_rest) {
+ iseq->body->param.size = iseq->body->param.rest_start + 1;
}
- else if (body->param.flags.has_opt) {
- body->param.size = body->param.lead_num + body->param.opt_num;
+ else if (iseq->body->param.flags.has_opt) {
+ iseq->body->param.size = iseq->body->param.lead_num + iseq->body->param.opt_num;
}
else {
- UNREACHABLE;
+ rb_bug("unreachable");
}
}
else {
- body->param.size = body->param.lead_num;
+ iseq->body->param.size = iseq->body->param.lead_num;
}
}
-static int
-iseq_set_arguments_keywords(rb_iseq_t *iseq, LINK_ANCHOR *const optargs,
- const struct rb_args_info *args, int arg_size)
+static void
+iseq_set_arguments_keywords(rb_iseq_t *iseq, LINK_ANCHOR *optargs, const struct rb_args_info *args)
{
- const NODE *node = args->kw_args;
- struct rb_iseq_constant_body *const body = iseq->body;
+ NODE *node = args->kw_args;
struct rb_iseq_param_keyword *keyword;
const VALUE default_values = rb_ary_tmp_new(1);
const VALUE complex_mark = rb_str_tmp_new(0);
int kw = 0, rkw = 0, di = 0, i;
- body->param.flags.has_kw = TRUE;
- body->param.keyword = keyword = ZALLOC_N(struct rb_iseq_param_keyword, 1);
-
- while (node) {
- kw++;
- node = node->nd_next;
- }
- arg_size += kw;
- keyword->bits_start = arg_size++;
+ iseq->body->param.flags.has_kw = TRUE;
+ iseq->body->param.keyword = keyword = ZALLOC_N(struct rb_iseq_param_keyword, 1);
+ keyword->bits_start = get_dyna_var_idx_at_raw(iseq, args->kw_rest_arg->nd_vid);
- node = args->kw_args;
while (node) {
- const NODE *val_node = node->nd_body->nd_value;
+ NODE *val_node = node->nd_body->nd_value;
VALUE dv;
- if (val_node == (const NODE *)-1) {
+ if (val_node == (NODE *)-1) {
++rkw;
}
else {
switch (nd_type(val_node)) {
case NODE_LIT:
dv = val_node->nd_lit;
- iseq_add_mark_object_compile_time(iseq, dv);
+ iseq_add_mark_object(iseq, dv);
break;
case NODE_NIL:
dv = Qnil;
@@ -1606,7 +1280,7 @@ iseq_set_arguments_keywords(rb_iseq_t *iseq, LINK_ANCHOR *const optargs,
dv = Qfalse;
break;
default:
- COMPILE_POPPED(optargs, "kwarg", node); /* nd_type(node) == NODE_KW_ARG */
+ COMPILE_POPED(optargs, "kwarg", node); /* nd_type(node) == NODE_KW_ARG */
dv = complex_mark;
}
@@ -1614,17 +1288,18 @@ iseq_set_arguments_keywords(rb_iseq_t *iseq, LINK_ANCHOR *const optargs,
rb_ary_push(default_values, dv);
}
+ kw++;
node = node->nd_next;
}
keyword->num = kw;
- if (args->kw_rest_arg->nd_vid != 0) {
- keyword->rest_start = arg_size++;
- body->param.flags.has_kwrest = TRUE;
+ if (args->kw_rest_arg->nd_cflag != 0) {
+ keyword->rest_start = get_dyna_var_idx_at_raw(iseq, args->kw_rest_arg->nd_cflag);
+ iseq->body->param.flags.has_kwrest = TRUE;
}
keyword->required_num = rkw;
- keyword->table = &body->local_table[keyword->bits_start - keyword->num];
+ keyword->table = &iseq->body->local_table[keyword->bits_start - keyword->num];
{
VALUE *dvs = ALLOC_N(VALUE, RARRAY_LEN(default_values));
@@ -1632,35 +1307,29 @@ iseq_set_arguments_keywords(rb_iseq_t *iseq, LINK_ANCHOR *const optargs,
for (i = 0; i < RARRAY_LEN(default_values); i++) {
VALUE dv = RARRAY_AREF(default_values, i);
if (dv == complex_mark) dv = Qundef;
- if (!SPECIAL_CONST_P(dv)) {
- RB_OBJ_WRITTEN(iseq, Qundef, dv);
- }
dvs[i] = dv;
}
keyword->default_values = dvs;
}
- return arg_size;
}
static int
-iseq_set_arguments(rb_iseq_t *iseq, LINK_ANCHOR *const optargs, const NODE *const node_args)
+iseq_set_arguments(rb_iseq_t *iseq, LINK_ANCHOR *optargs, NODE *node_args)
{
debugs("iseq_set_arguments: %s\n", node_args ? "" : "0");
if (node_args) {
- struct rb_iseq_constant_body *const body = iseq->body;
struct rb_args_info *args = node_args->nd_ainfo;
ID rest_id = 0;
int last_comma = 0;
ID block_id = 0;
- int arg_size;
- EXPECT_NODE("iseq_set_arguments", node_args, NODE_ARGS, COMPILE_NG);
+ EXPECT_NODE("iseq_set_arguments", node_args, NODE_ARGS);
- body->param.lead_num = arg_size = (int)args->pre_args_num;
- if (body->param.lead_num > 0) body->param.flags.has_lead = TRUE;
- debugs(" - argc: %d\n", body->param.lead_num);
+ iseq->body->param.lead_num = (int)args->pre_args_num;
+ if (iseq->body->param.lead_num > 0) iseq->body->param.flags.has_lead = TRUE;
+ debugs(" - argc: %d\n", iseq->body->param.lead_num);
rest_id = args->rest_arg;
if (rest_id == 1) {
@@ -1669,8 +1338,14 @@ iseq_set_arguments(rb_iseq_t *iseq, LINK_ANCHOR *const optargs, const NODE *cons
}
block_id = args->block_arg;
+ if (args->first_post_arg) {
+ iseq->body->param.post_start = get_dyna_var_idx_at_raw(iseq, args->first_post_arg);
+ iseq->body->param.post_num = args->post_args_num;
+ iseq->body->param.flags.has_post = TRUE;
+ }
+
if (args->opt_args) {
- const NODE *node = args->opt_args;
+ NODE *node = args->opt_args;
LABEL *label;
VALUE labels = rb_ary_tmp_new(1);
VALUE *opt_table;
@@ -1680,7 +1355,7 @@ iseq_set_arguments(rb_iseq_t *iseq, LINK_ANCHOR *const optargs, const NODE *cons
label = NEW_LABEL(nd_line(node));
rb_ary_push(labels, (VALUE)label | 1);
ADD_LABEL(optargs, label);
- COMPILE_POPPED(optargs, "optarg", node->nd_body);
+ COMPILE_POPED(optargs, "optarg", node->nd_body);
node = node->nd_next;
i += 1;
}
@@ -1692,70 +1367,61 @@ iseq_set_arguments(rb_iseq_t *iseq, LINK_ANCHOR *const optargs, const NODE *cons
opt_table = ALLOC_N(VALUE, i+1);
- MEMCPY(opt_table, RARRAY_CONST_PTR_TRANSIENT(labels), VALUE, i+1);
+ MEMCPY(opt_table, RARRAY_CONST_PTR(labels), VALUE, i+1);
for (j = 0; j < i+1; j++) {
opt_table[j] &= ~1;
}
rb_ary_clear(labels);
- body->param.flags.has_opt = TRUE;
- body->param.opt_num = i;
- body->param.opt_table = opt_table;
- arg_size += i;
- }
-
- if (rest_id) {
- body->param.rest_start = arg_size++;
- body->param.flags.has_rest = TRUE;
- assert(body->param.rest_start != -1);
- }
-
- if (args->first_post_arg) {
- body->param.post_start = arg_size;
- body->param.post_num = args->post_args_num;
- body->param.flags.has_post = TRUE;
- arg_size += args->post_args_num;
-
- if (body->param.flags.has_rest) { /* TODO: why that? */
- body->param.post_start = body->param.rest_start + 1;
- }
+ iseq->body->param.flags.has_opt = TRUE;
+ iseq->body->param.opt_num = i;
+ iseq->body->param.opt_table = opt_table;
}
if (args->kw_args) {
- arg_size = iseq_set_arguments_keywords(iseq, optargs, args, arg_size);
+ iseq_set_arguments_keywords(iseq, optargs, args);
}
else if (args->kw_rest_arg) {
struct rb_iseq_param_keyword *keyword = ZALLOC_N(struct rb_iseq_param_keyword, 1);
- keyword->rest_start = arg_size++;
- body->param.keyword = keyword;
- body->param.flags.has_kwrest = TRUE;
+ keyword->rest_start = get_dyna_var_idx_at_raw(iseq, args->kw_rest_arg->nd_vid);
+ iseq->body->param.keyword = keyword;
+ iseq->body->param.flags.has_kwrest = TRUE;
}
- if (block_id) {
- body->param.block_start = arg_size++;
- body->param.flags.has_block = TRUE;
+ if (args->pre_init) { /* m_init */
+ COMPILE_POPED(optargs, "init arguments (m)", args->pre_init);
+ }
+ if (args->post_init) { /* p_init */
+ COMPILE_POPED(optargs, "init arguments (p)", args->post_init);
}
- iseq_calc_param_size(iseq);
- body->param.size = arg_size;
+ if (rest_id) {
+ iseq->body->param.rest_start = get_dyna_var_idx_at_raw(iseq, rest_id);
+ iseq->body->param.flags.has_rest = TRUE;
+ assert(iseq->body->param.rest_start != -1);
- if (args->pre_init) { /* m_init */
- COMPILE_POPPED(optargs, "init arguments (m)", args->pre_init);
+ if (iseq->body->param.post_start == 0) { /* TODO: why that? */
+ iseq->body->param.post_start = iseq->body->param.rest_start + 1;
+ }
}
- if (args->post_init) { /* p_init */
- COMPILE_POPPED(optargs, "init arguments (p)", args->post_init);
+
+ if (block_id) {
+ iseq->body->param.block_start = get_dyna_var_idx_at_raw(iseq, block_id);
+ iseq->body->param.flags.has_block = TRUE;
}
- if (body->type == ISEQ_TYPE_BLOCK) {
- if (body->param.flags.has_opt == FALSE &&
- body->param.flags.has_post == FALSE &&
- body->param.flags.has_rest == FALSE &&
- body->param.flags.has_kw == FALSE &&
- body->param.flags.has_kwrest == FALSE) {
+ iseq_calc_param_size(iseq);
+
+ if (iseq->body->type == ISEQ_TYPE_BLOCK) {
+ if (iseq->body->param.flags.has_opt == FALSE &&
+ iseq->body->param.flags.has_post == FALSE &&
+ iseq->body->param.flags.has_rest == FALSE &&
+ iseq->body->param.flags.has_kw == FALSE &&
+ iseq->body->param.flags.has_kwrest == FALSE) {
- if (body->param.lead_num == 1 && last_comma == 0) {
+ if (iseq->body->param.lead_num == 1 && last_comma == 0) {
/* {|a|} */
- body->param.flags.ambiguous_param0 = TRUE;
+ iseq->body->param.flags.ambiguous_param0 = TRUE;
}
}
}
@@ -1767,10 +1433,10 @@ iseq_set_arguments(rb_iseq_t *iseq, LINK_ANCHOR *const optargs, const NODE *cons
static int
iseq_set_local_table(rb_iseq_t *iseq, const ID *tbl)
{
- unsigned int size;
+ int size;
if (tbl) {
- size = (unsigned int)*tbl;
+ size = (int)*tbl;
tbl++;
}
else {
@@ -1782,66 +1448,45 @@ iseq_set_local_table(rb_iseq_t *iseq, const ID *tbl)
MEMCPY(ids, tbl, ID, size);
iseq->body->local_table = ids;
}
- iseq->body->local_table_size = size;
- debugs("iseq_set_local_table: %u\n", iseq->body->local_table_size);
+ iseq->body->local_size = iseq->body->local_table_size = size;
+ iseq->body->local_size += 1;
+ /*
+ if (lfp == dfp ) { // top, class, method
+ dfp[-1]: svar
+ else { // block
+ dfp[-1]: cref
+ }
+ */
+
+ debugs("iseq_set_local_table: %d, %d\n", iseq->body->local_size, iseq->body->local_table_size);
return COMPILE_OK;
}
static int
cdhash_cmp(VALUE val, VALUE lit)
{
- int tval, tlit;
-
- if (val == lit) {
- return 0;
- }
- else if ((tlit = OBJ_BUILTIN_TYPE(lit)) == -1) {
- return val != lit;
- }
- else if ((tval = OBJ_BUILTIN_TYPE(val)) == -1) {
- return -1;
- }
- else if (tlit != tval) {
- return -1;
+ if (val == lit) return 0;
+ if (SPECIAL_CONST_P(lit)) {
+ return val != lit;
}
- else if (tlit == T_SYMBOL) {
- return val != lit;
- }
- else if (tlit == T_STRING) {
- return rb_str_hash_cmp(lit, val);
- }
- else if (tlit == T_BIGNUM) {
- long x = FIX2LONG(rb_big_cmp(lit, val));
-
- /* Given lit and val are both Bignum, x must be -1, 0, 1.
- * There is no need to call rb_fix2int here. */
- RUBY_ASSERT((x == 1) || (x == 0) || (x == -1));
- return (int)x;
- }
- else if (tlit == T_FLOAT) {
- return rb_float_cmp(lit, val);
+ if (SPECIAL_CONST_P(val) || BUILTIN_TYPE(val) != BUILTIN_TYPE(lit)) {
+ return -1;
}
- else {
- UNREACHABLE_RETURN(-1);
+ if (BUILTIN_TYPE(lit) == T_STRING) {
+ return rb_str_hash_cmp(lit, val);
}
+ return !rb_eql(lit, val);
}
static st_index_t
cdhash_hash(VALUE a)
{
- switch (OBJ_BUILTIN_TYPE(a)) {
- case -1:
- case T_SYMBOL:
- return (st_index_t)a;
- case T_STRING:
- return rb_str_hash(a);
- case T_BIGNUM:
- return FIX2LONG(rb_big_hash(a));
- case T_FLOAT:
- return rb_dbl_long_hash(RFLOAT_VALUE(a));
- default:
- UNREACHABLE_RETURN(0);
+ if (SPECIAL_CONST_P(a)) return (st_index_t)a;
+ if (RB_TYPE_P(a, T_STRING)) return rb_str_hash(a);
+ {
+ VALUE hval = rb_hash(a);
+ return (st_index_t)FIX2LONG(hval);
}
}
@@ -1865,190 +1510,18 @@ cdhash_set_label_i(VALUE key, VALUE val, void *ptr)
return ST_CONTINUE;
}
-
-static inline VALUE
-get_ivar_ic_value(rb_iseq_t *iseq,ID id)
-{
- VALUE val;
- struct rb_id_table *tbl = ISEQ_COMPILE_DATA(iseq)->ivar_cache_table;
- if (tbl) {
- if (rb_id_table_lookup(tbl,id,&val)) {
- return val;
- }
- }
- else {
- tbl = rb_id_table_create(1);
- ISEQ_COMPILE_DATA(iseq)->ivar_cache_table = tbl;
- }
- val = INT2FIX(iseq->body->is_size++);
- rb_id_table_insert(tbl,id,val);
- return val;
-}
-
-#define BADINSN_DUMP(anchor, list, dest) \
- dump_disasm_list_with_cursor(FIRST_ELEMENT(anchor), list, dest)
-
-#define BADINSN_ERROR \
- (xfree(generated_iseq), \
- xfree(insns_info), \
- BADINSN_DUMP(anchor, list, NULL), \
- COMPILE_ERROR)
-
-static int
-fix_sp_depth(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
-{
- int stack_max = 0, sp = 0, line = 0;
- LINK_ELEMENT *list;
-
- for (list = FIRST_ELEMENT(anchor); list; list = list->next) {
- if (list->type == ISEQ_ELEMENT_LABEL) {
- LABEL *lobj = (LABEL *)list;
- lobj->set = TRUE;
- }
- }
-
- for (list = FIRST_ELEMENT(anchor); list; list = list->next) {
- switch (list->type) {
- case ISEQ_ELEMENT_INSN:
- {
- int j, len, insn;
- const char *types;
- VALUE *operands;
- INSN *iobj = (INSN *)list;
-
- /* update sp */
- sp = calc_sp_depth(sp, iobj);
- if (sp < 0) {
- BADINSN_DUMP(anchor, list, NULL);
- COMPILE_ERROR(iseq, iobj->insn_info.line_no,
- "argument stack underflow (%d)", sp);
- return -1;
- }
- if (sp > stack_max) {
- stack_max = sp;
- }
-
- line = iobj->insn_info.line_no;
- /* fprintf(stderr, "insn: %-16s, sp: %d\n", insn_name(iobj->insn_id), sp); */
- operands = iobj->operands;
- insn = iobj->insn_id;
- types = insn_op_types(insn);
- len = insn_len(insn);
-
- /* operand check */
- if (iobj->operand_size != len - 1) {
- /* printf("operand size miss! (%d, %d)\n", iobj->operand_size, len); */
- BADINSN_DUMP(anchor, list, NULL);
- COMPILE_ERROR(iseq, iobj->insn_info.line_no,
- "operand size miss! (%d for %d)",
- iobj->operand_size, len - 1);
- return -1;
- }
-
- for (j = 0; types[j]; j++) {
- if (types[j] == TS_OFFSET) {
- /* label(destination position) */
- LABEL *lobj = (LABEL *)operands[j];
- if (!lobj->set) {
- BADINSN_DUMP(anchor, list, NULL);
- COMPILE_ERROR(iseq, iobj->insn_info.line_no,
- "unknown label: "LABEL_FORMAT, lobj->label_no);
- return -1;
- }
- if (lobj->sp == -1) {
- lobj->sp = sp;
- }
- }
- }
- break;
- }
- case ISEQ_ELEMENT_LABEL:
- {
- LABEL *lobj = (LABEL *)list;
- if (lobj->sp == -1) {
- lobj->sp = sp;
- }
- else {
- sp = lobj->sp;
- }
- break;
- }
- case ISEQ_ELEMENT_TRACE:
- {
- /* ignore */
- break;
- }
- case ISEQ_ELEMENT_ADJUST:
- {
- ADJUST *adjust = (ADJUST *)list;
- int orig_sp = sp;
-
- sp = adjust->label ? adjust->label->sp : 0;
- if (adjust->line_no != -1 && orig_sp - sp < 0) {
- BADINSN_DUMP(anchor, list, NULL);
- COMPILE_ERROR(iseq, adjust->line_no,
- "iseq_set_sequence: adjust bug %d < %d",
- orig_sp, sp);
- return -1;
- }
- break;
- }
- default:
- BADINSN_DUMP(anchor, list, NULL);
- COMPILE_ERROR(iseq, line, "unknown list type: %d", list->type);
- return -1;
- }
- }
- return stack_max;
-}
-
-static int
-add_insn_info(struct iseq_insn_info_entry *insns_info, unsigned int *positions,
- int insns_info_index, int code_index, const INSN *iobj)
-{
- if (insns_info_index == 0 ||
- insns_info[insns_info_index-1].line_no != iobj->insn_info.line_no ||
- insns_info[insns_info_index-1].events != iobj->insn_info.events) {
- insns_info[insns_info_index].line_no = iobj->insn_info.line_no;
- insns_info[insns_info_index].events = iobj->insn_info.events;
- positions[insns_info_index] = code_index;
- return TRUE;
- }
- return FALSE;
-}
-
-static int
-add_adjust_info(struct iseq_insn_info_entry *insns_info, unsigned int *positions,
- int insns_info_index, int code_index, const ADJUST *adjust)
-{
- if (insns_info_index > 0 ||
- insns_info[insns_info_index-1].line_no != adjust->line_no) {
- insns_info[insns_info_index].line_no = adjust->line_no;
- insns_info[insns_info_index].events = 0;
- positions[insns_info_index] = code_index;
- return TRUE;
- }
- return FALSE;
-}
-
/**
ruby insn object list -> raw instruction sequence
*/
static int
-iseq_set_sequence(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
+iseq_set_sequence(rb_iseq_t *iseq, LINK_ANCHOR *anchor)
{
- struct iseq_insn_info_entry *insns_info;
- struct rb_iseq_constant_body *const body = iseq->body;
- unsigned int *positions;
+ struct iseq_line_info_entry *line_info_table;
+ unsigned int last_line = 0;
LINK_ELEMENT *list;
VALUE *generated_iseq;
- rb_event_flag_t events = 0;
- long data = 0;
- int insn_num, code_index, insns_info_index, sp = 0;
- int stack_max = fix_sp_depth(iseq, anchor);
-
- if (stack_max < 0) return COMPILE_NG;
+ int insn_num, code_index, line_info_index, sp, stack_max = 0, line = 0;
/* fix label position */
list = FIRST_ELEMENT(anchor);
@@ -2058,77 +1531,53 @@ iseq_set_sequence(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
case ISEQ_ELEMENT_INSN:
{
INSN *iobj = (INSN *)list;
- /* update sp */
- sp = calc_sp_depth(sp, iobj);
+ line = iobj->line_no;
+ code_index += insn_data_length(iobj);
insn_num++;
- events = iobj->insn_info.events |= events;
- if (ISEQ_COVERAGE(iseq)) {
- if (ISEQ_LINE_COVERAGE(iseq) && (events & RUBY_EVENT_COVERAGE_LINE) &&
- !(rb_get_coverage_mode() & COVERAGE_TARGET_ONESHOT_LINES)) {
- int line = iobj->insn_info.line_no;
- if (line >= 1) {
- RARRAY_ASET(ISEQ_LINE_COVERAGE(iseq), line - 1, INT2FIX(0));
- }
- }
- if (ISEQ_BRANCH_COVERAGE(iseq) && (events & RUBY_EVENT_COVERAGE_BRANCH)) {
- while (RARRAY_LEN(ISEQ_PC2BRANCHINDEX(iseq)) <= code_index) {
- rb_ary_push(ISEQ_PC2BRANCHINDEX(iseq), Qnil);
- }
- RARRAY_ASET(ISEQ_PC2BRANCHINDEX(iseq), code_index, INT2FIX(data));
- }
- }
- code_index += insn_data_length(iobj);
- events = 0;
- data = 0;
break;
}
case ISEQ_ELEMENT_LABEL:
{
LABEL *lobj = (LABEL *)list;
lobj->position = code_index;
- sp = lobj->sp;
+ lobj->set = TRUE;
break;
}
- case ISEQ_ELEMENT_TRACE:
+ case ISEQ_ELEMENT_NONE:
{
- TRACE *trace = (TRACE *)list;
- events |= trace->event;
- if (trace->event & RUBY_EVENT_COVERAGE_BRANCH) data = trace->data;
+ /* ignore */
break;
}
case ISEQ_ELEMENT_ADJUST:
{
ADJUST *adjust = (ADJUST *)list;
if (adjust->line_no != -1) {
- int orig_sp = sp;
- sp = adjust->label ? adjust->label->sp : 0;
- if (orig_sp - sp > 0) {
- if (orig_sp - sp > 1) code_index++; /* 1 operand */
- code_index++; /* insn */
- insn_num++;
- }
+ code_index += 2 /* insn + 1 operand */;
+ insn_num++;
}
break;
}
- default: break;
+ default:
+ dump_disasm_list(FIRST_ELEMENT(anchor));
+ dump_disasm_list(list);
+ COMPILE_ERROR(ruby_sourcefile_string, line, "error: set_sequence");
+ return COMPILE_NG;
}
list = list->next;
}
/* make instruction sequence */
generated_iseq = ALLOC_N(VALUE, code_index);
- insns_info = ALLOC_N(struct iseq_insn_info_entry, insn_num);
- positions = ALLOC_N(unsigned int, insn_num);
- body->is_entries = ZALLOC_N(union iseq_inline_storage_entry, body->is_size);
- body->ci_entries = (struct rb_call_info *)ruby_xmalloc(sizeof(struct rb_call_info) * body->ci_size +
- sizeof(struct rb_call_info_with_kwarg) * body->ci_kw_size);
- MEMZERO(body->ci_entries + body->ci_size, struct rb_call_info_with_kwarg, body->ci_kw_size); /* need to clear ci_kw entries */
- body->cc_entries = ZALLOC_N(struct rb_call_cache, body->ci_size + body->ci_kw_size);
+ line_info_table = ALLOC_N(struct iseq_line_info_entry, insn_num);
+ iseq->body->is_entries = ZALLOC_N(union iseq_inline_storage_entry, iseq->body->is_size);
+ iseq->body->ci_entries = (struct rb_call_info *)ruby_xmalloc(sizeof(struct rb_call_info) * iseq->body->ci_size +
+ sizeof(struct rb_call_info_with_kwarg) * iseq->body->ci_kw_size);
+ iseq->body->cc_entries = ZALLOC_N(struct rb_call_cache, iseq->body->ci_size + iseq->body->ci_kw_size);
ISEQ_COMPILE_DATA(iseq)->ci_index = ISEQ_COMPILE_DATA(iseq)->ci_kw_index = 0;
list = FIRST_ELEMENT(anchor);
- insns_info_index = code_index = sp = 0;
+ line_info_index = code_index = sp = 0;
while (list) {
switch (list->type) {
@@ -2141,6 +1590,10 @@ iseq_set_sequence(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
/* update sp */
sp = calc_sp_depth(sp, iobj);
+ if (sp > stack_max) {
+ stack_max = sp;
+ }
+
/* fprintf(stderr, "insn: %-16s, sp: %d\n", insn_name(iobj->insn_id), sp); */
operands = iobj->operands;
insn = iobj->insn_id;
@@ -2148,6 +1601,18 @@ iseq_set_sequence(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
types = insn_op_types(insn);
len = insn_len(insn);
+ /* operand check */
+ if (iobj->operand_size != len - 1) {
+ /* printf("operand size miss! (%d, %d)\n", iobj->operand_size, len); */
+ dump_disasm_list(list);
+ xfree(generated_iseq);
+ xfree(line_info_table);
+ COMPILE_ERROR(ruby_sourcefile_string, iobj->line_no,
+ "operand size miss! (%d for %d)",
+ iobj->operand_size, len - 1);
+ return COMPILE_NG;
+ }
+
for (j = 0; types[j]; j++) {
char type = types[j];
/* printf("--> [%c - (%d-%d)]\n", type, k, j); */
@@ -2156,6 +1621,14 @@ iseq_set_sequence(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
{
/* label(destination position) */
LABEL *lobj = (LABEL *)operands[j];
+ if (!lobj->set) {
+ COMPILE_ERROR(ruby_sourcefile_string, iobj->line_no,
+ "unknown label");
+ return COMPILE_NG;
+ }
+ if (lobj->sp == -1) {
+ lobj->sp = sp;
+ }
generated_iseq[code_index + 1 + j] = lobj->position - (code_index + len);
break;
}
@@ -2171,38 +1644,32 @@ iseq_set_sequence(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
rb_hash_rehash(map);
freeze_hide_obj(map);
generated_iseq[code_index + 1 + j] = map;
- RB_OBJ_WRITTEN(iseq, Qundef, map);
- FL_SET(iseq, ISEQ_MARKABLE_ISEQ);
break;
}
case TS_LINDEX:
case TS_NUM: /* ulong */
generated_iseq[code_index + 1 + j] = FIX2INT(operands[j]);
break;
- case TS_VALUE: /* VALUE */
case TS_ISEQ: /* iseq */
{
VALUE v = operands[j];
generated_iseq[code_index + 1 + j] = v;
+ break;
+ }
+ case TS_VALUE: /* VALUE */
+ {
+ VALUE v = operands[j];
+ generated_iseq[code_index + 1 + j] = v;
/* to mark ruby object */
- if (!SPECIAL_CONST_P(v)) {
- RB_OBJ_WRITTEN(iseq, Qundef, v);
- FL_SET(iseq, ISEQ_MARKABLE_ISEQ);
- }
+ iseq_add_mark_object(iseq, v);
break;
}
- case TS_ISE: /* inline storage entry */
- /* Treated as an IC, but may contain a markable VALUE */
- FL_SET(iseq, ISEQ_MARKABLE_ISEQ);
case TS_IC: /* inline cache */
{
unsigned int ic_index = FIX2UINT(operands[j]);
- IC ic = (IC)&body->is_entries[ic_index];
- if (UNLIKELY(ic_index >= body->is_size)) {
- BADINSN_DUMP(anchor, &iobj->link, 0);
- COMPILE_ERROR(iseq, iobj->insn_info.line_no,
- "iseq_set_sequence: ic_index overflow: index: %d, size: %d",
- ic_index, body->is_size);
+ IC ic = (IC)&iseq->body->is_entries[ic_index];
+ if (UNLIKELY(ic_index >= iseq->body->is_size)) {
+ rb_bug("iseq_set_sequence: ic_index overflow: index: %d, size: %d", ic_index, iseq->body->is_size);
}
generated_iseq[code_index + 1 + j] = (VALUE)ic;
break;
@@ -2213,16 +1680,16 @@ iseq_set_sequence(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
struct rb_call_info *ci;
if (base_ci->flag & VM_CALL_KWARG) {
- struct rb_call_info_with_kwarg *ci_kw_entries = (struct rb_call_info_with_kwarg *)&body->ci_entries[body->ci_size];
+ struct rb_call_info_with_kwarg *ci_kw_entries = (struct rb_call_info_with_kwarg *)&iseq->body->ci_entries[iseq->body->ci_size];
struct rb_call_info_with_kwarg *ci_kw = &ci_kw_entries[ISEQ_COMPILE_DATA(iseq)->ci_kw_index++];
*ci_kw = *((struct rb_call_info_with_kwarg *)base_ci);
ci = (struct rb_call_info *)ci_kw;
- assert(ISEQ_COMPILE_DATA(iseq)->ci_kw_index <= body->ci_kw_size);
+ assert(ISEQ_COMPILE_DATA(iseq)->ci_kw_index <= iseq->body->ci_kw_size);
}
else {
- ci = &body->ci_entries[ISEQ_COMPILE_DATA(iseq)->ci_index++];
+ ci = &iseq->body->ci_entries[ISEQ_COMPILE_DATA(iseq)->ci_index++];
*ci = *base_ci;
- assert(ISEQ_COMPILE_DATA(iseq)->ci_index <= body->ci_size);
+ assert(ISEQ_COMPILE_DATA(iseq)->ci_index <= iseq->body->ci_size);
}
generated_iseq[code_index + 1 + j] = (VALUE)ci;
@@ -2230,7 +1697,7 @@ iseq_set_sequence(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
}
case TS_CALLCACHE:
{
- struct rb_call_cache *cc = &body->cc_entries[ISEQ_COMPILE_DATA(iseq)->ci_index + ISEQ_COMPILE_DATA(iseq)->ci_kw_index - 1];
+ struct rb_call_cache *cc = &iseq->body->cc_entries[ISEQ_COMPILE_DATA(iseq)->ci_index + ISEQ_COMPILE_DATA(iseq)->ci_kw_index - 1];
generated_iseq[code_index + 1 + j] = (VALUE)cc;
break;
}
@@ -2248,19 +1715,30 @@ iseq_set_sequence(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
generated_iseq[code_index + 1 + j] = operands[j];
break;
default:
- BADINSN_ERROR(iseq, iobj->insn_info.line_no,
+ xfree(generated_iseq);
+ xfree(line_info_table);
+ COMPILE_ERROR(ruby_sourcefile_string, iobj->line_no,
"unknown operand type: %c", type);
return COMPILE_NG;
}
}
- if (add_insn_info(insns_info, positions, insns_info_index, code_index, iobj)) insns_info_index++;
+ if (last_line != iobj->line_no) {
+ line_info_table[line_info_index].line_no = last_line = iobj->line_no;
+ line_info_table[line_info_index].position = code_index;
+ line_info_index++;
+ }
code_index += len;
break;
}
case ISEQ_ELEMENT_LABEL:
{
LABEL *lobj = (LABEL *)list;
- sp = lobj->sp;
+ if (lobj->sp == -1) {
+ lobj->sp = sp;
+ }
+ else {
+ sp = lobj->sp;
+ }
break;
}
case ISEQ_ELEMENT_ADJUST:
@@ -2276,27 +1754,28 @@ iseq_set_sequence(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
}
if (adjust->line_no != -1) {
- const int diff = orig_sp - sp;
- if (diff > 0) {
- if (add_adjust_info(insns_info, positions, insns_info_index, code_index, adjust)) insns_info_index++;
- }
- if (diff > 1) {
+ if (orig_sp - sp > 0) {
+ if (last_line != (unsigned int)adjust->line_no) {
+ line_info_table[line_info_index].line_no = last_line = adjust->line_no;
+ line_info_table[line_info_index].position = code_index;
+ line_info_index++;
+ }
generated_iseq[code_index++] = BIN(adjuststack);
generated_iseq[code_index++] = orig_sp - sp;
}
- else if (diff == 1) {
- generated_iseq[code_index++] = BIN(pop);
+ else if (orig_sp - sp == 0) {
+ /* jump to next insn */
+ if (last_line != (unsigned int)adjust->line_no) {
+ line_info_table[line_info_index].line_no = last_line = adjust->line_no;
+ line_info_table[line_info_index].position = code_index;
+ line_info_index++;
+ }
+ generated_iseq[code_index++] = BIN(nop);
+ generated_iseq[code_index++] = BIN(nop);
}
- else if (diff < 0) {
- int label_no = adjust->label ? adjust->label->label_no : -1;
- xfree(generated_iseq);
- xfree(insns_info);
- xfree(positions);
- debug_list(anchor);
- COMPILE_ERROR(iseq, adjust->line_no,
- "iseq_set_sequence: adjust bug to %d %d < %d",
- label_no, orig_sp, sp);
- return COMPILE_NG;
+ else {
+ rb_compile_bug_str(ruby_sourcefile_string, adjust->line_no,
+ "iseq_set_sequence: adjust bug %d < %d", orig_sp, sp);
}
}
break;
@@ -2308,19 +1787,13 @@ iseq_set_sequence(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
list = list->next;
}
- body->iseq_encoded = (void *)generated_iseq;
- body->iseq_size = code_index;
- body->stack_max = stack_max;
-
- /* get rid of memory leak when REALLOC failed */
- body->insns_info.body = insns_info;
- body->insns_info.positions = positions;
+ iseq->body->iseq_encoded = (void *)generated_iseq;
+ iseq->body->iseq_size = code_index;
+ iseq->body->stack_max = stack_max;
- REALLOC_N(insns_info, struct iseq_insn_info_entry, insns_info_index);
- body->insns_info.body = insns_info;
- REALLOC_N(positions, unsigned int, insns_info_index);
- body->insns_info.positions = positions;
- body->insns_info.size = insns_info_index;
+ REALLOC_N(line_info_table, struct iseq_line_info_entry, line_info_index);
+ iseq->body->line_info_table = line_info_table;
+ iseq->body->line_info_size = line_info_index;
return COMPILE_OK;
}
@@ -2345,20 +1818,24 @@ iseq_set_exception_table(rb_iseq_t *iseq)
struct iseq_catch_table_entry *entry;
tlen = (int)RARRAY_LEN(ISEQ_COMPILE_DATA(iseq)->catch_table_ary);
- tptr = RARRAY_CONST_PTR_TRANSIENT(ISEQ_COMPILE_DATA(iseq)->catch_table_ary);
+ tptr = RARRAY_CONST_PTR(ISEQ_COMPILE_DATA(iseq)->catch_table_ary);
if (tlen > 0) {
struct iseq_catch_table *table = xmalloc(iseq_catch_table_bytes(tlen));
table->size = tlen;
for (i = 0; i < table->size; i++) {
- ptr = RARRAY_CONST_PTR_TRANSIENT(tptr[i]);
+ ptr = RARRAY_CONST_PTR(tptr[i]);
entry = &table->entries[i];
entry->type = (enum catch_type)(ptr[0] & 0xffff);
entry->start = label_get_position((LABEL *)(ptr[1] & ~1));
entry->end = label_get_position((LABEL *)(ptr[2] & ~1));
entry->iseq = (rb_iseq_t *)ptr[3];
- RB_OBJ_WRITTEN(iseq, Qundef, entry->iseq);
+
+ /* register iseq as mark object */
+ if (entry->iseq != 0) {
+ iseq_add_mark_object(iseq, (VALUE)entry->iseq);
+ }
/* stack depth */
if (ptr[4]) {
@@ -2415,32 +1892,14 @@ get_destination_insn(INSN *iobj)
{
LABEL *lobj = (LABEL *)OPERAND_AT(iobj, 0);
LINK_ELEMENT *list;
- rb_event_flag_t events = 0;
list = lobj->link.next;
while (list) {
- switch (list->type) {
- case ISEQ_ELEMENT_INSN:
- case ISEQ_ELEMENT_ADJUST:
- goto found;
- case ISEQ_ELEMENT_LABEL:
- /* ignore */
- break;
- case ISEQ_ELEMENT_TRACE:
- {
- TRACE *trace = (TRACE *)list;
- events |= trace->event;
- }
+ if (list->type == ISEQ_ELEMENT_INSN || list->type == ISEQ_ELEMENT_ADJUST) {
break;
- default: break;
}
list = list->next;
}
- found:
- if (list && IS_INSN(list)) {
- INSN *iobj = (INSN *)list;
- iobj->insn_info.events |= events;
- }
return list;
}
@@ -2450,7 +1909,7 @@ get_next_insn(INSN *iobj)
LINK_ELEMENT *list = iobj->link.next;
while (list) {
- if (IS_INSN(list) || IS_ADJUST(list)) {
+ if (list->type == ISEQ_ELEMENT_INSN || list->type == ISEQ_ELEMENT_ADJUST) {
return list;
}
list = list->next;
@@ -2464,7 +1923,7 @@ get_prev_insn(INSN *iobj)
LINK_ELEMENT *list = iobj->link.prev;
while (list) {
- if (IS_INSN(list) || IS_ADJUST(list)) {
+ if (list->type == ISEQ_ELEMENT_INSN || list->type == ISEQ_ELEMENT_ADJUST) {
return list;
}
list = list->prev;
@@ -2473,11 +1932,11 @@ get_prev_insn(INSN *iobj)
}
static void
-unref_destination(INSN *iobj, int pos)
+unref_destination(INSN *iobj)
{
- LABEL *lobj = (LABEL *)OPERAND_AT(iobj, pos);
+ LABEL *lobj = (LABEL *)OPERAND_AT(iobj, 0);
--lobj->refcnt;
- if (!lobj->refcnt) ELEM_REMOVE(&lobj->link);
+ if (!lobj->refcnt) REMOVE_ELEM(&lobj->link);
}
static void
@@ -2489,227 +1948,50 @@ replace_destination(INSN *dobj, INSN *nobj)
--dl->refcnt;
++nl->refcnt;
OPERAND_AT(dobj, 0) = n;
- if (!dl->refcnt) ELEM_REMOVE(&dl->link);
-}
-
-static LABEL*
-find_destination(INSN *i)
-{
- int pos, len = insn_len(i->insn_id);
- for (pos = 0; pos < len; ++pos) {
- if (insn_op_types(i->insn_id)[pos] == TS_OFFSET) {
- return (LABEL *)OPERAND_AT(i, pos);
- }
- }
- return 0;
+ if (!dl->refcnt) REMOVE_ELEM(&dl->link);
}
static int
-remove_unreachable_chunk(rb_iseq_t *iseq, LINK_ELEMENT *i)
-{
- LINK_ELEMENT *first = i, *end;
- int *unref_counts = 0, nlabels = ISEQ_COMPILE_DATA(iseq)->label_no;
-
- if (!i) return 0;
- unref_counts = ALLOCA_N(int, nlabels);
- MEMZERO(unref_counts, int, nlabels);
- end = i;
- do {
- LABEL *lab;
- if (IS_INSN(i)) {
- if (IS_INSN_ID(i, leave)) {
- end = i;
- break;
- }
- else if ((lab = find_destination((INSN *)i)) != 0) {
- if (lab->unremovable) break;
- unref_counts[lab->label_no]++;
- }
- }
- else if (IS_LABEL(i)) {
- lab = (LABEL *)i;
- if (lab->unremovable) return 0;
- if (lab->refcnt > unref_counts[lab->label_no]) {
- if (i == first) return 0;
+remove_unreachable_chunk(LINK_ELEMENT *i)
+{
+ int removed = 0;
+ while (i) {
+ if (i->type == ISEQ_ELEMENT_INSN) {
+ switch (INSN_OF(i)) {
+ case BIN(jump):
+ case BIN(branchif):
+ case BIN(branchunless):
+ case BIN(branchnil):
+ unref_destination((INSN *)i);
+ default:
break;
}
- continue;
- }
- else if (IS_TRACE(i)) {
- /* do nothing */
- }
- else if (IS_ADJUST(i)) {
- LABEL *dest = ((ADJUST *)i)->label;
- if (dest && dest->unremovable) return 0;
- }
- end = i;
- } while ((i = i->next) != 0);
- i = first;
- do {
- if (IS_INSN(i)) {
- struct rb_iseq_constant_body *body = iseq->body;
- VALUE insn = INSN_OF(i);
- int pos, len = insn_len(insn);
- for (pos = 0; pos < len; ++pos) {
- switch (insn_op_types(insn)[pos]) {
- case TS_OFFSET:
- unref_destination((INSN *)i, pos);
- break;
- case TS_CALLINFO:
- if (((struct rb_call_info *)OPERAND_AT(i, pos))->flag & VM_CALL_KWARG)
- --(body->ci_kw_size);
- else
- --(body->ci_size);
- break;
- }
- }
}
- ELEM_REMOVE(i);
- } while ((i != end) && (i = i->next) != 0);
- return 1;
-}
-
-static int
-iseq_pop_newarray(rb_iseq_t *iseq, INSN *iobj)
-{
- switch (OPERAND_AT(iobj, 0)) {
- case INT2FIX(0): /* empty array */
- ELEM_REMOVE(&iobj->link);
- return TRUE;
- case INT2FIX(1): /* single element array */
- ELEM_REMOVE(&iobj->link);
- return FALSE;
- default:
- iobj->insn_id = BIN(adjuststack);
- return TRUE;
- }
-}
-
-static int
-same_debug_pos_p(LINK_ELEMENT *iobj1, LINK_ELEMENT *iobj2)
-{
- VALUE debug1 = OPERAND_AT(iobj1, 0);
- VALUE debug2 = OPERAND_AT(iobj2, 0);
- if (debug1 == debug2) return TRUE;
- if (!RB_TYPE_P(debug1, T_ARRAY)) return FALSE;
- if (!RB_TYPE_P(debug2, T_ARRAY)) return FALSE;
- if (RARRAY_LEN(debug1) != 2) return FALSE;
- if (RARRAY_LEN(debug2) != 2) return FALSE;
- if (RARRAY_AREF(debug1, 0) != RARRAY_AREF(debug2, 0)) return FALSE;
- if (RARRAY_AREF(debug1, 1) != RARRAY_AREF(debug2, 1)) return FALSE;
- return TRUE;
-}
-
-static int
-is_frozen_putstring(INSN *insn, VALUE *op)
-{
- if (IS_INSN_ID(insn, putstring)) {
- *op = OPERAND_AT(insn, 0);
- return 1;
- }
- else if (IS_INSN_ID(insn, putobject)) { /* frozen_string_literal */
- *op = OPERAND_AT(insn, 0);
- return RB_TYPE_P(*op, T_STRING);
+ else break;
+ REMOVE_ELEM(i);
+ removed = 1;
+ i = i->next;
}
- return 0;
-}
-
-static int
-optimize_checktype(rb_iseq_t *iseq, INSN *iobj)
-{
- /*
- * putobject obj
- * dup
- * checktype T_XXX
- * branchif l1
- * l2:
- * ...
- * l1:
- *
- * => obj is a T_XXX
- *
- * putobject obj (T_XXX)
- * jump L1
- * L1:
- *
- * => obj is not a T_XXX
- *
- * putobject obj (T_XXX)
- * jump L2
- * L2:
- */
- int line;
- INSN *niobj, *ciobj, *dup = 0;
- LABEL *dest = 0;
- VALUE type;
-
- switch (INSN_OF(iobj)) {
- case BIN(putstring):
- type = INT2FIX(T_STRING);
- break;
- case BIN(putnil):
- type = INT2FIX(T_NIL);
- break;
- case BIN(putobject):
- type = INT2FIX(TYPE(OPERAND_AT(iobj, 0)));
- break;
- default: return FALSE;
- }
-
- ciobj = (INSN *)get_next_insn(iobj);
- if (IS_INSN_ID(ciobj, jump)) {
- ciobj = (INSN *)get_next_insn((INSN*)OPERAND_AT(ciobj, 0));
- }
- if (IS_INSN_ID(ciobj, dup)) {
- ciobj = (INSN *)get_next_insn(dup = ciobj);
- }
- if (!ciobj || !IS_INSN_ID(ciobj, checktype)) return FALSE;
- niobj = (INSN *)get_next_insn(ciobj);
- if (!niobj) {
- no_branch:
- /* TODO: putobject true/false */
- return FALSE;
- }
- switch (INSN_OF(niobj)) {
- case BIN(branchif):
- if (OPERAND_AT(ciobj, 0) == type) {
- dest = (LABEL *)OPERAND_AT(niobj, 0);
- }
- break;
- case BIN(branchunless):
- if (OPERAND_AT(ciobj, 0) != type) {
- dest = (LABEL *)OPERAND_AT(niobj, 0);
- }
- break;
- default:
- goto no_branch;
- }
- line = ciobj->insn_info.line_no;
- if (!dest) {
- if (niobj->link.next && IS_LABEL(niobj->link.next)) {
- dest = (LABEL *)niobj->link.next; /* reuse label */
- }
- else {
- dest = NEW_LABEL(line);
- ELEM_INSERT_NEXT(&niobj->link, &dest->link);
- }
- }
- INSERT_AFTER_INSN1(iobj, line, jump, dest);
- LABEL_REF(dest);
- if (!dup) INSERT_AFTER_INSN(iobj, line, pop);
- return TRUE;
+ return removed;
}
static int
iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcallopt)
{
- INSN *const iobj = (INSN *)list;
-
+ INSN *iobj = (INSN *)list;
again:
- optimize_checktype(iseq, iobj);
-
- if (IS_INSN_ID(iobj, jump)) {
+ if (iobj->insn_id == BIN(jump)) {
INSN *niobj, *diobj, *piobj;
+ /*
+ * useless jump elimination:
+ * jump LABEL1
+ * ...
+ * LABEL1:
+ * jump LABEL2
+ *
+ * => in this case, first jump instruction should jump to
+ * LABEL2 directly
+ */
diobj = (INSN *)get_destination_insn(iobj);
niobj = (INSN *)get_next_insn(iobj);
@@ -2720,28 +2002,16 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal
* =>
* LABEL:
*/
- unref_destination(iobj, 0);
- ELEM_REMOVE(&iobj->link);
- return COMPILE_OK;
+ unref_destination(iobj);
+ REMOVE_ELEM(&iobj->link);
}
- else if (iobj != diobj && IS_INSN_ID(diobj, jump) &&
+ else if (iobj != diobj && diobj->insn_id == BIN(jump) &&
OPERAND_AT(iobj, 0) != OPERAND_AT(diobj, 0)) {
- /*
- * useless jump elimination:
- * jump LABEL1
- * ...
- * LABEL1:
- * jump LABEL2
- *
- * => in this case, first jump instruction should jump to
- * LABEL2 directly
- */
replace_destination(iobj, diobj);
- remove_unreachable_chunk(iseq, iobj->link.next);
+ remove_unreachable_chunk(iobj->link.next);
goto again;
}
- else if (IS_INSN_ID(diobj, leave)) {
- INSN *pop;
+ else if (diobj->insn_id == BIN(leave)) {
/*
* jump LABEL
* ...
@@ -2749,115 +2019,57 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal
* leave
* =>
* leave
- * pop
* ...
* LABEL:
* leave
*/
+ INSN *eiobj = new_insn_core(iseq, iobj->line_no, BIN(leave),
+ diobj->operand_size, diobj->operands);
+ INSN *popiobj = new_insn_core(iseq, iobj->line_no,
+ BIN(pop), 0, 0);
/* replace */
- unref_destination(iobj, 0);
- iobj->insn_id = BIN(leave);
- iobj->operand_size = 0;
- iobj->insn_info = diobj->insn_info;
- /* adjust stack depth */
- pop = new_insn_body(iseq, diobj->insn_info.line_no, BIN(pop), 0);
- ELEM_INSERT_NEXT(&iobj->link, &pop->link);
+ unref_destination(iobj);
+ REPLACE_ELEM((LINK_ELEMENT *)iobj, (LINK_ELEMENT *)eiobj);
+ INSERT_ELEM_NEXT((LINK_ELEMENT *)eiobj, (LINK_ELEMENT *)popiobj);
+ iobj = eiobj;
goto again;
}
- else if (IS_INSN(iobj->link.prev) &&
- (piobj = (INSN *)iobj->link.prev) &&
- (IS_INSN_ID(piobj, branchif) ||
- IS_INSN_ID(piobj, branchunless))) {
- INSN *pdiobj = (INSN *)get_destination_insn(piobj);
- if (niobj == pdiobj) {
- int refcnt = IS_LABEL(piobj->link.next) ?
- ((LABEL *)piobj->link.next)->refcnt : 0;
- /*
- * useless jump elimination (if/unless destination):
- * if L1
- * jump L2
- * L1:
- * ...
- * L2:
- *
- * ==>
- * unless L2
- * L1:
- * ...
- * L2:
- */
- piobj->insn_id = (IS_INSN_ID(piobj, branchif))
+ /*
+ * useless jump elimination (if/unless destination):
+ * if L1
+ * jump L2
+ * L1:
+ * ...
+ * L2:
+ *
+ * ==>
+ * unless L2
+ * L1:
+ * ...
+ * L2:
+ */
+ else if ((piobj = (INSN *)get_prev_insn(iobj)) != 0 &&
+ (piobj->insn_id == BIN(branchif) ||
+ piobj->insn_id == BIN(branchunless))) {
+ if (niobj == (INSN *)get_destination_insn(piobj)) {
+ piobj->insn_id = (piobj->insn_id == BIN(branchif))
? BIN(branchunless) : BIN(branchif);
replace_destination(piobj, iobj);
- if (refcnt <= 1) {
- ELEM_REMOVE(&iobj->link);
- }
- else {
- /* TODO: replace other branch destinations too */
- }
- return COMPILE_OK;
- }
- else if (diobj == pdiobj) {
- /*
- * useless jump elimination (if/unless before jump):
- * L1:
- * ...
- * if L1
- * jump L1
- *
- * ==>
- * L1:
- * ...
- * pop
- * jump L1
- */
- INSN *popiobj = new_insn_core(iseq, iobj->insn_info.line_no,
- BIN(pop), 0, 0);
- ELEM_REPLACE(&piobj->link, &popiobj->link);
+ REMOVE_ELEM(&iobj->link);
}
}
- if (remove_unreachable_chunk(iseq, iobj->link.next)) {
+ else if (remove_unreachable_chunk(iobj->link.next)) {
goto again;
}
}
- /*
- * putstring "beg"
- * putstring "end"
- * newrange excl
- *
- * ==>
- *
- * putobject "beg".."end"
- */
- if (IS_INSN_ID(iobj, checkmatch)) {
- INSN *range = (INSN *)get_prev_insn(iobj);
- INSN *beg, *end;
- VALUE str_beg, str_end;
-
- if (range && IS_INSN_ID(range, newrange) &&
- (end = (INSN *)get_prev_insn(range)) != 0 &&
- is_frozen_putstring(end, &str_end) &&
- (beg = (INSN *)get_prev_insn(end)) != 0 &&
- is_frozen_putstring(beg, &str_beg)) {
- int excl = FIX2INT(OPERAND_AT(range, 0));
- VALUE lit_range = rb_range_new(str_beg, str_end, excl);
-
- iseq_add_mark_object_compile_time(iseq, lit_range);
- ELEM_REMOVE(&beg->link);
- ELEM_REMOVE(&end->link);
- range->insn_id = BIN(putobject);
- OPERAND_AT(range, 0) = lit_range;
- }
- }
-
- if (IS_INSN_ID(iobj, leave)) {
- remove_unreachable_chunk(iseq, iobj->link.next);
+ if (iobj->insn_id == BIN(leave)) {
+ remove_unreachable_chunk(iobj->link.next);
}
- if (IS_INSN_ID(iobj, branchif) ||
- IS_INSN_ID(iobj, branchnil) ||
- IS_INSN_ID(iobj, branchunless)) {
+ if (iobj->insn_id == BIN(branchif) ||
+ iobj->insn_id == BIN(branchnil) ||
+ iobj->insn_id == BIN(branchunless)) {
/*
* if L1
* ...
@@ -2870,17 +2082,17 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal
INSN *pobj = (INSN *)iobj->link.prev;
int prev_dup = 0;
if (pobj) {
- if (!IS_INSN(&pobj->link))
+ if (pobj->link.type != ISEQ_ELEMENT_INSN)
pobj = 0;
- else if (IS_INSN_ID(pobj, dup))
+ else if (pobj->insn_id == BIN(dup))
prev_dup = 1;
}
for (;;) {
- if (IS_INSN_ID(nobj, jump)) {
+ if (nobj->insn_id == BIN(jump)) {
replace_destination(iobj, nobj);
}
- else if (prev_dup && IS_INSN_ID(nobj, dup) &&
+ else if (prev_dup && nobj->insn_id == BIN(dup) &&
!!(nobj = (INSN *)nobj->link.next) &&
/* basic blocks, with no labels in the middle */
nobj->insn_id == iobj->insn_id) {
@@ -2927,43 +2139,31 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal
*
*/
int cond;
- if (prev_dup && IS_INSN(pobj->link.prev)) {
+ if (prev_dup && pobj->link.prev->type == ISEQ_ELEMENT_INSN) {
pobj = (INSN *)pobj->link.prev;
}
- if (IS_INSN_ID(pobj, putobject)) {
- cond = (IS_INSN_ID(iobj, branchif) ?
+ if (pobj->insn_id == BIN(putobject)) {
+ cond = (iobj->insn_id == BIN(branchif) ?
OPERAND_AT(pobj, 0) != Qfalse :
- IS_INSN_ID(iobj, branchunless) ?
+ iobj->insn_id == BIN(branchunless) ?
OPERAND_AT(pobj, 0) == Qfalse :
FALSE);
}
- else if (IS_INSN_ID(pobj, putstring) ||
- IS_INSN_ID(pobj, duparray) ||
- IS_INSN_ID(pobj, newarray)) {
- cond = IS_INSN_ID(iobj, branchif);
+ else if (pobj->insn_id == BIN(putstring)) {
+ cond = iobj->insn_id == BIN(branchif);
}
- else if (IS_INSN_ID(pobj, putnil)) {
- cond = !IS_INSN_ID(iobj, branchif);
+ else if (pobj->insn_id == BIN(putnil)) {
+ cond = iobj->insn_id != BIN(branchif);
}
else break;
- if (prev_dup || !IS_INSN_ID(pobj, newarray)) {
- ELEM_REMOVE(iobj->link.prev);
- }
- else if (!iseq_pop_newarray(iseq, pobj)) {
- pobj = new_insn_core(iseq, pobj->insn_info.line_no, BIN(pop), 0, NULL);
- ELEM_INSERT_PREV(&iobj->link, &pobj->link);
- }
+ REMOVE_ELEM(iobj->link.prev);
if (cond) {
- if (prev_dup) {
- pobj = new_insn_core(iseq, pobj->insn_info.line_no, BIN(putnil), 0, NULL);
- ELEM_INSERT_NEXT(&iobj->link, &pobj->link);
- }
iobj->insn_id = BIN(jump);
goto again;
}
else {
- unref_destination(iobj, 0);
- ELEM_REMOVE(&iobj->link);
+ unref_destination(iobj);
+ REMOVE_ELEM(&iobj->link);
}
break;
}
@@ -2972,7 +2172,7 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal
}
}
- if (IS_INSN_ID(iobj, pop)) {
+ if (iobj->insn_id == BIN(pop)) {
/*
* putself / putnil / putobject obj / putstring "..."
* pop
@@ -2980,161 +2180,23 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal
* # do nothing
*/
LINK_ELEMENT *prev = iobj->link.prev;
- if (IS_INSN(prev)) {
+ if (prev->type == ISEQ_ELEMENT_INSN) {
enum ruby_vminsn_type previ = ((INSN *)prev)->insn_id;
if (previ == BIN(putobject) || previ == BIN(putnil) ||
- previ == BIN(putself) || previ == BIN(putstring) ||
- previ == BIN(dup) ||
- previ == BIN(getlocal) ||
- previ == BIN(getblockparam) ||
- previ == BIN(getblockparamproxy) ||
- /* getinstancevariable may issue a warning */
- previ == BIN(duparray)) {
+ previ == BIN(putself) || previ == BIN(putstring)) {
/* just push operand or static value and pop soon, no
* side effects */
- ELEM_REMOVE(prev);
- ELEM_REMOVE(&iobj->link);
- }
- else if (previ == BIN(newarray) && iseq_pop_newarray(iseq, (INSN*)prev)) {
- ELEM_REMOVE(&iobj->link);
- }
- else if (previ == BIN(concatarray)) {
- INSN *piobj = (INSN *)prev;
- INSERT_BEFORE_INSN1(piobj, piobj->insn_info.line_no, splatarray, Qfalse);
- INSN_OF(piobj) = BIN(pop);
+ REMOVE_ELEM(prev);
+ REMOVE_ELEM(&iobj->link);
}
- else if (previ == BIN(concatstrings)) {
- if (OPERAND_AT(prev, 0) == INT2FIX(1)) {
- ELEM_REMOVE(prev);
- }
- else {
- ELEM_REMOVE(&iobj->link);
- INSN_OF(prev) = BIN(adjuststack);
- }
- }
- }
- }
-
- if (IS_INSN_ID(iobj, newarray) ||
- IS_INSN_ID(iobj, duparray) ||
- IS_INSN_ID(iobj, expandarray) ||
- IS_INSN_ID(iobj, concatarray) ||
- IS_INSN_ID(iobj, splatarray) ||
- 0) {
- /*
- * newarray N
- * splatarray
- * =>
- * newarray N
- * newarray always puts an array
- */
- LINK_ELEMENT *next = iobj->link.next;
- if (IS_INSN(next) && IS_INSN_ID(next, splatarray)) {
- /* remove splatarray following always-array insn */
- ELEM_REMOVE(next);
- }
- }
-
- if (IS_INSN_ID(iobj, tostring)) {
- LINK_ELEMENT *next = iobj->link.next;
- /*
- * tostring
- * concatstrings 1
- * =>
- * tostring
- */
- if (IS_INSN(next) && IS_INSN_ID(next, concatstrings) &&
- OPERAND_AT(next, 0) == INT2FIX(1)) {
- ELEM_REMOVE(next);
- }
- }
-
- if (IS_INSN_ID(iobj, putstring) ||
- (IS_INSN_ID(iobj, putobject) && RB_TYPE_P(OPERAND_AT(iobj, 0), T_STRING))) {
- /*
- * putstring ""
- * concatstrings N
- * =>
- * concatstrings N-1
- */
- if (IS_NEXT_INSN_ID(&iobj->link, concatstrings) &&
- RSTRING_LEN(OPERAND_AT(iobj, 0)) == 0) {
- INSN *next = (INSN *)iobj->link.next;
- if ((OPERAND_AT(next, 0) = FIXNUM_INC(OPERAND_AT(next, 0), -1)) == INT2FIX(1)) {
- ELEM_REMOVE(&next->link);
- }
- ELEM_REMOVE(&iobj->link);
- }
- }
-
- if (IS_INSN_ID(iobj, concatstrings)) {
- /*
- * concatstrings N
- * concatstrings M
- * =>
- * concatstrings N+M-1
- */
- LINK_ELEMENT *next = iobj->link.next, *freeze = 0;
- INSN *jump = 0;
- if (IS_INSN(next) && IS_INSN_ID(next, freezestring))
- next = (freeze = next)->next;
- if (IS_INSN(next) && IS_INSN_ID(next, jump))
- next = get_destination_insn(jump = (INSN *)next);
- if (IS_INSN(next) && IS_INSN_ID(next, concatstrings)) {
- int n = FIX2INT(OPERAND_AT(iobj, 0)) + FIX2INT(OPERAND_AT(next, 0)) - 1;
- OPERAND_AT(iobj, 0) = INT2FIX(n);
- if (jump) {
- LABEL *label = ((LABEL *)OPERAND_AT(jump, 0));
- if (!--label->refcnt) {
- ELEM_REMOVE(&label->link);
- }
- else {
- label = NEW_LABEL(0);
- OPERAND_AT(jump, 0) = (VALUE)label;
- }
- label->refcnt++;
- if (freeze && IS_NEXT_INSN_ID(next, freezestring)) {
- if (same_debug_pos_p(freeze, next->next)) {
- ELEM_REMOVE(freeze);
- }
- else {
- next = next->next;
- }
- }
- ELEM_INSERT_NEXT(next, &label->link);
- CHECK(iseq_peephole_optimize(iseq, get_next_insn(jump), do_tailcallopt));
- }
- else {
- if (freeze) ELEM_REMOVE(freeze);
- ELEM_REMOVE(next);
- }
- }
- }
-
- if (IS_INSN_ID(iobj, freezestring) &&
- NIL_P(OPERAND_AT(iobj, 0)) &&
- IS_NEXT_INSN_ID(&iobj->link, send)) {
- INSN *niobj = (INSN *)iobj->link.next;
- struct rb_call_info *ci = (struct rb_call_info *)OPERAND_AT(niobj, 0);
- /*
- * freezestring nil # no debug_info
- * send <:+@, 0, ARG_SIMPLE> # :-@, too
- * =>
- * send <:+@, 0, ARG_SIMPLE> # :-@, too
- */
- if ((ci->mid == idUPlus || ci->mid == idUMinus) &&
- (ci->flag & VM_CALL_ARGS_SIMPLE) &&
- ci->orig_argc == 0) {
- ELEM_REMOVE(list);
- return COMPILE_OK;
}
}
if (do_tailcallopt &&
- (IS_INSN_ID(iobj, send) ||
- IS_INSN_ID(iobj, opt_aref_with) ||
- IS_INSN_ID(iobj, opt_aset_with) ||
- IS_INSN_ID(iobj, invokesuper))) {
+ (iobj->insn_id == BIN(send) ||
+ iobj->insn_id == BIN(opt_aref_with) ||
+ iobj->insn_id == BIN(opt_aset_with) ||
+ iobj->insn_id == BIN(invokesuper))) {
/*
* send ...
* leave
@@ -3146,21 +2208,15 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal
if (iobj->link.next) {
LINK_ELEMENT *next = iobj->link.next;
do {
- if (!IS_INSN(next)) {
+ if (next->type != ISEQ_ELEMENT_INSN) {
next = next->next;
continue;
}
switch (INSN_OF(next)) {
case BIN(nop):
+ /*case BIN(trace):*/
next = next->next;
break;
- case BIN(jump):
- /* if cond
- * return tailcall
- * end
- */
- next = get_destination_insn((INSN *)next);
- break;
case BIN(leave):
piobj = iobj;
default:
@@ -3172,55 +2228,12 @@ iseq_peephole_optimize(rb_iseq_t *iseq, LINK_ELEMENT *list, const int do_tailcal
if (piobj) {
struct rb_call_info *ci = (struct rb_call_info *)piobj->operands[0];
- if (IS_INSN_ID(piobj, send) || IS_INSN_ID(piobj, invokesuper)) {
- if (piobj->operands[2] == 0) { /* no blockiseq */
- ci->flag |= VM_CALL_TAILCALL;
- }
- }
- else {
+ rb_iseq_t *blockiseq = (rb_iseq_t *)piobj->operands[1];
+ if (blockiseq == 0) {
ci->flag |= VM_CALL_TAILCALL;
}
}
}
-
- if (IS_INSN_ID(iobj, dup)) {
- if (IS_NEXT_INSN_ID(&iobj->link, setlocal)) {
- LINK_ELEMENT *set1 = iobj->link.next, *set2 = NULL;
- if (IS_NEXT_INSN_ID(set1, setlocal)) {
- set2 = set1->next;
- if (OPERAND_AT(set1, 0) == OPERAND_AT(set2, 0) &&
- OPERAND_AT(set1, 1) == OPERAND_AT(set2, 1)) {
- ELEM_REMOVE(set1);
- ELEM_REMOVE(&iobj->link);
- }
- }
- else if (IS_NEXT_INSN_ID(set1, dup) &&
- IS_NEXT_INSN_ID(set1->next, setlocal)) {
- set2 = set1->next->next;
- if (OPERAND_AT(set1, 0) == OPERAND_AT(set2, 0) &&
- OPERAND_AT(set1, 1) == OPERAND_AT(set2, 1)) {
- ELEM_REMOVE(set1->next);
- ELEM_REMOVE(set2);
- }
- }
- }
- }
-
- if (IS_INSN_ID(iobj, getlocal)) {
- LINK_ELEMENT *niobj = &iobj->link;
- if (IS_NEXT_INSN_ID(niobj, dup)) {
- niobj = niobj->next;
- }
- if (IS_NEXT_INSN_ID(niobj, setlocal)) {
- LINK_ELEMENT *set1 = niobj->next;
- if (OPERAND_AT(iobj, 0) == OPERAND_AT(set1, 0) &&
- OPERAND_AT(iobj, 1) == OPERAND_AT(set1, 1)) {
- ELEM_REMOVE(set1);
- ELEM_REMOVE(niobj);
- }
- }
- }
-
return COMPILE_OK;
}
@@ -3234,9 +2247,9 @@ insn_set_specialized_instruction(rb_iseq_t *iseq, INSN *iobj, int insn_id)
VALUE *old_operands = iobj->operands;
iobj->operand_size = 4;
iobj->operands = (VALUE *)compile_data_alloc(iseq, iobj->operand_size * sizeof(VALUE));
- iobj->operands[0] = (VALUE)new_callinfo(iseq, idEq, 1, 0, NULL, FALSE);
+ iobj->operands[0] = old_operands[0];
iobj->operands[1] = Qfalse; /* CALL_CACHE */
- iobj->operands[2] = old_operands[0];
+ iobj->operands[2] = (VALUE)new_callinfo(iseq, idEq, 1, 0, NULL, FALSE);
iobj->operands[3] = Qfalse; /* CALL_CACHE */
}
@@ -3246,30 +2259,7 @@ insn_set_specialized_instruction(rb_iseq_t *iseq, INSN *iobj, int insn_id)
static int
iseq_specialized_instruction(rb_iseq_t *iseq, INSN *iobj)
{
- if (IS_INSN_ID(iobj, newarray) && iobj->link.next &&
- IS_INSN(iobj->link.next)) {
- /*
- * [a, b, ...].max/min -> a, b, c, opt_newarray_max/min
- */
- INSN *niobj = (INSN *)iobj->link.next;
- if (IS_INSN_ID(niobj, send)) {
- struct rb_call_info *ci = (struct rb_call_info *)OPERAND_AT(niobj, 0);
- if ((ci->flag & VM_CALL_ARGS_SIMPLE) && ci->orig_argc == 0) {
- switch (ci->mid) {
- case idMax:
- iobj->insn_id = BIN(opt_newarray_max);
- ELEM_REMOVE(&niobj->link);
- return COMPILE_OK;
- case idMin:
- iobj->insn_id = BIN(opt_newarray_min);
- ELEM_REMOVE(&niobj->link);
- return COMPILE_OK;
- }
- }
- }
- }
-
- if (IS_INSN_ID(iobj, send)) {
+ if (iobj->insn_id == BIN(send)) {
struct rb_call_info *ci = (struct rb_call_info *)OPERAND_AT(iobj, 0);
const rb_iseq_t *blockiseq = (rb_iseq_t *)OPERAND_AT(iobj, 2);
@@ -3300,8 +2290,6 @@ iseq_specialized_instruction(rb_iseq_t *iseq, INSN *iobj)
case idGE: SP_INSN(ge); return COMPILE_OK;
case idLTLT: SP_INSN(ltlt); return COMPILE_OK;
case idAREF: SP_INSN(aref); return COMPILE_OK;
- case idAnd: SP_INSN(and); return COMPILE_OK;
- case idOr: SP_INSN(or); return COMPILE_OK;
}
break;
case 2:
@@ -3322,41 +2310,20 @@ iseq_specialized_instruction(rb_iseq_t *iseq, INSN *iobj)
return COMPILE_OK;
}
-static inline int
-tailcallable_p(rb_iseq_t *iseq)
-{
- switch (iseq->body->type) {
- case ISEQ_TYPE_TOP:
- case ISEQ_TYPE_EVAL:
- case ISEQ_TYPE_MAIN:
- /* not tail callable because cfp will be over popped */
- case ISEQ_TYPE_RESCUE:
- case ISEQ_TYPE_ENSURE:
- /* rescue block can't tail call because of errinfo */
- return FALSE;
- default:
- return TRUE;
- }
-}
-
static int
-iseq_optimize(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
+iseq_optimize(rb_iseq_t *iseq, LINK_ANCHOR *anchor)
{
LINK_ELEMENT *list;
const int do_peepholeopt = ISEQ_COMPILE_DATA(iseq)->option->peephole_optimization;
- const int do_tailcallopt = tailcallable_p(iseq) &&
- ISEQ_COMPILE_DATA(iseq)->option->tailcall_optimization;
+ const int do_tailcallopt = ISEQ_COMPILE_DATA(iseq)->option->tailcall_optimization;
const int do_si = ISEQ_COMPILE_DATA(iseq)->option->specialized_instruction;
const int do_ou = ISEQ_COMPILE_DATA(iseq)->option->operands_unification;
- int rescue_level = 0;
- int tailcallopt = do_tailcallopt;
-
list = FIRST_ELEMENT(anchor);
while (list) {
- if (IS_INSN(list)) {
+ if (list->type == ISEQ_ELEMENT_INSN) {
if (do_peepholeopt) {
- iseq_peephole_optimize(iseq, list, tailcallopt);
+ iseq_peephole_optimize(iseq, list, do_tailcallopt);
}
if (do_si) {
iseq_specialized_instruction(iseq, (INSN *)list);
@@ -3365,17 +2332,6 @@ iseq_optimize(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
insn_operands_unification((INSN *)list);
}
}
- if (IS_LABEL(list)) {
- switch (((LABEL *)list)->rescued) {
- case LABEL_RESCUE_BEG:
- rescue_level++;
- tailcallopt = FALSE;
- break;
- case LABEL_RESCUE_END:
- if (!--rescue_level) tailcallopt = do_tailcallopt;
- break;
- }
- }
list = list->next;
}
return COMPILE_OK;
@@ -3413,7 +2369,7 @@ new_unified_insn(rb_iseq_t *iseq,
list = list->next;
}
- return new_insn_core(iseq, iobj->insn_info.line_no, insn_id, argc, operands);
+ return new_insn_core(iseq, iobj->line_no, insn_id, argc, operands);
}
#endif
@@ -3423,7 +2379,7 @@ new_unified_insn(rb_iseq_t *iseq,
* It's future work (if compile time was bottle neck).
*/
static int
-iseq_insns_unification(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
+iseq_insns_unification(rb_iseq_t *iseq, LINK_ANCHOR *anchor)
{
#if OPT_INSTRUCTIONS_UNIFICATION
LINK_ELEMENT *list;
@@ -3433,7 +2389,7 @@ iseq_insns_unification(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
list = FIRST_ELEMENT(anchor);
while (list) {
- if (IS_INSN(list)) {
+ if (list->type == ISEQ_ELEMENT_INSN) {
iobj = (INSN *)list;
id = iobj->insn_id;
if (unified_insns_data[id] != 0) {
@@ -3442,7 +2398,7 @@ iseq_insns_unification(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
const int *unified = entry[j];
LINK_ELEMENT *li = list->next;
for (k = 2; k < unified[1]; k++) {
- if (!IS_INSN(li) ||
+ if (li->type != ISEQ_ELEMENT_INSN ||
((INSN *)li)->insn_id != unified[k]) {
goto miss;
}
@@ -3481,7 +2437,7 @@ iseq_insns_unification(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
#include "opt_sc.inc"
static int
-insn_set_sc_state(rb_iseq_t *iseq, const LINK_ELEMENT *anchor, INSN *iobj, int state)
+insn_set_sc_state(rb_iseq_t *iseq, INSN *iobj, int state)
{
int nstate;
int insn_id;
@@ -3496,11 +2452,11 @@ insn_set_sc_state(rb_iseq_t *iseq, const LINK_ELEMENT *anchor, INSN *iobj, int s
if (lobj->sc_state != 0) {
if (lobj->sc_state != nstate) {
- BADINSN_DUMP(anchor, iobj, lobj);
- COMPILE_ERROR(iseq, iobj->insn_info.line_no,
- "insn_set_sc_state error: %d at "LABEL_FORMAT
- ", %d expected\n",
- lobj->sc_state, lobj->label_no, nstate);
+ dump_disasm_list((LINK_ELEMENT *)iobj);
+ dump_disasm_list((LINK_ELEMENT *)lobj);
+ printf("\n-- %d, %d\n", lobj->sc_state, nstate);
+ COMPILE_ERROR(ruby_sourcefile_string, iobj->line_no,
+ "insn_set_sc_state error\n");
return COMPILE_NG;
}
}
@@ -3537,7 +2493,7 @@ label_set_sc_state(LABEL *lobj, int state)
#endif
static int
-iseq_set_sequence_stackcaching(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
+iseq_set_sequence_stackcaching(rb_iseq_t *iseq, LINK_ANCHOR *anchor)
{
#if OPT_STACK_CACHING
LINK_ELEMENT *list;
@@ -3568,7 +2524,7 @@ iseq_set_sequence_stackcaching(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
new_insn_body(iseq, 0, BIN(reput), 0);
/* replace this insn */
- ELEM_REPLACE(list, (LINK_ELEMENT *)rpobj);
+ REPLACE_ELEM(list, (LINK_ELEMENT *)rpobj);
list = (LINK_ELEMENT *)rpobj;
goto redo_point;
}
@@ -3579,7 +2535,7 @@ iseq_set_sequence_stackcaching(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
if (state == SCS_AB || state == SCS_BA) {
state = (state == SCS_AB ? SCS_BA : SCS_AB);
- ELEM_REMOVE(list);
+ REMOVE_ELEM(list);
list = list->next;
goto redo_point;
}
@@ -3601,12 +2557,12 @@ iseq_set_sequence_stackcaching(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
case SCS_XX:
goto normal_insn;
default:
- COMPILE_ERROR(iseq, iobj->insn_info.line_no,
+ COMPILE_ERROR(ruby_sourcefile_string, iobj->line_no,
"unreachable");
return COMPILE_NG;
}
/* remove useless pop */
- ELEM_REMOVE(list);
+ REMOVE_ELEM(list);
list = list->next;
goto redo_point;
}
@@ -3614,7 +2570,7 @@ iseq_set_sequence_stackcaching(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
/* none */
} /* end of switch */
normal_insn:
- state = insn_set_sc_state(iseq, anchor, iobj, state);
+ state = insn_set_sc_state(iseq, iobj, state);
break;
}
case ISEQ_ELEMENT_LABEL:
@@ -3634,32 +2590,9 @@ iseq_set_sequence_stackcaching(rb_iseq_t *iseq, LINK_ANCHOR *const anchor)
}
static int
-all_string_result_p(const NODE *node)
+compile_dstr_fragments(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE *node, int *cntp)
{
- if (!node) return FALSE;
- switch (nd_type(node)) {
- case NODE_STR: case NODE_DSTR:
- return TRUE;
- case NODE_IF: case NODE_UNLESS:
- if (!node->nd_body || !node->nd_else) return FALSE;
- if (all_string_result_p(node->nd_body))
- return all_string_result_p(node->nd_else);
- return FALSE;
- case NODE_AND: case NODE_OR:
- if (!node->nd_2nd)
- return all_string_result_p(node->nd_1st);
- if (!all_string_result_p(node->nd_1st))
- return FALSE;
- return all_string_result_p(node->nd_2nd);
- default:
- return FALSE;
- }
-}
-
-static int
-compile_dstr_fragments(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node, int *cntp)
-{
- const NODE *list = node->nd_next;
+ NODE *list = node->nd_next;
VALUE lit = node->nd_lit;
LINK_ELEMENT *first_lit = 0;
int cnt = 0;
@@ -3668,30 +2601,29 @@ compile_dstr_fragments(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *cons
if (!NIL_P(lit)) {
cnt++;
if (!RB_TYPE_P(lit, T_STRING)) {
- COMPILE_ERROR(ERROR_ARGS "dstr: must be string: %s",
- rb_builtin_type_name(TYPE(lit)));
- return COMPILE_NG;
+ rb_compile_bug_str(ERROR_ARGS "dstr: must be string: %s",
+ rb_builtin_type_name(TYPE(lit)));
}
- lit = freeze_literal(iseq, lit);
+ lit = node->nd_lit = rb_fstring(lit);
ADD_INSN1(ret, nd_line(node), putobject, lit);
if (RSTRING_LEN(lit) == 0) first_lit = LAST_ELEMENT(ret);
}
while (list) {
- const NODE *const head = list->nd_head;
- if (nd_type(head) == NODE_STR) {
- lit = freeze_literal(iseq, head->nd_lit);
- ADD_INSN1(ret, nd_line(head), putobject, lit);
+ node = list->nd_head;
+ if (nd_type(node) == NODE_STR) {
+ node->nd_lit = rb_fstring(node->nd_lit);
+ ADD_INSN1(ret, nd_line(node), putobject, node->nd_lit);
lit = Qnil;
}
else {
- CHECK(COMPILE(ret, "each string", head));
+ COMPILE(ret, "each string", node);
}
cnt++;
list = list->nd_next;
}
if (NIL_P(lit) && first_lit) {
- ELEM_REMOVE(first_lit);
+ REMOVE_ELEM(first_lit);
--cnt;
}
*cntp = cnt;
@@ -3700,87 +2632,51 @@ compile_dstr_fragments(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *cons
}
static int
-compile_dstr(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node)
+compile_dstr(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node)
{
int cnt;
- CHECK(compile_dstr_fragments(iseq, ret, node, &cnt));
+ compile_dstr_fragments(iseq, ret, node, &cnt);
ADD_INSN1(ret, nd_line(node), concatstrings, INT2FIX(cnt));
return COMPILE_OK;
}
static int
-compile_dregx(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node)
+compile_dregx(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node)
{
int cnt;
- CHECK(compile_dstr_fragments(iseq, ret, node, &cnt));
+ compile_dstr_fragments(iseq, ret, node, &cnt);
ADD_INSN2(ret, nd_line(node), toregexp, INT2FIX(node->nd_cflag), INT2FIX(cnt));
return COMPILE_OK;
}
static int
-compile_flip_flop(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node, int again,
- LABEL *then_label, LABEL *else_label)
-{
- const int line = nd_line(node);
- LABEL *lend = NEW_LABEL(line);
- rb_num_t cnt = ISEQ_FLIP_CNT_INCREMENT(iseq->body->local_iseq)
- + VM_SVAR_FLIPFLOP_START;
- VALUE key = INT2FIX(cnt);
-
- ADD_INSN2(ret, line, getspecial, key, INT2FIX(0));
- ADD_INSNL(ret, line, branchif, lend);
-
- /* *flip == 0 */
- CHECK(COMPILE(ret, "flip2 beg", node->nd_beg));
- ADD_INSNL(ret, line, branchunless, else_label);
- ADD_INSN1(ret, line, putobject, Qtrue);
- ADD_INSN1(ret, line, setspecial, key);
- if (!again) {
- ADD_INSNL(ret, line, jump, then_label);
- }
-
- /* *flip == 1 */
- ADD_LABEL(ret, lend);
- CHECK(COMPILE(ret, "flip2 end", node->nd_end));
- ADD_INSNL(ret, line, branchunless, then_label);
- ADD_INSN1(ret, line, putobject, Qfalse);
- ADD_INSN1(ret, line, setspecial, key);
- ADD_INSNL(ret, line, jump, then_label);
-
- return COMPILE_OK;
-}
-
-static int
-compile_branch_condition(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *cond,
+compile_branch_condition(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * cond,
LABEL *then_label, LABEL *else_label)
{
- again:
switch (nd_type(cond)) {
case NODE_AND:
{
LABEL *label = NEW_LABEL(nd_line(cond));
- CHECK(compile_branch_condition(iseq, ret, cond->nd_1st, label,
- else_label));
- if (!label->refcnt) break;
+ compile_branch_condition(iseq, ret, cond->nd_1st, label,
+ else_label);
ADD_LABEL(ret, label);
- cond = cond->nd_2nd;
- goto again;
+ compile_branch_condition(iseq, ret, cond->nd_2nd, then_label,
+ else_label);
+ break;
}
case NODE_OR:
{
LABEL *label = NEW_LABEL(nd_line(cond));
- CHECK(compile_branch_condition(iseq, ret, cond->nd_1st, then_label,
- label));
- if (!label->refcnt) break;
+ compile_branch_condition(iseq, ret, cond->nd_1st, then_label,
+ label);
ADD_LABEL(ret, label);
- cond = cond->nd_2nd;
- goto again;
+ compile_branch_condition(iseq, ret, cond->nd_2nd, then_label,
+ else_label);
+ break;
}
- case NODE_LIT: /* NODE_LIT is always true */
+ case NODE_LIT: /* NODE_LIT is always not true */
case NODE_TRUE:
case NODE_STR:
- case NODE_ZARRAY:
- case NODE_LAMBDA:
/* printf("useless condition eliminate (%s)\n", ruby_node_name(nd_type(cond))); */
ADD_INSNL(ret, nd_line(cond), jump, then_label);
break;
@@ -3789,25 +2685,8 @@ compile_branch_condition(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *co
/* printf("useless condition eliminate (%s)\n", ruby_node_name(nd_type(cond))); */
ADD_INSNL(ret, nd_line(cond), jump, else_label);
break;
- case NODE_ARRAY:
- case NODE_ARGSCAT:
- case NODE_DREGX:
- case NODE_DSTR:
- CHECK(COMPILE_POPPED(ret, "branch condition", cond));
- ADD_INSNL(ret, nd_line(cond), jump, then_label);
- break;
- case NODE_FLIP2:
- CHECK(compile_flip_flop(iseq, ret, cond, TRUE, then_label, else_label));
- break;
- case NODE_FLIP3:
- CHECK(compile_flip_flop(iseq, ret, cond, FALSE, then_label, else_label));
- break;
- case NODE_DEFINED:
- CHECK(compile_defined_expr(iseq, ret, cond, Qfalse));
- goto branch;
default:
- CHECK(COMPILE(ret, "branch condition", cond));
- branch:
+ COMPILE(ret, "branch condition", cond);
ADD_INSNL(ret, nd_line(cond), branchunless, else_label);
ADD_INSNL(ret, nd_line(cond), jump, then_label);
break;
@@ -3816,25 +2695,18 @@ compile_branch_condition(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *co
}
static int
-compile_array_keyword_arg(rb_iseq_t *iseq, LINK_ANCHOR *const ret,
- const NODE *const root_node,
- struct rb_call_info_kw_arg **const kw_arg_ptr,
- unsigned int *flag)
+compile_array_keyword_arg(rb_iseq_t *iseq, LINK_ANCHOR *ret, const NODE * const root_node, struct rb_call_info_kw_arg ** const kw_arg_ptr)
{
if (kw_arg_ptr == NULL) return FALSE;
if (nd_type(root_node) == NODE_HASH && root_node->nd_head && nd_type(root_node->nd_head) == NODE_ARRAY) {
- const NODE *node = root_node->nd_head;
+ NODE *node = root_node->nd_head;
while (node) {
- const NODE *key_node = node->nd_head;
+ NODE *key_node = node->nd_head;
assert(nd_type(node) == NODE_ARRAY);
- if (!key_node) {
- if (flag && !root_node->nd_alen) *flag |= VM_CALL_KW_SPLAT;
- return FALSE;
- }
- else if (nd_type(key_node) == NODE_LIT && RB_TYPE_P(key_node->nd_lit, T_SYMBOL)) {
+ if (key_node && nd_type(key_node) == NODE_LIT && RB_TYPE_P(key_node->nd_lit, T_SYMBOL)) {
/* can be keywords */
}
else {
@@ -3856,8 +2728,8 @@ compile_array_keyword_arg(rb_iseq_t *iseq, LINK_ANCHOR *const ret,
*kw_arg_ptr = kw_arg;
for (i=0; node != NULL; i++, node = node->nd_next->nd_next) {
- const NODE *key_node = node->nd_head;
- const NODE *val_node = node->nd_next->nd_head;
+ NODE *key_node = node->nd_head;
+ NODE *val_node = node->nd_next->nd_head;
keywords[i] = key_node->nd_lit;
COMPILE(ret, "keyword values", val_node);
}
@@ -3874,65 +2746,16 @@ enum compile_array_type_t {
COMPILE_ARRAY_TYPE_ARGS
};
-static inline int
-static_literal_node_p(const NODE *node, const rb_iseq_t *iseq)
-{
- node = node->nd_head;
- switch (nd_type(node)) {
- case NODE_LIT:
- case NODE_NIL:
- case NODE_TRUE:
- case NODE_FALSE:
- return TRUE;
- case NODE_STR:
- if (ISEQ_COMPILE_DATA(iseq)->option->frozen_string_literal) {
- return TRUE;
- } else {
- return FALSE;
- }
- default:
- return FALSE;
- }
-}
-
-static inline VALUE
-static_literal_value(const NODE *node, rb_iseq_t *iseq)
-{
- node = node->nd_head;
- switch (nd_type(node)) {
- case NODE_NIL:
- return Qnil;
- case NODE_TRUE:
- return Qtrue;
- case NODE_FALSE:
- return Qfalse;
- case NODE_STR:
- if (ISEQ_COMPILE_DATA(iseq)->option->debug_frozen_string_literal || RTEST(ruby_debug)) {
- VALUE lit;
- VALUE debug_info = rb_ary_new_from_args(2, rb_iseq_path(iseq), INT2FIX((int)nd_line(node)));
- lit = rb_str_dup(node->nd_lit);
- rb_ivar_set(lit, id_debug_created_info, rb_obj_freeze(debug_info));
- return rb_str_freeze(lit);
- }
- else {
- return rb_fstring(node->nd_lit);
- }
- default:
- return node->nd_lit;
- }
-}
-
static int
-compile_array(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node_root,
- enum compile_array_type_t type, struct rb_call_info_kw_arg **keywords_ptr,
- unsigned int *flag, int popped)
+compile_array_(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE* node_root,
+ enum compile_array_type_t type, struct rb_call_info_kw_arg **keywords_ptr, int poped)
{
- const NODE *node = node_root;
+ NODE *node = node_root;
int line = (int)nd_line(node);
int len = 0;
if (nd_type(node) == NODE_ZARRAY) {
- if (!popped) {
+ if (!poped) {
switch (type) {
case COMPILE_ARRAY_TYPE_ARRAY: ADD_INSN1(ret, line, newarray, INT2FIX(0)); break;
case COMPILE_ARRAY_TYPE_HASH: ADD_INSN1(ret, line, newhash, INT2FIX(0)); break;
@@ -3945,15 +2768,15 @@ compile_array(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node_ro
int first = 1, i;
while (node) {
- const NODE *start_node = node, *end_node;
- const NODE *kw = 0;
+ NODE *start_node = node, *end_node;
+ NODE *kw = 0;
const int max = 0x100;
DECL_ANCHOR(anchor);
INIT_ANCHOR(anchor);
for (i=0; i<max && node; i++, len++, node = node->nd_next) {
if (CPDEBUG > 0) {
- EXPECT_NODE("compile_array", node, NODE_ARRAY, -1);
+ EXPECT_NODE("compile_array", node, NODE_ARRAY);
}
if (type != COMPILE_ARRAY_TYPE_ARRAY && !node->nd_head) {
@@ -3966,39 +2789,35 @@ compile_array(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node_ro
}
break;
}
- if (opt_p && !static_literal_node_p(node, iseq)) {
+ if (opt_p && nd_type(node->nd_head) != NODE_LIT) {
opt_p = 0;
}
- if (type == COMPILE_ARRAY_TYPE_ARGS &&
- node->nd_next == NULL /* last node */ &&
- compile_array_keyword_arg(iseq, anchor, node->nd_head, keywords_ptr, flag)) {
+ if (type == COMPILE_ARRAY_TYPE_ARGS && node->nd_next == NULL /* last node */ && compile_array_keyword_arg(iseq, anchor, node->nd_head, keywords_ptr)) {
len--;
}
else {
- COMPILE_(anchor, "array element", node->nd_head, popped);
+ COMPILE_(anchor, "array element", node->nd_head, poped);
}
}
if (opt_p && type != COMPILE_ARRAY_TYPE_ARGS) {
- if (!popped) {
+ if (!poped) {
VALUE ary = rb_ary_tmp_new(i);
end_node = node;
node = start_node;
while (node != end_node) {
- rb_ary_push(ary, static_literal_value(node, iseq));
+ rb_ary_push(ary, node->nd_head->nd_lit);
node = node->nd_next;
}
- while (node && node->nd_next &&
- static_literal_node_p(node, iseq) &&
- static_literal_node_p(node->nd_next, iseq)) {
- VALUE elem[2];
- elem[0] = static_literal_value(node, iseq);
- elem[1] = static_literal_value(node->nd_next, iseq);
- rb_ary_cat(ary, elem, 2);
- node = node->nd_next->nd_next;
+ while (node && nd_type(node->nd_head) == NODE_LIT &&
+ node->nd_next && nd_type(node->nd_next->nd_head) == NODE_LIT) {
+ rb_ary_push(ary, node->nd_head->nd_lit);
+ node = node->nd_next;
+ rb_ary_push(ary, node->nd_head->nd_lit);
+ node = node->nd_next;
len++;
}
@@ -4012,12 +2831,9 @@ compile_array(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node_ro
ADD_INSN1(ret, line, duparray, ary);
}
else { /* COMPILE_ARRAY_TYPE_HASH */
- VALUE hash;
-
- hash = rb_hash_new_with_size(RARRAY_LEN(ary) / 2);
- rb_hash_bulk_insert(RARRAY_LEN(ary), RARRAY_CONST_PTR_TRANSIENT(ary), hash);
- iseq_add_mark_object_compile_time(iseq, rb_obj_hide(hash));
- ADD_INSN1(ret, line, duphash, hash);
+ ADD_INSN1(ret, line, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE));
+ ADD_INSN1(ret, line, putobject, ary);
+ ADD_SEND(ret, line, id_core_hash_from_ary, INT2FIX(1));
}
}
else {
@@ -4026,14 +2842,15 @@ compile_array(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node_ro
ADD_INSN(ret, line, concatarray);
}
else {
- COMPILE_ERROR(ERROR_ARGS "core#hash_merge_ary");
- return -1;
+ ADD_INSN1(ret, line, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE));
+ ADD_INSN1(ret, line, putobject, ary);
+ ADD_SEND(ret, line, id_core_hash_merge_ary, INT2FIX(1));
}
}
}
}
else {
- if (!popped || kw) {
+ if (!poped) {
switch (type) {
case COMPILE_ARRAY_TYPE_ARRAY:
ADD_INSN1(anchor, line, newarray, INT2FIX(i));
@@ -4050,35 +2867,23 @@ compile_array(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node_ro
case COMPILE_ARRAY_TYPE_HASH:
if (i > 0) {
if (first) {
- if (!popped) {
- ADD_INSN1(anchor, line, newhash, INT2FIX(i));
- }
+ ADD_INSN1(anchor, line, newhash, INT2FIX(i));
APPEND_LIST(ret, anchor);
}
else {
- if (!popped) {
- ADD_INSN1(ret, line, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE));
- ADD_INSN(ret, line, swap);
- }
+ ADD_INSN1(ret, line, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE));
+ ADD_INSN(ret, line, swap);
APPEND_LIST(ret, anchor);
- if (!popped) {
- ADD_SEND(ret, line, id_core_hash_merge_ptr, INT2FIX(i + 1));
- }
+ ADD_SEND(ret, line, id_core_hash_merge_ptr, INT2FIX(i + 1));
}
}
if (kw) {
- if (!popped) {
- ADD_INSN1(ret, line, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE));
- if (i > 0 || !first) ADD_INSN(ret, line, swap);
- else ADD_INSN1(ret, line, newhash, INT2FIX(0));
- }
+ VALUE nhash = (i > 0 || !first) ? INT2FIX(2) : INT2FIX(1);
+ ADD_INSN1(ret, line, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE));
+ if (i > 0 || !first) ADD_INSN(ret, line, swap);
COMPILE(ret, "keyword splat", kw);
- if (popped) {
- ADD_INSN(ret, line, pop);
- }
- else {
- ADD_SEND(ret, line, id_core_hash_merge_kwd, INT2FIX(2));
- }
+ ADD_SEND(ret, line, id_core_hash_merge_kwd, nhash);
+ if (nhash == INT2FIX(1)) ADD_SEND(ret, line, rb_intern("dup"), INT2FIX(0));
}
first = 0;
break;
@@ -4088,7 +2893,7 @@ compile_array(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node_ro
}
}
else {
- /* popped */
+ /* poped */
APPEND_LIST(ret, anchor);
}
}
@@ -4098,7 +2903,13 @@ compile_array(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node_ro
}
static VALUE
-case_when_optimizable_literal(const NODE *const node)
+compile_array(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE* node_root, enum compile_array_type_t type)
+{
+ return compile_array_(iseq, ret, node_root, type, NULL, 0);
+}
+
+static VALUE
+case_when_optimizable_literal(NODE * node)
{
switch (nd_type(node)) {
case NODE_LIT: {
@@ -4120,17 +2931,16 @@ case_when_optimizable_literal(const NODE *const node)
case NODE_FALSE:
return Qfalse;
case NODE_STR:
- return rb_fstring(node->nd_lit);
+ return node->nd_lit = rb_fstring(node->nd_lit);
}
return Qundef;
}
static int
-when_vals(rb_iseq_t *iseq, LINK_ANCHOR *const cond_seq, const NODE *vals,
- LABEL *l1, int only_special_literals, VALUE literals)
+when_vals(rb_iseq_t *iseq, LINK_ANCHOR *cond_seq, NODE *vals, LABEL *l1, int only_special_literals, VALUE literals)
{
while (vals) {
- const NODE *val = vals->nd_head;
+ NODE* val = vals->nd_head;
VALUE lit = case_when_optimizable_literal(val);
if (lit == Qundef) {
@@ -4138,8 +2948,7 @@ when_vals(rb_iseq_t *iseq, LINK_ANCHOR *const cond_seq, const NODE *vals,
}
else {
if (rb_hash_lookup(literals, lit) != Qnil) {
- VALUE file = rb_iseq_path(iseq);
- rb_compile_warning(RSTRING_PTR(file), nd_line(val),
+ rb_compile_warning(ruby_sourcefile, nd_line(val),
"duplicated when clause is ignored");
}
else {
@@ -4150,12 +2959,12 @@ when_vals(rb_iseq_t *iseq, LINK_ANCHOR *const cond_seq, const NODE *vals,
ADD_INSN(cond_seq, nd_line(val), dup); /* dup target */
if (nd_type(val) == NODE_STR) {
+ val->nd_lit = rb_fstring(val->nd_lit);
debugp_param("nd_lit", val->nd_lit);
- lit = freeze_literal(iseq, val->nd_lit);
- ADD_INSN1(cond_seq, nd_line(val), putobject, lit);
+ ADD_INSN1(cond_seq, nd_line(val), putobject, val->nd_lit);
}
else {
- if (!COMPILE(cond_seq, "when cond", val)) return -1;
+ COMPILE(cond_seq, "when cond", val);
}
ADD_INSN1(cond_seq, nd_line(vals), checkmatch, INT2FIX(VM_CHECKMATCH_TYPE_CASE));
@@ -4166,85 +2975,39 @@ when_vals(rb_iseq_t *iseq, LINK_ANCHOR *const cond_seq, const NODE *vals,
}
static int
-when_splat_vals(rb_iseq_t *iseq, LINK_ANCHOR *const cond_seq, const NODE *vals,
- LABEL *l1, int only_special_literals, VALUE literals)
-{
- const int line = nd_line(vals);
-
- switch (nd_type(vals)) {
- case NODE_ARRAY:
- if (when_vals(iseq, cond_seq, vals, l1, only_special_literals, literals) < 0)
- return COMPILE_NG;
- break;
- case NODE_SPLAT:
- ADD_INSN (cond_seq, line, dup);
- CHECK(COMPILE(cond_seq, "when splat", vals->nd_head));
- ADD_INSN1(cond_seq, line, splatarray, Qfalse);
- ADD_INSN1(cond_seq, line, checkmatch, INT2FIX(VM_CHECKMATCH_TYPE_CASE | VM_CHECKMATCH_ARRAY));
- ADD_INSNL(cond_seq, line, branchif, l1);
- break;
- case NODE_ARGSCAT:
- CHECK(when_splat_vals(iseq, cond_seq, vals->nd_head, l1, only_special_literals, literals));
- CHECK(when_splat_vals(iseq, cond_seq, vals->nd_body, l1, only_special_literals, literals));
- break;
- case NODE_ARGSPUSH:
- CHECK(when_splat_vals(iseq, cond_seq, vals->nd_head, l1, only_special_literals, literals));
- ADD_INSN (cond_seq, line, dup);
- CHECK(COMPILE(cond_seq, "when argspush body", vals->nd_body));
- ADD_INSN1(cond_seq, line, checkmatch, INT2FIX(VM_CHECKMATCH_TYPE_CASE));
- ADD_INSNL(cond_seq, line, branchif, l1);
- break;
- default:
- ADD_INSN (cond_seq, line, dup);
- CHECK(COMPILE(cond_seq, "when val", vals));
- ADD_INSN1(cond_seq, line, splatarray, Qfalse);
- ADD_INSN1(cond_seq, line, checkmatch, INT2FIX(VM_CHECKMATCH_TYPE_CASE | VM_CHECKMATCH_ARRAY));
- ADD_INSNL(cond_seq, line, branchif, l1);
- break;
- }
- return COMPILE_OK;
-}
-
-
-static int
-compile_massign_lhs(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node)
+compile_massign_lhs(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE *node)
{
switch (nd_type(node)) {
case NODE_ATTRASGN: {
- INSN *iobj;
+ INSN *iobj, *topdup;
struct rb_call_info *ci;
VALUE dupidx;
- int line = nd_line(node);
- CHECK(COMPILE_POPPED(ret, "masgn lhs (NODE_ATTRASGN)", node));
+ COMPILE_POPED(ret, "masgn lhs (NODE_ATTRASGN)", node);
iobj = (INSN *)get_prev_insn((INSN *)LAST_ELEMENT(ret)); /* send insn */
ci = (struct rb_call_info *)iobj->operands[0];
ci->orig_argc += 1;
dupidx = INT2FIX(ci->orig_argc);
- INSERT_BEFORE_INSN1(iobj, line, topn, dupidx);
- if (ci->flag & VM_CALL_ARGS_SPLAT) {
- --ci->orig_argc;
- INSERT_BEFORE_INSN1(iobj, line, newarray, INT2FIX(1));
- INSERT_BEFORE_INSN(iobj, line, concatarray);
- }
- ADD_INSN(ret, line, pop); /* result */
+ topdup = new_insn_body(iseq, nd_line(node), BIN(topn), 1, dupidx);
+ INSERT_ELEM_PREV(&iobj->link, &topdup->link);
+ ADD_INSN(ret, nd_line(node), pop); /* result */
break;
}
case NODE_MASGN: {
DECL_ANCHOR(anchor);
INIT_ANCHOR(anchor);
- CHECK(COMPILE_POPPED(anchor, "nest masgn lhs", node));
- ELEM_REMOVE(FIRST_ELEMENT(anchor));
+ COMPILE_POPED(anchor, "nest masgn lhs", node);
+ REMOVE_ELEM(FIRST_ELEMENT(anchor));
ADD_SEQ(ret, anchor);
break;
}
default: {
DECL_ANCHOR(anchor);
INIT_ANCHOR(anchor);
- CHECK(COMPILE_POPPED(anchor, "masgn lhs", node));
- ELEM_REMOVE(FIRST_ELEMENT(anchor));
+ COMPILE_POPED(anchor, "masgn lhs", node);
+ REMOVE_ELEM(FIRST_ELEMENT(anchor));
ADD_SEQ(ret, anchor);
}
}
@@ -4252,26 +3015,25 @@ compile_massign_lhs(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const n
return COMPILE_OK;
}
-static int
-compile_massign_opt_lhs(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *lhsn)
+static void
+compile_massign_opt_lhs(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE *lhsn)
{
if (lhsn) {
- CHECK(compile_massign_opt_lhs(iseq, ret, lhsn->nd_next));
- CHECK(compile_massign_lhs(iseq, ret, lhsn->nd_head));
+ compile_massign_opt_lhs(iseq, ret, lhsn->nd_next);
+ compile_massign_lhs(iseq, ret, lhsn->nd_head);
}
- return COMPILE_OK;
}
static int
-compile_massign_opt(rb_iseq_t *iseq, LINK_ANCHOR *const ret,
- const NODE *rhsn, const NODE *orig_lhsn)
+compile_massign_opt(rb_iseq_t *iseq, LINK_ANCHOR *ret,
+ NODE *rhsn, NODE *orig_lhsn)
{
VALUE mem[64];
const int memsize = numberof(mem);
int memindex = 0;
int llen = 0, rlen = 0;
int i;
- const NODE *lhsn = orig_lhsn;
+ NODE *lhsn = orig_lhsn;
#define MEMORY(v) { \
int i; \
@@ -4287,7 +3049,7 @@ compile_massign_opt(rb_iseq_t *iseq, LINK_ANCHOR *const ret,
}
while (lhsn) {
- const NODE *ln = lhsn->nd_head;
+ NODE *ln = lhsn->nd_head;
switch (nd_type(ln)) {
case NODE_LASGN:
MEMORY(ln->nd_vid);
@@ -4295,6 +3057,7 @@ compile_massign_opt(rb_iseq_t *iseq, LINK_ANCHOR *const ret,
case NODE_DASGN:
case NODE_DASGN_CURR:
case NODE_IASGN:
+ case NODE_IASGN2:
case NODE_CVASGN:
MEMORY(ln->nd_vid);
break;
@@ -4307,7 +3070,7 @@ compile_massign_opt(rb_iseq_t *iseq, LINK_ANCHOR *const ret,
while (rhsn) {
if (llen <= rlen) {
- COMPILE_POPPED(ret, "masgn val (popped)", rhsn->nd_head);
+ COMPILE_POPED(ret, "masgn val (popped)", rhsn->nd_head);
}
else {
COMPILE(ret, "masgn val", rhsn->nd_head);
@@ -4327,7 +3090,7 @@ compile_massign_opt(rb_iseq_t *iseq, LINK_ANCHOR *const ret,
}
static void
-adjust_stack(rb_iseq_t *iseq, LINK_ANCHOR *const ret, int line, int rlen, int llen)
+adjust_stack(rb_iseq_t *iseq, LINK_ANCHOR *ret, int line, int rlen, int llen)
{
if (rlen < llen) {
do {ADD_INSN(ret, line, putnil);} while (++rlen < llen);
@@ -4338,14 +3101,14 @@ adjust_stack(rb_iseq_t *iseq, LINK_ANCHOR *const ret, int line, int rlen, int ll
}
static int
-compile_massign(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node, int popped)
+compile_massign(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE *node, int poped)
{
- const NODE *rhsn = node->nd_value;
- const NODE *splatn = node->nd_args;
- const NODE *lhsn = node->nd_head;
- int lhs_splat = (splatn && NODE_NAMED_REST_P(splatn)) ? 1 : 0;
+ NODE *rhsn = node->nd_value;
+ NODE *splatn = node->nd_args;
+ NODE *lhsn = node->nd_head;
+ int lhs_splat = (splatn && (VALUE)splatn != (VALUE)-1) ? 1 : 0;
- if (!popped || splatn || !compile_massign_opt(iseq, ret, rhsn, lhsn)) {
+ if (!poped || splatn || !compile_massign_opt(iseq, ret, rhsn, lhsn)) {
int llen = 0;
int expand = 1;
DECL_ANCHOR(lhsseq);
@@ -4353,20 +3116,20 @@ compile_massign(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node,
INIT_ANCHOR(lhsseq);
while (lhsn) {
- CHECK(compile_massign_lhs(iseq, lhsseq, lhsn->nd_head));
+ compile_massign_lhs(iseq, lhsseq, lhsn->nd_head);
llen += 1;
lhsn = lhsn->nd_next;
}
COMPILE(ret, "normal masgn rhs", rhsn);
- if (!popped) {
+ if (!poped) {
ADD_INSN(ret, nd_line(node), dup);
}
else if (!lhs_splat) {
INSN *last = (INSN*)ret->last;
- if (IS_INSN(&last->link) &&
- IS_INSN_ID(last, newarray) &&
+ if (last->link.type == ISEQ_ELEMENT_INSN &&
+ last->insn_id == BIN(newarray) &&
last->operand_size == 1) {
int rlen = FIX2INT(OPERAND_AT(last, 0));
/* special case: assign to aset or attrset */
@@ -4397,25 +3160,25 @@ compile_massign(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node,
if (lhs_splat) {
if (nd_type(splatn) == NODE_POSTARG) {
/*a, b, *r, p1, p2 */
- const NODE *postn = splatn->nd_2nd;
- const NODE *restn = splatn->nd_1st;
+ NODE *postn = splatn->nd_2nd;
+ NODE *restn = splatn->nd_1st;
int num = (int)postn->nd_alen;
- int flag = 0x02 | (NODE_NAMED_REST_P(restn) ? 0x01 : 0x00);
+ int flag = 0x02 | (((VALUE)restn == (VALUE)-1) ? 0x00 : 0x01);
ADD_INSN2(ret, nd_line(splatn), expandarray,
INT2FIX(num), INT2FIX(flag));
- if (NODE_NAMED_REST_P(restn)) {
- CHECK(compile_massign_lhs(iseq, ret, restn));
+ if ((VALUE)restn != (VALUE)-1) {
+ compile_massign_lhs(iseq, ret, restn);
}
while (postn) {
- CHECK(compile_massign_lhs(iseq, ret, postn->nd_head));
+ compile_massign_lhs(iseq, ret, postn->nd_head);
postn = postn->nd_next;
}
}
else {
/* a, b, *r */
- CHECK(compile_massign_lhs(iseq, ret, splatn));
+ compile_massign_lhs(iseq, ret, splatn);
}
}
}
@@ -4423,63 +3186,61 @@ compile_massign(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node,
}
static int
-compile_const_prefix(rb_iseq_t *iseq, const NODE *const node,
- LINK_ANCHOR *const pref, LINK_ANCHOR *const body)
+compile_colon2(rb_iseq_t *iseq, NODE * node,
+ LINK_ANCHOR *pref, LINK_ANCHOR *body)
{
switch (nd_type(node)) {
case NODE_CONST:
- debugi("compile_const_prefix - colon", node->nd_vid);
+ debugi("compile_colon2 - colon", node->nd_vid);
ADD_INSN1(body, nd_line(node), getconstant, ID2SYM(node->nd_vid));
break;
case NODE_COLON3:
- debugi("compile_const_prefix - colon3", node->nd_mid);
+ debugi("compile_colon2 - colon3", node->nd_mid);
ADD_INSN(body, nd_line(node), pop);
ADD_INSN1(body, nd_line(node), putobject, rb_cObject);
ADD_INSN1(body, nd_line(node), getconstant, ID2SYM(node->nd_mid));
break;
case NODE_COLON2:
- CHECK(compile_const_prefix(iseq, node->nd_head, pref, body));
- debugi("compile_const_prefix - colon2", node->nd_mid);
+ compile_colon2(iseq, node->nd_head, pref, body);
+ debugi("compile_colon2 - colon2", node->nd_mid);
ADD_INSN1(body, nd_line(node), getconstant, ID2SYM(node->nd_mid));
break;
default:
- CHECK(COMPILE(pref, "const colon2 prefix", node));
+ COMPILE(pref, "const colon2 prefix", node);
break;
}
return COMPILE_OK;
}
-static int
-compile_cpath(LINK_ANCHOR *const ret, rb_iseq_t *iseq, const NODE *cpath)
+static VALUE
+compile_cpath(LINK_ANCHOR *ret, rb_iseq_t *iseq, NODE *cpath)
{
if (nd_type(cpath) == NODE_COLON3) {
/* toplevel class ::Foo */
ADD_INSN1(ret, nd_line(cpath), putobject, rb_cObject);
- return VM_DEFINECLASS_FLAG_SCOPED;
+ return Qfalse;
}
else if (cpath->nd_head) {
/* Bar::Foo */
COMPILE(ret, "nd_else->nd_head", cpath->nd_head);
- return VM_DEFINECLASS_FLAG_SCOPED;
+ return Qfalse;
}
else {
/* class at cbase Foo */
ADD_INSN1(ret, nd_line(cpath), putspecialobject,
INT2FIX(VM_SPECIAL_OBJECT_CONST_BASE));
- return 0;
+ return Qtrue;
}
}
#define private_recv_p(node) (nd_type((node)->nd_recv) == NODE_SELF)
-static int
-defined_expr(rb_iseq_t *iseq, LINK_ANCHOR *const ret,
- const NODE *const node, LABEL **lfinish, VALUE needstr);
+#define defined_expr defined_expr0
static int
-defined_expr0(rb_iseq_t *iseq, LINK_ANCHOR *const ret,
- const NODE *const node, LABEL **lfinish, VALUE needstr)
+defined_expr(rb_iseq_t *iseq, LINK_ANCHOR *ret,
+ NODE *node, LABEL **lfinish, VALUE needstr)
{
- enum defined_type expr_type = DEFINED_NOT_DEFINED;
+ enum defined_type expr_type = 0;
enum node_type type;
switch (type = nd_type(node)) {
@@ -4499,10 +3260,10 @@ defined_expr0(rb_iseq_t *iseq, LINK_ANCHOR *const ret,
break;
case NODE_ARRAY:{
- const NODE *vals = node;
+ NODE *vals = node;
do {
- defined_expr0(iseq, ret, vals->nd_head, lfinish, Qfalse);
+ defined_expr(iseq, ret, vals->nd_head, lfinish, Qfalse);
if (!lfinish[1]) {
lfinish[1] = NEW_LABEL(nd_line(node));
@@ -4552,14 +3313,19 @@ defined_expr0(rb_iseq_t *iseq, LINK_ANCHOR *const ret,
if (!lfinish[1]) {
lfinish[1] = NEW_LABEL(nd_line(node));
}
- defined_expr0(iseq, ret, node->nd_head, lfinish, Qfalse);
+ defined_expr(iseq, ret, node->nd_head, lfinish, Qfalse);
ADD_INSNL(ret, nd_line(node), branchunless, lfinish[1]);
- COMPILE(ret, "defined/colon2#nd_head", node->nd_head);
- ADD_INSN3(ret, nd_line(node), defined,
- (rb_is_const_id(node->nd_mid) ?
- INT2FIX(DEFINED_CONST) : INT2FIX(DEFINED_METHOD)),
- ID2SYM(node->nd_mid), needstr);
+ if (rb_is_const_id(node->nd_mid)) {
+ COMPILE(ret, "defined/colon2#nd_head", node->nd_head);
+ ADD_INSN3(ret, nd_line(node), defined, INT2FIX(DEFINED_CONST),
+ ID2SYM(node->nd_mid), needstr);
+ }
+ else {
+ COMPILE(ret, "defined/colon2#nd_head", node->nd_head);
+ ADD_INSN3(ret, nd_line(node), defined, INT2FIX(DEFINED_METHOD),
+ ID2SYM(node->nd_mid), needstr);
+ }
return 1;
case NODE_COLON3:
ADD_INSN1(ret, nd_line(node), putobject, rb_cObject);
@@ -4569,23 +3335,22 @@ defined_expr0(rb_iseq_t *iseq, LINK_ANCHOR *const ret,
/* method dispatch */
case NODE_CALL:
- case NODE_OPCALL:
case NODE_VCALL:
case NODE_FCALL:
case NODE_ATTRASGN:{
const int explicit_receiver =
- (type == NODE_CALL || type == NODE_OPCALL ||
+ (type == NODE_CALL ||
(type == NODE_ATTRASGN && !private_recv_p(node)));
- if (!lfinish[1] && (node->nd_args || explicit_receiver)) {
+ if (!lfinish[1]) {
lfinish[1] = NEW_LABEL(nd_line(node));
}
if (node->nd_args) {
- defined_expr0(iseq, ret, node->nd_args, lfinish, Qfalse);
+ defined_expr(iseq, ret, node->nd_args, lfinish, Qfalse);
ADD_INSNL(ret, nd_line(node), branchunless, lfinish[1]);
}
if (explicit_receiver) {
- defined_expr0(iseq, ret, node->nd_recv, lfinish, Qfalse);
+ defined_expr(iseq, ret, node->nd_recv, lfinish, Qfalse);
ADD_INSNL(ret, nd_line(node), branchunless, lfinish[1]);
COMPILE(ret, "defined/recv", node->nd_recv);
ADD_INSN3(ret, nd_line(node), defined, INT2FIX(DEFINED_METHOD),
@@ -4631,6 +3396,7 @@ defined_expr0(rb_iseq_t *iseq, LINK_ANCHOR *const ret,
case NODE_GASGN:
case NODE_IASGN:
case NODE_CDECL:
+ case NODE_CVDECL:
case NODE_CVASGN:
expr_type = DEFINED_ASGN;
break;
@@ -4648,18 +3414,11 @@ defined_expr0(rb_iseq_t *iseq, LINK_ANCHOR *const ret,
}
return 0;
}
-
-static VALUE
-build_defined_rescue_iseq(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *unused)
-{
- ADD_INSN(ret, 0, putnil);
- iseq_set_exception_local_table(iseq);
- return Qnil;
-}
+#undef defined_expr
static int
-defined_expr(rb_iseq_t *iseq, LINK_ANCHOR *const ret,
- const NODE *const node, LABEL **lfinish, VALUE needstr)
+defined_expr(rb_iseq_t *iseq, LINK_ANCHOR *ret,
+ NODE *node, LABEL **lfinish, VALUE needstr)
{
LINK_ELEMENT *lcur = ret->last;
int done = defined_expr0(iseq, ret, node, lfinish, needstr);
@@ -4667,13 +3426,11 @@ defined_expr(rb_iseq_t *iseq, LINK_ANCHOR *const ret,
int line = nd_line(node);
LABEL *lstart = NEW_LABEL(line);
LABEL *lend = NEW_LABEL(line);
- const rb_iseq_t *rescue;
- rescue = new_child_iseq_ifunc(iseq, IFUNC_NEW(build_defined_rescue_iseq, 0, 0),
- rb_str_concat(rb_str_new2("defined guard in "),
- iseq->body->location.label),
- iseq, ISEQ_TYPE_RESCUE, 0);
- lstart->rescued = LABEL_RESCUE_BEG;
- lend->rescued = LABEL_RESCUE_END;
+ const rb_iseq_t *rescue = NEW_CHILD_ISEQ(NEW_NIL(),
+ rb_str_concat(rb_str_new2
+ ("defined guard in "),
+ iseq->body->location.label),
+ ISEQ_TYPE_DEFINED_GUARD, 0);
APPEND_LABEL(ret, lcur, lstart);
ADD_LABEL(ret, lend);
ADD_CATCH_ENTRY(CATCH_TYPE_RESCUE, lstart, lend, rescue, lfinish[1]);
@@ -4681,31 +3438,6 @@ defined_expr(rb_iseq_t *iseq, LINK_ANCHOR *const ret,
return done;
}
-static int
-compile_defined_expr(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node, VALUE needstr)
-{
- const int line = nd_line(node);
- if (!node->nd_head) {
- VALUE str = rb_iseq_defined_string(DEFINED_NIL);
- ADD_INSN1(ret, line, putobject, str);
- }
- else {
- LABEL *lfinish[2];
- LINK_ELEMENT *last = ret->last;
- lfinish[0] = NEW_LABEL(line);
- lfinish[1] = 0;
- defined_expr(iseq, ret, node->nd_head, lfinish, needstr);
- if (lfinish[1]) {
- ELEM_INSERT_NEXT(last, &new_insn_body(iseq, line, BIN(putnil), 0)->link);
- ADD_INSN(ret, line, swap);
- ADD_INSN(ret, line, pop);
- ADD_LABEL(ret, lfinish[1]);
- }
- ADD_LABEL(ret, lfinish[0]);
- }
- return COMPILE_OK;
-}
-
static VALUE
make_name_for_block(const rb_iseq_t *orig_iseq)
{
@@ -4732,7 +3464,7 @@ make_name_for_block(const rb_iseq_t *orig_iseq)
static void
push_ensure_entry(rb_iseq_t *iseq,
struct iseq_compile_data_ensure_node_stack *enl,
- struct ensure_range *er, const NODE *const node)
+ struct ensure_range *er, NODE *node)
{
enl->ensure_node = node;
enl->prev = ISEQ_COMPILE_DATA(iseq)->ensure_node_stack; /* prev */
@@ -4759,7 +3491,7 @@ add_ensure_range(rb_iseq_t *iseq, struct ensure_range *erange,
}
static void
-add_ensure_iseq(LINK_ANCHOR *const ret, rb_iseq_t *iseq, int is_return)
+add_ensure_iseq(LINK_ANCHOR *ret, rb_iseq_t *iseq, int is_return)
{
struct iseq_compile_data_ensure_node_stack *enlp =
ISEQ_COMPILE_DATA(iseq)->ensure_node_stack;
@@ -4768,7 +3500,7 @@ add_ensure_iseq(LINK_ANCHOR *const ret, rb_iseq_t *iseq, int is_return)
INIT_ANCHOR(ensure);
while (enlp) {
- if (enlp->erange != NULL) {
+ if (enlp->erange != 0) {
DECL_ANCHOR(ensure_part);
LABEL *lstart = NEW_LABEL(0);
LABEL *lend = NEW_LABEL(0);
@@ -4778,7 +3510,7 @@ add_ensure_iseq(LINK_ANCHOR *const ret, rb_iseq_t *iseq, int is_return)
ISEQ_COMPILE_DATA(iseq)->ensure_node_stack = enlp->prev;
ADD_LABEL(ensure_part, lstart);
- COMPILE_POPPED(ensure_part, "ensure part", enlp->ensure_node);
+ COMPILE_POPED(ensure_part, "ensure part", enlp->ensure_node);
ADD_LABEL(ensure_part, lend);
ADD_SEQ(ensure, ensure_part);
}
@@ -4794,8 +3526,7 @@ add_ensure_iseq(LINK_ANCHOR *const ret, rb_iseq_t *iseq, int is_return)
}
static VALUE
-setup_args(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn,
- unsigned int *flag, struct rb_call_info_kw_arg **keywords)
+setup_args(rb_iseq_t *iseq, LINK_ANCHOR *args, NODE *argn, unsigned int *flag, struct rb_call_info_kw_arg **keywords)
{
VALUE argc = INT2FIX(0);
int nsplat = 0;
@@ -4815,7 +3546,7 @@ setup_args(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn,
switch (nd_type(argn)) {
case NODE_SPLAT: {
COMPILE(args, "args (splat)", argn->nd_head);
- ADD_INSN1(args, nd_line(argn), splatarray, nsplat ? Qtrue : Qfalse);
+ ADD_INSN1(args, nd_line(argn), splatarray, Qfalse);
argc = INT2FIX(1);
nsplat++;
*flag |= VM_CALL_ARGS_SPLAT;
@@ -4829,7 +3560,7 @@ setup_args(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn,
INIT_ANCHOR(tmp);
COMPILE(tmp, "args (cat: splat)", argn->nd_body);
if (nd_type(argn) == NODE_ARGSCAT) {
- ADD_INSN1(tmp, nd_line(argn), splatarray, nsplat ? Qtrue : Qfalse);
+ ADD_INSN1(tmp, nd_line(argn), splatarray, Qfalse);
}
else {
ADD_INSN1(tmp, nd_line(argn), newarray, INT2FIX(1));
@@ -4837,13 +3568,9 @@ setup_args(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn,
INSERT_LIST(args_splat, tmp);
nsplat++;
*flag |= VM_CALL_ARGS_SPLAT;
- if (nd_type(argn->nd_body) == NODE_HASH)
- *flag |= VM_CALL_KW_SPLAT;
if (next_is_array) {
- int len = compile_array(iseq, args, argn->nd_head, COMPILE_ARRAY_TYPE_ARGS, NULL, flag, FALSE);
- if (len < 0) return Qnil;
- argc = INT2FIX(len + 1);
+ argc = INT2FIX(compile_array(iseq, args, argn->nd_head, COMPILE_ARRAY_TYPE_ARGS) + 1);
}
else {
argn = argn->nd_head;
@@ -4853,13 +3580,11 @@ setup_args(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn,
}
case NODE_ARRAY:
{
- int len = compile_array(iseq, args, argn, COMPILE_ARRAY_TYPE_ARGS, keywords, flag, FALSE);
- if (len < 0) return Qnil;
- argc = INT2FIX(len);
+ argc = INT2FIX(compile_array_(iseq, args, argn, COMPILE_ARRAY_TYPE_ARGS, keywords, FALSE));
break;
}
default: {
- UNKNOWN_NODE("setup_arg", argn, Qnil);
+ UNKNOWN_NODE("setup_arg", argn);
}
}
}
@@ -4867,31 +3592,22 @@ setup_args(rb_iseq_t *iseq, LINK_ANCHOR *const args, const NODE *argn,
if (nsplat > 1) {
int i;
for (i=1; i<nsplat; i++) {
- ADD_INSN(args_splat, nd_line(argn), concatarray);
+ ADD_INSN(args_splat, nd_line(args), concatarray);
}
}
- if (!LIST_INSN_SIZE_ZERO(args_splat)) {
+ if (!LIST_SIZE_ZERO(args_splat)) {
ADD_SEQ(args, args_splat);
}
if (*flag & VM_CALL_ARGS_BLOCKARG) {
- if (LIST_INSN_SIZE_ONE(arg_block)) {
- LINK_ELEMENT *elem = FIRST_ELEMENT(arg_block);
- if (elem->type == ISEQ_ELEMENT_INSN) {
- INSN *iobj = (INSN *)elem;
- if (iobj->insn_id == BIN(getblockparam)) {
- iobj->insn_id = BIN(getblockparamproxy);
- }
- }
- }
ADD_SEQ(args, arg_block);
}
return argc;
}
static VALUE
-build_postexe_iseq(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *body)
+build_postexe_iseq(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE *body)
{
int line = nd_line(body);
VALUE argc = INT2FIX(0);
@@ -4903,1086 +3619,732 @@ build_postexe_iseq(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *body)
return Qnil;
}
-static void
-compile_named_capture_assign(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node)
-{
- const NODE *vars;
- LINK_ELEMENT *last;
- int line = nd_line(node);
- LABEL *fail_label = NEW_LABEL(line), *end_label = NEW_LABEL(line);
-
-#if !(defined(NAMED_CAPTURE_BY_SVAR) && NAMED_CAPTURE_BY_SVAR-0)
- ADD_INSN1(ret, line, getglobal, ((VALUE)rb_global_entry(idBACKREF) | 1));
-#else
- ADD_INSN2(ret, line, getspecial, INT2FIX(1) /* '~' */, INT2FIX(0));
-#endif
- ADD_INSN(ret, line, dup);
- ADD_INSNL(ret, line, branchunless, fail_label);
-
- for (vars = node; vars; vars = vars->nd_next) {
- INSN *cap;
- if (vars->nd_next) {
- ADD_INSN(ret, line, dup);
- }
- last = ret->last;
- COMPILE_POPPED(ret, "capture", vars->nd_head);
- last = last->next; /* putobject :var */
- cap = new_insn_send(iseq, line, idAREF, INT2FIX(1),
- NULL, INT2FIX(0), NULL);
- ELEM_INSERT_PREV(last->next, (LINK_ELEMENT *)cap);
-#if !defined(NAMED_CAPTURE_SINGLE_OPT) || NAMED_CAPTURE_SINGLE_OPT-0
- if (!vars->nd_next && vars == node) {
- /* only one name */
- DECL_ANCHOR(nom);
-
- INIT_ANCHOR(nom);
- ADD_INSNL(nom, line, jump, end_label);
- ADD_LABEL(nom, fail_label);
-# if 0 /* $~ must be MatchData or nil */
- ADD_INSN(nom, line, pop);
- ADD_INSN(nom, line, putnil);
-# endif
- ADD_LABEL(nom, end_label);
- (nom->last->next = cap->link.next)->prev = nom->last;
- (cap->link.next = nom->anchor.next)->prev = &cap->link;
- return;
- }
-#endif
- }
- ADD_INSNL(ret, line, jump, end_label);
- ADD_LABEL(ret, fail_label);
- ADD_INSN(ret, line, pop);
- for (vars = node; vars; vars = vars->nd_next) {
- last = ret->last;
- COMPILE_POPPED(ret, "capture", vars->nd_head);
- last = last->next; /* putobject :var */
- ((INSN*)last)->insn_id = BIN(putnil);
- ((INSN*)last)->operand_size = 0;
- }
- ADD_LABEL(ret, end_label);
-}
-
-static int
-number_literal_p(const NODE *n)
-{
- return (n && nd_type(n) == NODE_LIT && RB_INTEGER_TYPE_P(n->nd_lit));
-}
+/**
+ compile each node
+ self: InstructionSequence
+ node: Ruby compiled node
+ poped: This node will be poped
+ */
static int
-compile_if(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node, int popped, const enum node_type type)
+iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
{
- struct rb_iseq_constant_body *const body = iseq->body;
- const NODE *const node_body = type == NODE_IF ? node->nd_body : node->nd_else;
- const NODE *const node_else = type == NODE_IF ? node->nd_else : node->nd_body;
-
- const int line = nd_line(node);
- const int lineno = nd_first_lineno(node);
- const int column = nd_first_column(node);
- const int last_lineno = nd_last_lineno(node);
- const int last_column = nd_last_column(node);
- DECL_ANCHOR(cond_seq);
- DECL_ANCHOR(then_seq);
- DECL_ANCHOR(else_seq);
- LABEL *then_label, *else_label, *end_label;
- VALUE branches = 0;
- int ci_size, ci_kw_size;
+ enum node_type type;
+ LINK_ELEMENT *saved_last_element = 0;
+ int line;
- INIT_ANCHOR(cond_seq);
- INIT_ANCHOR(then_seq);
- INIT_ANCHOR(else_seq);
- then_label = NEW_LABEL(line);
- else_label = NEW_LABEL(line);
- end_label = 0;
+ if (node == 0) {
+ if (!poped) {
+ debugs("node: NODE_NIL(implicit)\n");
+ ADD_INSN(ret, ISEQ_COMPILE_DATA(iseq)->last_line, putnil);
+ }
+ return COMPILE_OK;
+ }
- compile_branch_condition(iseq, cond_seq, node->nd_cond,
- then_label, else_label);
+ line = (int)nd_line(node);
- ci_size = body->ci_size;
- ci_kw_size = body->ci_kw_size;
- CHECK(COMPILE_(then_seq, "then", node_body, popped));
- if (!then_label->refcnt) {
- body->ci_size = ci_size;
- body->ci_kw_size = ci_kw_size;
+ if (ISEQ_COMPILE_DATA(iseq)->last_line == line) {
+ /* ignore */
}
-
- ci_size = body->ci_size;
- ci_kw_size = body->ci_kw_size;
- CHECK(COMPILE_(else_seq, "else", node_else, popped));
- if (!else_label->refcnt) {
- body->ci_size = ci_size;
- body->ci_kw_size = ci_kw_size;
+ else {
+ if (node->flags & NODE_FL_NEWLINE) {
+ ISEQ_COMPILE_DATA(iseq)->last_line = line;
+ ADD_TRACE(ret, line, RUBY_EVENT_LINE);
+ saved_last_element = ret->last;
+ }
}
- ADD_SEQ(ret, cond_seq);
+ debug_node_start(node);
- if (then_label->refcnt && else_label->refcnt) {
- DECL_BRANCH_BASE(branches, lineno, column, last_lineno, last_column, type == NODE_IF ? "if" : "unless");
- }
+ type = nd_type(node);
- if (then_label->refcnt) {
- ADD_LABEL(ret, then_label);
- if (else_label->refcnt) {
- ADD_TRACE_BRANCH_COVERAGE(
- ret,
- node_body ? nd_first_lineno(node_body) : lineno,
- node_body ? nd_first_column(node_body) : column,
- node_body ? nd_last_lineno(node_body) : last_lineno,
- node_body ? nd_last_column(node_body) : last_column,
- type == NODE_IF ? "then" : "else",
- branches);
- end_label = NEW_LABEL(line);
- ADD_INSNL(then_seq, line, jump, end_label);
+ switch (type) {
+ case NODE_BLOCK:{
+ while (node && nd_type(node) == NODE_BLOCK) {
+ COMPILE_(ret, "BLOCK body", node->nd_head,
+ (node->nd_next == 0 && poped == 0) ? 0 : 1);
+ node = node->nd_next;
+ }
+ if (node) {
+ COMPILE_(ret, "BLOCK next", node->nd_next, poped);
}
+ break;
+ }
+ case NODE_IF:{
+ DECL_ANCHOR(cond_seq);
+ DECL_ANCHOR(then_seq);
+ DECL_ANCHOR(else_seq);
+ LABEL *then_label, *else_label, *end_label;
+
+ INIT_ANCHOR(cond_seq);
+ INIT_ANCHOR(then_seq);
+ INIT_ANCHOR(else_seq);
+ then_label = NEW_LABEL(line);
+ else_label = NEW_LABEL(line);
+ end_label = NEW_LABEL(line);
+
+ compile_branch_condition(iseq, cond_seq, node->nd_cond,
+ then_label, else_label);
+ COMPILE_(then_seq, "then", node->nd_body, poped);
+ COMPILE_(else_seq, "else", node->nd_else, poped);
+
+ ADD_SEQ(ret, cond_seq);
+
+ ADD_LABEL(ret, then_label);
ADD_SEQ(ret, then_seq);
- }
+ ADD_INSNL(ret, line, jump, end_label);
- if (else_label->refcnt) {
ADD_LABEL(ret, else_label);
- if (then_label->refcnt) {
- ADD_TRACE_BRANCH_COVERAGE(
- ret,
- node_else ? nd_first_lineno(node_else) : lineno,
- node_else ? nd_first_column(node_else) : column,
- node_else ? nd_last_lineno(node_else) : last_lineno,
- node_else ? nd_last_column(node_else) : last_column,
- type == NODE_IF ? "else" : "then",
- branches);
- }
ADD_SEQ(ret, else_seq);
- }
- if (end_label) {
ADD_LABEL(ret, end_label);
- }
- return COMPILE_OK;
-}
+ break;
+ }
+ case NODE_CASE:{
+ NODE *vals;
+ NODE *tempnode = node;
+ LABEL *endlabel, *elselabel;
+ DECL_ANCHOR(head);
+ DECL_ANCHOR(body_seq);
+ DECL_ANCHOR(cond_seq);
+ int only_special_literals = 1;
+ VALUE literals = rb_hash_new();
+
+ INIT_ANCHOR(head);
+ INIT_ANCHOR(body_seq);
+ INIT_ANCHOR(cond_seq);
+
+ rb_hash_tbl_raw(literals)->type = &cdhash_type;
+
+ if (node->nd_head == 0) {
+ COMPILE_(ret, "when", node->nd_body, poped);
+ break;
+ }
+ COMPILE(head, "case base", node->nd_head);
-static int
-compile_case(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const orig_node, int popped)
-{
- const NODE *vals;
- const NODE *node = orig_node;
- LABEL *endlabel, *elselabel;
- DECL_ANCHOR(head);
- DECL_ANCHOR(body_seq);
- DECL_ANCHOR(cond_seq);
- int only_special_literals = 1;
- VALUE literals = rb_hash_new();
- int line, lineno, column, last_lineno, last_column;
- enum node_type type;
- VALUE branches = 0;
+ node = node->nd_body;
+ type = nd_type(node);
+ line = nd_line(node);
- INIT_ANCHOR(head);
- INIT_ANCHOR(body_seq);
- INIT_ANCHOR(cond_seq);
+ if (type != NODE_WHEN) {
+ COMPILE_ERROR(ERROR_ARGS "NODE_CASE: unexpected node. must be NODE_WHEN, but %s", ruby_node_name(type));
+ debug_node_end();
+ return COMPILE_NG;
+ }
- RHASH_TBL_RAW(literals)->type = &cdhash_type;
+ endlabel = NEW_LABEL(line);
+ elselabel = NEW_LABEL(line);
- CHECK(COMPILE(head, "case base", node->nd_head));
+ ADD_SEQ(ret, head); /* case VAL */
- DECL_BRANCH_BASE(branches, nd_first_lineno(node), nd_first_column(node), nd_last_lineno(node), nd_last_column(node), "case");
+ while (type == NODE_WHEN) {
+ LABEL *l1;
- node = node->nd_body;
- EXPECT_NODE("NODE_CASE", node, NODE_WHEN, COMPILE_NG);
- type = nd_type(node);
- line = nd_line(node);
- lineno = nd_first_lineno(node);
- column = nd_first_column(node);
- last_lineno = nd_last_lineno(node);
- last_column = nd_last_column(node);
-
- endlabel = NEW_LABEL(line);
- elselabel = NEW_LABEL(line);
-
- ADD_SEQ(ret, head); /* case VAL */
-
- while (type == NODE_WHEN) {
- LABEL *l1;
-
- l1 = NEW_LABEL(line);
- ADD_LABEL(body_seq, l1);
- ADD_INSN(body_seq, line, pop);
- ADD_TRACE_BRANCH_COVERAGE(
- body_seq,
- node->nd_body ? nd_first_lineno(node->nd_body) : lineno,
- node->nd_body ? nd_first_column(node->nd_body) : column,
- node->nd_body ? nd_last_lineno(node->nd_body) : last_lineno,
- node->nd_body ? nd_last_column(node->nd_body) : last_column,
- "when",
- branches);
- CHECK(COMPILE_(body_seq, "when body", node->nd_body, popped));
- ADD_INSNL(body_seq, line, jump, endlabel);
-
- vals = node->nd_head;
- if (vals) {
+ l1 = NEW_LABEL(line);
+ ADD_LABEL(body_seq, l1);
+ ADD_INSN(body_seq, line, pop);
+ COMPILE_(body_seq, "when body", node->nd_body, poped);
+ ADD_INSNL(body_seq, line, jump, endlabel);
+
+ vals = node->nd_head;
+ if (vals) {
+ switch (nd_type(vals)) {
+ case NODE_ARRAY:
+ only_special_literals = when_vals(iseq, cond_seq, vals, l1, only_special_literals, literals);
+ break;
+ case NODE_SPLAT:
+ case NODE_ARGSCAT:
+ case NODE_ARGSPUSH:
+ only_special_literals = 0;
+ ADD_INSN (cond_seq, nd_line(vals), dup);
+ COMPILE(cond_seq, "when/cond splat", vals);
+ ADD_INSN1(cond_seq, nd_line(vals), checkmatch, INT2FIX(VM_CHECKMATCH_TYPE_CASE | VM_CHECKMATCH_ARRAY));
+ ADD_INSNL(cond_seq, nd_line(vals), branchif, l1);
+ break;
+ default:
+ UNKNOWN_NODE("NODE_CASE", vals);
+ }
+ }
+ else {
+ EXPECT_NODE_NONULL("NODE_CASE", node, NODE_ARRAY);
+ }
+
+ node = node->nd_next;
+ if (!node) {
+ break;
+ }
+ type = nd_type(node);
+ line = nd_line(node);
+ }
+ /* else */
+ if (node) {
+ ADD_LABEL(cond_seq, elselabel);
+ ADD_INSN(cond_seq, line, pop);
+ COMPILE_(cond_seq, "else", node, poped);
+ ADD_INSNL(cond_seq, line, jump, endlabel);
+ }
+ else {
+ debugs("== else (implicit)\n");
+ ADD_LABEL(cond_seq, elselabel);
+ ADD_INSN(cond_seq, nd_line(tempnode), pop);
+ if (!poped) {
+ ADD_INSN(cond_seq, nd_line(tempnode), putnil);
+ }
+ ADD_INSNL(cond_seq, nd_line(tempnode), jump, endlabel);
+ }
+
+ if (only_special_literals) {
+ iseq_add_mark_object(iseq, literals);
+
+ ADD_INSN(ret, nd_line(tempnode), dup);
+ ADD_INSN2(ret, nd_line(tempnode), opt_case_dispatch, literals, elselabel);
+ LABEL_REF(elselabel);
+ }
+
+ ADD_SEQ(ret, cond_seq);
+ ADD_SEQ(ret, body_seq);
+ ADD_LABEL(ret, endlabel);
+ break;
+ }
+ case NODE_WHEN:{
+ NODE *vals;
+ NODE *val;
+ NODE *orig_node = node;
+ LABEL *endlabel;
+ DECL_ANCHOR(body_seq);
+
+ INIT_ANCHOR(body_seq);
+ endlabel = NEW_LABEL(line);
+
+ while (node && nd_type(node) == NODE_WHEN) {
+ LABEL *l1 = NEW_LABEL(line = nd_line(node));
+ ADD_LABEL(body_seq, l1);
+ COMPILE_(body_seq, "when", node->nd_body, poped);
+ ADD_INSNL(body_seq, line, jump, endlabel);
+
+ vals = node->nd_head;
+ if (!vals) {
+ rb_compile_bug_str(ERROR_ARGS "NODE_WHEN: must be NODE_ARRAY, but 0");
+ }
switch (nd_type(vals)) {
case NODE_ARRAY:
- only_special_literals = when_vals(iseq, cond_seq, vals, l1, only_special_literals, literals);
- if (only_special_literals < 0) return COMPILE_NG;
+ while (vals) {
+ val = vals->nd_head;
+ COMPILE(ret, "when2", val);
+ ADD_INSNL(ret, nd_line(val), branchif, l1);
+ vals = vals->nd_next;
+ }
break;
case NODE_SPLAT:
case NODE_ARGSCAT:
case NODE_ARGSPUSH:
- only_special_literals = 0;
- CHECK(when_splat_vals(iseq, cond_seq, vals, l1, only_special_literals, literals));
+ ADD_INSN(ret, nd_line(vals), putnil);
+ COMPILE(ret, "when2/cond splat", vals);
+ ADD_INSN1(ret, nd_line(vals), checkmatch, INT2FIX(VM_CHECKMATCH_TYPE_WHEN | VM_CHECKMATCH_ARRAY));
+ ADD_INSNL(ret, nd_line(vals), branchif, l1);
break;
default:
- UNKNOWN_NODE("NODE_CASE", vals, COMPILE_NG);
+ UNKNOWN_NODE("NODE_WHEN", vals);
}
+ node = node->nd_next;
}
- else {
- EXPECT_NODE_NONULL("NODE_CASE", node, NODE_ARRAY, COMPILE_NG);
- }
-
- node = node->nd_next;
- if (!node) {
- break;
- }
- type = nd_type(node);
- line = nd_line(node);
- lineno = nd_first_lineno(node);
- column = nd_first_column(node);
- last_lineno = nd_last_lineno(node);
- last_column = nd_last_column(node);
- }
- /* else */
- if (node) {
- ADD_LABEL(cond_seq, elselabel);
- ADD_INSN(cond_seq, line, pop);
- ADD_TRACE_BRANCH_COVERAGE(cond_seq, nd_first_lineno(node), nd_first_column(node), nd_last_lineno(node), nd_last_column(node), "else", branches);
- CHECK(COMPILE_(cond_seq, "else", node, popped));
- ADD_INSNL(cond_seq, line, jump, endlabel);
- }
- else {
- debugs("== else (implicit)\n");
- ADD_LABEL(cond_seq, elselabel);
- ADD_INSN(cond_seq, nd_line(orig_node), pop);
- ADD_TRACE_BRANCH_COVERAGE(cond_seq, nd_first_lineno(orig_node), nd_first_column(orig_node), nd_last_lineno(orig_node), nd_last_column(orig_node), "else", branches);
- if (!popped) {
- ADD_INSN(cond_seq, nd_line(orig_node), putnil);
- }
- ADD_INSNL(cond_seq, nd_line(orig_node), jump, endlabel);
- }
+ /* else */
+ COMPILE_(ret, "else", node, poped);
+ ADD_INSNL(ret, nd_line(orig_node), jump, endlabel);
- if (only_special_literals && ISEQ_COMPILE_DATA(iseq)->option->specialized_instruction) {
- iseq_add_mark_object_compile_time(iseq, literals);
+ ADD_SEQ(ret, body_seq);
+ ADD_LABEL(ret, endlabel);
- ADD_INSN(ret, nd_line(orig_node), dup);
- ADD_INSN2(ret, nd_line(orig_node), opt_case_dispatch, literals, elselabel);
- LABEL_REF(elselabel);
- }
+ break;
+ }
+ case NODE_OPT_N:
+ case NODE_WHILE:
+ case NODE_UNTIL:{
+ LABEL *prev_start_label = ISEQ_COMPILE_DATA(iseq)->start_label;
+ LABEL *prev_end_label = ISEQ_COMPILE_DATA(iseq)->end_label;
+ LABEL *prev_redo_label = ISEQ_COMPILE_DATA(iseq)->redo_label;
+ int prev_loopval_popped = ISEQ_COMPILE_DATA(iseq)->loopval_popped;
- ADD_SEQ(ret, cond_seq);
- ADD_SEQ(ret, body_seq);
- ADD_LABEL(ret, endlabel);
- return COMPILE_OK;
-}
+ struct iseq_compile_data_ensure_node_stack enl;
-static int
-compile_case2(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const orig_node, int popped)
-{
- const NODE *vals;
- const NODE *val;
- const NODE *node = orig_node->nd_body;
- LABEL *endlabel;
- DECL_ANCHOR(body_seq);
- VALUE branches = 0;
-
- DECL_BRANCH_BASE(branches, nd_first_lineno(orig_node), nd_first_column(orig_node), nd_last_lineno(orig_node), nd_last_column(orig_node), "case");
-
- INIT_ANCHOR(body_seq);
- endlabel = NEW_LABEL(nd_line(node));
-
- while (node && nd_type(node) == NODE_WHEN) {
- const int line = nd_line(node);
- const int lineno = nd_first_lineno(node);
- const int column = nd_first_column(node);
- const int last_lineno = nd_last_lineno(node);
- const int last_column = nd_last_column(node);
- LABEL *l1 = NEW_LABEL(line);
- ADD_LABEL(body_seq, l1);
- ADD_TRACE_BRANCH_COVERAGE(
- body_seq,
- node->nd_body ? nd_first_lineno(node->nd_body) : lineno,
- node->nd_body ? nd_first_column(node->nd_body) : column,
- node->nd_body ? nd_last_lineno(node->nd_body) : last_lineno,
- node->nd_body ? nd_last_column(node->nd_body) : last_column,
- "when",
- branches);
- CHECK(COMPILE_(body_seq, "when", node->nd_body, popped));
- ADD_INSNL(body_seq, line, jump, endlabel);
-
- vals = node->nd_head;
- if (!vals) {
- COMPILE_ERROR(ERROR_ARGS "NODE_WHEN: must be NODE_ARRAY, but 0");
- return COMPILE_NG;
- }
- switch (nd_type(vals)) {
- case NODE_ARRAY:
- while (vals) {
- LABEL *lnext;
- val = vals->nd_head;
- lnext = NEW_LABEL(nd_line(val));
- debug_compile("== when2\n", (void)0);
- CHECK(compile_branch_condition(iseq, ret, val, l1, lnext));
- ADD_LABEL(ret, lnext);
- vals = vals->nd_next;
- }
- break;
- case NODE_SPLAT:
- case NODE_ARGSCAT:
- case NODE_ARGSPUSH:
- ADD_INSN(ret, nd_line(vals), putnil);
- CHECK(COMPILE(ret, "when2/cond splat", vals));
- ADD_INSN1(ret, nd_line(vals), checkmatch, INT2FIX(VM_CHECKMATCH_TYPE_WHEN | VM_CHECKMATCH_ARRAY));
- ADD_INSNL(ret, nd_line(vals), branchif, l1);
- break;
- default:
- UNKNOWN_NODE("NODE_WHEN", vals, COMPILE_NG);
- }
- node = node->nd_next;
- }
- /* else */
- ADD_TRACE_BRANCH_COVERAGE(
- ret,
- node ? nd_first_lineno(node) : nd_first_lineno(orig_node),
- node ? nd_first_column(node) : nd_first_column(orig_node),
- node ? nd_last_lineno(node) : nd_last_lineno(orig_node),
- node ? nd_last_column(node) : nd_last_column(orig_node),
- "else",
- branches);
- CHECK(COMPILE_(ret, "else", node, popped));
- ADD_INSNL(ret, nd_line(orig_node), jump, endlabel);
-
- ADD_SEQ(ret, body_seq);
- ADD_LABEL(ret, endlabel);
- return COMPILE_OK;
-}
+ LABEL *next_label = ISEQ_COMPILE_DATA(iseq)->start_label = NEW_LABEL(line); /* next */
+ LABEL *redo_label = ISEQ_COMPILE_DATA(iseq)->redo_label = NEW_LABEL(line); /* redo */
+ LABEL *break_label = ISEQ_COMPILE_DATA(iseq)->end_label = NEW_LABEL(line); /* break */
+ LABEL *end_label = NEW_LABEL(line);
+ LABEL *adjust_label = NEW_LABEL(line);
-static int
-compile_loop(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node, int popped, const enum node_type type)
-{
- const int line = (int)nd_line(node);
- const int lineno = nd_first_lineno(node);
- const int column = nd_first_column(node);
- const int last_lineno = nd_last_lineno(node);
- const int last_column = nd_last_column(node);
- LABEL *prev_start_label = ISEQ_COMPILE_DATA(iseq)->start_label;
- LABEL *prev_end_label = ISEQ_COMPILE_DATA(iseq)->end_label;
- LABEL *prev_redo_label = ISEQ_COMPILE_DATA(iseq)->redo_label;
- int prev_loopval_popped = ISEQ_COMPILE_DATA(iseq)->loopval_popped;
- VALUE branches = 0;
-
- struct iseq_compile_data_ensure_node_stack enl;
-
- LABEL *next_label = ISEQ_COMPILE_DATA(iseq)->start_label = NEW_LABEL(line); /* next */
- LABEL *redo_label = ISEQ_COMPILE_DATA(iseq)->redo_label = NEW_LABEL(line); /* redo */
- LABEL *break_label = ISEQ_COMPILE_DATA(iseq)->end_label = NEW_LABEL(line); /* break */
- LABEL *end_label = NEW_LABEL(line);
- LABEL *adjust_label = NEW_LABEL(line);
-
- LABEL *next_catch_label = NEW_LABEL(line);
- LABEL *tmp_label = NULL;
-
- ISEQ_COMPILE_DATA(iseq)->loopval_popped = 0;
- push_ensure_entry(iseq, &enl, NULL, NULL);
-
- if (node->nd_state == 1) {
- ADD_INSNL(ret, line, jump, next_label);
- }
- else {
- tmp_label = NEW_LABEL(line);
- ADD_INSNL(ret, line, jump, tmp_label);
- }
- ADD_LABEL(ret, adjust_label);
- ADD_INSN(ret, line, putnil);
- ADD_LABEL(ret, next_catch_label);
- ADD_INSN(ret, line, pop);
- ADD_INSNL(ret, line, jump, next_label);
- if (tmp_label) ADD_LABEL(ret, tmp_label);
-
- ADD_LABEL(ret, redo_label);
- DECL_BRANCH_BASE(branches, lineno, column, last_lineno, last_column, type == NODE_WHILE ? "while" : "until");
- ADD_TRACE_BRANCH_COVERAGE(
- ret,
- node->nd_body ? nd_first_lineno(node->nd_body) : lineno,
- node->nd_body ? nd_first_column(node->nd_body) : column,
- node->nd_body ? nd_last_lineno(node->nd_body) : last_lineno,
- node->nd_body ? nd_last_column(node->nd_body) : last_column,
- "body",
- branches);
- CHECK(COMPILE_POPPED(ret, "while body", node->nd_body));
- ADD_LABEL(ret, next_label); /* next */
-
- if (type == NODE_WHILE) {
- compile_branch_condition(iseq, ret, node->nd_cond,
- redo_label, end_label);
- }
- else {
- /* until */
- compile_branch_condition(iseq, ret, node->nd_cond,
- end_label, redo_label);
- }
+ LABEL *next_catch_label = NEW_LABEL(line);
+ LABEL *tmp_label = NULL;
- ADD_LABEL(ret, end_label);
- ADD_ADJUST_RESTORE(ret, adjust_label);
+ ISEQ_COMPILE_DATA(iseq)->loopval_popped = 0;
+ push_ensure_entry(iseq, &enl, 0, 0);
- if (node->nd_state == Qundef) {
- /* ADD_INSN(ret, line, putundef); */
- COMPILE_ERROR(ERROR_ARGS "unsupported: putundef");
- return COMPILE_NG;
- }
- else {
+ if (type == NODE_OPT_N || node->nd_state == 1) {
+ ADD_INSNL(ret, line, jump, next_label);
+ }
+ else {
+ tmp_label = NEW_LABEL(line);
+ ADD_INSNL(ret, line, jump, tmp_label);
+ }
+ ADD_LABEL(ret, adjust_label);
ADD_INSN(ret, line, putnil);
- }
-
- ADD_LABEL(ret, break_label); /* break */
-
- if (popped) {
- ADD_INSN(ret, line, pop);
- }
-
- ADD_CATCH_ENTRY(CATCH_TYPE_BREAK, redo_label, break_label, NULL,
- break_label);
- ADD_CATCH_ENTRY(CATCH_TYPE_NEXT, redo_label, break_label, NULL,
- next_catch_label);
- ADD_CATCH_ENTRY(CATCH_TYPE_REDO, redo_label, break_label, NULL,
- ISEQ_COMPILE_DATA(iseq)->redo_label);
-
- ISEQ_COMPILE_DATA(iseq)->start_label = prev_start_label;
- ISEQ_COMPILE_DATA(iseq)->end_label = prev_end_label;
- ISEQ_COMPILE_DATA(iseq)->redo_label = prev_redo_label;
- ISEQ_COMPILE_DATA(iseq)->loopval_popped = prev_loopval_popped;
- ISEQ_COMPILE_DATA(iseq)->ensure_node_stack = ISEQ_COMPILE_DATA(iseq)->ensure_node_stack->prev;
- return COMPILE_OK;
-}
-
-static int
-compile_iter(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node, int popped)
-{
- const int line = nd_line(node);
- const rb_iseq_t *prevblock = ISEQ_COMPILE_DATA(iseq)->current_block;
- LABEL *retry_label = NEW_LABEL(line);
- LABEL *retry_end_l = NEW_LABEL(line);
- const rb_iseq_t *child_iseq;
-
- ADD_LABEL(ret, retry_label);
- if (nd_type(node) == NODE_FOR) {
- CHECK(COMPILE(ret, "iter caller (for)", node->nd_iter));
-
- ISEQ_COMPILE_DATA(iseq)->current_block = child_iseq =
- NEW_CHILD_ISEQ(node->nd_body, make_name_for_block(iseq),
- ISEQ_TYPE_BLOCK, line);
- ADD_SEND_WITH_BLOCK(ret, line, idEach, INT2FIX(0), child_iseq);
- }
- else {
- ISEQ_COMPILE_DATA(iseq)->current_block = child_iseq =
- NEW_CHILD_ISEQ(node->nd_body, make_name_for_block(iseq),
- ISEQ_TYPE_BLOCK, line);
- CHECK(COMPILE(ret, "iter caller", node->nd_iter));
- }
- ADD_LABEL(ret, retry_end_l);
-
- if (popped) {
+ ADD_LABEL(ret, next_catch_label);
ADD_INSN(ret, line, pop);
- }
-
- ISEQ_COMPILE_DATA(iseq)->current_block = prevblock;
-
- ADD_CATCH_ENTRY(CATCH_TYPE_BREAK, retry_label, retry_end_l, child_iseq, retry_end_l);
- return COMPILE_OK;
-}
+ ADD_INSNL(ret, line, jump, next_label);
+ if (tmp_label) ADD_LABEL(ret, tmp_label);
-static int
-compile_for_masgn(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node, int popped)
-{
- /* massign to var in "for"
- * (args.length == 1 && Array.try_convert(args[0])) || args
- */
- const int line = nd_line(node);
- const NODE *var = node->nd_var;
- LABEL *not_single = NEW_LABEL(nd_line(var));
- LABEL *not_ary = NEW_LABEL(nd_line(var));
- CHECK(COMPILE(ret, "for var", var));
- ADD_INSN(ret, line, dup);
- ADD_CALL(ret, line, idLength, INT2FIX(0));
- ADD_INSN1(ret, line, putobject, INT2FIX(1));
- ADD_CALL(ret, line, idEq, INT2FIX(1));
- ADD_INSNL(ret, line, branchunless, not_single);
- ADD_INSN(ret, line, dup);
- ADD_INSN1(ret, line, putobject, INT2FIX(0));
- ADD_CALL(ret, line, idAREF, INT2FIX(1));
- ADD_INSN1(ret, line, putobject, rb_cArray);
- ADD_INSN(ret, line, swap);
- ADD_CALL(ret, line, rb_intern("try_convert"), INT2FIX(1));
- ADD_INSN(ret, line, dup);
- ADD_INSNL(ret, line, branchunless, not_ary);
- ADD_INSN(ret, line, swap);
- ADD_LABEL(ret, not_ary);
- ADD_INSN(ret, line, pop);
- ADD_LABEL(ret, not_single);
- return COMPILE_OK;
-}
+ ADD_LABEL(ret, redo_label);
+ COMPILE_POPED(ret, "while body", node->nd_body);
+ ADD_LABEL(ret, next_label); /* next */
-static int
-compile_break(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node, int popped)
-{
- const int line = nd_line(node);
- unsigned long throw_flag = 0;
-
- if (ISEQ_COMPILE_DATA(iseq)->redo_label != 0) {
- /* while/until */
- LABEL *splabel = NEW_LABEL(0);
- ADD_LABEL(ret, splabel);
- ADD_ADJUST(ret, line, ISEQ_COMPILE_DATA(iseq)->redo_label);
- CHECK(COMPILE_(ret, "break val (while/until)", node->nd_stts,
- ISEQ_COMPILE_DATA(iseq)->loopval_popped));
- add_ensure_iseq(ret, iseq, 0);
- ADD_INSNL(ret, line, jump, ISEQ_COMPILE_DATA(iseq)->end_label);
- ADD_ADJUST_RESTORE(ret, splabel);
-
- if (!popped) {
- ADD_INSN(ret, line, putnil);
+ if (type == NODE_WHILE) {
+ compile_branch_condition(iseq, ret, node->nd_cond,
+ redo_label, end_label);
}
- }
- else if (iseq->body->type == ISEQ_TYPE_BLOCK) {
- break_by_insn:
- /* escape from block */
- CHECK(COMPILE(ret, "break val (block)", node->nd_stts));
- ADD_INSN1(ret, line, throw, INT2FIX(throw_flag | TAG_BREAK));
- if (popped) {
- ADD_INSN(ret, line, pop);
+ else if (type == NODE_UNTIL) {
+ /* until */
+ compile_branch_condition(iseq, ret, node->nd_cond,
+ end_label, redo_label);
+ }
+ else {
+ ADD_CALL_RECEIVER(ret, line);
+ ADD_CALL(ret, line, idGets, INT2FIX(0));
+ ADD_INSNL(ret, line, branchif, redo_label);
+ /* opt_n */
}
- }
- else if (iseq->body->type == ISEQ_TYPE_EVAL) {
- break_in_eval:
- COMPILE_ERROR(ERROR_ARGS "Can't escape from eval with break");
- return COMPILE_NG;
- }
- else {
- const rb_iseq_t *ip = iseq->body->parent_iseq;
-
- while (ip) {
- if (!ISEQ_COMPILE_DATA(ip)) {
- ip = 0;
- break;
- }
- if (ISEQ_COMPILE_DATA(ip)->redo_label != 0) {
- throw_flag = VM_THROW_NO_ESCAPE_FLAG;
- goto break_by_insn;
- }
- else if (ip->body->type == ISEQ_TYPE_BLOCK) {
- goto break_by_insn;
- }
- else if (ip->body->type == ISEQ_TYPE_EVAL) {
- goto break_in_eval;
- }
+ ADD_LABEL(ret, end_label);
+ ADD_ADJUST_RESTORE(ret, adjust_label);
- ip = ip->body->parent_iseq;
+ if (node->nd_state == Qundef) {
+ /* ADD_INSN(ret, line, putundef); */
+ rb_compile_bug_str(ERROR_ARGS "unsupported: putundef");
}
- COMPILE_ERROR(ERROR_ARGS "Invalid break");
- return COMPILE_NG;
- }
- return COMPILE_OK;
-}
-
-static int
-compile_next(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node, int popped)
-{
- const int line = nd_line(node);
- unsigned long throw_flag = 0;
-
- if (ISEQ_COMPILE_DATA(iseq)->redo_label != 0) {
- LABEL *splabel = NEW_LABEL(0);
- debugs("next in while loop\n");
- ADD_LABEL(ret, splabel);
- CHECK(COMPILE(ret, "next val/valid syntax?", node->nd_stts));
- add_ensure_iseq(ret, iseq, 0);
- ADD_ADJUST(ret, line, ISEQ_COMPILE_DATA(iseq)->redo_label);
- ADD_INSNL(ret, line, jump, ISEQ_COMPILE_DATA(iseq)->start_label);
- ADD_ADJUST_RESTORE(ret, splabel);
- if (!popped) {
+ else {
ADD_INSN(ret, line, putnil);
}
- }
- else if (ISEQ_COMPILE_DATA(iseq)->end_label) {
- LABEL *splabel = NEW_LABEL(0);
- debugs("next in block\n");
- ADD_LABEL(ret, splabel);
- ADD_ADJUST(ret, line, ISEQ_COMPILE_DATA(iseq)->start_label);
- CHECK(COMPILE(ret, "next val", node->nd_stts));
- add_ensure_iseq(ret, iseq, 0);
- ADD_INSNL(ret, line, jump, ISEQ_COMPILE_DATA(iseq)->end_label);
- ADD_ADJUST_RESTORE(ret, splabel);
- splabel->unremovable = FALSE;
- if (!popped) {
- ADD_INSN(ret, line, putnil);
+ ADD_LABEL(ret, break_label); /* break */
+
+ if (poped) {
+ ADD_INSN(ret, line, pop);
}
- }
- else if (iseq->body->type == ISEQ_TYPE_EVAL) {
- next_in_eval:
- COMPILE_ERROR(ERROR_ARGS "Can't escape from eval with next");
- return COMPILE_NG;
- }
- else {
- const rb_iseq_t *ip = iseq;
- while (ip) {
- if (!ISEQ_COMPILE_DATA(ip)) {
- ip = 0;
- break;
- }
+ ADD_CATCH_ENTRY(CATCH_TYPE_BREAK, redo_label, break_label,
+ 0, break_label);
+ ADD_CATCH_ENTRY(CATCH_TYPE_NEXT, redo_label, break_label, 0,
+ next_catch_label);
+ ADD_CATCH_ENTRY(CATCH_TYPE_REDO, redo_label, break_label, 0,
+ ISEQ_COMPILE_DATA(iseq)->redo_label);
- throw_flag = VM_THROW_NO_ESCAPE_FLAG;
- if (ISEQ_COMPILE_DATA(ip)->redo_label != 0) {
- /* while loop */
- break;
- }
- else if (ip->body->type == ISEQ_TYPE_BLOCK) {
- break;
- }
- else if (ip->body->type == ISEQ_TYPE_EVAL) {
- goto next_in_eval;
- }
-
- ip = ip->body->parent_iseq;
+ ISEQ_COMPILE_DATA(iseq)->start_label = prev_start_label;
+ ISEQ_COMPILE_DATA(iseq)->end_label = prev_end_label;
+ ISEQ_COMPILE_DATA(iseq)->redo_label = prev_redo_label;
+ ISEQ_COMPILE_DATA(iseq)->loopval_popped = prev_loopval_popped;
+ ISEQ_COMPILE_DATA(iseq)->ensure_node_stack = ISEQ_COMPILE_DATA(iseq)->ensure_node_stack->prev;
+ break;
+ }
+ case NODE_FOR:
+ if (node->nd_var) {
+ /* massign to var in "for"
+ * args.length == 1 && Array === (tmp = args[0]) ? tmp : args
+ */
+ NODE *var = node->nd_var;
+ LABEL *not_single = NEW_LABEL(nd_line(var));
+ LABEL *not_ary = NEW_LABEL(nd_line(var));
+ COMPILE(ret, "for var", var);
+ ADD_INSN(ret, line, dup);
+ ADD_CALL(ret, line, idLength, INT2FIX(0));
+ ADD_INSN1(ret, line, putobject, INT2FIX(1));
+ ADD_CALL(ret, line, idEq, INT2FIX(1));
+ ADD_INSNL(ret, line, branchunless, not_single);
+ ADD_INSN(ret, line, dup);
+ ADD_INSN1(ret, line, putobject, INT2FIX(0));
+ ADD_CALL(ret, line, idAREF, INT2FIX(1));
+ ADD_INSN1(ret, line, putobject, rb_cArray);
+ ADD_INSN1(ret, line, topn, INT2FIX(1));
+ ADD_CALL(ret, line, idEqq, INT2FIX(1));
+ ADD_INSNL(ret, line, branchunless, not_ary);
+ ADD_INSN(ret, line, swap);
+ ADD_LABEL(ret, not_ary);
+ ADD_INSN(ret, line, pop);
+ ADD_LABEL(ret, not_single);
+ break;
}
- if (ip != 0) {
- CHECK(COMPILE(ret, "next val", node->nd_stts));
- ADD_INSN1(ret, line, throw, INT2FIX(throw_flag | TAG_NEXT));
+ case NODE_ITER:{
+ const rb_iseq_t *prevblock = ISEQ_COMPILE_DATA(iseq)->current_block;
+ LABEL *retry_label = NEW_LABEL(line);
+ LABEL *retry_end_l = NEW_LABEL(line);
- if (popped) {
- ADD_INSN(ret, line, pop);
- }
+ ADD_LABEL(ret, retry_label);
+ if (nd_type(node) == NODE_FOR) {
+ COMPILE(ret, "iter caller (for)", node->nd_iter);
+
+ ISEQ_COMPILE_DATA(iseq)->current_block = NEW_CHILD_ISEQ(node->nd_body, make_name_for_block(iseq),
+ ISEQ_TYPE_BLOCK, line);
+ ADD_SEND_WITH_BLOCK(ret, line, idEach, INT2FIX(0), ISEQ_COMPILE_DATA(iseq)->current_block);
}
else {
- COMPILE_ERROR(ERROR_ARGS "Invalid next");
- return COMPILE_NG;
+ ISEQ_COMPILE_DATA(iseq)->current_block = NEW_CHILD_ISEQ(node->nd_body, make_name_for_block(iseq),
+ ISEQ_TYPE_BLOCK, line);
+ COMPILE(ret, "iter caller", node->nd_iter);
}
- }
- return COMPILE_OK;
-}
+ ADD_LABEL(ret, retry_end_l);
-static int
-compile_redo(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node, int popped)
-{
- const int line = nd_line(node);
-
- if (ISEQ_COMPILE_DATA(iseq)->redo_label) {
- LABEL *splabel = NEW_LABEL(0);
- debugs("redo in while");
- ADD_LABEL(ret, splabel);
- ADD_ADJUST(ret, line, ISEQ_COMPILE_DATA(iseq)->redo_label);
- add_ensure_iseq(ret, iseq, 0);
- ADD_INSNL(ret, line, jump, ISEQ_COMPILE_DATA(iseq)->redo_label);
- ADD_ADJUST_RESTORE(ret, splabel);
- if (!popped) {
- ADD_INSN(ret, line, putnil);
+ if (poped) {
+ ADD_INSN(ret, line, pop);
}
- }
- else if (iseq->body->type == ISEQ_TYPE_EVAL) {
- redo_in_eval:
- COMPILE_ERROR(ERROR_ARGS "Can't escape from eval with redo");
- return COMPILE_NG;
- }
- else if (ISEQ_COMPILE_DATA(iseq)->start_label) {
- LABEL *splabel = NEW_LABEL(0);
- debugs("redo in block");
- ADD_LABEL(ret, splabel);
- add_ensure_iseq(ret, iseq, 0);
- ADD_ADJUST(ret, line, ISEQ_COMPILE_DATA(iseq)->start_label);
- ADD_INSNL(ret, line, jump, ISEQ_COMPILE_DATA(iseq)->start_label);
- ADD_ADJUST_RESTORE(ret, splabel);
+ ISEQ_COMPILE_DATA(iseq)->current_block = prevblock;
- if (!popped) {
- ADD_INSN(ret, line, putnil);
- }
- }
- else {
- const rb_iseq_t *ip = iseq;
+ ADD_CATCH_ENTRY(CATCH_TYPE_BREAK, retry_label, retry_end_l, 0, retry_end_l);
- while (ip) {
- if (!ISEQ_COMPILE_DATA(ip)) {
- ip = 0;
- break;
- }
+ break;
+ }
+ case NODE_BREAK:{
+ unsigned long level = 0;
- if (ISEQ_COMPILE_DATA(ip)->redo_label != 0) {
- break;
- }
- else if (ip->body->type == ISEQ_TYPE_BLOCK) {
- break;
- }
- else if (ip->body->type == ISEQ_TYPE_EVAL) {
- goto redo_in_eval;
- }
+ if (ISEQ_COMPILE_DATA(iseq)->redo_label != 0) {
+ /* while/until */
+ LABEL *splabel = NEW_LABEL(0);
+ ADD_LABEL(ret, splabel);
+ ADD_ADJUST(ret, line, ISEQ_COMPILE_DATA(iseq)->redo_label);
+ COMPILE_(ret, "break val (while/until)", node->nd_stts, ISEQ_COMPILE_DATA(iseq)->loopval_popped);
+ add_ensure_iseq(ret, iseq, 0);
+ ADD_INSNL(ret, line, jump, ISEQ_COMPILE_DATA(iseq)->end_label);
+ ADD_ADJUST_RESTORE(ret, splabel);
- ip = ip->body->parent_iseq;
+ if (!poped) {
+ ADD_INSN(ret, line, putnil);
+ }
}
- if (ip != 0) {
- ADD_INSN(ret, line, putnil);
- ADD_INSN1(ret, line, throw, INT2FIX(VM_THROW_NO_ESCAPE_FLAG | TAG_REDO));
-
- if (popped) {
+ else if (iseq->body->type == ISEQ_TYPE_BLOCK) {
+ break_by_insn:
+ /* escape from block */
+ COMPILE(ret, "break val (block)", node->nd_stts);
+ ADD_INSN1(ret, line, throw, INT2FIX(level | TAG_BREAK));
+ if (poped) {
ADD_INSN(ret, line, pop);
}
}
- else {
- COMPILE_ERROR(ERROR_ARGS "Invalid redo");
+ else if (iseq->body->type == ISEQ_TYPE_EVAL) {
+ break_in_eval:
+ COMPILE_ERROR(ERROR_ARGS "Can't escape from eval with break");
+ debug_node_end();
return COMPILE_NG;
}
- }
- return COMPILE_OK;
-}
+ else {
+ const rb_iseq_t *ip = iseq->body->parent_iseq;
-static int
-compile_retry(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node, int popped)
-{
- const int line = nd_line(node);
+ while (ip) {
+ if (!ISEQ_COMPILE_DATA(ip)) {
+ ip = 0;
+ break;
+ }
- if (iseq->body->type == ISEQ_TYPE_RESCUE) {
- ADD_INSN(ret, line, putnil);
- ADD_INSN1(ret, line, throw, INT2FIX(TAG_RETRY));
+ level++;
+ if (ISEQ_COMPILE_DATA(ip)->redo_label != 0) {
+ level = VM_THROW_NO_ESCAPE_FLAG;
+ goto break_by_insn;
+ }
+ else if (ip->body->type == ISEQ_TYPE_BLOCK) {
+ level <<= VM_THROW_LEVEL_SHIFT;
+ goto break_by_insn;
+ }
+ else if (ip->body->type == ISEQ_TYPE_EVAL) {
+ goto break_in_eval;
+ }
- if (popped) {
- ADD_INSN(ret, line, pop);
+ ip = ip->body->parent_iseq;
+ }
+ COMPILE_ERROR(ERROR_ARGS "Invalid break");
+ debug_node_end();
+ return COMPILE_NG;
}
- }
- else {
- COMPILE_ERROR(ERROR_ARGS "Invalid retry");
- return COMPILE_NG;
- }
- return COMPILE_OK;
-}
-
-static int
-compile_rescue(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node, int popped)
-{
- const int line = nd_line(node);
- LABEL *lstart = NEW_LABEL(line);
- LABEL *lend = NEW_LABEL(line);
- LABEL *lcont = NEW_LABEL(line);
- const rb_iseq_t *rescue = NEW_CHILD_ISEQ(node->nd_resq,
- rb_str_concat(rb_str_new2("rescue in "), iseq->body->location.label),
- ISEQ_TYPE_RESCUE, line);
-
- lstart->rescued = LABEL_RESCUE_BEG;
- lend->rescued = LABEL_RESCUE_END;
- ADD_LABEL(ret, lstart);
- CHECK(COMPILE(ret, "rescue head", node->nd_head));
- ADD_LABEL(ret, lend);
- if (node->nd_else) {
- ADD_INSN(ret, line, pop);
- CHECK(COMPILE(ret, "rescue else", node->nd_else));
- }
- ADD_INSN(ret, line, nop);
- ADD_LABEL(ret, lcont);
-
- if (popped) {
- ADD_INSN(ret, line, pop);
- }
-
- /* register catch entry */
- ADD_CATCH_ENTRY(CATCH_TYPE_RESCUE, lstart, lend, rescue, lcont);
- ADD_CATCH_ENTRY(CATCH_TYPE_RETRY, lend, lcont, NULL, lstart);
- return COMPILE_OK;
-}
-
-static int
-compile_resbody(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node, int popped)
-{
- const int line = nd_line(node);
- const NODE *resq = node;
- const NODE *narg;
- LABEL *label_miss, *label_hit;
-
- while (resq) {
- label_miss = NEW_LABEL(line);
- label_hit = NEW_LABEL(line);
+ break;
+ }
+ case NODE_NEXT:{
+ unsigned long level = 0;
- narg = resq->nd_args;
- if (narg) {
- switch (nd_type(narg)) {
- case NODE_ARRAY:
- while (narg) {
- ADD_GETLOCAL(ret, line, LVAR_ERRINFO, 0);
- CHECK(COMPILE(ret, "rescue arg", narg->nd_head));
- ADD_INSN1(ret, line, checkmatch, INT2FIX(VM_CHECKMATCH_TYPE_RESCUE));
- ADD_INSNL(ret, line, branchif, label_hit);
- narg = narg->nd_next;
- }
- break;
- case NODE_SPLAT:
- case NODE_ARGSCAT:
- case NODE_ARGSPUSH:
- ADD_GETLOCAL(ret, line, LVAR_ERRINFO, 0);
- CHECK(COMPILE(ret, "rescue/cond splat", narg));
- ADD_INSN1(ret, line, checkmatch, INT2FIX(VM_CHECKMATCH_TYPE_RESCUE | VM_CHECKMATCH_ARRAY));
- ADD_INSNL(ret, line, branchif, label_hit);
- break;
- default:
- UNKNOWN_NODE("NODE_RESBODY", narg, COMPILE_NG);
+ if (ISEQ_COMPILE_DATA(iseq)->redo_label != 0) {
+ LABEL *splabel = NEW_LABEL(0);
+ debugs("next in while loop\n");
+ ADD_LABEL(ret, splabel);
+ COMPILE(ret, "next val/valid syntax?", node->nd_stts);
+ add_ensure_iseq(ret, iseq, 0);
+ ADD_ADJUST(ret, line, ISEQ_COMPILE_DATA(iseq)->redo_label);
+ ADD_INSNL(ret, line, jump, ISEQ_COMPILE_DATA(iseq)->start_label);
+ ADD_ADJUST_RESTORE(ret, splabel);
+ if (!poped) {
+ ADD_INSN(ret, line, putnil);
}
}
- else {
- ADD_GETLOCAL(ret, line, LVAR_ERRINFO, 0);
- ADD_INSN1(ret, line, putobject, rb_eStandardError);
- ADD_INSN1(ret, line, checkmatch, INT2FIX(VM_CHECKMATCH_TYPE_RESCUE));
- ADD_INSNL(ret, line, branchif, label_hit);
- }
- ADD_INSNL(ret, line, jump, label_miss);
- ADD_LABEL(ret, label_hit);
- CHECK(COMPILE(ret, "resbody body", resq->nd_body));
- if (ISEQ_COMPILE_DATA(iseq)->option->tailcall_optimization) {
- ADD_INSN(ret, line, nop);
- }
- ADD_INSN(ret, line, leave);
- ADD_LABEL(ret, label_miss);
- resq = resq->nd_head;
- }
- return COMPILE_OK;
-}
-
-static int
-compile_ensure(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node, int popped)
-{
- const int line = nd_line(node);
- DECL_ANCHOR(ensr);
- const rb_iseq_t *ensure = NEW_CHILD_ISEQ(node->nd_ensr,
- rb_str_concat(rb_str_new2 ("ensure in "), iseq->body->location.label),
- ISEQ_TYPE_ENSURE, line);
- LABEL *lstart = NEW_LABEL(line);
- LABEL *lend = NEW_LABEL(line);
- LABEL *lcont = NEW_LABEL(line);
- LINK_ELEMENT *last;
- int last_leave = 0;
- struct ensure_range er;
- struct iseq_compile_data_ensure_node_stack enl;
- struct ensure_range *erange;
+ else if (ISEQ_COMPILE_DATA(iseq)->end_label) {
+ LABEL *splabel = NEW_LABEL(0);
+ debugs("next in block\n");
+ ADD_LABEL(ret, splabel);
+ ADD_ADJUST(ret, line, ISEQ_COMPILE_DATA(iseq)->start_label);
+ COMPILE(ret, "next val", node->nd_stts);
+ add_ensure_iseq(ret, iseq, 0);
+ ADD_INSNL(ret, line, jump, ISEQ_COMPILE_DATA(iseq)->end_label);
+ ADD_ADJUST_RESTORE(ret, splabel);
- INIT_ANCHOR(ensr);
- CHECK(COMPILE_POPPED(ensr, "ensure ensr", node->nd_ensr));
- last = ensr->last;
- last_leave = last && IS_INSN(last) && IS_INSN_ID(last, leave);
-
- er.begin = lstart;
- er.end = lend;
- er.next = 0;
- push_ensure_entry(iseq, &enl, &er, node->nd_ensr);
-
- ADD_LABEL(ret, lstart);
- CHECK(COMPILE_(ret, "ensure head", node->nd_head, (popped | last_leave)));
- ADD_LABEL(ret, lend);
- ADD_SEQ(ret, ensr);
- if (!popped && last_leave) ADD_INSN(ret, line, putnil);
- ADD_LABEL(ret, lcont);
- if (last_leave) ADD_INSN(ret, line, pop);
-
- erange = ISEQ_COMPILE_DATA(iseq)->ensure_node_stack->erange;
- if (lstart->link.next != &lend->link) {
- while (erange) {
- ADD_CATCH_ENTRY(CATCH_TYPE_ENSURE, erange->begin, erange->end,
- ensure, lcont);
- erange = erange->next;
+ if (!poped) {
+ ADD_INSN(ret, line, putnil);
+ }
}
- }
+ else if (iseq->body->type == ISEQ_TYPE_EVAL) {
+ next_in_eval:
+ COMPILE_ERROR(ERROR_ARGS "Can't escape from eval with next");
+ }
+ else {
+ const rb_iseq_t *ip = iseq;
- ISEQ_COMPILE_DATA(iseq)->ensure_node_stack = enl.prev;
- return COMPILE_OK;
-}
+ while (ip) {
+ if (!ISEQ_COMPILE_DATA(ip)) {
+ ip = 0;
+ break;
+ }
-static int
-compile_return(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node, int popped)
-{
- const int line = nd_line(node);
+ level = VM_THROW_NO_ESCAPE_FLAG;
+ if (ISEQ_COMPILE_DATA(ip)->redo_label != 0) {
+ /* while loop */
+ break;
+ }
+ else if (ip->body->type == ISEQ_TYPE_BLOCK) {
+ break;
+ }
+ else if (ip->body->type == ISEQ_TYPE_EVAL) {
+ goto next_in_eval;
+ }
- if (iseq) {
- enum iseq_type type = iseq->body->type;
- const rb_iseq_t *is = iseq;
- enum iseq_type t = type;
- const NODE *retval = node->nd_stts;
- LABEL *splabel = 0;
+ ip = ip->body->parent_iseq;
+ }
+ if (ip != 0) {
+ COMPILE(ret, "next val", node->nd_stts);
+ ADD_INSN1(ret, line, throw, INT2FIX(level | TAG_NEXT));
- while (t == ISEQ_TYPE_RESCUE || t == ISEQ_TYPE_ENSURE) {
- if (!(is = is->body->parent_iseq)) break;
- t = is->body->type;
- }
- switch (t) {
- case ISEQ_TYPE_TOP:
- case ISEQ_TYPE_MAIN:
- if (is == iseq) {
- /* plain top-level, leave directly */
- type = ISEQ_TYPE_METHOD;
+ if (poped) {
+ ADD_INSN(ret, line, pop);
+ }
+ }
+ else {
+ COMPILE_ERROR(ERROR_ARGS "Invalid next");
}
- break;
- default:
- break;
}
-
- if (type == ISEQ_TYPE_METHOD) {
- splabel = NEW_LABEL(0);
+ break;
+ }
+ case NODE_REDO:{
+ if (ISEQ_COMPILE_DATA(iseq)->redo_label) {
+ LABEL *splabel = NEW_LABEL(0);
+ debugs("redo in while");
ADD_LABEL(ret, splabel);
- ADD_ADJUST(ret, line, 0);
+ ADD_ADJUST(ret, line, ISEQ_COMPILE_DATA(iseq)->redo_label);
+ add_ensure_iseq(ret, iseq, 0);
+ ADD_INSNL(ret, line, jump, ISEQ_COMPILE_DATA(iseq)->redo_label);
+ ADD_ADJUST_RESTORE(ret, splabel);
+ if (!poped) {
+ ADD_INSN(ret, line, putnil);
+ }
}
+ else if (iseq->body->type == ISEQ_TYPE_EVAL) {
+ redo_in_eval:
+ COMPILE_ERROR(ERROR_ARGS "Can't escape from eval with redo");
+ }
+ else if (ISEQ_COMPILE_DATA(iseq)->start_label) {
+ LABEL *splabel = NEW_LABEL(0);
- CHECK(COMPILE(ret, "return nd_stts (return val)", retval));
-
- if (type == ISEQ_TYPE_METHOD) {
- add_ensure_iseq(ret, iseq, 1);
- ADD_TRACE(ret, RUBY_EVENT_RETURN);
- ADD_INSN(ret, line, leave);
+ debugs("redo in block");
+ ADD_LABEL(ret, splabel);
+ add_ensure_iseq(ret, iseq, 0);
+ ADD_ADJUST(ret, line, ISEQ_COMPILE_DATA(iseq)->start_label);
+ ADD_INSNL(ret, line, jump, ISEQ_COMPILE_DATA(iseq)->start_label);
ADD_ADJUST_RESTORE(ret, splabel);
- if (!popped) {
+ if (!poped) {
ADD_INSN(ret, line, putnil);
}
}
else {
- ADD_INSN1(ret, line, throw, INT2FIX(TAG_RETURN));
- if (popped) {
- ADD_INSN(ret, line, pop);
- }
- }
- }
- return COMPILE_OK;
-}
+ const rb_iseq_t *ip = iseq;
+ const unsigned long level = VM_THROW_NO_ESCAPE_FLAG;
-static int
-compile_evstr(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *const node, int popped)
-{
- CHECK(COMPILE_(ret, "nd_body", node, popped));
-
- if (!popped && !all_string_result_p(node)) {
- const int line = nd_line(node);
- const unsigned int flag = VM_CALL_FCALL;
- LABEL *isstr = NEW_LABEL(line);
- ADD_INSN(ret, line, dup);
- ADD_INSN1(ret, line, checktype, INT2FIX(T_STRING));
- ADD_INSNL(ret, line, branchif, isstr);
- ADD_INSN(ret, line, dup);
- ADD_SEND_R(ret, line, idTo_s, INT2FIX(0), NULL, INT2FIX(flag), NULL);
- ADD_INSN(ret, line, tostring);
- ADD_LABEL(ret, isstr);
- }
- return COMPILE_OK;
-}
-
-static int iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, int popped);
-/**
- compile each node
+ while (ip) {
+ if (!ISEQ_COMPILE_DATA(ip)) {
+ ip = 0;
+ break;
+ }
- self: InstructionSequence
- node: Ruby compiled node
- popped: This node will be popped
- */
-static int
-iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, const NODE *node, int popped)
-{
- if (node == 0) {
- if (!popped) {
- int lineno = ISEQ_COMPILE_DATA(iseq)->last_line;
- if (lineno == 0) lineno = FIX2INT(rb_iseq_first_lineno(iseq));
- debugs("node: NODE_NIL(implicit)\n");
- ADD_INSN(ret, lineno, putnil);
- }
- return COMPILE_OK;
- }
- return iseq_compile_each0(iseq, ret, node, popped);
-}
+ if (ISEQ_COMPILE_DATA(ip)->redo_label != 0) {
+ break;
+ }
+ else if (ip->body->type == ISEQ_TYPE_BLOCK) {
+ break;
+ }
+ else if (ip->body->type == ISEQ_TYPE_EVAL) {
+ goto redo_in_eval;
+ }
-static int
-iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, int popped)
-{
- const int line = (int)nd_line(node);
- const enum node_type type = nd_type(node);
- struct rb_iseq_constant_body *const body = iseq->body;
+ ip = ip->body->parent_iseq;
+ }
+ if (ip != 0) {
+ ADD_INSN(ret, line, putnil);
+ ADD_INSN1(ret, line, throw, INT2FIX(level | TAG_REDO));
- if (ISEQ_COMPILE_DATA(iseq)->last_line == line) {
- /* ignore */
- }
- else {
- if (node->flags & NODE_FL_NEWLINE) {
- int event = RUBY_EVENT_LINE;
- ISEQ_COMPILE_DATA(iseq)->last_line = line;
- if (ISEQ_COVERAGE(iseq) && ISEQ_LINE_COVERAGE(iseq)) {
- event |= RUBY_EVENT_COVERAGE_LINE;
+ if (poped) {
+ ADD_INSN(ret, line, pop);
+ }
+ }
+ else {
+ COMPILE_ERROR(ERROR_ARGS "Invalid redo");
}
- ADD_TRACE(ret, event);
}
- }
-
- debug_node_start(node);
-#undef BEFORE_RETURN
-#define BEFORE_RETURN debug_node_end()
+ break;
+ }
+ case NODE_RETRY:{
+ if (iseq->body->type == ISEQ_TYPE_RESCUE) {
+ ADD_INSN(ret, line, putnil);
+ ADD_INSN1(ret, line, throw, INT2FIX(TAG_RETRY));
- switch (type) {
- case NODE_BLOCK:{
- while (node && nd_type(node) == NODE_BLOCK) {
- CHECK(COMPILE_(ret, "BLOCK body", node->nd_head,
- (node->nd_next ? 1 : popped)));
- node = node->nd_next;
+ if (poped) {
+ ADD_INSN(ret, line, pop);
+ }
}
- if (node) {
- CHECK(COMPILE_(ret, "BLOCK next", node->nd_next, popped));
+ else {
+ COMPILE_ERROR(ERROR_ARGS "Invalid retry");
}
break;
}
- case NODE_IF:
- case NODE_UNLESS:
- CHECK(compile_if(iseq, ret, node, popped, type));
- break;
- case NODE_CASE:
- CHECK(compile_case(iseq, ret, node, popped));
- break;
- case NODE_CASE2:
- CHECK(compile_case2(iseq, ret, node, popped));
- break;
- case NODE_WHILE:
- case NODE_UNTIL:
- CHECK(compile_loop(iseq, ret, node, popped, type));
- break;
- case NODE_FOR:
- case NODE_ITER:
- CHECK(compile_iter(iseq, ret, node, popped));
- break;
- case NODE_FOR_MASGN:
- CHECK(compile_for_masgn(iseq, ret, node, popped));
- break;
- case NODE_BREAK:
- CHECK(compile_break(iseq, ret, node, popped));
- break;
- case NODE_NEXT:
- CHECK(compile_next(iseq, ret, node, popped));
- break;
- case NODE_REDO:
- CHECK(compile_redo(iseq, ret, node, popped));
- break;
- case NODE_RETRY:
- CHECK(compile_retry(iseq, ret, node, popped));
- break;
case NODE_BEGIN:{
- CHECK(COMPILE_(ret, "NODE_BEGIN", node->nd_body, popped));
+ COMPILE_(ret, "NODE_BEGIN", node->nd_body, poped);
break;
}
- case NODE_RESCUE:
- CHECK(compile_rescue(iseq, ret, node, popped));
+ case NODE_RESCUE:{
+ LABEL *lstart = NEW_LABEL(line);
+ LABEL *lend = NEW_LABEL(line);
+ LABEL *lcont = NEW_LABEL(line);
+ const rb_iseq_t *rescue = NEW_CHILD_ISEQ(node->nd_resq,
+ rb_str_concat(rb_str_new2("rescue in "), iseq->body->location.label),
+ ISEQ_TYPE_RESCUE, line);
+
+ ADD_LABEL(ret, lstart);
+ COMPILE(ret, "rescue head", node->nd_head);
+ ADD_LABEL(ret, lend);
+ if (node->nd_else) {
+ ADD_INSN(ret, line, pop);
+ COMPILE(ret, "rescue else", node->nd_else);
+ }
+ ADD_INSN(ret, line, nop);
+ ADD_LABEL(ret, lcont);
+
+ if (poped) {
+ ADD_INSN(ret, line, pop);
+ }
+
+ /* register catch entry */
+ ADD_CATCH_ENTRY(CATCH_TYPE_RESCUE, lstart, lend, rescue, lcont);
+ ADD_CATCH_ENTRY(CATCH_TYPE_RETRY, lend, lcont, 0, lstart);
break;
- case NODE_RESBODY:
- CHECK(compile_resbody(iseq, ret, node, popped));
+ }
+ case NODE_RESBODY:{
+ NODE *resq = node;
+ NODE *narg;
+ LABEL *label_miss, *label_hit;
+
+ while (resq) {
+ label_miss = NEW_LABEL(line);
+ label_hit = NEW_LABEL(line);
+
+ narg = resq->nd_args;
+ if (narg) {
+ switch (nd_type(narg)) {
+ case NODE_ARRAY:
+ while (narg) {
+ ADD_INSN2(ret, line, getlocal, INT2FIX(2), INT2FIX(0));
+ COMPILE(ret, "rescue arg", narg->nd_head);
+ ADD_INSN1(ret, line, checkmatch, INT2FIX(VM_CHECKMATCH_TYPE_RESCUE));
+ ADD_INSNL(ret, line, branchif, label_hit);
+ narg = narg->nd_next;
+ }
+ break;
+ case NODE_SPLAT:
+ case NODE_ARGSCAT:
+ case NODE_ARGSPUSH:
+ ADD_INSN2(ret, line, getlocal, INT2FIX(2), INT2FIX(0));
+ COMPILE(ret, "rescue/cond splat", narg);
+ ADD_INSN1(ret, line, checkmatch, INT2FIX(VM_CHECKMATCH_TYPE_RESCUE | VM_CHECKMATCH_ARRAY));
+ ADD_INSNL(ret, line, branchif, label_hit);
+ break;
+ default:
+ UNKNOWN_NODE("NODE_RESBODY", narg);
+ }
+ }
+ else {
+ ADD_INSN2(ret, line, getlocal, INT2FIX(2), INT2FIX(0));
+ ADD_INSN1(ret, line, putobject, rb_eStandardError);
+ ADD_INSN1(ret, line, checkmatch, INT2FIX(VM_CHECKMATCH_TYPE_RESCUE));
+ ADD_INSNL(ret, line, branchif, label_hit);
+ }
+ ADD_INSNL(ret, line, jump, label_miss);
+ ADD_LABEL(ret, label_hit);
+ COMPILE(ret, "resbody body", resq->nd_body);
+ if (ISEQ_COMPILE_DATA(iseq)->option->tailcall_optimization) {
+ ADD_INSN(ret, line, nop);
+ }
+ ADD_INSN(ret, line, leave);
+ ADD_LABEL(ret, label_miss);
+ resq = resq->nd_head;
+ }
break;
- case NODE_ENSURE:
- CHECK(compile_ensure(iseq, ret, node, popped));
+ }
+ case NODE_ENSURE:{
+ DECL_ANCHOR(ensr);
+ const rb_iseq_t *ensure = NEW_CHILD_ISEQ(node->nd_ensr,
+ rb_str_concat(rb_str_new2 ("ensure in "), iseq->body->location.label),
+ ISEQ_TYPE_ENSURE, line);
+ LABEL *lstart = NEW_LABEL(line);
+ LABEL *lend = NEW_LABEL(line);
+ LABEL *lcont = NEW_LABEL(line);
+ struct ensure_range er;
+ struct iseq_compile_data_ensure_node_stack enl;
+ struct ensure_range *erange;
+
+ INIT_ANCHOR(ensr);
+ COMPILE_POPED(ensr, "ensure ensr", node->nd_ensr);
+
+ er.begin = lstart;
+ er.end = lend;
+ er.next = 0;
+ push_ensure_entry(iseq, &enl, &er, node->nd_ensr);
+
+ ADD_LABEL(ret, lstart);
+ COMPILE_(ret, "ensure head", node->nd_head, poped);
+ ADD_LABEL(ret, lend);
+ if (ensr->anchor.next == 0) {
+ ADD_INSN(ret, line, nop);
+ }
+ else {
+ ADD_SEQ(ret, ensr);
+ }
+ ADD_LABEL(ret, lcont);
+
+ erange = ISEQ_COMPILE_DATA(iseq)->ensure_node_stack->erange;
+ while (erange) {
+ ADD_CATCH_ENTRY(CATCH_TYPE_ENSURE, erange->begin, erange->end,
+ ensure, lcont);
+ erange = erange->next;
+ }
+
+ ISEQ_COMPILE_DATA(iseq)->ensure_node_stack = enl.prev;
break;
+ }
case NODE_AND:
case NODE_OR:{
LABEL *end_label = NEW_LABEL(line);
- CHECK(COMPILE(ret, "nd_1st", node->nd_1st));
- if (!popped) {
+ COMPILE(ret, "nd_1st", node->nd_1st);
+ if (!poped) {
ADD_INSN(ret, line, dup);
}
if (type == NODE_AND) {
@@ -5991,77 +4353,76 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
else {
ADD_INSNL(ret, line, branchif, end_label);
}
- if (!popped) {
+ if (!poped) {
ADD_INSN(ret, line, pop);
}
- CHECK(COMPILE_(ret, "nd_2nd", node->nd_2nd, popped));
+ COMPILE_(ret, "nd_2nd", node->nd_2nd, poped);
ADD_LABEL(ret, end_label);
break;
}
case NODE_MASGN:{
- compile_massign(iseq, ret, node, popped);
+ compile_massign(iseq, ret, node, poped);
break;
}
case NODE_LASGN:{
ID id = node->nd_vid;
- int idx = body->local_iseq->body->local_table_size - get_local_var_idx(iseq, id);
+ int idx = iseq->body->local_iseq->body->local_size - get_local_var_idx(iseq, id);
- debugs("lvar: %s idx: %d\n", rb_id2name(id), idx);
- CHECK(COMPILE(ret, "rvalue", node->nd_value));
+ debugs("lvar: %"PRIsVALUE" idx: %d\n", rb_id2str(id), idx);
+ COMPILE(ret, "rvalue", node->nd_value);
- if (!popped) {
+ if (!poped) {
ADD_INSN(ret, line, dup);
}
- ADD_SETLOCAL(ret, line, idx, get_lvar_level(iseq));
+ ADD_INSN2(ret, line, setlocal, INT2FIX(idx), INT2FIX(get_lvar_level(iseq)));
+
break;
}
case NODE_DASGN:
case NODE_DASGN_CURR:{
int idx, lv, ls;
- ID id = node->nd_vid;
- CHECK(COMPILE(ret, "dvalue", node->nd_value));
- debugi("dassn id", rb_id2str(id) ? id : '*');
+ COMPILE(ret, "dvalue", node->nd_value);
+ debugi("dassn id", rb_id2str(node->nd_vid) ? node->nd_vid : '*');
- if (!popped) {
+ if (!poped) {
ADD_INSN(ret, line, dup);
}
- idx = get_dyna_var_idx(iseq, id, &lv, &ls);
+ idx = get_dyna_var_idx(iseq, node->nd_vid, &lv, &ls);
if (idx < 0) {
- COMPILE_ERROR(ERROR_ARGS "NODE_DASGN(_CURR): unknown id (%"PRIsVALUE")",
- rb_id2str(id));
- goto ng;
+ rb_compile_bug_str(ERROR_ARGS "NODE_DASGN(_CURR): unknown id (%"PRIsVALUE")", rb_id2str(node->nd_vid));
}
- ADD_SETLOCAL(ret, line, ls - idx, lv);
+
+ ADD_INSN2(ret, line, setlocal, INT2FIX(ls - idx), INT2FIX(lv));
break;
}
case NODE_GASGN:{
- CHECK(COMPILE(ret, "lvalue", node->nd_value));
+ COMPILE(ret, "lvalue", node->nd_value);
- if (!popped) {
+ if (!poped) {
ADD_INSN(ret, line, dup);
}
ADD_INSN1(ret, line, setglobal,
((VALUE)node->nd_entry | 1));
break;
}
- case NODE_IASGN:{
- CHECK(COMPILE(ret, "lvalue", node->nd_value));
- if (!popped) {
+ case NODE_IASGN:
+ case NODE_IASGN2:{
+ COMPILE(ret, "lvalue", node->nd_value);
+ if (!poped) {
ADD_INSN(ret, line, dup);
}
ADD_INSN2(ret, line, setinstancevariable,
- ID2SYM(node->nd_vid),
- get_ivar_ic_value(iseq,node->nd_vid));
+ ID2SYM(node->nd_vid), INT2FIX(iseq->body->is_size++));
break;
}
case NODE_CDECL:{
- CHECK(COMPILE(ret, "lvalue", node->nd_value));
+ COMPILE(ret, "lvalue", node->nd_value);
- if (!popped) {
+ if (!poped) {
ADD_INSN(ret, line, dup);
}
@@ -6077,8 +4438,8 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
break;
}
case NODE_CVASGN:{
- CHECK(COMPILE(ret, "cvasgn val", node->nd_value));
- if (!popped) {
+ COMPILE(ret, "cvasgn val", node->nd_value);
+ if (!poped) {
ADD_INSN(ret, line, dup);
}
ADD_INSN1(ret, line, setclassvariable,
@@ -6116,7 +4477,7 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
* nd_mid
*/
- if (!popped) {
+ if (!poped) {
ADD_INSN(ret, line, putnil);
}
asgnflag = COMPILE_RECV(ret, "NODE_OP_ASGN1 recv", node);
@@ -6129,15 +4490,15 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
default:
INIT_ANCHOR(args);
argc = setup_args(iseq, args, node->nd_args->nd_head, &flag, NULL);
- CHECK(!NIL_P(argc));
ADD_SEQ(ret, args);
}
ADD_INSN1(ret, line, dupn, FIXNUM_INC(argc, 1 + boff));
ADD_SEND_WITH_FLAG(ret, line, idAREF, argc, INT2FIX(flag));
flag |= asgnflag;
- if (id == idOROP || id == idANDOP) {
- /* a[x] ||= y or a[x] &&= y
+ if (id == 0 || id == 1) {
+ /* 0: or, 1: and
+ a[x] ||= y
unless/if a[x]
a[x]= y
@@ -6149,16 +4510,18 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
LABEL *lfin = NEW_LABEL(line);
ADD_INSN(ret, line, dup);
- if (id == idOROP) {
+ if (id == 0) {
+ /* or */
ADD_INSNL(ret, line, branchif, label);
}
- else { /* idANDOP */
+ else {
+ /* and */
ADD_INSNL(ret, line, branchunless, label);
}
ADD_INSN(ret, line, pop);
- CHECK(COMPILE(ret, "NODE_OP_ASGN1 args->body: ", node->nd_args->nd_body));
- if (!popped) {
+ COMPILE(ret, "NODE_OP_ASGN1 args->body: ", node->nd_args->nd_body);
+ if (!poped) {
ADD_INSN1(ret, line, setn, FIXNUM_INC(argc, 2+boff));
}
if (flag & VM_CALL_ARGS_SPLAT) {
@@ -6184,16 +4547,16 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
ADD_INSN(ret, line, pop);
ADD_INSNL(ret, line, jump, lfin);
ADD_LABEL(ret, label);
- if (!popped) {
+ if (!poped) {
ADD_INSN1(ret, line, setn, FIXNUM_INC(argc, 2+boff));
}
ADD_INSN1(ret, line, adjuststack, FIXNUM_INC(argc, 2+boff));
ADD_LABEL(ret, lfin);
}
else {
- CHECK(COMPILE(ret, "NODE_OP_ASGN1 args->body: ", node->nd_args->nd_body));
+ COMPILE(ret, "NODE_OP_ASGN1 args->body: ", node->nd_args->nd_body);
ADD_SEND(ret, line, id, INT2FIX(1));
- if (!popped) {
+ if (!poped) {
ADD_INSN1(ret, line, setn, FIXNUM_INC(argc, 2+boff));
}
if (flag & VM_CALL_ARGS_SPLAT) {
@@ -6279,16 +4642,16 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
ADD_INSN(ret, line, dup);
ADD_SEND(ret, line, vid, INT2FIX(0));
- if (atype == idOROP || atype == idANDOP) {
+ if (atype == 0 || atype == 1) { /* 0: OR or 1: AND */
ADD_INSN(ret, line, dup);
- if (atype == idOROP) {
+ if (atype == 0) {
ADD_INSNL(ret, line, branchif, lcfin);
}
- else { /* idANDOP */
+ else {
ADD_INSNL(ret, line, branchunless, lcfin);
}
ADD_INSN(ret, line, pop);
- CHECK(COMPILE(ret, "NODE_OP_ASGN2 val", node->nd_value));
+ COMPILE(ret, "NODE_OP_ASGN2 val", node->nd_value);
ADD_INSN(ret, line, swap);
ADD_INSN1(ret, line, topn, INT2FIX(1));
ADD_SEND_WITH_FLAG(ret, line, aid, INT2FIX(1), INT2FIX(asgnflag));
@@ -6302,24 +4665,21 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
if (lskip) {
ADD_LABEL(ret, lskip);
}
- if (popped) {
+ if (poped) {
/* we can apply more optimize */
ADD_INSN(ret, line, pop);
}
}
else {
- CHECK(COMPILE(ret, "NODE_OP_ASGN2 val", node->nd_value));
+ COMPILE(ret, "NODE_OP_ASGN2 val", node->nd_value);
ADD_SEND(ret, line, atype, INT2FIX(1));
- if (!popped) {
+ if (!poped) {
ADD_INSN(ret, line, swap);
ADD_INSN1(ret, line, topn, INT2FIX(1));
}
ADD_SEND_WITH_FLAG(ret, line, aid, INT2FIX(1), INT2FIX(asgnflag));
- if (lskip && popped) {
- ADD_LABEL(ret, lskip);
- }
ADD_INSN(ret, line, pop);
- if (lskip && !popped) {
+ if (lskip) {
ADD_LABEL(ret, lskip);
}
}
@@ -6335,16 +4695,17 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
ADD_INSN1(ret, line, putobject, rb_cObject);
break;
case NODE_COLON2:
- CHECK(COMPILE(ret, "NODE_OP_CDECL/colon2#nd_head", node->nd_head->nd_head));
+ COMPILE(ret, "NODE_OP_CDECL/colon2#nd_head", node->nd_head->nd_head);
break;
default:
COMPILE_ERROR(ERROR_ARGS "%s: invalid node in NODE_OP_CDECL",
ruby_node_name(nd_type(node->nd_head)));
- goto ng;
+ debug_node_end();
+ return COMPILE_NG;
}
mid = node->nd_head->nd_mid;
/* cref */
- if (node->nd_aid == idOROP) {
+ if (node->nd_aid == 0) {
lassign = NEW_LABEL(line);
ADD_INSN(ret, line, dup); /* cref cref */
ADD_INSN3(ret, line, defined, INT2FIX(DEFINED_CONST),
@@ -6354,19 +4715,19 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
ADD_INSN(ret, line, dup); /* cref cref */
ADD_INSN1(ret, line, getconstant, ID2SYM(mid)); /* cref obj */
- if (node->nd_aid == idOROP || node->nd_aid == idANDOP) {
+ if (node->nd_aid == 0 || node->nd_aid == 1) {
lfin = NEW_LABEL(line);
- if (!popped) ADD_INSN(ret, line, dup); /* cref [obj] obj */
- if (node->nd_aid == idOROP)
+ if (!poped) ADD_INSN(ret, line, dup); /* cref [obj] obj */
+ if (node->nd_aid == 0)
ADD_INSNL(ret, line, branchif, lfin);
- else /* idANDOP */
+ else
ADD_INSNL(ret, line, branchunless, lfin);
/* cref [obj] */
- if (!popped) ADD_INSN(ret, line, pop); /* cref */
+ if (!poped) ADD_INSN(ret, line, pop); /* cref */
if (lassign) ADD_LABEL(ret, lassign);
- CHECK(COMPILE(ret, "NODE_OP_CDECL#nd_value", node->nd_value));
+ COMPILE(ret, "NODE_OP_CDECL#nd_value", node->nd_value);
/* cref value */
- if (popped)
+ if (poped)
ADD_INSN1(ret, line, topn, INT2FIX(1)); /* cref value cref */
else {
ADD_INSN1(ret, line, dupn, INT2FIX(2)); /* cref value cref value */
@@ -6374,16 +4735,16 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
}
ADD_INSN1(ret, line, setconstant, ID2SYM(mid)); /* cref [value] */
ADD_LABEL(ret, lfin); /* cref [value] */
- if (!popped) ADD_INSN(ret, line, swap); /* [value] cref */
+ if (!poped) ADD_INSN(ret, line, swap); /* [value] cref */
ADD_INSN(ret, line, pop); /* [value] */
}
else {
- CHECK(COMPILE(ret, "NODE_OP_CDECL#nd_value", node->nd_value));
+ COMPILE(ret, "NODE_OP_CDECL#nd_value", node->nd_value);
/* cref obj value */
ADD_CALL(ret, line, node->nd_aid, INT2FIX(1));
/* cref value */
ADD_INSN(ret, line, swap); /* value cref */
- if (!popped) {
+ if (!poped) {
ADD_INSN1(ret, line, topn, INT2FIX(1)); /* value cref value */
ADD_INSN(ret, line, swap); /* value value cref */
}
@@ -6411,7 +4772,7 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
lassign = NEW_LABEL(line);
}
- CHECK(COMPILE(ret, "NODE_OP_ASGN_AND/OR#nd_head", node->nd_head));
+ COMPILE(ret, "NODE_OP_ASGN_AND/OR#nd_head", node->nd_head);
ADD_INSN(ret, line, dup);
if (nd_type(node) == NODE_OP_ASGN_AND) {
@@ -6423,37 +4784,27 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
ADD_INSN(ret, line, pop);
ADD_LABEL(ret, lassign);
- CHECK(COMPILE(ret, "NODE_OP_ASGN_AND/OR#nd_value", node->nd_value));
+ COMPILE(ret, "NODE_OP_ASGN_AND/OR#nd_value", node->nd_value);
ADD_LABEL(ret, lfin);
- if (popped) {
+ if (poped) {
/* we can apply more optimize */
ADD_INSN(ret, line, pop);
}
break;
}
case NODE_CALL:
- case NODE_OPCALL:
/* optimization shortcut
* "literal".freeze -> opt_str_freeze("literal")
*/
if (node->nd_recv && nd_type(node->nd_recv) == NODE_STR &&
- (node->nd_mid == idFreeze || node->nd_mid == idUMinus) &&
- node->nd_args == NULL &&
+ node->nd_mid == idFreeze && node->nd_args == NULL &&
ISEQ_COMPILE_DATA(iseq)->current_block == NULL &&
ISEQ_COMPILE_DATA(iseq)->option->specialized_instruction) {
- VALUE str = freeze_literal(iseq, node->nd_recv->nd_lit);
- if (node->nd_mid == idUMinus) {
- ADD_INSN3(ret, line, opt_str_uminus, str,
- new_callinfo(iseq, idUMinus, 0, 0, NULL, FALSE),
- Qundef /* CALL_CACHE */);
- }
- else {
- ADD_INSN3(ret, line, opt_str_freeze, str,
- new_callinfo(iseq, idFreeze, 0, 0, NULL, FALSE),
- Qundef /* CALL_CACHE */);
- }
- if (popped) {
+ VALUE str = rb_fstring(node->nd_recv->nd_lit);
+ iseq_add_mark_object(iseq, str);
+ ADD_INSN1(ret, line, opt_str_freeze, str);
+ if (poped) {
ADD_INSN(ret, line, pop);
}
break;
@@ -6465,14 +4816,14 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
nd_type(node->nd_args) == NODE_ARRAY && node->nd_args->nd_alen == 1 &&
nd_type(node->nd_args->nd_head) == NODE_STR &&
ISEQ_COMPILE_DATA(iseq)->current_block == NULL &&
- !ISEQ_COMPILE_DATA(iseq)->option->frozen_string_literal &&
ISEQ_COMPILE_DATA(iseq)->option->specialized_instruction) {
- VALUE str = freeze_literal(iseq, node->nd_args->nd_head->nd_lit);
- CHECK(COMPILE(ret, "recv", node->nd_recv));
- ADD_INSN3(ret, line, opt_aref_with, str,
+ VALUE str = rb_fstring(node->nd_args->nd_head->nd_lit);
+ node->nd_args->nd_head->nd_lit = str;
+ COMPILE(ret, "recv", node->nd_recv);
+ ADD_INSN3(ret, line, opt_aref_with,
new_callinfo(iseq, idAREF, 1, 0, NULL, FALSE),
- NULL/* CALL_CACHE */);
- if (popped) {
+ NULL/* CALL_CACHE */, str);
+ if (poped) {
ADD_INSN(ret, line, pop);
}
break;
@@ -6487,9 +4838,7 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
*/
DECL_ANCHOR(recv);
DECL_ANCHOR(args);
- LABEL *else_label = 0;
- LABEL *end_label = 0;
- VALUE branches = 0;
+ LABEL *lskip = 0;
ID mid = node->nd_mid;
VALUE argc;
unsigned int flag = 0;
@@ -6501,17 +4850,17 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
INIT_ANCHOR(args);
#if SUPPORT_JOKE
if (nd_type(node) == NODE_VCALL) {
- ID id_bitblt;
+ ID id_bitblt;
ID id_answer;
- CONST_ID(id_bitblt, "bitblt");
+ CONST_ID(id_bitblt, "bitblt");
CONST_ID(id_answer, "the_answer_to_life_the_universe_and_everything");
- if (mid == id_bitblt) {
- ADD_INSN(ret, line, bitblt);
- break;
- }
- else if (mid == id_answer) {
+ if (mid == id_bitblt) {
+ ADD_INSN(ret, line, bitblt);
+ break;
+ }
+ else if (mid == id_answer) {
ADD_INSN(ret, line, answer);
break;
}
@@ -6529,7 +4878,7 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
LABEL *label;
st_data_t data;
st_table *labels_table = ISEQ_COMPILE_DATA(iseq)->labels_table;
- VALUE label_name;
+ ID label_name;
if (!labels_table) {
labels_table = st_init_numtable();
@@ -6538,7 +4887,7 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
if (nd_type(node->nd_args->nd_head) == NODE_LIT &&
SYMBOL_P(node->nd_args->nd_head->nd_lit)) {
- label_name = node->nd_args->nd_head->nd_lit;
+ label_name = SYM2ID(node->nd_args->nd_head->nd_lit);
if (!st_lookup(labels_table, (st_data_t)label_name, &data)) {
label = NEW_LABEL(line);
label->position = line;
@@ -6550,7 +4899,6 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
}
else {
COMPILE_ERROR(ERROR_ARGS "invalid goto/label format");
- goto ng;
}
@@ -6565,26 +4913,12 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
}
#endif
/* receiver */
- if (type == NODE_CALL || type == NODE_OPCALL || type == NODE_QCALL) {
- int idx, level;
-
- if (mid == idCall &&
- nd_type(node->nd_recv) == NODE_LVAR &&
- iseq_block_param_id_p(iseq, node->nd_recv->nd_vid, &idx, &level)) {
- ADD_INSN2(recv, nd_line(node->nd_recv), getblockparamproxy, INT2FIX(idx + VM_ENV_DATA_SIZE - 1), INT2FIX(level));
- }
- else {
- CHECK(COMPILE(recv, "recv", node->nd_recv));
- }
-
+ if (type == NODE_CALL || type == NODE_QCALL) {
+ COMPILE(recv, "recv", node->nd_recv);
if (type == NODE_QCALL) {
- else_label = NEW_LABEL(line);
- end_label = NEW_LABEL(line);
-
- DECL_BRANCH_BASE(branches, nd_first_lineno(node), nd_first_column(node), nd_last_lineno(node), nd_last_column(node), "&.");
+ lskip = NEW_LABEL(line);
ADD_INSN(recv, line, dup);
- ADD_INSNL(recv, line, branchnil, else_label);
- ADD_TRACE_BRANCH_COVERAGE(recv, nd_first_lineno(node), nd_first_column(node), nd_last_lineno(node), nd_last_column(node), "then", branches);
+ ADD_INSNL(recv, line, branchnil, lskip);
}
}
else if (type == NODE_FCALL || type == NODE_VCALL) {
@@ -6592,9 +4926,8 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
}
/* args */
- if (type != NODE_VCALL) {
+ if (nd_type(node) != NODE_VCALL) {
argc = setup_args(iseq, args, node->nd_args, &flag, &keywords);
- CHECK(!NIL_P(argc));
}
else {
argc = INT2FIX(0);
@@ -6606,7 +4939,7 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
debugp_param("call args argc", argc);
debugp_param("call method", ID2SYM(mid));
- switch ((int)type) {
+ switch (nd_type(node)) {
case NODE_VCALL:
flag |= VM_CALL_VCALL;
/* VCALL is funcall, so fall through */
@@ -6616,13 +4949,10 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
ADD_SEND_R(ret, line, mid, argc, parent_block, INT2FIX(flag), keywords);
- if (else_label && end_label) {
- ADD_INSNL(ret, line, jump, end_label);
- ADD_LABEL(ret, else_label);
- ADD_TRACE_BRANCH_COVERAGE(ret, nd_first_lineno(node), nd_first_column(node), nd_last_lineno(node), nd_last_column(node), "else", branches);
- ADD_LABEL(ret, end_label);
+ if (lskip) {
+ ADD_LABEL(ret, lskip);
}
- if (popped) {
+ if (poped) {
ADD_INSN(ret, line, pop);
}
break;
@@ -6637,57 +4967,51 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
INIT_ANCHOR(args);
ISEQ_COMPILE_DATA(iseq)->current_block = NULL;
- if (type == NODE_SUPER) {
+ if (nd_type(node) == NODE_SUPER) {
VALUE vargc = setup_args(iseq, args, node->nd_args, &flag, &keywords);
- CHECK(!NIL_P(vargc));
argc = FIX2INT(vargc);
}
else {
/* NODE_ZSUPER */
int i;
- const rb_iseq_t *liseq = body->local_iseq;
- const struct rb_iseq_constant_body *const local_body = liseq->body;
- const struct rb_iseq_param_keyword *const local_kwd = local_body->param.keyword;
+ const rb_iseq_t *liseq = iseq->body->local_iseq;
int lvar_level = get_lvar_level(iseq);
- argc = local_body->param.lead_num;
+ argc = liseq->body->param.lead_num;
/* normal arguments */
- for (i = 0; i < local_body->param.lead_num; i++) {
- int idx = local_body->local_table_size - i;
- ADD_GETLOCAL(args, line, idx, lvar_level);
+ for (i = 0; i < liseq->body->param.lead_num; i++) {
+ int idx = liseq->body->local_size - i;
+ ADD_INSN2(args, line, getlocal, INT2FIX(idx), INT2FIX(lvar_level));
}
- if (local_body->param.flags.has_opt) {
+ if (liseq->body->param.flags.has_opt) {
/* optional arguments */
int j;
- for (j = 0; j < local_body->param.opt_num; j++) {
- int idx = local_body->local_table_size - (i + j);
- ADD_GETLOCAL(args, line, idx, lvar_level);
+ for (j = 0; j < liseq->body->param.opt_num; j++) {
+ int idx = liseq->body->local_size - (i + j);
+ ADD_INSN2(args, line, getlocal, INT2FIX(idx), INT2FIX(lvar_level));
}
i += j;
argc = i;
}
- if (local_body->param.flags.has_rest) {
+ if (liseq->body->param.flags.has_rest) {
/* rest argument */
- int idx = local_body->local_table_size - local_body->param.rest_start;
-
- ADD_GETLOCAL(args, line, idx, lvar_level);
- ADD_INSN1(args, line, splatarray, Qfalse);
-
- argc = local_body->param.rest_start + 1;
+ int idx = liseq->body->local_size - liseq->body->param.rest_start;
+ ADD_INSN2(args, line, getlocal, INT2FIX(idx), INT2FIX(lvar_level));
+ argc = liseq->body->param.rest_start + 1;
flag |= VM_CALL_ARGS_SPLAT;
}
- if (local_body->param.flags.has_post) {
+ if (liseq->body->param.flags.has_post) {
/* post arguments */
- int post_len = local_body->param.post_num;
- int post_start = local_body->param.post_start;
+ int post_len = liseq->body->param.post_num;
+ int post_start = liseq->body->param.post_start;
- if (local_body->param.flags.has_rest) {
+ if (liseq->body->param.flags.has_rest) {
int j;
for (j=0; j<post_len; j++) {
- int idx = local_body->local_table_size - (post_start + j);
- ADD_GETLOCAL(args, line, idx, lvar_level);
+ int idx = liseq->body->local_size - (post_start + j);
+ ADD_INSN2(args, line, getlocal, INT2FIX(idx), INT2FIX(lvar_level));
}
ADD_INSN1(args, line, newarray, INT2FIX(j));
ADD_INSN (args, line, concatarray);
@@ -6696,46 +5020,43 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
else {
int j;
for (j=0; j<post_len; j++) {
- int idx = local_body->local_table_size - (post_start + j);
- ADD_GETLOCAL(args, line, idx, lvar_level);
+ int idx = liseq->body->local_size - (post_start + j);
+ ADD_INSN2(args, line, getlocal, INT2FIX(idx), INT2FIX(lvar_level));
}
argc = post_len + post_start;
}
}
- if (local_body->param.flags.has_kw) { /* TODO: support keywords */
- int local_size = local_body->local_table_size;
+ if (liseq->body->param.flags.has_kw) { /* TODO: support keywords */
+ int local_size = liseq->body->local_size;
argc++;
ADD_INSN1(args, line, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE));
- if (local_body->param.flags.has_kwrest) {
- int idx = local_body->local_table_size - local_kwd->rest_start;
- ADD_GETLOCAL(args, line, idx, lvar_level);
+ if (liseq->body->param.flags.has_kwrest) {
+ ADD_INSN2(args, line, getlocal, INT2FIX(liseq->body->local_size - liseq->body->param.keyword->rest_start), INT2FIX(lvar_level));
ADD_SEND (args, line, rb_intern("dup"), INT2FIX(0));
}
else {
ADD_INSN1(args, line, newhash, INT2FIX(0));
}
- for (i = 0; i < local_kwd->num; ++i) {
- ID id = local_kwd->table[i];
+ for (i = 0; i < liseq->body->param.keyword->num; ++i) {
+ ID id = liseq->body->param.keyword->table[i];
int idx = local_size - get_local_var_idx(liseq, id);
ADD_INSN1(args, line, putobject, ID2SYM(id));
- ADD_GETLOCAL(args, line, idx, lvar_level);
+ ADD_INSN2(args, line, getlocal, INT2FIX(idx), INT2FIX(lvar_level));
}
ADD_SEND(args, line, id_core_hash_merge_ptr, INT2FIX(i * 2 + 1));
- if (local_body->param.flags.has_rest) {
+ if (liseq->body->param.flags.has_rest) {
ADD_INSN1(args, line, newarray, INT2FIX(1));
ADD_INSN (args, line, concatarray);
--argc;
}
}
- else if (local_body->param.flags.has_kwrest) {
- int idx = local_body->local_table_size - local_kwd->rest_start;
- ADD_GETLOCAL(args, line, idx, lvar_level);
-
+ else if (liseq->body->param.flags.has_kwrest) {
+ ADD_INSN2(args, line, getlocal, INT2FIX(liseq->body->local_size - liseq->body->param.keyword->rest_start), INT2FIX(lvar_level));
ADD_SEND (args, line, rb_intern("dup"), INT2FIX(0));
- if (local_body->param.flags.has_rest) {
+ if (liseq->body->param.flags.has_rest) {
ADD_INSN1(args, line, newarray, INT2FIX(1));
ADD_INSN (args, line, concatarray);
}
@@ -6745,66 +5066,104 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
}
}
- ADD_INSN(ret, line, putself);
+ /* dummy receiver */
+ ADD_INSN1(ret, line, putobject, nd_type(node) == NODE_ZSUPER ? Qfalse : Qtrue);
ADD_SEQ(ret, args);
ADD_INSN3(ret, line, invokesuper,
- new_callinfo(iseq, 0, argc, flag | VM_CALL_SUPER | (type == NODE_ZSUPER ? VM_CALL_ZSUPER : 0) | VM_CALL_FCALL, keywords, parent_block != NULL),
+ new_callinfo(iseq, 0, argc, flag | VM_CALL_SUPER | VM_CALL_FCALL, keywords, parent_block != NULL),
Qnil, /* CALL_CACHE */
parent_block);
- if (popped) {
+ if (poped) {
ADD_INSN(ret, line, pop);
}
break;
}
case NODE_ARRAY:{
- CHECK(compile_array(iseq, ret, node, COMPILE_ARRAY_TYPE_ARRAY, NULL, NULL, popped) >= 0);
+ compile_array_(iseq, ret, node, COMPILE_ARRAY_TYPE_ARRAY, NULL, poped);
break;
}
case NODE_ZARRAY:{
- if (!popped) {
+ if (!poped) {
ADD_INSN1(ret, line, newarray, INT2FIX(0));
}
break;
}
case NODE_VALUES:{
- const NODE *n = node;
- if (popped) {
- COMPILE_ERROR(ERROR_ARGS "NODE_VALUES: must not be popped");
- }
+ NODE *n = node;
while (n) {
- CHECK(COMPILE(ret, "values item", n->nd_head));
+ COMPILE(ret, "values item", n->nd_head);
n = n->nd_next;
}
ADD_INSN1(ret, line, newarray, INT2FIX(node->nd_alen));
+ if (poped) {
+ ADD_INSN(ret, line, pop);
+ }
break;
}
case NODE_HASH:{
DECL_ANCHOR(list);
- enum node_type type = node->nd_head ? nd_type(node->nd_head) : NODE_ZARRAY;
+ int type = node->nd_head ? nd_type(node->nd_head) : NODE_ZARRAY;
INIT_ANCHOR(list);
switch (type) {
case NODE_ARRAY:
- CHECK(compile_array(iseq, list, node->nd_head, COMPILE_ARRAY_TYPE_HASH, NULL, NULL, popped) >= 0);
+ compile_array(iseq, list, node->nd_head, COMPILE_ARRAY_TYPE_HASH);
ADD_SEQ(ret, list);
break;
case NODE_ZARRAY:
- if (popped) break;
ADD_INSN1(ret, line, newhash, INT2FIX(0));
break;
default:
- COMPILE_ERROR(ERROR_ARGS_AT(node->nd_head) "can't make hash with this node: %s",
- ruby_node_name(type));
- goto ng;
+ rb_compile_bug_str(ERROR_ARGS_AT(node->nd_head) "can't make hash with this node: %s",
+ ruby_node_name(type));
+ }
+
+ if (poped) {
+ ADD_INSN(ret, line, pop);
}
break;
}
- case NODE_RETURN:
- CHECK(compile_return(iseq, ret, node, popped));
+ case NODE_RETURN:{
+ rb_iseq_t *is = iseq;
+
+ if (is) {
+ if (is->body->type == ISEQ_TYPE_TOP) {
+ COMPILE_ERROR(ERROR_ARGS "Invalid return");
+ }
+ else {
+ LABEL *splabel = 0;
+
+ if (is->body->type == ISEQ_TYPE_METHOD) {
+ splabel = NEW_LABEL(0);
+ ADD_LABEL(ret, splabel);
+ ADD_ADJUST(ret, line, 0);
+ }
+
+ COMPILE(ret, "return nd_stts (return val)", node->nd_stts);
+
+ if (is->body->type == ISEQ_TYPE_METHOD) {
+ add_ensure_iseq(ret, iseq, 1);
+ ADD_TRACE(ret, line, RUBY_EVENT_RETURN);
+ ADD_INSN(ret, line, leave);
+ ADD_ADJUST_RESTORE(ret, splabel);
+
+ if (!poped) {
+ ADD_INSN(ret, line, putnil);
+ }
+ }
+ else {
+ ADD_INSN1(ret, line, throw, INT2FIX(TAG_RETURN));
+ if (poped) {
+ ADD_INSN(ret, line, pop);
+ }
+ }
+ }
+ }
break;
+ }
case NODE_YIELD:{
DECL_ANCHOR(args);
VALUE argc;
@@ -6812,15 +5171,14 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
struct rb_call_info_kw_arg *keywords = NULL;
INIT_ANCHOR(args);
- if (body->type == ISEQ_TYPE_TOP ||
- body->type == ISEQ_TYPE_MAIN) {
+ if (iseq->body->type == ISEQ_TYPE_TOP) {
COMPILE_ERROR(ERROR_ARGS "Invalid yield");
- goto ng;
+ debug_node_end();
+ return COMPILE_NG;
}
if (node->nd_head) {
argc = setup_args(iseq, args, node->nd_head, &flag, &keywords);
- CHECK(!NIL_P(argc));
}
else {
argc = INT2FIX(0);
@@ -6829,49 +5187,46 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
ADD_SEQ(ret, args);
ADD_INSN1(ret, line, invokeblock, new_callinfo(iseq, 0, FIX2INT(argc), flag, keywords, FALSE));
- if (popped) {
+ if (poped) {
ADD_INSN(ret, line, pop);
}
break;
}
case NODE_LVAR:{
- if (!popped) {
+ if (!poped) {
ID id = node->nd_vid;
- int idx = body->local_iseq->body->local_table_size - get_local_var_idx(iseq, id);
+ int idx = iseq->body->local_iseq->body->local_size - get_local_var_idx(iseq, id);
- debugs("id: %s idx: %d\n", rb_id2name(id), idx);
- ADD_GETLOCAL(ret, line, idx, get_lvar_level(iseq));
+ debugs("id: %"PRIsVALUE" idx: %d\n", rb_id2str(id), idx);
+ ADD_INSN2(ret, line, getlocal, INT2FIX(idx), INT2FIX(get_lvar_level(iseq)));
}
break;
}
case NODE_DVAR:{
int lv, idx, ls;
debugi("nd_vid", node->nd_vid);
- if (!popped) {
+ if (!poped) {
idx = get_dyna_var_idx(iseq, node->nd_vid, &lv, &ls);
if (idx < 0) {
- COMPILE_ERROR(ERROR_ARGS "unknown dvar (%"PRIsVALUE")",
- rb_id2str(node->nd_vid));
- goto ng;
+ rb_compile_bug_str(ERROR_ARGS "unknown dvar (%"PRIsVALUE")", rb_id2str(node->nd_vid));
}
- ADD_GETLOCAL(ret, line, ls - idx, lv);
+ ADD_INSN2(ret, line, getlocal, INT2FIX(ls - idx), INT2FIX(lv));
}
break;
}
case NODE_GVAR:{
ADD_INSN1(ret, line, getglobal,
((VALUE)node->nd_entry | 1));
- if (popped) {
+ if (poped) {
ADD_INSN(ret, line, pop);
}
break;
}
case NODE_IVAR:{
debugi("nd_vid", node->nd_vid);
- if (!popped) {
+ if (!poped) {
ADD_INSN2(ret, line, getinstancevariable,
- ID2SYM(node->nd_vid),
- get_ivar_ic_value(iseq,node->nd_vid));
+ ID2SYM(node->nd_vid), INT2FIX(iseq->body->is_size++));
}
break;
}
@@ -6880,11 +5235,11 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
if (ISEQ_COMPILE_DATA(iseq)->option->inline_const_cache) {
LABEL *lend = NEW_LABEL(line);
- int ic_index = body->is_size++;
+ int ic_index = iseq->body->is_size++;
- ADD_INSN2(ret, line, opt_getinlinecache, lend, INT2FIX(ic_index));
+ ADD_INSN2(ret, line, getinlinecache, lend, INT2FIX(ic_index));
ADD_INSN1(ret, line, getconstant, ID2SYM(node->nd_vid));
- ADD_INSN1(ret, line, opt_setinlinecache, INT2FIX(ic_index));
+ ADD_INSN1(ret, line, setinlinecache, INT2FIX(ic_index));
ADD_LABEL(ret, lend);
}
else {
@@ -6892,20 +5247,20 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
ADD_INSN1(ret, line, getconstant, ID2SYM(node->nd_vid));
}
- if (popped) {
+ if (poped) {
ADD_INSN(ret, line, pop);
}
break;
}
case NODE_CVAR:{
- if (!popped) {
+ if (!poped) {
ADD_INSN1(ret, line, getclassvariable,
ID2SYM(node->nd_vid));
}
break;
}
case NODE_NTH_REF:{
- if (!popped) {
+ if (!poped) {
if (!node->nd_nth) {
ADD_INSN(ret, line, putnil);
break;
@@ -6916,7 +5271,7 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
break;
}
case NODE_BACK_REF:{
- if (!popped) {
+ if (!poped) {
ADD_INSN2(ret, line, getspecial, INT2FIX(1) /* '~' */,
INT2FIX(0x01 | (node->nd_nth << 1)));
}
@@ -6937,12 +5292,12 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
INT2FIX(0));
break;
case NODE_MATCH2:
- CHECK(COMPILE(recv, "receiver", node->nd_recv));
- CHECK(COMPILE(val, "value", node->nd_value));
+ COMPILE(recv, "receiver", node->nd_recv);
+ COMPILE(val, "value", node->nd_value);
break;
case NODE_MATCH3:
- CHECK(COMPILE(recv, "receiver", node->nd_value));
- CHECK(COMPILE(val, "value", node->nd_recv));
+ COMPILE(recv, "receiver", node->nd_value);
+ COMPILE(val, "value", node->nd_recv);
break;
}
@@ -6967,42 +5322,36 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
ADD_SEND(ret, line, idEqTilde, INT2FIX(1));
}
- if (node->nd_args) {
- compile_named_capture_assign(iseq, ret, node->nd_args);
- }
-
- if (popped) {
+ if (poped) {
ADD_INSN(ret, line, pop);
}
break;
}
case NODE_LIT:{
debugp_param("lit", node->nd_lit);
- if (!popped) {
+ if (!poped) {
ADD_INSN1(ret, line, putobject, node->nd_lit);
}
break;
}
case NODE_STR:{
debugp_param("nd_lit", node->nd_lit);
- if (!popped) {
- VALUE lit = node->nd_lit;
+ if (!poped) {
+ node->nd_lit = rb_fstring(node->nd_lit);
if (!ISEQ_COMPILE_DATA(iseq)->option->frozen_string_literal) {
- lit = freeze_literal(iseq, lit);
- ADD_INSN1(ret, line, putstring, lit);
+ ADD_INSN1(ret, line, putstring, node->nd_lit);
}
else {
if (ISEQ_COMPILE_DATA(iseq)->option->debug_frozen_string_literal || RTEST(ruby_debug)) {
- VALUE debug_info = rb_ary_new_from_args(2, rb_iseq_path(iseq), INT2FIX(line));
- lit = rb_str_dup(lit);
- rb_ivar_set(lit, id_debug_created_info, rb_obj_freeze(debug_info));
- lit = rb_str_freeze(lit);
+ VALUE debug_info = rb_ary_new_from_args(2, iseq->body->location.path, INT2FIX(line));
+ VALUE str = rb_str_dup(node->nd_lit);
+ rb_ivar_set(str, id_debug_created_info, rb_obj_freeze(debug_info));
+ ADD_INSN1(ret, line, putobject, rb_obj_freeze(str));
+ iseq_add_mark_object_compile_time(iseq, str);
}
else {
- lit = rb_fstring(lit);
+ ADD_INSN1(ret, line, putobject, node->nd_lit);
}
- ADD_INSN1(ret, line, putobject, lit);
- iseq_add_mark_object_compile_time(iseq, lit);
}
}
break;
@@ -7010,14 +5359,14 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
case NODE_DSTR:{
compile_dstr(iseq, ret, node);
- if (popped) {
+ if (poped) {
ADD_INSN(ret, line, pop);
}
else {
if (ISEQ_COMPILE_DATA(iseq)->option->frozen_string_literal) {
VALUE debug_info = Qnil;
if (ISEQ_COMPILE_DATA(iseq)->option->debug_frozen_string_literal || RTEST(ruby_debug)) {
- debug_info = rb_ary_new_from_args(2, rb_iseq_path(iseq), INT2FIX(line));
+ debug_info = rb_ary_new_from_args(2, iseq->body->location.path, INT2FIX(line));
iseq_add_mark_object_compile_time(iseq, rb_obj_freeze(debug_info));
}
ADD_INSN1(ret, line, freezestring, debug_info);
@@ -7026,11 +5375,12 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
break;
}
case NODE_XSTR:{
+ node->nd_lit = rb_fstring(node->nd_lit);
ADD_CALL_RECEIVER(ret, line);
- ADD_INSN1(ret, line, putobject, freeze_literal(iseq, node->nd_lit));
+ ADD_INSN1(ret, line, putobject, node->nd_lit);
ADD_CALL(ret, line, idBackquote, INT2FIX(1));
- if (popped) {
+ if (poped) {
ADD_INSN(ret, line, pop);
}
break;
@@ -7040,70 +5390,79 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
compile_dstr(iseq, ret, node);
ADD_CALL(ret, line, idBackquote, INT2FIX(1));
- if (popped) {
+ if (poped) {
ADD_INSN(ret, line, pop);
}
break;
}
- case NODE_EVSTR:
- CHECK(compile_evstr(iseq, ret, node->nd_body, popped));
+ case NODE_EVSTR:{
+ COMPILE(ret, "nd_body", node->nd_body);
+
+ if (poped) {
+ ADD_INSN(ret, line, pop);
+ }
+ else {
+ ADD_INSN(ret, line, tostring);
+ }
break;
+ }
case NODE_DREGX:{
compile_dregx(iseq, ret, node);
- if (popped) {
+ if (poped) {
ADD_INSN(ret, line, pop);
}
break;
}
- case NODE_ONCE:{
- int ic_index = body->is_size++;
- const rb_iseq_t *block_iseq;
- block_iseq = NEW_CHILD_ISEQ(node->nd_body, make_name_for_block(iseq), ISEQ_TYPE_PLAIN, line);
+ case NODE_DREGX_ONCE:{
+ int ic_index = iseq->body->is_size++;
+ NODE *dregx_node = NEW_NODE(NODE_DREGX, node->u1.value, node->u2.value, node->u3.value);
+ NODE *block_node = NEW_NODE(NODE_SCOPE, 0, dregx_node, 0);
+ const rb_iseq_t * block_iseq = NEW_CHILD_ISEQ(block_node, make_name_for_block(iseq), ISEQ_TYPE_BLOCK, line);
ADD_INSN2(ret, line, once, block_iseq, INT2FIX(ic_index));
- if (popped) {
+ if (poped) {
ADD_INSN(ret, line, pop);
}
break;
}
case NODE_ARGSCAT:{
- if (popped) {
- CHECK(COMPILE(ret, "argscat head", node->nd_head));
+ if (poped) {
+ COMPILE(ret, "argscat head", node->nd_head);
ADD_INSN1(ret, line, splatarray, Qfalse);
ADD_INSN(ret, line, pop);
- CHECK(COMPILE(ret, "argscat body", node->nd_body));
+ COMPILE(ret, "argscat body", node->nd_body);
ADD_INSN1(ret, line, splatarray, Qfalse);
ADD_INSN(ret, line, pop);
}
else {
- CHECK(COMPILE(ret, "argscat head", node->nd_head));
- CHECK(COMPILE(ret, "argscat body", node->nd_body));
+ COMPILE(ret, "argscat head", node->nd_head);
+ COMPILE(ret, "argscat body", node->nd_body);
ADD_INSN(ret, line, concatarray);
}
break;
}
case NODE_ARGSPUSH:{
- if (popped) {
- CHECK(COMPILE(ret, "arsgpush head", node->nd_head));
+ if (poped) {
+ COMPILE(ret, "arsgpush head", node->nd_head);
ADD_INSN1(ret, line, splatarray, Qfalse);
ADD_INSN(ret, line, pop);
- CHECK(COMPILE_(ret, "argspush body", node->nd_body, popped));
+ COMPILE_(ret, "argspush body", node->nd_body, poped);
}
else {
- CHECK(COMPILE(ret, "arsgpush head", node->nd_head));
- CHECK(COMPILE_(ret, "argspush body", node->nd_body, popped));
+ COMPILE(ret, "arsgpush head", node->nd_head);
+ COMPILE_(ret, "argspush body", node->nd_body, poped);
ADD_INSN1(ret, line, newarray, INT2FIX(1));
ADD_INSN(ret, line, concatarray);
}
break;
}
case NODE_SPLAT:{
- CHECK(COMPILE(ret, "splat", node->nd_head));
+ COMPILE(ret, "splat", node->nd_head);
ADD_INSN1(ret, line, splatarray, Qtrue);
- if (popped) {
+ if (poped) {
ADD_INSN(ret, line, pop);
}
break;
@@ -7120,7 +5479,7 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
ADD_INSN1(ret, line, putiseq, method_iseq);
ADD_SEND (ret, line, id_core_define_method, INT2FIX(2));
- if (popped) {
+ if (poped) {
ADD_INSN(ret, line, pop);
}
@@ -7134,12 +5493,12 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
debugp_param("defs/iseq", rb_iseqw_new(singleton_method));
ADD_INSN1(ret, line, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE));
- CHECK(COMPILE(ret, "defs: recv", node->nd_recv));
+ COMPILE(ret, "defs: recv", node->nd_recv);
ADD_INSN1(ret, line, putobject, ID2SYM(node->nd_mid));
ADD_INSN1(ret, line, putiseq, singleton_method);
ADD_SEND (ret, line, id_core_define_singleton_method, INT2FIX(3));
- if (popped) {
+ if (poped) {
ADD_INSN(ret, line, pop);
}
break;
@@ -7147,22 +5506,22 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
case NODE_ALIAS:{
ADD_INSN1(ret, line, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE));
ADD_INSN1(ret, line, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_CBASE));
- CHECK(COMPILE(ret, "alias arg1", node->nd_1st));
- CHECK(COMPILE(ret, "alias arg2", node->nd_2nd));
+ COMPILE(ret, "alias arg1", node->u1.node);
+ COMPILE(ret, "alias arg2", node->u2.node);
ADD_SEND(ret, line, id_core_set_method_alias, INT2FIX(3));
- if (popped) {
+ if (poped) {
ADD_INSN(ret, line, pop);
}
break;
}
case NODE_VALIAS:{
ADD_INSN1(ret, line, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE));
- ADD_INSN1(ret, line, putobject, ID2SYM(node->nd_alias));
- ADD_INSN1(ret, line, putobject, ID2SYM(node->nd_orig));
+ ADD_INSN1(ret, line, putobject, ID2SYM(node->u1.id));
+ ADD_INSN1(ret, line, putobject, ID2SYM(node->u2.id));
ADD_SEND(ret, line, id_core_set_variable_alias, INT2FIX(2));
- if (popped) {
+ if (poped) {
ADD_INSN(ret, line, pop);
}
break;
@@ -7170,10 +5529,10 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
case NODE_UNDEF:{
ADD_INSN1(ret, line, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE));
ADD_INSN1(ret, line, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_CBASE));
- CHECK(COMPILE(ret, "undef arg", node->nd_undef));
+ COMPILE(ret, "undef arg", node->u2.node);
ADD_SEND(ret, line, id_core_undef_method, INT2FIX(2));
- if (popped) {
+ if (poped) {
ADD_INSN(ret, line, pop);
}
break;
@@ -7182,14 +5541,15 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
const rb_iseq_t *class_iseq = NEW_CHILD_ISEQ(node->nd_body,
rb_sprintf("<class:%"PRIsVALUE">", rb_id2str(node->nd_cpath->nd_mid)),
ISEQ_TYPE_CLASS, line);
- const int flags = VM_DEFINECLASS_TYPE_CLASS |
- (node->nd_super ? VM_DEFINECLASS_FLAG_HAS_SUPERCLASS : 0) |
- compile_cpath(ret, iseq, node->nd_cpath);
+ VALUE noscope = compile_cpath(ret, iseq, node->nd_cpath);
+ int flags = VM_DEFINECLASS_TYPE_CLASS;
- CHECK(COMPILE(ret, "super", node->nd_super));
+ if (!noscope) flags |= VM_DEFINECLASS_FLAG_SCOPED;
+ if (node->nd_super) flags |= VM_DEFINECLASS_FLAG_HAS_SUPERCLASS;
+ COMPILE(ret, "super", node->nd_super);
ADD_INSN3(ret, line, defineclass, ID2SYM(node->nd_cpath->nd_mid), class_iseq, INT2FIX(flags));
- if (popped) {
+ if (poped) {
ADD_INSN(ret, line, pop);
}
break;
@@ -7198,30 +5558,31 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
const rb_iseq_t *module_iseq = NEW_CHILD_ISEQ(node->nd_body,
rb_sprintf("<module:%"PRIsVALUE">", rb_id2str(node->nd_cpath->nd_mid)),
ISEQ_TYPE_CLASS, line);
- const int flags = VM_DEFINECLASS_TYPE_MODULE |
- compile_cpath(ret, iseq, node->nd_cpath);
+ VALUE noscope = compile_cpath(ret, iseq, node->nd_cpath);
+ int flags = VM_DEFINECLASS_TYPE_MODULE;
+ if (!noscope) flags |= VM_DEFINECLASS_FLAG_SCOPED;
ADD_INSN (ret, line, putnil); /* dummy */
ADD_INSN3(ret, line, defineclass, ID2SYM(node->nd_cpath->nd_mid), module_iseq, INT2FIX(flags));
- if (popped) {
+ if (poped) {
ADD_INSN(ret, line, pop);
}
break;
}
case NODE_SCLASS:{
ID singletonclass;
- const rb_iseq_t *singleton_class = NEW_ISEQ(node->nd_body, rb_fstring_lit("singleton class"),
+ const rb_iseq_t *singleton_class = NEW_ISEQ(node->nd_body, rb_str_new2("singleton class"),
ISEQ_TYPE_CLASS, line);
- CHECK(COMPILE(ret, "sclass#recv", node->nd_recv));
+ COMPILE(ret, "sclass#recv", node->nd_recv);
ADD_INSN (ret, line, putnil);
CONST_ID(singletonclass, "singletonclass");
ADD_INSN3(ret, line, defineclass,
ID2SYM(singletonclass), singleton_class,
INT2FIX(VM_DEFINECLASS_TYPE_SINGLETON_CLASS));
- if (popped) {
+ if (poped) {
ADD_INSN(ret, line, pop);
}
break;
@@ -7230,17 +5591,17 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
if (rb_is_const_id(node->nd_mid)) {
/* constant */
LABEL *lend = NEW_LABEL(line);
- int ic_index = body->is_size++;
+ int ic_index = iseq->body->is_size++;
DECL_ANCHOR(pref);
DECL_ANCHOR(body);
INIT_ANCHOR(pref);
INIT_ANCHOR(body);
- CHECK(compile_const_prefix(iseq, node, pref, body));
- if (LIST_INSN_SIZE_ZERO(pref)) {
+ compile_colon2(iseq, node, pref, body);
+ if (LIST_SIZE_ZERO(pref)) {
if (ISEQ_COMPILE_DATA(iseq)->option->inline_const_cache) {
- ADD_INSN2(ret, line, opt_getinlinecache, lend, INT2FIX(ic_index));
+ ADD_INSN2(ret, line, getinlinecache, lend, INT2FIX(ic_index));
}
else {
ADD_INSN(ret, line, putnil);
@@ -7249,7 +5610,7 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
ADD_SEQ(ret, body);
if (ISEQ_COMPILE_DATA(iseq)->option->inline_const_cache) {
- ADD_INSN1(ret, line, opt_setinlinecache, INT2FIX(ic_index));
+ ADD_INSN1(ret, line, setinlinecache, INT2FIX(ic_index));
ADD_LABEL(ret, lend);
}
}
@@ -7261,23 +5622,23 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
else {
/* function call */
ADD_CALL_RECEIVER(ret, line);
- CHECK(COMPILE(ret, "colon2#nd_head", node->nd_head));
+ COMPILE(ret, "colon2#nd_head", node->nd_head);
ADD_CALL(ret, line, node->nd_mid, INT2FIX(1));
}
- if (popped) {
+ if (poped) {
ADD_INSN(ret, line, pop);
}
break;
}
case NODE_COLON3:{
LABEL *lend = NEW_LABEL(line);
- int ic_index = body->is_size++;
+ int ic_index = iseq->body->is_size++;
debugi("colon3#nd_mid", node->nd_mid);
/* add cache insn */
if (ISEQ_COMPILE_DATA(iseq)->option->inline_const_cache) {
- ADD_INSN2(ret, line, opt_getinlinecache, lend, INT2FIX(ic_index));
+ ADD_INSN2(ret, line, getinlinecache, lend, INT2FIX(ic_index));
ADD_INSN(ret, line, pop);
}
@@ -7285,80 +5646,98 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
ADD_INSN1(ret, line, getconstant, ID2SYM(node->nd_mid));
if (ISEQ_COMPILE_DATA(iseq)->option->inline_const_cache) {
- ADD_INSN1(ret, line, opt_setinlinecache, INT2FIX(ic_index));
+ ADD_INSN1(ret, line, setinlinecache, INT2FIX(ic_index));
ADD_LABEL(ret, lend);
}
- if (popped) {
+ if (poped) {
ADD_INSN(ret, line, pop);
}
break;
}
case NODE_DOT2:
case NODE_DOT3:{
- int excl = type == NODE_DOT3;
- VALUE flag = INT2FIX(excl);
- const NODE *b = node->nd_beg;
- const NODE *e = node->nd_end;
- if (number_literal_p(b) && number_literal_p(e)) {
- if (!popped) {
- VALUE val = rb_range_new(b->nd_lit, e->nd_lit, excl);
- iseq_add_mark_object_compile_time(iseq, val);
- ADD_INSN1(ret, line, putobject, val);
- }
+ VALUE flag = type == NODE_DOT2 ? INT2FIX(0) : INT2FIX(1);
+ COMPILE(ret, "min", (NODE *) node->nd_beg);
+ COMPILE(ret, "max", (NODE *) node->nd_end);
+ if (poped) {
+ ADD_INSN(ret, line, pop);
+ ADD_INSN(ret, line, pop);
}
else {
- CHECK(COMPILE_(ret, "min", b, popped));
- CHECK(COMPILE_(ret, "max", e, popped));
- if (!popped) {
- ADD_INSN1(ret, line, newrange, flag);
- }
+ ADD_INSN1(ret, line, newrange, flag);
}
break;
}
case NODE_FLIP2:
case NODE_FLIP3:{
LABEL *lend = NEW_LABEL(line);
+ LABEL *lfin = NEW_LABEL(line);
LABEL *ltrue = NEW_LABEL(line);
- LABEL *lfalse = NEW_LABEL(line);
- CHECK(compile_flip_flop(iseq, ret, node, type == NODE_FLIP2,
- ltrue, lfalse));
+ rb_iseq_t *local_iseq = iseq->body->local_iseq;
+ rb_num_t cnt;
+ VALUE key;
+
+ cnt = ISEQ_FLIP_CNT_INCREMENT(local_iseq) + VM_SVAR_FLIPFLOP_START;
+ key = INT2FIX(cnt);
+
+ ADD_INSN2(ret, line, getspecial, key, INT2FIX(0));
+ ADD_INSNL(ret, line, branchif, lend);
+
+ /* *flip == 0 */
+ COMPILE(ret, "flip2 beg", node->nd_beg);
+ ADD_INSN(ret, line, dup);
+ ADD_INSNL(ret, line, branchunless, lfin);
+ if (nd_type(node) == NODE_FLIP3) {
+ ADD_INSN(ret, line, dup);
+ ADD_INSN1(ret, line, setspecial, key);
+ ADD_INSNL(ret, line, jump, lfin);
+ }
+ else {
+ ADD_INSN1(ret, line, setspecial, key);
+ }
+
+ /* *flip == 1 */
+ ADD_LABEL(ret, lend);
+ COMPILE(ret, "flip2 end", node->nd_end);
+ ADD_INSNL(ret, line, branchunless, ltrue);
+ ADD_INSN1(ret, line, putobject, Qfalse);
+ ADD_INSN1(ret, line, setspecial, key);
+
ADD_LABEL(ret, ltrue);
ADD_INSN1(ret, line, putobject, Qtrue);
- ADD_INSNL(ret, line, jump, lend);
- ADD_LABEL(ret, lfalse);
- ADD_INSN1(ret, line, putobject, Qfalse);
- ADD_LABEL(ret, lend);
+
+ ADD_LABEL(ret, lfin);
break;
}
case NODE_SELF:{
- if (!popped) {
+ if (!poped) {
ADD_INSN(ret, line, putself);
}
break;
}
case NODE_NIL:{
- if (!popped) {
+ if (!poped) {
ADD_INSN(ret, line, putnil);
}
break;
}
case NODE_TRUE:{
- if (!popped) {
+ if (!poped) {
ADD_INSN1(ret, line, putobject, Qtrue);
}
break;
}
case NODE_FALSE:{
- if (!popped) {
+ if (!poped) {
ADD_INSN1(ret, line, putobject, Qfalse);
}
break;
}
case NODE_ERRINFO:{
- if (!popped) {
- if (body->type == ISEQ_TYPE_RESCUE) {
- ADD_GETLOCAL(ret, line, LVAR_ERRINFO, 0);
+ if (!poped) {
+ if (iseq->body->type == ISEQ_TYPE_RESCUE) {
+ ADD_INSN2(ret, line, getlocal, INT2FIX(2), INT2FIX(0));
}
else {
const rb_iseq_t *ip = iseq;
@@ -7371,7 +5750,7 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
level++;
}
if (ip) {
- ADD_GETLOCAL(ret, line, LVAR_ERRINFO, level);
+ ADD_INSN2(ret, line, getlocal, INT2FIX(2), INT2FIX(level));
}
else {
ADD_INSN(ret, line, putnil);
@@ -7380,23 +5759,38 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
}
break;
}
- case NODE_DEFINED:
- if (!popped) {
- CHECK(compile_defined_expr(iseq, ret, node, Qtrue));
+ case NODE_DEFINED:{
+ if (poped) break;
+ if (!node->nd_head) {
+ VALUE str = rb_iseq_defined_string(DEFINED_NIL);
+ ADD_INSN1(ret, nd_line(node), putobject, str);
+ }
+ else {
+ LABEL *lfinish[2];
+ lfinish[0] = NEW_LABEL(line);
+ lfinish[1] = 0;
+ ADD_INSN(ret, line, putnil);
+ defined_expr(iseq, ret, node->nd_head, lfinish, Qtrue);
+ ADD_INSN(ret, line, swap);
+ ADD_INSN(ret, line, pop);
+ if (lfinish[1]) {
+ ADD_LABEL(ret, lfinish[1]);
+ }
+ ADD_LABEL(ret, lfinish[0]);
}
break;
+ }
case NODE_POSTEXE:{
/* compiled to:
* ONCE{ rb_mRubyVMFrozenCore::core#set_postexe{ ... } }
*/
- int is_index = body->is_size++;
- const rb_iseq_t *once_iseq =
- new_child_iseq_ifunc(iseq, IFUNC_NEW(build_postexe_iseq, node->nd_body, 0),
- rb_fstring(make_name_for_block(iseq)), iseq, ISEQ_TYPE_BLOCK, line);
+ int is_index = iseq->body->is_size++;
+ const rb_iseq_t *once_iseq = NEW_CHILD_ISEQ((NODE *)IFUNC_NEW(build_postexe_iseq, node->nd_body, 0),
+ make_name_for_block(iseq), ISEQ_TYPE_BLOCK, line);
ADD_INSN2(ret, line, once, once_iseq, INT2FIX(is_index));
- if (popped) {
+ if (poped) {
ADD_INSN(ret, line, pop);
}
break;
@@ -7404,31 +5798,29 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
case NODE_KW_ARG:
{
LABEL *end_label = NEW_LABEL(nd_line(node));
- const NODE *default_value = node->nd_body->nd_value;
+ NODE *default_value = node->nd_body->nd_value;
- if (default_value == (const NODE *)-1) {
+ if (default_value == (NODE *)-1) {
/* required argument. do nothing */
- COMPILE_ERROR(ERROR_ARGS "unreachable");
- goto ng;
+ rb_compile_bug_str(ERROR_ARGS "unreachable");
}
else if (nd_type(default_value) == NODE_LIT ||
nd_type(default_value) == NODE_NIL ||
nd_type(default_value) == NODE_TRUE ||
nd_type(default_value) == NODE_FALSE) {
- COMPILE_ERROR(ERROR_ARGS "unreachable");
- goto ng;
+ rb_compile_bug_str(ERROR_ARGS "unreachable");
}
else {
/* if keywordcheck(_kw_bits, nth_keyword)
* kw = default_value
* end
*/
- int kw_bits_idx = body->local_table_size - body->param.keyword->bits_start;
- int keyword_idx = body->param.keyword->num;
+ int kw_bits_idx = iseq->body->local_size - iseq->body->param.keyword->bits_start;
+ int keyword_idx = iseq->body->param.keyword->num;
- ADD_INSN2(ret, line, checkkeyword, INT2FIX(kw_bits_idx + VM_ENV_DATA_SIZE - 1), INT2FIX(keyword_idx));
+ ADD_INSN2(ret, line, checkkeyword, INT2FIX(kw_bits_idx), INT2FIX(keyword_idx));
ADD_INSNL(ret, line, branchif, end_label);
- CHECK(COMPILE_POPPED(ret, "keyword default argument", node->nd_body));
+ COMPILE_POPED(ret, "keyword default argument", node->nd_body);
ADD_LABEL(ret, end_label);
}
@@ -7436,8 +5828,8 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
}
case NODE_DSYM:{
compile_dstr(iseq, ret, node);
- if (!popped) {
- ADD_INSN(ret, line, intern);
+ if (!poped) {
+ ADD_SEND(ret, line, idIntern, INT2FIX(0));
}
else {
ADD_INSN(ret, line, pop);
@@ -7449,10 +5841,8 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
DECL_ANCHOR(args);
unsigned int flag = 0;
ID mid = node->nd_mid;
- LABEL *else_label = 0;
- LABEL *end_label = 0;
+ LABEL *lskip = 0;
VALUE argc;
- VALUE branches = 0;
/* optimization shortcut
* obj["literal"] = value -> opt_aset_with(obj, "literal", value)
@@ -7461,19 +5851,20 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
nd_type(node->nd_args) == NODE_ARRAY && node->nd_args->nd_alen == 2 &&
nd_type(node->nd_args->nd_head) == NODE_STR &&
ISEQ_COMPILE_DATA(iseq)->current_block == NULL &&
- !ISEQ_COMPILE_DATA(iseq)->option->frozen_string_literal &&
ISEQ_COMPILE_DATA(iseq)->option->specialized_instruction)
{
- VALUE str = freeze_literal(iseq, node->nd_args->nd_head->nd_lit);
- CHECK(COMPILE(ret, "recv", node->nd_recv));
- CHECK(COMPILE(ret, "value", node->nd_args->nd_next->nd_head));
- if (!popped) {
+ VALUE str = rb_fstring(node->nd_args->nd_head->nd_lit);
+ node->nd_args->nd_head->nd_lit = str;
+ iseq_add_mark_object(iseq, str);
+ COMPILE(ret, "recv", node->nd_recv);
+ COMPILE(ret, "value", node->nd_args->nd_next->nd_head);
+ if (!poped) {
ADD_INSN(ret, line, swap);
ADD_INSN1(ret, line, topn, INT2FIX(1));
}
- ADD_INSN3(ret, line, opt_aset_with, str,
+ ADD_INSN3(ret, line, opt_aset_with,
new_callinfo(iseq, idASET, 2, 0, NULL, FALSE),
- NULL/* CALL_CACHE */);
+ NULL/* CALL_CACHE */, str);
ADD_INSN(ret, line, pop);
break;
}
@@ -7481,7 +5872,6 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
INIT_ANCHOR(recv);
INIT_ANCHOR(args);
argc = setup_args(iseq, args, node->nd_args, &flag, NULL);
- CHECK(!NIL_P(argc));
flag |= COMPILE_RECV(recv, "recv", node);
@@ -7492,13 +5882,10 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
/* safe nav attr */
mid = rb_id_attrset(mid);
ADD_INSN(recv, line, dup);
- else_label = NEW_LABEL(line);
- end_label = NEW_LABEL(line);
- DECL_BRANCH_BASE(branches, nd_first_lineno(node), nd_first_column(node), nd_last_lineno(node), nd_last_column(node), "&.");
- ADD_INSNL(recv, line, branchnil, else_label);
- ADD_TRACE_BRANCH_COVERAGE(recv, nd_first_lineno(node), nd_first_column(node), nd_last_lineno(node), nd_last_column(node), "then", branches);
+ lskip = NEW_LABEL(line);
+ ADD_INSNL(recv, line, branchnil, lskip);
}
- if (!popped) {
+ if (!poped) {
ADD_INSN(ret, line, putnil);
ADD_SEQ(ret, recv);
ADD_SEQ(ret, args);
@@ -7528,16 +5915,23 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
ADD_SEQ(ret, args);
}
ADD_SEND_WITH_FLAG(ret, line, mid, argc, INT2FIX(flag));
- if (else_label && end_label) {
- ADD_INSNL(ret, line, jump, end_label);
- ADD_LABEL(ret, else_label);
- ADD_TRACE_BRANCH_COVERAGE(ret, nd_first_lineno(node), nd_first_column(node), nd_last_lineno(node), nd_last_column(node), "else", branches);
- ADD_LABEL(ret, end_label);
- }
+ if (lskip) ADD_LABEL(ret, lskip);
ADD_INSN(ret, line, pop);
break;
}
+ case NODE_PRELUDE:{
+ const rb_compile_option_t *orig_opt = ISEQ_COMPILE_DATA(iseq)->option;
+ if (node->nd_orig) {
+ rb_compile_option_t new_opt = *orig_opt;
+ rb_iseq_make_compile_option(&new_opt, node->nd_orig);
+ ISEQ_COMPILE_DATA(iseq)->option = &new_opt;
+ }
+ COMPILE_POPED(ret, "prelude", node->nd_head);
+ COMPILE_(ret, "body", node->nd_body, poped);
+ ISEQ_COMPILE_DATA(iseq)->option = orig_opt;
+ break;
+ }
case NODE_LAMBDA:{
/* compile same as lambda{...} */
const rb_iseq_t *block = NEW_CHILD_ISEQ(node->nd_body, make_name_for_block(iseq), ISEQ_TYPE_BLOCK, line);
@@ -7546,18 +5940,23 @@ iseq_compile_each0(rb_iseq_t *iseq, LINK_ANCHOR *const ret, const NODE *node, in
ADD_INSN1(ret, line, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE));
ADD_CALL_WITH_BLOCK(ret, line, idLambda, argc, block);
- if (popped) {
+ if (poped) {
ADD_INSN(ret, line, pop);
}
break;
}
default:
- UNKNOWN_NODE("iseq_compile_each", node, COMPILE_NG);
- ng:
- debug_node_end();
+ UNKNOWN_NODE("iseq_compile_each", node);
return COMPILE_NG;
}
+ /* check & remove redundant trace(line) */
+ if (saved_last_element && ret /* ret can be 0 when error */ &&
+ ret->last == saved_last_element &&
+ ((INSN *)saved_last_element)->insn_id == BIN(trace)) {
+ POP_ELEMENT(ret);
+ }
+
debug_node_end();
return COMPILE_OK;
}
@@ -7613,7 +6012,7 @@ insn_data_to_s_detail(INSN *iobj)
case TS_OFFSET: /* label(destination position) */
{
LABEL *lobj = (LABEL *)OPERAND_AT(iobj, j);
- rb_str_catf(str, LABEL_FORMAT, lobj->label_no);
+ rb_str_catf(str, "<L%03d>", lobj->label_no);
break;
}
break;
@@ -7646,7 +6045,6 @@ insn_data_to_s_detail(INSN *iobj)
break;
}
case TS_IC: /* inline cache */
- case TS_ISE: /* inline storage entry */
rb_str_catf(str, "<ic:%d>", FIX2INT(OPERAND_AT(iobj, j)));
break;
case TS_CALLINFO: /* call info */
@@ -7667,7 +6065,7 @@ insn_data_to_s_detail(INSN *iobj)
break;
case TS_FUNCPTR:
{
- const void *func = (const void *)OPERAND_AT(iobj, j);
+ rb_insn_func_t func = (rb_insn_func_t)OPERAND_AT(iobj, j);
#ifdef HAVE_DLADDR
Dl_info info;
if (dladdr(func, &info) && info.dli_sname) {
@@ -7691,13 +6089,7 @@ insn_data_to_s_detail(INSN *iobj)
}
static void
-dump_disasm_list(const LINK_ELEMENT *link)
-{
- dump_disasm_list_with_cursor(link, NULL, NULL);
-}
-
-static void
-dump_disasm_list_with_cursor(const LINK_ELEMENT *link, const LINK_ELEMENT *curr, const LABEL *dest)
+dump_disasm_list(struct iseq_link_element *link)
{
int pos = 0;
INSN *iobj;
@@ -7707,27 +6099,24 @@ dump_disasm_list_with_cursor(const LINK_ELEMENT *link, const LINK_ELEMENT *curr,
printf("-- raw disasm--------\n");
while (link) {
- if (curr) printf(curr == link ? "*" : " ");
switch (link->type) {
case ISEQ_ELEMENT_INSN:
{
iobj = (INSN *)link;
str = insn_data_to_s_detail(iobj);
- printf("%04d %-65s(%4u)\n", pos, StringValueCStr(str), iobj->insn_info.line_no);
+ printf("%04d %-65s(%4u)\n", pos, StringValueCStr(str), iobj->line_no);
pos += insn_data_length(iobj);
break;
}
case ISEQ_ELEMENT_LABEL:
{
lobj = (LABEL *)link;
- printf(LABEL_FORMAT" [sp: %d]%s\n", lobj->label_no, lobj->sp,
- dest == lobj ? " <---" : "");
+ printf("<L%03d>\n", lobj->label_no);
break;
}
- case ISEQ_ELEMENT_TRACE:
+ case ISEQ_ELEMENT_NONE:
{
- TRACE *trace = (TRACE *)link;
- printf("trace: %0x\n", trace->event);
+ printf("[none]\n");
break;
}
case ISEQ_ELEMENT_ADJUST:
@@ -7749,16 +6138,16 @@ dump_disasm_list_with_cursor(const LINK_ELEMENT *link, const LINK_ELEMENT *curr,
const char *
rb_insns_name(int i)
{
- return insn_name(i);
+ return insn_name_info[i];
}
VALUE
rb_insns_name_array(void)
{
- VALUE ary = rb_ary_new_capa(VM_INSTRUCTION_SIZE);
+ VALUE ary = rb_ary_new();
int i;
- for (i = 0; i < VM_INSTRUCTION_SIZE; i++) {
- rb_ary_push(ary, rb_fstring_cstr(insn_name(i)));
+ for (i = 0; i < numberof(insn_name_info); i++) {
+ rb_ary_push(ary, rb_fstring(rb_str_new2(insn_name_info[i])));
}
return rb_obj_freeze(ary);
}
@@ -7768,7 +6157,7 @@ register_label(rb_iseq_t *iseq, struct st_table *labels_table, VALUE obj)
{
LABEL *label = 0;
st_data_t tmp;
- obj = rb_to_symbol_type(obj);
+ obj = rb_convert_type(obj, T_SYMBOL, "Symbol", "to_sym");
if (st_lookup(labels_table, obj, &tmp) == 0) {
label = NEW_LABEL(0);
@@ -7817,34 +6206,30 @@ iseq_build_from_ary_exception(rb_iseq_t *iseq, struct st_table *labels_table,
for (i=0; i<RARRAY_LEN(exception); i++) {
const rb_iseq_t *eiseq;
VALUE v, type;
+ const VALUE *ptr;
LABEL *lstart, *lend, *lcont;
unsigned int sp;
- v = rb_to_array_type(RARRAY_AREF(exception, i));
+ v = rb_convert_type(RARRAY_AREF(exception, i), T_ARRAY,
+ "Array", "to_ary");
if (RARRAY_LEN(v) != 6) {
rb_raise(rb_eSyntaxError, "wrong exception entry");
}
- type = get_exception_sym2type(RARRAY_AREF(v, 0));
- if (RARRAY_AREF(v, 1) == Qnil) {
+ ptr = RARRAY_CONST_PTR(v);
+ type = get_exception_sym2type(ptr[0]);
+ if (ptr[1] == Qnil) {
eiseq = NULL;
}
else {
- eiseq = rb_iseqw_to_iseq(rb_iseq_load(RARRAY_AREF(v, 1), (VALUE)iseq, Qnil));
- }
-
- lstart = register_label(iseq, labels_table, RARRAY_AREF(v, 2));
- lend = register_label(iseq, labels_table, RARRAY_AREF(v, 3));
- lcont = register_label(iseq, labels_table, RARRAY_AREF(v, 4));
- sp = NUM2UINT(RARRAY_AREF(v, 5));
-
- /* TODO: Dirty Hack! Fix me */
- if (type == CATCH_TYPE_RESCUE ||
- type == CATCH_TYPE_BREAK ||
- type == CATCH_TYPE_NEXT) {
- ++sp;
+ eiseq = rb_iseqw_to_iseq(rb_iseq_load(ptr[1], (VALUE)iseq, Qnil));
}
- lcont->sp = sp;
+ lstart = register_label(iseq, labels_table, ptr[2]);
+ lend = register_label(iseq, labels_table, ptr[3]);
+ lcont = register_label(iseq, labels_table, ptr[4]);
+ sp = NUM2UINT(ptr[5]);
+
+ (void)sp;
ADD_CATCH_ENTRY(type, lstart, lend, eiseq, lcont);
@@ -7884,6 +6269,7 @@ iseq_build_load_iseq(const rb_iseq_t *iseq, VALUE op)
}
loaded_iseq = rb_iseqw_to_iseq(iseqw);
+ iseq_add_mark_object(iseq, (VALUE)loaded_iseq);
return loaded_iseq;
}
@@ -7923,26 +6309,12 @@ iseq_build_callinfo_from_hash(rb_iseq_t *iseq, VALUE op)
return (VALUE)new_callinfo(iseq, mid, orig_argc, flag, kw_arg, (flag & VM_CALL_ARGS_SIMPLE) == 0);
}
-static rb_event_flag_t
-event_name_to_flag(VALUE sym)
-{
-#define CHECK_EVENT(ev) if (sym == ID2SYM(rb_intern(#ev))) return ev;
- CHECK_EVENT(RUBY_EVENT_LINE);
- CHECK_EVENT(RUBY_EVENT_CLASS);
- CHECK_EVENT(RUBY_EVENT_END);
- CHECK_EVENT(RUBY_EVENT_CALL);
- CHECK_EVENT(RUBY_EVENT_RETURN);
- CHECK_EVENT(RUBY_EVENT_B_CALL);
- CHECK_EVENT(RUBY_EVENT_B_RETURN);
-#undef CHECK_EVENT
- return RUBY_EVENT_NONE;
-}
-
static int
-iseq_build_from_ary_body(rb_iseq_t *iseq, LINK_ANCHOR *const anchor,
+iseq_build_from_ary_body(rb_iseq_t *iseq, LINK_ANCHOR *anchor,
VALUE body, VALUE labels_wrapper)
{
/* TODO: body should be frozen */
+ const VALUE *ptr = RARRAY_CONST_PTR(body);
long i, len = RARRAY_LEN(body);
struct st_table *labels_table = DATA_PTR(labels_wrapper);
int j;
@@ -7959,17 +6331,11 @@ iseq_build_from_ary_body(rb_iseq_t *iseq, LINK_ANCHOR *const anchor,
}
for (i=0; i<len; i++) {
- VALUE obj = RARRAY_AREF(body, i);
+ VALUE obj = ptr[i];
if (SYMBOL_P(obj)) {
- rb_event_flag_t event;
- if ((event = event_name_to_flag(obj)) != RUBY_EVENT_NONE) {
- ADD_TRACE(anchor, event);
- }
- else {
- LABEL *label = register_label(iseq, labels_table, obj);
- ADD_LABEL(anchor, label);
- }
+ LABEL *label = register_label(iseq, labels_table, obj);
+ ADD_LABEL(anchor, label);
}
else if (FIXNUM_P(obj)) {
line_no = NUM2INT(obj);
@@ -7983,14 +6349,14 @@ iseq_build_from_ary_body(rb_iseq_t *iseq, LINK_ANCHOR *const anchor,
insn = (argc < 0) ? Qnil : RARRAY_AREF(obj, 0);
if (st_lookup(insn_table, (st_data_t)insn, &insn_id) == 0) {
/* TODO: exception */
- COMPILE_ERROR(iseq, line_no,
+ COMPILE_ERROR(ruby_sourcefile_string, line_no,
"unknown instruction: %+"PRIsVALUE, insn);
ret = COMPILE_NG;
break;
}
if (argc != insn_len((VALUE)insn_id)-1) {
- COMPILE_ERROR(iseq, line_no,
+ COMPILE_ERROR(ruby_sourcefile_string, line_no,
"operand size mismatch");
ret = COMPILE_NG;
break;
@@ -8013,14 +6379,12 @@ iseq_build_from_ary_body(rb_iseq_t *iseq, LINK_ANCHOR *const anchor,
break;
case TS_VALUE:
argv[j] = op;
- iseq_add_mark_object_compile_time(iseq, op);
+ iseq_add_mark_object(iseq, op);
break;
case TS_ISEQ:
{
if (op != Qnil) {
- VALUE v = (VALUE)iseq_build_load_iseq(iseq, op);
- argv[j] = v;
- iseq_add_mark_object_compile_time(iseq, v);
+ argv[j] = (VALUE)iseq_build_load_iseq(iseq, op);
}
else {
argv[j] = 0;
@@ -8028,11 +6392,9 @@ iseq_build_from_ary_body(rb_iseq_t *iseq, LINK_ANCHOR *const anchor,
}
break;
case TS_GENTRY:
- op = rb_to_symbol_type(op);
+ op = rb_convert_type(op, T_SYMBOL, "Symbol", "to_sym");
argv[j] = (VALUE)rb_global_entry(SYM2ID(op));
break;
- case TS_ISE:
- FL_SET(iseq, ISEQ_MARKABLE_ISEQ);
case TS_IC:
argv[j] = op;
if (NUM2UINT(op) >= iseq->body->is_size) {
@@ -8046,15 +6408,16 @@ iseq_build_from_ary_body(rb_iseq_t *iseq, LINK_ANCHOR *const anchor,
argv[j] = Qfalse;
break;
case TS_ID:
- argv[j] = rb_to_symbol_type(op);
+ argv[j] = rb_convert_type(op, T_SYMBOL,
+ "Symbol", "to_sym");
break;
case TS_CDHASH:
{
int i;
- VALUE map = rb_hash_new_with_size(RARRAY_LEN(op)/2);
+ VALUE map = rb_hash_new();
- RHASH_TBL_RAW(map)->type = &cdhash_type;
- op = rb_to_array_type(op);
+ rb_hash_tbl_raw(map)->type = &cdhash_type;
+ op = rb_convert_type(op, T_ARRAY, "Array", "to_ary");
for (i=0; i<RARRAY_LEN(op); i+=2) {
VALUE key = RARRAY_AREF(op, i);
VALUE sym = RARRAY_AREF(op, i+1);
@@ -8064,7 +6427,7 @@ iseq_build_from_ary_body(rb_iseq_t *iseq, LINK_ANCHOR *const anchor,
}
RB_GC_GUARD(op);
argv[j] = map;
- iseq_add_mark_object_compile_time(iseq, map);
+ rb_iseq_add_mark_object(iseq, map);
}
break;
case TS_FUNCPTR:
@@ -8096,18 +6459,20 @@ iseq_build_from_ary_body(rb_iseq_t *iseq, LINK_ANCHOR *const anchor,
return iseq_setup(iseq, anchor);
}
-#define CHECK_ARRAY(v) rb_to_array_type(v)
-#define CHECK_SYMBOL(v) rb_to_symbol_type(v)
+#define CHECK_ARRAY(v) rb_convert_type((v), T_ARRAY, "Array", "to_ary")
+#define CHECK_SYMBOL(v) rb_convert_type((v), T_SYMBOL, "Symbol", "to_sym")
static int
int_param(int *dst, VALUE param, VALUE sym)
{
VALUE val = rb_hash_aref(param, sym);
- if (FIXNUM_P(val)) {
+ switch (TYPE(val)) {
+ case T_NIL:
+ return FALSE;
+ case T_FIXNUM:
*dst = FIX2INT(val);
return TRUE;
- }
- else if (!NIL_P(val)) {
+ default:
rb_raise(rb_eTypeError, "invalid %+"PRIsVALUE" Fixnum: %+"PRIsVALUE,
sym, val);
}
@@ -8131,7 +6496,7 @@ iseq_build_kw(rb_iseq_t *iseq, VALUE params, VALUE keywords)
#define SYM(s) ID2SYM(rb_intern(#s))
(void)int_param(&keyword->bits_start, params, SYM(kwbits));
i = keyword->bits_start - keyword->num;
- ids = (ID *)&iseq->body->local_table[i];
+ ids = (VALUE *)&iseq->body->local_table[i];
#undef SYM
/* required args */
@@ -8148,14 +6513,10 @@ iseq_build_kw(rb_iseq_t *iseq, VALUE params, VALUE keywords)
default_values: /* note: we intentionally preserve `i' from previous loop */
default_len = len - i;
if (default_len == 0) {
- keyword->table = ids;
return keyword;
}
- else if (default_len < 0) {
- UNREACHABLE;
- }
- dvs = ALLOC_N(VALUE, (unsigned int)default_len);
+ dvs = ALLOC_N(VALUE, default_len);
for (j = 0; i < len; i++, j++) {
key = RARRAY_AREF(keywords, i);
@@ -8189,7 +6550,6 @@ rb_iseq_build_from_ary(rb_iseq_t *iseq, VALUE misc, VALUE locals, VALUE params,
{
#define SYM(s) ID2SYM(rb_intern(#s))
int i, len;
- unsigned int arg_size, local_size, stack_max;
ID *tbl;
struct st_table *labels_table = st_init_numtable();
VALUE labels_wrapper = Data_Wrap_Struct(0, 0, st_free_table, labels_table);
@@ -8202,6 +6562,7 @@ rb_iseq_build_from_ary(rb_iseq_t *iseq, VALUE misc, VALUE locals, VALUE params,
len = RARRAY_LENINT(locals);
iseq->body->local_table_size = len;
iseq->body->local_table = tbl = len > 0 ? (ID *)ALLOC_N(ID, iseq->body->local_table_size) : NULL;
+ iseq->body->local_size = iseq->body->local_table_size + 1;
for (i = 0; i < len; i++) {
VALUE lv = RARRAY_AREF(locals, i);
@@ -8214,6 +6575,11 @@ rb_iseq_build_from_ary(rb_iseq_t *iseq, VALUE misc, VALUE locals, VALUE params,
}
}
+ /*
+ * we currently ignore misc params,
+ * local_size, stack_size and param.size are all calculated
+ */
+
#define INT_PARAM(F) int_param(&iseq->body->param.F, params, SYM(F))
if (INT_PARAM(lead_num)) {
iseq->body->param.flags.has_lead = TRUE;
@@ -8223,16 +6589,9 @@ rb_iseq_build_from_ary(rb_iseq_t *iseq, VALUE misc, VALUE locals, VALUE params,
if (INT_PARAM(rest_start)) iseq->body->param.flags.has_rest = TRUE;
if (INT_PARAM(block_start)) iseq->body->param.flags.has_block = TRUE;
#undef INT_PARAM
- {
-#define INT_PARAM(F) F = (int_param(&x, misc, SYM(F)) ? (unsigned int)x : 0)
- int x;
- INT_PARAM(arg_size);
- INT_PARAM(local_size);
- INT_PARAM(stack_max);
-#undef INT_PARAM
- }
- if (RB_TYPE_P(arg_opt_labels, T_ARRAY)) {
+ switch (TYPE(arg_opt_labels)) {
+ case T_ARRAY:
len = RARRAY_LENINT(arg_opt_labels);
iseq->body->param.flags.has_opt = !!(len - 1 >= 0);
@@ -8248,16 +6607,19 @@ rb_iseq_build_from_ary(rb_iseq_t *iseq, VALUE misc, VALUE locals, VALUE params,
iseq->body->param.opt_num = len - 1;
iseq->body->param.opt_table = opt_table;
}
- }
- else if (!NIL_P(arg_opt_labels)) {
+ case T_NIL:
+ break;
+ default:
rb_raise(rb_eTypeError, ":opt param is not an array: %+"PRIsVALUE,
arg_opt_labels);
}
- if (RB_TYPE_P(keywords, T_ARRAY)) {
+ switch (TYPE(keywords)) {
+ case T_ARRAY:
iseq->body->param.keyword = iseq_build_kw(iseq, params, keywords);
- }
- else if (!NIL_P(keywords)) {
+ case T_NIL:
+ break;
+ default:
rb_raise(rb_eTypeError, ":keywords param is not an array: %+"PRIsVALUE,
keywords);
}
@@ -8282,52 +6644,48 @@ rb_iseq_build_from_ary(rb_iseq_t *iseq, VALUE misc, VALUE locals, VALUE params,
/* body */
iseq_build_from_ary_body(iseq, anchor, body, labels_wrapper);
-
- iseq->body->param.size = arg_size;
- iseq->body->local_table_size = local_size;
- iseq->body->stack_max = stack_max;
}
/* for parser */
int
-rb_dvar_defined(ID id, const struct rb_block *base_block)
+rb_dvar_defined(ID id)
{
+ rb_thread_t *th = GET_THREAD();
const rb_iseq_t *iseq;
- if (base_block && (iseq = vm_block_iseq(base_block)) != NULL) {
- const struct rb_iseq_constant_body *body = iseq->body;
- while (body->type == ISEQ_TYPE_BLOCK ||
- body->type == ISEQ_TYPE_RESCUE ||
- body->type == ISEQ_TYPE_ENSURE ||
- body->type == ISEQ_TYPE_EVAL ||
- body->type == ISEQ_TYPE_MAIN
+ if (th->base_block && (iseq = th->base_block->iseq)) {
+ while (iseq->body->type == ISEQ_TYPE_BLOCK ||
+ iseq->body->type == ISEQ_TYPE_RESCUE ||
+ iseq->body->type == ISEQ_TYPE_ENSURE ||
+ iseq->body->type == ISEQ_TYPE_EVAL ||
+ iseq->body->type == ISEQ_TYPE_MAIN
) {
unsigned int i;
- for (i = 0; i < body->local_table_size; i++) {
- if (body->local_table[i] == id) {
+ for (i = 0; i < iseq->body->local_table_size; i++) {
+ if (iseq->body->local_table[i] == id) {
return 1;
}
}
- iseq = body->parent_iseq;
- body = iseq->body;
+ iseq = iseq->body->parent_iseq;
}
}
return 0;
}
int
-rb_local_defined(ID id, const struct rb_block *base_block)
+rb_local_defined(ID id)
{
+ rb_thread_t *th = GET_THREAD();
const rb_iseq_t *iseq;
- if (base_block && (iseq = vm_block_iseq(base_block)) != NULL) {
+ if (th->base_block && th->base_block->iseq) {
unsigned int i;
- const struct rb_iseq_constant_body *const body = iseq->body->local_iseq->body;
+ iseq = th->base_block->iseq->body->local_iseq;
- for (i=0; i<body->local_table_size; i++) {
- if (body->local_table[i] == id) {
+ for (i=0; i<iseq->body->local_table_size; i++) {
+ if (iseq->body->local_table[i] == id) {
return 1;
}
}
@@ -8335,22 +6693,34 @@ rb_local_defined(ID id, const struct rb_block *base_block)
return 0;
}
+int
+rb_parse_in_eval(void)
+{
+ return GET_THREAD()->parse_in_eval > 0;
+}
+
+int
+rb_parse_in_main(void)
+{
+ return GET_THREAD()->parse_in_eval < 0;
+}
+
static int
-caller_location(VALUE *path, VALUE *realpath)
+caller_location(VALUE *path, VALUE *absolute_path)
{
- const rb_execution_context_t *ec = GET_EC();
+ const rb_thread_t *const th = GET_THREAD();
const rb_control_frame_t *const cfp =
- rb_vm_get_ruby_level_next_cfp(ec, ec->cfp);
+ rb_vm_get_ruby_level_next_cfp(th, th->cfp);
if (cfp) {
int line = rb_vm_get_sourceline(cfp);
- *path = rb_iseq_path(cfp->iseq);
- *realpath = rb_iseq_realpath(cfp->iseq);
+ *path = cfp->iseq->body->location.path;
+ *absolute_path = cfp->iseq->body->location.absolute_path;
return line;
}
else {
- *path = rb_fstring_lit("<compiled>");
- *realpath = *path;
+ *path = rb_str_new2("<compiled>");
+ *absolute_path = *path;
return 1;
}
}
@@ -8363,29 +6733,28 @@ typedef struct {
static const rb_iseq_t *
method_for_self(VALUE name, VALUE arg, rb_insn_func_t func,
- VALUE (*build)(rb_iseq_t *, LINK_ANCHOR *const, VALUE))
+ VALUE (*build)(rb_iseq_t *, LINK_ANCHOR *, VALUE))
{
- VALUE path, realpath;
+ VALUE path, absolute_path;
accessor_args acc;
acc.arg = arg;
acc.func = func;
- acc.line = caller_location(&path, &realpath);
- return rb_iseq_new_ifunc(IFUNC_NEW(build, (VALUE)&acc, 0),
- rb_sym2str(name), path, realpath,
- INT2FIX(acc.line), 0, ISEQ_TYPE_METHOD, 0);
+ acc.line = caller_location(&path, &absolute_path);
+ return rb_iseq_new_with_opt((NODE *)IFUNC_NEW(build, (VALUE)&acc, 0),
+ rb_sym2str(name), path, absolute_path,
+ INT2FIX(acc.line), 0, ISEQ_TYPE_METHOD, 0);
}
static VALUE
-for_self_aref(rb_iseq_t *iseq, LINK_ANCHOR *const ret, VALUE a)
+for_self_aref(rb_iseq_t *iseq, LINK_ANCHOR *ret, VALUE a)
{
const accessor_args *const args = (void *)a;
const int line = args->line;
- struct rb_iseq_constant_body *const body = iseq->body;
iseq_set_local_table(iseq, 0);
- body->param.lead_num = 0;
- body->param.size = 0;
+ iseq->body->param.lead_num = 0;
+ iseq->body->param.size = 0;
ADD_INSN1(ret, line, putobject, args->arg);
ADD_INSN1(ret, line, opt_call_c_function, (VALUE)args->func);
@@ -8393,18 +6762,17 @@ for_self_aref(rb_iseq_t *iseq, LINK_ANCHOR *const ret, VALUE a)
}
static VALUE
-for_self_aset(rb_iseq_t *iseq, LINK_ANCHOR *const ret, VALUE a)
+for_self_aset(rb_iseq_t *iseq, LINK_ANCHOR *ret, VALUE a)
{
const accessor_args *const args = (void *)a;
const int line = args->line;
- struct rb_iseq_constant_body *const body = iseq->body;
static const ID vars[] = {1, idUScore};
iseq_set_local_table(iseq, vars);
- body->param.lead_num = 1;
- body->param.size = 1;
+ iseq->body->param.lead_num = 1;
+ iseq->body->param.size = 1;
- ADD_GETLOCAL(ret, line, numberof(vars)-1, 0);
+ ADD_INSN2(ret, line, getlocal, INT2FIX(numberof(vars)-0), INT2FIX(0));
ADD_INSN1(ret, line, putobject, args->arg);
ADD_INSN1(ret, line, opt_call_c_function, (VALUE)args->func);
ADD_INSN(ret, line, pop);
@@ -8431,10 +6799,6 @@ rb_method_for_self_aset(VALUE name, VALUE arg, rb_insn_func_t func)
/* ISeq binary format */
-#ifndef IBF_ISEQ_DEBUG
-#define IBF_ISEQ_DEBUG 0
-#endif
-
typedef unsigned int ibf_offset_t;
#define IBF_OFFSET(ptr) ((ibf_offset_t)(VALUE)(ptr))
@@ -8454,6 +6818,15 @@ struct ibf_header {
ibf_offset_t object_list_offset;
};
+struct ibf_id_entry {
+ enum {
+ ibf_id_enc_ascii,
+ ibf_id_enc_utf8,
+ ibf_id_enc_other
+ } enc : 2;
+ char body[1];
+};
+
struct ibf_dump {
VALUE str;
VALUE iseq_list; /* [iseq0 offset, ...] */
@@ -8465,7 +6838,7 @@ struct ibf_dump {
rb_iseq_t * iseq_alloc(void);
struct ibf_load {
- const RUBY_ALIGNAS(SIZEOF_VALUE) char *buff;
+ const char *buff;
const struct ibf_header *header;
ID *id_list; /* [id0, ...] */
VALUE iseq_list; /* [iseq0, ...] */
@@ -8478,32 +6851,7 @@ struct ibf_load {
static ibf_offset_t
ibf_dump_pos(struct ibf_dump *dump)
{
- long pos = RSTRING_LEN(dump->str);
-#if SIZEOF_LONG > SIZEOF_INT
- if (pos >= UINT_MAX) {
- rb_raise(rb_eRuntimeError, "dump size exceeds");
- }
-#endif
- return (unsigned int)pos;
-}
-
-static void
-ibf_dump_align(struct ibf_dump *dump, size_t align)
-{
- ibf_offset_t pos = ibf_dump_pos(dump);
- if (pos % align) {
- static const char padding[sizeof(VALUE)];
- size_t size = align - ((size_t)pos % align);
-#if SIZEOF_LONG > SIZEOF_INT
- if (pos + size >= UINT_MAX) {
- rb_raise(rb_eRuntimeError, "dump size exceeds");
- }
-#endif
- for (; size > sizeof(padding); size -= sizeof(padding)) {
- rb_str_cat(dump->str, padding, sizeof(padding));
- }
- rb_str_cat(dump->str, padding, size);
- }
+ return (unsigned int)rb_str_strlen(dump->str);
}
static ibf_offset_t
@@ -8533,13 +6881,10 @@ ibf_load_alloc(const struct ibf_load *load, ibf_offset_t offset, int size)
return buff;
}
-#define IBF_W_ALIGN(type) (RUBY_ALIGNOF(type) > 1 ? ibf_dump_align(dump, RUBY_ALIGNOF(type)) : (void)0)
-
-#define IBF_W(b, type, n) (IBF_W_ALIGN(type), (type *)(VALUE)IBF_WP(b, type, n))
+#define IBF_W(b, type, n) (type *)(VALUE)ibf_dump_write(dump, (b), sizeof(type) * (n))
#define IBF_WV(variable) ibf_dump_write(dump, &(variable), sizeof(variable))
#define IBF_WP(b, type, n) ibf_dump_write(dump, (b), sizeof(type) * (n))
#define IBF_R(val, type, n) (type *)ibf_load_alloc(load, IBF_OFFSET(val), sizeof(type) * (n))
-#define IBF_ZERO(variable) memset(&(variable), 0, sizeof(variable))
static int
ibf_table_lookup(struct st_table *table, st_data_t key)
@@ -8654,8 +6999,7 @@ ibf_load_gentry(const struct ibf_load *load, const struct rb_global_entry *entry
static VALUE *
ibf_dump_code(struct ibf_dump *dump, const rb_iseq_t *iseq)
{
- const struct rb_iseq_constant_body *const body = iseq->body;
- const int iseq_size = body->iseq_size;
+ const int iseq_size = iseq->body->iseq_size;
int code_index;
VALUE *code;
const VALUE *orig_code = rb_iseq_original_iseq(iseq);
@@ -8680,11 +7024,10 @@ ibf_dump_code(struct ibf_dump *dump, const rb_iseq_t *iseq)
code[code_index] = (VALUE)ibf_dump_iseq(dump, (const rb_iseq_t *)op);
break;
case TS_IC:
- case TS_ISE:
{
unsigned int i;
- for (i=0; i<body->is_size; i++) {
- if (op == (VALUE)&body->is_entries[i]) {
+ for (i=0; i<iseq->body->is_size; i++) {
+ if (op == (VALUE)&iseq->body->is_entries[i]) {
break;
}
}
@@ -8724,14 +7067,11 @@ ibf_load_code(const struct ibf_load *load, const rb_iseq_t *iseq, const struct r
int code_index;
VALUE *code = IBF_R(body->iseq_encoded, VALUE, iseq_size);
- struct rb_iseq_constant_body *load_body = iseq->body;
- struct rb_call_info *ci_entries = load_body->ci_entries;
- struct rb_call_info_with_kwarg *ci_kw_entries = (struct rb_call_info_with_kwarg *)&load_body->ci_entries[load_body->ci_size];
- struct rb_call_cache *cc_entries = load_body->cc_entries;
- union iseq_inline_storage_entry *is_entries = load_body->is_entries;
+ struct rb_call_info *ci_entries = iseq->body->ci_entries;
+ struct rb_call_info_with_kwarg *ci_kw_entries = (struct rb_call_info_with_kwarg *)&iseq->body->ci_entries[iseq->body->ci_size];
+ struct rb_call_cache *cc_entries = iseq->body->cc_entries;
+ union iseq_inline_storage_entry *is_entries = iseq->body->is_entries;
- load_body->iseq_encoded = code;
- load_body->iseq_size = 0;
for (code_index=0; code_index<iseq_size;) {
const VALUE insn = code[code_index++];
const char *types = insn_op_types(insn);
@@ -8743,27 +7083,11 @@ ibf_load_code(const struct ibf_load *load, const rb_iseq_t *iseq, const struct r
switch (types[op_index]) {
case TS_CDHASH:
case TS_VALUE:
- {
- VALUE v = ibf_load_object(load, op);
- code[code_index] = v;
- if (!SPECIAL_CONST_P(v)) {
- RB_OBJ_WRITTEN(iseq, Qundef, v);
- FL_SET(iseq, ISEQ_MARKABLE_ISEQ);
- }
- break;
- }
+ code[code_index] = ibf_load_object(load, op);
+ break;
case TS_ISEQ:
- {
- VALUE v = (VALUE)ibf_load_iseq(load, (const rb_iseq_t *)op);
- code[code_index] = v;
- if (!SPECIAL_CONST_P(v)) {
- RB_OBJ_WRITTEN(iseq, Qundef, v);
- FL_SET(iseq, ISEQ_MARKABLE_ISEQ);
- }
- break;
- }
- case TS_ISE:
- FL_SET(iseq, ISEQ_MARKABLE_ISEQ);
+ code[code_index] = (VALUE)ibf_load_iseq(load, (const rb_iseq_t *)op);
+ break;
case TS_IC:
code[code_index] = (VALUE)&is_entries[(int)op];
break;
@@ -8784,14 +7108,12 @@ ibf_load_code(const struct ibf_load *load, const rb_iseq_t *iseq, const struct r
break;
default:
/* code[code_index] = op; */
- continue;
+ break;
}
}
- if (insn_len(insn) != op_index+1) {
- rb_raise(rb_eRuntimeError, "operand size mismatch");
- }
- }
- load_body->iseq_size = code_index;
+ assert(insn_len(insn) == op_index+1);
+ };
+
return code;
}
@@ -8875,40 +7197,27 @@ ibf_load_param_keyword(const struct ibf_load *load, const struct rb_iseq_constan
}
}
-static struct iseq_insn_info_entry *
-ibf_dump_insns_info_body(struct ibf_dump *dump, const rb_iseq_t *iseq)
-{
- return IBF_W(iseq->body->insns_info.body, struct iseq_insn_info_entry, iseq->body->insns_info.size);
-}
-
-static struct iseq_insn_info_entry *
-ibf_load_insns_info_body(const struct ibf_load *load, const struct rb_iseq_constant_body *body)
+static struct iseq_line_info_entry *
+ibf_dump_line_info_table(struct ibf_dump *dump, const rb_iseq_t *iseq)
{
- return IBF_R(body->insns_info.body, struct iseq_insn_info_entry, body->insns_info.size);
+ return IBF_W(iseq->body->line_info_table, struct iseq_line_info_entry, iseq->body->line_info_size);
}
-static unsigned int *
-ibf_dump_insns_info_positions(struct ibf_dump *dump, const struct rb_iseq_constant_body *body)
+static struct iseq_line_info_entry *
+ibf_load_line_info_table(const struct ibf_load *load, const struct rb_iseq_constant_body *body)
{
- return IBF_W(body->insns_info.positions, unsigned int, body->insns_info.size);
-}
-
-static unsigned int *
-ibf_load_insns_info_positions(const struct ibf_load *load, const struct rb_iseq_constant_body *body)
-{
- return IBF_R(body->insns_info.positions, unsigned int, body->insns_info.size);
+ return IBF_R(body->line_info_table, struct iseq_line_info_entry, body->line_info_size);
}
static ID *
ibf_dump_local_table(struct ibf_dump *dump, const rb_iseq_t *iseq)
{
- const struct rb_iseq_constant_body *const body = iseq->body;
- const int size = body->local_table_size;
+ const int size = iseq->body->local_size - 1;
ID *table = ALLOCA_N(ID, size);
int i;
for (i=0; i<size; i++) {
- table[i] = ibf_dump_id(dump, body->local_table[i]);
+ table[i] = ibf_dump_id(dump, iseq->body->local_table[i]);
}
return IBF_W(table, ID, size);
@@ -8917,7 +7226,7 @@ ibf_dump_local_table(struct ibf_dump *dump, const rb_iseq_t *iseq)
static ID *
ibf_load_local_table(const struct ibf_load *load, const struct rb_iseq_constant_body *body)
{
- const int size = body->local_table_size;
+ const int size = body->local_size - 1;
if (size > 0) {
ID *table = IBF_R(body->local_table, ID, size);
@@ -8976,10 +7285,9 @@ ibf_load_catch_table(const struct ibf_load *load, const struct rb_iseq_constant_
static struct rb_call_info *
ibf_dump_ci_entries(struct ibf_dump *dump, const rb_iseq_t *iseq)
{
- const struct rb_iseq_constant_body *const body = iseq->body;
- const unsigned int ci_size = body->ci_size;
- const unsigned int ci_kw_size = body->ci_kw_size;
- const struct rb_call_info *ci_entries = body->ci_entries;
+ const unsigned int ci_size = iseq->body->ci_size;
+ const unsigned int ci_kw_size = iseq->body->ci_kw_size;
+ const struct rb_call_info *ci_entries = iseq->body->ci_entries;
struct rb_call_info *dump_ci_entries;
struct rb_call_info_with_kwarg *dump_ci_kw_entries;
int byte_size = ci_size * sizeof(struct rb_call_info) +
@@ -9043,40 +7351,27 @@ static ibf_offset_t
ibf_dump_iseq_each(struct ibf_dump *dump, const rb_iseq_t *iseq)
{
struct rb_iseq_constant_body dump_body;
-#if VM_INSN_INFO_TABLE_IMPL == 2
- unsigned int *positions;
-#endif
dump_body = *iseq->body;
- dump_body.location.pathobj = ibf_dump_object(dump, dump_body.location.pathobj); /* TODO: freeze */
+ dump_body.location.path = ibf_dump_object(dump, dump_body.location.path);
+ dump_body.location.absolute_path = ibf_dump_object(dump, dump_body.location.absolute_path);
dump_body.location.base_label = ibf_dump_object(dump, dump_body.location.base_label);
dump_body.location.label = ibf_dump_object(dump, dump_body.location.label);
- dump_body.iseq_encoded = ibf_dump_code(dump, iseq);
- dump_body.param.opt_table = ibf_dump_param_opt_table(dump, iseq);
- dump_body.param.keyword = ibf_dump_param_keyword(dump, iseq);
- dump_body.insns_info.body = ibf_dump_insns_info_body(dump, iseq);
-#if VM_INSN_INFO_TABLE_IMPL == 2
- positions = rb_iseq_insns_info_decode_positions(&dump_body);
- dump_body.insns_info.positions = positions;
- dump_body.insns_info.succ_index_table = 0;
-#endif
- dump_body.insns_info.positions = ibf_dump_insns_info_positions(dump, &dump_body);
-#if VM_INSN_INFO_TABLE_IMPL == 2
- ruby_xfree(positions);
-#endif
- dump_body.local_table = ibf_dump_local_table(dump, iseq);
- dump_body.catch_table = ibf_dump_catch_table(dump, iseq);
- dump_body.parent_iseq = ibf_dump_iseq(dump, iseq->body->parent_iseq);
- dump_body.local_iseq = ibf_dump_iseq(dump, iseq->body->local_iseq);
- dump_body.is_entries = NULL;
- dump_body.ci_entries = ibf_dump_ci_entries(dump, iseq);
- dump_body.cc_entries = NULL;
- dump_body.variable.coverage = Qnil;
- dump_body.variable.original_iseq = NULL;
+ dump_body.iseq_encoded = ibf_dump_code(dump, iseq);
+ dump_body.param.opt_table = ibf_dump_param_opt_table(dump, iseq);
+ dump_body.param.keyword = ibf_dump_param_keyword(dump, iseq);
+ dump_body.line_info_table = ibf_dump_line_info_table(dump, iseq);
+ dump_body.local_table = ibf_dump_local_table(dump, iseq);
+ dump_body.catch_table = ibf_dump_catch_table(dump, iseq);
+ dump_body.parent_iseq = ibf_dump_iseq(dump, iseq->body->parent_iseq);
+ dump_body.local_iseq = ibf_dump_iseq(dump, iseq->body->local_iseq);
+ dump_body.is_entries = NULL;
+ dump_body.ci_entries = ibf_dump_ci_entries(dump, iseq);
+ dump_body.cc_entries = NULL;
+ dump_body.mark_ary = ISEQ_FLIP_CNT(iseq);
- IBF_W_ALIGN(struct rb_iseq_constant_body);
- return IBF_WV(dump_body);
+ return ibf_dump_write(dump, &dump_body, sizeof(dump_body));
}
static VALUE
@@ -9098,69 +7393,35 @@ ibf_load_iseq_each(const struct ibf_load *load, rb_iseq_t *iseq, ibf_offset_t of
/* memcpy(load_body, load->buff + offset, sizeof(*load_body)); */
load_body->type = body->type;
load_body->stack_max = body->stack_max;
+ load_body->local_size = body->local_size;
+ load_body->iseq_size = body->iseq_size;
load_body->param = body->param;
- load_body->param.flags.has_kw = FALSE;
load_body->local_table_size = body->local_table_size;
load_body->is_size = body->is_size;
load_body->ci_size = body->ci_size;
load_body->ci_kw_size = body->ci_kw_size;
- load_body->insns_info.size = body->insns_info.size;
+ load_body->line_info_size = body->line_info_size;
- ISEQ_COVERAGE_SET(iseq, Qnil);
- ISEQ_ORIGINAL_ISEQ_CLEAR(iseq);
- iseq->body->variable.flip_count = body->variable.flip_count;
-
- {
- VALUE realpath = Qnil, path = ibf_load_object(load, body->location.pathobj);
- if (RB_TYPE_P(path, T_STRING)) {
- realpath = path = rb_fstring(path);
- }
- else if (RB_TYPE_P(path, T_ARRAY)) {
- VALUE pathobj = path;
- if (RARRAY_LEN(pathobj) != 2) {
- rb_raise(rb_eRuntimeError, "path object size mismatch");
- }
- path = rb_fstring(RARRAY_AREF(pathobj, 0));
- realpath = RARRAY_AREF(pathobj, 1);
- if (!NIL_P(realpath)) {
- if (!RB_TYPE_P(realpath, T_STRING)) {
- rb_raise(rb_eArgError, "unexpected realpath %"PRIxVALUE
- "(%x), path=%+"PRIsVALUE,
- realpath, TYPE(realpath), path);
- }
- realpath = rb_fstring(realpath);
- }
- }
- else {
- rb_raise(rb_eRuntimeError, "unexpected path object");
- }
- rb_iseq_pathobj_set(iseq, path, realpath);
- }
+ RB_OBJ_WRITE(iseq, &load_body->mark_ary, iseq_mark_ary_create((int)body->mark_ary));
+ RB_OBJ_WRITE(iseq, &load_body->location.path, ibf_load_location_str(load, body->location.path));
+ RB_OBJ_WRITE(iseq, &load_body->location.absolute_path, ibf_load_location_str(load, body->location.absolute_path));
RB_OBJ_WRITE(iseq, &load_body->location.base_label, ibf_load_location_str(load, body->location.base_label));
RB_OBJ_WRITE(iseq, &load_body->location.label, ibf_load_location_str(load, body->location.label));
load_body->location.first_lineno = body->location.first_lineno;
- load_body->location.node_id = body->location.node_id;
- load_body->location.code_location = body->location.code_location;
- load_body->catch_except_p = body->catch_except_p;
-
- load_body->is_entries = ZALLOC_N(union iseq_inline_storage_entry, body->is_size);
- load_body->ci_entries = ibf_load_ci_entries(load, body);
- load_body->cc_entries = ZALLOC_N(struct rb_call_cache, body->ci_size + body->ci_kw_size);
- load_body->param.opt_table = ibf_load_param_opt_table(load, body);
- load_body->param.keyword = ibf_load_param_keyword(load, body);
- load_body->param.flags.has_kw = body->param.flags.has_kw;
- load_body->insns_info.body = ibf_load_insns_info_body(load, body);
- load_body->insns_info.positions = ibf_load_insns_info_positions(load, body);
- load_body->local_table = ibf_load_local_table(load, body);
- load_body->catch_table = ibf_load_catch_table(load, body);
- load_body->parent_iseq = ibf_load_iseq(load, body->parent_iseq);
- load_body->local_iseq = ibf_load_iseq(load, body->local_iseq);
-
- ibf_load_code(load, iseq, body);
-#if VM_INSN_INFO_TABLE_IMPL == 2
- rb_iseq_insns_info_encode_positions(iseq);
-#endif
+
+ load_body->is_entries = ZALLOC_N(union iseq_inline_storage_entry, body->is_size);
+ load_body->ci_entries = ibf_load_ci_entries(load, body);
+ load_body->cc_entries = ZALLOC_N(struct rb_call_cache, body->ci_size + body->ci_kw_size);
+ load_body->param.opt_table = ibf_load_param_opt_table(load, body);
+ load_body->param.keyword = ibf_load_param_keyword(load, body);
+ load_body->line_info_table = ibf_load_line_info_table(load, body);
+ load_body->local_table = ibf_load_local_table(load, body);
+ load_body->catch_table = ibf_load_catch_table(load, body);
+ load_body->parent_iseq = ibf_load_iseq(load, body->parent_iseq);
+ load_body->local_iseq = ibf_load_iseq(load, body->local_iseq);
+
+ load_body->iseq_encoded = ibf_load_code(load, iseq, body);
rb_iseq_translate_threaded_code(iseq);
}
@@ -9177,7 +7438,6 @@ ibf_dump_iseq_list(struct ibf_dump *dump, struct ibf_header *header)
list[i] = (ibf_offset_t)NUM2LONG(rb_ary_entry(dump->iseq_list, i));
}
- ibf_dump_align(dump, sizeof(ibf_offset_t));
header->iseq_list_offset = ibf_dump_write(dump, list, sizeof(ibf_offset_t) * size);
header->iseq_list_size = (unsigned int)size;
}
@@ -9218,7 +7478,6 @@ ibf_dump_id_list(struct ibf_dump *dump, struct ibf_header *header)
st_foreach(dump->id_table, ibf_dump_id_list_i, (st_data_t)&arg);
- ibf_dump_align(dump, sizeof(long));
header->id_list_offset = ibf_dump_write(dump, arg.list, sizeof(long) * size);
header->id_list_size = (unsigned int)size;
}
@@ -9237,8 +7496,6 @@ struct ibf_object_header {
unsigned int frozen: 1;
unsigned int internal: 1;
};
-static const size_t ibf_object_header_align =
- RUBY_ALIGNOF(struct ibf_object_header);
enum ibf_object_class_index {
IBF_OBJECT_CLASS_OBJECT,
@@ -9249,7 +7506,7 @@ enum ibf_object_class_index {
struct ibf_object_string {
long encindex;
long len;
- char ptr[FLEX_ARY_LEN];
+ char ptr[1];
};
struct ibf_object_regexp {
@@ -9259,12 +7516,12 @@ struct ibf_object_regexp {
struct ibf_object_array {
long len;
- long ary[FLEX_ARY_LEN];
+ long ary[1];
};
struct ibf_object_hash {
long len;
- long keyval[FLEX_ARY_LEN];
+ long keyval[1];
};
struct ibf_object_struct_range {
@@ -9277,7 +7534,7 @@ struct ibf_object_struct_range {
struct ibf_object_bignum {
ssize_t slen;
- BDIGIT digits[FLEX_ARY_LEN];
+ BDIGIT digits[1];
};
enum ibf_object_data_type {
@@ -9292,36 +7549,20 @@ struct ibf_object_symbol {
long str;
};
-#define IBF_ALIGNED_OFFSET(align, offset) /* offset > 0 */ \
- ((((offset) - 1) / (align) + 1) * (align))
-#define IBF_OBJHEADER(offset) (const struct ibf_object_header *)\
- ibf_load_check_offset(load, IBF_ALIGNED_OFFSET(ibf_object_header_align, offset))
-#define IBF_OBJBODY(type, offset) (const type *)\
- ibf_load_check_offset(load, IBF_ALIGNED_OFFSET(RUBY_ALIGNOF(type), offset))
-
-static const void *
-ibf_load_check_offset(const struct ibf_load *load, size_t offset)
-{
- if (offset >= (size_t)RSTRING_LEN(load->str)) {
- rb_raise(rb_eIndexError, "object offset out of range: %"PRIdSIZE, offset);
- }
- return load->buff + offset;
-}
-
-NORETURN(static void ibf_dump_object_unsupported(struct ibf_dump *dump, VALUE obj));
+#define IBF_OBJHEADER(offset) (struct ibf_object_header *)(load->buff + (offset))
+#define IBF_OBJBODY(type, offset) (type *)(load->buff + sizeof(struct ibf_object_header) + (offset))
static void
ibf_dump_object_unsupported(struct ibf_dump *dump, VALUE obj)
{
- char buff[0x100];
- rb_raw_obj_info(buff, sizeof(buff), obj);
- rb_raise(rb_eNotImpError, "ibf_dump_object_unsupported: %s", buff);
+ rb_obj_info_dump(obj);
+ rb_bug("ibf_dump_object_unsupported: unsupported");
}
static VALUE
ibf_load_object_unsupported(const struct ibf_load *load, const struct ibf_object_header *header, ibf_offset_t offset)
{
- rb_raise(rb_eArgError, "unsupported");
+ rb_bug("unsupported");
return Qnil;
}
@@ -9349,7 +7590,7 @@ ibf_dump_object_class(struct ibf_dump *dump, VALUE obj)
static VALUE
ibf_load_object_class(const struct ibf_load *load, const struct ibf_object_header *header, ibf_offset_t offset)
{
- const enum ibf_object_class_index *cindexp = IBF_OBJBODY(enum ibf_object_class_index, offset);
+ enum ibf_object_class_index *cindexp = IBF_OBJBODY(enum ibf_object_class_index, offset);
enum ibf_object_class_index cindex = *cindexp;
switch (cindex) {
@@ -9361,7 +7602,7 @@ ibf_load_object_class(const struct ibf_load *load, const struct ibf_object_heade
return rb_eStandardError;
}
- rb_raise(rb_eArgError, "ibf_load_object_class: unknown class (%d)", (int)cindex);
+ rb_bug("ibf_load_object_class: unknown class (%d)", (int)cindex);
}
@@ -9369,13 +7610,13 @@ static void
ibf_dump_object_float(struct ibf_dump *dump, VALUE obj)
{
double dbl = RFLOAT_VALUE(obj);
- (void)IBF_W(&dbl, double, 1);
+ ibf_dump_write(dump, &dbl, sizeof(dbl));
}
static VALUE
ibf_load_object_float(const struct ibf_load *load, const struct ibf_object_header *header, ibf_offset_t offset)
{
- const double *dblp = IBF_OBJBODY(double, offset);
+ double *dblp = IBF_OBJBODY(double, offset);
return DBL2NUM(*dblp);
}
@@ -9385,7 +7626,6 @@ ibf_dump_object_string(struct ibf_dump *dump, VALUE obj)
long encindex = (long)rb_enc_get_index(obj);
long len = RSTRING_LEN(obj);
const char *ptr = RSTRING_PTR(obj);
- long buff[2];
if (encindex > RUBY_ENCINDEX_BUILTIN_MAX) {
rb_encoding *enc = rb_enc_from_index((int)encindex);
@@ -9393,9 +7633,8 @@ ibf_dump_object_string(struct ibf_dump *dump, VALUE obj)
encindex = RUBY_ENCINDEX_BUILTIN_MAX + ibf_dump_object(dump, rb_str_new2(enc_name));
}
- buff[0] = encindex;
- buff[1] = len;
- (void)IBF_W(buff, long, 2);
+ IBF_WV(encindex);
+ IBF_WV(len);
IBF_WP(ptr, char, len);
}
@@ -9422,11 +7661,10 @@ static void
ibf_dump_object_regexp(struct ibf_dump *dump, VALUE obj)
{
struct ibf_object_regexp regexp;
- VALUE srcstr = RREGEXP_SRC(obj);
- IBF_ZERO(regexp);
+ regexp.srcstr = RREGEXP_SRC(obj);
regexp.option = (char)rb_reg_options(obj);
- regexp.srcstr = (long)ibf_dump_object(dump, srcstr);
- (void)IBF_W(&regexp, struct ibf_object_regexp, 1);
+ regexp.srcstr = (long)ibf_dump_object(dump, regexp.srcstr);
+ IBF_WV(regexp);
}
static VALUE
@@ -9446,7 +7684,7 @@ static void
ibf_dump_object_array(struct ibf_dump *dump, VALUE obj)
{
long i, len = (int)RARRAY_LEN(obj);
- (void)IBF_W(&len, long, 1);
+ IBF_WV(len);
for (i=0; i<len; i++) {
long index = (long)ibf_dump_object(dump, RARRAY_AREF(obj, i));
IBF_WV(index);
@@ -9474,10 +7712,10 @@ static int
ibf_dump_object_hash_i(st_data_t key, st_data_t val, st_data_t ptr)
{
struct ibf_dump *dump = (struct ibf_dump *)ptr;
- long keyval[2];
- keyval[0] = (long)ibf_dump_object(dump, (VALUE)key);
- keyval[1] = (long)ibf_dump_object(dump, (VALUE)val);
- (void)IBF_W(keyval, long, 2);
+ long key_index = (long)ibf_dump_object(dump, (VALUE)key);
+ long val_index = (long)ibf_dump_object(dump, (VALUE)val);
+ IBF_WV(key_index);
+ IBF_WV(val_index);
return ST_CONTINUE;
}
@@ -9485,15 +7723,15 @@ static void
ibf_dump_object_hash(struct ibf_dump *dump, VALUE obj)
{
long len = RHASH_SIZE(obj);
- (void)IBF_W(&len, long, 1);
- if (len > 0) rb_hash_foreach(obj, ibf_dump_object_hash_i, (VALUE)dump);
+ IBF_WV(len);
+ if (len > 0) st_foreach(RHASH(obj)->ntbl, ibf_dump_object_hash_i, (st_data_t)dump);
}
static VALUE
ibf_load_object_hash(const struct ibf_load *load, const struct ibf_object_header *header, ibf_offset_t offset)
{
const struct ibf_object_hash *hash = IBF_OBJBODY(struct ibf_object_hash, offset);
- VALUE obj = rb_hash_new_with_size(hash->len);
+ VALUE obj = rb_hash_new();
int i;
for (i=0; i<hash->len; i++) {
@@ -9515,7 +7753,6 @@ ibf_dump_object_struct(struct ibf_dump *dump, VALUE obj)
if (rb_obj_is_kind_of(obj, rb_cRange)) {
struct ibf_object_struct_range range;
VALUE beg, end;
- IBF_ZERO(range);
range.len = 3;
range.class_index = 0;
@@ -9523,12 +7760,10 @@ ibf_dump_object_struct(struct ibf_dump *dump, VALUE obj)
range.beg = (long)ibf_dump_object(dump, beg);
range.end = (long)ibf_dump_object(dump, end);
- IBF_W_ALIGN(struct ibf_object_struct_range);
IBF_WV(range);
}
else {
- rb_raise(rb_eNotImpError, "ibf_dump_object_struct: unsupported class %"PRIsVALUE,
- rb_class_name(CLASS_OF(obj)));
+ rb_bug("ibf_dump_object_struct: unsupported class");
}
}
@@ -9551,7 +7786,7 @@ ibf_dump_object_bignum(struct ibf_dump *dump, VALUE obj)
ssize_t slen = BIGNUM_SIGN(obj) > 0 ? len : len * -1;
BDIGIT *d = BIGNUM_DIGITS(obj);
- (void)IBF_W(&slen, ssize_t, 1);
+ IBF_WV(slen);
IBF_WP(d, BDIGIT, len);
}
@@ -9574,12 +7809,11 @@ ibf_dump_object_data(struct ibf_dump *dump, VALUE obj)
if (rb_data_is_encoding(obj)) {
rb_encoding *enc = rb_to_encoding(obj);
const char *name = rb_enc_name(enc);
+ enum ibf_object_data_type type = IBF_OBJECT_DATA_ENCODING;
long len = strlen(name) + 1;
- long data[2];
- data[0] = IBF_OBJECT_DATA_ENCODING;
- data[1] = len;
- (void)IBF_W(data, long, 2);
- IBF_WP(name, char, len);
+ IBF_WV(type);
+ IBF_WV(len);
+ IBF_WP(name, char, strlen(name) + 1);
}
else {
ibf_dump_object_unsupported(dump, obj);
@@ -9589,12 +7823,11 @@ ibf_dump_object_data(struct ibf_dump *dump, VALUE obj)
static VALUE
ibf_load_object_data(const struct ibf_load *load, const struct ibf_object_header *header, ibf_offset_t offset)
{
- const long *body = IBF_OBJBODY(long, offset);
- const enum ibf_object_data_type type = (enum ibf_object_data_type)body[0];
- /* const long len = body[1]; */
- const char *data = (const char *)&body[2];
+ const enum ibf_object_data_type *typep = IBF_OBJBODY(enum ibf_object_data_type, offset);
+ /* const long *lenp = IBF_OBJBODY(long, offset + sizeof(enum ibf_object_data_type)); */
+ const char *data = IBF_OBJBODY(char, offset + sizeof(enum ibf_object_data_type) + sizeof(long));
- switch (type) {
+ switch (*typep) {
case IBF_OBJECT_DATA_ENCODING:
{
VALUE encobj = rb_enc_from_encoding(rb_enc_find(data));
@@ -9608,11 +7841,11 @@ ibf_load_object_data(const struct ibf_load *load, const struct ibf_object_header
static void
ibf_dump_object_complex_rational(struct ibf_dump *dump, VALUE obj)
{
- long data[2];
- data[0] = (long)ibf_dump_object(dump, RCOMPLEX(obj)->real);
- data[1] = (long)ibf_dump_object(dump, RCOMPLEX(obj)->imag);
+ long real = (long)ibf_dump_object(dump, RCOMPLEX(obj)->real);
+ long imag = (long)ibf_dump_object(dump, RCOMPLEX(obj)->imag);
- (void)IBF_W(data, long, 2);
+ IBF_WV(real);
+ IBF_WV(imag);
}
static VALUE
@@ -9634,7 +7867,7 @@ ibf_dump_object_symbol(struct ibf_dump *dump, VALUE obj)
{
VALUE str = rb_sym2str(obj);
long str_index = (long)ibf_dump_object(dump, str);
- (void)IBF_W(&str_index, long, 1);
+ IBF_WV(str_index);
}
static VALUE
@@ -9680,20 +7913,16 @@ static ibf_dump_object_function dump_object_functions[RUBY_T_MASK+1] = {
ibf_dump_object_unsupported, /* T_ICLASS 0x1c */
ibf_dump_object_unsupported, /* T_ZOMBIE 0x1d */
ibf_dump_object_unsupported, /* 0x1e */
- ibf_dump_object_unsupported, /* 0x1f */
+ ibf_dump_object_unsupported /* 0x1f */
};
static ibf_offset_t
-ibf_dump_object_object(struct ibf_dump *dump, VALUE obj)
+lbf_dump_object_object(struct ibf_dump *dump, VALUE obj)
{
struct ibf_object_header obj_header;
- ibf_offset_t current_offset;
- IBF_ZERO(obj_header);
+ ibf_offset_t current_offset = ibf_dump_pos(dump);
obj_header.type = TYPE(obj);
- IBF_W_ALIGN(ibf_offset_t);
- current_offset = ibf_dump_pos(dump);
-
if (SPECIAL_CONST_P(obj)) {
if (RB_TYPE_P(obj, T_SYMBOL) ||
RB_TYPE_P(obj, T_FLOAT)) {
@@ -9704,7 +7933,7 @@ ibf_dump_object_object(struct ibf_dump *dump, VALUE obj)
obj_header.frozen = TRUE;
obj_header.internal = TRUE;
IBF_WV(obj_header);
- (void)IBF_W(&obj, VALUE, 1);
+ IBF_WV(obj);
}
else {
obj_header.internal = (RBASIC_CLASS(obj) == 0) ? TRUE : FALSE;
@@ -9751,7 +7980,7 @@ static ibf_load_object_function load_object_functions[RUBY_T_MASK+1] = {
ibf_load_object_unsupported, /* T_ICLASS 0x1c */
ibf_load_object_unsupported, /* T_ZOMBIE 0x1d */
ibf_load_object_unsupported, /* 0x1e */
- ibf_load_object_unsupported, /* 0x1f */
+ ibf_load_object_unsupported /* 0x1f */
};
static VALUE
@@ -9769,25 +7998,9 @@ ibf_load_object(const struct ibf_load *load, VALUE object_index)
ibf_offset_t *offsets = (ibf_offset_t *)(load->header->object_list_offset + load->buff);
ibf_offset_t offset = offsets[object_index];
const struct ibf_object_header *header = IBF_OBJHEADER(offset);
- size_t value_offset;
-
-#if IBF_ISEQ_DEBUG
- fprintf(stderr, "ibf_load_object: list=%#x offsets=%p offset=%#x\n",
- load->header->object_list_offset, offsets, offset);
- fprintf(stderr, "ibf_load_object: type=%#x special=%d frozen=%d internal=%d\n",
- header->type, header->special_const, header->frozen, header->internal);
-#endif
- value_offset = (const char *)(header + 1) - load->buff;
- if (value_offset >= (size_t)RSTRING_LEN(load->str)) {
- rb_raise(rb_eIndexError, "object offset out of range: %"PRIdSIZE, value_offset);
- }
- offset = (ibf_offset_t)value_offset;
if (header->special_const) {
- const VALUE *vp = IBF_OBJBODY(VALUE, offset);
-#if IBF_ISEQ_DEBUG
- fprintf(stderr, "ibf_load_object: vp=%p\n", vp);
-#endif
+ VALUE *vp = IBF_OBJBODY(VALUE, offset);
obj = *vp;
}
else {
@@ -9796,10 +8009,7 @@ ibf_load_object(const struct ibf_load *load, VALUE object_index)
rb_ary_store(load->obj_list, (long)object_index, obj);
}
-#if IBF_ISEQ_DEBUG
- fprintf(stderr, "ibf_load_object: index=%#"PRIxVALUE" obj=%#"PRIxVALUE"\n",
- object_index, obj);
-#endif
+ iseq_add_mark_object(load->iseq, obj);
return obj;
}
}
@@ -9812,11 +8022,10 @@ ibf_dump_object_list(struct ibf_dump *dump, struct ibf_header *header)
for (i=0; i<RARRAY_LEN(dump->obj_list); i++) {
VALUE obj = RARRAY_AREF(dump->obj_list, i);
- ibf_offset_t offset = ibf_dump_object_object(dump, obj);
+ ibf_offset_t offset = lbf_dump_object_object(dump, obj);
rb_ary_push(list, UINT2NUM(offset));
}
size = i;
- IBF_W_ALIGN(ibf_offset_t);
header->object_list_offset = ibf_dump_pos(dump);
for (i=0; i<size; i++) {
@@ -9881,7 +8090,7 @@ ibf_dump_setup(struct ibf_dump *dump, VALUE dumper_obj)
}
VALUE
-rb_iseq_ibf_dump(const rb_iseq_t *iseq, VALUE opt)
+iseq_ibf_dump(const rb_iseq_t *iseq, VALUE opt)
{
struct ibf_dump *dump;
struct ibf_header header = {{0}};
@@ -9940,25 +8149,14 @@ ibf_iseq_list(const struct ibf_load *load)
}
void
-rb_ibf_load_iseq_complete(rb_iseq_t *iseq)
+ibf_load_iseq_complete(rb_iseq_t *iseq)
{
struct ibf_load *load = RTYPEDDATA_DATA(iseq->aux.loader.obj);
rb_iseq_t *prev_src_iseq = load->iseq;
- const ibf_offset_t offset = ibf_iseq_list(load)[iseq->aux.loader.index];
load->iseq = iseq;
-#if IBF_ISEQ_DEBUG
- fprintf(stderr, "rb_ibf_load_iseq_complete: index=%#x offset=%#x size=%#x\n",
- iseq->aux.loader.index, offset,
- load->header->size);
-#endif
- if (offset % sizeof(VALUE)) {
- rb_raise(rb_eArgError, "unaligned iseq offset: %#x @ %u",
- offset, iseq->aux.loader.index);
- }
- ibf_load_iseq_each(load, iseq, offset);
- ISEQ_COMPILE_DATA_CLEAR(iseq);
+ ibf_load_iseq_each(load, iseq, ibf_iseq_list(load)[iseq->aux.loader.index]);
+ ISEQ_COMPILE_DATA(iseq) = NULL;
FL_UNSET(iseq, ISEQ_NOT_LOADED_YET);
- rb_iseq_init_trace(iseq);
load->iseq = prev_src_iseq;
}
@@ -9966,7 +8164,7 @@ rb_ibf_load_iseq_complete(rb_iseq_t *iseq)
const rb_iseq_t *
rb_iseq_complete(const rb_iseq_t *iseq)
{
- rb_ibf_load_iseq_complete((rb_iseq_t *)iseq);
+ ibf_load_iseq_complete((rb_iseq_t *)iseq);
return iseq;
}
#endif
@@ -9976,47 +8174,29 @@ ibf_load_iseq(const struct ibf_load *load, const rb_iseq_t *index_iseq)
{
int iseq_index = (int)(VALUE)index_iseq;
-#if IBF_ISEQ_DEBUG
- fprintf(stderr, "ibf_load_iseq: index_iseq=%p iseq_list=%p\n",
- index_iseq, (void *)load->iseq_list);
-#endif
if (iseq_index == -1) {
return NULL;
}
else {
VALUE iseqv = rb_ary_entry(load->iseq_list, iseq_index);
-#if IBF_ISEQ_DEBUG
- fprintf(stderr, "ibf_load_iseq: iseqv=%p\n", (void *)iseqv);
-#endif
if (iseqv != Qnil) {
return (rb_iseq_t *)iseqv;
}
else {
rb_iseq_t *iseq = iseq_imemo_alloc();
-#if IBF_ISEQ_DEBUG
- fprintf(stderr, "ibf_load_iseq: new iseq=%p\n", iseq);
-#endif
FL_SET(iseq, ISEQ_NOT_LOADED_YET);
iseq->aux.loader.obj = load->loader_obj;
iseq->aux.loader.index = iseq_index;
-#if IBF_ISEQ_DEBUG
- fprintf(stderr, "ibf_load_iseq: iseq=%p loader_obj=%p index=%d\n",
- iseq, (void *)load->loader_obj, iseq_index);
-#endif
rb_ary_store(load->iseq_list, iseq_index, (VALUE)iseq);
#if !USE_LAZY_LOAD
-#if IBF_ISEQ_DEBUG
- fprintf(stderr, "ibf_load_iseq: loading iseq=%p\n", iseq);
-#endif
- rb_ibf_load_iseq_complete(iseq);
+ ibf_load_iseq_complete(iseq);
#endif /* !USE_LAZY_LOAD */
-#if IBF_ISEQ_DEBUG
- fprintf(stderr, "ibf_load_iseq: iseq=%p loaded %p\n",
- iseq, load->iseq);
-#endif
+ if (load->iseq) {
+ iseq_add_mark_object(load->iseq, (VALUE)iseq);
+ }
return iseq;
}
}
@@ -10043,7 +8223,7 @@ ibf_load_setup(struct ibf_load *load, VALUE loader_obj, VALUE str)
rb_raise(rb_eRuntimeError, "broken binary format");
}
if (strncmp(load->header->magic, "YARB", 4) != 0) {
- rb_raise(rb_eRuntimeError, "unknown binary format");
+ rb_raise(rb_eRuntimeError, "unkown binary format");
}
if (load->header->major_version != ISEQ_MAJOR_VERSION ||
load->header->minor_version != ISEQ_MINOR_VERSION) {
@@ -10053,35 +8233,27 @@ ibf_load_setup(struct ibf_load *load, VALUE loader_obj, VALUE str)
if (strcmp(load->buff + sizeof(struct ibf_header), RUBY_PLATFORM) != 0) {
rb_raise(rb_eRuntimeError, "unmatched platform");
}
- if (load->header->iseq_list_offset % RUBY_ALIGNOF(ibf_offset_t)) {
- rb_raise(rb_eArgError, "unaligned iseq list offset: %u",
- load->header->iseq_list_offset);
- }
- if (load->header->id_list_offset % RUBY_ALIGNOF(long)) {
- rb_raise(rb_eArgError, "unaligned ID list offset: %u",
- load->header->id_list_offset);
- }
- if (load->header->object_list_offset % RUBY_ALIGNOF(ibf_offset_t)) {
- rb_raise(rb_eArgError, "unaligned object list offset: %u",
- load->header->object_list_offset);
- }
}
static void
ibf_loader_mark(void *ptr)
{
- struct ibf_load *load = (struct ibf_load *)ptr;
- rb_gc_mark(load->str);
- rb_gc_mark(load->iseq_list);
- rb_gc_mark(load->obj_list);
+ if (ptr) {
+ struct ibf_load *load = (struct ibf_load *)ptr;
+ rb_gc_mark(load->str);
+ rb_gc_mark(load->iseq_list);
+ rb_gc_mark(load->obj_list);
+ }
}
static void
ibf_loader_free(void *ptr)
{
- struct ibf_load *load = (struct ibf_load *)ptr;
- ruby_xfree(load->id_list);
- ruby_xfree(load);
+ if (ptr) {
+ struct ibf_load *load = (struct ibf_load *)ptr;
+ ruby_xfree(load->id_list);
+ ruby_xfree(load);
+ }
}
static size_t
@@ -10098,10 +8270,10 @@ static const rb_data_type_t ibf_load_type = {
};
const rb_iseq_t *
-rb_iseq_ibf_load(VALUE str)
+iseq_ibf_load(VALUE str)
{
struct ibf_load *load;
- rb_iseq_t *iseq;
+ const rb_iseq_t *iseq;
VALUE loader_obj = TypedData_Make_Struct(0, struct ibf_load, &ibf_load_type, load);
ibf_load_setup(load, loader_obj, str);
@@ -10112,7 +8284,7 @@ rb_iseq_ibf_load(VALUE str)
}
VALUE
-rb_iseq_ibf_load_extra_data(VALUE str)
+iseq_ibf_load_extra_data(VALUE str)
{
struct ibf_load *load;
VALUE loader_obj = TypedData_Make_Struct(0, struct ibf_load, &ibf_load_type, load);
@@ -10123,3 +8295,4 @@ rb_iseq_ibf_load_extra_data(VALUE str)
RB_GC_GUARD(loader_obj);
return extra_str;
}
+
diff --git a/complex.c b/complex.c
index cc798cccca..ec52beaf0a 100644
--- a/complex.c
+++ b/complex.c
@@ -12,19 +12,14 @@
#endif
#include <math.h>
#include "internal.h"
-#include "id.h"
#define NDEBUG
-#include "ruby_assert.h"
+#include <assert.h>
#define ZERO INT2FIX(0)
#define ONE INT2FIX(1)
#define TWO INT2FIX(2)
-#if USE_FLONUM
#define RFLOAT_0 DBL2NUM(0)
-#else
-static VALUE RFLOAT_0;
-#endif
#if defined(HAVE_SIGNBIT) && defined(__GNUC__) && defined(__sun) && \
!defined(signbit)
extern int signbit(double);
@@ -32,16 +27,14 @@ extern int signbit(double);
VALUE rb_cComplex;
-static ID id_abs, id_arg,
- id_denominator, id_fdiv, id_numerator, id_quo,
- id_real_p, id_i_real, id_i_imag,
- id_finite_p, id_infinite_p, id_rationalize,
- id_PI;
-#define id_to_i idTo_i
-#define id_to_r idTo_r
-#define id_negate idUMinus
-#define id_expt idPow
-#define id_to_f idTo_f
+static VALUE nucomp_abs(VALUE self);
+static VALUE nucomp_arg(VALUE self);
+
+static ID id_abs, id_arg, id_convert,
+ id_denominator, id_eqeq_p, id_expt, id_fdiv,
+ id_negate, id_numerator, id_quo,
+ id_real_p, id_to_f, id_to_i, id_to_r,
+ id_i_real, id_i_imag;
#define f_boolcast(x) ((x) ? Qtrue : Qfalse)
@@ -66,32 +59,31 @@ f_##n(VALUE x, VALUE y)\
return rb_funcall(x, id_##n, 1, y);\
}
+#define math1(n) \
+inline static VALUE \
+m_##n(VALUE x)\
+{\
+ return rb_funcall(rb_mMath, id_##n, 1, x);\
+}
+
+#define math2(n) \
+inline static VALUE \
+m_##n(VALUE x, VALUE y)\
+{\
+ return rb_funcall(rb_mMath, id_##n, 2, x, y);\
+}
+
#define PRESERVE_SIGNEDZERO
inline static VALUE
f_add(VALUE x, VALUE y)
{
- if (RB_INTEGER_TYPE_P(x) &&
- LIKELY(rb_method_basic_definition_p(rb_cInteger, idPLUS))) {
- if (FIXNUM_ZERO_P(x))
- return y;
- if (FIXNUM_ZERO_P(y))
- return x;
- return rb_int_plus(x, y);
- }
- else if (RB_FLOAT_TYPE_P(x) &&
- LIKELY(rb_method_basic_definition_p(rb_cFloat, idPLUS))) {
- if (FIXNUM_ZERO_P(y))
- return x;
- return rb_float_plus(x, y);
- }
- else if (RB_TYPE_P(x, T_RATIONAL) &&
- LIKELY(rb_method_basic_definition_p(rb_cRational, idPLUS))) {
- if (FIXNUM_ZERO_P(y))
- return x;
- return rb_rational_plus(x, y);
- }
-
+#ifndef PRESERVE_SIGNEDZERO
+ if (FIXNUM_P(y) && FIX2LONG(y) == 0)
+ return x;
+ else if (FIXNUM_P(x) && FIX2LONG(x) == 0)
+ return y;
+#endif
return rb_funcall(x, '+', 1, y);
}
@@ -103,84 +95,54 @@ f_div(VALUE x, VALUE y)
return rb_funcall(x, '/', 1, y);
}
-inline static int
+inline static VALUE
f_gt_p(VALUE x, VALUE y)
{
- if (RB_INTEGER_TYPE_P(x)) {
- if (FIXNUM_P(x) && FIXNUM_P(y))
- return (SIGNED_VALUE)x > (SIGNED_VALUE)y;
- return RTEST(rb_int_gt(x, y));
- }
- else if (RB_FLOAT_TYPE_P(x))
- return RTEST(rb_float_gt(x, y));
- else if (RB_TYPE_P(x, T_RATIONAL)) {
- int const cmp = rb_cmpint(rb_rational_cmp(x, y), x, y);
- return cmp > 0;
- }
- return RTEST(rb_funcall(x, '>', 1, y));
+ if (FIXNUM_P(x) && FIXNUM_P(y))
+ return f_boolcast(FIX2LONG(x) > FIX2LONG(y));
+ return rb_funcall(x, '>', 1, y);
}
inline static VALUE
f_mul(VALUE x, VALUE y)
{
- if (RB_INTEGER_TYPE_P(x) &&
- LIKELY(rb_method_basic_definition_p(rb_cInteger, idMULT))) {
- if (FIXNUM_ZERO_P(y))
- return ZERO;
- if (FIXNUM_ZERO_P(x) && RB_INTEGER_TYPE_P(y))
- return ZERO;
- if (x == ONE) return y;
- if (y == ONE) return x;
- return rb_int_mul(x, y);
- }
- else if (RB_FLOAT_TYPE_P(x) &&
- LIKELY(rb_method_basic_definition_p(rb_cFloat, idMULT))) {
- if (y == ONE) return x;
- return rb_float_mul(x, y);
- }
- else if (RB_TYPE_P(x, T_RATIONAL) &&
- LIKELY(rb_method_basic_definition_p(rb_cRational, idMULT))) {
- if (y == ONE) return x;
- return rb_rational_mul(x, y);
- }
- else if (LIKELY(rb_method_basic_definition_p(CLASS_OF(x), idMULT))) {
- if (y == ONE) return x;
+#ifndef PRESERVE_SIGNEDZERO
+ if (FIXNUM_P(y)) {
+ long iy = FIX2LONG(y);
+ if (iy == 0) {
+ if (FIXNUM_P(x) || RB_TYPE_P(x, T_BIGNUM))
+ return ZERO;
+ }
+ else if (iy == 1)
+ return x;
+ }
+ else if (FIXNUM_P(x)) {
+ long ix = FIX2LONG(x);
+ if (ix == 0) {
+ if (FIXNUM_P(y) || RB_TYPE_P(y, T_BIGNUM))
+ return ZERO;
+ }
+ else if (ix == 1)
+ return y;
}
+#endif
return rb_funcall(x, '*', 1, y);
}
inline static VALUE
f_sub(VALUE x, VALUE y)
{
- if (FIXNUM_ZERO_P(y) &&
- LIKELY(rb_method_basic_definition_p(CLASS_OF(x), idMINUS))) {
+#ifndef PRESERVE_SIGNEDZERO
+ if (FIXNUM_P(y) && FIX2LONG(y) == 0)
return x;
- }
+#endif
return rb_funcall(x, '-', 1, y);
}
fun1(abs)
fun1(arg)
fun1(denominator)
-
-inline static VALUE
-f_negate(VALUE x)
-{
- if (RB_INTEGER_TYPE_P(x)) {
- return rb_int_uminus(x);
- }
- else if (RB_FLOAT_TYPE_P(x)) {
- return rb_float_uminus(x);
- }
- else if (RB_TYPE_P(x, T_RATIONAL)) {
- return rb_rational_uminus(x);
- }
- else if (RB_TYPE_P(x, T_COMPLEX)) {
- return rb_complex_uminus(x);
- }
- return rb_funcall(x, id_negate, 0);
-}
-
+fun1(negate)
fun1(numerator)
fun1(real_p)
@@ -201,102 +163,120 @@ f_to_f(VALUE x)
fun1(to_r)
-inline static int
+inline static VALUE
f_eqeq_p(VALUE x, VALUE y)
{
if (FIXNUM_P(x) && FIXNUM_P(y))
- return x == y;
- else if (RB_FLOAT_TYPE_P(x) || RB_FLOAT_TYPE_P(y))
- return NUM2DBL(x) == NUM2DBL(y);
- return (int)rb_equal(x, y);
+ return f_boolcast(FIX2LONG(x) == FIX2LONG(y));
+ return rb_funcall(x, id_eqeq_p, 1, y);
}
fun2(expt)
fun2(fdiv)
fun2(quo)
-inline static int
+inline static VALUE
f_negative_p(VALUE x)
{
- if (RB_INTEGER_TYPE_P(x))
- return INT_NEGATIVE_P(x);
- else if (RB_FLOAT_TYPE_P(x))
- return RFLOAT_VALUE(x) < 0.0;
- else if (RB_TYPE_P(x, T_RATIONAL))
- return INT_NEGATIVE_P(RRATIONAL(x)->num);
- return rb_num_negative_p(x);
+ if (FIXNUM_P(x))
+ return f_boolcast(FIX2LONG(x) < 0);
+ return rb_funcall(x, '<', 1, ZERO);
}
#define f_positive_p(x) (!f_negative_p(x))
-inline static int
+inline static VALUE
f_zero_p(VALUE x)
{
- if (RB_INTEGER_TYPE_P(x)) {
- return FIXNUM_ZERO_P(x);
+ if (RB_TYPE_P(x, T_FIXNUM)) {
+ return f_boolcast(FIX2LONG(x) == 0);
+ }
+ else if (RB_TYPE_P(x, T_BIGNUM)) {
+ return Qfalse;
}
else if (RB_TYPE_P(x, T_RATIONAL)) {
- const VALUE num = RRATIONAL(x)->num;
- return FIXNUM_ZERO_P(num);
+ VALUE num = RRATIONAL(x)->num;
+
+ return f_boolcast(FIXNUM_P(num) && FIX2LONG(num) == 0);
}
- return (int)rb_equal(x, ZERO);
+ return rb_funcall(x, id_eqeq_p, 1, ZERO);
}
#define f_nonzero_p(x) (!f_zero_p(x))
-VALUE rb_flo_is_finite_p(VALUE num);
-inline static int
-f_finite_p(VALUE x)
-{
- if (RB_INTEGER_TYPE_P(x)) {
- return TRUE;
- }
- else if (RB_FLOAT_TYPE_P(x)) {
- return (int)rb_flo_is_finite_p(x);
- }
- else if (RB_TYPE_P(x, T_RATIONAL)) {
- return TRUE;
- }
- return RTEST(rb_funcallv(x, id_finite_p, 0, 0));
-}
-
-VALUE rb_flo_is_infinite_p(VALUE num);
inline static VALUE
-f_infinite_p(VALUE x)
+f_one_p(VALUE x)
{
- if (RB_INTEGER_TYPE_P(x)) {
- return Qnil;
+ if (RB_TYPE_P(x, T_FIXNUM)) {
+ return f_boolcast(FIX2LONG(x) == 1);
}
- else if (RB_FLOAT_TYPE_P(x)) {
- return rb_flo_is_infinite_p(x);
+ else if (RB_TYPE_P(x, T_BIGNUM)) {
+ return Qfalse;
}
else if (RB_TYPE_P(x, T_RATIONAL)) {
- return Qnil;
+ VALUE num = RRATIONAL(x)->num;
+ VALUE den = RRATIONAL(x)->den;
+
+ return f_boolcast(FIXNUM_P(num) && FIX2LONG(num) == 1 &&
+ FIXNUM_P(den) && FIX2LONG(den) == 1);
}
- return rb_funcallv(x, id_infinite_p, 0, 0);
+ return rb_funcall(x, id_eqeq_p, 1, ONE);
}
-inline static int
+inline static VALUE
f_kind_of_p(VALUE x, VALUE c)
{
- return (int)rb_obj_is_kind_of(x, c);
+ return rb_obj_is_kind_of(x, c);
}
-inline static int
+inline static VALUE
k_numeric_p(VALUE x)
{
return f_kind_of_p(x, rb_cNumeric);
}
-#define k_exact_p(x) (!RB_FLOAT_TYPE_P(x))
+inline static VALUE
+k_fixnum_p(VALUE x)
+{
+ return f_kind_of_p(x, rb_cFixnum);
+}
+
+inline static VALUE
+k_bignum_p(VALUE x)
+{
+ return f_kind_of_p(x, rb_cBignum);
+}
+
+inline static VALUE
+k_float_p(VALUE x)
+{
+ return f_kind_of_p(x, rb_cFloat);
+}
+
+inline static VALUE
+k_rational_p(VALUE x)
+{
+ return f_kind_of_p(x, rb_cRational);
+}
+
+inline static VALUE
+k_complex_p(VALUE x)
+{
+ return f_kind_of_p(x, rb_cComplex);
+}
+
+#define k_exact_p(x) (!k_float_p(x))
#define k_exact_zero_p(x) (k_exact_p(x) && f_zero_p(x))
#define get_dat1(x) \
- struct RComplex *dat = RCOMPLEX(x)
+ struct RComplex *dat;\
+ dat = ((struct RComplex *)(x))
#define get_dat2(x,y) \
- struct RComplex *adat = RCOMPLEX(x), *bdat = RCOMPLEX(y)
+ struct RComplex *adat, *bdat;\
+ adat = ((struct RComplex *)(x));\
+ bdat = ((struct RComplex *)(y))
inline static VALUE
nucomp_s_new_internal(VALUE klass, VALUE real, VALUE imag)
@@ -305,7 +285,6 @@ nucomp_s_new_internal(VALUE klass, VALUE real, VALUE imag)
RCOMPLEX_SET_REAL(obj, real);
RCOMPLEX_SET_IMAG(obj, imag);
- OBJ_FREEZE_RAW(obj);
return (VALUE)obj;
}
@@ -316,22 +295,50 @@ nucomp_s_alloc(VALUE klass)
return nucomp_s_new_internal(klass, ZERO, ZERO);
}
+#if 0
+static VALUE
+nucomp_s_new_bang(int argc, VALUE *argv, VALUE klass)
+{
+ VALUE real, imag;
+
+ switch (rb_scan_args(argc, argv, "11", &real, &imag)) {
+ case 1:
+ if (!k_numeric_p(real))
+ real = f_to_i(real);
+ imag = ZERO;
+ break;
+ default:
+ if (!k_numeric_p(real))
+ real = f_to_i(real);
+ if (!k_numeric_p(imag))
+ imag = f_to_i(imag);
+ break;
+ }
+
+ return nucomp_s_new_internal(klass, real, imag);
+}
+#endif
+
inline static VALUE
f_complex_new_bang1(VALUE klass, VALUE x)
{
- assert(!RB_TYPE_P(x, T_COMPLEX));
+ assert(!k_complex_p(x));
return nucomp_s_new_internal(klass, x, ZERO);
}
inline static VALUE
f_complex_new_bang2(VALUE klass, VALUE x, VALUE y)
{
- assert(!RB_TYPE_P(x, T_COMPLEX));
- assert(!RB_TYPE_P(y, T_COMPLEX));
+ assert(!k_complex_p(x));
+ assert(!k_complex_p(y));
return nucomp_s_new_internal(klass, x, y);
}
#ifdef CANONICALIZATION_FOR_MATHN
+#define CANON
+#endif
+
+#ifdef CANON
static int canonicalization = 0;
RUBY_FUNC_EXPORTED void
@@ -346,8 +353,9 @@ nucomp_canonicalization(int f)
inline static void
nucomp_real_check(VALUE num)
{
- if (!RB_INTEGER_TYPE_P(num) &&
- !RB_FLOAT_TYPE_P(num) &&
+ if (!RB_TYPE_P(num, T_FIXNUM) &&
+ !RB_TYPE_P(num, T_BIGNUM) &&
+ !RB_TYPE_P(num, T_FLOAT) &&
!RB_TYPE_P(num, T_RATIONAL)) {
if (!k_numeric_p(num) || !f_real_p(num))
rb_raise(rb_eTypeError, "not a real");
@@ -357,24 +365,26 @@ nucomp_real_check(VALUE num)
inline static VALUE
nucomp_s_canonicalize_internal(VALUE klass, VALUE real, VALUE imag)
{
- int complex_r, complex_i;
-#ifdef CANONICALIZATION_FOR_MATHN
+#ifdef CANON
+#define CL_CANON
+#ifdef CL_CANON
if (k_exact_zero_p(imag) && canonicalization)
return real;
+#else
+ if (f_zero_p(imag) && canonicalization)
+ return real;
+#endif
#endif
- complex_r = RB_TYPE_P(real, T_COMPLEX);
- complex_i = RB_TYPE_P(imag, T_COMPLEX);
- if (!complex_r && !complex_i) {
+ if (f_real_p(real) && f_real_p(imag))
return nucomp_s_new_internal(klass, real, imag);
- }
- else if (!complex_r) {
+ else if (f_real_p(real)) {
get_dat1(imag);
return nucomp_s_new_internal(klass,
f_sub(real, dat->imag),
f_add(ZERO, dat->real));
}
- else if (!complex_i) {
+ else if (f_real_p(imag)) {
get_dat1(real);
return nucomp_s_new_internal(klass,
@@ -421,16 +431,13 @@ nucomp_s_new(int argc, VALUE *argv, VALUE klass)
inline static VALUE
f_complex_new2(VALUE klass, VALUE x, VALUE y)
{
- assert(!RB_TYPE_P(x, T_COMPLEX));
+ assert(!k_complex_p(x));
return nucomp_s_canonicalize_internal(klass, x, y);
}
-static VALUE nucomp_convert(VALUE klass, VALUE a1, VALUE a2, int raise);
-static VALUE nucomp_s_convert(int argc, VALUE *argv, VALUE klass);
-
/*
* call-seq:
- * Complex(x[, y], exception: false) -> numeric
+ * Complex(x[, y]) -> numeric
*
* Returns x+i*y;
*
@@ -439,9 +446,6 @@ static VALUE nucomp_s_convert(int argc, VALUE *argv, VALUE klass);
* Complex(nil) #=> TypeError
* Complex(1, nil) #=> TypeError
*
- * Complex(1, nil, exception: false) #=> nil
- * Complex('1+2', exception: false) #=> nil
- *
* Syntax of string form:
*
* string form = extra spaces , complex , extra spaces ;
@@ -467,22 +471,7 @@ static VALUE nucomp_s_convert(int argc, VALUE *argv, VALUE klass);
static VALUE
nucomp_f_complex(int argc, VALUE *argv, VALUE klass)
{
- VALUE a1, a2, opts = Qnil;
- int raise = TRUE;
-
- if (rb_scan_args(argc, argv, "11:", &a1, &a2, &opts) == 1) {
- a2 = Qundef;
- }
- if (!NIL_P(opts)) {
- static ID kwds[1];
- VALUE exception;
- if (!kwds[0]) {
- kwds[0] = idException;
- }
- rb_get_kwargs(opts, kwds, 0, 1, &exception);
- raise = (exception != Qfalse);
- }
- return nucomp_convert(rb_cComplex, a1, a2, raise);
+ return rb_funcall2(rb_cComplex, id_convert, argc, argv);
}
#define imp1(n) \
@@ -492,9 +481,20 @@ m_##n##_bang(VALUE x)\
return rb_math_##n(x);\
}
+#define imp2(n) \
+inline static VALUE \
+m_##n##_bang(VALUE x, VALUE y)\
+{\
+ return rb_math_##n(x, y);\
+}
+
+imp2(atan2)
imp1(cos)
imp1(cosh)
imp1(exp)
+imp2(hypot)
+
+#define m_hypot(x,y) m_hypot_bang((x),(y))
static VALUE
m_log_bang(VALUE x)
@@ -508,7 +508,7 @@ imp1(sinh)
static VALUE
m_cos(VALUE x)
{
- if (!RB_TYPE_P(x, T_COMPLEX))
+ if (f_real_p(x))
return m_cos_bang(x);
{
get_dat1(x);
@@ -523,7 +523,7 @@ m_cos(VALUE x)
static VALUE
m_sin(VALUE x)
{
- if (!RB_TYPE_P(x, T_COMPLEX))
+ if (f_real_p(x))
return m_sin_bang(x);
{
get_dat1(x);
@@ -535,11 +535,37 @@ m_sin(VALUE x)
}
}
+#if 0
+imp1(sqrt)
+
+static VALUE
+m_sqrt(VALUE x)
+{
+ if (f_real_p(x)) {
+ if (f_positive_p(x))
+ return m_sqrt_bang(x);
+ return f_complex_new2(rb_cComplex, ZERO, m_sqrt_bang(f_negate(x)));
+ }
+ else {
+ get_dat1(x);
+
+ if (f_negative_p(dat->imag))
+ return f_conj(m_sqrt(f_conj(x)));
+ else {
+ VALUE a = f_abs(x);
+ return f_complex_new2(rb_cComplex,
+ m_sqrt_bang(f_div(f_add(a, dat->real), TWO)),
+ m_sqrt_bang(f_div(f_sub(a, dat->real), TWO)));
+ }
+ }
+}
+#endif
+
static VALUE
f_complex_polar(VALUE klass, VALUE x, VALUE y)
{
- assert(!RB_TYPE_P(x, T_COMPLEX));
- assert(!RB_TYPE_P(y, T_COMPLEX));
+ assert(!k_complex_p(x));
+ assert(!k_complex_p(y));
if (f_zero_p(x) || f_zero_p(y)) {
if (canonicalization) return x;
return nucomp_s_new_internal(klass, x, RFLOAT_0);
@@ -578,28 +604,6 @@ f_complex_polar(VALUE klass, VALUE x, VALUE y)
f_mul(x, m_sin(y)));
}
-/* returns a Complex or Float of ang*PI-rotated abs */
-VALUE
-rb_dbl_complex_new_polar_pi(double abs, double ang)
-{
- double fi;
- const double fr = modf(ang, &fi);
- int pos = fr == +0.5;
-
- if (pos || fr == -0.5) {
- if ((modf(fi / 2.0, &fi) != fr) ^ pos) abs = -abs;
- return rb_complex_new(RFLOAT_0, DBL2NUM(abs));
- }
- else if (fr == 0.0) {
- if (modf(fi / 2.0, &fi) != 0.0) abs = -abs;
- return DBL2NUM(abs);
- }
- else {
- ang *= M_PI;
- return rb_complex_new(DBL2NUM(abs * cos(ang)), DBL2NUM(abs * sin(ang)));
- }
-}
-
/*
* call-seq:
* Complex.polar(abs[, arg]) -> complex
@@ -638,8 +642,8 @@ nucomp_s_polar(int argc, VALUE *argv, VALUE klass)
* Complex(7).real #=> 7
* Complex(9, -4).real #=> 9
*/
-VALUE
-rb_complex_real(VALUE self)
+static VALUE
+nucomp_real(VALUE self)
{
get_dat1(self);
return dat->real;
@@ -655,8 +659,8 @@ rb_complex_real(VALUE self)
* Complex(7).imaginary #=> 0
* Complex(9, -4).imaginary #=> -4
*/
-VALUE
-rb_complex_imag(VALUE self)
+static VALUE
+nucomp_imag(VALUE self)
{
get_dat1(self);
return dat->imag;
@@ -670,12 +674,35 @@ rb_complex_imag(VALUE self)
*
* -Complex(1, 2) #=> (-1-2i)
*/
-VALUE
-rb_complex_uminus(VALUE self)
+static VALUE
+nucomp_negate(VALUE self)
{
- get_dat1(self);
- return f_complex_new2(CLASS_OF(self),
- f_negate(dat->real), f_negate(dat->imag));
+ get_dat1(self);
+ return f_complex_new2(CLASS_OF(self),
+ f_negate(dat->real), f_negate(dat->imag));
+}
+
+inline static VALUE
+f_addsub(VALUE self, VALUE other,
+ VALUE (*func)(VALUE, VALUE), ID id)
+{
+ if (k_complex_p(other)) {
+ VALUE real, imag;
+
+ get_dat2(self, other);
+
+ real = (*func)(adat->real, bdat->real);
+ imag = (*func)(adat->imag, bdat->imag);
+
+ return f_complex_new2(CLASS_OF(self), real, imag);
+ }
+ if (k_numeric_p(other) && f_real_p(other)) {
+ get_dat1(self);
+
+ return f_complex_new2(CLASS_OF(self),
+ (*func)(dat->real, other), dat->imag);
+ }
+ return rb_num_coerce_bin(self, other, id);
}
/*
@@ -691,26 +718,11 @@ rb_complex_uminus(VALUE self)
* Complex(20, 9) + 9.8 #=> (29.8+9i)
*/
VALUE
-rb_complex_plus(VALUE self, VALUE other)
+rb_nucomp_add(VALUE self, VALUE other)
{
- if (RB_TYPE_P(other, T_COMPLEX)) {
- VALUE real, imag;
-
- get_dat2(self, other);
-
- real = f_add(adat->real, bdat->real);
- imag = f_add(adat->imag, bdat->imag);
-
- return f_complex_new2(CLASS_OF(self), real, imag);
- }
- if (k_numeric_p(other) && f_real_p(other)) {
- get_dat1(self);
-
- return f_complex_new2(CLASS_OF(self),
- f_add(dat->real, other), dat->imag);
- }
- return rb_num_coerce_bin(self, other, '+');
+ return f_addsub(self, other, f_add, '+');
}
+#define nucomp_add rb_nucomp_add
/*
* call-seq:
@@ -724,26 +736,10 @@ rb_complex_plus(VALUE self, VALUE other)
* Complex(9, 8) - 4 #=> (5+8i)
* Complex(20, 9) - 9.8 #=> (10.2+9i)
*/
-VALUE
-rb_complex_minus(VALUE self, VALUE other)
+static VALUE
+nucomp_sub(VALUE self, VALUE other)
{
- if (RB_TYPE_P(other, T_COMPLEX)) {
- VALUE real, imag;
-
- get_dat2(self, other);
-
- real = f_sub(adat->real, bdat->real);
- imag = f_sub(adat->imag, bdat->imag);
-
- return f_complex_new2(CLASS_OF(self), real, imag);
- }
- if (k_numeric_p(other) && f_real_p(other)) {
- get_dat1(self);
-
- return f_complex_new2(CLASS_OF(self),
- f_sub(dat->real, other), dat->imag);
- }
- return rb_num_coerce_bin(self, other, '-');
+ return f_addsub(self, other, f_sub, '-');
}
static VALUE
@@ -759,19 +755,6 @@ safe_mul(VALUE a, VALUE b, int az, int bz)
return f_mul(a, b);
}
-static void
-comp_mul(VALUE areal, VALUE aimag, VALUE breal, VALUE bimag, VALUE *real, VALUE *imag)
-{
- int arzero = f_zero_p(areal);
- int aizero = f_zero_p(aimag);
- int brzero = f_zero_p(breal);
- int bizero = f_zero_p(bimag);
- *real = f_sub(safe_mul(areal, breal, arzero, brzero),
- safe_mul(aimag, bimag, aizero, bizero));
- *imag = f_add(safe_mul(areal, bimag, arzero, bizero),
- safe_mul(aimag, breal, aizero, brzero));
-}
-
/*
* call-seq:
* cmp * numeric -> complex
@@ -785,13 +768,23 @@ comp_mul(VALUE areal, VALUE aimag, VALUE breal, VALUE bimag, VALUE *real, VALUE
* Complex(20, 9) * 9.8 #=> (196.0+88.2i)
*/
VALUE
-rb_complex_mul(VALUE self, VALUE other)
+rb_nucomp_mul(VALUE self, VALUE other)
{
- if (RB_TYPE_P(other, T_COMPLEX)) {
+ if (k_complex_p(other)) {
VALUE real, imag;
+ VALUE areal, aimag, breal, bimag;
+ int arzero, aizero, brzero, bizero;
+
get_dat2(self, other);
- comp_mul(adat->real, adat->imag, bdat->real, bdat->imag, &real, &imag);
+ arzero = !!f_zero_p(areal = adat->real);
+ aizero = !!f_zero_p(aimag = adat->imag);
+ brzero = !!f_zero_p(breal = bdat->real);
+ bizero = !!f_zero_p(bimag = bdat->imag);
+ real = f_sub(safe_mul(areal, breal, arzero, brzero),
+ safe_mul(aimag, bimag, aizero, bizero));
+ imag = f_add(safe_mul(areal, bimag, arzero, bizero),
+ safe_mul(aimag, breal, aizero, brzero));
return f_complex_new2(CLASS_OF(self), real, imag);
}
@@ -804,42 +797,49 @@ rb_complex_mul(VALUE self, VALUE other)
}
return rb_num_coerce_bin(self, other, '*');
}
+#define nucomp_mul rb_nucomp_mul
inline static VALUE
f_divide(VALUE self, VALUE other,
VALUE (*func)(VALUE, VALUE), ID id)
{
- if (RB_TYPE_P(other, T_COMPLEX)) {
- VALUE r, n, x, y;
+ if (k_complex_p(other)) {
int flo;
get_dat2(self, other);
- flo = (RB_FLOAT_TYPE_P(adat->real) || RB_FLOAT_TYPE_P(adat->imag) ||
- RB_FLOAT_TYPE_P(bdat->real) || RB_FLOAT_TYPE_P(bdat->imag));
+ flo = (k_float_p(adat->real) || k_float_p(adat->imag) ||
+ k_float_p(bdat->real) || k_float_p(bdat->imag));
if (f_gt_p(f_abs(bdat->real), f_abs(bdat->imag))) {
+ VALUE r, n;
+
r = (*func)(bdat->imag, bdat->real);
n = f_mul(bdat->real, f_add(ONE, f_mul(r, r)));
if (flo)
return f_complex_new2(CLASS_OF(self),
(*func)(self, n),
(*func)(f_negate(f_mul(self, r)), n));
- x = (*func)(f_add(adat->real, f_mul(adat->imag, r)), n);
- y = (*func)(f_sub(adat->imag, f_mul(adat->real, r)), n);
+ return f_complex_new2(CLASS_OF(self),
+ (*func)(f_add(adat->real,
+ f_mul(adat->imag, r)), n),
+ (*func)(f_sub(adat->imag,
+ f_mul(adat->real, r)), n));
}
else {
+ VALUE r, n;
+
r = (*func)(bdat->real, bdat->imag);
n = f_mul(bdat->imag, f_add(ONE, f_mul(r, r)));
if (flo)
return f_complex_new2(CLASS_OF(self),
(*func)(f_mul(self, r), n),
(*func)(f_negate(self), n));
- x = (*func)(f_add(f_mul(adat->real, r), adat->imag), n);
- y = (*func)(f_sub(f_mul(adat->imag, r), adat->real), n);
+ return f_complex_new2(CLASS_OF(self),
+ (*func)(f_add(f_mul(adat->real, r),
+ adat->imag), n),
+ (*func)(f_sub(f_mul(adat->imag, r),
+ adat->real), n));
}
- x = rb_rational_canonicalize(x);
- y = rb_rational_canonicalize(y);
- return f_complex_new2(CLASS_OF(self), x, y);
}
if (k_numeric_p(other) && f_real_p(other)) {
get_dat1(self);
@@ -866,13 +866,13 @@ f_divide(VALUE self, VALUE other,
* Complex(9, 8) / 4 #=> ((9/4)+(2/1)*i)
* Complex(20, 9) / 9.8 #=> (2.0408163265306123+0.9183673469387754i)
*/
-VALUE
-rb_complex_div(VALUE self, VALUE other)
+static VALUE
+nucomp_div(VALUE self, VALUE other)
{
return f_divide(self, other, f_quo, id_quo);
}
-#define nucomp_quo rb_complex_div
+#define nucomp_quo nucomp_div
/*
* call-seq:
@@ -903,23 +903,23 @@ f_reciprocal(VALUE x)
* Complex('i') ** 2 #=> (-1+0i)
* Complex(-8) ** Rational(1, 3) #=> (1.0000000000000002+1.7320508075688772i)
*/
-VALUE
-rb_complex_pow(VALUE self, VALUE other)
+static VALUE
+nucomp_expt(VALUE self, VALUE other)
{
if (k_numeric_p(other) && k_exact_zero_p(other))
return f_complex_new_bang1(CLASS_OF(self), ONE);
- if (RB_TYPE_P(other, T_RATIONAL) && RRATIONAL(other)->den == LONG2FIX(1))
- other = RRATIONAL(other)->num; /* c14n */
+ if (k_rational_p(other) && f_one_p(f_denominator(other)))
+ other = f_numerator(other); /* c14n */
- if (RB_TYPE_P(other, T_COMPLEX)) {
+ if (k_complex_p(other)) {
get_dat1(other);
if (k_exact_zero_p(dat->imag))
other = dat->real; /* c14n */
}
- if (RB_TYPE_P(other, T_COMPLEX)) {
+ if (k_complex_p(other)) {
VALUE r, theta, nr, ntheta;
get_dat1(other);
@@ -933,51 +933,44 @@ rb_complex_pow(VALUE self, VALUE other)
f_mul(dat->imag, m_log_bang(r)));
return f_complex_polar(CLASS_OF(self), nr, ntheta);
}
- if (FIXNUM_P(other)) {
- long n = FIX2LONG(other);
- if (n == 0) {
- return nucomp_s_new_internal(CLASS_OF(self), ONE, ZERO);
- }
- if (n < 0) {
- self = f_reciprocal(self);
- other = rb_int_uminus(other);
- n = -n;
- }
- {
- get_dat1(self);
- VALUE xr = dat->real, xi = dat->imag, zr = xr, zi = xi;
-
- if (f_zero_p(xi)) {
- zr = rb_num_pow(zr, other);
- }
- else if (f_zero_p(xr)) {
- zi = rb_num_pow(zi, other);
- if (n & 2) zi = f_negate(zi);
- if (!(n & 1)) {
- VALUE tmp = zr;
- zr = zi;
- zi = tmp;
- }
- }
- else {
- while (--n) {
- long q, r;
-
- for (; q = n / 2, r = n % 2, r == 0; n = q) {
- VALUE tmp = f_sub(f_mul(xr, xr), f_mul(xi, xi));
- xi = f_mul(f_mul(TWO, xr), xi);
- xr = tmp;
- }
- comp_mul(zr, zi, xr, xi, &zr, &zi);
- }
- }
- return nucomp_s_new_internal(CLASS_OF(self), zr, zi);
+ if (k_fixnum_p(other)) {
+ if (f_gt_p(other, ZERO)) {
+ VALUE x, z;
+ long n;
+
+ x = self;
+ z = x;
+ n = FIX2LONG(other) - 1;
+
+ while (n) {
+ long q, r;
+
+ while (1) {
+ get_dat1(x);
+
+ q = n / 2;
+ r = n % 2;
+
+ if (r)
+ break;
+
+ x = nucomp_s_new_internal(CLASS_OF(self),
+ f_sub(f_mul(dat->real, dat->real),
+ f_mul(dat->imag, dat->imag)),
+ f_mul(f_mul(TWO, dat->real), dat->imag));
+ n = q;
+ }
+ z = f_mul(z, x);
+ n--;
+ }
+ return z;
}
+ return f_expt(f_reciprocal(self), f_negate(other));
}
if (k_numeric_p(other) && f_real_p(other)) {
VALUE r, theta;
- if (RB_TYPE_P(other, T_BIGNUM))
+ if (k_bignum_p(other))
rb_warn("in a**b, b may be too big");
r = f_abs(self);
@@ -1004,7 +997,7 @@ rb_complex_pow(VALUE self, VALUE other)
static VALUE
nucomp_eqeq_p(VALUE self, VALUE other)
{
- if (RB_TYPE_P(other, T_COMPLEX)) {
+ if (k_complex_p(other)) {
get_dat2(self, other);
return f_boolcast(f_eqeq_p(adat->real, bdat->real) &&
@@ -1015,7 +1008,7 @@ nucomp_eqeq_p(VALUE self, VALUE other)
return f_boolcast(f_eqeq_p(dat->real, other) && f_zero_p(dat->imag));
}
- return f_boolcast(f_eqeq_p(other, self));
+ return f_eqeq_p(other, self);
}
/* :nodoc: */
@@ -1042,24 +1035,24 @@ nucomp_coerce(VALUE self, VALUE other)
* Complex(-1).abs #=> 1
* Complex(3.0, -4.0).abs #=> 5.0
*/
-VALUE
-rb_complex_abs(VALUE self)
+static VALUE
+nucomp_abs(VALUE self)
{
get_dat1(self);
if (f_zero_p(dat->real)) {
VALUE a = f_abs(dat->imag);
- if (RB_FLOAT_TYPE_P(dat->real) && !RB_FLOAT_TYPE_P(dat->imag))
+ if (k_float_p(dat->real) && !k_float_p(dat->imag))
a = f_to_f(a);
return a;
}
if (f_zero_p(dat->imag)) {
VALUE a = f_abs(dat->real);
- if (!RB_FLOAT_TYPE_P(dat->real) && RB_FLOAT_TYPE_P(dat->imag))
+ if (!k_float_p(dat->real) && k_float_p(dat->imag))
a = f_to_f(a);
return a;
}
- return rb_math_hypot(dat->real, dat->imag);
+ return m_hypot(dat->real, dat->imag);
}
/*
@@ -1089,11 +1082,11 @@ nucomp_abs2(VALUE self)
*
* Complex.polar(3, Math::PI/2).arg #=> 1.5707963267948966
*/
-VALUE
-rb_complex_arg(VALUE self)
+static VALUE
+nucomp_arg(VALUE self)
{
get_dat1(self);
- return rb_math_atan2(dat->imag, dat->real);
+ return m_atan2_bang(dat->imag, dat->real);
}
/*
@@ -1135,13 +1128,22 @@ nucomp_polar(VALUE self)
*
* Complex(1, 2).conjugate #=> (1-2i)
*/
-VALUE
-rb_complex_conjugate(VALUE self)
+static VALUE
+nucomp_conj(VALUE self)
{
get_dat1(self);
return f_complex_new2(CLASS_OF(self), dat->real, f_negate(dat->imag));
}
+#if 0
+/* :nodoc: */
+static VALUE
+nucomp_true(VALUE self)
+{
+ return Qtrue;
+}
+#endif
+
/*
* call-seq:
* cmp.real? -> false
@@ -1154,6 +1156,23 @@ nucomp_false(VALUE self)
return Qfalse;
}
+#if 0
+/* :nodoc: */
+static VALUE
+nucomp_exact_p(VALUE self)
+{
+ get_dat1(self);
+ return f_boolcast(k_exact_p(dat->real) && k_exact_p(dat->imag));
+}
+
+/* :nodoc: */
+static VALUE
+nucomp_inexact_p(VALUE self)
+{
+ return f_boolcast(!nucomp_exact_p(self));
+}
+#endif
+
/*
* call-seq:
* cmp.denominator -> integer
@@ -1215,14 +1234,14 @@ nucomp_hash(VALUE self)
n = rb_hash(dat->imag);
h[1] = NUM2LONG(n);
v = rb_memhash(h, sizeof(h));
- return ST2FIX(v);
+ return LONG2FIX(v);
}
/* :nodoc: */
static VALUE
nucomp_eql_p(VALUE self, VALUE other)
{
- if (RB_TYPE_P(other, T_COMPLEX)) {
+ if (k_complex_p(other)) {
get_dat2(self, other);
return f_boolcast((CLASS_OF(adat->real) == CLASS_OF(bdat->real)) &&
@@ -1233,27 +1252,26 @@ nucomp_eql_p(VALUE self, VALUE other)
return Qfalse;
}
-inline static int
+inline static VALUE
f_signbit(VALUE x)
{
- if (RB_FLOAT_TYPE_P(x)) {
+ if (RB_TYPE_P(x, T_FLOAT)) {
double f = RFLOAT_VALUE(x);
- return !isnan(f) && signbit(f);
+ return f_boolcast(!isnan(f) && signbit(f));
}
return f_negative_p(x);
}
-inline static int
+inline static VALUE
f_tpositive_p(VALUE x)
{
- return !f_signbit(x);
+ return f_boolcast(!f_signbit(x));
}
static VALUE
f_format(VALUE self, VALUE (*func)(VALUE))
{
- VALUE s;
- int impos;
+ VALUE s, impos;
get_dat1(self);
@@ -1312,49 +1330,6 @@ nucomp_inspect(VALUE self)
return s;
}
-#define FINITE_TYPE_P(v) (RB_INTEGER_TYPE_P(v) || RB_TYPE_P(v, T_RATIONAL))
-
-/*
- * call-seq:
- * cmp.finite? -> true or false
- *
- * Returns +true+ if +cmp+'s real and imaginary parts are both finite numbers,
- * otherwise returns +false+.
- */
-static VALUE
-rb_complex_finite_p(VALUE self)
-{
- get_dat1(self);
-
- if (f_finite_p(dat->real) && f_finite_p(dat->imag)) {
- return Qtrue;
- }
- return Qfalse;
-}
-
-/*
- * call-seq:
- * cmp.infinite? -> nil or 1
- *
- * Returns +1+ if +cmp+'s real or imaginary part is an infinite number,
- * otherwise returns +nil+.
- *
- * For example:
- *
- * (1+1i).infinite? #=> nil
- * (Float::INFINITY + 1i).infinite? #=> 1
- */
-static VALUE
-rb_complex_infinite_p(VALUE self)
-{
- get_dat1(self);
-
- if (NIL_P(f_infinite_p(dat->real)) && NIL_P(f_infinite_p(dat->imag))) {
- return Qnil;
- }
- return ONE;
-}
-
/* :nodoc: */
static VALUE
nucomp_dumper(VALUE self)
@@ -1370,7 +1345,6 @@ nucomp_loader(VALUE self, VALUE a)
RCOMPLEX_SET_REAL(dat, rb_ivar_get(a, id_i_real));
RCOMPLEX_SET_IMAG(dat, rb_ivar_get(a, id_i_imag));
- OBJ_FREEZE_RAW(self);
return self;
}
@@ -1414,16 +1388,12 @@ rb_complex_new(VALUE x, VALUE y)
}
VALUE
-rb_complex_new_polar(VALUE x, VALUE y)
+rb_complex_polar(VALUE x, VALUE y)
{
return f_complex_polar(rb_cComplex, x, y);
}
-VALUE
-rb_complex_polar(VALUE x, VALUE y)
-{
- return rb_complex_new_polar(x, y);
-}
+static VALUE nucomp_s_convert(int argc, VALUE *argv, VALUE klass);
VALUE
rb_Complex(VALUE x, VALUE y)
@@ -1434,17 +1404,18 @@ rb_Complex(VALUE x, VALUE y)
return nucomp_s_convert(2, a, rb_cComplex);
}
-/*!
- * Creates a Complex object.
- *
- * \param real real part value
- * \param imag imaginary part value
- * \return a new Complex object
- */
VALUE
-rb_dbl_complex_new(double real, double imag)
+rb_complex_set_real(VALUE cmp, VALUE r)
+{
+ RCOMPLEX_SET_REAL(cmp, r);
+ return cmp;
+}
+
+VALUE
+rb_complex_set_imag(VALUE cmp, VALUE i)
{
- return rb_complex_raw(DBL2NUM(real), DBL2NUM(imag));
+ RCOMPLEX_SET_REAL(cmp, i);
+ return cmp;
}
/*
@@ -1536,13 +1507,13 @@ nucomp_rationalize(int argc, VALUE *argv, VALUE self)
{
get_dat1(self);
- rb_check_arity(argc, 0, 1);
+ rb_scan_args(argc, argv, "01", NULL);
if (!k_exact_zero_p(dat->imag)) {
rb_raise(rb_eRangeError, "can't convert %"PRIsVALUE" into Rational",
self);
}
- return rb_funcallv(dat->real, id_rationalize, argc, argv);
+ return rb_funcall2(dat->real, rb_intern("rationalize"), argc, argv);
}
/*
@@ -1782,7 +1753,7 @@ read_comp(const char **s, int strict,
return 0; /* e.g. "1@-" */
}
num2 = str2num(bb);
- *ret = rb_complex_new_polar(num, num2);
+ *ret = rb_complex_polar(num, num2);
if (!st)
return 0; /* e.g. "1@2." */
else
@@ -1825,7 +1796,8 @@ skip_ws(const char **s)
}
static int
-parse_comp(const char *s, int strict, VALUE *num)
+parse_comp(const char *s, int strict,
+ VALUE *num)
{
char *buf, *b;
VALUE tmp;
@@ -1836,14 +1808,14 @@ parse_comp(const char *s, int strict, VALUE *num)
skip_ws(&s);
if (!read_comp(&s, strict, num, &b)) {
- ret = 0;
+ ret = 0;
}
else {
- skip_ws(&s);
+ skip_ws(&s);
- if (strict)
- if (*s != '\0')
- ret = 0;
+ if (strict)
+ if (*s != '\0')
+ ret = 0;
}
ALLOCV_END(tmp);
@@ -1851,7 +1823,7 @@ parse_comp(const char *s, int strict, VALUE *num)
}
static VALUE
-string_to_c_strict(VALUE self, int raise)
+string_to_c_strict(VALUE self)
{
char *s;
VALUE num;
@@ -1860,10 +1832,8 @@ string_to_c_strict(VALUE self, int raise)
s = RSTRING_PTR(self);
- if (!s || memchr(s, '\0', RSTRING_LEN(self))) {
- if (!raise) return Qnil;
+ if (!s || memchr(s, '\0', RSTRING_LEN(self)))
rb_raise(rb_eArgError, "string contains null byte");
- }
if (s && s[RSTRING_LEN(self)]) {
rb_str_modify(self);
@@ -1875,7 +1845,6 @@ string_to_c_strict(VALUE self, int raise)
s = (char *)"";
if (!parse_comp(s, 1, &num)) {
- if (!raise) return Qnil;
rb_raise(rb_eArgError, "invalid value for convert(): %+"PRIsVALUE,
self);
}
@@ -1931,29 +1900,28 @@ string_to_c(VALUE self)
}
static VALUE
-to_complex(VALUE val)
+nucomp_s_convert(int argc, VALUE *argv, VALUE klass)
{
- return rb_convert_type(val, T_COMPLEX, "Complex", "to_c");
-}
+ VALUE a1, a2, backref;
-static VALUE
-nucomp_convert(VALUE klass, VALUE a1, VALUE a2, int raise)
-{
- if (NIL_P(a1) || NIL_P(a2)) {
- if (!raise) return Qnil;
+ rb_scan_args(argc, argv, "11", &a1, &a2);
+
+ if (NIL_P(a1) || (argc == 2 && NIL_P(a2)))
rb_raise(rb_eTypeError, "can't convert nil into Complex");
- }
+
+ backref = rb_backref_get();
+ rb_match_busy(backref);
if (RB_TYPE_P(a1, T_STRING)) {
- a1 = string_to_c_strict(a1, raise);
- if (NIL_P(a1)) return Qnil;
+ a1 = string_to_c_strict(a1);
}
if (RB_TYPE_P(a2, T_STRING)) {
- a2 = string_to_c_strict(a2, raise);
- if (NIL_P(a2)) return Qnil;
+ a2 = string_to_c_strict(a2);
}
+ rb_backref_set(backref);
+
if (RB_TYPE_P(a1, T_COMPLEX)) {
{
get_dat1(a1);
@@ -1973,19 +1941,16 @@ nucomp_convert(VALUE klass, VALUE a1, VALUE a2, int raise)
}
if (RB_TYPE_P(a1, T_COMPLEX)) {
- if (a2 == Qundef || (k_exact_zero_p(a2)))
+ if (argc == 1 || (k_exact_zero_p(a2)))
return a1;
}
- if (a2 == Qundef) {
+ if (argc == 1) {
if (k_numeric_p(a1) && !f_real_p(a1))
return a1;
/* should raise exception for consistency */
- if (!k_numeric_p(a1)) {
- if (!raise)
- return rb_protect(to_complex, a1, NULL);
- return to_complex(a1);
- }
+ if (!k_numeric_p(a1))
+ return rb_convert_type(a1, T_COMPLEX, "Complex", "to_c");
}
else {
if ((k_numeric_p(a1) && k_numeric_p(a2)) &&
@@ -1996,35 +1961,13 @@ nucomp_convert(VALUE klass, VALUE a1, VALUE a2, int raise)
}
{
- int argc;
VALUE argv2[2];
argv2[0] = a1;
- if (a2 == Qundef) {
- argv2[1] = Qnil;
- argc = 1;
- }
- else {
- if (!raise && !RB_INTEGER_TYPE_P(a2) && !RB_FLOAT_TYPE_P(a2) && !RB_TYPE_P(a2, T_RATIONAL))
- return Qnil;
- argv2[1] = a2;
- argc = 2;
- }
+ argv2[1] = a2;
return nucomp_s_new(argc, argv2, klass);
}
}
-static VALUE
-nucomp_s_convert(int argc, VALUE *argv, VALUE klass)
-{
- VALUE a1, a2;
-
- if (rb_scan_args(argc, argv, "11", &a1, &a2) == 1) {
- a2 = Qundef;
- }
-
- return nucomp_convert(klass, a1, a2, TRUE);
-}
-
/* --- */
/*
@@ -2064,6 +2007,8 @@ numeric_abs2(VALUE self)
return f_mul(self, self);
}
+#define id_PI rb_intern("PI")
+
/*
* call-seq:
* num.arg -> 0 or float
@@ -2076,8 +2021,8 @@ static VALUE
numeric_arg(VALUE self)
{
if (f_positive_p(self))
- return INT2FIX(0);
- return DBL2NUM(M_PI);
+ return INT2FIX(0);
+ return rb_const_get(rb_mMath, id_PI);
}
/*
@@ -2093,8 +2038,6 @@ numeric_rect(VALUE self)
return rb_assoc_new(self, INT2FIX(0));
}
-static VALUE float_arg(VALUE self);
-
/*
* call-seq:
* num.polar -> array
@@ -2104,25 +2047,7 @@ static VALUE float_arg(VALUE self);
static VALUE
numeric_polar(VALUE self)
{
- VALUE abs, arg;
-
- if (RB_INTEGER_TYPE_P(self)) {
- abs = rb_int_abs(self);
- arg = numeric_arg(self);
- }
- else if (RB_FLOAT_TYPE_P(self)) {
- abs = rb_float_abs(self);
- arg = float_arg(self);
- }
- else if (RB_TYPE_P(self, T_RATIONAL)) {
- abs = rb_rational_abs(self);
- arg = numeric_arg(self);
- }
- else {
- abs = f_abs(self);
- arg = f_arg(self);
- }
- return rb_assoc_new(abs, arg);
+ return rb_assoc_new(f_abs(self), f_arg(self));
}
/*
@@ -2196,26 +2121,36 @@ Init_Complex(void)
#undef rb_intern
#define rb_intern(str) rb_intern_const(str)
+ assert(fprintf(stderr, "assert() is now active\n"));
+
id_abs = rb_intern("abs");
id_arg = rb_intern("arg");
+ id_convert = rb_intern("convert");
id_denominator = rb_intern("denominator");
+ id_eqeq_p = rb_intern("==");
+ id_expt = rb_intern("**");
id_fdiv = rb_intern("fdiv");
+ id_negate = rb_intern("-@");
id_numerator = rb_intern("numerator");
id_quo = rb_intern("quo");
id_real_p = rb_intern("real?");
+ id_to_f = rb_intern("to_f");
+ id_to_i = rb_intern("to_i");
+ id_to_r = rb_intern("to_r");
id_i_real = rb_intern("@real");
id_i_imag = rb_intern("@image"); /* @image, not @imag */
- id_finite_p = rb_intern("finite?");
- id_infinite_p = rb_intern("infinite?");
- id_rationalize = rb_intern("rationalize");
- id_PI = rb_intern("PI");
rb_cComplex = rb_define_class("Complex", rb_cNumeric);
rb_define_alloc_func(rb_cComplex, nucomp_s_alloc);
rb_undef_method(CLASS_OF(rb_cComplex), "allocate");
+#if 0
+ rb_define_private_method(CLASS_OF(rb_cComplex), "new!", nucomp_s_new_bang, -1);
+ rb_define_private_method(CLASS_OF(rb_cComplex), "new", nucomp_s_new, -1);
+#else
rb_undef_method(CLASS_OF(rb_cComplex), "new");
+#endif
rb_define_singleton_method(rb_cComplex, "rectangular", nucomp_s_new, -1);
rb_define_singleton_method(rb_cComplex, "rect", nucomp_s_new, -1);
@@ -2223,9 +2158,13 @@ Init_Complex(void)
rb_define_global_function("Complex", nucomp_f_complex, -1);
- rb_undef_methods_from(rb_cComplex, rb_mComparable);
rb_undef_method(rb_cComplex, "%");
+ rb_undef_method(rb_cComplex, "<");
+ rb_undef_method(rb_cComplex, "<=");
rb_undef_method(rb_cComplex, "<=>");
+ rb_undef_method(rb_cComplex, ">");
+ rb_undef_method(rb_cComplex, ">=");
+ rb_undef_method(rb_cComplex, "between?");
rb_undef_method(rb_cComplex, "div");
rb_undef_method(rb_cComplex, "divmod");
rb_undef_method(rb_cComplex, "floor");
@@ -2237,35 +2176,43 @@ Init_Complex(void)
rb_undef_method(rb_cComplex, "truncate");
rb_undef_method(rb_cComplex, "i");
- rb_define_method(rb_cComplex, "real", rb_complex_real, 0);
- rb_define_method(rb_cComplex, "imaginary", rb_complex_imag, 0);
- rb_define_method(rb_cComplex, "imag", rb_complex_imag, 0);
+ rb_define_method(rb_cComplex, "real", nucomp_real, 0);
+ rb_define_method(rb_cComplex, "imaginary", nucomp_imag, 0);
+ rb_define_method(rb_cComplex, "imag", nucomp_imag, 0);
- rb_define_method(rb_cComplex, "-@", rb_complex_uminus, 0);
- rb_define_method(rb_cComplex, "+", rb_complex_plus, 1);
- rb_define_method(rb_cComplex, "-", rb_complex_minus, 1);
- rb_define_method(rb_cComplex, "*", rb_complex_mul, 1);
- rb_define_method(rb_cComplex, "/", rb_complex_div, 1);
+ rb_define_method(rb_cComplex, "-@", nucomp_negate, 0);
+ rb_define_method(rb_cComplex, "+", nucomp_add, 1);
+ rb_define_method(rb_cComplex, "-", nucomp_sub, 1);
+ rb_define_method(rb_cComplex, "*", nucomp_mul, 1);
+ rb_define_method(rb_cComplex, "/", nucomp_div, 1);
rb_define_method(rb_cComplex, "quo", nucomp_quo, 1);
rb_define_method(rb_cComplex, "fdiv", nucomp_fdiv, 1);
- rb_define_method(rb_cComplex, "**", rb_complex_pow, 1);
+ rb_define_method(rb_cComplex, "**", nucomp_expt, 1);
rb_define_method(rb_cComplex, "==", nucomp_eqeq_p, 1);
rb_define_method(rb_cComplex, "coerce", nucomp_coerce, 1);
- rb_define_method(rb_cComplex, "abs", rb_complex_abs, 0);
- rb_define_method(rb_cComplex, "magnitude", rb_complex_abs, 0);
+ rb_define_method(rb_cComplex, "abs", nucomp_abs, 0);
+ rb_define_method(rb_cComplex, "magnitude", nucomp_abs, 0);
rb_define_method(rb_cComplex, "abs2", nucomp_abs2, 0);
- rb_define_method(rb_cComplex, "arg", rb_complex_arg, 0);
- rb_define_method(rb_cComplex, "angle", rb_complex_arg, 0);
- rb_define_method(rb_cComplex, "phase", rb_complex_arg, 0);
+ rb_define_method(rb_cComplex, "arg", nucomp_arg, 0);
+ rb_define_method(rb_cComplex, "angle", nucomp_arg, 0);
+ rb_define_method(rb_cComplex, "phase", nucomp_arg, 0);
rb_define_method(rb_cComplex, "rectangular", nucomp_rect, 0);
rb_define_method(rb_cComplex, "rect", nucomp_rect, 0);
rb_define_method(rb_cComplex, "polar", nucomp_polar, 0);
- rb_define_method(rb_cComplex, "conjugate", rb_complex_conjugate, 0);
- rb_define_method(rb_cComplex, "conj", rb_complex_conjugate, 0);
+ rb_define_method(rb_cComplex, "conjugate", nucomp_conj, 0);
+ rb_define_method(rb_cComplex, "conj", nucomp_conj, 0);
+#if 0
+ rb_define_method(rb_cComplex, "~", nucomp_conj, 0); /* gcc */
+#endif
rb_define_method(rb_cComplex, "real?", nucomp_false, 0);
+#if 0
+ rb_define_method(rb_cComplex, "complex?", nucomp_true, 0);
+ rb_define_method(rb_cComplex, "exact?", nucomp_exact_p, 0);
+ rb_define_method(rb_cComplex, "inexact?", nucomp_inexact_p, 0);
+#endif
rb_define_method(rb_cComplex, "numerator", nucomp_numerator, 0);
rb_define_method(rb_cComplex, "denominator", nucomp_denominator, 0);
@@ -2279,12 +2226,8 @@ Init_Complex(void)
rb_undef_method(rb_cComplex, "positive?");
rb_undef_method(rb_cComplex, "negative?");
- rb_define_method(rb_cComplex, "finite?", rb_complex_finite_p, 0);
- rb_define_method(rb_cComplex, "infinite?", rb_complex_infinite_p, 0);
-
rb_define_private_method(rb_cComplex, "marshal_dump", nucomp_marshal_dump, 0);
- /* :nodoc: */
- compat = rb_define_class_under(rb_cComplex, "compatible", rb_cObject);
+ compat = rb_define_class_under(rb_cComplex, "compatible", rb_cObject); /* :nodoc: */
rb_define_private_method(compat, "marshal_load", nucomp_marshal_load, 1);
rb_marshal_define_compat(rb_cComplex, compat, nucomp_dumper, nucomp_loader);
@@ -2327,10 +2270,6 @@ Init_Complex(void)
rb_define_const(rb_cComplex, "I",
f_complex_new_bang2(rb_cComplex, ZERO, ONE));
-#if !USE_FLONUM
- rb_gc_register_mark_object(RFLOAT_0 = DBL2NUM(0.0));
-#endif
-
rb_provide("complex.so"); /* for backward compatibility */
}
diff --git a/configure.ac b/configure.ac
deleted file mode 100644
index 2c4d2888d2..0000000000
--- a/configure.ac
+++ /dev/null
@@ -1,4061 +0,0 @@
-dnl Process this file with autoconf to produce a configure script.
-AC_INIT()
-{
-AC_CONFIG_AUX_DIR(tool)
-AC_CONFIG_MACRO_DIRS(tool/m4)
-
-AC_PREREQ(2.67)
-
-dnl override AC_CHECKING
-dnl placed here due to aclocal(1)'s
-dnl ignoring this definition in separate files
-AC_DEFUN([AC_CHECKING],[dnl
-AC_REQUIRE([_COLORIZE_RESULT_PREPARE])dnl
-AS_MESSAGE([checking ${msg_checking}$1${msg_reset}...])])dnl
-
-AC_DISABLE_OPTION_CHECKING
-
-AC_ARG_VAR([cflags], [additional CFLAGS (ignored when CFLAGS is given)])
-AC_ARG_VAR([cppflags], [additional CPPFLAGS (ignored when CPPFLAGS is given)])
-AC_ARG_VAR([cxxflags], [additional CXXFLAGS (ignored when CXXFLAGS is given)])
-
-: "environment section" && {
-HAVE_BASERUBY=yes
-AC_ARG_WITH(baseruby,
- AS_HELP_STRING([--with-baseruby=RUBY], [use RUBY as baseruby; RUBY is the pathname of ruby]),
- [AS_CASE(["$withval"],
- [*ruby*],[BASERUBY=$withval],
- [no],[HAVE_BASERUBY=no],
- [AC_MSG_ERROR(need ruby)])
- ],
- [
- AC_PATH_PROG([BASERUBY], [ruby], [false])
- ])
-AS_IF([test "$HAVE_BASERUBY" = yes -a "`RUBYOPT=- $BASERUBY -e 'print 42' 2>/dev/null`" = 42], [
- AS_IF([test "`RUBYOPT=- $BASERUBY --disable=gems -e 'print 42' 2>/dev/null`" = 42], [
- BASERUBY="$BASERUBY --disable=gems"
- ])
- $BASERUBY -C "$srcdir" tool/downloader.rb -d tool -e gnu config.guess config.sub >&AS_MESSAGE_FD
-], [
- BASERUBY="echo executable host ruby is required. use --with-baseruby option.; false"
- HAVE_BASERUBY=no
-])
-AC_SUBST(BASERUBY)
-AC_SUBST(HAVE_BASERUBY)
-
-: ${GIT=git}
-HAVE_GIT=yes
-AC_ARG_WITH(git,
- AS_HELP_STRING([--without-git], [never use git]),
- [AS_CASE([$withval],
- [no], [GIT=never-use HAVE_GIT=no],
- [yes], [],
- [GIT=$withval])])
-AS_IF([test x"$HAVE_GIT" = xyes], [command -v "$GIT" > /dev/null || HAVE_GIT=no])
-AC_SUBST(GIT)
-AC_SUBST(HAVE_GIT)
-
-eval `sed -n ['s/^@%:@define RUBY_API_VERSION_\([A-Z][A-Z_0-9]*\) \([0-9][0-9]*\)/API_\1=\2/p'] $srcdir/include/ruby/version.h`
-RUBY_PROGRAM_VERSION=`sed -n 's/^@%:@define RUBY_VERSION "\(.*\)"/\1/p' $srcdir/version.h`
-MAJOR=`echo $RUBY_PROGRAM_VERSION | cut -d. -f1`
-MINOR=`echo $RUBY_PROGRAM_VERSION | cut -d. -f2`
-TEENY=`echo $RUBY_PROGRAM_VERSION | cut -d. -f3`
-for v in MAJOR MINOR TEENY; do
- AS_IF([eval "test \"\$$v\" = ''"], [
- AC_MSG_ERROR(could not determine $v number from version.h)
- ])
-done
-AS_IF([test "$MAJOR.$MINOR" != "$API_MAJOR.$API_MINOR"], [
- AC_MSG_ERROR([API version $API_MAJOR.$API_MINOR differs from program version $MAJOR.$MINOR])
-])
-AC_SUBST(MAJOR)
-AC_SUBST(MINOR)
-AC_SUBST(TEENY)
-AC_SUBST(RUBY_PROGRAM_VERSION)
-AC_SUBST(RUBY_API_VERSION, '$(MAJOR).$(MINOR)')
-RUBY_PATCHLEVEL=`sed -n 's/^#define RUBY_PATCHLEVEL //p' $srcdir/version.h`
-dnl checks for alternative programs
-AC_CANONICAL_BUILD
-RUBY_RM_RECURSIVE
-AC_ARG_WITH(gcc,
- AS_HELP_STRING([--without-gcc], [never use gcc]),
- [
- AS_CASE([$withval],
- [no], [: ${CC=cc}],
- [yes], [: ${CC=gcc}],
- [CC=$withval])])
-dnl If the user switches compilers, we can't believe the cache
-AS_IF([test ! -z "$ac_cv_prog_CC" -a ! -z "$CC" -a "$CC" != "$ac_cv_prog_CC"], [
- AC_MSG_ERROR(cached CC is different -- throw away $cache_file
-(it is also a good idea to do 'make clean' before compiling))
-])
-test -z "$CC" || ac_cv_prog_CC="$CC"
-
-AS_IF([test "$program_prefix" = NONE], [
- program_prefix=
-])
-AS_IF([test "$prefix" -ef .], [
- AC_MSG_ERROR(--prefix cannot be the current working directory.)
-])
-RUBY_BASE_NAME=`echo ruby | sed "$program_transform_name"`
-RUBYW_BASE_NAME=`echo rubyw | sed "$program_transform_name"`
-AC_SUBST(RUBY_BASE_NAME)
-AC_SUBST(RUBYW_BASE_NAME)
-AC_SUBST(RUBY_VERSION_NAME, '${RUBY_BASE_NAME}-${ruby_version}')
-
-AC_CANONICAL_TARGET
-test x"$target_alias" = x &&
-target_os=`echo $target_os | sed 's/linux-gnu$/linux/;s/linux-gnu/linux-/'`
-ac_install_sh='' # unusable for extension libraries.
-
-AC_ARG_WITH(os-version-style,
- AS_HELP_STRING([--with-os-version-style=TYPE],
- [OS version number for target and target_os [[full]]]
- [(full|teeny|minor+0|minor|major+0|major|none)]),
- [os_version_style=$withval],
- [os_version_style=full
- AS_CASE($target_os, [[*[0-9].*]],
- [AS_CASE([`/usr/bin/ruby -e 'puts RUBY_PLATFORM' 2>/dev/null`],
- [[*-*[0-9].*.0]], [os_version_style=minor+0],
- [[*-*[0-9].*.*]], [os_version_style=full],
- [[*-*[0-9].0] ], [os_version_style=major+0],
- [[*-*[0-9].*] ], [os_version_style=minor],
- [[*-*[0-9]] ], [os_version_style=major],
- )])
- ])
-os_version_style_transform=
-AS_CASE("${os_version_style}",
- [full|teeny], [],
- [minor+0], [os_version_style_transform=['s/\([0-9]\.[0-9][0-9]*\)\.[0-9][.0-9]*$/\1.0/']],
- [minor], [os_version_style_transform=['s/\([0-9]\.[0-9][0-9]*\)\.[0-9][.0-9]*$/\1/']],
- [major+0], [os_version_style_transform=['s/\([0-9]\)\.[0-9][.0-9]*$/\1.0/']],
- [major], [os_version_style_transform=['s/\([0-9]\)\.[0-9][.0-9]*$/\1/']],
- [none], [os_version_style_transform=['s/[0-9]\.[0-9][.0-9]*$//']],
- [AC_MSG_ERROR(unknown --with-os-version-style: $withval)])
-AS_IF([test -z "$target_alias" -a -n "$os_version_style_transform"],
- [
- target=`echo ${target} | sed "$os_version_style_transform"`
- target_os=`echo ${target_os} | sed "$os_version_style_transform"`
- ])
-
-AC_ARG_WITH(arch,
- AS_HELP_STRING([--with-arch=ARCHS],
- [build an Apple/NeXT Multi Architecture Binary (MAB);
- ARCHS is a comma-delimited list of architectures for
- which to build; if this option is disabled or omitted
- entirely, then the package will be built only for the
- target platform]),
- [target_archs="$withval"], [unset target_archs])
-
-AC_ARG_ENABLE(load-relative,
- AS_HELP_STRING([--enable-load-relative], [resolve load paths at run time]),
- [load_relative=$enableval])
-
-AC_ARG_PROGRAM
-
-dnl Checks for programs.
-
-cflagspat=
-test -z "$optflags" ||
- cflagspat="$cflagspat;s|"`eval echo '"'"${optflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/ *$/ /'`'| |g'
-test -z "$debugflags" ||
- cflagspat="$cflagspat;s|"`eval echo '"'"${debugflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/ *$/ /'`'| |g'
-test -z "warnflags" ||
- cflagspat="$cflagspat;s|"`eval echo '"'"${warnflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/ *$/ /'`'| |g'
-AS_IF([test -z "${CFLAGS+set}"], [
- cflags=`echo " $cflags " | sed "$cflagspat;s/^ *//;s/ *$//"`
- orig_cflags="$cflags"
- cflags="$cflags "'${optflags} ${debugflags} ${warnflags}'
-])
-AS_IF([test -z "${CXXFLAGS+set}"], [
- cxxflags=`echo " $cxxflags " | sed "$cflagspat;s/^ *//;s/ *$//"`
- orig_cxxflags="$cxxflags"
- cxxflags="$cxxflags "'${optflags} ${debugflags} ${warnflags}'
-])
-
-AS_CASE(["$host_os:$build_os"],
-[darwin*:darwin*], [
- AC_CHECK_TOOLS(CC, [clang gcc cc])
- # Following Apple deployed clang are broken
- # clang version 1.0 (http://llvm.org/svn/llvm-project/cfe/tags/Apple/clang-23 exported)
- # Apple clang version 2.0 (tags/Apple/clang-137) (based on LLVM 2.9svn)
- # Apple clang version 2.1 (tags/Apple/clang-163.7.1) (based on LLVM 3.0svn)
- AS_IF([! $CC -E -xc - <<SRC >/dev/null], [
- @%:@if defined __APPLE_CC__ && defined __clang_major__ && __clang_major__ < 3
- @%:@error premature clang
- @%:@endif
-SRC
- AC_MSG_ERROR([clang version 3.0 or later is required])
- ])
-])
-AS_IF([test x"${build}" != x"${host}"], [
- AC_CHECK_TOOL(CC, gcc)
-])
-
-AC_PROG_CC
-AS_CASE([$CC],
-[gcc-*], [
- gcc_prefix=gcc- gcc_suffix=`echo "$CC" | sed 's/^gcc//'`
- AC_PROG_CXX(g++${gcc_suffix})],
-[clang-*], [
- gcc_prefix=clang- gcc_suffix=`echo "$CC" | sed 's/^clang//'`
- AC_PROG_CXX(clang++${gcc_suffix})],
-[gcc_prefix= gcc_suffix=])
-
-dnl Select the appropriate C++ compiler in OS X
-AS_CASE(["$build_os"],
- [darwin1*.*], [
- AS_CASE(["x$CC"],
- [xgcc-4.2|x/usr/bin/gcc-4.2], [: ${CXX=g++-4.2}],
- [xgcc|x/usr/bin/gcc], [: ${CXX=g++}],
- [xcc|x/usr/bin/cc], [: ${CXX=c++}],
- [xicc], [: ${CXX=icpc}],
- [xclang|x/usr/bin/clang], [: ${CXX=clang++}])
- ])
-test -z "$CXX" || ac_cv_prog_CXX="$CXX"
-
-AC_PROG_CXX
-RUBY_MINGW32
-AC_PROG_GCC_TRADITIONAL
-AC_SUBST(GCC)
-AS_CASE(["$target_os"],
-[solaris*], [AC_PATH_TOOL([LD], [ld], [/usr/ccs/bin/ld], [/usr/ccs/bin:$PATH])],
-[AC_CHECK_TOOL([LD], [ld], [ld])])
-AC_SUBST(LD)
-AS_IF([test "$GCC" = yes], [
- linker_flag=-Wl,
- : ${optflags=-O3}
- gcc_major=`echo =__GNUC__ | $CC -E -xc - | sed '/^=/!d;s///'`
- gcc_minor=`echo =__GNUC_MINOR__ | $CC -E -xc - | sed '/^=/!d;s///'`
- test -n "$gcc_major" || gcc_major=0
- test -n "$gcc_minor" || gcc_minor=0
- AS_CASE(["x$CC"], [xicc], [
- icc_version=`echo =__ICC | $CC -E -xc - | sed '/^=/!d;s///'`
- ])
- test -n "$icc_version" || icc_version=0
- # RUBY_APPEND_OPTIONS(XCFLAGS, ["-include ruby/config.h" "-include ruby/missing.h"])
-], [
- linker_flag=
-])
-
-AS_IF([test "$GCC" = yes -a "$gcc_major" -lt 3 ], [
- AC_MSG_ERROR([too old GCC])
-])
-
-RUBY_PROG_GNU_LD
-RUBY_CPPOUTFILE
-
-: ${OUTFLAG='-o '}
-: ${COUTFLAG=${OUTFLAG}}
-: ${CSRCFLAG=''}
-AC_SUBST(OUTFLAG)
-AC_SUBST(COUTFLAG)
-AC_SUBST(CSRCFLAG)
-
-: ${MJIT_CC=$CC}
-AS_IF([test "x$cross_compiling" = xno], [
- AC_PATH_PROG([MJIT_CC], ${MJIT_CC})
- AS_CASE([$target_os],
- [*mingw*], [command -v cygpath > /dev/null && MJIT_CC=`cygpath -ma $MJIT_CC`])
- shift 2
- MJIT_CC="$MJIT_CC${1+ }$*"
-])
-
-AS_CASE(["$build_os"],
- [darwin1*.*], [
- # Xcode linker warns for deprecated architecture and wrongly
- # installed TBD files.
- CC_WRAPPER=""
- echo 'int main(void) {return 0;}' > conftest.c
- AS_IF([$CC -framework Foundation -o conftest conftest.c 2>&1 |
- grep '^ld: warning: text-based stub file' >/dev/null], [
- CC_WRAPPER=`cd -P "$srcdir/tool" && pwd`/darwin-cc
- CC="$CC_WRAPPER $CC"
- ])
- rm -fr conftest*
- ])
-
-cc_version=
-for option in --version -v -V -qversion; do
- cc_version_message=`$CC $option 2>&1`
- cc_version_status=$?
- AS_CASE($cc_version_status, [0], [:], [continue])
- AS_CASE($cc_version_message, [*Warning*], [continue])
- cc_version='$(CC) '$option
- break
-done
-AC_SUBST(CC_VERSION, $cc_version)
-AC_SUBST(CC_VERSION_MESSAGE, $cc_version_message)
-
-: ${DLDFLAGS="$LDFLAGS"}
-
-RUBY_UNIVERSAL_ARCH
-AS_IF([test "$target_cpu" != "$host_cpu" -a "$GCC" = yes -a "$cross_compiling" = no -a "$universal_binary" = no], [
- RUBY_DEFAULT_ARCH("$target_cpu")
-])
-
-AS_CASE(["$target_os"], [darwin*], [
-if libtool 2>&1 | grep no_warning_for_no_symbols > /dev/null; then
- ac_cv_prog_ac_ct_RANLIB=:
- ac_cv_prog_ac_ct_AR='libtool -static'
- rb_cv_arflags='-no_warning_for_no_symbols -o'
-fi
-])
-AC_CHECK_TOOLS(RANLIB, [${gcc_prefix}ranlib${gcc_suffix} ranlib], :)
-AC_CHECK_TOOLS(AR, [${gcc_prefix}ar${gcc_suffix} ar])
-AS_IF([test -z "$AR"], [
- AC_CHECK_PROGS(AR, aal, ar)
-])
-AC_CACHE_CHECK([for $AR flags], [rb_cv_arflags], [
- AS_IF([$AR rcD conftest.a > /dev/null 2>&1 && rm conftest.a],
- [rb_cv_arflags=rcD], [rb_cv_arflags=rcu])
-])
-AC_SUBST(ARFLAGS, ["$rb_cv_arflags "])
-
-AC_CHECK_TOOL(AS, as)
-ASFLAGS=$ASFLAGS
-AC_SUBST(ASFLAGS)
-
-AS_CASE(["$target_os"],[cygwin*|mingw*], [ac_cv_prog_ac_ct_OBJCOPY=":"])
-
-# BSD's ports and MacPorts prefix GNU binutils with 'g'
-AC_CHECK_TOOLS(OBJDUMP, [objdump gobjdump])
-AC_CHECK_TOOLS(OBJCOPY, [objcopy gobjcopy])
-
-AS_CASE(["$target_os"],
-[cygwin*|mingw*], [
- AC_CHECK_TOOL(WINDRES, windres)
- AC_CHECK_TOOL(DLLWRAP, dllwrap)
- target=`echo $target | sed "s/^$target_cpu-/-/"`
- target_alias=`echo $target_alias | sed "s/^$target_cpu-/-/"`
- target_cpu=`echo $target_cpu | sed s/i.86/i386/`
- AS_CASE(["$target"], [-*], [ target="$target_cpu${target}"])
- AS_CASE(["$target_alias"], [-*], [ target_alias="$target_cpu${target_alias}"])
- AS_CASE(["$target_os"],
- [mingw*], [
- test "$rb_cv_msvcrt" = "" && unset rb_cv_msvcrt
- AC_CACHE_CHECK(for mingw32 runtime DLL, rb_cv_msvcrt, [
- AC_TRY_LINK([@%:@include <stdio.h>],
- [FILE* volatile f = stdin; return 0;],
- [rb_cv_msvcrt=`$OBJDUMP -p conftest$ac_exeext |
- tr A-Z a-z |
- sed -n '/^[[ ]]*dll name: \(msvc.*\)\.dll$/{s//\1/p;q;}'`],
- [rb_cv_msvcrt=msvcrt])
- test "$rb_cv_msvcrt" = "" && rb_cv_msvcrt=msvcrt])
- RT_VER=`echo "$rb_cv_msvcrt" | tr -cd [0-9]`
- test "$RT_VER" = "" && RT_VER=60
- AC_DEFINE_UNQUOTED(RUBY_MSVCRT_VERSION, $RT_VER)
- sysconfdir=
- ])
- : ${enable_shared=yes}
- ],
-[aix*], [AC_CHECK_TOOL(NM, nm, /usr/ccs/bin/nm, /usr/ccs/bin:$PATH)],
-[hiuxmpp*], [AC_DEFINE(__HIUX_MPP__)]) # by TOYODA Eizi <toyoda@npd.kishou.go.jp>
-AC_CHECK_TOOLS(NM, [${gcc_prefix}nm${gcc_suffix} nm])
-
-AC_PROG_LN_S
-AC_PROG_MAKE_SET
-AC_PROG_INSTALL
-AC_PROG_MKDIR_P
-AS_IF([test "x$MKDIR_P" = "x -d"], [
- AS_IF([test x"$as_mkdir_p" != xfalse], [
- MKDIR_P='mkdir -p'
- echo "use 'mkdir -p' as MKDIR_P"
- ], [
- AC_MSG_ERROR([mkdir -p is required])
- ])
-])
-MAKEDIRS="$MKDIR_P"
-AC_SUBST(MAKEDIRS)
-
-AC_CHECK_PROG([DTRACE], [${ac_tool_prefix}dtrace], [${ac_tool_prefix}dtrace])
-AS_IF([test "$cross_compiling:$ac_cv_prog_DTRACE" = no: -a -n "$ac_tool_prefix"], [
- AC_CHECK_PROG([DTRACE], [dtrace], [dtrace])
-])
-
-AC_CHECK_PROGS(DOT, dot)
-AC_CHECK_PROGS(DOXYGEN, doxygen)
-
-AC_CHECK_PROG(PKG_CONFIG, pkg-config, [pkg-config], [], [],
- [`"$as_dir/$ac_word$ac_exec_ext" --print-errors --version > /dev/null 2>&1 || echo "$as_dir/$ac_word$ac_exec_ext"`])
-
-# checks for UNIX variants that set C preprocessor variables
-AC_USE_SYSTEM_EXTENSIONS
-
-AC_SUBST(RM, ['rm -f'])
-AC_SUBST(CP, ['cp'])
-RMDIRS='$(top_srcdir)/tool/rmdirs'
-RMDIR=rmdir
-mkdir "rmdirs_$$_test" "rmdirs_$$_test/a"
-rmdir --ignore-fail-on-non-empty "rmdirs_$$_test" 2>/dev/null &&
-RMDIR='rmdir --ignore-fail-on-non-empty'
-$RMDIR -p "rmdirs_$$_test/a" 2>/dev/null &&
-{ test -d "rmdirs_$$_test" || RMDIRS="$RMDIR -p"; }
-rmdir "rmdirs_$$_test/a" "rmdirs_$$_test" 2>/dev/null
-AC_SUBST(RMDIR)
-AC_SUBST(RMDIRS)
-AC_SUBST(RMALL, ['rm -fr'])
-
-AC_MSG_CHECKING([for cd using physical directory])
-rm -fr conf$$.dir
-mkdir conf$$.dir &&
-(cd conf$$.dir && mkdir src build && cd src &&
-$as_ln_s ../build . > /dev/null 2>&1 && cd build &&
-for chdir in 'cd -P' 'PWD= cd'; do
- /bin/sh -c "$chdir ../src && echo '$chdir' > cdcmd" 2> /dev/null && break
-done)
-AS_IF([test -f conf$$.dir/src/cdcmd], [
- read CHDIR < conf$$.dir/src/cdcmd 2> /dev/null
-], [
- CHDIR=cd
-])
-rm -fr conf$$.dir
-AC_MSG_RESULT([$CHDIR])
-AC_SUBST(CHDIR)
-}
-
-: "compiler section" && {
-RUBY_WERROR_FLAG([
- AC_MSG_CHECKING([whether CFLAGS is valid])
- AC_TRY_COMPILE([], [],
- [AC_MSG_RESULT(yes)],
- [
- AC_MSG_RESULT(no)
- AC_MSG_ERROR([something wrong with CFLAGS="$CFLAGS"])
- ]
- )
-
- AC_MSG_CHECKING([whether LDFLAGS is valid])
- {
- mkdir tmp.$$.try_link &&
- cd tmp.$$.try_link &&
- cp ../confdefs.h . &&
- echo '<?xml?><plist><dict><key>CFBundleIdentifier</key><string></string></dict></plist>' > Info.plist &&
- :
- } || AC_MSG_ERROR([failed to make temporary directory])
- AC_TRY_LINK([], [],
- [AC_MSG_RESULT(yes)],
- [
- cd .. && rm -fr tmp.$$.try_link
- AC_MSG_RESULT(no)
- AC_MSG_ERROR([something wrong with LDFLAGS="$LDFLAGS"])
- ]
- )
- cd .. && rm -fr tmp.$$.try_link
-])
-
-: ${RPATHFLAG=''}
-rpathflag=''
-AS_IF([test x"${RPATHFLAG}" = x], [
- AS_CASE(["$target_os"],
- [hpux*], [AS_IF([test "$rb_cv_prog_gnu_ld" = no], [rpathflag='+b '])],
- [aix*], [rpathflag='-blibpath:'],
- [for rpathflag in -R "-rpath "; do
- AS_CASE("$rpathflag",
- [*" "], [AS_CASE(["${linker_flag}"],
- [*,], [rpathflag=`echo "$rpathflag" | tr ' ' ,`])])
- rpathflag="${linker_flag}${rpathflag}"
- RUBY_TRY_LDFLAGS([${rpathflag}.], [], [rpathflag=])
- AS_IF([test "x${rpathflag}" != x], [])
- done])
-], [
- rpathflag=`echo "$RPATHFLAG" | sed 's/%.*//'`
-])
-
-AS_CASE([$RUBY_PATCHLEVEL], [-*],
- [RUBY_DEVEL=yes], [RUBY_DEVEL=no])
-particular_werror_flags=$RUBY_DEVEL
-AC_ARG_ENABLE(werror,
- AS_HELP_STRING([--disable-werror],
- [don't make warnings into errors
- even if a compiler support -Werror feature
- [[disabled by default unless development version]]]),
- [particular_werror_flags=$enableval])
-
-rb_cv_warnflags="$warnflags"
-AS_CASE(["$GCC:${warnflags+set}:${extra_warnflags:+set}:"],
-[yes::*|yes:*:set:], [# GCC && (!warnflags || extra_warnflags)
- AS_IF([test $gcc_major -ge 4], [
- extra_warnflags="$extra_warnflags -Werror=extra-tokens"
- ])
- AS_IF([test $gcc_major -ge 5 -a $gcc_major -le 6], [
- extra_warnflags="$extra_warnflags -Wno-maybe-uninitialized"
- ])
- # ICC doesn't support -Werror=
- AS_IF([test $icc_version -gt 0], [
- particular_werror_flags=no
- ])
- for wflag in \
- -Werror=declaration-after-statement \
- -Werror=deprecated-declarations \
- -Werror=division-by-zero \
- -Werror=duplicated-cond \
- -Werror=implicit-function-declaration \
- -Werror=implicit-int \
- -Werror=misleading-indentation \
- -Werror=pointer-arith \
- -Werror=restrict \
- -Werror=shorten-64-to-32 \
- -Werror=write-strings \
- -Wimplicit-fallthrough=0 \
- -Wmissing-noreturn \
- -Wno-cast-function-type \
- -Wno-constant-logical-operand \
- -Wno-long-long \
- -Wno-missing-field-initializers \
- -Wno-overlength-strings \
- -Wno-packed-bitfield-compat \
- -Wno-parentheses-equality \
- -Wno-self-assign \
- -Wno-tautological-compare \
- -Wno-unused-parameter \
- -Wno-unused-value \
- -Wsuggest-attribute=format \
- -Wsuggest-attribute=noreturn \
- -Wunused-variable \
- -diag-disable=175,188,2259 \
- $extra_warnflags \
- ; do
- AS_IF([test "$particular_werror_flags" != yes], [
- wflag=`echo x$wflag | sed 's/^x-Werror=/-W/;s/^x//'`
- ])
- ok=no
- RUBY_TRY_CFLAGS($wflag, [
- RUBY_APPEND_OPTIONS(warnflags, $wflag)
- ok=yes
- ])
- AS_CASE([$ok:$wflag], [no:-Werror=*], [
- wflag=`echo x$wflag | sed 's/^x-Werror=/-W/'`
- RUBY_TRY_CFLAGS($wflag, [
- RUBY_APPEND_OPTIONS(warnflags, $wflag)
- particular_werror_flags=no
- ])
- ])
- done
- AS_CASE([" $warnflags "],[*" -Wno-missing-field-initializers "*], [wflag="-Wall -Wextra"],
- [wflag=-Wall])
- RUBY_TRY_CFLAGS($wflag, [warnflags="$wflag${warnflags+ $warnflags}"])
- # Disable warnflags while conftest. -Werror=* flags might make bad OS capability guess.
- rb_cv_warnflags="$warnflags"
- warnflags=
-])
-RUBY_TRY_CFLAGS(-Qunused-arguments, [RUBY_APPEND_OPTIONS(rb_cv_wsuppress_flags, -Qunused-arguments)])
-
-AC_ARG_WITH(compress-debug-sections,
- AS_HELP_STRING([--with-compress-debug-sections=type],
- [enable debug section compression]),
- [compress_debug_sections=$withval], [compress_debug_sections=])
-
-AS_IF([test "$GCC" = yes], [
- # -D_FORTIFY_SOURCE
- # When defined _FORTIFY_SOURCE, glibc enables some additional sanity
- # argument check. The performance drop is very little and Ubuntu enables
- # _FORTIFY_SOURCE=2 by default. So, let's support it for protecting us from
- # a mistake of silly C extensions.
- RUBY_TRY_CFLAGS(-D_FORTIFY_SOURCE=2, [RUBY_APPEND_OPTION(XCFLAGS, -D_FORTIFY_SOURCE=2)])
-
- : ${MJIT_HEADER_FLAGS='-P -dD'}
-
- # -fstack-protector
- AS_CASE(["$target_os"],
- [mingw*], [
- stack_protector=no
- ])
- AS_IF([test -z "${stack_protector+set}"], [
- AS_FOR(option, opt, [-fstack-protector-strong -fstack-protector], [
- RUBY_TRY_CFLAGS(option, [stack_protector=yes])
- AS_IF([test "x$stack_protector" = xyes], [
- RUBY_TRY_LDFLAGS(option, [], [stack_protector=])
- ])
- AS_IF([test "x$stack_protector" = xyes], [stack_protector=option; break])
- ])
- ])
- AS_CASE(["$stack_protector"], [-*], [
- RUBY_APPEND_OPTION(XCFLAGS, $stack_protector)
- RUBY_APPEND_OPTION(XLDFLAGS, $stack_protector)
- RUBY_APPEND_OPTION(LDFLAGS, $stack_protector)
- ])
-
- AS_CASE("${compress_debug_sections:-zlib}",
- [none|no], [], [
- RUBY_TRY_LDFLAGS(${linker_flag}--compress-debug-sections=${compress_debug_sections:-zlib},
- [compress_debug_sections=${compress_debug_sections:-zlib}],
- [compress_debug_sections=no])
- ])
- AS_IF([test "x$compress_debug_sections" != xno], [
- RUBY_APPEND_OPTION(DLDFLAGS, ${linker_flag}--compress-debug-sections=$compress_debug_sections)
- ])
-
- AS_CASE(["$target_os"],[mingw*], [
- # On Windows platforms, system provided headers are VC++
- # optimized. That is, C++ habits are often contaminated into
- # various headers. Most frequent situation is the use of //
- # comments. We bypass ANSI C mode for them. Otherwise
- # extension libs cannot include those headers.
-
- # Since math.h in some mingw64 wrongly declares frexp and modf
- # to be pure, the variables pointed by the second arguments are
- # considered uninitialized unexpectedly.
- AC_CACHE_CHECK([whether frexp and modf are broken],
- rb_cv_mingw64_broken_frexp_modf,
- [
- save_CFLAGS="$CFLAGS"
- AS_IF([test "$particular_werror_flags" = "yes"], [
- CFLAGS="$CFLAGS -Werror=uninitialized"
- ], [
- CFLAGS="$CFLAGS -Werror -Wuninitialized"
- ])
- AC_TRY_COMPILE([@%:@include <math.h>
- int foo(double x)
- {
- int exp;
- frexp(x, &exp);
- return exp;
- }], [if (foo(0.0)) return 1;],
- [rb_cv_mingw64_broken_frexp_modf=no],
- [rb_cv_mingw64_broken_frexp_modf=yes])
- CFLAGS="$save_CFLAGS"
- ])
- AS_IF([test "$rb_cv_mingw64_broken_frexp_modf" = yes], [
- AC_DEFINE(RUBY_MINGW64_BROKEN_FREXP_MODF)
- ])
- ],
- [cygwin*|darwin*|netbsd*], [
- # need lgamma_r(), finite()
- ],
- [solaris*], [
- # ANSI (no XCFLAGS because this is C only)
- # Because "-std=gnu99" affects existance of functions on Solaris,
- # "-std=gnu99" will be appended to CPPFLAGS.
- for ansi_options in -std=gnu99; do
- RUBY_TRY_CFLAGS(${ansi_options}, [
- RUBY_APPEND_OPTIONS(CPPFLAGS, ${ansi_options})
- ], [ansi_options=])
- test "x${ansi_options}" = x || break
- done
- ],
- [
- # ANSI (no XCFLAGS because this is C only)
- rb_tmp_std_check=`echo $CC $CFLAGS $optflags $warnflags $debugflags | fgrep std= | tr -d '\015'`
- AS_IF([test "x$rb_tmp_std_check" = "x"],
- [
- for ansi_options in -std=gnu99; do
- RUBY_TRY_CFLAGS(${ansi_options}, [
- RUBY_APPEND_OPTIONS(warnflags, ${ansi_options})
- RUBY_APPEND_OPTIONS(strict_warnflags, ${ansi_options})
- ], [ansi_options=])
- test "x${ansi_options}" = x || break
- done
- ])
- ])
-
- # suppress annoying -Wstrict-overflow warnings
- RUBY_TRY_CFLAGS(-fno-strict-overflow, [RUBY_APPEND_OPTION(XCFLAGS, -fno-strict-overflow)])
-
- test "${debugflags+set}" || {RUBY_TRY_CFLAGS(-ggdb3, [debugflags=-ggdb3])}
- test "${debugflags+set}" || {RUBY_TRY_CFLAGS(-ggdb, [debugflags=-ggdb])}
- test "${debugflags+set}" || {RUBY_TRY_CFLAGS(-g3, [debugflags=-g3])}
-])
-test $ac_cv_prog_cc_g = yes && : ${debugflags=-g}
-AS_IF([test "x$RUBY_DEVEL" = xyes], [RUBY_APPEND_OPTION(XCFLAGS, -DRUBY_DEVEL=1)])
-
-AS_IF([test "$GCC" = ""], [
- AS_CASE(["$target_os"],[aix*],[warnflags="$warnflags -qinfo=por" rb_cv_warnflags="$rb_cv_warnflags -qinfo=por"])
-])
-AS_IF([test "$GCC" = yes], [
- AS_IF([test "$gcc_major" -ge 4], [
- RUBY_TRY_CFLAGS(-fvisibility=hidden, [visibility_option=yes], [visibility_option=no])
- ])
- AC_SUBST(WERRORFLAG, "-Werror")
- AS_IF([test "$visibility_option" = yes], [
- RUBY_APPEND_OPTION(XCFLAGS, -fvisibility=hidden)
- AC_DEFINE(RUBY_SYMBOL_EXPORT_BEGIN, [_Pragma("GCC visibility push(default)")])
- AC_DEFINE(RUBY_SYMBOL_EXPORT_END, [_Pragma("GCC visibility pop")])
- ], [
- RUBY_TRY_LDFLAGS([-Wl,-unexported_symbol,_Init_*], [visibility_option=ld], [visibility_option=no])
- ])
- test "$visibility_option" = no || OBJCOPY=:
-])
-
-AS_IF([test "$GCC" = yes], [
- # optflags
-
- AS_CASE(["$target_os"], [mingw*], [
- RUBY_TRY_CFLAGS(-fno-omit-frame-pointer, [optflags="${optflags+$optflags }-fno-omit-frame-pointer"])
- RUBY_TRY_CFLAGS(-static-libgcc, [static_libgcc=yes], [static_libgcc=no])
- AS_IF([test "$static_libgcc" = yes], [
- RUBY_APPEND_OPTION(EXTLDFLAGS, -static-libgcc)
- ])
- ])
-
- # disable fast-math
- for oflag in -fno-fast-math; do
- RUBY_TRY_CFLAGS($oflag, [RUBY_APPEND_OPTION(CFLAGS, $oflag)])
- done
- for oflag in -fexcess-precision=standard -fp-model\ precise; do
- RUBY_TRY_CFLAGS($oflag, [RUBY_APPEND_OPTION(XCFLAGS, $oflag)])
- done
-])
-
-AS_CASE(["$target_cpu"], [[i[3-6]86*]], [
- AC_CACHE_CHECK([for __sync_val_compare_and_swap], [rb_cv_gcc_compiler_cas], [
- AC_TRY_LINK([unsigned long atomic_var;],
- [__sync_val_compare_and_swap(&atomic_var, 0, 1);],
- [rb_cv_gcc_compiler_cas=yes],
- [
- save_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS -march=i486"
- AC_TRY_LINK([unsigned long atomic_var;],
- [__sync_val_compare_and_swap(&atomic_var, 0, 1);],
- [rb_cv_gcc_compiler_cas=i486],
- [rb_cv_gcc_compiler_cas=no])
- CFLAGS="$save_CFLAGS"
- ])
- ])
- AS_IF([test "$rb_cv_gcc_compiler_cas" = i486], [ARCH_FLAG="-march=i486"])
-])
-
-AC_ARG_WITH(opt-dir,
- AS_HELP_STRING([--with-opt-dir=DIR-LIST],
- [add optional headers and libraries directories separated by $PATH_SEPARATOR]),
- [
- val=`echo "$PATH_SEPARATOR$withval" | sed "s|$PATH_SEPARATOR\([[^$PATH_SEPARATOR]*]\)| -I\1/include|g;s/^ //"`
- CPPFLAGS="$CPPFLAGS $val"
- val=`echo "$PATH_SEPARATOR$withval" | sed "s|$PATH_SEPARATOR\([[^$PATH_SEPARATOR]*]\)| -L\1/lib${rpathflag:+ $rpathflag\\\\1/lib}|g;s/^ //"`
- LDFLAGS="$LDFLAGS $val"
- LDFLAGS_OPTDIR="$val"
- OPT_DIR="$withval"
- ], [OPT_DIR=])
-
-test -z "${ac_env_CFLAGS_set}" -a -n "${cflags+set}" && eval CFLAGS="\"$cflags $ARCH_FLAG\""
-test -z "${ac_env_CXXFLAGS_set}" -a -n "${cxxflags+set}" && eval CXXFLAGS="\"$cxxflags $ARCH_FLAG\""
-}
-
-AC_CACHE_CHECK([whether compiler has statement and declarations in expressions],
- rb_cv_have_stmt_and_decl_in_expr,
- [AC_TRY_COMPILE([],[ __extension__ ({ int a = 0; a; }); ],
- [rb_cv_have_stmt_and_decl_in_expr=yes],
- [rb_cv_have_stmt_and_decl_in_expr=no])])
-AS_IF([test "$rb_cv_have_stmt_and_decl_in_expr" = yes], [
- AC_DEFINE(HAVE_STMT_AND_DECL_IN_EXPR)
-])
-
-: "header and library section" && {
-AC_ARG_WITH(winnt-ver,
- AS_HELP_STRING([--with-winnt-ver=0xXXXX], [target Windows NT version (default to 0x0600)]),
- [with_winnt_ver="$withval"], [with_winnt_ver="0x0600"])
-AS_CASE(["$target_os"],
-[mingw*], [
- RUBY_APPEND_OPTION(CPPFLAGS, -D_WIN32_WINNT=$with_winnt_ver)
- RUBY_APPEND_OPTION(CPPFLAGS, -D__MINGW_USE_VC2005_COMPAT)
-])
-
-AS_CASE(["$target_os"],
-[freebsd*], [
- AC_CACHE_CHECK([whether pthread should be enabled by default],
- rb_cv_enable_pthread_default,
- [AC_TRY_CPP([
-#include <osreldate.h>
-#if __FreeBSD_version < 502102
-#error pthread should be disabled on this platform
-#endif
- ],
- rb_cv_enable_pthread_default=yes,
- rb_cv_enable_pthread_default=no)])
- enable_pthread=$rb_cv_enable_pthread_default
- ],
-[mingw*], [
- enable_pthread=no
- ],
-[
- enable_pthread=yes
- ])
-
-dnl Checks for libraries.
-AS_CASE(["$target_os"],[*bsd*|dragonfly*],[],[ac_cv_func_daemon=no])
-
-AS_UNSET(ORIG_LIBS)
-POSTLINK=:
-AC_SUBST(POSTLINK)
-AS_CASE(["$target_os"],
-[nextstep*], [ ],
-[openstep*], [ ],
-[rhapsody*], [ ],
-[darwin*], [
- ORIG_LIBS="$LIBS"
- RUBY_PREPEND_OPTION(LIBS, -lobjc)
- RUBY_APPEND_OPTIONS(CPPFLAGS, -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT)
- AC_MSG_CHECKING(whether Mac OS X 10.5 or later)
- AC_TRY_CPP([#include <AvailabilityMacros.h>
- #if MAC_OS_X_VERSION_MAX_ALLOWED <= 1040
- #error pre OS X 10.4
- [!<===== pre OS X 10.4 =====>]
- #endif
- ],
- [macosx_10_5=yes], [macosx_10_5=no])
- AC_MSG_RESULT($macosx_10_5)
- AS_IF([test "${target_os@%:@darwin}" -ge 16], [
- ac_cv_func___syscall=no
- ac_cv_func_syscall=no
- ac_cv_header_sys_syscall_h=no
- ac_cv_header_syscall_h=no
- ])
- AS_IF([test $macosx_10_5 = yes], [
- ac_cv_func_getcontext=no
- ac_cv_func_setcontext=no
- ], [
- AC_DEFINE(BROKEN_SETREUID, 1)
- AC_DEFINE(BROKEN_SETREGID, 1)
- ])
- incs=`$CC -v -E -xc - < /dev/null 2>&1 | sed ['1,/^@%:@include </d;s/^ *//;s|[^./][^/]*/\.\./||g;/\/include$/!d;s||/lib|;/\/usr\/lib/d']`
- for d in `$CC -print-search-dirs | sed -e '/^libraries: */!d;s///' | tr : '\012' | fgrep -v /../ | sed -n 's|^\(/.*/lib\)/$|\1|p'`; do
- incs=`echo "$incs" | fgrep -v "$d"`
- done
- for d in $incs; do
- test -d "$d" && RUBY_APPEND_OPTIONS(LDFLAGS, "-L$d")
- done
- ac_cv_type_getgroups=gid_t # getgroups() on Rosetta fills garbage
- ac_cv_lib_crypt_crypt=no
- ac_cv_func_fdatasync=no # Mac OS X wrongly reports it has fdatasync()
- ac_cv_func_vfork=no
- AS_IF([test $gcc_major -lt 4 -o \( $gcc_major -eq 4 -a $gcc_minor -lt 3 \)], [
- ac_cv_func___builtin_setjmp=no
- ])
- with_setjmp_type=sigsetjmp # to hijack SIGCHLD handler
- AC_CACHE_CHECK(for broken crypt with 8bit chars, rb_cv_broken_crypt,
- [AC_TRY_RUN([
-#include <stdio.h>
-#include <unistd.h>
-#include <string.h>
-
-void
-broken_crypt(const char *salt, const char *buf1, const char *buf2)
-{
-#if 0
- printf("%.2x%.2x: %s -> %s\n", (unsigned char)salt[0], (unsigned char)salt[1],
- buf1+2, buf2+2);
-#endif
-}
-
-int
-main()
-{
- int i;
- char salt[2], buf[256], *s;
- for (i = 0; i < 128*128; i++) {
- salt[0] = 0x80 | (i & 0x7f);
- salt[1] = 0x80 | (i >> 7);
- strcpy(buf, crypt("", salt));
- if (strcmp(buf, s = crypt("", salt))) {
- broken_crypt(salt, buf, s);
- return 1;
- }
- }
- salt[0] = salt[1] = ' ';
- strcpy(buf, crypt("", salt));
- salt[0] = salt[1] = 0x80 | ' ';
- if (strcmp(buf, s = crypt("", salt))) {
- broken_crypt(salt, buf, s);
- return 1;
- }
- return 0;
-}
-],
- rb_cv_broken_crypt=no,
- rb_cv_broken_crypt=yes,
- rb_cv_broken_crypt=yes)])
- AS_IF([test "$rb_cv_broken_crypt" = yes], [
- AC_DEFINE(BROKEN_CRYPT, 1)
- ])
- POSTLINK=""
- AC_CHECK_PROGS(codesign, codesign)
- AC_CHECK_PROGS(dsymutil, dsymutil)
- AS_IF([test -n "$codesign"], [
- POSTLINK="{ test -z '\$(RUBY_CODESIGN)' || $codesign -s '\$(RUBY_CODESIGN)' -f \$@; }${POSTLINK:+; $POSTLINK}"
- ])
- AS_IF([test -n "$dsymutil"], [
- POSTLINK="$dsymutil \$@${POSTLINK:+; $POSTLINK}"
- ])
- AS_IF([test -n "${POSTLINK}"], [
- LINK_SO="$LINK_SO
-\$(POSTLINK)"
- ])
- AC_CHECK_HEADERS(crt_externs.h, [], [], [
- #include <crt_externs.h>
- ])
- ],
-[hpux*], [ LIBS="-lm $LIBS"
- ac_cv_c_inline=no],
-[solaris*], [ LIBS="-lm $LIBS"
- ac_cv_func_vfork=no
- AC_MSG_CHECKING(whether _XOPEN_SOURCE is already given)
- AC_TRY_COMPILE([#include <unistd.h>
- #ifndef _XOPEN_SOURCE
- #error _XOPEN_SOURCE is not defined
- #endif
- ], [],
- [given_xopen_source=yes], [given_xopen_source=no])
- AC_MSG_RESULT($given_xopen_source)
- AS_IF([test $given_xopen_source = no], [
- AC_MSG_CHECKING(appropriate _XOPEN_SOURCE value to define)
- define_xopen_source=""
- for tmp_xpg in 7 6 5; do
- AS_IF([test x"$define_xopen_source" != x], [
- break
- ])
- RUBY_WERROR_FLAG([AC_TRY_COMPILE([
- #define _XOPEN_SOURCE ${tmp_xpg}00
- #include <unistd.h>
- #ifndef _XPG${tmp_xpg}
- #error _XPG${tmp_xpg} should be defined by _XOPEN_SOURCE=${tmp_xpg}00
- #endif
- ], [],
- [define_xopen_source=${tmp_xpg}00], [])
- ])
- done
- AS_IF([test x"$define_xopen_source" = x], [
- define_xopen_source=no
- ])
- AC_MSG_RESULT($define_xopen_source)
- AS_IF([test x"$define_xopen_source" != xno], [
- RUBY_APPEND_OPTIONS(CPPFLAGS, -D_XOPEN_SOURCE=$define_xopen_source)
- ])
- ])
- ],
-[haiku*], [
- LIBS="$LIBS" # m lib is include in root
- ],
-[cygwin*], [ ac_cv_header_langinfo_h=yes
- RUBY_APPEND_OPTIONS(CPPFLAGS, -D_XOPEN_SOURCE -D_GNU_SOURCE)
- AC_CHECK_FUNCS(cygwin_conv_path)
- AC_LIBOBJ([langinfo])
- ],
-[mingw*], [ LIBS="-lshell32 -lws2_32 -liphlpapi -limagehlp -lshlwapi $LIBS"
- ac_cv_header_a_out_h=no
- ac_cv_header_pwd_h=no
- ac_cv_header_utime_h=no
- ac_cv_header_sys_ioctl_h=no
- ac_cv_header_sys_param_h=no
- ac_cv_header_sys_resource_h=no
- ac_cv_header_sys_select_h=no
- ac_cv_header_sys_time_h=no
- ac_cv_header_sys_times_h=no
- ac_cv_header_sys_socket_h=no
- ac_cv_func_lstat=yes
- ac_cv_func_times=yes
- ac_cv_func_waitpid=yes
- ac_cv_func_fsync=yes
- ac_cv_func_seekdir=yes
- ac_cv_func_telldir=yes
- ac_cv_func_isinf=yes
- ac_cv_func_isnan=yes
- ac_cv_func_finite=yes
- ac_cv_func_lchown=yes
- ac_cv_func_link=yes
- ac_cv_func_readlink=yes
- ac_cv_func_symlink=yes
- ac_cv_lib_crypt_crypt=no
- ac_cv_func_getpgrp_void=no
- ac_cv_func_memcmp_working=yes
- ac_cv_lib_dl_dlopen=no
- rb_cv_binary_elf=no
- rb_cv_negative_time_t=no
- ac_cv_func_fcntl=yes
- ac_cv_func_flock=yes
- ac_cv_func_gmtime_r=yes
- rb_cv_large_fd_select=yes
- ac_cv_type_struct_timeval=yes
- ac_cv_func_clock_gettime=yes
- ac_cv_func_clock_getres=yes
- ac_cv_func_malloc_usable_size=no
- ac_cv_type_off_t=yes
- ac_cv_sizeof_off_t=8
- AS_IF([test "$target_cpu" = x64], [
- ac_cv_func___builtin_setjmp=yes
- ac_cv_func_round=no
- rb_cv_fiber_coroutine=yes
- ])
- ac_cv_func_tgamma=no
- rb_cv_negative_time_t=yes
- AC_CHECK_TYPE([NET_LUID], [], [],
- [@%:@include <winsock2.h>
- @%:@include <iphlpapi.h>])
- AS_IF([test x"$ac_cv_type_NET_LUID" = xyes], [
- AC_DEFINE(HAVE_TYPE_NET_LUID, 1)
- ])
- AC_CHECK_FUNCS(_gmtime64_s)
- AC_CHECK_FUNCS(_wfreopen_s)
- AC_LIBOBJ([langinfo])
- ],
-[bsdi*], [ LIBS="-lm $LIBS"
- AC_DEFINE(BROKEN_SETREUID, 1)
- AC_DEFINE(BROKEN_SETREGID, 1)
- ac_cv_sizeof_rlim_t=8],
-[freebsd*], [ LIBS="-lm $LIBS"
- ac_cv_func_getpeername=no
- ac_cv_func_getsockname=no
- ac_cv_func_shutdown=no
- ac_cv_func_close=no
- ],
-[netbsd*], [ LIBS="-lm $LIBS"
- ],
-[dragonfly*], [ LIBS="-lm $LIBS"
- # isinf() and isnan() are macros on DragonFly.
- ac_cv_func_isinf=yes
- ac_cv_func_isnan=yes
- ],
-[aix*],[ LIBS="-lm $LIBS"
- ac_cv_func_round=no
- ac_cv_func___builtin_setjmp=no
- ],
-[linux*],[ LIBS="-lm $LIBS"
- # __builtin_longjmp in ppc64* Linux does not restore
- # the TOC register (r2), which is problematic
- # when a global exit happens from JITted .so code.
- AS_CASE(["$target_cpu"], [powerpc64*], [
- ac_cv_func___builtin_setjmp=no
- ])
- # With gcc-8's -fcf-protection, MJIT's __builtin_longjmp fails.
- AS_CASE(["$CC $CFLAGS "], [*" -fcf-protection "*], [cf_protection=yes], [cf_protection=no])
- AS_IF([test "$cf_protection" = yes], [
- ac_cv_func___builtin_setjmp=no
- ])
- ],
-[ LIBS="-lm $LIBS"])
-: ${ORIG_LIBS=$LIBS}
-
-AC_CHECK_LIB(crypt, crypt) # glibc (GNU/Linux, GNU/Hurd, GNU/kFreeBSD)
-AC_CHECK_LIB(dl, dlopen) # Dynamic linking for SunOS/Solaris and SYSV
-AC_CHECK_LIB(dld, shl_load) # Dynamic linking for HP-UX
-AC_CHECK_LIB(socket, shutdown) # SunOS/Solaris
-
-dnl Checks for header files.
-AC_HEADER_DIRENT
-dnl AC_HEADER_STDC has been checked in AC_USE_SYSTEM_EXTENSIONS
-AC_HEADER_STDBOOL
-AC_HEADER_SYS_WAIT
-
-AC_CHECK_HEADERS(a.out.h)
-AC_CHECK_HEADERS(atomic.h)
-AC_CHECK_HEADERS(direct.h)
-AC_CHECK_HEADERS(grp.h)
-AC_CHECK_HEADERS(fcntl.h)
-AC_CHECK_HEADERS(float.h)
-AC_CHECK_HEADERS(ieeefp.h)
-AC_CHECK_HEADERS(intrinsics.h)
-AC_CHECK_HEADERS(langinfo.h)
-AC_CHECK_HEADERS(limits.h)
-AC_CHECK_HEADERS(locale.h)
-AC_CHECK_HEADERS(malloc.h)
-AC_CHECK_HEADERS(malloc/malloc.h)
-AC_CHECK_HEADERS(malloc_np.h)
-AC_CHECK_HEADERS(net/socket.h)
-AC_CHECK_HEADERS(process.h)
-AC_CHECK_HEADERS(pwd.h)
-AC_CHECK_HEADERS(sanitizer/asan_interface.h)
-AC_CHECK_HEADERS(sanitizer/msan_interface.h)
-AC_CHECK_HEADERS(setjmpex.h)
-AC_CHECK_HEADERS(stdalign.h)
-AC_CHECK_HEADERS(sys/attr.h)
-AC_CHECK_HEADERS(sys/eventfd.h)
-AC_CHECK_HEADERS(sys/fcntl.h)
-AC_CHECK_HEADERS(sys/file.h)
-AC_CHECK_HEADERS(sys/id.h)
-AC_CHECK_HEADERS(sys/ioctl.h)
-AC_CHECK_HEADERS(sys/mkdev.h)
-AC_CHECK_HEADERS(sys/param.h)
-AC_CHECK_HEADERS(sys/prctl.h)
-AC_CHECK_HEADERS(sys/resource.h)
-AC_CHECK_HEADERS(sys/select.h)
-AC_CHECK_HEADERS(sys/sendfile.h)
-AC_CHECK_HEADERS(sys/socket.h)
-AC_CHECK_HEADERS(sys/syscall.h)
-AC_CHECK_HEADERS(sys/sysmacros.h)
-AC_CHECK_HEADERS(sys/time.h)
-AC_CHECK_HEADERS(sys/times.h)
-AC_CHECK_HEADERS(sys/uio.h)
-AC_CHECK_HEADERS(sys/utime.h)
-AC_CHECK_HEADERS(syscall.h)
-AC_CHECK_HEADERS(time.h)
-AC_CHECK_HEADERS(ucontext.h)
-AC_CHECK_HEADERS(utime.h)
-
-AC_ARG_WITH([gmp],
- [AS_HELP_STRING([--without-gmp],
- [disable GNU GMP to accelerate Bignum operations])],
- [],
- [with_gmp=yes])
-AS_IF([test "x$with_gmp" != xno],
- [AC_CHECK_HEADERS(gmp.h)
- AS_IF([test "x$ac_cv_header_gmp_h" != xno],
- AC_SEARCH_LIBS([__gmpz_init], [gmp],
- [AC_DEFINE(HAVE_LIBGMP, 1)]))])
-
-AC_ARG_WITH([jemalloc],
- [AS_HELP_STRING([--with-jemalloc],[use jemalloc allocator])],
- [with_jemalloc=$withval], [with_jemalloc=no])
-AS_IF([test "x$with_jemalloc" != xno],[
- AC_SEARCH_LIBS([malloc_conf], [jemalloc],
- [
- AC_DEFINE(HAVE_LIBJEMALLOC, 1)
- with_jemalloc=yes
- ],
- [test x$with_jemalloc = xyes && with_jemalloc=no])
- AC_CHECK_HEADER(jemalloc/jemalloc.h, [
- AC_DEFINE(RUBY_ALTERNATIVE_MALLOC_HEADER, [<jemalloc/jemalloc.h>])
- ],
- [test x$with_jemalloc = xyes && with_jemalloc=no])
- AS_IF([test "x$with_jemalloc" != xyes], [
- AC_CACHE_CHECK([for jemalloc with JEMALLOC_MANGLE], rb_cv_jemalloc_demangle,
- [AC_LINK_IFELSE([AC_LANG_PROGRAM([@%:@define JEMALLOC_MANGLE 1
- @%:@ifdef RUBY_ALTERNATIVE_MALLOC_HEADER
- @%:@include RUBY_ALTERNATIVE_MALLOC_HEADER
- @%:@else
- @%:@include <jemalloc.h>
- @%:@endif], [return !&malloc_conf])],
- [rb_cv_jemalloc_demangle=yes],
- [rb_cv_jemalloc_demangle=no])
- ])
- ])
- AS_IF([test "x$rb_cv_jemalloc_demangle" = xyes], [
- AC_DEFINE(JEMALLOC_MANGLE)
- with_jemalloc=yes
- ])
- AS_CASE(["$with_jemalloc"],
- [yes],
- [
- AC_DEFINE(HAVE_MALLOC_CONF)
- ac_cv_func_malloc_usable_size=yes
- ],
- [no],
- [AC_MSG_ERROR([jemalloc requested but not found])
- ])
-])
-
-dnl check for large file stuff
-mv confdefs.h confdefs1.h
-: > confdefs.h
-AC_SYS_LARGEFILE
-# On 32-bit Solaris, it is safe to define _LARGEFILE_SOURCE
-# which is not added by AC_SYS_LARGEFILE.
-AS_IF([test x"$enable_largefile" != xno], [
- AS_CASE(["$target_os"], [solaris*], [
- AC_MSG_CHECKING([wheather _LARGEFILE_SOURCE should be defined])
- AS_CASE(["${ac_cv_sys_file_offset_bits}:${ac_cv_sys_large_files}"],
- ["64:"|"64:no"|"64:unknown"], [
- # insert _LARGEFILE_SOURCE before _FILE_OFFSET_BITS line
- # that is the same order as "getconf LFS_CFLAGS" output
- mv confdefs.h largefile0.h
- : > confdefs.h
- AC_DEFINE(_LARGEFILE_SOURCE)
- cat largefile0.h >> confdefs.h
- rm largefile0.h
- AC_MSG_RESULT([yes])
- ], [AC_MSG_RESULT([no])])
- ])
-])
-mv confdefs.h largefile.h
-mv confdefs1.h confdefs.h
-cat largefile.h >> confdefs.h
-
-AS_CASE(["$target_os"],
- [aix*], [
- AS_CASE(["$target_cpu:$ac_cv_sys_large_files"],
- [ppc64:*|powerpc64:*], [],
- [*:no|*:unknown], [],
- [
- # AIX currently does not support a 32-bit call to posix_fadvise()
- # if _LARGE_FILES is defined.
- ac_cv_func_posix_fadvise=no
- ])
- ])
-
-AC_C_BIGENDIAN
-AC_C_CONST
-AC_C_CHAR_UNSIGNED
-AC_C_INLINE
-AC_C_VOLATILE
-AC_C_TYPEOF
-
-AS_CASE(":$ac_cv_c_const:$ac_cv_c_volatile:",
- [*:no:*], [AC_MSG_ERROR(ANSI C-conforming const and volatile are mandatory)])
-
-AC_CHECK_TYPES([long long, off_t])
-
-AC_CACHE_CHECK([char bit], [rb_cv_char_bit],
- [test "$universal_binary" = yes && cross_compiling=yes
- AC_COMPUTE_INT([rb_cv_char_bit], [CHAR_BIT],
- [AC_INCLUDES_DEFAULT([@%:@include <limits.h>])], [rb_cv_char_bit=8])
- test "$universal_binary" = yes && cross_compiling=$real_cross_compiling])
-
-RUBY_CHECK_SIZEOF(int, [], [ILP])
-RUBY_CHECK_SIZEOF(short)
-RUBY_CHECK_SIZEOF(long, [int], [ILP LP])
-RUBY_CHECK_SIZEOF(long long)
-RUBY_CHECK_SIZEOF(__int64, [8], [ILP LP])
-RUBY_CHECK_SIZEOF(__int128, [16], [ILP LP])
-RUBY_CHECK_SIZEOF(off_t)
-RUBY_CHECK_SIZEOF(void*, [int long "long long"], [ILP LP LLP])
-RUBY_CHECK_SIZEOF(float)
-RUBY_CHECK_SIZEOF(double)
-RUBY_CHECK_SIZEOF(time_t, [long "long long"], [], [@%:@include <time.h>])
-RUBY_CHECK_SIZEOF(clock_t, [], [], [@%:@include <time.h>])
-
-AC_CACHE_CHECK(packed struct attribute, rb_cv_packed_struct,
- [rb_cv_packed_struct=no
- for mac in \
- "__pragma(pack(push, 1)) x __pragma(pack(pop))" \
- "x __attribute__((packed))" \
- ; do
- AC_TRY_COMPILE([@%:@define PACKED_STRUCT(x) $mac
- PACKED_STRUCT(struct { int a; });], [],
- [rb_cv_packed_struct=$mac; break])
- done])
-AS_IF([test "$rb_cv_packed_struct" != no], [
- AC_DEFINE_UNQUOTED([PACKED_STRUCT(x)], [$rb_cv_packed_struct])
- RUBY_TRY_CFLAGS(-Wno-address-of-packed-member, [AC_DEFINE(USE_UNALIGNED_MEMBER_ACCESS)])
-], [
- AC_DEFINE_UNQUOTED([PACKED_STRUCT(x)], x)
-])
-
-AS_IF([test "x$ac_cv_type_long_long" = xyes], [
- RUBY_CHECK_PRINTF_PREFIX(long long, ll I64, LL)
-], [test "x$ac_cv_type___int64" = xyes], [
- RUBY_CHECK_PRINTF_PREFIX(__int64, ll I64, LL)
-])
-
-RUBY_REPLACE_TYPE(pid_t, int, PIDT)
-RUBY_REPLACE_TYPE(uid_t, int, UIDT)
-RUBY_REPLACE_TYPE(gid_t, int, GIDT)
-RUBY_REPLACE_TYPE(time_t, [], TIMET, [@%:@include <time.h>])
-RUBY_REPLACE_TYPE(dev_t, [int long "long long"], DEVT)
-RUBY_REPLACE_TYPE(mode_t, ["unsigned short" "unsigned int" long], MODET, [@%:@include <sys/stat.h>])
-RUBY_REPLACE_TYPE(rlim_t, [int long "long long"], RLIM, [
-@%:@ifdef HAVE_SYS_TYPES_H
-@%:@include <sys/types.h>
-@%:@endif
-@%:@ifdef HAVE_SYS_TYPES_H
-@%:@include <sys/time.h>
-@%:@endif
-@%:@include <sys/resource.h>
-])
-RUBY_REPLACE_TYPE(off_t, [], OFFT)
-RUBY_REPLACE_TYPE(clockid_t, [], CLOCKID, [@%:@ifdef HAVE_TIME_H
-@%:@ include <time.h>
-@%:@endif
-@%:@ifdef HAVE_SYS_TIME_H
-@%:@ include <sys/time.h>
-@%:@endif])
-
-AC_CACHE_CHECK(for prototypes, rb_cv_have_prototypes,
- [AC_TRY_COMPILE([int foo(int x) { return 0; }], [return foo(10);],
- rb_cv_have_prototypes=yes,
- rb_cv_have_prototypes=no)])
-AS_IF([test "$rb_cv_have_prototypes" = yes], [
- AC_DEFINE(HAVE_PROTOTYPES)
-])
-
-AC_CACHE_CHECK(token paste string, rb_cv_tokenpaste,
- [AC_TRY_COMPILE([@%:@define paste(a,b) a@%:@@%:@b],
- [int xy = 1; return paste(x,y);],
- rb_cv_tokenpaste=ansi,
- rb_cv_tokenpaste=knr)])
-AS_IF([test "$rb_cv_tokenpaste" = ansi], [
- AC_DEFINE(TOKEN_PASTE(x,y),[x@%:@@%:@y])
-], [
- AC_DEFINE(TOKEN_PASTE(x,y),[x/**/y])
-])
-
-AC_CACHE_CHECK(stringization, rb_cv_stringization, [
- rb_cv_stringization=no
- for string in "#expr" '"expr"'; do
- AC_COMPILE_IFELSE([
- AC_LANG_BOOL_COMPILE_TRY([
-#define STRINGIZE0(expr) $string
-#define STRINGIZE(expr) STRINGIZE0(expr)
-#undef real_test_for_stringization
-#define test_for_stringization -.real_test_for_stringization.-
-const char stringized[[]] = STRINGIZE(test_for_stringization);
-], [sizeof(stringized) == 32])],
- [rb_cv_stringization="$string"; break],
- [rb_cv_stringization=no])
- done]
-)
-AC_DEFINE(STRINGIZE(expr),STRINGIZE0(expr))
-AS_IF([test x"$rb_cv_stringization" != xno -a "$rb_cv_stringization" != "#expr"], [
- AC_DEFINE_UNQUOTED(STRINGIZE0(expr),$rb_cv_stringization)
- AC_DEFINE(OLD_FASHIONED_STRINGIZATION,1)
-])
-
-AC_CACHE_CHECK([string literal concatenation],
- rb_cv_string_literal_concatenation, [
- AC_COMPILE_IFELSE([
- AC_LANG_BOOL_COMPILE_TRY([
-const char concatenated_literal[[]] = "literals" "to"
- "be" "concatenated.";
-], [sizeof(concatenated_literal) == 26])],
- [rb_cv_string_literal_concatenation=yes],
- [rb_cv_string_literal_concatenation=no])]
-)
-AS_IF([test "$rb_cv_string_literal_concatenation" = no], [
- AC_MSG_ERROR([No string literal concatenation])
-])
-
-AC_CACHE_CHECK(for variable length prototypes and stdarg.h, rb_cv_stdarg,
- [AC_TRY_COMPILE([
-#include <stdarg.h>
-int foo(int x, ...) {
- va_list va;
- va_start(va, x);
- va_arg(va, int);
- va_arg(va, char *);
- va_arg(va, double);
- return 0;
-}
-], [return foo(10, "", 3.14);],
- rb_cv_stdarg=yes,
- rb_cv_stdarg=no)])
-AS_IF([test "$rb_cv_stdarg" = yes], [
- AC_DEFINE(HAVE_STDARG_PROTOTYPES)
-])
-
-AC_CACHE_CHECK(for variable length macro, rb_cv_va_args_macro,
- [AC_TRY_COMPILE([
-int foo(int x, ...);
-@%:@define FOO(a, ...) foo(a, @%:@@%:@__VA_ARGS__)
-], [FOO(1);FOO(1,2);FOO(1,2,3);],
- rb_cv_va_args_macro=yes,
- rb_cv_va_args_macro=no)])
-AS_IF([test "$rb_cv_va_args_macro" = yes], [
- AC_DEFINE(HAVE_VA_ARGS_MACRO)
-])
-
-AC_CACHE_CHECK([for alignas() syntax], rb_cv_have_alignas, [
-rb_cv_have_alignas=no
-RUBY_WERROR_FLAG([
-for attr in \
- "_Alignas(x)" \
- "alignas(x)" \
- "@<:@@<:@alignas(x)@:>@@:>@" \
- "__declspec(aligned(x))" \
- "__attribute__((__aligned__(x)))" \
-;
-do
- # C11 _Alignas and GCC __attribute__((__aligned__)) behave
- # slightly differently. What we want is GCC's. Check that
- # here by something C11 does not allow (`struct ALIGNAS ...`)
- AC_TRY_COMPILE(
- [@%:@define ALIGNAS(x) $attr
- struct ALIGNAS(128) conftest_tag { int foo; } foo; ], [],
- [rb_cv_have_alignas="$attr"; break], [])
-done
-])])
-AS_IF([test "$rb_cv_have_alignas" != no], [
- AC_DEFINE_UNQUOTED([RUBY_ALIGNAS(x)], $rb_cv_have_alignas)
-])
-
-AC_CACHE_CHECK([for alignof() syntax], rb_cv_have_alignof,[
-rb_cv_have_alignof=no
-RUBY_WERROR_FLAG([
-for expr in \
- "alignof" \
- "_Alignof" \
- "__alignof" \
- "__alignof__" \
-;
-do
- AC_TRY_COMPILE([
- @%:@ifdef HAVE_STDALIGN_H
- @%:@include <stdalign.h>
- @%:@endif],[return (int)$expr(int);],
- [rb_cv_have_alignof="$expr"; break], [])
-done
-])])
-AS_IF([test "$rb_cv_have_alignof" != no], [
- AC_DEFINE_UNQUOTED(RUBY_ALIGNOF, $rb_cv_have_alignof)
-])
-
-RUBY_FUNC_ATTRIBUTE(__const__, CONSTFUNC)
-RUBY_FUNC_ATTRIBUTE(__pure__, PUREFUNC)
-RUBY_FUNC_ATTRIBUTE(__noreturn__, NORETURN)
-RUBY_FUNC_ATTRIBUTE(__deprecated__, DEPRECATED)
-RUBY_FUNC_ATTRIBUTE(__deprecated__("by "@%:@n), DEPRECATED_BY(n,x), rb_cv_func_deprecated_by)
-RUBY_TYPE_ATTRIBUTE(__deprecated__ mesg, DEPRECATED_TYPE(mesg,x), rb_cv_type_deprecated)
-RUBY_FUNC_ATTRIBUTE(__noinline__, NOINLINE)
-RUBY_FUNC_ATTRIBUTE(__always_inline__, ALWAYS_INLINE)
-RUBY_FUNC_ATTRIBUTE(__no_sanitize__(san), NO_SANITIZE(san, x), rb_cv_func_no_sanitize)
-RUBY_FUNC_ATTRIBUTE(__no_sanitize_address__, NO_SANITIZE_ADDRESS)
-RUBY_FUNC_ATTRIBUTE(__no_address_safety_analysis__, NO_ADDRESS_SAFETY_ANALYSIS)
-RUBY_FUNC_ATTRIBUTE(__warn_unused_result__, WARN_UNUSED_RESULT)
-RUBY_FUNC_ATTRIBUTE(__unused__, MAYBE_UNUSED)
-RUBY_FUNC_ATTRIBUTE(__error__ mesg, ERRORFUNC(mesg,x), rb_cv_func___error__)
-RUBY_FUNC_ATTRIBUTE(__warning__ mesg, WARNINGFUNC(mesg,x), rb_cv_func___warning__)
-RUBY_FUNC_ATTRIBUTE(__weak__, WEAK, rb_cv_func_weak)
-AS_IF([test "$rb_cv_func_weak" != x], [
- AC_DEFINE(HAVE_FUNC_WEAK)
-])
-
-if_i386=${universal_binary+[defined __i386__]}
-RUBY_FUNC_ATTRIBUTE(__stdcall__, FUNC_STDCALL, rb_cv_func_stdcall, ${if_i386})
-RUBY_FUNC_ATTRIBUTE(__cdecl__, FUNC_CDECL, rb_cv_func_cdecl, ${if_i386})
-RUBY_FUNC_ATTRIBUTE(__fastcall__, FUNC_FASTCALL, rb_cv_func_fastcall, ${if_i386})
-RUBY_FUNC_ATTRIBUTE(__optimize__("O0"), FUNC_UNOPTIMIZED, rb_cv_func_unoptimized)
-RUBY_FUNC_ATTRIBUTE(__optimize__("-Os","-fomit-frame-pointer"), FUNC_MINIMIZED, rb_cv_func_minimized)
-
-AS_IF([test "$GCC" = yes], [
- AC_CACHE_CHECK([for function alias], [rb_cv_gcc_function_alias],
- [rb_cv_gcc_function_alias=no
- for a in alias weak,alias; do
- AC_TRY_LINK([void foo(void) {}
- void bar(void) __attribute__(($a("foo")));], [bar()],
- [rb_cv_gcc_function_alias=$a; break])
- done])
- AS_IF([test "$rb_cv_gcc_function_alias" != no], [
- AC_DEFINE(HAVE_ATTRIBUTE_FUNCTION_ALIAS)
- AC_DEFINE_UNQUOTED([RUBY_ALIAS_FUNCTION_TYPE(type, prot, name, args)],
- [type prot __attribute__(($rb_cv_gcc_function_alias(@%:@name)));])
- AC_DEFINE_UNQUOTED([RUBY_ALIAS_FUNCTION_VOID(prot, name, args)],
- [RUBY_ALIAS_FUNCTION_TYPE(void, prot, name, args)])
- ])
-
- AC_CACHE_CHECK([for __atomic builtins], [rb_cv_gcc_atomic_builtins], [
- AC_TRY_LINK([unsigned char atomic_var;],
- [
- __atomic_exchange_n(&atomic_var, 0, __ATOMIC_SEQ_CST);
- __atomic_exchange_n(&atomic_var, 1, __ATOMIC_SEQ_CST);
- __atomic_fetch_add(&atomic_var, 1, __ATOMIC_SEQ_CST);
- __atomic_fetch_sub(&atomic_var, 1, __ATOMIC_SEQ_CST);
- __atomic_or_fetch(&atomic_var, 1, __ATOMIC_SEQ_CST);
- ],
- [rb_cv_gcc_atomic_builtins=yes],
- [rb_cv_gcc_atomic_builtins=no])])
- AS_IF([test "$rb_cv_gcc_atomic_builtins" = yes], [
- AC_DEFINE(HAVE_GCC_ATOMIC_BUILTINS)
- ])
-
- AC_CACHE_CHECK([for __sync builtins], [rb_cv_gcc_sync_builtins], [
- AC_TRY_LINK([unsigned char atomic_var;],
- [
- __sync_lock_test_and_set(&atomic_var, 0);
- __sync_lock_test_and_set(&atomic_var, 1);
- __sync_fetch_and_add(&atomic_var, 1);
- __sync_fetch_and_sub(&atomic_var, 1);
- __sync_or_and_fetch(&atomic_var, 1);
- __sync_val_compare_and_swap(&atomic_var, 0, 1);
- ],
- [rb_cv_gcc_sync_builtins=yes],
- [rb_cv_gcc_sync_builtins=no])])
- AS_IF([test "$rb_cv_gcc_sync_builtins" = yes], [
- AC_DEFINE(HAVE_GCC_SYNC_BUILTINS)
- ])
-
- AC_CACHE_CHECK(for __builtin_unreachable, rb_cv_func___builtin_unreachable,
- [RUBY_WERROR_FLAG(
- [AC_TRY_LINK([volatile int zero;],
- [if (zero) __builtin_unreachable();],
- [rb_cv_func___builtin_unreachable=yes],
- [rb_cv_func___builtin_unreachable=no])
- ])
- ])
- AS_IF([test "$rb_cv_func___builtin_unreachable" = yes], [
- AC_DEFINE_UNQUOTED(UNREACHABLE, [__builtin_unreachable()])
- ])
-])
-
-AC_CACHE_CHECK(for exported function attribute, rb_cv_func_exported, [
-rb_cv_func_exported=no
-RUBY_WERROR_FLAG([
-for mac in '__attribute__ ((__visibility__("default")))' '__declspec(dllexport)'; do
- AC_TRY_COMPILE([@%:@define RUBY_FUNC_EXPORTED $mac extern
- RUBY_FUNC_EXPORTED void conftest_attribute_check(void);], [],
- [rb_cv_func_exported="$mac"; break])
-done
-])])
-AS_IF([test "$rb_cv_func_exported" != no], [
- AC_DEFINE_UNQUOTED(RUBY_FUNC_EXPORTED, [$rb_cv_func_exported extern])
-])
-
-RUBY_APPEND_OPTION(XCFLAGS, -DRUBY_EXPORT)
-
-AC_ARG_ENABLE(mathn,
- AS_HELP_STRING([--disable-mathn], [disable canonicalization for mathn]),
- [mathn=$enableval], [mathn=yes])
-test "x$mathn" = xyes || mathn=
-AC_SUBST(MATHN, $mathn)
-
-AC_CACHE_CHECK(for function name string predefined identifier,
- rb_cv_function_name_string,
- [rb_cv_function_name_string=no
- RUBY_WERROR_FLAG([
- for func in __func__ __FUNCTION__; do
- AC_TRY_LINK([@%:@include <stdio.h>],
- [puts($func);],
- [rb_cv_function_name_string=$func
- break])
- done
- ])]
-)
-AS_IF([test "$rb_cv_function_name_string" != no], [
- AC_DEFINE_UNQUOTED(RUBY_FUNCTION_NAME_STRING, [$rb_cv_function_name_string])
-])
-
-AC_CACHE_CHECK(if enum over int is allowed, rb_cv_enum_over_int, [
- rb_cv_enum_over_int=no
- AS_IF([test "x$ac_cv_type_long_long" = xyes], [
- type="unsigned long long" max="ULLONG_MAX"
- ], [
- type="unsigned long" max="ULONG_MAX"
- ])
- RUBY_WERROR_FLAG([
- AC_COMPILE_IFELSE([
- AC_LANG_BOOL_COMPILE_TRY([
- @%:@include <limits.h>
- enum {conftest_max = $max};
- ], [
- (conftest_max == $max) &&
- (sizeof(conftest_max) == sizeof($type))
- ]
- )],
- [rb_cv_enum_over_int=yes],
- [rb_cv_enum_over_int=no]
- )
- ])
-])
-AS_IF([test $rb_cv_enum_over_int = yes], [
- AC_DEFINE(ENUM_OVER_INT, 1)
-])
-
-dnl Check whether we need to define sys_nerr locally
-AC_CHECK_DECLS([sys_nerr], [], [], [$ac_includes_default
-@%:@include <errno.h>])
-
-AC_CHECK_DECLS([getenv])
-
-AS_CASE(["$target_cpu"],
-[alpha*|sh4|sh4el|sh4eb], [AS_CASE(["$target_os"::"$GCC"],
- [*::yes], # gcc
- [CFLAGS="-mieee $CFLAGS"],
- [osf*], # ccc
- [CFLAGS="-ieee $CFLAGS"],
- )],
-[sparc*], [AC_LIBOBJ([sparc])])
-
-ac_cv_header_net_socket_h=${ac_cv_header_net_socket_h=no}
-AS_IF([test "$ac_cv_header_net_socket_h" = yes], [
- ac_cv_header_sys_socket_h=${ac_cv_header_sys_socket_h=no}
-], [
- ac_cv_header_sys_socket_h=${ac_cv_header_sys_socket_h=yes}
-])
-
-
-AC_TYPE_SIZE_T
-RUBY_CHECK_SIGNEDNESS(size_t, [AC_MSG_ERROR(size_t is signed)], [],
- [@%:@include <sys/types.h>])
-RUBY_CHECK_SIZEOF(size_t, [int long void*], [], [@%:@include <sys/types.h>])
-RUBY_CHECK_SIZEOF(ptrdiff_t, size_t, [], [@%:@include <stddef.h>])
-RUBY_CHECK_PRINTF_PREFIX(size_t, z)
-RUBY_CHECK_PRINTF_PREFIX(ptrdiff_t, t)
-AC_STRUCT_ST_BLKSIZE
-AC_STRUCT_ST_BLOCKS
-AC_STRUCT_ST_RDEV
-RUBY_CHECK_SIZEOF([struct stat.st_size], [off_t int long "long long"], [], [@%:@include <sys/stat.h>])
-AS_IF([test "$ac_cv_member_struct_stat_st_blocks" = yes], [
- RUBY_CHECK_SIZEOF([struct stat.st_blocks], [off_t int long "long long"], [], [@%:@include <sys/stat.h>])
-])
-RUBY_CHECK_SIZEOF([struct stat.st_ino], [long "long long"], [], [@%:@include <sys/stat.h>])
-AC_CHECK_MEMBERS([struct stat.st_atim])
-AC_CHECK_MEMBERS([struct stat.st_atimespec])
-AC_CHECK_MEMBERS([struct stat.st_atimensec])
-AC_CHECK_MEMBERS([struct stat.st_mtim])
-AC_CHECK_MEMBERS([struct stat.st_mtimespec])
-AC_CHECK_MEMBERS([struct stat.st_mtimensec])
-AC_CHECK_MEMBERS([struct stat.st_ctim])
-AC_CHECK_MEMBERS([struct stat.st_ctimespec])
-AC_CHECK_MEMBERS([struct stat.st_ctimensec])
-AC_CHECK_MEMBERS([struct stat.st_birthtimespec])
-
-AC_CHECK_TYPES([struct timeval], [], [], [@%:@ifdef HAVE_TIME_H
-@%:@include <time.h>
-@%:@endif
-@%:@ifdef HAVE_SYS_TIME_H
-@%:@include <sys/time.h>
-@%:@endif])
-
-AS_IF([test "${ac_cv_type_struct_timeval}" = yes], [
- RUBY_CHECK_SIZEOF([struct timeval.tv_sec], [time_t long "long long"], [],
- [@%:@ifdef HAVE_TIME_H
-@%:@include <time.h>
-@%:@endif
-@%:@ifdef HAVE_SYS_TIME_H
-@%:@include <sys/time.h>
-@%:@endif])
- AS_CASE(${ac_cv_sizeof_struct_timeval_tv_sec},
- [SIZEOF_INT], [t=int],
- [SIZEOF_LONG], [t=long],
- [SIZEOF_LONG_LONG], [t=LONG_LONG],
- [t=])
- AS_IF([test "${t}" != ""], [
- AC_DEFINE_UNQUOTED(TYPEOF_TIMEVAL_TV_SEC, [$t])
- ])
-])
-
-AC_CHECK_TYPES([struct timespec], [], [], [@%:@ifdef HAVE_TIME_H
-@%:@include <time.h>
-@%:@endif
-@%:@ifdef HAVE_SYS_TIME_H
-@%:@include <sys/time.h>
-@%:@endif])
-
-AC_CHECK_TYPES([struct timezone], [], [], [@%:@ifdef HAVE_TIME_H
-@%:@ include <time.h>
-@%:@endif
-@%:@ifdef HAVE_SYS_TIME_H
-@%:@ include <sys/time.h>
-@%:@endif])
-
-AC_CACHE_VAL([rb_cv_large_fd_select],
- [AC_CHECK_TYPE(fd_mask, [rb_cv_large_fd_select=yes], [rb_cv_large_fd_select=no], [AC_INCLUDES_DEFAULT([])
-@%:@ifdef HAVE_SYS_SELECT_H
-@%:@ include <sys/select.h>
-@%:@endif])])
-AS_IF([test "$rb_cv_large_fd_select" = yes], [
- AC_DEFINE(HAVE_RB_FD_INIT, 1)
-])
-
-RUBY_DEFINT(int8_t, 1)
-RUBY_DEFINT(uint8_t, 1, unsigned)
-RUBY_DEFINT(int16_t, 2)
-RUBY_DEFINT(uint16_t, 2, unsigned)
-RUBY_DEFINT(int32_t, 4)
-RUBY_DEFINT(uint32_t, 4, unsigned)
-RUBY_DEFINT(int64_t, 8)
-RUBY_DEFINT(uint64_t, 8, unsigned)
-RUBY_DEFINT(int128_t, 16)
-RUBY_DEFINT(uint128_t, 16, unsigned)
-RUBY_DEFINT(intptr_t, void*)
-RUBY_DEFINT(uintptr_t, void*, unsigned)
-AS_IF([test "x$rb_cv_type_intptr_t" != xno], [
- RUBY_CHECK_PRINTF_PREFIX(intptr_t, '' ll I64 l, PTR)
-])
-RUBY_DEFINT(ssize_t, size_t, [], [@%:@include <sys/types.h>]) dnl may differ from int, so not use AC_TYPE_SSIZE_T.
-AS_IF([test "x$rb_cv_type_int64_t" != xno], [
- RUBY_CHECK_PRINTF_PREFIX(int64_t, ll I64 l, 64)
-])
-
-AC_CACHE_CHECK(for stack end address, rb_cv_stack_end_address,
-[rb_cv_stack_end_address=no
- AC_TRY_LINK(
- [extern void *__libc_stack_end;],
- [if (!__libc_stack_end) return 1;],
- [rb_cv_stack_end_address="__libc_stack_end"])
-])
-AS_IF([test $rb_cv_stack_end_address != no], [
- AC_DEFINE_UNQUOTED(STACK_END_ADDRESS, $rb_cv_stack_end_address)
-])
-
-dnl Checks for library functions.
-AC_TYPE_GETGROUPS
-AC_TYPE_SIGNAL
-AS_CASE(["${target_cpu}-${target_os}:${target_archs}"],
-[powerpc-darwin*], [
- AC_LIBSOURCES(alloca.c)
- AC_SUBST([ALLOCA], [\${LIBOBJDIR}alloca.${ac_objext}])
- AC_DEFINE(C_ALLOCA)
- AC_DEFINE_UNQUOTED(alloca, alloca)
- ],
-[universal-darwin*:*ppc*], [
- AC_LIBSOURCES(alloca.c)
- AC_SUBST([ALLOCA], [\${LIBOBJDIR}alloca.${ac_objext}])
- RUBY_DEFINE_IF([defined __powerpc__], C_ALLOCA, 1)
- RUBY_DEFINE_IF([defined __powerpc__], alloca, alloca)
- ],
-[
- AC_FUNC_ALLOCA
- ])
-AS_IF([test "x$ALLOCA" = "x"], [
- AC_CACHE_CHECK([for dynamic size alloca], rb_cv_dynamic_alloca, [
- for chk in ok __chkstk; do
- AC_TRY_LINK([
- @%:@ifdef HAVE_ALLOCA_H
- @%:@include <alloca.h>
- @%:@endif
- void $chk() {}
- int dynamic_alloca_test;
- int dynamic_alloca_result;],
- [dynamic_alloca_result = alloca(dynamic_alloca_test) != 0;],
- [rb_cv_dynamic_alloca=$chk; break])
- done])
- AS_IF([test "x$rb_cv_dynamic_alloca" = "x__chkstk"], [
- AC_DEFINE_UNQUOTED(RUBY_ALLOCA_CHKSTK, _$rb_cv_dynamic_alloca)
- AS_CASE("$target_cpu",
- [x64|x86_64], [
- AC_SUBST([ALLOCA], [\${LIBOBJDIR}x86_64-chkstk.${ac_objext}])
- ],)
- ])
-])
-AC_FUNC_MEMCMP
-
-# http://sources.redhat.com/ml/libc-hacker/2005-08/msg00008.html
-# Debian GNU/Linux Etch's libc6.1 2.3.6.ds1-13etch5 has this problem.
-# Debian GNU/Linux Lenny's libc6.1 2.7-10 has no problem.
-AC_CACHE_CHECK(for broken erfc of glibc-2.3.6 on IA64, rb_cv_broken_glibc_ia64_erfc,
- [AC_TRY_RUN([
-#include <math.h>
-int
-main()
-{
- erfc(10000.0);
- return 0;
-}
-],
- rb_cv_broken_glibc_ia64_erfc=no,
- rb_cv_broken_glibc_ia64_erfc=yes,
- rb_cv_broken_glibc_ia64_erfc=no)])
-AS_CASE([$rb_cv_broken_glibc_ia64_erfc],[yes],[ac_cv_func_erf=no])
-
-AS_CASE(["$target_os"],[freebsd*],[
- AC_DEFINE(BROKEN_CLOSE)
- AC_REPLACE_FUNCS(close)
- ])
-
-AC_REPLACE_FUNCS(acosh)
-AC_REPLACE_FUNCS(cbrt)
-AC_REPLACE_FUNCS(crypt)
-AC_REPLACE_FUNCS(dup2)
-AC_REPLACE_FUNCS(erf)
-AC_REPLACE_FUNCS(explicit_bzero)
-AC_REPLACE_FUNCS(ffs)
-AC_REPLACE_FUNCS(finite)
-AC_REPLACE_FUNCS(flock)
-AC_REPLACE_FUNCS(hypot)
-AC_REPLACE_FUNCS(isinf)
-AC_REPLACE_FUNCS(isnan)
-AC_REPLACE_FUNCS(lgamma_r)
-AC_REPLACE_FUNCS(memmove)
-AC_REPLACE_FUNCS(nan)
-AC_REPLACE_FUNCS(nextafter)
-AC_REPLACE_FUNCS(setproctitle)
-AC_REPLACE_FUNCS(strchr)
-AC_REPLACE_FUNCS(strerror)
-AC_REPLACE_FUNCS(strlcat)
-AC_REPLACE_FUNCS(strlcpy)
-AC_REPLACE_FUNCS(strstr)
-AC_REPLACE_FUNCS(tgamma)
-
-# for missing/setproctitle.c
-AS_CASE(["$target_os"],
-[aix* | k*bsd*-gnu | kopensolaris*-gnu | linux* | darwin*], [AC_DEFINE(SPT_TYPE,SPT_REUSEARGV)],
-[hpux*], [AC_DEFINE(SPT_TYPE,SPT_PSTAT) ],
-[])
-AC_CHECK_HEADERS(sys/pstat.h)
-
-
-AC_CACHE_CHECK(for signbit, rb_cv_have_signbit,
- [AC_TRY_LINK([
-#include <math.h>
-], [int v = signbit(-0.0);],
- rb_cv_have_signbit=yes,
- rb_cv_have_signbit=no)])
-AS_IF([test "$rb_cv_have_signbit" = yes], [
- AC_DEFINE(HAVE_SIGNBIT)
-], [
- AC_LIBOBJ([signbit])
-])
-
-AC_CACHE_CHECK(for broken memmem, rb_cv_broken_memmem, [
- AC_TRY_RUN([
-@%:@include <string.h>
-
-int
-main(int argc, char **argv)
-{
- const char *str = "hogefugafoobar";
- const char *rs = "foo";
- const char *empty = "";
- char *p;
-
- p = memmem(str, strlen(str), rs, strlen(rs));
- if (p == str+8) {
- p = memmem(str, strlen(str), empty, strlen(empty));
- if (p == str)
- return 0;
- }
- return 1;
-}
- ],
- rb_cv_broken_memmem=no,
- rb_cv_broken_memmem=yes,
- rb_cv_broken_memmem=yes)
-])
-test x"$rb_cv_broken_memmem" = xyes && ac_cv_func_memmem=no
-
-AC_FUNC_FORK
-
-AC_CHECK_FUNCS(__syscall)
-AC_CHECK_FUNCS(_longjmp) # used for AC_ARG_WITH(setjmp-type)
-# we don't use _setjmp if _longjmp doesn't exist.
-test x$ac_cv_func__longjmp = xno && ac_cv_func__setjmp=no
-AC_CHECK_FUNCS(arc4random_buf)
-AC_CHECK_FUNCS(atan2l atan2f)
-AC_CHECK_FUNCS(chroot)
-AC_CHECK_FUNCS(chsize)
-AC_CHECK_FUNCS(clock_gettime)
-AC_CHECK_FUNCS(cosh)
-AC_CHECK_FUNCS(crypt_r)
-AC_CHECK_FUNCS(daemon)
-AC_CHECK_FUNCS(dirfd)
-AC_CHECK_FUNCS(dl_iterate_phdr)
-AC_CHECK_FUNCS(dlopen)
-AC_CHECK_FUNCS(dladdr)
-AC_CHECK_FUNCS(dup)
-AC_CHECK_FUNCS(dup3)
-AC_CHECK_FUNCS(eaccess)
-AC_CHECK_FUNCS(endgrent)
-AC_CHECK_FUNCS(eventfd)
-AC_CHECK_FUNCS(fchmod)
-AC_CHECK_FUNCS(fchown)
-AC_CHECK_FUNCS(fcntl)
-AC_CHECK_FUNCS(fdatasync)
-AC_CHECK_FUNCS(fdopendir)
-AC_CHECK_FUNCS(fgetattrlist)
-AC_CHECK_FUNCS(fmod)
-AC_CHECK_FUNCS(fstatat)
-AC_CHECK_FUNCS(fsync)
-AC_CHECK_FUNCS(ftruncate)
-AC_CHECK_FUNCS(ftruncate64) # used for Win32 platform
-AC_CHECK_FUNCS(getattrlist)
-AC_CHECK_FUNCS(getcwd)
-AC_CHECK_FUNCS(getgidx)
-AC_CHECK_FUNCS(getgrnam)
-AC_CHECK_FUNCS(getgrnam_r)
-AC_CHECK_FUNCS(getgroups)
-AC_CHECK_FUNCS(getpgid)
-AC_CHECK_FUNCS(getpgrp)
-AC_CHECK_FUNCS(getpriority)
-AC_CHECK_FUNCS(getpwnam_r)
-AC_CHECK_FUNCS(getresgid)
-AC_CHECK_FUNCS(getresuid)
-AC_CHECK_FUNCS(getrlimit)
-AC_CHECK_FUNCS(getsid)
-AC_CHECK_FUNCS(gettimeofday) # for making ac_cv_func_gettimeofday
-AC_CHECK_FUNCS(getuidx)
-AC_CHECK_FUNCS(gmtime_r)
-AC_CHECK_FUNCS(grantpt)
-AC_CHECK_FUNCS(initgroups)
-AC_CHECK_FUNCS(ioctl)
-AC_CHECK_FUNCS(isfinite)
-AC_CHECK_FUNCS(issetugid)
-AC_CHECK_FUNCS(killpg)
-AC_CHECK_FUNCS(lchmod)
-AC_CHECK_FUNCS(lchown)
-AC_CHECK_FUNCS(link)
-AC_CHECK_FUNCS(llabs)
-AC_CHECK_FUNCS(lockf)
-AC_CHECK_FUNCS(log2)
-AC_CHECK_FUNCS(lstat)
-AC_CHECK_FUNCS(lutimes)
-AC_CHECK_FUNCS(malloc_usable_size)
-AC_CHECK_FUNCS(malloc_size)
-AC_CHECK_FUNCS(mblen)
-AC_CHECK_FUNCS(memalign)
-AC_CHECK_FUNCS(memset_s)
-AC_CHECK_FUNCS(writev)
-AC_CHECK_FUNCS(memrchr)
-AC_CHECK_FUNCS(memmem)
-AC_CHECK_FUNCS(mkfifo)
-AC_CHECK_FUNCS(mknod)
-AC_CHECK_FUNCS(mktime)
-AC_CHECK_FUNCS(openat)
-AC_CHECK_FUNCS(pipe2)
-AC_CHECK_FUNCS(poll)
-AC_CHECK_FUNCS(posix_fadvise)
-AC_CHECK_FUNCS(posix_memalign)
-AC_CHECK_FUNCS(ppoll)
-AC_CHECK_FUNCS(pread)
-AC_CHECK_FUNCS(pwrite)
-AC_CHECK_FUNCS(qsort_r)
-AC_CHECK_FUNCS(qsort_s)
-AC_CHECK_FUNCS(readlink)
-AC_CHECK_FUNCS(round)
-AC_CHECK_FUNCS(sched_getaffinity)
-AC_CHECK_FUNCS(seekdir)
-AC_CHECK_FUNCS(select_large_fdset)
-AC_CHECK_FUNCS(sendfile)
-AC_CHECK_FUNCS(setegid)
-AC_CHECK_FUNCS(setenv)
-AC_CHECK_FUNCS(seteuid)
-AC_CHECK_FUNCS(setgid)
-AC_CHECK_FUNCS(setgroups)
-AC_CHECK_FUNCS(setpgid)
-AC_CHECK_FUNCS(setpgrp)
-AC_CHECK_FUNCS(setregid)
-AC_CHECK_FUNCS(setresgid)
-AC_CHECK_FUNCS(setresuid)
-AC_CHECK_FUNCS(setreuid)
-AC_CHECK_FUNCS(setrgid)
-AC_CHECK_FUNCS(setrlimit)
-AC_CHECK_FUNCS(setruid)
-AC_CHECK_FUNCS(setsid)
-AC_CHECK_FUNCS(setuid)
-AC_CHECK_FUNCS(shutdown)
-AC_CHECK_FUNCS(sigaction)
-AC_CHECK_FUNCS(sigaltstack)
-AC_CHECK_FUNCS(sigprocmask)
-AC_CHECK_FUNCS(sinh)
-AC_CHECK_FUNCS(spawnv)
-AC_CHECK_FUNCS(symlink)
-AC_CHECK_FUNCS(syscall)
-AC_CHECK_FUNCS(sysconf)
-AC_CHECK_FUNCS(tanh)
-AC_CHECK_FUNCS(telldir)
-AC_CHECK_FUNCS(timegm)
-AC_CHECK_FUNCS(times)
-AC_CHECK_FUNCS(truncate)
-AC_CHECK_FUNCS(truncate64) # used for Win32
-AC_CHECK_FUNCS(unsetenv)
-AC_CHECK_FUNCS(utimensat)
-AC_CHECK_FUNCS(utimes)
-AC_CHECK_FUNCS(wait4)
-AC_CHECK_FUNCS(waitpid)
-
-AS_CASE(["$ac_cv_func_memset_s:$ac_cv_func_qsort_s"], [*yes*],
- [RUBY_DEFINE_IF([!defined __STDC_WANT_LIB_EXT1__], [__STDC_WANT_LIB_EXT1__], 1)])
-
-AS_IF([test "$ac_cv_func_getcwd" = yes], [
- AC_CACHE_CHECK(if getcwd allocates buffer if NULL is given, [rb_cv_getcwd_malloc],
- [AC_TRY_RUN([
-@%:@include <stddef.h>
-@%:@include <stdio.h>
-@%:@ifdef HAVE_UNISTD_H
-@%:@include <unistd.h>
-@%:@endif
-@%:@ifndef EXIT_SUCCESS
-@%:@define EXIT_SUCCESS 0
-@%:@endif
-@%:@ifndef EXIT_FAILURE
-@%:@define EXIT_FAILURE 1
-@%:@endif
-
-int
-main(int argc, char **argv)
-{
- if (!getcwd(NULL, 0)) return EXIT_FAILURE;
- return EXIT_SUCCESS;
-}
-],
- rb_cv_getcwd_malloc=yes,
- rb_cv_getcwd_malloc=no,
- AS_CASE($target_os,
- [linux*|darwin*|*bsd|cygwin*|mingw*|mswin*],
- [rb_cv_getcwd_malloc=yes],
- [rb_cv_getcwd_malloc=no]))])
- AS_IF([test "$rb_cv_getcwd_malloc" = no], [AC_DEFINE(NO_GETCWD_MALLOC, 1)])
-])
-
-AS_IF([test "$ac_cv_func_crypt_r" = yes],
- [AC_CHECK_HEADERS(crypt.h)])
-AS_IF([test "$ac_cv_func_crypt_r:$ac_cv_header_crypt_h" = yes:yes],
- [AC_CHECK_MEMBERS([struct crypt_data.initialized], [], [],
- [AC_INCLUDES_DEFAULT([@%:@include <crypt.h>])])])
-
-RUBY_CHECK_BUILTIN_FUNC(__builtin_alloca_with_align, [__builtin_alloca_with_align(1, 4096)])
-RUBY_CHECK_BUILTIN_FUNC(__builtin_assume_aligned, [__builtin_assume_aligned((void*)32, 32)])
-RUBY_CHECK_BUILTIN_FUNC(__builtin_bswap16, [__builtin_bswap16(0)])
-RUBY_CHECK_BUILTIN_FUNC(__builtin_bswap32, [__builtin_bswap32(0)])
-RUBY_CHECK_BUILTIN_FUNC(__builtin_bswap64, [__builtin_bswap64(0)])
-RUBY_CHECK_BUILTIN_FUNC(__builtin_popcount, [__builtin_popcount(0)])
-RUBY_CHECK_BUILTIN_FUNC(__builtin_popcountll, [__builtin_popcountll(0)])
-RUBY_CHECK_BUILTIN_FUNC(__builtin_clz, [__builtin_clz(0)])
-RUBY_CHECK_BUILTIN_FUNC(__builtin_clzl, [__builtin_clzl(0)])
-RUBY_CHECK_BUILTIN_FUNC(__builtin_clzll, [__builtin_clzll(0)])
-RUBY_CHECK_BUILTIN_FUNC(__builtin_ctz, [__builtin_ctz(0)])
-RUBY_CHECK_BUILTIN_FUNC(__builtin_ctzll, [__builtin_ctzll(0)])
-RUBY_CHECK_BUILTIN_FUNC(__builtin_add_overflow, [int x;__builtin_add_overflow(0,0,&x)])
-RUBY_CHECK_BUILTIN_FUNC(__builtin_sub_overflow, [int x;__builtin_sub_overflow(0,0,&x)])
-RUBY_CHECK_BUILTIN_FUNC(__builtin_mul_overflow, [int x;__builtin_mul_overflow(0,0,&x)])
-RUBY_CHECK_BUILTIN_FUNC(__builtin_mul_overflow_p, [__builtin_mul_overflow_p(0,0,(int)0)])
-RUBY_CHECK_BUILTIN_FUNC(__builtin_constant_p, [__builtin_constant_p(0)])
-RUBY_CHECK_BUILTIN_FUNC(__builtin_choose_expr, [
- [int x[__extension__(__builtin_choose_expr(1, 1, -1))]];
- [int y[__extension__(__builtin_choose_expr(0, -1, 1))]];
- ])
-AS_IF([test x$rb_cv_builtin___builtin_choose_expr = xyes], [
- RUBY_CHECK_BUILTIN_FUNC(__builtin_choose_expr_constant_p, [
- [int x[__extension__(__builtin_choose_expr(__builtin_constant_p(1), 1, -1))]];
- [int y[__extension__(__builtin_choose_expr(__builtin_constant_p(foo), -1, 1))]];
- ])
-])
-RUBY_CHECK_BUILTIN_FUNC(__builtin_types_compatible_p, [__builtin_types_compatible_p(int, int)])
-RUBY_CHECK_BUILTIN_FUNC(__builtin_trap, [__builtin_trap()])
-
-AS_IF([test "$ac_cv_func_qsort_r" != no], [
- AC_CACHE_CHECK(whether qsort_r is GNU version, rb_cv_gnu_qsort_r,
- [AC_TRY_COMPILE([
-@%:@include <stdlib.h>
-void (qsort_r)(void *base, size_t nmemb, size_t size,
- int (*compar)(const void *, const void *, void *),
- void *arg);
-],[ ],
- [rb_cv_gnu_qsort_r=yes],
- [rb_cv_gnu_qsort_r=no])
- ])
- AC_CACHE_CHECK(whether qsort_r is BSD version, rb_cv_bsd_qsort_r,
- [AC_TRY_COMPILE([
-@%:@include <stdlib.h>
-void (qsort_r)(void *base, size_t nmemb, size_t size,
- void *arg, int (*compar)(void *, const void *, const void *));
-],[ ],
- [rb_cv_bsd_qsort_r=yes],
- [rb_cv_bsd_qsort_r=no])
- ])
- AS_CASE("$rb_cv_gnu_qsort_r:$rb_cv_bsd_qsort_r",
- [yes:no], [
- AC_DEFINE(HAVE_GNU_QSORT_R, 1)
- ],
- [no:yes], [
- AC_DEFINE(HAVE_BSD_QSORT_R, 1)
- ])
-])
-
-AC_CACHE_CHECK(whether atan2 handles Inf as C99, rb_cv_atan2_inf_c99, [
- AS_IF([test $ac_cv_func_atan2f:$ac_cv_func_atan2l = yes:yes], [
- AC_TRY_RUN([
-@%:@include <math.h>
-@%:@ifdef HAVE_UNISTD_H
-@%:@include <unistd.h>
-@%:@endif
-@%:@ifndef EXIT_SUCCESS
-@%:@define EXIT_SUCCESS 0
-@%:@endif
-@%:@ifndef EXIT_FAILURE
-@%:@define EXIT_FAILURE 1
-@%:@endif
-
-int
-main(int argc, char **argv)
-{
- if (fabs(atan2(INFINITY, INFINITY) - M_PI_4) <= 0.01) return EXIT_SUCCESS;
- return EXIT_FAILURE;
-}
-],
- [rb_cv_atan2_inf_c99=yes],
- [rb_cv_atan2_inf_c99=no],
- [AS_CASE($target_os, [mingw*|mswin*], [rb_cv_atan2_inf_c99=no], [rb_cv_atan2_inf_c99=yes])]
- )
- ], [rb_cv_atan2_inf_c99=no])
-])
-AS_IF([test "x$rb_cv_atan2_inf_c99" = xyes], [AC_DEFINE(ATAN2_INF_C99)])
-
-# Some platform need -lrt for clock_gettime, but the other don't.
-AS_IF([test x"$ac_cv_func_clock_gettime" != xyes], [
- # glibc 2.17 moves clock_* functions from librt to the main C library.
- # http://sourceware.org/ml/libc-announce/2012/msg00001.html
- AC_CHECK_LIB(rt, clock_gettime)
- AS_IF([test x"$ac_cv_lib_rt_clock_gettime" = xyes], [
- AC_DEFINE(HAVE_CLOCK_GETTIME, 1)
- ])
-])
-AC_CHECK_FUNCS(clock_getres) # clock_getres should be tested after clock_gettime test including librt test.
-AC_CHECK_LIB([rt], [timer_create])
-AC_CHECK_LIB([rt], [timer_settime])
-AS_IF([test x"$ac_cv_lib_rt_timer_create" = xyes], [
- AC_DEFINE(HAVE_TIMER_CREATE, 1)
-])
-AS_IF([test x"$ac_cv_lib_rt_timer_settime" = xyes], [
- AC_DEFINE(HAVE_TIMER_SETTIME, 1)
-])
-
-AC_CACHE_CHECK(for unsetenv returns a value, rb_cv_unsetenv_return_value,
- [AC_TRY_COMPILE([
-#include <stdlib.h>
-], [int v = unsetenv("foo");],
- rb_cv_unsetenv_return_value=yes,
- rb_cv_unsetenv_return_value=no)])
-AS_IF([test "$rb_cv_unsetenv_return_value" = no], [
- AC_DEFINE(VOID_UNSETENV)
-])
-
-# End of setjmp check.
-
-AC_ARG_ENABLE(setreuid,
- AS_HELP_STRING([--enable-setreuid], [use setreuid()/setregid() according to need even if obsolete]),
- [use_setreuid=$enableval])
-AS_IF([test "$use_setreuid" = yes], [
- AC_DEFINE(USE_SETREUID)
- AC_DEFINE(USE_SETREGID)
-])
-AC_STRUCT_TIMEZONE
-AC_CACHE_CHECK(for struct tm.tm_gmtoff, rb_cv_member_struct_tm_tm_gmtoff,
- [AC_TRY_COMPILE([
-@%:@define _BSD_SOURCE
-@%:@define _DEFAULT_SOURCE
-@%:@include <time.h>
- ],
- [struct tm t; t.tm_gmtoff = 3600;],
- [rb_cv_member_struct_tm_tm_gmtoff=yes],
- [rb_cv_member_struct_tm_tm_gmtoff=no])])
-AS_IF([test "$rb_cv_member_struct_tm_tm_gmtoff" = yes], [
- AC_DEFINE(HAVE_STRUCT_TM_TM_GMTOFF)
-])
-AC_CACHE_CHECK(for external int daylight, rb_cv_have_daylight,
- [AC_TRY_LINK([#include <time.h>
- int i;],
- [i = daylight;],
- rb_cv_have_daylight=yes,
- rb_cv_have_daylight=no)])
-AS_IF([test "$rb_cv_have_daylight" = yes], [
- AC_DEFINE(HAVE_DAYLIGHT)
-])
-
-AC_CACHE_CHECK(for negative time_t for gmtime(3), rb_cv_negative_time_t,
- [AC_TRY_RUN([
-#include <stdlib.h>
-#include <time.h>
-
-void
-check(tm, y, m, d, h, s)
- struct tm *tm;
- int y, m, d, h, s;
-{
- if (!tm ||
- tm->tm_year != y ||
- tm->tm_mon != m-1 ||
- tm->tm_mday != d ||
- tm->tm_hour != h ||
- tm->tm_sec != s) {
- exit(1);
- }
-}
-
-int
-main()
-{
- time_t t = -1;
- struct tm *tm;
-
- check(gmtime(&t), 69, 12, 31, 23, 59);
- t = ~(time_t)0 << 31;
- check(gmtime(&t), 1, 12, 13, 20, 52);
- return 0;
-}
-],
- rb_cv_negative_time_t=yes,
- rb_cv_negative_time_t=no,
- rb_cv_negative_time_t=yes)])
-AS_IF([test "$rb_cv_negative_time_t" = yes], [
- AC_DEFINE(NEGATIVE_TIME_T)
-])
-
-# [ruby-dev:40910] overflow of time on FreeBSD
-# http://www.freebsd.org/cgi/query-pr.cgi?pr=145341
-AC_CACHE_CHECK(for localtime(3) overflow correctly, rb_cv_localtime_overflow,
- [AC_TRY_RUN([
-#include <stdlib.h>
-#include <time.h>
-
-void
-check(time_t t1)
-{
- struct tm *tm;
- time_t t2;
- tm = localtime(&t1);
- if (!tm)
- return; /* overflow detected. ok. */
- t2 = mktime(tm);
- if (t1 == t2)
- return; /* round-trip. ok. */
- exit(1);
-}
-
-int
-main()
-{
- time_t t;
- if (~(time_t)0 <= 0) {
- t = (((time_t)1) << (sizeof(time_t) * 8 - 2));
- t |= t - 1;
- }
- else {
- t = ~(time_t)0;
- }
- check(t);
- return 0;
-}
-],
- rb_cv_localtime_overflow=yes,
- rb_cv_localtime_overflow=no,
- rb_cv_localtime_overflow=no)])
-AS_IF([test "$rb_cv_localtime_overflow" = no], [
- AC_DEFINE(LOCALTIME_OVERFLOW_PROBLEM)
-])
-
-AS_IF([test "$ac_cv_func_sigprocmask" = yes && test "$ac_cv_func_sigaction" = yes], [
- AC_DEFINE(POSIX_SIGNAL)
-], [
- AC_CHECK_FUNCS(sigsetmask)
- AC_CACHE_CHECK(for BSD signal semantics, rb_cv_bsd_signal,
- [AC_TRY_RUN([
-#include <stdio.h>
-#include <signal.h>
-
-void
-sig_handler(dummy)
- int dummy;
-{
-}
-
-int
-main()
-{
- signal(SIGINT, sig_handler);
- kill(getpid(), SIGINT);
- kill(getpid(), SIGINT);
- return 0;
-}
-],
- rb_cv_bsd_signal=yes,
- rb_cv_bsd_signal=no,
- rb_cv_bsd_signal=$ac_cv_func_sigsetmask)])
- AS_IF([test "$rb_cv_bsd_signal" = yes], [
- AC_DEFINE(BSD_SIGNAL)
- ])
-])
-
-AC_CHECK_TYPES([sig_t],[],[],[@%:@include <signal.h>])
-
-AS_IF([test "$ac_cv_func_getpgid" = no], [
- # AC_FUNC_GETPGRP fails when cross-compiling with old autoconf.
- # autoconf is changed between 2.52d and 2.52f?
- # http://lists.gnu.org/archive/html/bug-gnu-utils/2001-09/msg00181.html
- # "autoconf cleanup for AC_FUNC_GETPGRP and GETPGRP_VOID"
-AC_FUNC_GETPGRP
-])
-AS_IF([test "$ac_cv_func_setpgid:$ac_cv_func_setpgrp" = no:yes], [
- # AC_FUNC_SETPGRP fails when cross-compiling. (until autoconf 2.69?)
- # https://lists.gnu.org/archive/html/bug-autoconf/2013-02/msg00002.html
- # "AC_FUNC_SETPGRP fails to work properly when cross-compiling"
-AC_FUNC_SETPGRP
-])
-
-AS_IF([test x"$ac_cv_func_dirfd" = xno], [
- AS_CASE(["$target_os"],[solaris*],
- [AC_CHECK_MEMBERS([DIR.d_fd, DIR.dd_fd],,,[
-#include <sys/types.h>
-#include <dirent.h>
-])])
-])
-
-AS_IF([test x"$target_cpu" = xia64], [
- AC_LIBOBJ([ia64])
- AC_CACHE_CHECK(for __libc_ia64_register_backing_store_base,
- rb_cv___libc_ia64_register_backing_store_base,
- [rb_cv___libc_ia64_register_backing_store_base=no
- AC_TRY_LINK(
- [extern unsigned long __libc_ia64_register_backing_store_base;],
- [unsigned long p = __libc_ia64_register_backing_store_base;
- printf("%ld\n", p);],
- [rb_cv___libc_ia64_register_backing_store_base=yes])])
- AS_IF([test $rb_cv___libc_ia64_register_backing_store_base = yes], [
- AC_DEFINE(HAVE___LIBC_IA64_REGISTER_BACKING_STORE_BASE)
- ])
-])
-
-AC_CACHE_CHECK(whether right shift preserve sign bit, rb_cv_rshift_sign,
- [AC_COMPILE_IFELSE([AC_LANG_BOOL_COMPILE_TRY([], [(-1==(-1>>1))])],
- rb_cv_rshift_sign=yes,
- rb_cv_rshift_sign=no)])
-AS_IF([test "$rb_cv_rshift_sign" = yes], [
- AC_DEFINE(RSHIFT(x,y), ((x)>>(int)(y)))
-], [
- AC_DEFINE(RSHIFT(x,y), (((x)<0) ? ~((~(x))>>(int)(y)) : (x)>>(int)(y)))
-])
-
-AS_CASE(["$ac_cv_func_gettimeofday:$ac_cv_func_clock_gettime"],
-[*yes*], [],
-[
- AC_MSG_ERROR(clock_gettime() or gettimeofday() must exist)
-])
-
-AS_IF([test "$ac_cv_func_sysconf" = yes], [
- RUBY_CHECK_SYSCONF(CLK_TCK)
-])
-
-AS_IF([test "${universal_binary-no}" = yes ], [
- archflagpat=`eval echo '"'"${ARCH_FLAG}"'"' | sed 's/[[][|.*]]/\\&/g'`
- save_CFLAGS="$CFLAGS" new_cflags=`echo "$CFLAGS" | sed "s|$archflagpat"'||'`
- save_LDFLAGS="$LDFLAGS" new_ldflags=`echo "$LDFLAGS" | sed "s|$archflagpat"'||'`
- stack_dir=
- for archs in ${universal_archnames}; do
- archs=`echo $archs | sed 's/=.*//'`
- CFLAGS="$new_cflags -arch $archs"
- LDFLAGS="$new_ldflags -arch $archs"
- RUBY_STACK_GROW_DIRECTION($archs, dir)
- AS_IF([test x$stack_dir = x], [
- stack_dir=$dir
- ], [test x$stack_dir != x$dir], [
- stack_dir=no
- ])
- done
- CFLAGS="$save_CFLAGS" LDFLAGS="$save_LDFLAGS"
- AS_IF([test x$stack_dir = xno], [
- for archs in ${universal_archnames}; do
- archs=`echo $archs | sed 's/=.*//'`
- eval dir=\$[rb_cv_stack_grow_dir_]AS_TR_SH([$archs])
- RUBY_DEFINE_IF([defined __${archs}__], STACK_GROW_DIRECTION, $dir)
- done
- ], [
- AC_DEFINE_UNQUOTED(STACK_GROW_DIRECTION, $stack_dir)
- ])
-], [
- RUBY_STACK_GROW_DIRECTION($target_cpu, dir)
- AC_DEFINE_UNQUOTED(STACK_GROW_DIRECTION, $dir)
-])
-
-AC_ARG_ENABLE(fiber-coroutine,
- AS_HELP_STRING([--disable-fiber-coroutine], [disable native coroutine implementation for fiber]),
- [rb_cv_fiber_coroutine=$enableval])
-AS_CASE(["$rb_cv_fiber_coroutine"], [yes|''], [
- AC_MSG_CHECKING(native coroutine implementation for ${target_cpu}-${target_os})
- AS_CASE(["$target_cpu-$target_os"],
- [x*64-darwin*], [
- rb_cv_fiber_coroutine=amd64
- ],
- [x*64-linux], [
- AS_CASE(["$ac_cv_sizeof_voidp"],
- [8], [ rb_cv_fiber_coroutine=amd64 ],
- [4], [ rb_cv_fiber_coroutine=x86 ],
- [*], [ rb_cv_fiber_coroutine= ]
- )
- ],
- [*86-linux], [
- rb_cv_fiber_coroutine=x86
- ],
- [x64-mingw32], [
- rb_cv_fiber_coroutine=win64
- ],
- [powerpc64le-linux], [
- rb_cv_fiber_coroutine=ppc64le
- ],
- [*], [
- rb_cv_fiber_coroutine=
- ]
- )
- AC_MSG_RESULT(${rb_cv_fiber_coroutine:-no})
-])
-AS_IF([test "${rb_cv_fiber_coroutine:-no}" != no], [
- COROUTINE_H=coroutine/$rb_cv_fiber_coroutine/Context.h
- AC_DEFINE_UNQUOTED(FIBER_USE_COROUTINE, ["$COROUTINE_H"])
- AC_SUBST(X_FIBER_COROUTINE_H, [$COROUTINE_H])
-])
-
-AS_IF([test x"$enable_pthread" = xyes], [
- for pthread_lib in thr pthread pthreads c c_r root; do
- AC_CHECK_LIB($pthread_lib, pthread_create,
- rb_with_pthread=yes, rb_with_pthread=no)
- AS_IF([test "$rb_with_pthread" = "yes"], [break])
- done
- AS_IF([test x"$rb_with_pthread" = xyes], [
- AC_DEFINE(_REENTRANT)
- AC_DEFINE(_THREAD_SAFE)
- AC_DEFINE(HAVE_LIBPTHREAD)
- AC_CHECK_HEADERS(pthread_np.h, [], [], [@%:@include <pthread.h>])
- AS_CASE(["$pthread_lib:$target_os"],
- [c:*], [],
- [root:*], [],
- [c_r:*|*:openbsd*|*:mirbsd*], [LIBS="-pthread $LIBS"],
- [LIBS="-l$pthread_lib $LIBS"])
- ], [
- AC_MSG_WARN("Don't know how to find pthread library on your system -- thread support disabled")
- ])
- AC_CACHE_CHECK([whether pthread_t is scalar type], [rb_cv_scalar_pthread_t], [
- AC_TRY_COMPILE([
- @%:@include <pthread.h>
- ], [
- pthread_t thread_id;
- thread_id = 0;
- if (!thread_id) return 0;
- ], [rb_cv_scalar_pthread_t=yes], [rb_cv_scalar_pthread_t=no])
- ])
- AS_IF([test x"$rb_cv_scalar_pthread_t" = xyes], [
- : # RUBY_CHECK_SIZEOF(pthread_t, [void* int long], [], [@%:@include <pthread.h>])
- ], [
- AC_DEFINE(NON_SCALAR_THREAD_ID)
- ])
- AC_CHECK_FUNCS(sched_yield pthread_attr_setinheritsched \
- pthread_attr_get_np pthread_attr_getstack pthread_attr_getguardsize \
- pthread_get_stackaddr_np pthread_get_stacksize_np \
- thr_stksegment pthread_stackseg_np pthread_getthrds_np \
- pthread_condattr_setclock \
- pthread_sigmask pthread_setname_np pthread_set_name_np)
- AS_CASE(["$target_os"],[aix*],[ac_cv_func_pthread_getattr_np=no],[AC_CHECK_FUNCS(pthread_getattr_np)])
- set_current_thread_name=
- AS_IF([test "$ac_cv_func_pthread_setname_np" = yes], [
- AC_CACHE_CHECK([arguments of pthread_setname_np], [rb_cv_func_pthread_setname_np_arguments],
- [rb_cv_func_pthread_setname_np_arguments=
- # Linux,AIX, (pthread_self(), name)
- # NetBSD (pthread_self(), name, \"%s\")
- # Darwin (name)
- for mac in \
- "(pthread_self(), name)" \
- "(pthread_self(), name, \"%s\")" \
- "(name)" \
- ; do
- AC_TRY_COMPILE([
- @%:@include <pthread.h>
- @%:@ifdef HAVE_PTHREAD_NP_H
- @%:@include <pthread_np.h>
- @%:@endif
- @%:@define SET_THREAD_NAME(name) pthread_setname_np${mac}
- ],
- [if (SET_THREAD_NAME("conftest")) return 1;],
- [rb_cv_func_pthread_setname_np_arguments="${mac}"
- break])
- done
- ]
- )
- AS_IF([test -n "${rb_cv_func_pthread_setname_np_arguments}"], [
- set_current_thread_name="pthread_setname_np${rb_cv_func_pthread_setname_np_arguments}"
- ])
- ], [test "$ac_cv_func_pthread_set_name_np" = yes], [
- set_current_thread_name="pthread_set_name_np(pthread_self(), name)"
- ])
- AS_IF([test -n "$set_current_thread_name"], [
- AC_DEFINE_UNQUOTED(SET_CURRENT_THREAD_NAME(name), $set_current_thread_name)
- AS_CASE([$set_current_thread_name],
- [*'pthread_self()'*], [
- set_another_thread_name=`echo "$set_current_thread_name" | sed 's/pthread_self()/thid/'`
- AC_DEFINE_UNQUOTED(SET_ANOTHER_THREAD_NAME(thid,name), $set_another_thread_name)
- ])
- ])
-])
-
-AS_IF([test x"$ac_cv_header_ucontext_h" = xno], [
- AC_CACHE_CHECK([if signal.h defines ucontext_t], [rb_cv_ucontext_in_signal_h],
- [AC_TRY_COMPILE([@%:@include <signal.h>],
- [size_t size = sizeof(ucontext_t);],
- [rb_cv_ucontext_in_signal_h=yes], [rb_cv_ucontext_in_signal_h=no])])
- AS_IF([test x"$rb_cv_ucontext_in_signal_h" = xyes], [
- AC_DEFINE_UNQUOTED(UCONTEXT_IN_SIGNAL_H, 1)
- ])
-])
-AS_IF([test x"$ac_cv_header_ucontext_h" = xyes -o x"$rb_cv_ucontext_in_signal_h" = xyes], [
- AC_CACHE_CHECK([if mcontext_t is a pointer], [rb_cv_mcontext_t_ptr],
- [AC_TRY_COMPILE([
- @%:@include <signal.h>
- @%:@ifdef HAVE_UCONTEXT_H
- @%:@include <ucontext.h>
- @%:@endif
- mcontext_t test(mcontext_t mc) {return mc+1;}
- ],
- [test(0);],
- [rb_cv_mcontext_t_ptr=yes], [rb_cv_mcontext_t_ptr=no])])
- AS_IF([test x"$rb_cv_mcontext_t_ptr" = xyes], [
- AC_DEFINE_UNQUOTED(DEFINE_MCONTEXT_PTR(mc, uc), mcontext_t mc = (uc)->uc_mcontext)
- ], [
- AC_DEFINE_UNQUOTED(DEFINE_MCONTEXT_PTR(mc, uc), mcontext_t *mc = &(uc)->uc_mcontext)
- ])
- AS_IF([test x"$rb_with_pthread" = xyes], [
- AC_CHECK_FUNCS(getcontext setcontext)
- ])
-])
-
-AS_IF([test "$ac_cv_func_fork_works" = "yes" -a "$rb_with_pthread" = "yes"], [
- AC_CACHE_CHECK([if fork works with pthread], rb_cv_fork_with_pthread,
- [AC_TRY_RUN([
-#include <stdlib.h>
-#include <unistd.h>
-#include <pthread.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <signal.h>
-#ifndef EXIT_SUCCESS
-#define EXIT_SUCCESS 0
-#endif
-#ifndef EXIT_FAILURE
-#define EXIT_FAILURE 1
-#endif
-
-void *
-thread_func(void *dmy)
-{
- return dmy;
-}
-
-int
-use_threads(void)
-{
- pthread_t tid;
- if (pthread_create(&tid, 0, thread_func, 0) != 0) {
- return -1;
- }
- if (pthread_join(tid, 0) != 0) {
- return -1;
- }
- return 0;
-}
-
-int
-main(int argc, char *argv[])
-{
- pid_t pid;
- if (use_threads()) return EXIT_FAILURE;
- pid = fork();
-
- if (pid) {
- int loc;
- sleep(1);
- if (waitpid(pid, &loc, WNOHANG) == 0) {
- kill(pid, SIGKILL);
- return EXIT_FAILURE;
- }
- if (!WIFEXITED(loc) || WEXITSTATUS(loc) != EXIT_SUCCESS)
- return EXIT_FAILURE;
- }
- else {
- if (use_threads()) return EXIT_FAILURE;
- }
-
- return EXIT_SUCCESS;
-}],
- rb_cv_fork_with_pthread=yes,
- rb_cv_fork_with_pthread=no,
- rb_cv_fork_with_pthread=yes)])
- test x$rb_cv_fork_with_pthread = xyes || AC_DEFINE(CANNOT_FORK_WITH_PTHREAD)
-])
-}
-
-: "runtime section" && {
-dnl wheather use dln_a_out or not
-AC_ARG_WITH(dln-a-out,
- AS_HELP_STRING([--with-dln-a-out], [use dln_a_out if possible]),
- [
- AS_CASE([$withval],
- [yes], [
- AS_IF([test "$enable_shared" = yes], [
- AC_MSG_ERROR(dln_a_out can not make shared library)
- ])
- with_dln_a_out=yes],
- [
- with_dln_a_out=no])], [with_dln_a_out=no])
-
-AC_CACHE_CHECK(whether ELF binaries are produced, rb_cv_binary_elf,
-[AC_TRY_LINK([],[], [
-AS_CASE(["`head -1 conftest$EXEEXT | tr -dc '\177ELF' | tr '\177' .`"],
-[.ELF*], [rb_cv_binary_elf=yes], [rb_cv_binary_elf=no])],
-rb_cv_binary_elf=no)])
-
-AS_IF([test "$rb_cv_binary_elf" = yes], [
- AC_DEFINE(USE_ELF)
- AS_IF([test "$with_dln_a_out" = yes], [
- AC_MSG_ERROR(dln_a_out does not work with ELF)
- ])
- AC_CHECK_HEADERS([elf.h elf_abi.h])
- AS_IF([test $ac_cv_header_elf_h = yes -o $ac_cv_header_elf_abi_h = yes], [
- AC_LIBOBJ([addr2line])
- AS_IF([test "x$compress_debug_sections" = xzlib], [
- AC_CHECK_LIB([z], [uncompress])
- ])
- ])
-])
-
-AC_CHECK_HEADERS([mach-o/loader.h])
-AS_IF([test "$ac_cv_header_mach_o_loader_h" = yes], [
- AC_LIBOBJ([addr2line])
-])
-
-AS_CASE(["$target_os"],
-[linux* | gnu* | k*bsd*-gnu | bsdi* | kopensolaris*-gnu], [
- AS_IF([test "$rb_cv_binary_elf" = no], [
- with_dln_a_out=yes
- ], [
- LDFLAGS="$LDFLAGS -rdynamic"
- ])])
-LIBEXT=a
-
-AC_SUBST(DLDFLAGS)dnl
-AC_SUBST(ARCH_FLAG)dnl
-AC_SUBST(MJIT_HEADER_FLAGS)dnl
-AC_SUBST(MJIT_HEADER_INSTALL_DIR)dnl
-AC_SUBST(MJIT_CC)dnl
-AS_IF([test "$GCC" = "yes"], [
- AS_CASE(["$target_os"],[aix*],[mjit_std_cflag="-std=gnu99"])
-])
-AC_SUBST(MJIT_CFLAGS, [${MJIT_CFLAGS-"-w ${mjit_std_cflag} ${orig_cflags}"}])dnl
-AC_SUBST(MJIT_OPTFLAGS, [${MJIT_OPTFLAGS-'$(optflags)'}])dnl
-AC_SUBST(MJIT_DEBUGFLAGS, [${MJIT_DEBUGFLAGS-'$(debugflags)'}])dnl
-AC_SUBST(MJIT_LDSHARED)dnl
-
-AC_SUBST(STATIC)dnl
-AC_SUBST(CCDLFLAGS)dnl
-AC_SUBST(LDSHARED)dnl
-AC_SUBST(LDSHAREDXX)dnl
-AC_SUBST(DLEXT)dnl
-AC_SUBST(DLEXT2)dnl
-AC_SUBST(LIBEXT)dnl
-AC_SUBST(ASMEXT, S)dnl
-
-STATIC=
-
-AS_IF([test "$with_dln_a_out" != yes], [
- rb_cv_dlopen=unknown
- AC_MSG_CHECKING(whether OS depend dynamic link works)
- AS_IF([test "$GCC" = yes], [
- AS_CASE(["$target_os"],
- [darwin*], [
- # The -fno-common is needed if we wish to embed the Ruby interpreter
- # into a plugin module of some project (as opposed to embedding it
- # within the project's application). The -I/usr/local/include is
- # needed because CPP as discovered by configure (cc -E -traditional)
- # fails to consult /usr/local/include by default. This causes
- # mkmf.rb's have_header() to fail if the desired resource happens to be
- # installed in the /usr/local tree.
- RUBY_APPEND_OPTION(CCDLFLAGS, -fno-common)],
- [bsdi*|cygwin*|mingw*|aix*|interix*], [ ],
- [
- RUBY_APPEND_OPTION(CCDLFLAGS, -fPIC)])
- ], [
- AS_CASE(["$target_os"],
- [hpux*], [CCDLFLAGS="$CCDLFLAGS +Z"],
- [solaris*|irix*], [CCDLFLAGS="$CCDLFLAGS -KPIC"],
- [sunos*], [CCDLFLAGS="$CCDLFLAGS -PIC"],
- [esix*|uxpds*], [CCDLFLAGS="$CCDLFLAGS -KPIC"],
- [: ${CCDLFLAGS=""}])
- ])
-
-
- AC_ARG_ENABLE(rpath,
- AS_HELP_STRING([--enable-rpath], [embed run path into extension libraries.
- enabled by default on ELF platforms]),
- [enable_rpath=$enableval], [enable_rpath="$rb_cv_binary_elf"])
-
- AS_CASE(["$target_os"],
- [hpux*], [ DLDFLAGS="$DLDFLAGS -E"
- : ${LDSHARED='$(LD) -b'}
- XLDFLAGS="$XLDFLAGS -Wl,-E"
- : ${LIBPATHENV=SHLIB_PATH}
- rb_cv_dlopen=yes],
- [solaris*], [ AS_IF([test "$GCC" = yes], [
- : ${LDSHARED='$(CC) -shared'}
- AS_IF([test "$rb_cv_prog_gnu_ld" = yes], [
- LDFLAGS="$LDFLAGS -Wl,-E"
- ])
- ], [
- : ${LDSHARED='$(CC) -G'}
- ])
- AS_IF([test "$ac_cv_sizeof_voidp" = 8], [
- : ${LIBPATHENV=LD_LIBRARY_PATH_64}
- : ${PRELOADENV=LD_PRELOAD_64}
- ], [
- : ${LIBPATHENV=LD_LIBRARY_PATH_32}
- : ${PRELOADENV=LD_PRELOAD_32}
- ])
- rb_cv_dlopen=yes],
- [sunos*], [ : ${LDSHARED='$(LD) -assert nodefinitions'}
- rb_cv_dlopen=yes],
- [irix*], [ : ${LDSHARED='$(LD) -shared'}
- rb_cv_dlopen=yes],
- [sysv4*], [ : ${LDSHARED='$(LD) -G'}
- rb_cv_dlopen=yes],
- [nto-qnx*], [ : ${LDSHARED='$(CC) -shared'}
- rb_cv_dlopen=yes],
- [esix*|uxpds*], [ : ${LDSHARED='$(LD) -G'}
- rb_cv_dlopen=yes],
- [osf*], [ : ${LDSHARED='$(LD) -shared -expect_unresolved "*"'}
- rb_cv_dlopen=yes],
- [bsdi3*], [ AS_CASE(["$CC"],
- [*shlicc*], [ : ${LDSHARED='$(CC) -r'}
- rb_cv_dlopen=yes])],
- [linux* | gnu* | k*bsd*-gnu | netbsd* | bsdi* | kopensolaris*-gnu | haiku*], [
- : ${LDSHARED='$(CC) -shared'}
- AS_IF([test "$rb_cv_binary_elf" = yes], [
- LDFLAGS="$LDFLAGS -Wl,-export-dynamic"
- ])
- rb_cv_dlopen=yes],
- [interix*], [ : ${LDSHARED='$(CC) -shared'}
- XLDFLAGS="$XLDFLAGS -Wl,-E"
- LIBPATHFLAG=" -L%1\$-s"
- rb_cv_dlopen=yes],
- [freebsd*|dragonfly*], [
- : ${LDSHARED='$(CC) -shared'}
- AS_IF([test "$rb_cv_binary_elf" = yes], [
- LDFLAGS="$LDFLAGS -rdynamic"
- DLDFLAGS="$DLDFLAGS "'-Wl,-soname,$@'
- ], [
- test "$GCC" = yes && test "$rb_cv_prog_gnu_ld" = yes || LDSHARED='$(LD) -Bshareable'
- ])
- rb_cv_dlopen=yes],
- [openbsd*|mirbsd*], [ : ${LDSHARED='$(CC) -shared ${CCDLFLAGS}'}
- AS_IF([test "$rb_cv_binary_elf" = yes], [
- LDFLAGS="$LDFLAGS -Wl,-E"
- ])
- rb_cv_dlopen=yes],
- [darwin*], [ : ${LDSHARED='$(CC) -dynamic -bundle'}
- : ${DLDSHARED='$(CC) -dynamiclib'}
- : ${LDFLAGS=""}
- : ${LIBPATHENV=DYLD_FALLBACK_LIBRARY_PATH}
- : ${PRELOADENV=DYLD_INSERT_LIBRARIES}
- rb_cv_dlopen=yes],
- [aix*], [ : ${LDSHARED='$(CC)'}
- AS_IF([test "$GCC" = yes], [
- LDSHARED="$LDSHARED ${linker_flag}-G -shared"
- ], [
- LDSHARED="$LDSHARED ${linker_flag}-G"
- ])
- EXTDLDFLAGS='-e$(TARGET_ENTRY)'
- XLDFLAGS="${linker_flag}"'-bE:$(ARCHFILE)'" ${linker_flag}-brtl"
- XLDFLAGS="$XLDFLAGS ${linker_flag}-blibpath:${prefix}/lib:${LIBPATH:-/usr/lib:/lib}"
- : ${ARCHFILE="ruby.imp"}
- TRY_LINK='$(CC) -oconftest $(INCFLAGS) -I$(hdrdir) $(CPPFLAGS)'
- TRY_LINK="$TRY_LINK"' $(CFLAGS) $(src) $(LIBPATH) $(LDFLAGS) $(LOCAL_LIBS) $(LIBS)'
- : ${LIBPATHENV=LIBPATH}
- : ${PRELOADENV=LDR_PRELOAD}
- rb_cv_dlopen=yes],
- [nto-qnx*], [ DLDFLAGS="$DLDFLAGS -L/lib -L/usr/lib -L/usr/local/lib"
- : ${LDSHARED='$(LD) -Bshareable -x'}
- LDFLAGS="$LDFLAGS -L/lib -L/usr/lib -L/usr/local/lib"
- rb_cv_dlopen=yes],
- [cygwin*|mingw*], [
- : ${LDSHARED='$(CC) -shared'}
- XLDFLAGS="$XLDFLAGS -Wl,--stack,0x00200000,--enable-auto-import"
- DLDFLAGS="${DLDFLAGS} -Wl,--enable-auto-image-base,--enable-auto-import"
- : ${LIBPATHENV=PATH}
- : ${PRELOADENV=""}
- rb_cv_dlopen=yes],
- [hiuxmpp], [ : ${LDSHARED='$(LD) -r'}],
- [atheos*], [ : ${LDSHARED='$(CC) -shared'}
- rb_cv_dlopen=yes],
- [ : ${LDSHARED='$(LD)'}])
- AC_MSG_RESULT($rb_cv_dlopen)
-
- AS_IF([test "$rb_cv_dlopen" = yes], [
- AS_CASE(["$target_os"],
- [darwin*], [
- for flag in \
- "-undefined dynamic_lookup" \
- "-multiply_defined suppress" \
- ; do
- test "x${linker_flag}" = x || flag="${linker_flag}`echo ${flag} | tr ' ' ,`"
- RUBY_TRY_LDFLAGS([$flag], [], [flag=])
- AS_IF([test "x$flag" != x], [
- RUBY_APPEND_OPTIONS(DLDFLAGS, [$flag])
- ])
- done
- ])
- ])
-
- AS_IF([test "$enable_rpath:${RPATHFLAG}" = yes:], [
- AS_IF([test "x$rpathflag" != x], [
- RPATHFLAG=" ${rpathflag}%1\$-s"
- ])
- ])
-])
-AS_IF([test "${LDSHAREDXX}" = ""], [
- AS_CASE(["${LDSHARED}"],
- [*'$(CC)'*], [
- LDSHAREDXX=`echo "${LDSHARED}" | sed 's/\$(CC)/$(CXX)/'`
- ],
- [*'${CC}'*], [
- LDSHAREDXX=`echo "${LDSHARED}" | sed 's/\${CC}/${CXX}/'`
- ],
- [*$CC*], [
- LDSHAREDXX=`echo "${LDSHARED}" | sed "s|$CC|$CXX|"`
- ],
- [ld" "*], [
- ])
-])
-AS_CASE([${RPATHFLAG}],[*'%1$'*],[: ${LIBPATHFLAG=' -L%1$-s'}],[: ${LIBPATHFLAG=' -L%s'}])
-
-AC_SUBST(LINK_SO)
-AC_SUBST(LIBPATHFLAG)
-AC_SUBST(RPATHFLAG)
-AC_SUBST(LIBPATHENV, "${LIBPATHENV-LD_LIBRARY_PATH}")
-AC_SUBST(PRELOADENV, "${PRELOADENV-LD_PRELOAD}")
-AC_SUBST(TRY_LINK)
-
-AS_IF([test "x$OPT_DIR" != x], [
- pat=`echo "${LDFLAGS_OPTDIR}" | sed ['s/[][\\.*|]/\\\\&/']`
- LDFLAGS=`echo "${LDFLAGS}" | sed "s| ${pat}||"`
- val=`IFS="$PATH_SEPARATOR"
- for dir in $OPT_DIR; do
- echo x ${LIBPATHFLAG} ${RPATHFLAG} |
- sed "s/^x *//;s${IFS}"'%1\\$-s'"${IFS}${dir}/lib${IFS}g;s${IFS}%s${IFS}${dir}/lib${IFS}g"
- done | tr '\012' ' ' | sed 's/ *$//'`
- AS_IF([test x"$val" != x], [
- test x"${LDFLAGS}" = x || LDFLAGS="$LDFLAGS "
- LDFLAGS="$LDFLAGS$val"
- test x"${DLDFLAGS}" = x || DLDFLAGS="$DLDFLAGS "
- DLDFLAGS="$DLDFLAGS$val"
- ])
- LDFLAGS_OPTDIR="$val"
-])
-
-AS_CASE(["$target_os"],
-[freebsd*], [
- AC_CHECK_LIB([procstat], [procstat_open_sysctl])
- AS_IF([test "x$ac_cv_lib_procstat_procstat_open_sysctl" = xyes], [
- AC_CHECK_FUNCS(procstat_getvmmap)
- ])
- ])
-AS_CASE(["$target_cpu-$target_os"],
-[*-darwin*], [
- AC_CHECK_HEADERS([execinfo.h])
- AS_IF([test "x$ac_cv_header_execinfo_h" = xyes], [
- AC_CHECK_LIB([execinfo], [backtrace])
- AC_CHECK_HEADERS([libunwind.h])
- ])],
-[*-freebsd*|x86_64-netbsd*], [
- AC_CHECK_HEADERS([execinfo.h])
- AS_IF([test "x$ac_cv_header_execinfo_h" = xyes], [
- AC_CHECK_LIB([execinfo], [backtrace])
- AC_CHECK_LIB([unwind], [unw_backtrace])
- ])])
-AC_CHECK_FUNCS(backtrace)
-
-AS_IF([test "x$ac_cv_func_backtrace" = xyes], [
- AC_CACHE_CHECK(for broken backtrace, rb_cv_broken_backtrace,
- [AC_TRY_RUN([
-#include <unistd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <string.h>
-#include <signal.h>
-#include <execinfo.h>
-
-#define TRACE_SIZE 256
-
-void sigsegv(int signum, siginfo_t *info, void *ctx){
- void *trace[TRACE_SIZE];
- int n = backtrace(trace, TRACE_SIZE);
- if (n > 0) {
- /*fprintf(stdout, "backtrace:%d\n",n);*/
- } else {
- _exit(EXIT_FAILURE);
- }
- _exit(EXIT_SUCCESS);
-}
-int
-main(void)
-{
- volatile int *a = NULL;
- stack_t ss;
- struct sigaction sa;
-
- ss.ss_sp = malloc(SIGSTKSZ);
- if (ss.ss_sp == NULL) {
- fprintf(stderr, "cannot allocate memory for sigaltstack\n");
- return EXIT_FAILURE;
- }
- ss.ss_size = SIGSTKSZ;
- ss.ss_flags = 0;
- if (sigaltstack(&ss, NULL) == -1) {
- fprintf(stderr, "sigaltstack failed\n");
- return EXIT_FAILURE;
- }
- memset(&sa, 0, sizeof(struct sigaction));
- sigemptyset(&sa.sa_mask);
- sa.sa_sigaction = sigsegv;
- sa.sa_flags |= SA_SIGINFO;
- sa.sa_flags |= SA_ONSTACK;
- sigaction(SIGSEGV, &sa, NULL);
- a[0] = 1;
- return EXIT_SUCCESS;
-}
-],
- rb_cv_broken_backtrace=no,
- rb_cv_broken_backtrace=yes,
- rb_cv_broken_backtrace=no)])
- AS_IF([test "$rb_cv_broken_backtrace" = yes], [
- AC_DEFINE(BROKEN_BACKTRACE, 1)
- ])
-])
-
-AC_ARG_WITH(valgrind,
- AS_HELP_STRING([--without-valgrind],[disable valgrind memcheck support]),
- [], with_valgrind=yes)
-AS_IF([test x$with_valgrind != xno],
- [AC_CHECK_HEADERS(valgrind/memcheck.h)])
-
-dln_a_out_works=no
-AS_IF([test "$ac_cv_header_a_out_h" = yes], [
- AS_IF([test "$with_dln_a_out" = yes || test "$rb_cv_dlopen" = unknown], [
- cat confdefs.h > config.h
- AC_CACHE_CHECK(whether matz's dln works, rb_cv_dln_a_out,
- [AC_TRY_COMPILE([
-#define USE_DLN_A_OUT
-#include "dln.c"
-],
- [],
- rb_cv_dln_a_out=yes,
- rb_cv_dln_a_out=no)])
- AS_IF([test "$rb_cv_dln_a_out" = yes], [
- dln_a_out_works=yes
- AC_DEFINE(USE_DLN_A_OUT)
- ])
- ])
-])
-
-AS_IF([test "$dln_a_out_works" = yes], [
- AS_IF([test "$GCC" = yes], [
- STATIC=-static
- ], [
- STATIC=-Bstatic
- ])
- DLEXT=so
- CCDLFLAGS=
-], [
- AS_CASE(["$target_os"],
- [hpux*], [
- DLEXT=sl],
- [darwin*], [
- SOEXT=dylib
- DLEXT=bundle],
- [cygwin*|mingw*|*djgpp*], [
- LOAD_RELATIVE=1
- SOEXT=dll
- DLEXT=so],
- [
- DLEXT=so])
-])
-: ${SOEXT="${DLEXT}"}
-AC_SUBST(SOEXT)
-AS_IF([test "$rb_cv_dlopen:$load_relative" = yes:yes], [
- AS_IF([test "$ac_cv_func_dladdr" = yes], [
- LOAD_RELATIVE=1
- ])
-])
-AS_IF([test x"$LOAD_RELATIVE" = x1], [
- load_relative=yes
-], [
- unset load_relative
-])
-
-len=2 # .rb
-n=`expr "$DLEXT" : '.*'`; test "$n" -gt "$len" && len=$n
-n=`expr "$DLEXT2" : '.*'`; test "$n" -gt "$len" && len=$n
-AC_DEFINE_UNQUOTED(DLEXT_MAXLEN, `expr $len + 1`)
-test ".$DLEXT" = "." || AC_DEFINE_UNQUOTED(DLEXT, ".$DLEXT")
-test ".$DLEXT2" = "." || AC_DEFINE_UNQUOTED(DLEXT2, ".$DLEXT2")
-AC_SUBST(DLEXT)
-
-AS_IF([test "$with_dln_a_out" = yes], [
- STRIP=true
-], [
- AC_CHECK_TOOL(STRIP, strip, :)dnl
-])
-
-AS_CASE(["$target_os"],
- [linux* | gnu* | k*bsd*-gnu | kopensolaris*-gnu], [
- STRIP="$STRIP -S -x"],
- [darwin*], [
- STRIP="$STRIP -A -n"])
-
-AC_ARG_WITH(ext,
- AC_HELP_STRING([--with-ext=EXTS],
- [pass to --with-ext option of extmk.rb]))
-AC_ARG_WITH(out-ext,
- AC_HELP_STRING([--with-out-ext=EXTS],
- [pass to --without-ext option of extmk.rb]))
-EXTSTATIC=
-AC_SUBST(EXTSTATIC)dnl
-AC_ARG_WITH(static-linked-ext,
- AS_HELP_STRING([--with-static-linked-ext], [link external modules statically]),
- [AS_CASE([$withval],[yes],[STATIC=;EXTSTATIC=static],[no],[],[EXTSTATIC="$withval"])])
-AS_CASE([",$EXTSTATIC,"], [,static,|*,enc,*], [
- ENCOBJS='enc/encinit.$(OBJEXT) enc/libenc.$(LIBEXT) enc/libtrans.$(LIBEXT)'
- EXTOBJS='ext/extinit.$(OBJEXT)'
- AC_DEFINE_UNQUOTED(EXTSTATIC, 1)
- AC_SUBST(ENCSTATIC, static)
-], [
- ENCOBJS='dmyenc.$(OBJEXT)'
- EXTOBJS='dmyext.$(OBJEXT)'
-])
-AC_SUBST(ENCOBJS)
-AC_SUBST(EXTOBJS)
-
-AC_ARG_WITH(setup,
- AS_HELP_STRING([--with-setup=SETUP], [use extension libraries setup]),
- [setup=$withval])
-AS_IF([test -n "$setup"], [
- AS_IF([! test -f "ext/$setup" -o -f "$srcdir/ext/$setup"], [
- AC_MSG_ERROR(Setup file $setup not found under ext or $srcdir/ext)
- ])
-], [test -f "$srcdir/ext/Setup.$target_os"], [
- setup="Setup.$target_os"
-], [
- setup=
- for file in "$srcdir"/ext/Setup.*; do
- AS_CASE(["$file"], [*~|*.bak|*.orig|*.rej|*.tmp], [continue])
- setup=`basename "$file"`
- AS_CASE(["$target_os"], [`expr "$setup" : 'Setup.\(.*\)'`*], [break])
- platform=`sed '/^option *platform */!d;s///;s/|/*|/g;q' "$file"`
- AS_IF([test "x$platform" != x], [
- eval "AS_CASE([\"\$target_os\"], [$platform*], [break])"
- ])
- setup=
- done
- : ${setup:=Setup}
-])
-AC_SUBST(setup)
-
-rubylibprefix='${libdir}/${RUBY_BASE_NAME}'
-AC_ARG_WITH(rubylibprefix,
- AS_HELP_STRING([--with-rubylibprefix=DIR], [prefix for ruby libraries [[LIBDIR/RUBY_BASE_NAME]]]),
- [AS_IF([test "x$withval" = xno], [
- AC_MSG_ERROR([No ruby, No libprefix])
- ])
- rubylibprefix="$withval"])
-AC_SUBST(rubylibprefix)
-
-AS_IF([test x"${exec_prefix}" != xNONE], [
- RUBY_EXEC_PREFIX="$exec_prefix"
-], [test x"$prefix" != xNONE], [
- RUBY_EXEC_PREFIX="$prefix"
-], [
- RUBY_EXEC_PREFIX=$ac_default_prefix
-])
-pat=`echo "${RUBY_EXEC_PREFIX}" | tr -c '\012' .`'\(.*\)'
-for var in bindir libdir rubylibprefix; do
- eval val='"$'$var'"'
- AS_CASE(["$val"], ["${RUBY_EXEC_PREFIX}"*], [val='${exec_prefix}'"`expr \"$val\" : \"$pat\"`"])
- eval $var='"$val"'
-done
-
-BTESTRUBY='$(MINIRUBY)'
-AS_IF([test x"$cross_compiling" = xyes], [
- test x"$MINIRUBY" = x && MINIRUBY="${RUBY-$BASERUBY} -I`$CHDIR .; pwd` "-r'$(arch)-fake'
- XRUBY_LIBDIR=`${RUBY-$BASERUBY} -rrbconfig -e ['puts RbConfig::CONFIG["libdir"]']`
- XRUBY_RUBYLIBDIR=`${RUBY-$BASERUBY} -rrbconfig -e ['puts RbConfig::CONFIG["rubylibdir"]']`
- XRUBY_RUBYHDRDIR=`${RUBY-$BASERUBY} -rrbconfig -e ['puts RbConfig::CONFIG["rubyhdrdir"]']`
- AC_SUBST(XRUBY_LIBDIR)
- AC_SUBST(XRUBY_RUBYLIBDIR)
- AC_SUBST(XRUBY_RUBYHDRDIR)
- PREP='$(arch)-fake.rb'
- RUNRUBY_COMMAND='$(MINIRUBY) -I`cd $(srcdir)/lib; pwd`'
- RUNRUBY='$(RUNRUBY_COMMAND)'
- XRUBY='$(MINIRUBY)'
- BOOTSTRAPRUBY='$(BASERUBY)'
- TEST_RUNNABLE=no
- CROSS_COMPILING=yes
-], [
- MINIRUBY='./miniruby$(EXEEXT) -I$(srcdir)/lib -I.'
- MINIRUBY="$MINIRUBY"' -I$(EXTOUT)/common'
- PREP='miniruby$(EXEEXT)'
- RUNRUBY_COMMAND='$(MINIRUBY) $(srcdir)/tool/runruby.rb --extout=$(EXTOUT) $(RUNRUBYOPT)'
- RUNRUBY='$(RUNRUBY_COMMAND) --'
- XRUBY='$(RUNRUBY)'
- BOOTSTRAPRUBY='$(MINIRUBY)'
- TEST_RUNNABLE=yes
- CROSS_COMPILING=no
-])
-AC_SUBST(TEST_RUNNABLE)
-AC_SUBST(CROSS_COMPILING)
-AC_SUBST(MINIRUBY)
-AC_SUBST(BTESTRUBY)
-AC_SUBST(PREP)
-AC_SUBST(RUNRUBY_COMMAND)
-AC_SUBST(RUNRUBY)
-AC_SUBST(XRUBY)
-AC_SUBST(BOOTSTRAPRUBY)
-AC_SUBST(EXTOUT, [${EXTOUT=.ext}])
-
-FIRSTMAKEFILE=""
-LIBRUBY_A='lib$(RUBY_SO_NAME)-static.a'
-LIBRUBY='$(LIBRUBY_A)'
-LIBRUBYARG_STATIC='-l$(RUBY_SO_NAME)-static'
-LIBRUBYARG='$(LIBRUBYARG_STATIC)'
-SOLIBS='$(MAINLIBS)'
-
-AS_CASE(["$target_os"],
- [cygwin*|mingw*|haiku*|darwin*], [
- : ${DLDLIBS=""}
- ],
- [
- DLDLIBS="$DLDLIBS -lc"
- ])
-
-AC_ARG_ENABLE(multiarch,
- AS_HELP_STRING([--enable-multiarch], [enable multiarch compatible directories]),
- [multiarch=], [unset multiarch])
-AS_IF([test ${multiarch+set}], [
- AC_DEFINE(ENABLE_MULTIARCH)
- MJIT_HEADER_INSTALL_DIR=include/'${arch}/${RUBY_VERSION_NAME}'
-], [
- MJIT_HEADER_INSTALL_DIR=include/'${RUBY_VERSION_NAME}/${arch}'
-])
-
-archlibdir='${libdir}/${arch}'
-sitearchlibdir='${libdir}/${sitearch}'
-archincludedir='${includedir}/${arch}'
-sitearchincludedir='${includedir}/${sitearch}'
-
-AC_ARG_WITH(soname,
- AS_HELP_STRING([--with-soname=SONAME], [base name of shared library]),
- [RUBY_SO_NAME=$withval],
- [
- AS_CASE(["$target_os"],
- [darwin*], [
- RUBY_SO_NAME='$(RUBY_BASE_NAME).$(RUBY_API_VERSION)'
- ],
- [cygwin*], [
- RUBY_SO_NAME='$(RUBY_BASE_NAME)$(MAJOR)$(MINOR)0'
- ],
- [mingw*], [
- RUBY_SO_NAME="${rb_cv_msvcrt}"'-$(RUBY_BASE_NAME)$(MAJOR)$(MINOR)0'
- AS_IF([test x"${target_cpu}" != xi386], [
- RUBY_SO_NAME="${target_cpu}-${RUBY_SO_NAME}"
- ])
- ],
- [RUBY_SO_NAME='$(RUBY_BASE_NAME)'])
- ])
-
-LIBRUBY_LDSHARED=${DLDSHARED=${LDSHARED}}
-LIBRUBY_DLDFLAGS=$DLDFLAGS
-LIBRUBY_SO='lib$(RUBY_SO_NAME).$(SOEXT).$(RUBY_PROGRAM_VERSION)'
-LIBRUBY_SONAME='lib$(RUBY_SO_NAME).$(SOEXT).$(RUBY_API_VERSION)'
-LIBRUBY_ALIASES='lib$(RUBY_SO_NAME).$(SOEXT)'
-ENABLE_SHARED=no
-
-AC_ARG_ENABLE(shared,
- AS_HELP_STRING([--enable-shared], [build a shared library for Ruby]),
- [enable_shared=$enableval])
-libprefix=${multiarch+'$(archlibdir)'}${multiarch-'$(libdir)'}
-LIBRUBY_RELATIVE=${load_relative-no}
-AS_CASE("$enable_shared", [yes], [
- LIBRUBY='$(LIBRUBY_SO)'
- LIBRUBYARG_SHARED='-l$(RUBY_SO_NAME)'
- LIBRUBYARG='$(LIBRUBYARG_SHARED)'
- LIBRUBY_RELATIVE=no
- test -z "$CCDLFLAGS" || CFLAGS="$CFLAGS $CCDLFLAGS"
- ENABLE_SHARED=yes
-
- # libdir can be overridden in config.site file (on OpenSUSE at least).
- libdir_basename=lib
- AS_IF([test "$bindir" = '${exec_prefix}/bin'], [
- AS_CASE(["$libdir"], ['${exec_prefix}/'*], [libdir_basename=`basename "$libdir"`])
- ])
- AC_DEFINE_UNQUOTED(LIBDIR_BASENAME, ["${libdir_basename}"])
- libdir_basename="${libdir_basename}"${multiarch+'/${arch}'}
-
- AS_CASE(["$target_os"],
- [freebsd*|dragonfly*], [],
- [
- AS_IF([test "$GCC" = yes], [
- RUBY_TRY_LDFLAGS([${linker_flag}--no-undefined], [no_undefined=yes], [no_undefined=no])
- AS_IF([test "no_undefined" = yes], [
- RUBY_APPEND_OPTION(EXTLDFLAGS, [${linker_flag}--no-undefined])
- ])
- ])
- ])
-
- AS_CASE(["$target_os"],
- [sunos4*], [
- LIBRUBY_ALIASES='$(LIBRUBY_SONAME) lib$(RUBY_SO_NAME).$(SOEXT)'
- ],
- [linux* | gnu* | k*bsd*-gnu | atheos* | kopensolaris*-gnu | haiku*], [
- RUBY_APPEND_OPTIONS(LIBRUBY_DLDFLAGS, ['-Wl,-soname,$(LIBRUBY_SONAME)' "$LDFLAGS_OPTDIR"])
- LIBRUBY_ALIASES='$(LIBRUBY_SONAME) lib$(RUBY_SO_NAME).$(SOEXT)'
- AS_IF([test "$load_relative" = yes], [
- libprefix="'\$\${ORIGIN}/../${libdir_basename}'"
- LIBRUBY_RPATHFLAGS="-Wl,-rpath,${libprefix}"
- LIBRUBY_RELATIVE=yes
- ])
- ],
- [freebsd*|dragonfly*], [
- LIBRUBY_SO='lib$(RUBY_SO_NAME).$(SOEXT).$(MAJOR)$(MINOR)'
- LIBRUBY_SONAME='$(LIBRUBY_SO)'
- AS_IF([test "$rb_cv_binary_elf" != "yes" ], [
- LIBRUBY_SO="$LIBRUBY_SO.\$(TEENY)"
- LIBRUBY_ALIASES=''
- ])
- ],
- [netbsd*], [
- LIBRUBY_SONAME='lib$(RUBY_SO_NAME).$(SOEXT).$(MAJOR)$(MINOR)'
- LIBRUBY_SO="${LIBRUBY_SONAME}"'.$(TEENY)'
- RUBY_APPEND_OPTIONS(LIBRUBY_DLDFLAGS, ['-Wl,-soname,$(LIBRUBY_SONAME)' "$LDFLAGS_OPTDIR"])
- AS_IF([test "$rb_cv_binary_elf" = yes], [ # ELF platforms
- LIBRUBY_ALIASES='$(LIBRUBY_SONAME) lib$(RUBY_SO_NAME).$(SOEXT)'
- ], [ # a.out platforms
- LIBRUBY_ALIASES=""
- ])
- ],
- [openbsd*|mirbsd*], [
- LIBRUBY_SO='lib$(RUBY_SO_NAME).$(SOEXT).$(MAJOR).'`expr ${MINOR} \* 10 + ${TEENY}`
- ],
- [solaris*], [
- LIBRUBY_SO='lib$(RUBY_SO_NAME).$(SOEXT).$(MAJOR)'
- LIBRUBY_SONAME='lib$(RUBY_SO_NAME).$(SOEXT).$(RUBY_PROGRAM_VERSION)'
- LIBRUBY_ALIASES='$(LIBRUBY_SONAME) lib$(RUBY_SO_NAME).$(SOEXT)'
- RUBY_APPEND_OPTIONS(LIBRUBY_DLDFLAGS, ["${linker_flag}-h${linker_flag:+,}"'$(@F)'])
- XLDFLAGS="$XLDFLAGS "'-R${libdir}'
- ],
- [hpux*], [
- XLDFLAGS="$XLDFLAGS "'-Wl,+s,+b,$(libdir)'
- LIBRUBY_ALIASES='$(LIBRUBY_SONAME) lib$(RUBY_SO_NAME).$(SOEXT)'
- ],
- [aix*], [
- RUBY_APPEND_OPTIONS(LIBRUBY_DLDFLAGS, ["${linker_flag}-bnoentry" "$XLDFLAGS" "$LDFLAGS_OPTDIR"])
- LIBRUBYARG_SHARED='-L${libdir} -l${RUBY_SO_NAME}'
- LIBS="$LIBS -lm -lc"
- ],
- [darwin*], [
- LIBRUBY_SO='lib$(RUBY_SO_NAME).$(SOEXT)'
- LIBRUBY_SONAME='$(LIBRUBY_SO)'
- LIBRUBY_ALIASES='lib$(RUBY_INSTALL_NAME).$(SOEXT)'
- AS_IF([test "$load_relative" = yes], [
- libprefix="@executable_path/../${libdir_basename}"
- LIBRUBY_RELATIVE=yes
- ])
- LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS -install_name ${libprefix}"'/$(LIBRUBY_SONAME)'
- LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "'-compatibility_version $(RUBY_API_VERSION)'
- LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "'-current_version $(RUBY_PROGRAM_VERSION)'
- AS_IF([test "$visibility_option" = ld], [
- LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "'-Wl,-unexported_symbol,_Init_*'
- LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "'-Wl,-unexported_symbol,_ruby_static_id_*'
- LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "'-Wl,-unexported_symbol,*_threadptr_*'
- ])
- LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "' $(XLDFLAGS)'
- ],
- [interix*], [
- LIBRUBYARG_SHARED='-L. -L${libdir} -l$(RUBY_SO_NAME)'
- ],
- [mingw*|cygwin*|mswin*], [
- LIBRUBY_RELATIVE=yes
- ])
-], [
- LIBRUBYARG_SHARED=
-
- # enable PIE if possible
- AC_ARG_ENABLE(pie,
- AS_HELP_STRING([--disable-pie], [disable PIE feature]),
- [pie=$enableval], [pie=])
- AS_IF([test "$GCC" = yes -a -z "$EXTSTATIC" -a "x$pie" != xno], [
- RUBY_TRY_CFLAGS(-fPIE, [pie=yes], [pie=no])
- AS_IF([test "$pie" = yes], [
- # Use -fPIE when testing -pie. RUBY_TRY_LDFLAGS sets
- # $save_CFLAGS internally, so set other name here.
- save_CFLAGS_before_pie="$CFLAGS"
- CFLAGS="$CFLAGS -fPIE"
-
- # gcc need -pie but clang need -Wl,-pie.
- for pie in -pie -Wl,-pie; do
- RUBY_TRY_LDFLAGS([$pie], [], [pie=])
- AS_IF([test "x$pie" != x], [
- RUBY_APPEND_OPTION(XCFLAGS, -fPIE)
- RUBY_APPEND_OPTION(XLDFLAGS, $pie)
- break
- ])
- done
- CFLAGS="$save_CFLAGS_before_pie"
- ])
- ])
-])
-AS_IF([test "$enable_rpath" = yes], [
- test -z "$LIBRUBY_RPATHFLAGS" || LIBRUBY_RPATHFLAGS="$LIBRUBY_RPATHFLAGS "
- rpathflag="${RPATHFLAG}"
- AS_CASE(["${cross_compiling}${load_relative}"], [*yes*], [], [rpathflag="$RPATHFLAG$LIBPATHFLAG"])
- rpathflag=`IFS="$PATH_SEPARATOR"
- echo x "$rpathflag" |
- sed "s/^x *//;s${IFS}"'%1\\$-s'"${IFS}${libprefix}${IFS}g;s${IFS}%s${IFS}${libprefix}${IFS}g"
- `
- LIBRUBY_RPATHFLAGS="$LIBRUBY_RPATHFLAGS${rpathflag}"
- LIBRUBYARG_SHARED="$LIBRUBY_RPATHFLAGS $LIBRUBYARG_SHARED"
- LIBRUBYARG_STATIC="$LIBRUBY_RPATHFLAGS $LIBRUBYARG_STATIC"
-])
-AC_SUBST(LIBRUBY_RELATIVE)
-
-LDFLAGS="-L. $LDFLAGS"
-AC_SUBST(ARCHFILE)
-
-AS_IF([test "$EXEEXT" = .exe], [
- EXECUTABLE_EXTS='".exe",".com",".cmd",".bat"'
- AC_DEFINE_UNQUOTED(EXECUTABLE_EXTS, $EXECUTABLE_EXTS)
- EXECUTABLE_EXTS=`echo $EXECUTABLE_EXTS | tr -d '"' | tr , ' '`
- AC_SUBST(EXECUTABLE_EXTS)
-])
-
-AS_CASE("$cross_compiling:${LIBPATHENV}", [yes:* | no:], [], [
- AC_MSG_CHECKING(whether wrapper for $LIBPATHENV is needed)
- AS_IF([env ${LIBPATHENV}=/lib /bin/sh -c ': ${'${LIBPATHENV}'?}' 2>/dev/null],
- [AC_MSG_RESULT(no)],
- [PREP="$PREP"' exe/$(PROGRAM)'
- AC_MSG_RESULT(yes)]
- )
-])
-
-AC_ARG_ENABLE(dtrace,
- AS_HELP_STRING([--enable-dtrace],
- [enable DTrace for tracing inside ruby. enabled by default on systems having dtrace]),
- [enable_dtrace=$enableval], [enable_dtrace=auto])
-
-LIBRUBY_A_OBJS='$(OBJS)'
-DTRACE_REBUILD=
-AS_CASE(["${enable_dtrace}"],
-[yes|auto], [
- RUBY_DTRACE_AVAILABLE()
-], [
- rb_cv_dtrace_available=no
-])
-AS_IF([test "${enable_dtrace}" = yes], [dnl
- AS_IF([test -z "$DTRACE"], [dnl
- AC_MSG_ERROR([dtrace(1) is missing])
- ], [test "$cross_compiling" = yes], [dnl
- AC_MSG_ERROR([--enable-dtrace, however, cross compiling])
- ], [test "${rb_cv_dtrace_available}" = "no"], [dnl
- AC_MSG_ERROR([--enable-dtrace, however, USDT is not available])
- ])
-])
-AS_CASE([$rb_cv_dtrace_available],
-[yes*], [dnl
- RUBY_DTRACE_POSTPROCESS()
- AS_IF([test "$rb_cv_prog_dtrace_g" != no], [dnl
- DTRACE_OBJ='probes.$(OBJEXT)'
- ])
- AS_IF([test "$rb_cv_prog_dtrace_g" = rebuild], [dnl
- DTRACE_REBUILD=yes
- LIBRUBY_A_OBJS='$(DTRACE_GLOMMED_OBJ)'
- ])
- AS_CASE("${target_os}", [freebsd*], [dnl
- # FreeBSD's dtrace requires libelf
- LIBS="-lelf $LIBS"
- ])
- DTRACE_EXT=d
-], [dnl
- enable_dtrace=no
- DTRACE_EXT=dmyh
-])
-AC_SUBST(DTRACE_EXT)
-AC_SUBST(DTRACE_OBJ)
-AC_SUBST(DTRACE_REBUILD)
-AC_SUBST(DTRACE_OPT)
-AC_SUBST(LIBRUBY_A_OBJS)
-
-AC_ARG_ENABLE(gcov,
- AS_HELP_STRING([--enable-gcov], [enable coverage measurement by gcov]),
- [gcov=yes])
-AS_IF([test x"$gcov" = xyes], [
- CFLAGS="$CFLAGS -coverage"
- LDFLAGS="$LDFLAGS -coverage"
-])
-
-RUBY_SETJMP_TYPE
-}
-
-: "build section" && {
-dnl build rdoc index if requested
-RDOCTARGET=""
-CAPITARGET=""
-AC_ARG_ENABLE(install-doc,
- AS_HELP_STRING([--disable-install-doc], [do not install either rdoc indexes or C API documents during install]),
- [install_doc=$enableval], [install_doc=yes])
-AC_ARG_ENABLE(install-rdoc,
- AS_HELP_STRING([--disable-install-rdoc], [do not install rdoc indexes during install]),
- [install_rdoc=$enableval], [install_rdoc=yes])
-AC_ARG_ENABLE(install-capi,
- AS_HELP_STRING([--disable-install-capi], [do not install C API documents during install]),
- [install_capi=$enableval], [install_capi=no])
-
-AS_IF([test "$install_doc" != no], [
- AS_IF([test "$install_rdoc" != no], [
- RDOCTARGET="rdoc"
- ], [
- RDOCTARGET="nodoc"
- ])
- AS_IF([test "$install_capi" != no -a -n "$DOXYGEN"], [
- CAPITARGET="capi"
- ], [
- CAPITARGET="nodoc"
- ])
-], [
- RDOCTARGET="nodoc"
- CAPITARGET="nodoc"
-])
-
-AC_SUBST(RDOCTARGET)
-AC_SUBST(CAPITARGET)
-
-AS_CASE(["$RDOCTARGET:$CAPITARGET"],[nodoc:nodoc],[INSTALLDOC=nodoc],[INSTALLDOC=all])
-AC_SUBST(INSTALLDOC)
-
-AC_ARG_ENABLE(jit-support,
- AS_HELP_STRING([--disable-jit-support], [disable JIT features]),
- [MJIT_SUPPORT=$enableval
- AS_IF([test x"$enable_jit_support" = "xyes"],
- [AC_DEFINE(USE_MJIT, 1)],
- [AC_DEFINE(USE_MJIT, 0)])],
- [MJIT_SUPPORT=yes
- AC_DEFINE(USE_MJIT, 1)])
-
-AC_SUBST(MJIT_SUPPORT)
-
-AC_ARG_ENABLE(install-static-library,
- AS_HELP_STRING([--disable-install-static-library], [do not install static ruby library]),
- [INSTALL_STATIC_LIBRARY=$enableval],
- AS_IF([test x"$enable_shared" = xyes],
- [INSTALL_STATIC_LIBRARY=no],
- [INSTALL_STATIC_LIBRARY=yes]))
-AC_SUBST(INSTALL_STATIC_LIBRARY)
-
-AS_IF([test "$rb_with_pthread" = "yes"], [
- THREAD_MODEL=pthread
-])
-AC_CACHE_CHECK([for prefix of external symbols], rb_cv_symbol_prefix, [
- AC_TRY_COMPILE([extern void conftest_external(void) {}], [], [
- rb_cv_symbol_prefix=`$NM conftest.$ac_objext |
- sed -n ['/.*T[ ]\([^ ]*\)conftest_external.*/!d;s//\1/p;q']`
- ],
- [rb_cv_symbol_prefix=''])
- test -n "$rb_cv_symbol_prefix" || rb_cv_symbol_prefix=NONE
-])
-SYMBOL_PREFIX="$rb_cv_symbol_prefix"
-test "x$SYMBOL_PREFIX" = xNONE && SYMBOL_PREFIX=''
-DLNOBJ=dln.o
-AC_ARG_ENABLE(dln,
- AC_HELP_STRING([--disable-dln], [disable dynamic link feature]),
- [test "$enableval" = yes || DLNOBJ=dmydln.o])
-AC_SUBST(DLNOBJ)
-MINIDLNOBJ=dmydln.o
-
-AS_CASE(["$target_os"],
- [linux*], [
- ],
- [netbsd*], [
- RUBY_APPEND_OPTION(CFLAGS, -pipe)
- ],
- [darwin*], [
- RUBY_APPEND_OPTION(CFLAGS, -pipe)
- AC_COMPILE_IFELSE([
- AC_LANG_BOOL_COMPILE_TRY([@%:@include <AvailabilityMacros.h>],
- [MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_7])],
- [dnl
- RUBY_APPEND_OPTION(XLDFLAGS, [-framework Security])
- RUBY_APPEND_OPTION(LIBRUBYARG_STATIC, [-framework Security])
- ]dnl
- )
- RUBY_APPEND_OPTION(XLDFLAGS, [-framework Foundation])
- RUBY_APPEND_OPTION(LIBRUBYARG_STATIC, [-framework Foundation])
- ],
- [osf*], [
- AS_IF([test "$GCC" != "yes" ], [
- # compile something small: taint.c is fine for this.
- # the main point is the '-v' flag of 'cc'.
- AS_CASE(["`cc -v -I. -c main.c -o /tmp/main.o 2>&1`"],
- [*/gemc_cc*], [ # we have the new DEC GEM CC
- CFLAGS="$CFLAGS -oldc"
- ],
- [ # we have the old MIPS CC
- ])
- # cleanup
- rm -f /tmp/main.o
- CFLAGS="$CFLAGS -std"
- ])
- ],
- [cygwin*|mingw*], [
- LIBRUBY_DLDFLAGS="${LIBRUBY_DLDFLAGS}"' -Wl,--out-implib=$(LIBRUBY)'
- AS_CASE(["$target_os"],
- [cygwin*], [
- AS_IF([test x"$enable_shared" = xyes], [
- LIBRUBY_SO='cyg$(RUBY_SO_NAME)'.dll
- LIBRUBY_DLDFLAGS="${LIBRUBY_DLDFLAGS}"' $(RUBYDEF)'
- ])
- ],
- [mingw*], [
- AS_IF([test x"$enable_shared" = xyes], [
- LIBRUBY_SO='$(RUBY_SO_NAME)'.dll
- LIBRUBY_DLDFLAGS="${LIBRUBY_DLDFLAGS}"' $(RUBYDEF)'
- ])
- EXPORT_PREFIX=' '
- DLDFLAGS="${DLDFLAGS}"' $(DEFFILE)'
- AC_LIBOBJ([win32/win32])
- AC_LIBOBJ([win32/file])
- COMMON_LIBS=m
-# COMMON_MACROS="WIN32_LEAN_AND_MEAN="
- COMMON_HEADERS="winsock2.h windows.h"
- THREAD_MODEL=win32
- PLATFORM_DIR=win32
- ])
- LIBRUBY_ALIASES=''
- FIRSTMAKEFILE=GNUmakefile:cygwin/GNUmakefile.in
- AS_IF([test x"$enable_shared" = xyes], [
- LIBRUBY='lib$(RUBY_SO_NAME).dll.a'
- ], [
- LIBRUBY_SO=dummy
- LIBRUBY='lib$(RUBY_SO_NAME).a'
- LIBRUBYARG='-l$(RUBY_SO_NAME)'
- ])
- ],
- [hpux*], [
- AS_CASE(["$YACC"],[*yacc*], [
- XCFLAGS="$XCFLAGS -DYYMAXDEPTH=300"
- YACC="$YACC -Nl40000 -Nm40000"
- ])
-])
-
-MINIOBJS="$MINIDLNOBJ"
-
-AS_CASE(["$THREAD_MODEL"],
-[pthread], [AC_CHECK_HEADERS(pthread.h)],
-[win32], [],
-[""], [AC_MSG_ERROR(thread model is missing)],
- [AC_MSG_ERROR(unknown thread model $THREAD_MODEL)])
-
-AC_ARG_ENABLE(debug-env,
- AS_HELP_STRING([--enable-debug-env], [enable RUBY_DEBUG environment variable]),
- [AC_SUBST(ENABLE_DEBUG_ENV, yes)])
-
-AS_CASE(["$FIRSTMAKEFILE"], [*GNUmakefile:*], [gnumake=yes], [
- AC_MSG_CHECKING([if ${MAKE-make} is GNU make])
- mkdir conftest.dir
- echo "all:; @echo yes" > conftest.dir/GNUmakefile
- echo "all:; @echo no" > conftest.dir/Makefile
- gnumake=`(cd conftest.dir; ${MAKE-make})`
- rm -fr conftest.dir
- AS_CASE(["$gnumake"],
- [*yes*], [
- FIRSTMAKEFILE=GNUmakefile:template/GNUmakefile.in
- gnumake=yes],
- [
- gnumake=no])
- AC_MSG_RESULT($gnumake)
-])
-AS_IF([test "$gnumake" = yes], [ NULLCMD=: ], [
- AC_MSG_CHECKING([for safe null command for ${MAKE-make}])
- mkdir conftest.dir
- NULLCMD=
- for cmd in : true; do
- echo 'A=1' > conftest.dir/Makefile
- echo 'B=$(A:1=@'$cmd')' >> conftest.dir/Makefile
- echo 'all:; $B 1 2 3 4 5 6 7 8 9' >> conftest.dir/Makefile
- AS_IF([(cd conftest.dir; ${MAKE-make} >/dev/null 2>/dev/null)], [
- NULLCMD=$cmd
- break
- ])
- done
- rm -fr conftest.dir
- AS_IF([test -z "$NULLCMD"], [
- AC_MSG_ERROR(no candidate for safe null command)
- ])
- AC_MSG_RESULT($NULLCMD)
-])
-AC_SUBST(NULLCMD)
-
-AS_IF([test "${universal_binary-no}" = yes ], [
- AC_CACHE_CHECK([for architecture macros], rb_cv_architecture_macros, [
- mv confdefs.h confdefs1.h
- : > confdefs.h
- AC_TRY_COMPILE([@%:@if defined __`echo ${universal_archnames} |
- sed 's/=[^ ]*//g;s/ /__ || defined __/g'`__
-@%:@else
-@%:@error
->>>>>><<<<<<
-@%:@endif], [],
-[
- rb_cv_architecture_macros=yes
- mv -f confdefs1.h confdefs.h
-], [
- rb_cv_architecture_macros=no
- archflagpat=`eval echo '"'"${ARCH_FLAG}"'"' | sed 's/[[][|.*]]/\\&/g'`
- new_cflags=`echo "$CFLAGS" | sed "s|$archflagpat"'||'`
- for archs in ${universal_archnames}; do
- cpu=${archs@%:@*=}
- archs=${archs%=*}
- CFLAGS="$new_cflags -arch $archs"
- archs="__${archs}__"
- AC_MSG_CHECKING([for macro ${archs} on ${cpu}])
- AC_TRY_COMPILE([@%:@ifndef ${archs}
-@%:@error
-@%:@endif], [], [AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no])])
- done
- mv -f confdefs1.h confdefs.h
- AC_MSG_ERROR([failed])
- ])])
- AC_CACHE_CHECK(whether __ARCHITECTURE__ is available, rb_cv_architecture_available,
- AC_TRY_COMPILE([@%:@include <stdio.h>
- const char arch[[]] = __ARCHITECTURE__;], [puts(arch);],
- [rb_cv_architecture_available=yes], [rb_cv_architecture_available=no]))
-])
-
-: ${MJIT_LDSHARED=`echo "$LDSHARED" | sed ['s|\$(LD)|'"${LD}"'|g;s|\$(CC)|$(MJIT_CC)|g']`}
-
-MAINLIBS="$LIBS"
-LIBS=$ORIG_LIBS
-AS_IF([test -n "${LIBS}"], [
- libspat=`echo "${LIBS}" | sed 's/[[][|.*$^]]/\\&/g;s/^ */ /;s/^ *$/ /'`
- MAINFLAGS=`echo " $MAINLIBS " | sed "s|$libspat"'||;s/^ *//;s/ *$//'`
-])
-LIBRUBYARG_STATIC="${LIBRUBYARG_STATIC} \$(MAINLIBS)"
-CPPFLAGS="$CPPFLAGS "'$(DEFS)'
-test -z "$CPPFLAGS" || CPPFLAGS="$CPPFLAGS "; CPPFLAGS="$CPPFLAGS"'${cppflags}'
-AS_IF([test -n "${cflags+set}"], [
- cflagspat=`eval echo '"'"${cflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/^ *$/ /'`
- CFLAGS=`echo " $CFLAGS " | sed "s|$cflagspat"'|${cflags}|;s/^ *//;s/ *$//'`
-])
-AS_IF([test -n "${cxxflags+set}"], [
- cxxflagspat=`eval echo '"'"${cxxflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/^ *$/ /'`
- CXXFLAGS=`echo " $CXXFLAGS " | sed "s|$cxxflagspat"'|${cxxflags}|;s/^ *//;s/ *$//'`
-])
-AS_IF([test "${ARCH_FLAG}"], [
- archflagpat=`eval echo '"'"${ARCH_FLAG}"'"' | sed 's/[[][|.*]]/\\&/g'`
- CFLAGS=`echo "$CFLAGS" | sed "s| *$archflagpat"'||'`
- CXXFLAGS=`echo "$CXXFLAGS" | sed "s| *$archflagpat"'||'`
- LDFLAGS=`echo "$LDFLAGS" | sed "s| *$archflagpat"'||'`
-])
-warnflags="$rb_cv_warnflags"
-AC_SUBST(cppflags)dnl
-AC_SUBST(cflags, ["${orig_cflags:+$orig_cflags }"'${optflags} ${debugflags} ${warnflags}'])dnl
-AC_SUBST(cxxflags, ["${orig_cxxflags:+$orig_cxxflags }"'${optflags} ${debugflags} ${warnflags}'])dnl
-AC_SUBST(optflags)dnl
-AC_SUBST(debugflags)dnl
-AC_SUBST(warnflags)dnl
-AC_SUBST(strict_warnflags)dnl
-AC_SUBST(XCFLAGS)dnl
-AC_SUBST(XLDFLAGS)dnl
-AC_SUBST(EXTLDFLAGS)dnl
-AC_SUBST(EXTDLDFLAGS)dnl
-AC_SUBST(LIBRUBY_LDSHARED)
-AC_SUBST(LIBRUBY_DLDFLAGS)
-AC_SUBST(RUBY_INSTALL_NAME)
-AC_SUBST(rubyw_install_name)
-AC_SUBST(RUBYW_INSTALL_NAME)
-AC_SUBST(RUBY_SO_NAME)
-AC_SUBST(LIBRUBY_A)
-AC_SUBST(LIBRUBY_SO)
-AC_SUBST(LIBRUBY_SONAME)
-AC_SUBST(LIBRUBY_ALIASES)
-AC_SUBST(LIBRUBY)
-AC_SUBST(LIBRUBYARG)
-AC_SUBST(LIBRUBYARG_STATIC)
-AC_SUBST(LIBRUBYARG_SHARED)
-AC_SUBST(SOLIBS)
-AC_SUBST(DLDLIBS)
-AC_SUBST(DLDSHARED)
-AC_SUBST(ENABLE_SHARED)
-AC_SUBST(MAINLIBS)
-AC_SUBST(COMMON_LIBS)
-AC_SUBST(COMMON_MACROS)
-AC_SUBST(COMMON_HEADERS)
-AC_SUBST(EXPORT_PREFIX)
-AC_SUBST(SYMBOL_PREFIX)
-AC_SUBST(MINIOBJS)
-AC_SUBST(THREAD_MODEL)
-AC_SUBST(PLATFORM_DIR)
-
-firstmf=`echo $FIRSTMAKEFILE | sed 's/:.*//'`
-firsttmpl=`echo $FIRSTMAKEFILE | sed 's/.*://'`
-MAKEFILES="Makefile $firstmf"
-MAKEFILES="`echo $MAKEFILES`"
-AC_SUBST(MAKEFILES)
-
-ri_prefix=
-test "$program_prefix" != NONE &&
- ri_prefix=$program_prefix
-
-ri_suffix=
-test "$program_suffix" != NONE &&
- ri_suffix=$program_suffix
-
-RUBY_INSTALL_NAME="${ri_prefix}"'$(RUBY_BASE_NAME)'"${ri_suffix}"
-AS_CASE(["$target_os"],
- [cygwin*|mingw*], [
- RUBYW_INSTALL_NAME="${ri_prefix}"'$(RUBYW_BASE_NAME)'"${ri_suffix}"
- rubyw_install_name='$(RUBYW_INSTALL_NAME)'
- ])
-
-rubylibdir='${rubylibprefix}/${ruby_version}'
-rubyarchdir=${multiarch+'${rubyarchprefix}/${ruby_version}'}${multiarch-'${rubylibdir}/${arch}'}
-
-rubyarchprefix=${multiarch+'${archlibdir}/${RUBY_BASE_NAME}'}${multiarch-'${rubylibprefix}/${arch}'}
-AC_ARG_WITH(rubyarchprefix,
- AS_HELP_STRING([--with-rubyarchprefix=DIR],
- [prefix for architecture dependent ruby libraries [[RUBYLIBPREFIX/ARCH]]]),
- [rubyarchprefix="$withval"])
-AC_SUBST(rubyarchprefix)
-
-rubysitearchprefix=${multiarch+'${sitearchlibdir}/${RUBY_BASE_NAME}'}${multiarch-'${rubylibprefix}/${sitearch}'}
-AC_ARG_WITH(rubysitearchprefix,
- AS_HELP_STRING([--with-rubysitearchprefix=DIR],
- [prefix for architecture dependent site libraries [[RUBYLIBPREFIX/SITEARCH]]]),
- [rubysitearchprefix="$withval"])
-AC_SUBST(rubysitearchprefix)
-
-RI_BASE_NAME=`echo ${RUBY_BASE_NAME} | sed 's/ruby/ri/'`
-ridir='${datarootdir}/${RI_BASE_NAME}'
-AC_ARG_WITH(ridir,
- AS_HELP_STRING([--with-ridir=DIR], [ri documentation [[DATAROOTDIR/ri]]]),
- [ridir=$withval])
-AC_SUBST(ridir)
-AC_SUBST(RI_BASE_NAME)
-
-AC_ARG_WITH(ruby-version,
- AS_HELP_STRING([--with-ruby-version=STR], [ruby version string for version specific directories [[full]] (full|minor|STR)]),
- [ruby_version=$withval],
- [ruby_version=full])
-unset RUBY_LIB_VERSION
-unset RUBY_LIB_VERSION_STYLE
-AS_CASE(["$ruby_version"],
- [full], [RUBY_LIB_VERSION_STYLE='3 /* full */'],
- [minor], [RUBY_LIB_VERSION_STYLE='2 /* minor */'])
-AS_IF([test ${RUBY_LIB_VERSION_STYLE+set}], [
- {
- echo "#define RUBY_LIB_VERSION_STYLE $RUBY_LIB_VERSION_STYLE"
- echo '#define STRINGIZE(x) x'
- test -f revision.h -o -f "${srcdir}/revision.h" || echo '#define RUBY_REVISION 0'
- echo '#include "version.h"'
- echo 'ruby_version=RUBY_LIB_VERSION'
- } > conftest.c
- ruby_version="`$CPP -I. -I"${srcdir}" -I"${srcdir}/include" conftest.c | sed '/^ruby_version=/!d;s/ //g'`"
- eval $ruby_version
-], [test -z "${ruby_version}"], [
- AC_MSG_ERROR([No ruby version, No place for bundled libraries])
-], [
- RUBY_LIB_VERSION="${ruby_version}"
-])
-AC_SUBST(RUBY_LIB_VERSION_STYLE)
-AC_SUBST(RUBY_LIB_VERSION)
-
-AC_ARG_WITH(sitedir,
- AS_HELP_STRING([--with-sitedir=DIR], [site libraries in DIR [[RUBY_LIB_PREFIX/site_ruby]], "no" to disable site directory]),
- [sitedir=$withval],
- [sitedir='${rubylibprefix}/site_ruby'])
-sitelibdir='${sitedir}/${ruby_version}'
-
-AC_ARG_WITH(sitearchdir,
- AS_HELP_STRING([--with-sitearchdir=DIR],
- [architecture dependent site libraries in DIR [[SITEDIR/SITEARCH]], "no" to disable site directory]),
- [sitearchdir=$withval],
- [sitearchdir=${multiarch+'${rubysitearchprefix}/site_ruby/${ruby_version}'}${multiarch-'${sitelibdir}/${sitearch}'}])
-
-AC_ARG_WITH(vendordir,
- AS_HELP_STRING([--with-vendordir=DIR], [vendor libraries in DIR [[RUBY_LIB_PREFIX/vendor_ruby]], "no" to disable vendor directory]),
- [vendordir=$withval],
- [vendordir='${rubylibprefix}/vendor_ruby'])
-vendorlibdir='${vendordir}/${ruby_version}'
-
-AC_ARG_WITH(vendorarchdir,
- AS_HELP_STRING([--with-vendorarchdir=DIR],
- [architecture dependent vendor libraries in DIR [[VENDORDIR/SITEARCH]], "no" to disable vendor directory]),
- [vendorarchdir=$withval],
- [vendorarchdir=${multiarch+'${rubysitearchprefix}/vendor_ruby/${ruby_version}'}${multiarch-'${vendorlibdir}/${sitearch}'}])
-
-AS_IF([test "${LOAD_RELATIVE+set}"], [
- AC_DEFINE_UNQUOTED(LOAD_RELATIVE, $LOAD_RELATIVE)
- RUBY_EXEC_PREFIX=''
-])
-
-AC_SUBST(RUBY_EXEC_PREFIX)
-
-AC_SUBST(libdirname, ${multiarch+arch}libdir)
-AC_SUBST(archlibdir)dnl
-AC_SUBST(sitearchlibdir)dnl
-AC_SUBST(archincludedir)dnl
-AC_SUBST(sitearchincludedir)dnl
-AC_SUBST(arch)dnl
-AC_SUBST(sitearch)dnl
-AC_SUBST(ruby_version)dnl
-AC_SUBST(rubylibdir)dnl
-AC_SUBST(rubyarchdir)dnl
-AC_SUBST(sitedir)dnl
-AC_SUBST(sitelibdir)dnl
-AC_SUBST(sitearchdir)dnl
-AC_SUBST(vendordir)dnl
-AC_SUBST(vendorlibdir)dnl
-AC_SUBST(vendorarchdir)dnl
-
-AC_SUBST(CONFIGURE, "`echo $0 | sed 's|.*/||'`")dnl
-AC_SUBST(configure_args, "`echo "${ac_configure_args}" | sed 's/\\$/$$/g'`")dnl
-
-AS_IF([test "${universal_binary-no}" = yes ], [
- arch="universal-${target_os}"
- AS_IF([test "${rb_cv_architecture_available}" = yes], [
- AC_DEFINE_UNQUOTED(RUBY_PLATFORM_CPU, __ARCHITECTURE__)
- ], [
- for archs in ${universal_archnames}; do
- cpu=`echo $archs | sed 's/.*=//'`
- archs=`echo $archs | sed 's/=.*//'`
- RUBY_DEFINE_IF([defined __${archs}__ &&! defined RUBY_PLATFORM_CPU], RUBY_PLATFORM_CPU, ["${cpu}"])
- done
- ])
- ints='long int short'
- test "$ac_cv_type_long_long" = yes && ints="'long long' $ints"
- AC_SUBST(UNIVERSAL_ARCHNAMES, "${universal_archnames}")
- AC_SUBST(UNIVERSAL_INTS, "${ints}")
- AC_DEFINE_UNQUOTED(RUBY_PLATFORM_OS, "${target_os}")
- AC_DEFINE_UNQUOTED(RUBY_ARCH, "universal-"RUBY_PLATFORM_OS)
- AC_DEFINE_UNQUOTED(RUBY_PLATFORM, "universal."RUBY_PLATFORM_CPU"-"RUBY_PLATFORM_OS)
-], [
- arch="${target_cpu}-${target_os}"
- AC_DEFINE_UNQUOTED(RUBY_PLATFORM, "$arch")
-])
-
-unset sitearch
-AS_CASE(["$target_os"],[mingw*],[sitearch="$target_cpu-$rb_cv_msvcrt"])
-: ${sitearch='${arch}'}
-
-AC_ARG_WITH(search-path,
- AS_HELP_STRING([--with-search-path=DIR], [specify the additional search path]),
- [search_path=$withval])
-AS_IF([test "$search_path" != ""], [
- AC_SUBST(RUBY_SEARCH_PATH, $search_path)
-])
-
-AC_ARG_WITH(rubyhdrdir,
- AS_HELP_STRING([--with-rubyhdrdir=DIR], [core headers in DIR [[INCLUDEDIR/RUBY_BASE_NAME-RUBY_VERSION]]]),
- [rubyhdrdir=$withval],
- [rubyhdrdir='${includedir}/${RUBY_VERSION_NAME}'])
-
-AC_ARG_WITH(rubyarchhdrdir,
- AS_HELP_STRING([--with-rubyarchhdrdir=DIR],
- [architecture dependent core headers in DIR [[$(rubyhdrdir)/$(arch)]]]),
- [rubyarchhdrdir=$withval],
- [rubyarchhdrdir=${multiarch+'${archincludedir}/${RUBY_VERSION_NAME}'}${multiarch-'${rubyhdrdir}/${arch}'}])
-
-AC_ARG_WITH(sitehdrdir,
- AS_HELP_STRING([--with-sitehdrdir=DIR], [core site headers in DIR [[RUBYHDRDIR/site_ruby]]]),
- [sitehdrdir=$withval],
- [sitehdrdir='${rubyhdrdir}/site_ruby'])
-
-AC_ARG_WITH(sitearchhdrdir,
- AS_HELP_STRING([--with-sitearchhdrdir=DIR],
- [architecture dependent core site headers in DIR [[RUBYHDRDIR/site_ruby]]]),
- [sitearchhdrdir=$withval],
- [sitearchhdrdir=${multiarch+'${sitearchincludedir}/${RUBY_VERSION_NAME}/site_ruby'}${multiarch-'${sitehdrdir}/${sitearch}'}])
-
-AC_ARG_WITH(vendorhdrdir,
- AS_HELP_STRING([--with-vendorhdrdir=DIR], [core vendor headers in DIR [[RUBYHDRDIR/vendor_ruby]]]),
- [vendorhdrdir=$withval],
- [vendorhdrdir='${rubyhdrdir}/vendor_ruby'])
-
-AC_ARG_WITH(vendorarchhdrdir,
- AS_HELP_STRING([--with-vendorarchhdrdir=DIR],
- [architecture dependent core vendor headers in DIR [[RUBYHDRDIR/vendor_ruby]]]),
- [vendorarchhdrdir=$withval],
- [vendorarchhdrdir=${multiarch+'${sitearchincludedir}/${RUBY_VERSION_NAME}/vendor_ruby'}${multiarch-'${vendorhdrdir}/${sitearch}'}])
-
-AC_SUBST(rubyhdrdir)dnl
-AC_SUBST(sitehdrdir)dnl
-AC_SUBST(vendorhdrdir)dnl
-AC_SUBST(rubyarchhdrdir)dnl
-AC_SUBST(sitearchhdrdir)dnl
-AC_SUBST(vendorarchhdrdir)dnl
-
-AC_ARG_WITH(mantype,
- AS_HELP_STRING([--with-mantype=TYPE], [specify man page type; TYPE is one of man and doc]),
- [
- AS_CASE(["$withval"],
- [man|man.gz|man.bz2|doc|doc.gz|doc.bz2], [MANTYPE=$withval],
- [AC_MSG_ERROR(invalid man type: $withval)])
- ])
-AS_IF([test -z "$MANTYPE"], [
- dnl Looks for nroff with -mdoc support.
- AC_CACHE_VAL([ac_cv_path_NROFF], [
- AC_PATH_PROGS_FEATURE_CHECK([NROFF],
- [nroff awf mandoc],
- [$ac_path_NROFF -mdoc ${srcdir}/man/ruby.1 \
- >/dev/null 2>&1 &&
- ac_cv_path_NROFF=$ac_path_NROFF \
- ac_path_NROFF_found=:],
- [], ["/usr/bin:/usr/ucb"]
- )
- ])
- AS_IF([test -n "$ac_cv_path_NROFF"], [
- MANTYPE=doc
- ], [
- MANTYPE=man
- ])
-])
-AC_SUBST(MANTYPE)
-
-AC_ARG_ENABLE(rubygems,
- AS_HELP_STRING([--disable-rubygems], [disable rubygems by default]),
- [enable_rubygems="$enableval"], [enable_rubygems=yes])
-AS_IF([test x"$enable_rubygems" = xno], [
- USE_RUBYGEMS=no
-], [
- USE_RUBYGEMS=yes
-])
-AC_SUBST(USE_RUBYGEMS)
-
-arch_hdrdir="${EXTOUT}/include/${arch}/ruby"
-AS_MKDIR_P("${arch_hdrdir}")
-config_h="${arch_hdrdir}/config.h"
-guard=INCLUDE_RUBY_CONFIG_H
-{
- echo "#ifndef $guard"
- echo "#define $guard 1"
- grep -v "^#define PACKAGE_" confdefs.h
- echo "#endif /* $guard */"
-} | tr -d '\015' |
-(
- AS_IF([test "x$CONFIGURE_TTY" = xyes], [color=--color], [color=])
- exec ${srcdir}/tool/ifchange $color "${config_h}" -
-) >&AS_MESSAGE_FD || AC_MSG_ERROR([failed to create ${config_h}])
-tr -d '\015' < largefile.h > confdefs.h
-rm largefile.h
-
-BUILTIN_ENCS=["`sed -n -e '/^BUILTIN_ENCS[ ]*=/{' \
- -e s/// -e :l -e '/\\\\$/N' -e 's/\\\\\\n/ /' -e 't l' -e p \
- -e '}' "${srcdir}/enc/Makefile.in"`"]
-BUILTIN_ENCOBJS=
-for e in $BUILTIN_ENCS; do BUILTIN_ENCOBJS="$BUILTIN_ENCOBJS "`echo $e | sed 's/\.c$/.$(OBJEXT)/'`; done
-AC_SUBST(BUILTIN_ENCOBJS)
-
-BUILTIN_TRANSES=["`sed -n -e '/^BUILTIN_TRANSES[ ]*=/{' \
- -e s/// -e :l -e '/\\\\$/N' -e 's/\\\\\\n/ /' -e 't l' -e p \
- -e '}' "${srcdir}/enc/Makefile.in"`"]
-BUILTIN_TRANSSRCS=
-BUILTIN_TRANSOBJS=
-for e in $BUILTIN_TRANSES; do
- BUILTIN_TRANSSRCS="$BUILTIN_TRANSSRCS "`echo $e | sed 's/\.trans$/.c/'`
- BUILTIN_TRANSOBJS="$BUILTIN_TRANSOBJS "`echo $e | sed 's/\.trans$/.$(OBJEXT)/'`
-done
-AC_SUBST(BUILTIN_TRANSSRCS)
-AC_SUBST(BUILTIN_TRANSOBJS)
-
-PACKAGE=$RUBY_BASE_NAME
-AC_SUBST(PACKAGE)
-AS_MESSAGE([$PACKAGE library version = $ruby_version])
-
-AS_IF([test x"$CC_WRAPPER" != x], [
- CC='$(CC_WRAPPER) '"${CC@%:@$CC_WRAPPER }"
- CPP='$(CC_WRAPPER) '"${CPP@%:@$CC_WRAPPER }"
- CC_WRAPPER='$(rubyarchdir)/darwin-cc'
- XCC_WRAPPER='$(top_srcdir)/tool/darwin-cc'
-])
-AC_SUBST(CC_WRAPPER, '')
-AC_SUBST(XCC_WRAPPER)
-
-AS_CASE([" $CPP "], [*" $CC "*], [CPP=`echo " $CPP " | sed "s| $CC |"' $(CC) |;s/^ *//;s/ *$//'`])
-
-AS_IF([test x"$firstmf" != x], [
- AC_CONFIG_FILES($firstmf:$firsttmpl, [], [firstmf="$firstmf" firsttmpl="$firsttmpl"])
-])
-AC_CONFIG_FILES(Makefile, [
- tmpmk=confmk$$.tmp
- {
- AS_IF([test ${VCS+set}], [
- :
- ], [svn info "$srcdir" > /dev/null 2>&1], [
- VCS='svn'
- ], [git_dir=`$GIT --work-tree="$srcdir" --git-dir="$srcdir/.git" rev-parse --git-dir 2>/dev/null`], [
- AS_IF([test -d "$git_dir/svn"], [
- VCS='$(GIT) svn'
- ], [
- VCS='$(GIT)'
- ])
- ], [
- VCS='echo cannot'
- ])
- AS_CASE("$VCS",
- [svn], [VCSUP='$(VCS) up $(SVNUPOPTIONS)'],
- ['$(GIT) svn'], [VCSUP='$(VCS) rebase $(GITSVNREBASEOPTIONS)'],
- ['$(GIT)'|git], [VCSUP='$(VCS) pull $(GITPULLOPTIONS)'],
- [VCSUP='$(VCS)'])
- sed -n \
- -e '[/^@%:@define \(RUBY_RELEASE_[A-Z]*\) \([0-9][0-9]*\)/]{' \
- -e 's//\1 = \2/' \
- -e '[s/ \([0-9]\)$/ 0\1/]' \
- -e p \
- -e '}' "$srcdir/version.h"
- sed '/^MISSING/s/\$U\././g;/^VCS *=/s#@VCS@#'"$VCS"'#;/^VCSUP *=/s#@VCSUP@#'"$VCSUP"'#' Makefile
- echo; test x"$EXEEXT" = x || echo 'miniruby: miniruby$(EXEEXT)'
- AS_IF([test "$gnumake" != yes], [
- echo ['$(MKFILES): $(srcdir)/common.mk']
- sed ['s/{\$([^(){}]*)[^{}]*}//g'] ${srcdir}/common.mk
- ], [
- echo 'distclean-local::; @$(RM) GNUmakefile uncommon.mk'
- ])
- } > $tmpmk && AS_IF([! grep '^ruby:' $tmpmk > /dev/null], [
- AS_IF([test "${gnumake}" = yes], [
- tmpgmk=confgmk$$.tmp
- {
- echo "include $tmpmk"
- echo "-include uncommon.mk"
- } > $tmpgmk
- ], [
- tmpgmk=$tmpmk
- ]) &&
- test -z "`${MAKE-make} -f $tmpgmk info-program | grep '^PROGRAM=ruby$'`" &&
- echo 'ruby: $(PROGRAM);' >> $tmpmk
- test "$tmpmk" = "$tmpgmk" || rm -f "$tmpgmk"
- ]) && mv -f $tmpmk Makefile],
-[EXEEXT='$EXEEXT' gnumake='$gnumake' GIT='$GIT'])
-
-AC_ARG_WITH([ruby-pc],
- AC_HELP_STRING([--with-ruby-pc=FILENAME], [pc file basename]),
- [ruby_pc="$withval"],
- [ruby_pc="${RUBY_BASE_NAME}-${MAJOR}.${MINOR}.pc"])
-AC_SUBST(ruby_pc)
-AC_SUBST(exec, [exec])
-
-AC_ARG_WITH(destdir,
- AS_HELP_STRING([--with-destdir=DESTDIR], [specify default directory to install]),
- [DESTDIR="$withval"])
-AC_SUBST(DESTDIR)
-
-AC_CONFIG_FILES($ruby_pc:template/ruby.pc.in,
- [
- AS_IF([sed ['s/\$(\([A-Za-z_][A-Za-z0-9_]*\))/${\1}/g;s/@[A-Za-z_][A-Za-z0-9_]*@//'] $ruby_pc > ruby.tmp.pc &&
- {
- test -z "$PKG_CONFIG" ||
- PKG_CONFIG_PATH=. $PKG_CONFIG --print-errors ruby.tmp
- }],
- [
- mv -f ruby.tmp.pc $ruby_pc
- ], [
- exit 1
- ])
- ],
- [ruby_pc='$ruby_pc' PKG_CONFIG='$PKG_CONFIG'])
-
-AC_OUTPUT
-}
-}
-
-AS_IF([test "$silent" = yes], [], [
-AS_IF([${FOLD+:} false], [], [
-AS_IF([test "`echo abcdefg hijklmno | fold -s -w10 | sed 1d`" = hijklmno], [FOLD="fold"], [FOLD=])
-])
-AS_REQUIRE_SHELL_FN([config_summary],
- [AS_FUNCTION_DESCRIBE([config_summary], [NAME, VAL], [configuration summary])],
- [AS_IF([test -z "$2"], [], [
- AS_ECHO_N([" * $1: "]) | dd bs=1 count=26 2>/dev/null
- AS_IF([test "$FOLD"], [
- echo "$2" | fold -s -w50 |
- sed '1!s/^/ /;$!s/$/\\/'
- ], [echo "$2"])
- ])]
-)
-
-echo "---"
-echo "Configuration summary for $RUBY_BASE_NAME version $RUBY_PROGRAM_VERSION"
-echo ""
-config_summary "Installation prefix" "$prefix"
-config_summary "exec prefix" "$exec_prefix"
-config_summary "arch" "$arch"
-config_summary "site arch" "$sitearch"
-config_summary "RUBY_BASE_NAME" "$RUBY_BASE_NAME"
-config_summary "enable shared" "$enable_shared"
-config_summary "ruby lib prefix" "$rubylibprefix"
-config_summary "site libraries path" "$rubysitearchprefix"
-config_summary "vendor path" "$vendordir"
-config_summary "target OS" "$target_os"
-config_summary "compiler" "$CC"
-config_summary "with pthread" "$enable_pthread"
-config_summary "enable shared libs" "$ENABLE_SHARED"
-config_summary "dynamic library ext" "$DLEXT"
-config_summary "CFLAGS" "$cflags"
-config_summary "CPPFLAGS" "$cppflags"
-config_summary "LDFLAGS" "$LDFLAGS"
-config_summary "DLDFLAGS" "$DLDFLAGS"
-config_summary "optflags" "$optflags"
-config_summary "debugflags" "$debugflags"
-config_summary "warnflags" "$warnflags"
-config_summary "strip command" "$STRIP"
-config_summary "install doc" "$install_doc"
-config_summary "JIT support" "$MJIT_SUPPORT"
-config_summary "man page type" "$MANTYPE"
-config_summary "search path" "$search_path"
-config_summary "static-linked-ext" ${EXTSTATIC:+"yes"}
-echo ""
-echo "---"
-])
diff --git a/configure.in b/configure.in
new file mode 100644
index 0000000000..9953dcdae5
--- /dev/null
+++ b/configure.in
@@ -0,0 +1,4466 @@
+dnl Process this file with autoconf to produce a configure script.
+AC_INIT()
+{
+AC_CONFIG_AUX_DIR(tool)
+
+AC_PREREQ(2.67)
+
+AC_DEFUN([RUBY_PREREQ_AC],
+ [m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]), [$1]), [-1],
+ AC_MSG_ERROR([Autoconf version ]$1[ or higher is required]$2))])
+
+AC_DISABLE_OPTION_CHECKING
+
+AC_ARG_VAR([cflags], [additional CFLAGS])
+AC_ARG_VAR([cppflags], [additional CPPFLAGS])
+AC_ARG_VAR([cxxflags], [additional CXXFLAGS])
+
+AC_DEFUN([RUBY_RM_RECURSIVE], [
+m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]), [2.70]), [-1], [
+# suppress error messages, rm: cannot remove 'conftest.dSYM', from
+# AC_EGREP_CPP with CFLAGS=-g on Darwin.
+#
+# TODO: remove this hack when AC_PREREQ() becomes 2.70 or later.
+AS_CASE([$build_os], [darwin*], [
+rm() {
+ rm_recursive=''
+ for arg do
+ AS_CASE("$arg",
+ [--*], [],
+ [-*r*], [break],
+ [conftest.*], [if test -d "$arg"; then rm_recursive=-r; break; fi],
+ [])
+ done
+ command rm $rm_recursive "[$]@"
+}
+])])])
+
+{ # environment section
+
+AC_ARG_WITH(baseruby,
+ AS_HELP_STRING([--with-baseruby=RUBY], [use RUBY as baseruby; RUBY is the pathname of ruby]),
+ [
+ AS_CASE(["$withval"],[*ruby*],[BASERUBY=$withval],[AC_MSG_ERROR(need ruby)])
+ ],
+ [
+ AC_PATH_PROG([BASERUBY], [ruby], [false])
+ ])
+if test "`RUBYOPT=- $BASERUBY -e 'print 42' 2>/dev/null`" = 42; then
+ if test "`RUBYOPT=- $BASERUBY --disable=gems -e 'print 42' 2>/dev/null`" = 42; then
+ BASERUBY="$BASERUBY --disable=gems"
+ fi
+ $BASERUBY -C "$srcdir/tool" downloader.rb -e gnu config.guess config.sub
+ HAVE_BASERUBY=yes
+else
+ BASERUBY="echo executable host ruby is required. use --with-baseruby option.; false"
+ HAVE_BASERUBY=no
+fi
+AC_SUBST(BASERUBY)
+AC_SUBST(HAVE_BASERUBY)
+
+AC_DEFUN([RUBY_MINGW32],
+[AS_CASE(["$host_os"],
+[cygwin*], [
+AC_CACHE_CHECK(for mingw32 environment, rb_cv_mingw32,
+[AC_TRY_CPP([
+#ifndef __MINGW32__
+# error
+#endif
+], rb_cv_mingw32=yes,rb_cv_mingw32=no)
+rm -f conftest*])
+if test "$rb_cv_mingw32" = yes; then
+ target_os="mingw32"
+ : ${ac_tool_prefix:="`expr "$CC" : ['\(.*-\)g\?cc[^/]*$']`"}
+fi
+])
+AS_CASE(["$target_os"], [mingw*msvc], [
+target_os="`echo ${target_os} | sed 's/msvc$//'`"
+])
+AS_CASE(["$target_cpu-$target_os"], [x86_64-mingw*], [
+target_cpu=x64
+])
+])
+
+AC_DEFUN([RUBY_NACL],
+[
+ AS_CASE(["${host_os}"],
+[nacl], [
+ ac_cv_exeext=.nexe
+ host_vendor=chromium
+ ac_cv_host=chromium
+ AC_MSG_CHECKING([wheather \$NACL_SDK_ROOT is set])
+ if test x"${NACL_SDK_ROOT}" = x; then
+ AC_MSG_RESULT([no])
+ AC_MSG_ERROR([You need to set \$NACL_SDK_ROOT environment variable to build for NativeClient])
+ fi
+ AC_MSG_RESULT([yes])
+
+ nacl_cv_build_variant=glibc
+ AC_ARG_WITH(newlib,
+ AS_HELP_STRING([--with-newlib], [uses newlib version of NativeClient SDK]),
+ [AS_CASE([$withval],
+ [no], [nacl_cv_build_variant=glibc],
+ [yes], [nacl_cv_build_variant=newlib])])
+
+ AS_CASE(["$target_cpu"],
+ [x86_64], [nacl_cv_cpu_nick=x86
+ nacl_cv_cpu_nick2=x86_64],
+ [i?86], [nacl_cv_cpu_nick=x86
+ nacl_cv_cpu_nick2=x86_32],
+ [le32], [nacl_cv_cpu_nick=pnacl
+ nacl_cv_cpu_nick2=pnacl
+ ac_cv_exeext=.pexe],
+ [nacl_cv_cpu_nick=$target_cpu])
+ AS_CASE(["$build_os"],
+ [linux*], [nacl_cv_os_nick=linux],
+ [darwin*], [nacl_cv_os_nick=mac],
+ [cygwin*|mingw*], [nacl_cv_os_nick=win],
+ [nacl_cv_os_nick=$build_os])
+
+ host="$host_cpu-chromium-$host_os-"
+ ac_tool_prefix="$host_cpu-nacl-"
+
+ AC_MSG_CHECKING([NativeClient toolchain])
+ if test x"$nacl_cv_cpu_nick" = xpnacl; then
+ NACL_TOOLCHAIN="${nacl_cv_os_nick}_pnacl"
+ ac_tool_prefix=pnacl-
+ elif test -d \
+ "${NACL_SDK_ROOT}/toolchain/${nacl_cv_os_nick}_${nacl_cv_cpu_nick}_${nacl_cv_build_variant}"; then
+ NACL_TOOLCHAIN="${nacl_cv_os_nick}_${nacl_cv_cpu_nick}_${nacl_cv_build_variant}"
+ elif test -d \
+ "${NACL_SDK_ROOT}/toolchain/${nacl_cv_os_nick}_x86_${nacl_cv_cpu_nick}/${nacl_cv_build_variant}"; then
+ NACL_TOOLCHAIN="${nacl_cv_os_nick}_x86_${nacl_cv_cpu_nick}/${nacl_cv_build_variant}"
+ else
+ AS_CASE(
+ ["${nacl_cv_build_variant}"],
+ [glibc], [if test \
+ -d "${NACL_SDK_ROOT}/toolchain/${nacl_cv_os_nick}_${nacl_cv_cpu_nick}_newlib" \
+ -a -d "${NACL_SDK_ROOT}/toolchain/${nacl_cv_os_nick}_${nacl_cv_cpu_nick}"; then
+ NACL_TOOLCHAIN="${nacl_cv_os_nick}_${nacl_cv_cpu_nick}"
+ fi],
+ [newlib], [ NACL_TOOLCHAIN="${nacl_cv_os_nick}_${nacl_cv_cpu_nick}" ])
+ fi
+ if test ! -e "${NACL_SDK_ROOT}/toolchain/${NACL_TOOLCHAIN}/${ac_tool_prefix}gcc"; then
+ if test "${build_cpu}" = i686 -a -e "${NACL_SDK_ROOT}/toolchain/${NACL_TOOLCHAIN}/nacl-gcc"; then
+ ac_tool_prefix=nacl-
+ fi
+ if test "${build_cpu}" = x86_64 -a -e "${NACL_SDK_ROOT}/toolchain/${NACL_TOOLCHAIN}/nacl-gcc"; then
+ ac_tool_prefix=nacl64-
+ fi
+ fi
+ if test -z "${NACL_TOOLCHAIN}"; then
+ AC_MSG_ERROR([Unrecognized --host and --build combination or NaCl SDK is not installed])
+ fi
+ AC_MSG_RESULT(${NACL_TOOLCHAIN})
+
+ AC_MSG_CHECKING([path to SDK])
+ if ! echo -- "${PATH}" | grep -F "${NACL_SDK_ROOT}/toolchain/${NACL_TOOLCHAIN}/bin" > /dev/null; then
+ PATH="${PATH}:${NACL_SDK_ROOT}/toolchain/${NACL_TOOLCHAIN}/bin"
+ fi
+ AC_MSG_RESULT(${NACL_SDK_ROOT}/toolchain/${NACL_TOOLCHAIN}/bin)
+
+ RUBY_APPEND_OPTIONS(XCFLAGS, '-I$(NACL_SDK_ROOT)/include')
+ if test x"${nacl_cv_cpu_nick}" = xpnacl; then
+ RUBY_APPEND_OPTIONS(XCFLAGS, '-isystem $(NACL_SDK_ROOT)/include/pnacl')
+ elif test x"${nacl_cv_build_variant}" = xnewlib; then
+ RUBY_APPEND_OPTIONS(XCFLAGS, '-isystem $(NACL_SDK_ROOT)/include/newlib')
+ fi
+
+ AC_MSG_CHECKING([nacl library path])
+ if test -d "${NACL_SDK_ROOT}/lib/${nacl_cv_build_variant}_${nacl_cv_cpu_nick2}/Release"; then
+ nacl_cv_libpath="${nacl_cv_build_variant}_${nacl_cv_cpu_nick2}"
+ elif test -d "${NACL_SDK_ROOT}/lib/${nacl_cv_cpu_nick2}/Release"; then
+ nacl_cv_libpath="${nacl_cv_cpu_nick2}"
+ else
+ AC_MSG_ERROR([not found])
+ fi
+ AC_MSG_RESULT([${nacl_cv_libpath}])
+ RUBY_APPEND_OPTIONS(XLDFLAGS, '-L$(NACL_SDK_ROOT)/'"lib/${nacl_cv_libpath}/Release")
+
+ AC_SUBST(NACL_TOOLCHAIN)
+ AC_SUBST(NACL_SDK_ROOT)
+ AC_SUBST(NACL_SDK_VARIANT, "${nacl_cv_build_variant}")
+ AC_SUBST(NACL_LIB_PATH, "${nacl_cv_libpath}")
+ AC_CHECK_TOOLS(CC, [clang gcc])
+ AC_CHECK_TOOLS(CXX, [clang++ g++])
+])])
+
+AC_DEFUN([RUBY_NACL_CHECK_PEPPER_TYPES],
+[AS_CASE(["${host_os}"],
+[nacl], [
+ AC_CHECK_TYPES([struct PPB_Core, struct PPB_Messaging, struct PPB_Var,
+ struct PPB_URLLoader, struct PPB_URLRequestInfo,
+ struct PPB_URLResponseInfo, struct PPB_FileRef,
+ struct PPP_Instance])
+])
+])
+
+AC_DEFUN([RUBY_CPPOUTFILE],
+[AC_CACHE_CHECK(whether ${CPP} accepts -o, rb_cv_cppoutfile,
+[save_CPPFLAGS="$CPPFLAGS"
+CPPFLAGS='-o conftest-1.i'
+rb_cv_cppoutfile=no
+AC_TRY_CPP([test-for-cppout],
+ [grep test-for-cppout conftest-1.i > /dev/null && rb_cv_cppoutfile=yes])
+CPPFLAGS="$save_CPPFLAGS"
+rm -f conftest*])
+if test "$rb_cv_cppoutfile" = yes; then
+ CPPOUTFILE='-o conftest.i'
+elif test "$rb_cv_cppoutfile" = no; then
+ CPPOUTFILE='> conftest.i'
+elif test -n "$rb_cv_cppoutfile"; then
+ CPPOUTFILE="$rb_cv_cppoutfile"
+fi
+AC_SUBST(CPPOUTFILE)])
+
+AC_DEFUN([RUBY_PROG_GNU_LD],
+[AC_CACHE_CHECK(whether the linker is GNU ld, rb_cv_prog_gnu_ld,
+[if `$CC $CFLAGS $CPPFLAGS $LDFLAGS --print-prog-name=ld 2>&1` -v 2>&1 | grep "GNU ld" > /dev/null; then
+ rb_cv_prog_gnu_ld=yes
+else
+ rb_cv_prog_gnu_ld=no
+fi
+])
+GNU_LD=$rb_cv_prog_gnu_ld
+AC_SUBST(GNU_LD)])
+
+eval `sed -n 's/^#define RUBY_API_VERSION_\([A-Z][A-Z_0-9]*\) \([0-9][0-9]*\)/\1=\2/p' $srcdir/include/ruby/version.h`
+for v in MAJOR MINOR TEENY; do
+ if eval "test \"\$$v\" = ''"; then
+ AC_MSG_ERROR(could not determine $v number from version.h)
+ fi
+done
+AC_SUBST(MAJOR)
+AC_SUBST(MINOR)
+AC_SUBST(TEENY)
+RUBY_PROGRAM_VERSION=`sed -n 's/^#define RUBY_VERSION "\(.*\)"/\1/p' $srcdir/version.h`
+AC_SUBST(RUBY_PROGRAM_VERSION)
+RUBY_PATCHLEVEL=`sed -n 's/^#define RUBY_PATCHLEVEL //p' $srcdir/version.h`
+AC_DEFINE(CANONICALIZATION_FOR_MATHN)
+dnl checks for alternative programs
+AC_CANONICAL_BUILD
+RUBY_RM_RECURSIVE
+AC_ARG_WITH(gcc,
+ AS_HELP_STRING([--without-gcc], [never use gcc]),
+ [
+ AS_CASE([$withval],
+ [no], [: ${CC=cc}],
+ [yes], [: ${CC=gcc}],
+ [CC=$withval])])
+dnl If the user switches compilers, we can't believe the cache
+if test ! -z "$ac_cv_prog_CC" -a ! -z "$CC" -a "$CC" != "$ac_cv_prog_CC"
+then
+ AC_MSG_ERROR(cached CC is different -- throw away $cache_file
+(it is also a good idea to do 'make clean' before compiling))
+fi
+AS_CASE(["$build_os"],
+ [darwin1*.*], [
+ AS_CASE(["x$CC"],
+ [xgcc-4.2|x/usr/bin/gcc-4.2], [: ${CXX=g++-4.2}],
+ [xgcc|x/usr/bin/gcc], [: ${CXX=g++}],
+ [xcc|x/usr/bin/cc], [: ${CXX=c++}],
+ [xclang|x/usr/bin/clang], [: ${CXX=clang++}])
+ ])
+test -z "$CC" || ac_cv_prog_CC="$CC"
+test -z "$CXX" || ac_cv_prog_CXX="$CXX"
+
+if test "$program_prefix" = NONE; then
+ program_prefix=
+fi
+if test "$prefix" -ef .; then
+ AC_MSG_ERROR(--prefix cannot be the current working directory.)
+fi
+RUBY_BASE_NAME=`echo ruby | sed "$program_transform_name"`
+RUBYW_BASE_NAME=`echo rubyw | sed "$program_transform_name"`
+AC_SUBST(RUBY_BASE_NAME)
+AC_SUBST(RUBYW_BASE_NAME)
+AC_SUBST(RUBY_VERSION_NAME, '${RUBY_BASE_NAME}-${ruby_version}')
+
+AC_CANONICAL_TARGET
+test x"$target_alias" = x &&
+target_os=`echo $target_os | sed 's/linux-gnu$/linux/;s/linux-gnu/linux-/'`
+ac_install_sh='' # unusable for extension libraries.
+
+AC_ARG_WITH(os-version-style,
+ AS_HELP_STRING([--with-os-version-style=TYPE],
+ [OS version number for target and target_os [[full]]]
+ [(full|teeny|minor+0|minor|major+0|major|none)]),
+ [os_version_style=$withval],
+ [os_version_style=full
+ AS_CASE($target_os, [[*[0-9].*]],
+ [AS_CASE([`/usr/bin/ruby -e 'puts RUBY_PLATFORM' 2>/dev/null`],
+ [[*-*[0-9].*.0]], [os_version_style=minor+0],
+ [[*-*[0-9].*.*]], [os_version_style=full],
+ [[*-*[0-9].0] ], [os_version_style=major+0],
+ [[*-*[0-9].*] ], [os_version_style=minor],
+ [[*-*[0-9]] ], [os_version_style=major],
+ )])
+ ])
+os_version_style_transform=
+AS_CASE("${os_version_style}",
+ [full|teeny], [],
+ [minor+0], [os_version_style_transform=['s/\([0-9]\.[0-9][0-9]*\)\.[0-9][.0-9]*$/\1.0/']],
+ [minor], [os_version_style_transform=['s/\([0-9]\.[0-9][0-9]*\)\.[0-9][.0-9]*$/\1/']],
+ [major+0], [os_version_style_transform=['s/\([0-9]\)\.[0-9][.0-9]*$/\1.0/']],
+ [major], [os_version_style_transform=['s/\([0-9]\)\.[0-9][.0-9]*$/\1/']],
+ [none], [os_version_style_transform=['s/[0-9]\.[0-9][.0-9]*$//']],
+ [AC_MSG_ERROR(unknown --with-os-version-style: $withval)])
+AS_IF([test -z "$target_alias" -a -n "$os_version_style_transform"],
+ [
+ target=`echo ${target} | sed "$os_version_style_transform"`
+ target_os=`echo ${target_os} | sed "$os_version_style_transform"`
+ ])
+
+AC_DEFUN([RUBY_APPEND_OPTION],
+ [# RUBY_APPEND_OPTION($1)
+ AS_CASE([" [$]{$1-} "],
+ [*' $2 '*], [], [' '], [ $1="$2"], [ $1="[$]$1 $2"])])
+AC_DEFUN([RUBY_APPEND_OPTIONS],
+ [# RUBY_APPEND_OPTIONS($1)
+ for rb_opt in $2; do
+ AS_CASE([" [$]{$1-} "],
+ [*" [$]{rb_opt} "*], [], [' '], [ $1="[$]{rb_opt}"], [ $1="[$]$1 [$]{rb_opt}"])
+ done])
+AC_DEFUN([RUBY_PREPEND_OPTION],
+ [# RUBY_PREPEND_OPTION($1)
+ AS_CASE([" [$]{$1-} "],
+ [*' $2 '*], [], [' '], [ $1="$2"], [ $1="$2 [$]$1"])])
+AC_DEFUN([RUBY_PREPEND_OPTIONS],
+ [# RUBY_PREPEND_OPTIONS($1)
+ unset rb_opts; for rb_opt in $2; do
+ AS_CASE([" [$]{rb_opts} [$]{$1-} "],
+ [*" [$]{rb_opt} "*], [], [' '], [ $1="[$]{rb_opt}"], [ rb_opts="[$]{rb_opts}[$]{rb_opt} "])
+ done
+ $1="[$]{rb_opts}[$]$1"])
+
+AC_ARG_WITH(arch,
+ AS_HELP_STRING([--with-arch=ARCHS],
+ [build an Apple/NeXT Multi Architecture Binary (MAB);
+ ARCHS is a comma-delimited list of architectures for
+ which to build; if this option is disabled or omitted
+ entirely, then the package will be built only for the
+ target platform]),
+ [target_archs="$withval"], [unset target_archs])
+
+AC_DEFUN([RUBY_DEFAULT_ARCH], [
+AC_MSG_CHECKING([arch option])
+AS_CASE([$1],
+ [*64], [ARCH_FLAG=-m64],
+ [[i[3-6]86]], [ARCH_FLAG=-m32],
+ [AC_MSG_ERROR(unknown target architecture: $target_archs)]
+ )
+AC_MSG_RESULT([$ARCH_FLAG])
+])
+
+AC_DEFUN([RUBY_UNIVERSAL_ARCH], [
+# RUBY_UNIVERSAL_ARCH begin
+ARCH_FLAG=`expr " $CXXFLAGS " : ['.* \(-m[0-9][0-9]*\) ']`
+test ${CXXFLAGS+set} && CXXFLAGS=`echo "$CXXFLAGS" | sed [-e 's/ *-arch *[^ ]*//g' -e 's/ *-m32//g' -e 's/ *-m64//g']`
+ARCH_FLAG=`expr " $CFLAGS " : ['.* \(-m[0-9][0-9]*\) ']`
+test ${CFLAGS+set} && CFLAGS=`echo "$CFLAGS" | sed [-e 's/ *-arch *[^ ]*//g' -e 's/ *-m32//g' -e 's/ *-m64//g']`
+test ${LDFLAGS+set} && LDFLAGS=`echo "$LDFLAGS" | sed [-e 's/ *-arch *[^ ]*//g' -e 's/ *-m32//g' -e 's/ *-m64//g']`
+unset universal_binary universal_archnames
+if test ${target_archs+set}; then
+ AC_MSG_CHECKING([target architectures])
+ target_archs=`echo $target_archs | tr , ' '`
+ # /usr/lib/arch_tool -archify_list $TARGET_ARCHS
+ for archs in $target_archs
+ do
+ AS_CASE([",$universal_binary,"],[*",$archs,"*], [],[
+ cpu=`$SHELL "$ac_aux_dir/config.sub" "${archs}-${target_os}" 2>&1` || {
+ AC_MSG_RESULT([failed])
+ AC_MSG_ERROR([$cpu])
+ }
+ cpu=`echo $cpu | sed 's/-.*-.*//'`
+ universal_binary="${universal_binary+$universal_binary,}$cpu"
+ universal_archnames="${universal_archnames} ${archs}=${cpu}"
+ ARCH_FLAG="${ARCH_FLAG+$ARCH_FLAG }-arch $archs"
+ ])
+ done
+ target_archs="$universal_binary"
+ unset universal_binary
+ AS_CASE(["$target_archs"],
+ [*,*], [universal_binary=yes],
+ [unset universal_archnames])
+ AC_MSG_RESULT([$target_archs])
+
+ target=`echo $target | sed "s/^$target_cpu-/-/"`
+ target_alias=`echo $target_alias | sed "s/^$target_cpu-/-/"`
+ if test "${universal_binary-no}" = yes; then
+ AC_SUBST(try_header,try_compile)
+ target_cpu=universal
+ real_cross_compiling=$cross_compiling
+ else
+ if test x"$target_cpu" != x"${target_archs}"; then
+ echo 'int main(){return 0;}' > conftest.c
+ if $CC $CFLAGS $ARCH_FLAG -o conftest conftest.c > /dev/null 2>&1; then
+ rm -fr conftest.*
+ else
+ RUBY_DEFAULT_ARCH("$target_archs")
+ fi
+ fi
+ target_cpu=${target_archs}
+ fi
+ AS_CASE(["$target"], [-*], [ target="$target_cpu${target}"])
+ AS_CASE(["$target_alias"], [-*], [ target_alias="$target_cpu${target_alias}"])
+else
+ if test x"$target_alias" = x; then
+ AS_CASE(["$target_os"],
+ [darwin*], [
+ AC_MSG_CHECKING([for real target cpu])
+ target=`echo $target | sed "s/^$target_cpu-/-/"`
+ target_cpu=`$CC -E - 2>/dev/null <<EOF |
+#ifdef __x86_64__
+"processor-name=x86_64"
+#endif
+#ifdef __i386__
+"processor-name=i386"
+#endif
+#ifdef __ppc__
+"processor-name=powerpc"
+#endif
+#ifdef __ppc64__
+"processor-name=powerpc64"
+#endif
+EOF
+ sed -n 's/^"processor-name=\(.*\)"/\1/p'`
+ target="$target_cpu${target}"
+ AC_MSG_RESULT([$target_cpu])
+ ])
+ fi
+ target_archs="$target_cpu"
+fi
+if test "${target_archs}" != "${rb_cv_target_archs-${target_archs}}"; then
+ AC_MSG_ERROR([target arch(s) has changed from ${rb_cv_target_archs-nothing} to ${target_archs}])
+else
+ rb_cv_target_archs=${target_archs}
+fi
+if test "x${ARCH_FLAG}" != x; then
+ CFLAGS="${CFLAGS:+$CFLAGS }${ARCH_FLAG}"
+ LDFLAGS="${LDFLAGS:+$LDFLAGS }${ARCH_FLAG}"
+fi
+# RUBY_UNIVERSAL_ARCH end
+])
+
+AC_ARG_ENABLE(load-relative,
+ AS_HELP_STRING([--enable-load-relative], [resolve load paths at run time]),
+ [load_relative=$enableval])
+
+AC_ARG_PROGRAM
+
+dnl Checks for programs.
+
+cflagspat=
+test -z "$optflags" ||
+ cflagspat="$cflagspat;s|"`eval echo '"'"${optflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/ *$/ /'`'| |g'
+test -z "$debugflags" ||
+ cflagspat="$cflagspat;s|"`eval echo '"'"${debugflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/ *$/ /'`'| |g'
+test -z "warnflags" ||
+ cflagspat="$cflagspat;s|"`eval echo '"'"${warnflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/ *$/ /'`'| |g'
+if test -z "${CFLAGS+set}"; then
+ cflags=`echo " $cflags " | sed "$cflagspat;s/^ *//;s/ *$//"`
+ orig_cflags="$cflags"
+ cflags="$cflags "'${optflags} ${debugflags} ${warnflags}'
+fi
+if test -z "${CXXFLAGS+set}"; then
+ cxxflags=`echo " $cxxflags " | sed "$cflagspat;s/^ *//;s/ *$//"`
+ orig_cxxflags="$cxxflags"
+ cxxflags="$cxxflags "'${optflags} ${debugflags} ${warnflags}'
+fi
+
+RUBY_NACL
+AS_CASE(["$host_os:$build_os"],
+[darwin*:darwin*], [
+ AC_CHECK_TOOLS(CC, [clang gcc cc])
+ # Following Apple deployed clang are broken
+ # clang version 1.0 (http://llvm.org/svn/llvm-project/cfe/tags/Apple/clang-23 exported)
+ # Apple clang version 2.0 (tags/Apple/clang-137) (based on LLVM 2.9svn)
+ # Apple clang version 2.1 (tags/Apple/clang-163.7.1) (based on LLVM 3.0svn)
+ if ! $CC -E -xc - <<SRC >/dev/null; then
+ @%:@if defined __APPLE_CC__ && defined __clang_major__ && __clang_major__ < 3
+ @%:@error premature clang
+ @%:@endif
+SRC
+ AC_MSG_ERROR([clang version 3.0 or later is required])
+ fi
+])
+if test x"${build}" != x"${host}"; then
+ AC_CHECK_TOOL(CC, gcc)
+fi
+
+AC_PROG_CC
+AC_PROG_CXX
+RUBY_MINGW32
+AC_PROG_GCC_TRADITIONAL
+AC_SUBST(GCC)
+AS_CASE(["$target_os"],
+[solaris*], [AC_PATH_TOOL([LD], [ld], [/usr/ccs/bin/ld], [/usr/ccs/bin:$PATH])],
+[AC_CHECK_TOOL([LD], [ld], [ld])])
+AC_SUBST(LD)
+if test "$GCC" = yes; then
+ linker_flag=-Wl,
+ : ${optflags=-O3}
+ gcc_major=`echo =__GNUC__ | $CC -E -xc - | sed '/^=/!d;s///'`
+ gcc_minor=`echo =__GNUC_MINOR__ | $CC -E -xc - | sed '/^=/!d;s///'`
+ test -n "$gcc_major" || gcc_major=0
+ test -n "$gcc_minor" || gcc_minor=0
+ # RUBY_APPEND_OPTIONS(XCFLAGS, ["-include ruby/config.h" "-include ruby/missing.h"])
+else
+ linker_flag=
+fi
+
+RUBY_PROG_GNU_LD
+RUBY_CPPOUTFILE
+
+: ${OUTFLAG='-o '}
+: ${COUTFLAG=${OUTFLAG}}
+AC_SUBST(OUTFLAG)
+AC_SUBST(COUTFLAG)
+
+cc_version=
+for option in --version -v -V -qversion; do
+ cc_version_message=`$CC $option 2>&1`
+ cc_version_status=$?
+ AS_CASE($cc_version_status, [0], [:], [continue])
+ AS_CASE($cc_version_message, [*Warning*], [continue])
+ cc_version='$(CC) '$option
+done
+AC_SUBST(CC_VERSION, $cc_version)
+
+RUBY_UNIVERSAL_ARCH
+if test "$target_cpu" != "$host_cpu" -a "$GCC" = yes -a "$cross_compiling" = no -a "$universal_binary" = no; then
+ RUBY_DEFAULT_ARCH("$target_cpu")
+fi
+
+AS_CASE(["$target_cpu-$target_os"], [[i[3-6]86*]], [
+ AC_CACHE_CHECK([for __sync_val_compare_and_swap], [rb_cv_gcc_compiler_cas], [
+ AC_TRY_LINK([unsigned long atomic_var;],
+ [
+ __sync_val_compare_and_swap(&atomic_var, 0, 1);
+ ],
+ [rb_cv_gcc_compiler_cas=yes],
+ [rb_cv_gcc_compiler_cas=no])])
+ if test "$rb_cv_gcc_compiler_cas" = no; then
+ unset rb_cv_gcc_compiler_cas
+ save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -march=i486"
+ AC_CACHE_CHECK([for __sync_val_compare_and_swap with -march=i486], [rb_cv_gcc_compiler_cas], [
+ AC_TRY_LINK([unsigned long atomic_var;],
+ [
+ __sync_val_compare_and_swap(&atomic_var, 0, 1);
+ ],
+ [rb_cv_gcc_compiler_cas=yes
+ ARCH_FLAG="-march=i486"],
+ [rb_cv_gcc_compiler_cas=no])])
+ CFLAGS="$save_CFLAGS"
+ fi])
+
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+AC_CHECK_TOOL(AR, ar)
+if test -z "$AR"; then
+ AC_CHECK_PROGS(AR, aal, ar)
+fi
+
+AC_CHECK_TOOL(AS, as)
+ASFLAGS=$ASFLAGS
+AC_SUBST(ASFLAGS)
+
+AS_CASE(["$target_os"],[cygwin*|mingw*], [ac_cv_prog_ac_ct_OBJCOPY=":"])
+
+# BSD's ports and MacPorts prefix GNU binutils with 'g'
+AC_CHECK_TOOLS(OBJDUMP, [objdump gobjdump])
+AC_CHECK_TOOLS(OBJCOPY, [objcopy gobjcopy])
+
+AS_CASE(["$target_os"],
+[cygwin*|mingw*], [
+ AC_CHECK_TOOL(WINDRES, windres)
+ AC_CHECK_TOOL(DLLWRAP, dllwrap)
+ target=`echo $target | sed "s/^$target_cpu-/-/"`
+ target_alias=`echo $target_alias | sed "s/^$target_cpu-/-/"`
+ target_cpu=`echo $target_cpu | sed s/i.86/i386/`
+ AS_CASE(["$target"], [-*], [ target="$target_cpu${target}"])
+ AS_CASE(["$target_alias"], [-*], [ target_alias="$target_cpu${target_alias}"])
+ AS_CASE(["$target_os"],
+ [mingw*], [
+ test "$rb_cv_msvcrt" = "" && unset rb_cv_msvcrt
+ AC_CACHE_CHECK(for mingw32 runtime DLL, rb_cv_msvcrt, [
+ AC_TRY_LINK([@%:@include <stdio.h>],
+ [FILE* volatile f = stdin; return 0;],
+ [rb_cv_msvcrt=`$OBJDUMP -p conftest$ac_exeext |
+ tr A-Z a-z |
+ sed -n '/^[[ ]]*dll name: \(msvc.*\)\.dll$/{s//\1/p;q;}'`],
+ [rb_cv_msvcrt=msvcrt])
+ test "$rb_cv_msvcrt" = "" && rb_cv_msvcrt=msvcrt])
+ RT_VER=`echo "$rb_cv_msvcrt" | tr -cd [0-9]`
+ test "$RT_VER" = "" && RT_VER=60
+ AC_DEFINE_UNQUOTED(RUBY_MSVCRT_VERSION, $RT_VER)
+ ])
+ : ${enable_shared=yes}
+ ],
+[aix*], [AC_CHECK_TOOL(NM, nm, /usr/ccs/bin/nm, /usr/ccs/bin:$PATH)],
+[hiuxmpp*], [AC_DEFINE(__HIUX_MPP__)]) # by TOYODA Eizi <toyoda@npd.kishou.go.jp>
+AC_CHECK_TOOL(NM, nm)
+
+AC_PROG_LN_S
+AC_PROG_MAKE_SET
+AC_PROG_INSTALL
+AC_PROG_MKDIR_P
+if test "x$MKDIR_P" = "x -d"; then
+ if test x"$as_mkdir_p" != xfalse; then
+ MKDIR_P='mkdir -p'
+ echo "use 'mkdir -p' as MKDIR_P"
+ else
+ AC_MSG_ERROR([mkdir -p is required])
+ fi
+fi
+MAKEDIRS="$MKDIR_P"
+AC_SUBST(MAKEDIRS)
+
+AC_DEFUN([RUBY_DTRACE_AVAILABLE],
+[AC_CACHE_CHECK(whether dtrace USDT is available, rb_cv_dtrace_available,
+[
+ echo "provider conftest{ probe fire(); };" > conftest_provider.d
+ if $DTRACE -h -o conftest_provider.h -s conftest_provider.d >/dev/null 2>/dev/null; then
+ AC_TRY_COMPILE([@%:@include "conftest_provider.h"], [CONFTEST_FIRE();], [
+ # DTrace is available on the system
+ rb_cv_dtrace_available=yes
+ ], [rb_cv_dtrace_available=no])
+ else
+ # DTrace is not available while dtrace command exists
+ # for example FreeBSD 8 or FreeBSD 9 without DTrace build option
+ rb_cv_dtrace_available=no
+ fi
+ rm -f conftest.[co] conftest_provider.[dho]
+])
+])
+
+AC_DEFUN([RUBY_DTRACE_POSTPROCESS],
+[AC_CACHE_CHECK(whether $DTRACE needs post processing, rb_cv_prog_dtrace_g,
+[
+ rb_cv_prog_dtrace_g=no
+ if {
+ cat >conftest_provider.d <<_PROBES &&
+ provider conftest {
+ probe fire();
+ };
+_PROBES
+ $DTRACE -h -o conftest_provider.h -s conftest_provider.d >/dev/null 2>/dev/null &&
+ :
+ }; then
+ AC_TRY_COMPILE([@%:@include "conftest_provider.h"], [CONFTEST_FIRE();], [
+ if {
+ cp -p conftest.${ac_objext} conftest.${ac_objext}.save &&
+ $DTRACE -G -s conftest_provider.d conftest.${ac_objext} 2>/dev/null &&
+ :
+ }; then
+ if cmp -s conftest.o conftest.${ac_objext}.save; then
+ rb_cv_prog_dtrace_g=yes
+ else
+ rb_cv_prog_dtrace_g=rebuild
+ fi
+ fi])
+ fi
+ rm -f conftest.[co] conftest_provider.[dho]
+])
+])
+
+AC_CHECK_PROG([DTRACE], [${ac_tool_prefix}dtrace], [${ac_tool_prefix}dtrace])
+if test "$cross_compiling:$ac_cv_prog_DTRACE" = no: -a -n "$ac_tool_prefix"; then
+ AC_CHECK_PROG([DTRACE], [dtrace], [dtrace])
+fi
+
+AC_CHECK_PROGS(DOT, dot)
+AC_CHECK_PROGS(DOXYGEN, doxygen)
+AS_CASE(["${host_os}"], [nacl], [AC_PATH_PROG(PYTHON, python)])
+
+AC_CHECK_PROG(PKG_CONFIG, pkg-config, [pkg-config], [], [],
+ [`"$as_dir/$ac_word$ac_exec_ext" --print-errors --version > /dev/null 2>&1 || echo "$as_dir/$ac_word$ac_exec_ext"`])
+
+# checks for UNIX variants that set C preprocessor variables
+AC_USE_SYSTEM_EXTENSIONS
+
+AC_SUBST(RM, ['rm -f'])
+AC_SUBST(CP, ['cp'])
+RMDIRS='$(top_srcdir)/tool/rmdirs'
+RMDIR=rmdir
+mkdir "rmdirs_$$_test" "rmdirs_$$_test/a"
+rmdir --ignore-fail-on-non-empty "rmdirs_$$_test" 2>/dev/null &&
+RMDIR='rmdir --ignore-fail-on-non-empty'
+$RMDIR -p "rmdirs_$$_test/a" 2>/dev/null &&
+{ test -d "rmdirs_$$_test" || RMDIRS="$RMDIR -p"; }
+rmdir "rmdirs_$$_test/a" "rmdirs_$$_test" 2>/dev/null
+AC_SUBST(RMDIR)
+AC_SUBST(RMDIRS)
+AC_SUBST(RMALL, ['rm -fr'])
+
+AC_MSG_CHECKING([for cd using physical directory])
+rm -fr conf$$.dir
+mkdir conf$$.dir &&
+(cd conf$$.dir && mkdir src build && cd src &&
+$as_ln_s ../build . > /dev/null 2>&1 && cd build &&
+for chdir in 'cd -P' 'PWD= cd'; do
+ /bin/sh -c "$chdir ../src && echo '$chdir' > cdcmd" 2> /dev/null && break
+done)
+if test -f conf$$.dir/src/cdcmd; then
+ read CHDIR < conf$$.dir/src/cdcmd 2> /dev/null
+else
+ CHDIR=cd
+fi
+rm -fr conf$$.dir
+AC_MSG_RESULT([$CHDIR])
+AC_SUBST(CHDIR)
+
+}
+{ # compiler section
+
+AC_DEFUN([RUBY_WERROR_FLAG], [dnl
+save_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $rb_cv_warnflags"
+if test "${ac_c_werror_flag+set}"; then
+ rb_c_werror_flag="$ac_c_werror_flag"
+else
+ unset rb_c_werror_flag
+fi
+ac_c_werror_flag=yes
+$1
+CFLAGS="$save_CFLAGS"
+save_CFLAGS=
+if test "${rb_c_werror_flag+set}"; then
+ ac_c_werror_flag="$rb_c_werror_flag"
+else
+ unset ac_c_werror_flag
+fi])
+
+RUBY_WERROR_FLAG([
+ AC_MSG_CHECKING([whether CFLAGS is valid])
+ AC_TRY_COMPILE([], [],
+ [AC_MSG_RESULT(yes)],
+ [
+ AC_MSG_RESULT(no)
+ AC_MSG_ERROR([something wrong with CFLAGS="$CFLAGS"])
+ ]
+ )
+ AC_MSG_CHECKING([whether LDFLAGS is valid])
+ {
+ mkdir tmp.$$.try_link &&
+ cd tmp.$$.try_link &&
+ cp ../confdefs.h . &&
+ echo '<?xml?><plist><dict><key>CFBundleIdentifier</key><string></string></dict></plist>' > Info.plist &&
+ :
+ } || AC_MSG_ERROR([faild to make temporary directory])
+ AC_TRY_LINK([], [],
+ [AC_MSG_RESULT(yes)],
+ [
+ cd .. && rm -fr tmp.$$.try_link
+ AC_MSG_RESULT(no)
+ AC_MSG_ERROR([something wrong with LDFLAGS="$LDFLAGS"])
+ ]
+ )
+ cd .. && rm -fr tmp.$$.try_link
+])
+
+AC_DEFUN([RUBY_TRY_CFLAGS], [
+ AC_MSG_CHECKING([whether ]$1[ is accepted as CFLAGS])
+ RUBY_WERROR_FLAG([
+ CFLAGS="[$]CFLAGS $1"
+ AC_TRY_COMPILE([$4], [$5],
+ [$2
+ AC_MSG_RESULT(yes)],
+ [$3
+ AC_MSG_RESULT(no)])
+ ])
+])
+
+AC_DEFUN([RUBY_TRY_LDFLAGS], [
+ save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="[$]LDFLAGS $1"
+ AC_MSG_CHECKING([whether $1 is accepted as LDFLAGS])
+ RUBY_WERROR_FLAG([
+ AC_TRY_LINK([$4], [$5],
+ [$2
+ AC_MSG_RESULT(yes)],
+ [$3
+ AC_MSG_RESULT(no)])
+ ])
+ LDFLAGS="$save_LDFLAGS"
+ save_LDFLAGS=
+])
+
+AS_CASE([$RUBY_PATCHLEVEL], [-*],
+ [particular_werror_flags=yes], [particular_werror_flags=no])
+AC_ARG_ENABLE(werror,
+ AS_HELP_STRING([--disable-werror],
+ [don't make warnings into errors
+ even if a compiler support -Werror feature
+ [[disabled by default unless development version]]]),
+ [particular_werror_flags=$enableval])
+
+rb_cv_warnflags="$warnflags"
+if test "$GCC:${warnflags+set}:no" = yes::no; then
+ if test $gcc_major -ge 4; then
+ extra_warning=-Werror=extra-tokens
+ else
+ extra_warning=
+ fi
+ if test $gcc_major -eq 5; then
+ extra_warning="$extra_warning -Wno-maybe-uninitialized"
+ fi
+ for wflag in -Wno-unused-parameter -Wno-parentheses -Wno-long-long \
+ -Wno-missing-field-initializers \
+ -Wunused-variable \
+ -Werror=pointer-arith \
+ -Werror=write-strings \
+ -Werror=declaration-after-statement \
+ -Werror=shorten-64-to-32 \
+ -Werror=implicit-function-declaration \
+ -Werror=division-by-zero \
+ -Werror=deprecated-declarations \
+ -Wno-packed-bitfield-compat \
+ $extra_warning \
+ ; do
+ if test "$particular_werror_flags" != yes; then
+ wflag=`echo x$wflag | sed 's/^x-Werror=/-W/;s/^x//'`
+ fi
+ ok=no
+ RUBY_TRY_CFLAGS($wflag, [
+ RUBY_APPEND_OPTIONS(warnflags, $wflag)
+ ok=yes
+ ])
+ AS_CASE([$ok:$wflag], [no:-Werror=*], [
+ wflag=`echo x$wflag | sed 's/^x-Werror=/-W/'`
+ RUBY_TRY_CFLAGS($wflag, [
+ RUBY_APPEND_OPTIONS(warnflags, $wflag)
+ particular_werror_flags=no
+ ])
+ ])
+ done
+ AS_CASE([" $warnflags "],[*" -Wno-missing-field-initializers "*], [wflag="-Wall -Wextra"],
+ [wflag=-Wall])
+ RUBY_TRY_CFLAGS($wflag, [warnflags="$wflag${warnflags+ $warnflags}"])
+ # Disable warnflags while conftest. -Werror=* flags might make bad OS capability guess.
+ rb_cv_warnflags="$warnflags"
+ warnflags=
+fi
+RUBY_TRY_CFLAGS(-Qunused-arguments, [RUBY_APPEND_OPTIONS(rb_cv_wsuppress_flags, -Qunused-arguments)])
+
+for n in infinity nan; do
+ m=AS_TR_CPP($n)
+ AC_CACHE_CHECK([whether $m is available without C99 option], rb_cv_$n,
+ [AC_COMPILE_IFELSE(
+ [AC_LANG_BOOL_COMPILE_TRY(AC_INCLUDES_DEFAULT([@%:@include <math.h>
+@%:@ifndef $m
+@%:@error no $m
+@%:@endif
+]), [1])], [eval rb_cv_$n=yes], [eval rb_cv_$n=no])])
+ if eval test '"$rb_cv_'$n'"' = yes; then
+ AC_DEFINE_UNQUOTED([HAVE_]$m)
+ fi
+done
+
+if test "$GCC" = yes; then
+ # NaCl's glibc build generates undefined references to __memset_chk.
+ # TODO(sbc): Remove this once NaCl's glibc is fixed.
+ AS_CASE(["$target_os"], [nacl], [], [
+ # -D_FORTIFY_SOURCE
+ # When defined _FORTIFY_SOURCE, glibc enables some additional sanity
+ # argument check. The performance drop is very little and Ubuntu enables
+ # _FORTIFY_SOURCE=2 by default. So, let's support it for protecting us from
+ # a mistake of silly C extensions.
+ RUBY_TRY_CFLAGS(-D_FORTIFY_SOURCE=2, [RUBY_APPEND_OPTION(XCFLAGS, -D_FORTIFY_SOURCE=2)])
+ ])
+
+ # -fstack-protector
+ AS_CASE(["$target_os"],
+ [mingw*|nacl], [
+ stack_protector=no
+ ])
+ if test -z "${stack_protector+set}"; then
+ RUBY_TRY_CFLAGS(-fstack-protector, [stack_protector=yes], [stack_protector=no])
+ if test "x$stack_protector" = xyes; then
+ RUBY_TRY_LDFLAGS(-fstack-protector, [], [stack_protector=broken])
+ fi
+ fi
+ if test "x$stack_protector" = xyes; then
+ RUBY_APPEND_OPTION(XCFLAGS, -fstack-protector)
+ RUBY_APPEND_OPTION(XLDFLAGS, -fstack-protector)
+ RUBY_APPEND_OPTION(LDFLAGS, -fstack-protector)
+ fi
+
+ AS_CASE(["$target_os"],[mingw*], [
+ # On Windows platforms, system provided headers are VC++
+ # optimized. That is, C++ habits are often contaminated into
+ # various headers. Most frequent situation is the use of //
+ # comments. We bypass ANSI C mode for them. Otherwise
+ # extension libs cannot include those headers.
+ ],
+ [cygwin*|darwin*|netbsd*|nacl], [
+ # need lgamma_r(), finite()
+ ],
+ [
+ # ANSI (no XCFLAGS because this is C only)
+ for ansi_options in -std=iso9899:1999 "-ansi -std=iso9899:199409"; do
+ RUBY_TRY_CFLAGS(${ansi_options}, [
+ RUBY_APPEND_OPTIONS(warnflags, ${ansi_options})
+ RUBY_APPEND_OPTIONS(strict_warnflags, ${ansi_options})
+ ], [ansi_options=])
+ test "x${ansi_options}" = x || break
+ done
+ ])
+
+ # suppress annoying -Wstrict-overflow warnings
+ RUBY_TRY_CFLAGS(-fno-strict-overflow, [RUBY_APPEND_OPTION(XCFLAGS, -fno-strict-overflow)])
+
+ test "${debugflags+set}" || {RUBY_TRY_CFLAGS(-ggdb3, [debugflags=-ggdb3])}
+ test "${debugflags+set}" || {RUBY_TRY_CFLAGS(-ggdb, [debugflags=-ggdb])}
+ test "${debugflags+set}" || {RUBY_TRY_CFLAGS(-g3, [debugflags=-g3])}
+fi
+test $ac_cv_prog_cc_g = yes && : ${debugflags=-g}
+
+if test "$GCC" = ""; then
+ AS_CASE(["$target_os"],[aix*],[warnflags="$warnflags -qinfo=por" rb_cv_warnflags="$rb_cv_warnflags -qinfo=por"])
+fi
+if test "$GCC" = yes; then
+ if test "$gcc_major" -ge 4; then
+ RUBY_TRY_CFLAGS(-fvisibility=hidden, [visibility_option=yes], [visibility_option=no])
+ fi
+ AC_SUBST(WERRORFLAG, "-Werror")
+ if test "$visibility_option" = yes; then
+ RUBY_APPEND_OPTION(XCFLAGS, -fvisibility=hidden)
+ AC_DEFINE(RUBY_SYMBOL_EXPORT_BEGIN, [_Pragma("GCC visibility push(default)")])
+ AC_DEFINE(RUBY_SYMBOL_EXPORT_END, [_Pragma("GCC visibility pop")])
+ else
+ RUBY_TRY_LDFLAGS([-Wl,-unexported_symbol,_Init_*], [visibility_option=ld], [visibility_option=no])
+ fi
+ test "$visibility_option" = no -o "$host_os" = nacl || OBJCOPY=:
+fi
+
+if test "$GCC" = yes; then
+ # optflags
+
+ AS_CASE(["$target_os"], [mingw*], [
+ RUBY_TRY_CFLAGS(-fno-omit-frame-pointer, [optflags="${optflags+$optflags }-fno-omit-frame-pointer"])
+ RUBY_TRY_CFLAGS(-static-libgcc, [static_libgcc=yes], [static_libgcc=no])
+ if test "$static_libgcc" = yes; then
+ RUBY_APPEND_OPTION(EXTLDFLAGS, -static-libgcc)
+ fi
+ ])
+
+ # disable fast-math
+ for oflag in -fno-fast-math; do
+ RUBY_TRY_CFLAGS($oflag, [RUBY_APPEND_OPTION(optflags, $oflag)])
+ done
+fi
+
+AC_ARG_WITH(opt-dir,
+ AS_HELP_STRING([--with-opt-dir=DIR-LIST],
+ [add optional headers and libraries directories separated by $PATH_SEPARATOR]),
+ [
+ val=`echo "$PATH_SEPARATOR$withval" | sed "s|$PATH_SEPARATOR\([[^$PATH_SEPARATOR]*]\)| -I\1/include|g;s/^ //"`
+ CPPFLAGS="$CPPFLAGS $val"
+ val=`echo "$PATH_SEPARATOR$withval" | sed "s|$PATH_SEPARATOR\([[^$PATH_SEPARATOR]*]\)| -L\1/lib|g;s/^ //"`
+ LDFLAGS="$LDFLAGS $val"
+ LDFLAGS_OPTDIR="$val"
+ OPT_DIR="$withval"
+ ], [OPT_DIR=])
+
+test -z "${ac_env_CFLAGS_set}" -a -n "${cflags+set}" && eval CFLAGS="\"$cflags $ARCH_FLAG\""
+test -z "${ac_env_CXXFLAGS_set}" -a -n "${cxxflags+set}" && eval CXXFLAGS="\"$cxxflags $ARCH_FLAG\""
+
+}
+{ # header and library section
+
+AC_ARG_WITH(winnt-ver,
+ AS_HELP_STRING([--with-winnt-ver=0xXXXX], [target Windows NT version (default to 0x0501)]),
+ [with_winnt_ver="$withval"], [with_winnt_ver="0x0501"])
+AS_CASE(["$target_os"],
+[mingw*], [
+ RUBY_APPEND_OPTION(CPPFLAGS, -D_WIN32_WINNT=$with_winnt_ver)
+ RUBY_APPEND_OPTION(CPPFLAGS, -D__MINGW_USE_VC2005_COMPAT)
+])
+
+AS_CASE(["$target_os"],
+[freebsd*], [
+ AC_CACHE_CHECK([whether pthread should be enabled by default],
+ rb_cv_enable_pthread_default,
+ [AC_TRY_CPP([
+#include <osreldate.h>
+#if __FreeBSD_version < 502102
+#error pthread should be disabled on this platform
+#endif
+ ],
+ rb_cv_enable_pthread_default=yes,
+ rb_cv_enable_pthread_default=no)])
+ enable_pthread=$rb_cv_enable_pthread_default
+ ],
+[mingw*], [
+ enable_pthread=no
+ ],
+[
+ enable_pthread=yes
+ ])
+
+AC_ARG_ENABLE(pthread,
+ AS_HELP_STRING([--enable-pthread], [obsolete, and ignored]))
+
+dnl Checks for libraries.
+AS_CASE(["$target_os"],[*bsd*|dragonfly*],[],[ac_cv_func_daemon=no])
+
+POSTLINK=:
+AC_SUBST(POSTLINK)
+AS_CASE(["$target_os"],
+[nextstep*], [ ],
+[openstep*], [ ],
+[rhapsody*], [ ],
+[darwin*], [ RUBY_PREPEND_OPTION(LIBS, -lobjc)
+ RUBY_APPEND_OPTIONS(CPPFLAGS, -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT)
+ AC_MSG_CHECKING(whether Mac OS X 10.5 or later)
+ AC_TRY_CPP([#include <AvailabilityMacros.h>
+ #if MAC_OS_X_VERSION_MAX_ALLOWED <= 1040
+ #error pre OS X 10.4
+ [!<===== pre OS X 10.4 =====>]
+ #endif
+ ],
+ [macosx_10_5=yes], [macosx_10_5=no])
+ AC_MSG_RESULT($macosx_10_5)
+ if test $macosx_10_5 = yes; then
+ ac_cv_func_getcontext=no
+ ac_cv_func_setcontext=no
+ else
+ AC_DEFINE(BROKEN_SETREUID, 1)
+ AC_DEFINE(BROKEN_SETREGID, 1)
+ fi
+ incs=`$CC -v -E -xc - < /dev/null 2>&1 | sed ['1,/^@%:@include </d;s/^ *//;s|[^./][^/]*/\.\./||g;/\/include$/!d;s||/lib|;/\/usr\/lib/d']`
+ for d in `$CC -print-search-dirs | sed -e '/^libraries: */!d;s///' | tr : '\012' | fgrep -v /../ | sed -n 's|^\(/.*/lib\)/$|\1|p'`; do
+ incs=`echo "$incs" | fgrep -v "$d"`
+ done
+ for d in $incs; do
+ test -d "$d" && RUBY_APPEND_OPTIONS(LDFLAGS, "-L$d")
+ done
+ ac_cv_type_getgroups=gid_t # getgroups() on Rosetta fills garbage
+ ac_cv_lib_crypt_crypt=no
+ ac_cv_func_fdatasync=no # Mac OS X wrongly reports it has fdatasync()
+ ac_cv_func_vfork=no
+ if test $gcc_major -lt 4 -o \( $gcc_major -eq 4 -a $gcc_minor -lt 3 \); then
+ ac_cv_func___builtin_setjmp=no
+ fi
+ AC_CACHE_CHECK(for broken crypt with 8bit chars, rb_cv_broken_crypt,
+ [AC_TRY_RUN([
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+
+int
+main()
+{
+ int i;
+ for (i = 0; i < 128*128; i++) {
+ char salt[2], buf[256], *s;
+ salt[0] = 0x80 | (i & 0x7f);
+ salt[1] = 0x80 | (i >> 7);
+ strcpy(buf, crypt("", salt));
+ if (strcmp(buf, s = crypt("", salt))) {
+#if 0
+ printf("%.2x%.2x: %s -> %s\n", (unsigned char)salt[0], (unsigned char)salt[1],
+ buf+2, s+2);
+#endif
+ return 1;
+ }
+ }
+ return 0;
+}
+],
+ rb_cv_broken_crypt=no,
+ rb_cv_broken_crypt=yes,
+ rb_cv_broken_crypt=yes)])
+ if test "$rb_cv_broken_crypt" = yes; then
+ AC_DEFINE(BROKEN_CRYPT, 1)
+ fi
+ AC_CHECK_PROGS(codesign, codesign)
+ if test -n "$codesign"; then
+ POSTLINK="test -z '\$(RUBY_CODESIGN)' || $codesign -s '\$(RUBY_CODESIGN)' -f \$@"
+ LINK_SO="$LINK_SO
+\$(POSTLINK)"
+ fi
+ AC_CHECK_HEADERS(crt_externs.h, [], [], [
+ #include <crt_externs.h>
+ ])
+ ],
+[hpux*], [ LIBS="-lm $LIBS"
+ ac_cv_c_inline=no],
+[solaris*], [ LIBS="-lm $LIBS"
+ ac_cv_func_vfork=no
+ AC_MSG_CHECKING(whether _XOPEN_SOURCE is already given)
+ AC_TRY_COMPILE([#include <unistd.h>
+ #ifndef _XOPEN_SOURCE
+ #error _XOPEN_SOURCE is not defined
+ #endif
+ ], [],
+ [given_xopen_source=yes], [given_xopen_source=no])
+ AC_MSG_RESULT($given_xopen_source)
+ if test $given_xopen_source = no; then
+ # On Solaris, with gcc, -std=iso9899:1999 in $ansi_options
+ # is often also needed in CPPFLAGS, because some feature
+ # definitions vary depending on such standards options.
+ AS_CASE(["${ansi_options}"],
+ [*-std=iso9899:1999*], [
+ RUBY_APPEND_OPTIONS(CPPFLAGS, ${ansi_options})
+ ])
+ AC_MSG_CHECKING(appropriate _XOPEN_SOURCE value to define)
+ define_xopen_source=""
+ for tmp_xpg in 7 6 5; do
+ if test x"$define_xopen_source" != x; then
+ break
+ fi
+ # Both AC_TRY_CPP and AC_TRY_COMPILE should pass
+ # because some options may not be set to CPPFLAGS.
+ AC_TRY_CPP([
+ #define _XOPEN_SOURCE ${tmp_xpg}00
+ #include <unistd.h>
+ #ifndef _XPG${tmp_xpg}
+ #error _XPG${tmp_xpg} should be defined by _XOPEN_SOURCE=${tmp_xpg}00
+ #endif
+ ], [
+ AC_TRY_COMPILE([
+ #define _XOPEN_SOURCE ${tmp_xpg}00
+ #include <unistd.h>
+ #ifndef _XPG${tmp_xpg}
+ #error _XPG${tmp_xpg} should be defined by _XOPEN_SOURCE=${tmp_xpg}00
+ #endif
+ ], [],
+ [define_xopen_source=${tmp_xpg}00], [])
+ ], [])
+ done
+ if test x"$define_xopen_source" = x; then
+ define_xopen_source=no
+ fi
+ AC_MSG_RESULT($define_xopen_source)
+ if test x"$define_xopen_source" != xno; then
+ RUBY_APPEND_OPTIONS(CPPFLAGS, -D_XOPEN_SOURCE=$define_xopen_source)
+ fi
+ fi
+ ],
+[haiku*], [
+ LIBS="$LIBS" # m lib is include in root
+ ],
+[cygwin*], [ ac_cv_header_langinfo_h=yes
+ AC_CHECK_FUNCS(cygwin_conv_path)
+ AC_LIBOBJ([langinfo])
+ ],
+[mingw*], [ LIBS="-lshell32 -lws2_32 -liphlpapi -limagehlp -lshlwapi $LIBS"
+ ac_cv_header_a_out_h=no
+ ac_cv_header_pwd_h=no
+ ac_cv_header_utime_h=no
+ ac_cv_header_sys_ioctl_h=no
+ ac_cv_header_sys_param_h=no
+ ac_cv_header_sys_resource_h=no
+ ac_cv_header_sys_select_h=no
+ ac_cv_header_sys_time_h=no
+ ac_cv_header_sys_times_h=no
+ ac_cv_header_sys_socket_h=no
+ ac_cv_func_lstat=yes
+ ac_cv_func_times=yes
+ ac_cv_func_waitpid=yes
+ ac_cv_func_fsync=yes
+ ac_cv_func_seekdir=yes
+ ac_cv_func_telldir=yes
+ ac_cv_func_isinf=yes
+ ac_cv_func_isnan=yes
+ ac_cv_func_finite=yes
+ ac_cv_func_lchown=yes
+ ac_cv_func_link=yes
+ ac_cv_func_readlink=yes
+ ac_cv_func_symlink=yes
+ ac_cv_lib_crypt_crypt=no
+ ac_cv_func_getpgrp_void=no
+ ac_cv_func_memcmp_working=yes
+ ac_cv_lib_dl_dlopen=no
+ rb_cv_binary_elf=no
+ rb_cv_negative_time_t=no
+ ac_cv_func_fcntl=yes
+ ac_cv_func_flock=yes
+ ac_cv_func_gmtime_r=yes
+ rb_cv_large_fd_select=yes
+ ac_cv_type_struct_timeval=yes
+ ac_cv_func_clock_gettime=yes
+ ac_cv_func_clock_getres=yes
+ ac_cv_func_malloc_usable_size=no
+ { test "$target_cpu" = x64 && ac_cv_func___builtin_setjmp=no; }
+ AC_CHECK_TYPE([NET_LUID], [], [],
+ [@%:@include <winsock2.h>
+ @%:@include <iphlpapi.h>])
+ if test x"$ac_cv_type_NET_LUID" = xyes; then
+ AC_DEFINE(HAVE_TYPE_NET_LUID, 1)
+ fi
+ AC_CHECK_FUNCS(_gmtime64_s)
+ AC_CHECK_FUNCS(_wfreopen_s)
+ AC_LIBOBJ([langinfo])
+ ],
+[bsdi*], [ LIBS="-lm $LIBS"
+ AC_DEFINE(BROKEN_SETREUID, 1)
+ AC_DEFINE(BROKEN_SETREGID, 1)
+ ac_cv_sizeof_rlim_t=8],
+[freebsd*], [ LIBS="-lm $LIBS"
+ ac_cv_func_getpeername=no
+ ac_cv_func_getsockname=no
+ ac_cv_func_shutdown=no
+ ac_cv_func_close=no
+ ],
+[netbsd*], [ LIBS="-lm $LIBS"
+ ],
+[dragonfly*], [ LIBS="-lm $LIBS"
+ # isinf() and isnan() are macros on DragonFly.
+ ac_cv_func_isinf=yes
+ ac_cv_func_isnan=yes
+ ],
+[nacl], [
+ LIBS="-lm $LIBS"
+ if test "${nacl_cv_build_variant}" = "newlib"; then
+ RUBY_APPEND_OPTION(CPPFLAGS, -DNACL_NEWLIB)
+ else
+ RUBY_APPEND_OPTION(XCFLAGS, -fPIC)
+ fi
+ ],
+[ LIBS="-lm $LIBS"])
+
+AC_CHECK_LIB(crypt, crypt) # glibc (GNU/Linux, GNU/Hurd, GNU/kFreeBSD)
+AC_CHECK_LIB(dl, dlopen) # Dynamic linking for SunOS/Solaris and SYSV
+AC_CHECK_LIB(dld, shl_load) # Dynamic linking for HP-UX
+AC_CHECK_LIB(socket, shutdown) # SunOS/Solaris
+
+dnl Checks for header files.
+AC_HEADER_DIRENT
+dnl AC_HEADER_STDC has been checked in AC_USE_SYSTEM_EXTENSIONS
+AC_HEADER_STDBOOL
+AC_HEADER_SYS_WAIT
+
+AC_CHECK_HEADERS(a.out.h)
+AC_CHECK_HEADERS(atomic.h)
+AC_CHECK_HEADERS(direct.h)
+AC_CHECK_HEADERS(grp.h)
+AC_CHECK_HEADERS(fcntl.h)
+AC_CHECK_HEADERS(float.h)
+AC_CHECK_HEADERS(ieeefp.h)
+AC_CHECK_HEADERS(intrinsics.h)
+AC_CHECK_HEADERS(langinfo.h)
+AC_CHECK_HEADERS(limits.h)
+AC_CHECK_HEADERS(locale.h)
+AC_CHECK_HEADERS(malloc.h)
+AC_CHECK_HEADERS(malloc/malloc.h)
+AC_CHECK_HEADERS(malloc_np.h)
+AC_CHECK_HEADERS(net/socket.h)
+AC_CHECK_HEADERS(process.h)
+AC_CHECK_HEADERS(pwd.h)
+AC_CHECK_HEADERS(setjmpex.h)
+AC_CHECK_HEADERS(sys/attr.h)
+AC_CHECK_HEADERS(sys/fcntl.h)
+AC_CHECK_HEADERS(sys/file.h)
+AC_CHECK_HEADERS(sys/id.h)
+AC_CHECK_HEADERS(sys/ioctl.h)
+AC_CHECK_HEADERS(sys/mkdev.h)
+AC_CHECK_HEADERS(sys/param.h)
+AC_CHECK_HEADERS(sys/prctl.h)
+AC_CHECK_HEADERS(sys/resource.h)
+AC_CHECK_HEADERS(sys/select.h)
+AC_CHECK_HEADERS(sys/sendfile.h)
+AC_CHECK_HEADERS(sys/socket.h)
+AC_CHECK_HEADERS(sys/syscall.h)
+AC_CHECK_HEADERS(sys/time.h)
+AC_CHECK_HEADERS(sys/times.h)
+AC_CHECK_HEADERS(sys/uio.h)
+AC_CHECK_HEADERS(sys/utime.h)
+AC_CHECK_HEADERS(syscall.h)
+AC_CHECK_HEADERS(time.h)
+AC_CHECK_HEADERS(ucontext.h)
+AC_CHECK_HEADERS(utime.h)
+
+AC_ARG_WITH([gmp],
+ [AS_HELP_STRING([--without-gmp],
+ [disable GNU GMP to accelerate Bignum operations])],
+ [],
+ [with_gmp=yes])
+AS_IF([test "x$with_gmp" != xno],
+ [AC_CHECK_HEADERS(gmp.h)
+ AS_IF([test "x$ac_cv_header_gmp_h" != xno],
+ AC_CHECK_LIB([gmp], [__gmpz_init]))
+ with_gmp="$ac_cv_lib_gmp___gmpz_init"
+ AS_IF([test -z "$with_gmp"], [with_gmp=no])])
+
+AC_ARG_WITH([jemalloc],
+ [AS_HELP_STRING([--with-jemalloc],[use jemalloc allocator])],
+ [with_jemalloc=$withval], [with_jemalloc=no])
+AS_IF([test "x$with_jemalloc" = xyes],[
+ AC_CHECK_LIB([jemalloc], [malloc_conf], [], [with_jemalloc=no])
+ AC_CHECK_HEADER(jemalloc/jemalloc.h, [
+ AC_DEFINE(RUBY_ALTERNATIVE_MALLOC_HEADER, [<jemalloc/jemalloc.h>])
+ ])
+ AS_IF([test "x$with_jemalloc" = xno], [
+ AC_CACHE_CHECK([for jemalloc with JEMALLOC_MANGLE], rb_cv_jemalloc_demangle,
+ [AC_LINK_IFELSE([AC_LANG_PROGRAM([@%:@define JEMALLOC_MANGLE 1
+ @%:@ifdef RUBY_ALTERNATIVE_MALLOC_HEADER
+ @%:@include RUBY_ALTERNATIVE_MALLOC_HEADER
+ @%:@else
+ @%:@include <jemalloc.h>
+ @%:@endif], [return !&malloc_conf])],
+ [rb_cv_jemalloc_demangle=yes],
+ [rb_cv_jemalloc_demangle=no])
+ ])
+ ])
+ AS_IF([test "x$rb_cv_jemalloc_demangle" = xyes], [
+ AC_DEFINE(JEMALLOC_MANGLE)
+ with_jemalloc=yes
+ ])
+ AS_IF([test "x$with_jemalloc" = xyes],
+ [
+ ac_cv_func_malloc_usable_size=yes
+ ],
+ [AC_MSG_ERROR([jemalloc requested but not found])
+ ])
+])
+
+dnl check for large file stuff
+mv confdefs.h confdefs1.h
+: > confdefs.h
+AC_SYS_LARGEFILE
+# On 32-bit Solaris, it is safe to define _LARGEFILE_SOURCE
+# which is not added by AC_SYS_LARGEFILE.
+if test x"$enable_largefile" != xno; then
+ AS_CASE(["$target_os"], [solaris*], [
+ AC_MSG_CHECKING([wheather _LARGEFILE_SOURCE should be defined])
+ AS_CASE(["${ac_cv_sys_file_offset_bits}:${ac_cv_sys_large_files}"],
+ ["64:"|"64:no"|"64:unknown"], [
+ # insert _LARGEFILE_SOURCE before _FILE_OFFSET_BITS line
+ # that is the same order as "getconf LFS_CFLAGS" output
+ mv confdefs.h largefile0.h
+ : > confdefs.h
+ AC_DEFINE(_LARGEFILE_SOURCE)
+ cat largefile0.h >> confdefs.h
+ rm largefile0.h
+ AC_MSG_RESULT([yes])
+ ], [AC_MSG_RESULT([no])])
+ ])
+fi
+mv confdefs.h largefile.h
+mv confdefs1.h confdefs.h
+cat largefile.h >> confdefs.h
+
+AS_CASE(["$target_os"],
+ [mingw*], [ac_cv_type_off_t=yes;ac_cv_sizeof_off_t=8],
+ [aix*], [
+ AS_CASE(["$target_cpu:$ac_cv_sys_large_files"],
+ [ppc64:*|powerpc64:*], [],
+ [*:no|*:unknown], [],
+ [
+ # AIX currently does not support a 32-bit call to posix_fadvise()
+ # if _LARGE_FILES is defined.
+ ac_cv_func_posix_fadvise=no
+ ])
+ ])
+
+AC_C_BIGENDIAN
+AC_C_CONST
+AC_C_CHAR_UNSIGNED
+AC_C_INLINE
+AC_C_VOLATILE
+AC_C_TYPEOF
+
+AS_CASE(":$ac_cv_c_const:$ac_cv_c_volatile:",
+ [*:no:*], [AC_MSG_ERROR(ANSI C-conforming const and volatile are mandatory)])
+
+AC_CHECK_TYPES([long long, off_t])
+
+AC_CACHE_CHECK([char bit], [rb_cv_char_bit],
+ [test "$universal_binary" = yes && cross_compiling=yes
+ AC_COMPUTE_INT([rb_cv_char_bit], [CHAR_BIT],
+ [AC_INCLUDES_DEFAULT([@%:@include <limits.h>])], [rb_cv_char_bit=8])
+ test "$universal_binary" = yes && cross_compiling=$real_cross_compiling])
+
+dnl RUBY_CHECK_SIZEOF [typename], [maybe same size types], [macros], [include]
+AC_DEFUN([RUBY_CHECK_SIZEOF],
+[m4_bmatch([$1], [\.], [], [if test "$universal_binary" = yes; then])
+AC_CACHE_CHECK([size of $1], [AS_TR_SH([ac_cv_sizeof_$1])], [
+ unset AS_TR_SH(ac_cv_sizeof_$1)
+ rbcv_var="
+typedef m4_bpatsubst([$1], [\..*]) ac__type_sizeof_;
+static ac__type_sizeof_ *rbcv_ptr;
+@%:@define AS_TR_CPP(SIZEOF_$1) sizeof((*rbcv_ptr)[]m4_bmatch([$1], [\.], .m4_bpatsubst([$1], [^[^.]*\.])))
+"
+ m4_ifval([$2], [test -z "${AS_TR_SH(ac_cv_sizeof_$1)+set}" && {
+ for t in $2; do
+ AC_COMPILE_IFELSE(
+ [AC_LANG_BOOL_COMPILE_TRY(AC_INCLUDES_DEFAULT([$4]
+ [$rbcv_var]),
+ [AS_TR_CPP(SIZEOF_$1) == sizeof($t)])], [
+ AS_TR_SH(ac_cv_sizeof_$1)=AS_TR_CPP([SIZEOF_]$t)
+ break])
+ done
+ }])
+ unset cond
+ m4_ifval([$3], [test -z "${AS_TR_SH(ac_cv_sizeof_$1)+set}" && {
+ for s in 32 64 128; do
+ for t in $3; do
+ cond="${cond}
+@%:@${cond+el}if defined(__${t}${s}__) || defined(__${t}${s}) || defined(_${t}${s}) || defined(${t}${s})"
+ hdr="AC_INCLUDES_DEFAULT([$4
+@%:@if defined(__${t}${s}__) || defined(__${t}${s}) || defined(_${t}${s}) || defined(${t}${s})
+@%:@ define AS_TR_CPP(HAVE_$1) 1
+@%:@else
+@%:@ define AS_TR_CPP(HAVE_$1) 0
+@%:@endif])"
+ AC_COMPILE_IFELSE([AC_LANG_BOOL_COMPILE_TRY([$hdr], [!AS_TR_CPP(HAVE_$1)])], [continue])
+ AC_COMPILE_IFELSE([AC_LANG_BOOL_COMPILE_TRY([$hdr]
+ [$rbcv_var],
+ [AS_TR_CPP(HAVE_$1) == (AS_TR_CPP(SIZEOF_$1) == ([$[s / rb_cv_char_bit]]))])],
+ [AS_TR_SH(ac_cv_sizeof_$1)="${AS_TR_SH(ac_cv_sizeof_$1)+${AS_TR_SH(ac_cv_sizeof_$1)-} }${t}${s}"])
+ done
+ done
+ }])
+ m4_ifval([$2][$3],
+ [test "${AS_TR_SH(ac_cv_sizeof_$1)@%:@SIZEOF_}" = "${AS_TR_SH(ac_cv_sizeof_$1)}" && ]){
+ test "$universal_binary" = yes && cross_compiling=yes
+ AC_COMPUTE_INT([t], AS_TR_CPP(SIZEOF_$1), [AC_INCLUDES_DEFAULT([$4])]
+[${cond+$cond
+@%:@else}
+$rbcv_var
+${cond+@%:@endif}
+@%:@ifndef AS_TR_CPP(SIZEOF_$1)
+@%:@define AS_TR_CPP(SIZEOF_$1) 0
+@%:@endif], [t=0])
+ test "$universal_binary" = yes && cross_compiling=$real_cross_compiling
+ if test ${t-0} != 0; then
+ AS_TR_SH(ac_cv_sizeof_$1)="${AS_TR_SH(ac_cv_sizeof_$1)+${AS_TR_SH(ac_cv_sizeof_$1)-} }${t}"
+ fi
+ }
+ : ${AS_TR_SH(ac_cv_sizeof_$1)=0}
+])
+{
+ unset cond
+ for t in ${AS_TR_SH(ac_cv_sizeof_$1)-}; do
+ AS_CASE(["$t"],
+ [[[0-9]*|SIZEOF_*]], [
+ ${cond+echo "@%:@else"}
+ echo "[@%:@define ]AS_TR_CPP(SIZEOF_$1) [$t]"
+ break
+ ],
+ [
+ s=`expr $t : ['.*[^0-9]\([0-9][0-9]*\)$']`
+ echo "@%:@${cond+el}if defined(__${t}__) || defined(__${t}) || defined(_${t}) || defined($t)"
+ echo "@%:@define AS_TR_CPP(SIZEOF_$1) [$[s / rb_cv_char_bit]]"
+ cond=1
+ ])
+ done
+ ${cond+echo "@%:@endif"}
+} >> confdefs.h
+m4_bmatch([$1], [\.], [], [else
+AC_CHECK_SIZEOF([$1], 0, [$4])
+fi])
+])
+
+RUBY_CHECK_SIZEOF(int, [], [ILP])
+RUBY_CHECK_SIZEOF(short)
+RUBY_CHECK_SIZEOF(long, [int], [ILP LP])
+RUBY_CHECK_SIZEOF(long long)
+RUBY_CHECK_SIZEOF(__int64)
+RUBY_CHECK_SIZEOF(off_t)
+RUBY_CHECK_SIZEOF(void*, [int long "long long"], [ILP LP LLP])
+RUBY_CHECK_SIZEOF(float)
+RUBY_CHECK_SIZEOF(double)
+RUBY_CHECK_SIZEOF(time_t, [long "long long"], [], [@%:@include <time.h>])
+RUBY_CHECK_SIZEOF(clock_t, [], [], [@%:@include <time.h>])
+
+AC_CACHE_CHECK(packed struct attribute, rb_cv_packed_struct,
+ [rb_cv_packed_struct=no
+ for mac in \
+ "__pragma(pack(push, 1)) x __pragma(pack(pop))" \
+ "x __attribute__((packed))" \
+ ; do
+ AC_TRY_COMPILE([@%:@define PACKED_STRUCT(x) $mac
+ PACKED_STRUCT(struct { int a; });], [],
+ [rb_cv_packed_struct=$mac; break])
+ done])
+packed_struct_unaligned=x
+if test "$rb_cv_packed_struct" != no; then
+ AC_DEFINE_UNQUOTED([PACKED_STRUCT(x)], [$rb_cv_packed_struct])
+else
+ AC_DEFINE_UNQUOTED([PACKED_STRUCT(x)], x)
+fi
+AC_DEFINE_UNQUOTED(PACKED_STRUCT_UNALIGNED(x), $packed_struct_unaligned)
+
+AC_DEFUN([RUBY_CHECK_PRINTF_PREFIX], [
+AC_CACHE_CHECK([for printf prefix for $1], [rb_cv_pri_prefix_]AS_TR_SH($1),[
+ [rb_cv_pri_prefix_]AS_TR_SH($1)=[NONE]
+ RUBY_WERROR_FLAG(RUBY_APPEND_OPTIONS(CFLAGS, $rb_cv_wsuppress_flags)
+ for pri in $2; do
+ AC_TRY_COMPILE(
+ [@%:@include <stdio.h>
+ @%:@include <stddef.h>
+ @%:@ifdef __GNUC__
+ @%:@define PRINTF_ARGS(decl, string_index, first_to_check) \
+ decl __attribute__((format(printf, string_index, first_to_check)))
+ @%:@else
+ @%:@define PRINTF_ARGS(decl, string_index, first_to_check) decl
+ @%:@endif
+ PRINTF_ARGS(void test_sprintf(const char*, ...), 1, 2);],
+ [printf("%]${pri}[d", (]$1[)42);
+ test_sprintf("%]${pri}[d", (]$1[)42);],
+ [rb_cv_pri_prefix_]AS_TR_SH($1)[=[$pri]; break])
+ done)])
+if test "[$rb_cv_pri_prefix_]AS_TR_SH($1)" != NONE; then
+ AC_DEFINE_UNQUOTED([PRI_]m4_ifval($3,$3,AS_TR_CPP(m4_bpatsubst([$1],[_t$])))[_PREFIX],
+ "[$rb_cv_pri_prefix_]AS_TR_SH($1)")
+fi
+])
+
+if test "x$ac_cv_type_long_long" = xyes; then
+ RUBY_CHECK_PRINTF_PREFIX(long long, ll I64, LL)
+elif test "x$ac_cv_type___int64" = xyes; then
+ RUBY_CHECK_PRINTF_PREFIX(__int64, ll I64, LL)
+fi
+
+dnl RUBY_CHECK_SIZEOF [typename] [if-signed] [if-unsigned] [included]
+AC_DEFUN([RUBY_CHECK_SIGNEDNESS], [dnl
+ AC_COMPILE_IFELSE([AC_LANG_BOOL_COMPILE_TRY([AC_INCLUDES_DEFAULT([$4])], [($1)-1 > 0])],
+ [$3], [$2])])
+
+dnl RUBY_REPLACE_TYPE [typename] [default type] [macro type] [included]
+AC_DEFUN([RUBY_REPLACE_TYPE], [dnl
+ AC_CHECK_TYPE([$1],
+ [n="patsubst([$1],["],[\\"])"],
+ [n="patsubst([$2],["],[\\"])"],
+ [$4])
+ AC_CACHE_CHECK([for convertible type of [$1]], rb_cv_[$1]_convertible, [
+ u= t=
+ AS_CASE(["$n "],
+ [*" signed "*], [ ],
+ [*" unsigned "*], [
+ u=U],
+ [RUBY_CHECK_SIGNEDNESS($n, [], [u=U], [$4])])
+ if test x"$t" = x; then
+ for t in "long long" long int short; do
+ test -n "$u" && t="unsigned $t"
+ AC_COMPILE_IFELSE(
+ [AC_LANG_BOOL_COMPILE_TRY([AC_INCLUDES_DEFAULT([$4])]
+ [typedef $n rbcv_conftest_target_type;
+ typedef $t rbcv_conftest_replace_type;
+ extern rbcv_conftest_target_type rbcv_conftest_var;
+ extern rbcv_conftest_replace_type rbcv_conftest_var;
+ extern rbcv_conftest_target_type rbcv_conftest_func(void);
+ extern rbcv_conftest_replace_type rbcv_conftest_func(void);
+ ], [sizeof(rbcv_conftest_target_type) == sizeof(rbcv_conftest_replace_type)])],
+ [n="$t"; break])
+ done
+ fi
+ AS_CASE([" $n "],
+ [*" long long "*], [
+ t=LL],
+ [*" long "*], [
+ t=LONG],
+ [
+ t=INT])
+ rb_cv_[$1]_convertible=${u}${t}])
+ if test "${AS_TR_SH(ac_cv_type_[$1])}" = "yes"; then
+ n="$1"
+ else
+ AS_CASE(["${rb_cv_[$1]_convertible}"],
+ [*LL], [n="long long"],
+ [*LONG], [n="long"],
+ [n="int"])
+ AS_CASE(["${rb_cv_[$1]_convertible}"],
+ [U*], [n="unsigned $n"])
+ fi
+ AS_CASE("${rb_cv_[$1]_convertible}", [U*], [u=+1], [u=-1])
+ AC_DEFINE_UNQUOTED(rb_[$1], $n)
+ AC_DEFINE_UNQUOTED([SIGNEDNESS_OF_]AS_TR_CPP($1), $u)
+ AC_DEFINE_UNQUOTED([$3]2NUM[(v)], [${rb_cv_[$1]_convertible}2NUM(v)])
+ AC_DEFINE_UNQUOTED(NUM2[$3][(v)], [NUM2${rb_cv_[$1]_convertible}(v)])
+ AC_DEFINE_UNQUOTED(PRI_[$3]_PREFIX,
+ [PRI_`echo ${rb_cv_[$1]_convertible} | sed ['s/^U//']`_PREFIX])
+])
+RUBY_REPLACE_TYPE(pid_t, int, PIDT)
+RUBY_REPLACE_TYPE(uid_t, int, UIDT)
+RUBY_REPLACE_TYPE(gid_t, int, GIDT)
+RUBY_REPLACE_TYPE(time_t, [], TIMET, [@%:@include <time.h>])
+RUBY_REPLACE_TYPE(dev_t, [int long "long long"], DEVT)
+RUBY_REPLACE_TYPE(mode_t, ["unsigned int" long], MODET, [@%:@include <sys/stat.h>])
+RUBY_REPLACE_TYPE(rlim_t, [int long "long long"], RLIM, [
+@%:@ifdef HAVE_SYS_TYPES_H
+@%:@include <sys/types.h>
+@%:@endif
+@%:@ifdef HAVE_SYS_TYPES_H
+@%:@include <sys/time.h>
+@%:@endif
+@%:@include <sys/resource.h>
+])
+RUBY_REPLACE_TYPE(off_t, [], OFFT)
+RUBY_REPLACE_TYPE(clockid_t, [], CLOCKID)
+
+AC_CACHE_CHECK(for prototypes, rb_cv_have_prototypes,
+ [AC_TRY_COMPILE([int foo(int x) { return 0; }], [return foo(10);],
+ rb_cv_have_prototypes=yes,
+ rb_cv_have_prototypes=no)])
+if test "$rb_cv_have_prototypes" = yes; then
+ AC_DEFINE(HAVE_PROTOTYPES)
+fi
+
+AC_CACHE_CHECK(token paste string, rb_cv_tokenpaste,
+ [AC_TRY_COMPILE([@%:@define paste(a,b) a@%:@@%:@b],
+ [int xy = 1; return paste(x,y);],
+ rb_cv_tokenpaste=ansi,
+ rb_cv_tokenpaste=knr)])
+if test "$rb_cv_tokenpaste" = ansi; then
+ AC_DEFINE(TOKEN_PASTE(x,y),[x@%:@@%:@y])
+else
+ AC_DEFINE(TOKEN_PASTE(x,y),[x/**/y])
+fi
+
+AC_CACHE_CHECK(stringization, rb_cv_stringization, [
+ rb_cv_stringization=no
+ for string in "#expr" '"expr"'; do
+ AC_COMPILE_IFELSE([
+ AC_LANG_BOOL_COMPILE_TRY([
+#define STRINGIZE0(expr) $string
+#define STRINGIZE(expr) STRINGIZE0(expr)
+#undef real_test_for_stringization
+#define test_for_stringization -.real_test_for_stringization.-
+const char stringized[[]] = STRINGIZE(test_for_stringization);
+], [sizeof(stringized) == 32])],
+ [rb_cv_stringization="$string"; break],
+ [rb_cv_stringization=no])
+ done]
+)
+AC_DEFINE(STRINGIZE(expr),STRINGIZE0(expr))
+if test x"$rb_cv_stringization" != xno -a "$rb_cv_stringization" != "#expr"; then
+ AC_DEFINE_UNQUOTED(STRINGIZE0(expr),$rb_cv_stringization)
+ AC_DEFINE(OLD_FASHIONED_STRINGIZATION,1)
+fi
+
+AC_CACHE_CHECK([string literal concatenation],
+ rb_cv_string_literal_concatenation, [
+ AC_COMPILE_IFELSE([
+ AC_LANG_BOOL_COMPILE_TRY([
+const char concatenated_literal[[]] = "literals" "to"
+ "be" "concatenated.";
+], [sizeof(concatenated_literal) == 26])],
+ [rb_cv_string_literal_concatenation=yes],
+ [rb_cv_string_literal_concatenation=no])]
+)
+if test "$rb_cv_string_literal_concatenation" = no; then
+ AC_DEFINE(NO_STRING_LITERAL_CONCATENATION,1)
+fi
+
+AC_CACHE_CHECK(for variable length prototypes and stdarg.h, rb_cv_stdarg,
+ [AC_TRY_COMPILE([
+#include <stdarg.h>
+int foo(int x, ...) {
+ va_list va;
+ va_start(va, x);
+ va_arg(va, int);
+ va_arg(va, char *);
+ va_arg(va, double);
+ return 0;
+}
+], [return foo(10, "", 3.14);],
+ rb_cv_stdarg=yes,
+ rb_cv_stdarg=no)])
+if test "$rb_cv_stdarg" = yes; then
+ AC_DEFINE(HAVE_STDARG_PROTOTYPES)
+fi
+
+AC_CACHE_CHECK(for variable length macro, rb_cv_va_args_macro,
+ [AC_TRY_COMPILE([
+int foo(int x, ...);
+@%:@define FOO(a, ...) foo(a, @%:@@%:@__VA_ARGS__)
+], [FOO(1);FOO(1,2);FOO(1,2,3);],
+ rb_cv_va_args_macro=yes,
+ rb_cv_va_args_macro=no)])
+if test "$rb_cv_va_args_macro" = yes; then
+ AC_DEFINE(HAVE_VA_ARGS_MACRO)
+fi
+
+AC_DEFUN([RUBY_DEFINE_IF], [dnl
+ m4_ifval([$1], [AS_LITERAL_IF([$1], [], [test "X$1" = X || ])cat <<EOH >> confdefs.h
+@%:@if $1
+EOH
+])dnl
+AC_DEFINE_UNQUOTED($2, $3)dnl
+ m4_ifval([$1], [AS_LITERAL_IF([$1], [], [test "X$1" = X || ])cat <<EOH >> confdefs.h
+@%:@endif /* $1 */
+EOH
+])dnl
+])dnl
+
+dnl RUBY_DECL_ATTRIBUTE(attrib, macroname, cachevar, condition, type, code)
+AC_DEFUN([RUBY_DECL_ATTRIBUTE], [dnl
+m4_ifval([$2], dnl
+ [AS_VAR_PUSHDEF([attrib], m4_bpatsubst([$2], [(.*)], []))], dnl
+ [AS_VAR_PUSHDEF([attrib], m4_toupper(m4_format(%.4s, [$5]))[_]AS_TR_CPP($1))] dnl
+)dnl
+m4_ifval([$3], dnl
+ [AS_VAR_PUSHDEF([rbcv],[$3])], dnl
+ [AS_VAR_PUSHDEF([rbcv],[rb_cv_]m4_format(%.4s, [$5])[_][$1])]dnl
+)dnl
+m4_pushdef([attrib_code],[m4_bpatsubst([$1],["],[\\"])])dnl
+m4_pushdef([attrib_params],[m4_bpatsubst([$2(x)],[^[^()]*(\([^()]*\)).*],[\1])])dnl
+m4_ifval([$4], [rbcv_cond=["$4"]; test "$rbcv_cond" || unset rbcv_cond])
+AC_CACHE_CHECK(for m4_ifval([$2],[m4_bpatsubst([$2], [(.*)], [])],[$1]) [$5] attribute, rbcv, dnl
+[rbcv=x
+RUBY_WERROR_FLAG([
+for mac in \
+ "__attribute__ ((attrib_code)) x" \
+ "x __attribute__ ((attrib_code))" \
+ "__declspec(attrib_code) x" \
+ x; do
+ m4_ifval([$4],mac="$mac"${rbcv_cond+" /* only if $rbcv_cond */"})
+ AC_TRY_COMPILE(
+ m4_ifval([$4],${rbcv_cond+[@%:@if ]$rbcv_cond})
+[@%:@define ]attrib[](attrib_params)[ $mac]
+m4_ifval([$4],${rbcv_cond+[@%:@else]}
+${rbcv_cond+[@%:@define ]attrib[](attrib_params)[ x]}
+${rbcv_cond+[@%:@endif]})
+$6
+ attrib[](attrib_params)[;], [],
+ [rbcv="$mac"; break])
+done
+])])
+if test "$rbcv" != x; then
+ RUBY_DEFINE_IF(m4_ifval([$4],[${rbcv_cond}]), attrib[](attrib_params)[], $rbcv)
+fi
+m4_ifval([$4], [unset rbcv_cond]) dnl
+m4_popdef([attrib_params])dnl
+m4_popdef([attrib_code])dnl
+AS_VAR_POPDEF([attrib])dnl
+AS_VAR_POPDEF([rbcv])dnl
+])
+
+dnl RUBY_FUNC_ATTRIBUTE(attrib, macroname, cachevar, condition)
+AC_DEFUN([RUBY_FUNC_ATTRIBUTE], [dnl
+ RUBY_DECL_ATTRIBUTE([$1], [$2], [$3], [$4],
+ [function], [@%:@define x void conftest_attribute_check(void)]
+ )
+])
+
+dnl RUBY_TYPE_ATTRIBUTE(attrib, macroname, cachevar, condition)
+AC_DEFUN([RUBY_TYPE_ATTRIBUTE], [dnl
+ RUBY_DECL_ATTRIBUTE([$1], [$2], [$3], [$4],
+ [type], [
+@%:@define x struct conftest_attribute_check {int i;}
+@%:@define mesg ("")
+])
+])
+
+RUBY_FUNC_ATTRIBUTE(noreturn, NORETURN)
+RUBY_FUNC_ATTRIBUTE(deprecated, DEPRECATED)
+RUBY_FUNC_ATTRIBUTE(deprecated("by "@%:@n), DEPRECATED_BY(n,x), rb_cv_func_deprecated_by)
+RUBY_TYPE_ATTRIBUTE(deprecated mesg, DEPRECATED_TYPE(mesg,x), rb_cv_type_deprecated)
+RUBY_FUNC_ATTRIBUTE(noinline, NOINLINE)
+RUBY_FUNC_ATTRIBUTE(weak, WEAK, rb_cv_func_weak)
+if test "$rb_cv_func_weak" != x; then
+ AC_DEFINE(HAVE_FUNC_WEAK)
+fi
+
+if_i386=${universal_binary+[defined __i386__]}
+RUBY_FUNC_ATTRIBUTE(stdcall, [], [], ${if_i386})
+RUBY_FUNC_ATTRIBUTE(cdecl, [], [], ${if_i386})
+RUBY_FUNC_ATTRIBUTE(fastcall, [], [], ${if_i386})
+RUBY_FUNC_ATTRIBUTE(optimize("O0"), FUNC_UNOPTIMIZED, rb_cv_func_unoptimized)
+RUBY_FUNC_ATTRIBUTE(optimize("-Os","-fomit-frame-pointer"), FUNC_MINIMIZED, rb_cv_func_minimized)
+
+if test "$GCC" = yes; then
+ AC_CACHE_CHECK([for function alias], [rb_cv_gcc_function_alias],
+ [rb_cv_gcc_function_alias=no
+ for a in alias weak,alias; do
+ AC_TRY_LINK([void foo(void) {}
+ void bar(void) __attribute__(($a("foo")));], [bar()],
+ [rb_cv_gcc_function_alias=$a; break])
+ done])
+ if test "$rb_cv_gcc_function_alias" != no; then
+ AC_DEFINE(HAVE_ATTRIBUTE_FUNCTION_ALIAS)
+ AC_DEFINE_UNQUOTED([RUBY_ALIAS_FUNCTION_TYPE(type, prot, name, args)],
+ [type prot __attribute__(($rb_cv_gcc_function_alias(@%:@name)));])
+ AC_DEFINE_UNQUOTED([RUBY_ALIAS_FUNCTION_VOID(prot, name, args)],
+ [RUBY_ALIAS_FUNCTION_TYPE(void, prot, name, args)])
+ fi
+
+ AC_CACHE_CHECK([for __atomic builtins], [rb_cv_gcc_atomic_builtins], [
+ AC_TRY_LINK([unsigned char atomic_var;],
+ [
+ __atomic_exchange_n(&atomic_var, 0, __ATOMIC_SEQ_CST);
+ __atomic_exchange_n(&atomic_var, 1, __ATOMIC_SEQ_CST);
+ __atomic_fetch_add(&atomic_var, 1, __ATOMIC_SEQ_CST);
+ __atomic_fetch_sub(&atomic_var, 1, __ATOMIC_SEQ_CST);
+ __atomic_or_fetch(&atomic_var, 1, __ATOMIC_SEQ_CST);
+ ],
+ [rb_cv_gcc_atomic_builtins=yes],
+ [rb_cv_gcc_atomic_builtins=no])])
+ if test "$rb_cv_gcc_atomic_builtins" = yes; then
+ AC_DEFINE(HAVE_GCC_ATOMIC_BUILTINS)
+ fi
+
+ AC_CACHE_CHECK([for __sync builtins], [rb_cv_gcc_sync_builtins], [
+ AC_TRY_LINK([unsigned char atomic_var;],
+ [
+ __sync_lock_test_and_set(&atomic_var, 0);
+ __sync_lock_test_and_set(&atomic_var, 1);
+ __sync_fetch_and_add(&atomic_var, 1);
+ __sync_fetch_and_sub(&atomic_var, 1);
+ __sync_or_and_fetch(&atomic_var, 1);
+ __sync_val_compare_and_swap(&atomic_var, 0, 1);
+ ],
+ [rb_cv_gcc_sync_builtins=yes],
+ [rb_cv_gcc_sync_builtins=no])])
+ if test "$rb_cv_gcc_sync_builtins" = yes; then
+ AC_DEFINE(HAVE_GCC_SYNC_BUILTINS)
+ fi
+
+ AC_CACHE_CHECK(for __builtin_unreachable, rb_cv_func___builtin_unreachable,
+ [RUBY_WERROR_FLAG(
+ [AC_TRY_LINK([volatile int zero;],
+ [if (zero) __builtin_unreachable();],
+ [rb_cv_func___builtin_unreachable=yes],
+ [rb_cv_func___builtin_unreachable=no])
+ ])
+ ])
+ if test "$rb_cv_func___builtin_unreachable" = yes; then
+ AC_DEFINE_UNQUOTED(UNREACHABLE, [__builtin_unreachable()])
+ fi
+fi
+
+AC_CACHE_CHECK(for exported function attribute, rb_cv_func_exported, [
+rb_cv_func_exported=no
+RUBY_WERROR_FLAG([
+for mac in '__attribute__ ((visibility("default")))' '__declspec(dllexport)'; do
+ AC_TRY_COMPILE([@%:@define RUBY_FUNC_EXPORTED $mac extern
+ RUBY_FUNC_EXPORTED void conftest_attribute_check(void);], [],
+ [rb_cv_func_exported="$mac"; break])
+done
+])])
+if test "$rb_cv_func_exported" != no; then
+ AC_DEFINE_UNQUOTED(RUBY_FUNC_EXPORTED, [$rb_cv_func_exported extern])
+fi
+
+RUBY_APPEND_OPTION(XCFLAGS, -DRUBY_EXPORT)
+
+AC_CACHE_CHECK(for function name string predefined identifier,
+ rb_cv_function_name_string,
+ [rb_cv_function_name_string=no
+ RUBY_WERROR_FLAG([
+ for func in __func__ __FUNCTION__; do
+ AC_TRY_LINK([@%:@include <stdio.h>],
+ [puts($func);],
+ [rb_cv_function_name_string=$func
+ break])
+ done
+ ])]
+)
+if test "$rb_cv_function_name_string" != no; then
+ AC_DEFINE_UNQUOTED(RUBY_FUNCTION_NAME_STRING, [$rb_cv_function_name_string])
+fi
+
+AC_CACHE_CHECK(if enum over int is allowed, rb_cv_enum_over_int, [
+ rb_cv_enum_over_int=no
+ if test "x$ac_cv_type_long_long" = xyes; then
+ type="unsigned long long" max="ULLONG_MAX"
+ else
+ type="unsigned long" max="ULONG_MAX"
+ fi
+ RUBY_WERROR_FLAG([
+ AC_COMPILE_IFELSE([
+ AC_LANG_BOOL_COMPILE_TRY([
+ @%:@include <limits.h>
+ enum {conftest_max = $max};
+ ], [
+ (conftest_max == $max) &&
+ (sizeof(conftest_max) == sizeof($type))
+ ]
+ )],
+ [rb_cv_enum_over_int=yes],
+ [rb_cv_enum_over_int=no]
+ )
+ ])
+])
+if test $rb_cv_enum_over_int = yes; then
+ AC_DEFINE(ENUM_OVER_INT, 1)
+fi
+
+dnl Check whether we need to define sys_nerr locally
+AC_CHECK_DECLS([sys_nerr], [], [], [$ac_includes_default
+@%:@include <errno.h>])
+
+AC_CHECK_DECLS([getenv])
+
+AS_CASE(["$target_cpu"],
+[alpha*|sh4|sh4el|sh4eb], [AS_CASE(["$target_os"::"$GCC"],
+ [*::yes], # gcc
+ [CFLAGS="-mieee $CFLAGS"],
+ [osf*], # ccc
+ [CFLAGS="-ieee $CFLAGS"],
+ )],
+[sparc*], [AC_LIBOBJ([sparc])])
+
+ac_cv_header_net_socket_h=${ac_cv_header_net_socket_h=no}
+if test "$ac_cv_header_net_socket_h" = yes; then
+ ac_cv_header_sys_socket_h=${ac_cv_header_sys_socket_h=no}
+else
+ ac_cv_header_sys_socket_h=${ac_cv_header_sys_socket_h=yes}
+fi
+
+
+AC_TYPE_SIZE_T
+RUBY_CHECK_SIGNEDNESS(size_t, [AC_MSG_ERROR(size_t is signed)], [],
+ [@%:@include <sys/types.h>])
+RUBY_CHECK_SIZEOF(size_t, [int long void*], [], [@%:@include <sys/types.h>])
+RUBY_CHECK_SIZEOF(ptrdiff_t, size_t, [], [@%:@include <stddef.h>])
+RUBY_CHECK_PRINTF_PREFIX(size_t, z)
+RUBY_CHECK_PRINTF_PREFIX(ptrdiff_t, t)
+AC_STRUCT_ST_BLKSIZE
+AC_STRUCT_ST_BLOCKS
+AC_STRUCT_ST_RDEV
+RUBY_CHECK_SIZEOF([struct stat.st_size], [off_t int long "long long"], [], [@%:@include <sys/stat.h>])
+if test "$ac_cv_member_struct_stat_st_blocks" = yes; then
+ RUBY_CHECK_SIZEOF([struct stat.st_blocks], [off_t int long "long long"], [], [@%:@include <sys/stat.h>])
+fi
+RUBY_CHECK_SIZEOF([struct stat.st_ino], [long "long long"], [], [@%:@include <sys/stat.h>])
+AC_CHECK_MEMBERS([struct stat.st_atim])
+AC_CHECK_MEMBERS([struct stat.st_atimespec])
+AC_CHECK_MEMBERS([struct stat.st_atimensec])
+AC_CHECK_MEMBERS([struct stat.st_mtim])
+AC_CHECK_MEMBERS([struct stat.st_mtimespec])
+AC_CHECK_MEMBERS([struct stat.st_mtimensec])
+AC_CHECK_MEMBERS([struct stat.st_ctim])
+AC_CHECK_MEMBERS([struct stat.st_ctimespec])
+AC_CHECK_MEMBERS([struct stat.st_ctimensec])
+AC_CHECK_MEMBERS([struct stat.st_birthtimespec])
+
+AC_CHECK_TYPES([struct timeval], [], [], [@%:@ifdef HAVE_TIME_H
+@%:@include <time.h>
+@%:@endif
+@%:@ifdef HAVE_SYS_TIME_H
+@%:@include <sys/time.h>
+@%:@endif])
+
+if test "${ac_cv_type_struct_timeval}" = yes; then
+ RUBY_CHECK_SIZEOF([struct timeval.tv_sec], [time_t long "long long"], [],
+ [@%:@ifdef HAVE_TIME_H
+@%:@include <time.h>
+@%:@endif
+@%:@ifdef HAVE_SYS_TIME_H
+@%:@include <sys/time.h>
+@%:@endif])
+ AS_CASE(${ac_cv_sizeof_struct_timeval_tv_sec},
+ [SIZEOF_INT], [t=int],
+ [SIZEOF_LONG], [t=long],
+ [SIZEOF_LONG_LONG], [t=LONG_LONG],
+ [t=])
+ if test "${t}" != ""; then
+ AC_DEFINE_UNQUOTED(TYPEOF_TIMEVAL_TV_SEC, [$t])
+ fi
+fi
+
+AC_CHECK_TYPES([struct timespec], [], [], [@%:@ifdef HAVE_TIME_H
+@%:@include <time.h>
+@%:@endif
+@%:@ifdef HAVE_SYS_TIME_H
+@%:@include <sys/time.h>
+@%:@endif])
+
+AC_CHECK_TYPES([struct timezone], [], [], [@%:@ifdef HAVE_TIME_H
+@%:@ include <time.h>
+@%:@endif
+@%:@ifdef HAVE_SYS_TIME_H
+@%:@ include <sys/time.h>
+@%:@endif])
+
+AC_CHECK_TYPES([clockid_t], [], [], [@%:@ifdef HAVE_TIME_H
+@%:@ include <time.h>
+@%:@endif
+@%:@ifdef HAVE_SYS_TIME_H
+@%:@ include <sys/time.h>
+@%:@endif])
+
+AC_CACHE_VAL([rb_cv_large_fd_select],
+ [AC_CHECK_TYPE(fd_mask, [rb_cv_large_fd_select=yes], [rb_cv_large_fd_select=no])])
+if test "$rb_cv_large_fd_select" = yes; then
+ AC_DEFINE(HAVE_RB_FD_INIT, 1)
+fi
+
+dnl RUBY_DEFINT TYPENAME, SIZE, [SIGNED-OR-UNSIGNED], [INCLUDES = DEFAULT-INCLUDES]
+AC_DEFUN([RUBY_DEFINT], [dnl
+AC_CACHE_CHECK([for $1], [rb_cv_type_$1],
+[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([AC_INCLUDES_DEFAULT([$4])
+typedef $1 t; int s = sizeof(t) == 42;])],
+ [rb_cv_type_$1=yes],
+ [AS_CASE([m4_bmatch([$2], [^[1-9][0-9]*$], $2, [$ac_cv_sizeof_]AS_TR_SH($2))],
+ ["1"], [ rb_cv_type_$1="m4_if([$3], [], [signed ], [$3 ])char"],
+ ["$ac_cv_sizeof_short"], [ rb_cv_type_$1="m4_if([$3], [], [], [$3 ])short"],
+ ["$ac_cv_sizeof_int"], [ rb_cv_type_$1="m4_if([$3], [], [], [$3 ])int"],
+ ["$ac_cv_sizeof_long"], [ rb_cv_type_$1="m4_if([$3], [], [], [$3 ])long"],
+ ["$ac_cv_sizeof_long_long"], [ rb_cv_type_$1="m4_if([$3], [], [], [$3 ])long long"],
+ ["$ac_cv_sizeof___int64"], [ rb_cv_type_$1="m4_if([$3], [], [], [$3 ])__int64"],
+ [ rb_cv_type_$1=no])])])
+if test "${rb_cv_type_$1}" != no; then
+ AC_DEFINE([HAVE_]AS_TR_CPP($1), 1)
+ if test "${rb_cv_type_$1}" = yes; then
+ m4_bmatch([$2], [^[1-9][0-9]*$], [AC_CHECK_SIZEOF([$1], 0, [AC_INCLUDES_DEFAULT([$4])])],
+ [RUBY_CHECK_SIZEOF([$1], [$2], [], [AC_INCLUDES_DEFAULT([$4])])])
+ else
+ AC_DEFINE_UNQUOTED($1, [$rb_cv_type_$1])
+ AC_DEFINE_UNQUOTED([SIZEOF_]AS_TR_CPP($1), [SIZEOF_]AS_TR_CPP([$rb_cv_type_$1]))
+ fi
+fi
+])
+
+RUBY_DEFINT(int8_t, 1)
+RUBY_DEFINT(uint8_t, 1, unsigned)
+RUBY_DEFINT(int16_t, 2)
+RUBY_DEFINT(uint16_t, 2, unsigned)
+RUBY_DEFINT(int32_t, 4)
+RUBY_DEFINT(uint32_t, 4, unsigned)
+RUBY_DEFINT(int64_t, 8)
+RUBY_DEFINT(uint64_t, 8, unsigned)
+RUBY_DEFINT(intptr_t, void*)
+RUBY_DEFINT(uintptr_t, void*, unsigned)
+RUBY_DEFINT(ssize_t, size_t, [], [@%:@include <sys/types.h>]) dnl may differ from int, so not use AC_TYPE_SSIZE_T.
+
+RUBY_NACL_CHECK_PEPPER_TYPES
+
+AC_CACHE_CHECK(for stack end address, rb_cv_stack_end_address,
+[rb_cv_stack_end_address=no
+ AC_TRY_LINK(
+ [extern void *__libc_stack_end;],
+ [if (!__libc_stack_end) return 1;],
+ [rb_cv_stack_end_address="__libc_stack_end"])
+])
+if test $rb_cv_stack_end_address != no; then
+ AC_DEFINE_UNQUOTED(STACK_END_ADDRESS, $rb_cv_stack_end_address)
+fi
+
+# posix_memalign(memptr, alignment, size) implemented for OpenBSD 4.8 doesn't work if alignment > MALLOC_PAGESIZE.
+# [ruby-core:42158] https://bugs.ruby-lang.org/issues/5901
+# OpenBSD 5.2 fixed the problem. (src/lib/libc/stdlib/malloc.c:1.142)
+# MirOS #10semel has the problem but fixed in the repository. (src/lib/libc/stdlib/malloc.c:1.9)
+AS_CASE(["$target_os"],
+[openbsd*|mirbsd*], [
+ AC_CACHE_CHECK(for heap align log on openbsd, rb_cv_page_size_log,
+ [rb_cv_page_size_log=no
+ for page_log in 12 13; do
+ AC_TRY_RUN([
+#include <math.h>
+#include <unistd.h>
+
+int
+main() {
+ if ((int)log2((double)sysconf(_SC_PAGESIZE)) != $page_log) return 1;
+ return 0;
+}
+ ],
+ rb_cv_page_size_log="$page_log"; break)
+ done])
+ if test $rb_cv_page_size_log != no; then
+ AC_DEFINE_UNQUOTED(HEAP_ALIGN_LOG, $rb_cv_page_size_log)
+ else
+ AC_DEFINE_UNQUOTED(HEAP_ALIGN_LOG, 12)
+ fi
+])
+
+dnl Checks for library functions.
+AC_TYPE_GETGROUPS
+AC_TYPE_SIGNAL
+AS_CASE(["${target_cpu}-${target_os}:${target_archs}"],
+[powerpc-darwin*], [
+ AC_LIBSOURCES(alloca.c)
+ AC_SUBST([ALLOCA], [\${LIBOBJDIR}alloca.${ac_objext}])
+ AC_DEFINE(C_ALLOCA)
+ AC_DEFINE_UNQUOTED(alloca, alloca)
+ ],
+[universal-darwin*:*ppc*], [
+ AC_LIBSOURCES(alloca.c)
+ AC_SUBST([ALLOCA], [\${LIBOBJDIR}alloca.${ac_objext}])
+ RUBY_DEFINE_IF([defined __powerpc__], C_ALLOCA, 1)
+ RUBY_DEFINE_IF([defined __powerpc__], alloca, alloca)
+ ],
+[
+ AC_FUNC_ALLOCA
+ ])
+if test "x$ALLOCA" = "x"; then
+ AC_CACHE_CHECK([for dynamic size alloca], rb_cv_dynamic_alloca, [
+ for chk in ok __chkstk; do
+ AC_TRY_LINK([
+ @%:@ifdef HAVE_ALLOCA_H
+ @%:@include <alloca.h>
+ @%:@endif
+ void $chk() {}
+ int dynamic_alloca_test;
+ int dynamic_alloca_result;],
+ [dynamic_alloca_result = alloca(dynamic_alloca_test) != 0;],
+ [rb_cv_dynamic_alloca=$chk; break])
+ done])
+ if test "x$rb_cv_dynamic_alloca" = "x__chkstk"; then
+ AC_DEFINE_UNQUOTED(RUBY_ALLOCA_CHKSTK, _$rb_cv_dynamic_alloca)
+ AS_CASE("$target_cpu",
+ [x64|x86_64], [
+ AC_SUBST([ALLOCA], [\${LIBOBJDIR}x86_64-chkstk.${ac_objext}])
+ ],)
+ fi
+fi
+AC_FUNC_MEMCMP
+
+# http://sources.redhat.com/ml/libc-hacker/2005-08/msg00008.html
+# Debian GNU/Linux Etch's libc6.1 2.3.6.ds1-13etch5 has this problem.
+# Debian GNU/Linux Lenny's libc6.1 2.7-10 has no problem.
+AC_CACHE_CHECK(for broken erfc of glibc-2.3.6 on IA64, rb_cv_broken_glibc_ia64_erfc,
+ [AC_TRY_RUN([
+#include <math.h>
+int
+main()
+{
+ erfc(10000.0);
+ return 0;
+}
+],
+ rb_cv_broken_glibc_ia64_erfc=no,
+ rb_cv_broken_glibc_ia64_erfc=yes,
+ rb_cv_broken_glibc_ia64_erfc=no)])
+AS_CASE([$rb_cv_broken_glibc_ia64_erfc],[yes],[ac_cv_func_erf=no])
+
+AS_CASE(["$target_os"],[freebsd*],[
+ AC_DEFINE(BROKEN_CLOSE)
+ AC_REPLACE_FUNCS(close)
+ ])
+
+AC_REPLACE_FUNCS(acosh)
+AC_REPLACE_FUNCS(cbrt)
+AC_REPLACE_FUNCS(crypt)
+AC_REPLACE_FUNCS(dup2)
+AC_REPLACE_FUNCS(erf)
+AC_REPLACE_FUNCS(explicit_bzero)
+AC_REPLACE_FUNCS(ffs)
+AC_REPLACE_FUNCS(finite)
+AC_REPLACE_FUNCS(flock)
+AC_REPLACE_FUNCS(hypot)
+AC_REPLACE_FUNCS(isinf)
+AC_REPLACE_FUNCS(isnan)
+AC_REPLACE_FUNCS(lgamma_r)
+AC_REPLACE_FUNCS(memmove)
+AC_REPLACE_FUNCS(nextafter)
+AC_REPLACE_FUNCS(setproctitle)
+AC_REPLACE_FUNCS(strchr)
+AC_REPLACE_FUNCS(strerror)
+AC_REPLACE_FUNCS(strlcat)
+AC_REPLACE_FUNCS(strlcpy)
+AC_REPLACE_FUNCS(strstr)
+AC_REPLACE_FUNCS(tgamma)
+
+# for missing/setproctitle.c
+AS_CASE(["$target_os"],
+[aix* | k*bsd*-gnu | kopensolaris*-gnu | linux* | darwin*], [AC_DEFINE(SPT_TYPE,SPT_REUSEARGV)],
+[hpux*], [AC_DEFINE(SPT_TYPE,SPT_PSTAT) ],
+[])
+AC_CHECK_HEADERS(sys/pstat.h)
+
+
+AC_CACHE_CHECK(for signbit, rb_cv_have_signbit,
+ [AC_TRY_LINK([
+#include <math.h>
+], [int v = signbit(-0.0);],
+ rb_cv_have_signbit=yes,
+ rb_cv_have_signbit=no)])
+if test "$rb_cv_have_signbit" = yes; then
+ AC_DEFINE(HAVE_SIGNBIT)
+else
+ AC_LIBOBJ([signbit])
+fi
+
+AC_CACHE_CHECK(for broken memmem, rb_cv_broken_memmem, [
+ AC_TRY_RUN([
+@%:@include <string.h>
+
+int
+main(int argc, char **argv)
+{
+ const char *str = "hogefugafoobar";
+ const char *rs = "foo";
+ const char *empty = "";
+ char *p;
+
+ p = memmem(str, strlen(str), rs, strlen(rs));
+ if (p == str+8) {
+ p = memmem(str, strlen(str), empty, strlen(empty));
+ if (p == str)
+ return 0;
+ }
+ return 1;
+}
+ ],
+ rb_cv_broken_memmem=no,
+ rb_cv_broken_memmem=yes,
+ rb_cv_broken_memmem=yes)
+])
+test x"$rb_cv_broken_memmem" = xyes && ac_cv_func_memmem=no
+
+AC_FUNC_FORK
+
+AC_CHECK_FUNCS(__syscall)
+AC_CHECK_FUNCS(_longjmp) # used for AC_ARG_WITH(setjmp-type)
+# we don't use _setjmp if _longjmp doesn't exist.
+test x$ac_cv_func__longjmp = xno && ac_cv_func__setjmp=no
+AC_CHECK_FUNCS(_setjmp) # used for AC_ARG_WITH(setjmp-type)
+AC_CHECK_FUNCS(_setjmpex) # used for AC_ARG_WITH(setjmp-type)
+AC_CHECK_FUNCS(atan2l atan2f)
+AC_CHECK_FUNCS(chroot)
+AC_CHECK_FUNCS(chsize)
+AC_CHECK_FUNCS(clock_gettime)
+AC_CHECK_FUNCS(cosh)
+AC_CHECK_FUNCS(daemon)
+AC_CHECK_FUNCS(dirfd)
+AC_CHECK_FUNCS(dl_iterate_phdr)
+AC_CHECK_FUNCS(dlopen)
+AC_CHECK_FUNCS(dladdr)
+AC_CHECK_FUNCS(dup)
+AC_CHECK_FUNCS(dup3)
+AC_CHECK_FUNCS(eaccess)
+AC_CHECK_FUNCS(endgrent)
+AC_CHECK_FUNCS(fchmod)
+AC_CHECK_FUNCS(fchown)
+AC_CHECK_FUNCS(fcntl)
+AC_CHECK_FUNCS(fdatasync)
+AC_CHECK_FUNCS(fgetattrlist)
+AC_CHECK_FUNCS(fmod)
+AC_CHECK_FUNCS(fsync)
+AC_CHECK_FUNCS(ftruncate)
+AC_CHECK_FUNCS(ftruncate64) # used for Win32 platform
+AC_CHECK_FUNCS(getattrlist)
+AC_CHECK_FUNCS(getcwd)
+AC_CHECK_FUNCS(getgidx)
+AC_CHECK_FUNCS(getgrnam)
+AC_CHECK_FUNCS(getgrnam_r)
+AC_CHECK_FUNCS(getgroups)
+AC_CHECK_FUNCS(getpgid)
+AC_CHECK_FUNCS(getpgrp)
+AC_CHECK_FUNCS(getpriority)
+AC_CHECK_FUNCS(getpwnam_r)
+AC_CHECK_FUNCS(getresgid)
+AC_CHECK_FUNCS(getresuid)
+AC_CHECK_FUNCS(getrlimit)
+AC_CHECK_FUNCS(getsid)
+AC_CHECK_FUNCS(gettimeofday) # for making ac_cv_func_gettimeofday
+AC_CHECK_FUNCS(getuidx)
+AC_CHECK_FUNCS(gmtime_r)
+AC_CHECK_FUNCS(initgroups)
+AC_CHECK_FUNCS(ioctl)
+AC_CHECK_FUNCS(isfinite)
+AC_CHECK_FUNCS(issetugid)
+AC_CHECK_FUNCS(killpg)
+AC_CHECK_FUNCS(lchmod)
+AC_CHECK_FUNCS(lchown)
+AC_CHECK_FUNCS(link)
+AC_CHECK_FUNCS(llabs)
+AC_CHECK_FUNCS(lockf)
+AC_CHECK_FUNCS(log2)
+AC_CHECK_FUNCS(lstat)
+AC_CHECK_FUNCS(malloc_usable_size)
+AC_CHECK_FUNCS(malloc_size)
+AC_CHECK_FUNCS(mblen)
+AC_CHECK_FUNCS(memalign)
+AC_CHECK_FUNCS(memset_s)
+AC_CHECK_FUNCS(writev)
+AC_CHECK_FUNCS(memrchr)
+AC_CHECK_FUNCS(memmem)
+AC_CHECK_FUNCS(mkfifo)
+AC_CHECK_FUNCS(mknod)
+AC_CHECK_FUNCS(mktime)
+AC_CHECK_FUNCS(pipe2)
+AC_CHECK_FUNCS(poll)
+AC_CHECK_FUNCS(posix_fadvise)
+AC_CHECK_FUNCS(posix_memalign)
+AC_CHECK_FUNCS(ppoll)
+AC_CHECK_FUNCS(pread)
+AC_CHECK_FUNCS(qsort_r)
+AC_CHECK_FUNCS(readlink)
+AC_CHECK_FUNCS(round)
+AC_CHECK_FUNCS(sched_getaffinity)
+AC_CHECK_FUNCS(seekdir)
+AC_CHECK_FUNCS(select_large_fdset)
+AC_CHECK_FUNCS(sendfile)
+AC_CHECK_FUNCS(setegid)
+AC_CHECK_FUNCS(setenv)
+AC_CHECK_FUNCS(seteuid)
+AC_CHECK_FUNCS(setgid)
+AC_CHECK_FUNCS(setgroups)
+AC_CHECK_FUNCS(setpgid)
+AC_CHECK_FUNCS(setpgrp)
+AC_CHECK_FUNCS(setregid)
+AC_CHECK_FUNCS(setresgid)
+AC_CHECK_FUNCS(setresuid)
+AC_CHECK_FUNCS(setreuid)
+AC_CHECK_FUNCS(setrgid)
+AC_CHECK_FUNCS(setrlimit)
+AC_CHECK_FUNCS(setruid)
+AC_CHECK_FUNCS(setsid)
+AC_CHECK_FUNCS(setuid)
+AC_CHECK_FUNCS(shutdown)
+AC_CHECK_FUNCS(sigaction)
+AC_CHECK_FUNCS(sigaltstack)
+AC_CHECK_FUNCS(sigprocmask)
+AC_CHECK_FUNCS(sinh)
+AC_CHECK_FUNCS(spawnv)
+AC_CHECK_FUNCS(symlink)
+AC_CHECK_FUNCS(syscall)
+AC_CHECK_FUNCS(sysconf)
+AC_CHECK_FUNCS(tanh)
+AC_CHECK_FUNCS(telldir)
+AC_CHECK_FUNCS(timegm)
+AC_CHECK_FUNCS(times)
+AC_CHECK_FUNCS(truncate)
+AC_CHECK_FUNCS(truncate64) # used for Win32
+AC_CHECK_FUNCS(unsetenv)
+AC_CHECK_FUNCS(utimensat)
+AC_CHECK_FUNCS(utimes)
+AC_CHECK_FUNCS(wait4)
+AC_CHECK_FUNCS(waitpid)
+
+AS_IF([test "$ac_cv_func_memset_s" = yes],
+ [RUBY_DEFINE_IF([!defined __STDC_WANT_LIB_EXT1__], [__STDC_WANT_LIB_EXT1__], 1)])
+
+AS_IF([test "$ac_cv_func_getcwd" = yes], [
+ AC_CACHE_CHECK(if getcwd allocates buffer if NULL is given, [rb_cv_getcwd_malloc],
+ [AC_TRY_RUN([
+@%:@include <stddef.h>
+@%:@include <stdio.h>
+@%:@ifdef HAVE_UNISTD_H
+@%:@include <unistd.h>
+@%:@endif
+@%:@ifndef EXIT_SUCCESS
+@%:@define EXIT_SUCCESS 0
+@%:@endif
+@%:@ifndef EXIT_FAILURE
+@%:@define EXIT_FAILURE 1
+@%:@endif
+
+int
+main(int argc, char **argv)
+{
+ if (!getcwd(NULL, 0)) return EXIT_FAILURE;
+ return EXIT_SUCCESS;
+}
+],
+ rb_cv_getcwd_malloc=yes,
+ rb_cv_getcwd_malloc=no,
+ AS_CASE($target_os,
+ [linux*|darwin*|*bsd|cygwin*|mingw*|mswin*],
+ [rb_cv_getcwd_malloc=yes],
+ [rb_cv_getcwd_malloc=no]))])
+ AS_IF([test "$rb_cv_getcwd_malloc" = no], [AC_DEFINE(NO_GETCWD_MALLOC, 1)])
+])
+
+AC_DEFUN([RUBY_CHECK_BUILTIN_FUNC], [dnl
+AC_CACHE_CHECK([for $1], AS_TR_SH(rb_cv_builtin_$1),
+ [AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM([int foo;], [$2;])],
+ [AS_TR_SH(rb_cv_builtin_$1)=yes],
+ [AS_TR_SH(rb_cv_builtin_$1)=no])])
+if test "${AS_TR_SH(rb_cv_builtin_$1)}" != no; then
+ AC_DEFINE(AS_TR_CPP(HAVE_BUILTIN_$1))
+fi])
+RUBY_CHECK_BUILTIN_FUNC(__builtin_bswap16, [__builtin_bswap16(0)])
+RUBY_CHECK_BUILTIN_FUNC(__builtin_bswap32, [__builtin_bswap32(0)])
+RUBY_CHECK_BUILTIN_FUNC(__builtin_bswap64, [__builtin_bswap64(0)])
+RUBY_CHECK_BUILTIN_FUNC(__builtin_clz, [__builtin_clz(0)])
+RUBY_CHECK_BUILTIN_FUNC(__builtin_clzl, [__builtin_clzl(0)])
+RUBY_CHECK_BUILTIN_FUNC(__builtin_clzll, [__builtin_clzll(0)])
+RUBY_CHECK_BUILTIN_FUNC(__builtin_choose_expr, [
+ [int x[__extension__(__builtin_choose_expr(1, 1, -1))]];
+ [int y[__extension__(__builtin_choose_expr(0, -1, 1))]];
+ ])
+if test x$rb_cv_builtin___builtin_choose_expr = xyes; then
+ RUBY_CHECK_BUILTIN_FUNC(__builtin_choose_expr_constant_p, [
+ [int x[__extension__(__builtin_choose_expr(__builtin_constant_p(1), 1, -1))]];
+ [int y[__extension__(__builtin_choose_expr(__builtin_constant_p(foo), -1, 1))]];
+ ])
+fi
+RUBY_CHECK_BUILTIN_FUNC(__builtin_types_compatible_p, [__builtin_types_compatible_p(int, int)])
+
+if test "$ac_cv_func_qsort_r" != no; then
+ AC_CACHE_CHECK(whether qsort_r is GNU version, rb_cv_gnu_qsort_r,
+ [AC_TRY_COMPILE([
+@%:@include <stdlib.h>
+void qsort_r(void *base, size_t nmemb, size_t size,
+ int (*compar)(const void *, const void *, void *),
+ void *arg);
+],[ ],
+ [rb_cv_gnu_qsort_r=yes],
+ [rb_cv_gnu_qsort_r=no])
+ ])
+ AC_CACHE_CHECK(whether qsort_r is BSD version, rb_cv_bsd_qsort_r,
+ [AC_TRY_COMPILE([
+@%:@include <stdlib.h>
+void qsort_r(void *base, size_t nmemb, size_t size,
+ void *arg, int (*compar)(void *, const void *, const void *));
+],[ ],
+ [rb_cv_bsd_qsort_r=yes],
+ [rb_cv_bsd_qsort_r=no])
+ ])
+ AS_CASE("$rb_cv_gnu_qsort_r:$rb_cv_bsd_qsort_r",
+ [yes:no], [
+ AC_DEFINE(HAVE_GNU_QSORT_R, 1)
+ ],
+ [no:yes], [
+ AC_DEFINE(HAVE_BSD_QSORT_R, 1)
+ ])
+fi
+
+AC_CACHE_CHECK(whether atan2 handles Inf as C99, rb_cv_atan2_inf_c99, [
+ AS_IF([test $ac_cv_func_atan2f:$ac_cv_func_atan2l = yes:yes], [
+ AC_TRY_RUN([
+@%:@include <math.h>
+@%:@ifdef HAVE_UNISTD_H
+@%:@include <unistd.h>
+@%:@endif
+@%:@ifndef EXIT_SUCCESS
+@%:@define EXIT_SUCCESS 0
+@%:@endif
+@%:@ifndef EXIT_FAILURE
+@%:@define EXIT_FAILURE 1
+@%:@endif
+
+int
+main(int argc, char **argv)
+{
+ if (fabs(atan2(INFINITY, INFINITY) - M_PI_4) <= 0.01) return EXIT_SUCCESS;
+ return EXIT_FAILURE;
+}
+],
+ [rb_cv_atan2_inf_c99=yes],
+ [rb_cv_atan2_inf_c99=no],
+ [AS_CASE($target_os, [mingw*|mswin*], [rb_cv_atan2_inf_c99=no], [rb_cv_atan2_inf_c99=yes])]
+ )
+ ], [rb_cv_atan2_inf_c99=no])
+])
+AS_IF([test "x$rb_cv_atan2_inf_c99" = xyes], [AC_DEFINE(ATAN2_INF_C99)])
+
+# Some platform need -lrt for clock_gettime, but the other don't.
+if test x"$ac_cv_func_clock_gettime" != xyes; then
+ # glibc 2.17 moves clock_* functions from librt to the main C library.
+ # http://sourceware.org/ml/libc-announce/2012/msg00001.html
+ AC_CHECK_LIB(rt, clock_gettime)
+ if test x"$ac_cv_lib_rt_clock_gettime" = xyes; then
+ AC_DEFINE(HAVE_CLOCK_GETTIME, 1)
+ fi
+fi
+AC_CHECK_FUNCS(clock_getres) # clock_getres should be tested after clock_gettime test including librt test.
+
+AC_CACHE_CHECK(for unsetenv returns a value, rb_cv_unsetenv_return_value,
+ [AC_TRY_COMPILE([
+#include <stdlib.h>
+], [int v = unsetenv("foo");],
+ rb_cv_unsetenv_return_value=yes,
+ rb_cv_unsetenv_return_value=no)])
+if test "$rb_cv_unsetenv_return_value" = no; then
+ AC_DEFINE(VOID_UNSETENV)
+fi
+
+# used for AC_ARG_WITH(setjmp-type)
+AC_CACHE_CHECK(for sigsetjmp as a macro or function, ac_cv_func_sigsetjmp,
+ [AC_TRY_COMPILE([
+#include <setjmp.h>
+], [sigjmp_buf env; sigsetjmp(env,1);],
+ ac_cv_func_sigsetjmp=yes,
+ ac_cv_func_sigsetjmp=no)])
+
+AC_DEFUN([RUBY_CHECK_BUILTIN_SETJMP], [
+if test x"${ac_cv_func___builtin_setjmp}" = xyes; then
+ unset ac_cv_func___builtin_setjmp
+fi
+AC_CACHE_CHECK(for __builtin_setjmp, ac_cv_func___builtin_setjmp,
+ [
+ ac_cv_func___builtin_setjmp=no
+ for cast in "" "(void **)"; do
+ RUBY_WERROR_FLAG(
+ [AC_TRY_LINK([@%:@include <setjmp.h>
+ @%:@include <stdio.h>
+ jmp_buf jb;
+ void t(void) {__builtin_longjmp($cast jb, 1);}
+ int jump(void) {(void)(__builtin_setjmp($cast jb) ? 1 : 0); return 0;}],
+ [
+ void (*volatile f)(void) = t;
+ if (!jump()) printf("%d\n", f != 0);
+ ],
+ [ac_cv_func___builtin_setjmp="yes with cast ($cast)"])
+ ])
+ test "$ac_cv_func___builtin_setjmp" = no || break
+ done])
+])
+
+AC_DEFUN([RUBY_SETJMP_TYPE], [
+RUBY_CHECK_BUILTIN_SETJMP
+AC_MSG_CHECKING(for setjmp type)
+setjmp_suffix=
+AC_ARG_WITH(setjmp-type,
+ AS_HELP_STRING([--with-setjmp-type], [select setjmp type]),
+ [
+ AS_CASE([$withval],
+ [__builtin_setjmp], [setjmp=__builtin_setjmp],
+ [_setjmp], [ setjmp_prefix=_],
+ [sigsetjmp], [ setjmp_prefix=sig],
+ [setjmp], [ setjmp_prefix=],
+ [setjmpex], [ setjmp_prefix= setjmp_suffix=ex],
+ [''], [ unset setjmp_prefix],
+ [ AC_MSG_ERROR(invalid setjmp type: $withval)])], [unset setjmp_prefix])
+setjmp_cast=
+if test ${setjmp_prefix+set}; then
+ if test "${setjmp_prefix}" && eval test '$ac_cv_func_'${setjmp_prefix}setjmp${setjmp_suffix} = no; then
+ AC_MSG_ERROR(${setjmp_prefix}setjmp${setjmp_suffix} is not available)
+ fi
+elif { AS_CASE("$ac_cv_func___builtin_setjmp", [yes*], [true], [false]) }; then
+ setjmp_cast=`expr "$ac_cv_func___builtin_setjmp" : "yes with cast (\(.*\))"`
+ setjmp_prefix=__builtin_
+ setjmp_suffix=
+elif test "$ac_cv_header_setjmpex_h:$ac_cv_func__setjmpex" = yes:yes; then
+ setjmp_prefix=
+ setjmp_suffix=ex
+elif test "$ac_cv_func__setjmp" = yes; then
+ setjmp_prefix=_
+ setjmp_suffix=
+elif test "$ac_cv_func_sigsetjmp" = yes; then
+ AS_CASE([$target_os],[solaris*|cygwin*],[setjmp_prefix=],[setjmp_prefix=sig])
+ setjmp_suffix=
+else
+ setjmp_prefix=
+ setjmp_suffix=
+fi
+if test x$setjmp_prefix = xsig; then
+ setjmp_sigmask=yes
+else
+ unset setjmp_sigmask
+fi
+AC_MSG_RESULT(${setjmp_prefix}setjmp${setjmp_suffix}${setjmp_cast:+\($setjmp_cast\)})
+AC_DEFINE_UNQUOTED([RUBY_SETJMP(env)], [${setjmp_prefix}setjmp${setjmp_suffix}($setjmp_cast(env)${setjmp_sigmask+,0})])
+AC_DEFINE_UNQUOTED([RUBY_LONGJMP(env,val)], [${setjmp_prefix}longjmp($setjmp_cast(env),val)])
+AC_DEFINE_UNQUOTED(RUBY_JMP_BUF, ${setjmp_sigmask+${setjmp_prefix}}jmp_buf)
+])
+# End of setjmp check.
+
+AC_ARG_ENABLE(setreuid,
+ AS_HELP_STRING([--enable-setreuid], [use setreuid()/setregid() according to need even if obsolete]),
+ [use_setreuid=$enableval])
+if test "$use_setreuid" = yes; then
+ AC_DEFINE(USE_SETREUID)
+ AC_DEFINE(USE_SETREGID)
+fi
+AC_STRUCT_TIMEZONE
+AC_CACHE_CHECK(for struct tm.tm_gmtoff, rb_cv_member_struct_tm_tm_gmtoff,
+ [AC_TRY_COMPILE([@%:@include <time.h>],
+ [struct tm t; t.tm_gmtoff = 3600;],
+ [rb_cv_member_struct_tm_tm_gmtoff=yes],
+ [rb_cv_member_struct_tm_tm_gmtoff=no])])
+if test "$rb_cv_member_struct_tm_tm_gmtoff" = yes; then
+ AC_DEFINE(HAVE_STRUCT_TM_TM_GMTOFF)
+fi
+AC_CACHE_CHECK(for external int daylight, rb_cv_have_daylight,
+ [AC_TRY_LINK([#include <time.h>
+ int i;],
+ [i = daylight;],
+ rb_cv_have_daylight=yes,
+ rb_cv_have_daylight=no)])
+if test "$rb_cv_have_daylight" = yes; then
+ AC_DEFINE(HAVE_DAYLIGHT)
+fi
+AC_DEFUN([RUBY_CHECK_VARTYPE], [dnl
+AC_CACHE_CHECK([for external $1], AS_TR_SH(rb_cv_var_$1),
+ [AS_TR_SH(rb_cv_var_$1)=no
+ AC_TRY_COMPILE([
+#ifndef _XOPEN_SOURCE
+#define _XOPEN_SOURCE 1
+#endif
+$2
+;
+const volatile void *volatile t;],
+ [t = &(&$1)[0];],
+ [for t in $3; do
+ AC_TRY_COMPILE([
+#ifndef _XOPEN_SOURCE
+#define _XOPEN_SOURCE 1
+#endif
+$2
+;
+extern $t $1;
+const volatile void *volatile t;],
+ [t = &(&$1)[0];],
+ [AS_TR_SH(rb_cv_var_$1)=$t; break])
+ done])])
+if test "${AS_TR_SH(rb_cv_var_$1)}" != no; then
+ AC_DEFINE(AS_TR_CPP(HAVE_VAR_$1))
+ AC_DEFINE_UNQUOTED(AS_TR_CPP(TYPEOF_VAR_$1), ${AS_TR_SH(rb_cv_var_$1)})
+fi])
+RUBY_CHECK_VARTYPE(timezone, [@%:@include <time.h>], [long int])
+RUBY_CHECK_VARTYPE(altzone, [@%:@include <time.h>], [long int])
+AC_CHECK_FUNCS(timezone)
+if test "$ac_cv_func_timezone" = yes; then
+ AC_CACHE_CHECK([whether timezone requires zero arguments], rb_cv_func_timezone_void,
+ [AC_TRY_COMPILE([@%:@include <time.h>],
+ [(void)timezone(0, 0);],
+ [rb_cv_func_timezone_void=no],
+ [rb_cv_func_timezone_void=yes])]
+ )
+ if test $rb_cv_func_timezone_void = yes; then
+ AC_DEFINE(TIMEZONE_VOID)
+ fi
+fi
+
+AC_CACHE_CHECK(for negative time_t for gmtime(3), rb_cv_negative_time_t,
+ [AC_TRY_RUN([
+#include <stdlib.h>
+#include <time.h>
+
+void
+check(tm, y, m, d, h, s)
+ struct tm *tm;
+ int y, m, d, h, s;
+{
+ if (!tm ||
+ tm->tm_year != y ||
+ tm->tm_mon != m-1 ||
+ tm->tm_mday != d ||
+ tm->tm_hour != h ||
+ tm->tm_sec != s) {
+ exit(1);
+ }
+}
+
+int
+main()
+{
+ time_t t = -1;
+ struct tm *tm;
+
+ check(gmtime(&t), 69, 12, 31, 23, 59);
+ t = ~(time_t)0 << 31;
+ check(gmtime(&t), 1, 12, 13, 20, 52);
+ return 0;
+}
+],
+ rb_cv_negative_time_t=yes,
+ rb_cv_negative_time_t=no,
+ rb_cv_negative_time_t=yes)])
+if test "$rb_cv_negative_time_t" = yes; then
+ AC_DEFINE(NEGATIVE_TIME_T)
+fi
+
+# [ruby-dev:40910] overflow of time on FreeBSD
+# http://www.freebsd.org/cgi/query-pr.cgi?pr=145341
+AC_CACHE_CHECK(for localtime(3) overflow correctly, rb_cv_localtime_overflow,
+ [AC_TRY_RUN([
+#include <stdlib.h>
+#include <time.h>
+
+void
+check(time_t t1)
+{
+ struct tm *tm;
+ time_t t2;
+ tm = localtime(&t1);
+ if (!tm)
+ return; /* overflow detected. ok. */
+ t2 = mktime(tm);
+ if (t1 == t2)
+ return; /* round-trip. ok. */
+ exit(1);
+}
+
+int
+main()
+{
+ time_t t;
+ if (~(time_t)0 <= 0) {
+ t = (((time_t)1) << (sizeof(time_t) * 8 - 2));
+ t |= t - 1;
+ }
+ else {
+ t = ~(time_t)0;
+ }
+ check(t);
+ return 0;
+}
+],
+ rb_cv_localtime_overflow=yes,
+ rb_cv_localtime_overflow=no,
+ rb_cv_localtime_overflow=no)])
+if test "$rb_cv_localtime_overflow" = no; then
+ AC_DEFINE(LOCALTIME_OVERFLOW_PROBLEM)
+fi
+
+if test "$ac_cv_func_sigprocmask" = yes && test "$ac_cv_func_sigaction" = yes; then
+ AC_DEFINE(POSIX_SIGNAL)
+else
+ AC_CHECK_FUNCS(sigsetmask)
+ AC_CACHE_CHECK(for BSD signal semantics, rb_cv_bsd_signal,
+ [AC_TRY_RUN([
+#include <stdio.h>
+#include <signal.h>
+
+void
+sig_handler(dummy)
+ int dummy;
+{
+}
+
+int
+main()
+{
+ signal(SIGINT, sig_handler);
+ kill(getpid(), SIGINT);
+ kill(getpid(), SIGINT);
+ return 0;
+}
+],
+ rb_cv_bsd_signal=yes,
+ rb_cv_bsd_signal=no,
+ rb_cv_bsd_signal=$ac_cv_func_sigsetmask)])
+ if test "$rb_cv_bsd_signal" = yes; then
+ AC_DEFINE(BSD_SIGNAL)
+ fi
+fi
+
+if test "$ac_cv_func_getpgid" = no; then
+ # AC_FUNC_GETPGRP fails when cross-compiling with old autoconf.
+ # autoconf is changed between 2.52d and 2.52f?
+ # http://lists.gnu.org/archive/html/bug-gnu-utils/2001-09/msg00181.html
+ # "autoconf cleanup for AC_FUNC_GETPGRP and GETPGRP_VOID"
+AC_FUNC_GETPGRP
+fi
+if test "$ac_cv_func_setpgid:$ac_cv_func_setpgrp" = no:yes; then
+ # AC_FUNC_SETPGRP fails when cross-compiling. (until autoconf 2.69?)
+ # https://lists.gnu.org/archive/html/bug-autoconf/2013-02/msg00002.html
+ # "AC_FUNC_SETPGRP fails to work properly when cross-compiling"
+AC_FUNC_SETPGRP
+fi
+
+if test x"$ac_cv_func_dirfd" = xno; then
+ AS_CASE(["$target_os"],[solaris*],
+ [AC_CHECK_MEMBERS([DIR.d_fd, DIR.dd_fd],,,[
+#include <sys/types.h>
+#include <dirent.h>
+])])
+fi
+
+if test x"$target_cpu" = xia64; then
+ AC_LIBOBJ([ia64])
+ AC_CACHE_CHECK(for __libc_ia64_register_backing_store_base,
+ rb_cv___libc_ia64_register_backing_store_base,
+ [rb_cv___libc_ia64_register_backing_store_base=no
+ AC_TRY_LINK(
+ [extern unsigned long __libc_ia64_register_backing_store_base;],
+ [unsigned long p = __libc_ia64_register_backing_store_base;
+ printf("%ld\n", p);],
+ [rb_cv___libc_ia64_register_backing_store_base=yes])])
+ if test $rb_cv___libc_ia64_register_backing_store_base = yes; then
+ AC_DEFINE(HAVE___LIBC_IA64_REGISTER_BACKING_STORE_BASE)
+ fi
+fi
+
+AC_CACHE_CHECK(whether right shift preserve sign bit, rb_cv_rshift_sign,
+ [AC_COMPILE_IFELSE([AC_LANG_BOOL_COMPILE_TRY([], [(-1==(-1>>1))])],
+ rb_cv_rshift_sign=yes,
+ rb_cv_rshift_sign=no)])
+if test "$rb_cv_rshift_sign" = yes; then
+ AC_DEFINE(RSHIFT(x,y), ((x)>>(int)(y)))
+else
+ AC_DEFINE(RSHIFT(x,y), (((x)<0) ? ~((~(x))>>(int)(y)) : (x)>>(int)(y)))
+fi
+
+if test x"$ac_cv_func_gettimeofday" != xyes; then
+ AC_MSG_ERROR(gettimeofday() must exist)
+fi
+
+if test "$ac_cv_func_sysconf" = yes; then
+ AC_DEFUN([RUBY_CHECK_SYSCONF], [dnl
+ AC_CACHE_CHECK([whether _SC_$1 is supported], rb_cv_have_sc_[]m4_tolower($1),
+ [AC_TRY_COMPILE([#include <unistd.h>
+ ],
+ [_SC_$1 >= 0],
+ rb_cv_have_sc_[]m4_tolower($1)=yes,
+ rb_cv_have_sc_[]m4_tolower($1)=no)
+ ])
+ if test "$rb_cv_have_sc_[]m4_tolower($1)" = yes; then
+ AC_DEFINE(HAVE__SC_$1)
+ fi
+ ])
+ RUBY_CHECK_SYSCONF(CLK_TCK)
+fi
+
+AC_DEFUN([RUBY_STACK_GROW_DIRECTION], [
+ AS_VAR_PUSHDEF([stack_grow_dir], [rb_cv_stack_grow_dir_$1])
+ AC_CACHE_CHECK(stack growing direction on $1, stack_grow_dir, [
+AS_CASE(["$1"],
+[m68*|x86*|x64|i?86|ia64|ppc*|sparc*|alpha*], [ $2=-1],
+[hppa*], [ $2=+1],
+[
+ AC_TRY_RUN([
+/* recurse to get rid of inlining */
+static int
+stack_growup_p(addr, n)
+ volatile int *addr, n;
+{
+ volatile int end;
+ if (n > 0)
+ return *addr = stack_growup_p(addr, n - 1);
+ else
+ return (&end > addr);
+}
+int main()
+{
+ int x;
+ return stack_growup_p(&x, 10);
+}
+], $2=-1, $2=+1, $2=0)
+ ])
+eval stack_grow_dir=\$$2])
+eval $2=\$stack_grow_dir
+AS_VAR_POPDEF([stack_grow_dir])])
+if test "${universal_binary-no}" = yes ; then
+ archflagpat=`eval echo '"'"${ARCH_FLAG}"'"' | sed 's/[[][|.*]]/\\&/g'`
+ save_CFLAGS="$CFLAGS" new_cflags=`echo "$CFLAGS" | sed "s|$archflagpat"'||'`
+ save_LDFLAGS="$LDFLAGS" new_ldflags=`echo "$LDFLAGS" | sed "s|$archflagpat"'||'`
+ stack_dir=
+ for archs in ${universal_archnames}; do
+ archs=`echo $archs | sed 's/=.*//'`
+ CFLAGS="$new_cflags -arch $archs"
+ LDFLAGS="$new_ldflags -arch $archs"
+ RUBY_STACK_GROW_DIRECTION($archs, dir)
+ if test x$stack_dir = x; then
+ stack_dir=$dir
+ elif test x$stack_dir != x$dir; then
+ stack_dir=no
+ fi
+ done
+ CFLAGS="$save_CFLAGS" LDFLAGS="$save_LDFLAGS"
+ if test x$stack_dir = xno; then
+ for archs in ${universal_archnames}; do
+ archs=`echo $archs | sed 's/=.*//'`
+ eval dir=\$[rb_cv_stack_grow_dir_]AS_TR_SH([$archs])
+ RUBY_DEFINE_IF([defined __${archs}__], STACK_GROW_DIRECTION, $dir)
+ done
+ else
+ AC_DEFINE_UNQUOTED(STACK_GROW_DIRECTION, $stack_dir)
+ fi
+else
+ RUBY_STACK_GROW_DIRECTION($target_cpu, dir)
+ AC_DEFINE_UNQUOTED(STACK_GROW_DIRECTION, $dir)
+fi
+
+if test x"$enable_pthread" = xyes; then
+ for pthread_lib in thr pthread pthreads c c_r root; do
+ AC_CHECK_LIB($pthread_lib, pthread_kill,
+ rb_with_pthread=yes, rb_with_pthread=no)
+ if test "$rb_with_pthread" = "yes"; then break; fi
+ done
+ if test x"$rb_with_pthread" = xyes; then
+ AC_DEFINE(_REENTRANT)
+ AC_DEFINE(_THREAD_SAFE)
+ AC_DEFINE(HAVE_LIBPTHREAD)
+ AC_CHECK_HEADERS(pthread_np.h, [], [], [@%:@include <pthread.h>])
+ AS_CASE([$pthread_lib],
+ [c], [],
+ [root], [],
+ [c_r], [MAINLIBS="-pthread $MAINLIBS"],
+ [AS_CASE(["$target_os"],
+ [openbsd*|mirbsd*], [LIBS="-pthread $LIBS"],
+ [LIBS="-l$pthread_lib $LIBS"])])
+ else
+ AC_MSG_WARN("Don't know how to find pthread library on your system -- thread support disabled")
+ fi
+ AC_CACHE_CHECK([whether pthread_t is scalar type], [rb_cv_scalar_pthread_t], [
+ AC_TRY_COMPILE([
+ @%:@include <pthread.h>
+ ], [
+ pthread_t thread_id;
+ thread_id = 0;
+ if (!thread_id) return 0;
+ ], [rb_cv_scalar_pthread_t=yes], [rb_cv_scalar_pthread_t=no])
+ ])
+ if test x"$rb_cv_scalar_pthread_t" = xyes; then
+ : # RUBY_CHECK_SIZEOF(pthread_t, [void* int long], [], [@%:@include <pthread.h>])
+ else
+ AC_DEFINE(NON_SCALAR_THREAD_ID)
+ fi
+ AC_CHECK_FUNCS(sched_yield pthread_attr_setinheritsched \
+ pthread_attr_get_np pthread_attr_getstack\
+ pthread_get_stackaddr_np pthread_get_stacksize_np \
+ thr_stksegment pthread_stackseg_np pthread_getthrds_np \
+ pthread_cond_init pthread_condattr_setclock pthread_condattr_init \
+ pthread_sigmask pthread_setname_np pthread_set_name_np)
+ AS_CASE(["$target_os"],[aix*],[ac_cv_func_pthread_getattr_np=no],[AC_CHECK_FUNCS(pthread_getattr_np)])
+ if test "${host_os}" = "nacl"; then
+ ac_cv_func_pthread_attr_init=no
+ else
+ AC_CHECK_FUNCS(pthread_attr_init)
+ fi
+ set_current_thread_name=
+ if test "$ac_cv_func_pthread_setname_np" = yes; then
+ AC_CACHE_CHECK([arguments of pthread_setname_np], [rb_cv_func_pthread_setname_np_arguments],
+ [rb_cv_func_pthread_setname_np_arguments=
+ # Linux,AIX, (pthread_self(), name)
+ # NetBSD (pthread_self(), name, \"%s\")
+ # Darwin (name)
+ for mac in \
+ "(pthread_self(), name)" \
+ "(pthread_self(), name, \"%s\")" \
+ "(name)" \
+ ; do
+ AC_TRY_COMPILE([
+ @%:@include <pthread.h>
+ @%:@ifdef HAVE_PTHREAD_NP_H
+ @%:@include <pthread_np.h>
+ @%:@endif
+ @%:@define SET_THREAD_NAME(name) pthread_setname_np${mac}
+ ],
+ [if (SET_THREAD_NAME("conftest")) return 1;],
+ [rb_cv_func_pthread_setname_np_arguments="${mac}"
+ break])
+ done
+ ]
+ )
+ if test -n "${rb_cv_func_pthread_setname_np_arguments}"; then
+ set_current_thread_name="pthread_setname_np${rb_cv_func_pthread_setname_np_arguments}"
+ fi
+ elif test "$ac_cv_func_pthread_set_name_np" = yes; then
+ set_current_thread_name="pthread_set_name_np(pthread_self(), name)"
+ fi
+ AS_IF([test -n "$set_current_thread_name"], [
+ AC_DEFINE_UNQUOTED(SET_CURRENT_THREAD_NAME(name), $set_current_thread_name)
+ AS_CASE([$set_current_thread_name],
+ [*'pthread_self()'*], [
+ set_another_thread_name=`echo "$set_current_thread_name" | sed 's/pthread_self()/thid/'`
+ AC_DEFINE_UNQUOTED(SET_ANOTHER_THREAD_NAME(thid,name), $set_another_thread_name)
+ ])
+ ])
+fi
+
+if test x"$ac_cv_header_ucontext_h" = xno; then
+ AC_CACHE_CHECK([if signal.h defines ucontext_t], [rb_cv_ucontext_in_signal_h],
+ [AC_TRY_COMPILE([@%:@include <signal.h>],
+ [size_t size = sizeof(ucontext_t);],
+ [rb_cv_ucontext_in_signal_h=yes], [rb_cv_ucontext_in_signal_h=no])])
+ if test x"$rb_cv_ucontext_in_signal_h" = xyes; then
+ AC_DEFINE_UNQUOTED(UCONTEXT_IN_SIGNAL_H, 1)
+ fi
+fi
+if test x"$ac_cv_header_ucontext_h" = xyes -o x"$rb_cv_ucontext_in_signal_h" = xyes; then
+ AC_CACHE_CHECK([if mcontext_t is a pointer], [rb_cv_mcontext_t_ptr],
+ [AC_TRY_COMPILE([
+ @%:@include <signal.h>
+ @%:@ifdef HAVE_UCONTEXT_H
+ @%:@include <ucontext.h>
+ @%:@endif
+ mcontext_t test(mcontext_t mc) {return mc+1;}
+ ],
+ [test(0);],
+ [rb_cv_mcontext_t_ptr=yes], [rb_cv_mcontext_t_ptr=no])])
+ if test x"$rb_cv_mcontext_t_ptr" = xyes; then
+ AC_DEFINE_UNQUOTED(DEFINE_MCONTEXT_PTR(mc, uc), mcontext_t mc = (uc)->uc_mcontext)
+ else
+ AC_DEFINE_UNQUOTED(DEFINE_MCONTEXT_PTR(mc, uc), mcontext_t *mc = &(uc)->uc_mcontext)
+ fi
+ if test x"$rb_with_pthread" = xyes; then
+ AC_CHECK_FUNCS(getcontext setcontext)
+ fi
+fi
+
+if test "$ac_cv_func_fork_works" = "yes" -a "$rb_with_pthread" = "yes"; then
+ AC_CACHE_CHECK([if fork works with pthread], rb_cv_fork_with_pthread,
+ [AC_TRY_RUN([
+#include <stdlib.h>
+#include <unistd.h>
+#include <pthread.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <signal.h>
+#ifndef EXIT_SUCCESS
+#define EXIT_SUCCESS 0
+#endif
+#ifndef EXIT_FAILURE
+#define EXIT_FAILURE 1
+#endif
+
+void *
+thread_func(void *dmy)
+{
+ return dmy;
+}
+
+int
+use_threads(void)
+{
+ pthread_t tid;
+ if (pthread_create(&tid, 0, thread_func, 0) != 0) {
+ return -1;
+ }
+ if (pthread_join(tid, 0) != 0) {
+ return -1;
+ }
+ return 0;
+}
+
+int
+main(int argc, char *argv[])
+{
+ pid_t pid;
+ if (use_threads()) return EXIT_FAILURE;
+ pid = fork();
+
+ if (pid) {
+ int loc;
+ sleep(1);
+ if (waitpid(pid, &loc, WNOHANG) == 0) {
+ kill(pid, SIGKILL);
+ return EXIT_FAILURE;
+ }
+ if (!WIFEXITED(loc) || WEXITSTATUS(loc) != EXIT_SUCCESS)
+ return EXIT_FAILURE;
+ }
+ else {
+ if (use_threads()) return EXIT_FAILURE;
+ }
+
+ return EXIT_SUCCESS;
+}],
+ rb_cv_fork_with_pthread=yes,
+ rb_cv_fork_with_pthread=no,
+ rb_cv_fork_with_pthread=yes)])
+ test x$rb_cv_fork_with_pthread = xyes || AC_DEFINE(CANNOT_FORK_WITH_PTHREAD)
+fi
+
+
+}
+{ # runtime section
+
+dnl wheather use dln_a_out or not
+AC_ARG_WITH(dln-a-out,
+ AS_HELP_STRING([--with-dln-a-out], [use dln_a_out if possible]),
+ [
+ AS_CASE([$withval],
+ [yes], [
+ if test "$enable_shared" = yes; then
+ AC_MSG_ERROR(dln_a_out can not make shared library)
+ fi
+ with_dln_a_out=yes],
+ [
+ with_dln_a_out=no])], [with_dln_a_out=no])
+
+AC_CACHE_CHECK(whether ELF binaries are produced, rb_cv_binary_elf,
+[AC_TRY_LINK([],[], [
+AS_CASE(["`head -1 conftest$EXEEXT | tr -dc '\177ELF' | tr '\177' .`"],
+[.ELF*], [rb_cv_binary_elf=yes], [rb_cv_binary_elf=no])],
+rb_cv_binary_elf=no)])
+
+if test "$rb_cv_binary_elf" = yes; then
+ AC_DEFINE(USE_ELF)
+ if test "$with_dln_a_out" = yes; then
+ AC_MSG_ERROR(dln_a_out does not work with ELF)
+ fi
+ AC_CHECK_HEADERS([elf.h elf_abi.h])
+ if test $ac_cv_header_elf_h = yes -o $ac_cv_header_elf_abi_h = yes; then
+ AC_LIBOBJ([addr2line])
+ fi
+fi
+
+AS_CASE(["$target_os"],
+[linux* | gnu* | k*bsd*-gnu | bsdi* | kopensolaris*-gnu | nacl], [
+ if test "$rb_cv_binary_elf" = no; then
+ with_dln_a_out=yes
+ else
+ LDFLAGS="$LDFLAGS -rdynamic"
+ fi])
+LIBEXT=a
+
+AC_SUBST(DLDFLAGS)dnl
+AC_SUBST(ARCH_FLAG)dnl
+
+AC_SUBST(STATIC)dnl
+AC_SUBST(CCDLFLAGS)dnl
+AC_SUBST(LDSHARED)dnl
+AC_SUBST(LDSHAREDXX)dnl
+AC_SUBST(DLEXT)dnl
+AC_SUBST(DLEXT2)dnl
+AC_SUBST(LIBEXT)dnl
+AC_SUBST(ASMEXT, S)dnl
+
+STATIC=
+: ${PATHFLAG=''}
+
+if test "$with_dln_a_out" != yes; then
+ rb_cv_dlopen=unknown
+ AC_MSG_CHECKING(whether OS depend dynamic link works)
+ if test "$GCC" = yes; then
+ AS_CASE(["$target_os"],
+ [darwin*], [
+ # The -fno-common is needed if we wish to embed the Ruby interpreter
+ # into a plugin module of some project (as opposed to embedding it
+ # within the project's application). The -I/usr/local/include is
+ # needed because CPP as discovered by configure (cc -E -traditional)
+ # fails to consult /usr/local/include by default. This causes
+ # mkmf.rb's have_header() to fail if the desired resource happens to be
+ # installed in the /usr/local tree.
+ RUBY_APPEND_OPTION(CCDLFLAGS, -fno-common)],
+ [bsdi*|cygwin*|mingw*|aix*|interix*], [ ],
+ [
+ RUBY_APPEND_OPTION(CCDLFLAGS, -fPIC)])
+ else
+ AS_CASE(["$target_os"],
+ [hpux*], [CCDLFLAGS="$CCDLFLAGS +Z"],
+ [solaris*|irix*], [CCDLFLAGS="$CCDLFLAGS -KPIC"],
+ [sunos*], [CCDLFLAGS="$CCDLFLAGS -PIC"],
+ [esix*|uxpds*], [CCDLFLAGS="$CCDLFLAGS -KPIC"],
+ [: ${CCDLFLAGS=""}])
+ fi
+
+
+ AC_ARG_ENABLE(rpath,
+ AS_HELP_STRING([--enable-rpath], [embed run path into extension libraries.
+ enabled by default on ELF platforms]),
+ [enable_rpath=$enableval], [enable_rpath="$rb_cv_binary_elf"])
+
+ AS_CASE(["$target_os"],
+ [hpux*], [ DLDFLAGS="$DLDFLAGS -E"
+ : ${LDSHARED='$(LD) -b'}
+ XLDFLAGS="$XLDFLAGS -Wl,-E"
+ : ${LIBPATHENV=SHLIB_PATH}
+ if test "$rb_cv_prog_gnu_ld" = no; then
+ RPATHFLAG=' +b %1$-s'
+ fi
+ rb_cv_dlopen=yes],
+ [solaris*], [ if test "$GCC" = yes; then
+ : ${LDSHARED='$(CC) -shared'}
+ if test "$rb_cv_prog_gnu_ld" = yes; then
+ LDFLAGS="$LDFLAGS -Wl,-E"
+ fi
+ else
+ : ${LDSHARED='$(CC) -G'}
+ fi
+ if test "$ac_cv_sizeof_voidp" = 8; then
+ : ${LIBPATHENV=LD_LIBRARY_PATH_64}
+ : ${PRELOADENV=LD_PRELOAD_64}
+ else
+ : ${LIBPATHENV=LD_LIBRARY_PATH_32}
+ : ${PRELOADENV=LD_PRELOAD_32}
+ fi
+ rb_cv_dlopen=yes],
+ [sunos*], [ : ${LDSHARED='$(LD) -assert nodefinitions'}
+ rb_cv_dlopen=yes],
+ [irix*], [ : ${LDSHARED='$(LD) -shared'}
+ rb_cv_dlopen=yes],
+ [sysv4*], [ : ${LDSHARED='$(LD) -G'}
+ rb_cv_dlopen=yes],
+ [nto-qnx*], [ : ${LDSHARED='$(CC) -shared'}
+ rb_cv_dlopen=yes],
+ [esix*|uxpds*], [ : ${LDSHARED='$(LD) -G'}
+ rb_cv_dlopen=yes],
+ [osf*], [ : ${LDSHARED='$(LD) -shared -expect_unresolved "*"'}
+ rb_cv_dlopen=yes],
+ [bsdi3*], [ AS_CASE(["$CC"],
+ [*shlicc*], [ : ${LDSHARED='$(CC) -r'}
+ rb_cv_dlopen=yes])],
+ [linux* | gnu* | k*bsd*-gnu | netbsd* | bsdi* | kopensolaris*-gnu | haiku*], [
+ : ${LDSHARED='$(CC) -shared'}
+ if test "$rb_cv_binary_elf" = yes; then
+ LDFLAGS="$LDFLAGS -Wl,-export-dynamic"
+ fi
+ rb_cv_dlopen=yes],
+ [interix*], [ : ${LDSHARED='$(CC) -shared'}
+ XLDFLAGS="$XLDFLAGS -Wl,-E"
+ LIBPATHFLAG=" -L%1\$-s"
+ rb_cv_dlopen=yes],
+ [freebsd*|dragonfly*], [
+ : ${LDSHARED='$(CC) -shared'}
+ if test "$rb_cv_binary_elf" = yes; then
+ LDFLAGS="$LDFLAGS -rdynamic"
+ DLDFLAGS="$DLDFLAGS "'-Wl,-soname,$@'
+ else
+ test "$GCC" = yes && test "$rb_cv_prog_gnu_ld" = yes || LDSHARED='$(LD) -Bshareable'
+ fi
+ rb_cv_dlopen=yes],
+ [openbsd*|mirbsd*], [ : ${LDSHARED='$(CC) -shared ${CCDLFLAGS}'}
+ if test "$rb_cv_binary_elf" = yes; then
+ LDFLAGS="$LDFLAGS -Wl,-E"
+ fi
+ rb_cv_dlopen=yes],
+ [darwin*], [ : ${LDSHARED='$(CC) -dynamic -bundle'}
+ : ${LDFLAGS=""}
+ : ${LIBPATHENV=DYLD_LIBRARY_PATH}
+ : ${PRELOADENV=DYLD_INSERT_LIBRARIES}
+ rb_cv_dlopen=yes],
+ [aix*], [ : ${LDSHARED='$(CC)'}
+ LDSHARED="$LDSHARED ${linker_flag}-G"
+ EXTDLDFLAGS='-e$(TARGET_ENTRY)'
+ XLDFLAGS="${linker_flag}"'-bE:$(ARCHFILE)'" ${linker_flag}-brtl"
+ XLDFLAGS="$XLDFLAGS ${linker_flag}-blibpath:${prefix}/lib:${LIBPATH:-/usr/lib:/lib}"
+ : ${ARCHFILE="ruby.imp"}
+ TRY_LINK='$(CC) $(LDFLAGS) -oconftest $(INCFLAGS) -I$(hdrdir) $(CPPFLAGS)'
+ TRY_LINK="$TRY_LINK"' $(CFLAGS) $(src) $(LIBPATH) $(LOCAL_LIBS) $(LIBS)'
+ : ${LIBPATHENV=LIBPATH}
+ RPATHFLAG=" ${linker_flag}-blibpath:%1\$-s:${prefix}/lib:${LIBPATH:-/usr/lib:/lib}"
+ rb_cv_dlopen=yes],
+ [nto-qnx*], [ DLDFLAGS="$DLDFLAGS -L/lib -L/usr/lib -L/usr/local/lib"
+ : ${LDSHARED='$(LD) -Bshareable -x'}
+ LDFLAGS="$LDFLAGS -L/lib -L/usr/lib -L/usr/local/lib"
+ rb_cv_dlopen=yes],
+ [cygwin*|mingw*], [
+ : ${LDSHARED='$(CC) -shared $(if $(filter-out -g -g0,$(debugflags)),,-s)'}
+ XLDFLAGS="$XLDFLAGS -Wl,--stack,0x00200000,--enable-auto-import"
+ DLDFLAGS="${DLDFLAGS} -Wl,--enable-auto-image-base,--enable-auto-import"
+ : ${LIBPATHENV=""}
+ : ${PRELOADENV=""}
+ rb_cv_dlopen=yes],
+ [hiuxmpp], [ : ${LDSHARED='$(LD) -r'}],
+ [atheos*], [ : ${LDSHARED='$(CC) -shared'}
+ rb_cv_dlopen=yes],
+ [nacl], [ LDSHARED='$(CC) -shared' ],
+ [ : ${LDSHARED='$(LD)'}])
+ AC_MSG_RESULT($rb_cv_dlopen)
+
+ if test "$rb_cv_dlopen" = yes; then
+ AS_CASE(["$target_os"],
+ [darwin*], [
+ for flag in \
+ "-undefined dynamic_lookup" \
+ "-multiply_defined suppress" \
+ ; do
+ test "x${linker_flag}" = x || flag="${linker_flag}`echo ${flag} | tr ' ' ,`"
+ RUBY_TRY_LDFLAGS([$flag], [], [flag=])
+ if test "x$flag" != x; then
+ RUBY_APPEND_OPTIONS(DLDFLAGS, [$flag])
+ fi
+ done
+ ])
+ fi
+
+ if test "$enable_rpath" = yes; then
+ if test x"${RPATHFLAG}" = x; then
+ for rpathflag in -R "-rpath "; do
+ AS_CASE("$rpathflag",
+ [*" "], [AS_CASE(["${linker_flag}"],
+ [*,], [rpathflag=`echo "$rpathflag" | tr ' ' ,`])])
+ rpathflag="${linker_flag}${rpathflag}"
+ RUBY_TRY_LDFLAGS([${rpathflag}.], [], [rpathflag=])
+ if test "x${rpathflag}" != x; then
+ RPATHFLAG=" ${rpathflag}%1\$-s"
+ break
+ fi
+ done
+ fi
+ fi
+fi
+if test "${LDSHAREDXX}" = ""; then
+ AS_CASE(["${LDSHARED}"],
+ [*'$(CC)'*], [
+ LDSHAREDXX=`echo "${LDSHARED}" | sed 's/\$(CC)/$(CXX)/'`
+ ],
+ [*'${CC}'*], [
+ LDSHAREDXX=`echo "${LDSHARED}" | sed 's/\${CC}/${CXX}/'`
+ ],
+ [*$CC*], [
+ LDSHAREDXX=`echo "${LDSHARED}" | sed "s|$CC|$CXX|"`
+ ],
+ [ld" "*], [
+ ])
+fi
+AS_CASE([${RPATHFLAG}],[*'%1$'*],[: ${LIBPATHFLAG=' -L%1$-s'}],[: ${LIBPATHFLAG=' -L%s'}])
+
+AC_SUBST(LINK_SO)
+AC_SUBST(LIBPATHFLAG)
+AC_SUBST(RPATHFLAG)
+AC_SUBST(LIBPATHENV, "${LIBPATHENV-LD_LIBRARY_PATH}")
+AC_SUBST(PRELOADENV, "${PRELOADENV-LD_PRELOAD}")
+AC_SUBST(TRY_LINK)
+
+if test "x$OPT_DIR" != x; then
+ pat=`echo "${LDFLAGS_OPTDIR}" | sed ['s/[][\\.*|]/\\\\&/']`
+ LDFLAGS=`echo "${LDFLAGS}" | sed "s| ${pat}||"`
+ val=`IFS="$PATH_SEPARATOR"
+ for dir in $OPT_DIR; do
+ echo x ${LIBPATHFLAG} ${RPATHFLAG} |
+ sed "s/^x *//;s${IFS}"'%1\\$-s'"${IFS}${dir}/lib${IFS}g;s${IFS}%s${IFS}${dir}/lib${IFS}g"
+ done | tr '\012' ' ' | sed 's/ *$//'`
+ if test x"$val" != x; then
+ test x"${LDFLAGS}" = x || LDFLAGS="$LDFLAGS "
+ LDFLAGS="$LDFLAGS$val"
+ test x"${DLDFLAGS}" = x || DLDFLAGS="$DLDFLAGS "
+ DLDFLAGS="$DLDFLAGS$val"
+ fi
+ LDFLAGS_OPTDIR="$val"
+fi
+
+AS_CASE(["$target_os"],
+[freebsd*], [
+ AC_CHECK_LIB([procstat], [procstat_open_sysctl])
+ if test "x$ac_cv_lib_procstat_procstat_open_sysctl" = xyes; then
+ AC_CHECK_FUNCS(procstat_getvmmap)
+ fi
+ ])
+AS_CASE(["$target_cpu-$target_os"],
+[*-darwin*], [
+ AC_CHECK_HEADERS([execinfo.h])
+ if test "x$ac_cv_header_execinfo_h" = xyes; then
+ AC_CHECK_LIB([execinfo], [backtrace])
+ AC_CHECK_HEADERS([libunwind.h])
+ fi],
+[*-freebsd*|x86_64-netbsd*], [
+ AC_CHECK_HEADERS([execinfo.h])
+ if test "x$ac_cv_header_execinfo_h" = xyes; then
+ AC_CHECK_LIB([execinfo], [backtrace])
+ AC_CHECK_LIB([unwind], [unw_backtrace])
+ fi])
+AC_CHECK_FUNCS(backtrace)
+
+if test "x$ac_cv_func_backtrace" = xyes; then
+ AC_CACHE_CHECK(for broken backtrace, rb_cv_broken_backtrace,
+ [AC_TRY_RUN([
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <string.h>
+#include <signal.h>
+#include <execinfo.h>
+
+#define TRACE_SIZE 256
+
+void sigsegv(int signum, siginfo_t *info, void *ctx){
+ void *trace[TRACE_SIZE];
+ int n = backtrace(trace, TRACE_SIZE);
+ if (n > 0) {
+ /*fprintf(stdout, "backtrace:%d\n",n);*/
+ } else {
+ _exit(EXIT_FAILURE);
+ }
+ _exit(EXIT_SUCCESS);
+}
+int
+main(void)
+{
+ volatile int *a = NULL;
+ stack_t ss;
+ ss.ss_sp = malloc(SIGSTKSZ);
+ if (ss.ss_sp == NULL) {
+ fprintf(stderr, "cannot allocate memory for sigaltstack\n");
+ return EXIT_FAILURE;
+ }
+ ss.ss_size = SIGSTKSZ;
+ ss.ss_flags = 0;
+ if (sigaltstack(&ss, NULL) == -1) {
+ fprintf(stderr, "sigaltstack failed\n");
+ return EXIT_FAILURE;
+ }
+ struct sigaction sa;
+ memset(&sa, 0, sizeof(struct sigaction));
+ sigemptyset(&sa.sa_mask);
+ sa.sa_sigaction = sigsegv;
+ sa.sa_flags |= SA_SIGINFO;
+ sa.sa_flags |= SA_ONSTACK;
+ sigaction(SIGSEGV, &sa, NULL);
+ a[0] = 1;
+ return EXIT_SUCCESS;
+}
+],
+ rb_cv_broken_backtrace=no,
+ rb_cv_broken_backtrace=yes,
+ rb_cv_broken_backtrace=no)])
+ if test "$rb_cv_broken_backtrace" = yes; then
+ AC_DEFINE(BROKEN_BACKTRACE, 1)
+ fi
+fi
+
+AC_ARG_WITH(valgrind,
+ AS_HELP_STRING([--without-valgrind],[disable valgrind memcheck support]),
+ [], with_valgrind=yes)
+AS_IF([test x$with_valgrind != xno],
+ [AC_CHECK_HEADERS(valgrind/memcheck.h)])
+
+dln_a_out_works=no
+if test "$ac_cv_header_a_out_h" = yes; then
+ if test "$with_dln_a_out" = yes || test "$rb_cv_dlopen" = unknown; then
+ cat confdefs.h > config.h
+ AC_CACHE_CHECK(whether matz's dln works, rb_cv_dln_a_out,
+ [AC_TRY_COMPILE([
+#define USE_DLN_A_OUT
+#include "dln.c"
+],
+ [],
+ rb_cv_dln_a_out=yes,
+ rb_cv_dln_a_out=no)])
+ if test "$rb_cv_dln_a_out" = yes; then
+ dln_a_out_works=yes
+ AC_DEFINE(USE_DLN_A_OUT)
+ fi
+ fi
+fi
+
+if test "$dln_a_out_works" = yes; then
+ if test "$GCC" = yes; then
+ STATIC=-static
+ else
+ STATIC=-Bstatic
+ fi
+ DLEXT=so
+ CCDLFLAGS=
+else
+ AS_CASE(["$target_os"],
+ [hpux*], [
+ DLEXT=sl],
+ [darwin*], [
+ RUBY_APPEND_OPTION(XLDFLAGS, [-Wl,-u,_objc_msgSend])
+ DLEXT=bundle],
+ [cygwin*|mingw*|*djgpp*], [
+ LOAD_RELATIVE=1
+ DLEXT=so],
+ [
+ DLEXT=so])
+fi
+if test "$rb_cv_dlopen:$load_relative" = yes:yes; then
+ if test "$ac_cv_func_dladdr" = yes; then
+ LOAD_RELATIVE=1
+ fi
+fi
+if test x"$LOAD_RELATIVE" = x1; then
+ load_relative=yes
+else
+ unset load_relative
+fi
+
+len=2 # .rb
+n=`expr "$DLEXT" : '.*'`; test "$n" -gt "$len" && len=$n
+n=`expr "$DLEXT2" : '.*'`; test "$n" -gt "$len" && len=$n
+AC_DEFINE_UNQUOTED(DLEXT_MAXLEN, `expr $len + 1`)
+test ".$DLEXT" = "." || AC_DEFINE_UNQUOTED(DLEXT, ".$DLEXT")
+test ".$DLEXT2" = "." || AC_DEFINE_UNQUOTED(DLEXT2, ".$DLEXT2")
+AC_SUBST(DLEXT)
+
+if test "$with_dln_a_out" = yes; then
+ STRIP=true
+else
+ AC_CHECK_TOOL(STRIP, strip, :)dnl
+fi
+
+AS_CASE(["$target_os"],
+ [linux* | gnu* | k*bsd*-gnu | kopensolaris*-gnu], [
+ STRIP="$STRIP -S -x"],
+ [darwin*], [
+ STRIP="$STRIP -A -n"])
+
+AC_ARG_WITH(ext,
+ AC_HELP_STRING([--with-ext=EXTS],
+ [pass to --with-ext option of extmk.rb]))
+AC_ARG_WITH(out-ext,
+ AC_HELP_STRING([--with-out-ext=EXTS],
+ [pass to --without-ext option of extmk.rb]))
+EXTSTATIC=
+AC_SUBST(EXTSTATIC)dnl
+AC_ARG_WITH(static-linked-ext,
+ AS_HELP_STRING([--with-static-linked-ext], [link external modules statically]),
+ [AS_CASE([$withval],[yes],[STATIC=;EXTSTATIC=static],[no],[],[EXTSTATIC="$withval"])])
+AS_CASE([",$EXTSTATIC,"], [,static,|*,enc,*], [
+ ENCOBJS='enc/encinit.$(OBJEXT) enc/libenc.$(LIBEXT) enc/libtrans.$(LIBEXT)'
+ EXTOBJS='ext/extinit.$(OBJEXT)'
+ AC_DEFINE_UNQUOTED(EXTSTATIC, 1)
+ AC_SUBST(ENCSTATIC, static)
+], [
+ ENCOBJS='dmyenc.$(OBJEXT)'
+ EXTOBJS='dmyext.$(OBJEXT)'
+])
+AC_SUBST(ENCOBJS)
+AC_SUBST(EXTOBJS)
+
+AC_ARG_WITH(setup,
+ AS_HELP_STRING([--with-setup=SETUP], [use extension libraries setup]),
+ [setup=$withval])
+if test -n "$setup"; then
+ if ! test -f "ext/$setup" -o -f "$srcdir/ext/$setup"; then
+ AC_MSG_ERROR(Setup file $setup not found under ext or $srcdir/ext)
+ fi
+elif test -f "$srcdir/ext/Setup.$target_os"; then
+ setup="Setup.$target_os"
+else
+ setup=
+ for file in "$srcdir"/ext/Setup.*; do
+ AS_CASE(["$file"], [*~|*.bak|*.orig|*.rej|*.tmp], [continue])
+ setup=`basename "$file"`
+ AS_CASE(["$target_os"], [`expr "$setup" : 'Setup.\(.*\)'`*], [break])
+ platform=`sed '/^option *platform */!d;s///;s/|/*|/g;q' "$file"`
+ if test "x$platform" != x; then
+ eval "AS_CASE([\"\$target_os\"], [$platform*], [break])"
+ fi
+ setup=
+ done
+ : ${setup:=Setup}
+fi
+AC_SUBST(setup)
+
+rubylibprefix='${libdir}/${RUBY_BASE_NAME}'
+AC_ARG_WITH(rubylibprefix,
+ AS_HELP_STRING([--with-rubylibprefix=DIR], [prefix for ruby libraries [[LIBDIR/RUBY_BASE_NAME]]]),
+ [if test "x$withval" = xno; then
+ AC_MSG_ERROR([No ruby, No libprefix])
+ fi
+ rubylibprefix="$withval"])
+AC_SUBST(rubylibprefix)
+
+if test x"${exec_prefix}" != xNONE; then
+ RUBY_EXEC_PREFIX="$exec_prefix"
+elif test x"$prefix" != xNONE; then
+ RUBY_EXEC_PREFIX="$prefix"
+else
+ RUBY_EXEC_PREFIX=$ac_default_prefix
+fi
+pat=`echo "${RUBY_EXEC_PREFIX}" | tr -c '\012' .`'\(.*\)'
+for var in bindir libdir rubylibprefix; do
+ eval val='"$'$var'"'
+ AS_CASE(["$val"], ["${RUBY_EXEC_PREFIX}"*], [val='${exec_prefix}'"`expr \"$val\" : \"$pat\"`"])
+ eval $var='"$val"'
+done
+
+BTESTRUBY='$(MINIRUBY)'
+if test x"$cross_compiling" = xyes; then
+ test x"$MINIRUBY" = x && MINIRUBY="${RUBY-$BASERUBY} -I`$CHDIR .; pwd` "-r'$(arch)-fake'
+ XRUBY_LIBDIR=`${RUBY-$BASERUBY} -rrbconfig -e ['puts RbConfig::CONFIG["libdir"]']`
+ XRUBY_RUBYLIBDIR=`${RUBY-$BASERUBY} -rrbconfig -e ['puts RbConfig::CONFIG["rubylibdir"]']`
+ XRUBY_RUBYHDRDIR=`${RUBY-$BASERUBY} -rrbconfig -e ['puts RbConfig::CONFIG["rubyhdrdir"]']`
+ AC_SUBST(XRUBY_LIBDIR)
+ AC_SUBST(XRUBY_RUBYLIBDIR)
+ AC_SUBST(XRUBY_RUBYHDRDIR)
+ PREP='$(arch)-fake.rb'
+ RUNRUBY_COMMAND='$(MINIRUBY) -I`cd $(srcdir)/lib; pwd`'
+ RUNRUBY='$(RUNRUBY_COMMAND)'
+ XRUBY='$(MINIRUBY)'
+ BOOTSTRAPRUBY='$(BASERUBY)'
+ TEST_RUNNABLE=no
+ CROSS_COMPILING=yes
+
+ if test "$host_os" = "nacl"; then
+ if test "$build_cpu" = "$host_cpu" || test "${nacl_cv_cpu_nick}" = "x86" -a "$host_cpu" = "i686"; then
+ nacl_cv_sel_ldr='`$(MINIRUBY) $(srcdir)/nacl/nacl-config.rb sel_ldr`'
+ nacl_cv_irt_core='`$(MINIRUBY) $(srcdir)/nacl/nacl-config.rb irt_core`'
+ nacl_cv_runnable_ld='`$(MINIRUBY) $(srcdir)/nacl/nacl-config.rb runnable_ld`'
+ nacl_cv_host_lib='`$(MINIRUBY) $(srcdir)/nacl/nacl-config.rb host_lib`'
+ TEST_RUNNABLE=yes
+ BTESTRUBY="${nacl_cv_sel_ldr} -a -B ${nacl_cv_irt_core} -w 1:3 -w 2:4"
+ BTESTRUBY="$BTESTRUBY -- ${nacl_cv_runnable_ld} --library-path ${nacl_cv_host_lib}"
+ BTESTRUBY="$BTESTRUBY `pwd`/"'miniruby$(EXEEXT) -I`cd $(srcdir)/lib; pwd` -I.'
+ BTESTRUBY="$BTESTRUBY"' -I$(EXTOUT)/common 3>&1 4>&2 1>/dev/null 2>/dev/null '
+ fi
+ fi
+else
+ MINIRUBY='./miniruby$(EXEEXT) -I$(srcdir)/lib -I.'
+ MINIRUBY="$MINIRUBY"' -I$(EXTOUT)/common'
+ PREP='miniruby$(EXEEXT)'
+ RUNRUBY_COMMAND='$(MINIRUBY) $(srcdir)/tool/runruby.rb --extout=$(EXTOUT) $(RUNRUBYOPT)'
+ RUNRUBY='$(RUNRUBY_COMMAND) --'
+ XRUBY='$(RUNRUBY)'
+ BOOTSTRAPRUBY='$(MINIRUBY)'
+ TEST_RUNNABLE=yes
+ CROSS_COMPILING=no
+fi
+AC_SUBST(TEST_RUNNABLE)
+AC_SUBST(CROSS_COMPILING)
+AC_SUBST(MINIRUBY)
+AC_SUBST(BTESTRUBY)
+AC_SUBST(PREP)
+AC_SUBST(RUNRUBY_COMMAND)
+AC_SUBST(RUNRUBY)
+AC_SUBST(XRUBY)
+AC_SUBST(BOOTSTRAPRUBY)
+AC_SUBST(EXTOUT, [${EXTOUT=.ext}])
+
+FIRSTMAKEFILE=""
+LIBRUBY_A='lib$(RUBY_SO_NAME)-static.a'
+LIBRUBY='$(LIBRUBY_A)'
+LIBRUBYARG_STATIC='-l$(RUBY_SO_NAME)-static'
+LIBRUBYARG='$(LIBRUBYARG_STATIC)'
+SOLIBS=
+
+AS_CASE(["$target_os"],
+ [cygwin*|mingw*|haiku*|darwin*], [
+ : ${DLDLIBS=""}
+ ],
+ [
+ DLDLIBS="$DLDLIBS -lc"
+ ])
+
+AC_ARG_ENABLE(multiarch,
+ AS_HELP_STRING([--enable-multiarch], [enable multiarch compatible directories]),
+ [multiarch=], [unset multiarch])
+if test ${multiarch+set}; then
+ AC_DEFINE(ENABLE_MULTIARCH)
+fi
+
+archlibdir='${libdir}/${arch}'
+sitearchlibdir='${libdir}/${sitearch}'
+archincludedir='${includedir}/${arch}'
+sitearchincludedir='${includedir}/${sitearch}'
+
+AC_ARG_WITH(soname,
+ AS_HELP_STRING([--with-soname=SONAME], [base name of shared library]),
+ [RUBY_SO_NAME=$withval], [RUBY_SO_NAME='$(RUBY_BASE_NAME)'])
+
+LIBRUBY_LDSHARED=$LDSHARED
+LIBRUBY_DLDFLAGS=$DLDFLAGS
+LIBRUBY_SO='lib$(RUBY_SO_NAME).so.$(MAJOR).$(MINOR).$(TEENY)'
+LIBRUBY_ALIASES='lib$(RUBY_SO_NAME).so'
+ENABLE_SHARED=no
+
+AC_ARG_ENABLE(shared,
+ AS_HELP_STRING([--enable-shared], [build a shared library for Ruby]),
+ [enable_shared=$enableval])
+libprefix=${multiarch+'$(archlibdir)'}${multiarch-'$(libdir)'}
+LIBRUBY_RELATIVE=${load_relative-no}
+AS_CASE("$enable_shared", [yes], [
+ LIBRUBY='$(LIBRUBY_SO)'
+ LIBRUBYARG_SHARED='-l$(RUBY_SO_NAME)'
+ LIBRUBYARG='$(LIBRUBYARG_SHARED)'
+ LIBRUBY_RELATIVE=no
+ test -z "$CCDLFLAGS" || CFLAGS="$CFLAGS $CCDLFLAGS"
+ ENABLE_SHARED=yes
+ if test "$rb_cv_binary_elf" = yes; then
+ SOLIBS='$(LIBS)'
+ fi
+
+ # libdir can be overridden in config.site file (on OpenSUSE at least).
+ libdir_basename=lib
+ if test "$bindir" = '${exec_prefix}/bin'; then
+ AS_CASE(["$libdir"], ['${exec_prefix}/'*], [libdir_basename=`basename "$libdir"`])
+ fi
+ AC_DEFINE_UNQUOTED(LIBDIR_BASENAME, ["${libdir_basename}"])
+ libdir_basename="${libdir_basename}"${multiarch+'/${arch}'}
+
+ AS_CASE(["$target_os"],
+ [freebsd*|dragonfly*], [],
+ [
+ if test "$GCC" = yes; then
+ RUBY_TRY_LDFLAGS([${linker_flag}--no-undefined], [no_undefined=yes], [no_undefined=no])
+ if test "no_undefined" = yes; then
+ RUBY_APPEND_OPTION(EXTLDFLAGS, [${linker_flag}--no-undefined])
+ fi
+ fi
+ ])
+
+ AS_CASE(["$target_os"],
+ [sunos4*], [
+ LIBRUBY_ALIASES='lib$(RUBY_SO_NAME).so.$(MAJOR).$(MINOR) lib$(RUBY_SO_NAME).so'
+ ],
+ [linux* | gnu* | k*bsd*-gnu | atheos* | kopensolaris*-gnu | haiku*], [
+ LIBRUBY_DLDFLAGS='-Wl,-soname,lib$(RUBY_SO_NAME).so.$(MAJOR).$(MINOR)'" $LDFLAGS_OPTDIR"
+ LIBRUBY_ALIASES='lib$(RUBY_SO_NAME).so.$(MAJOR).$(MINOR) lib$(RUBY_SO_NAME).so'
+ if test "$load_relative" = yes; then
+ libprefix="'\$\${ORIGIN}/../${libdir_basename}'"
+ LIBRUBY_RPATHFLAGS="-Wl,-rpath,${libprefix}"
+ LIBRUBY_RELATIVE=yes
+ fi
+ ],
+ [freebsd*|dragonfly*], [
+ SOLIBS='$(LIBS)'
+ LIBRUBY_SO='lib$(RUBY_SO_NAME).so.$(MAJOR)$(MINOR)'
+ if test "$rb_cv_binary_elf" != "yes" ; then
+ LIBRUBY_SO="$LIBRUBY_SO.\$(TEENY)"
+ LIBRUBY_ALIASES=''
+ fi
+ ],
+ [netbsd*], [
+ SOLIBS='$(LIBS)'
+ LIBRUBY_SO='lib$(RUBY_SO_NAME).so.$(MAJOR)$(MINOR).$(TEENY)'
+ LIBRUBY_DLDFLAGS='-Wl,-soname,lib$(RUBY_SO_NAME).so.$(MAJOR)$(MINOR)'" $LDFLAGS_OPTDIR"
+ if test "$rb_cv_binary_elf" = yes; then # ELF platforms
+ LIBRUBY_ALIASES='lib$(RUBY_SO_NAME).so.$(MAJOR)$(MINOR) lib$(RUBY_SO_NAME).so'
+ else # a.out platforms
+ LIBRUBY_ALIASES=""
+ fi
+ ],
+ [openbsd*|mirbsd*], [
+ SOLIBS='$(LIBS)'
+ LIBRUBY_SO='lib$(RUBY_SO_NAME).so.$(MAJOR).'`expr ${MINOR} \* 10 + ${TEENY}`
+ ],
+ [solaris*], [
+ SOLIBS='$(LIBS)'
+ LIBRUBY_SO='lib$(RUBY_SO_NAME).so.$(MAJOR)'
+ LIBRUBY_ALIASES='lib$(RUBY_SO_NAME).so.$(MAJOR).$(MINOR).$(TEENY) lib$(RUBY_SO_NAME).so'
+ if test "$GCC" = yes; then
+ LIBRUBY_DLDFLAGS="$DLDFLAGS "'-Wl,-h,$(@F)'
+ else
+ LIBRUBY_DLDFLAGS="$DLDFLAGS "'-h $(@F)'
+ fi
+ XLDFLAGS="$XLDFLAGS "'-R${libdir}'
+ ],
+ [hpux*], [
+ XLDFLAGS="$XLDFLAGS "'-Wl,+s,+b,$(libdir)'
+ LIBRUBY_SO='lib$(RUBY_SO_NAME).sl.$(MAJOR).$(MINOR).$(TEENY)'
+ LIBRUBY_ALIASES='lib$(RUBY_SO_NAME).sl.$(MAJOR).$(MINOR) lib$(RUBY_SO_NAME).sl'
+ ],
+ [aix*], [
+ LIBRUBY_DLDFLAGS="${linker_flag}-bnoentry $XLDFLAGS $LDFLAGS_OPTDIR"
+ LIBRUBYARG_SHARED='-L${libdir} -l${RUBY_SO_NAME}'
+ SOLIBS='-lm -lc'
+ ],
+ [darwin*], [
+ RUBY_SO_NAME="$RUBY_SO_NAME"'.$(MAJOR).$(MINOR).$(TEENY)'
+ LIBRUBY_LDSHARED='$(CC) -dynamiclib'
+ if test "$load_relative" = yes; then
+ libprefix="@executable_path/../${libdir_basename}"
+ LIBRUBY_RELATIVE=yes
+ fi
+ LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "'-install_name '${libprefix}'/$(LIBRUBY_SO)'
+ LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "'-current_version $(MAJOR).$(MINOR).$(TEENY)'
+ LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "'-compatibility_version $(RUBY_PROGRAM_VERSION)'
+ if test "$visibility_option" = ld; then
+ LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "'-Wl,-unexported_symbol,_Init_*'
+ LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "'-Wl,-unexported_symbol,_ruby_static_id_*'
+ LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "'-Wl,-unexported_symbol,*_threadptr_*'
+ fi
+ LIBRUBY_DLDFLAGS="$LIBRUBY_DLDFLAGS "' $(XLDFLAGS)'
+ LIBRUBY_SO='lib$(RUBY_SO_NAME).dylib'
+ LIBRUBY_ALIASES='lib$(RUBY_BASE_NAME).$(MAJOR).$(MINOR).dylib lib$(RUBY_INSTALL_NAME).dylib'
+ SOLIBS='$(LIBS)'
+ ],
+ [interix*], [
+ LIBRUBYARG_SHARED='-L. -L${libdir} -l$(RUBY_SO_NAME)'
+ ],
+ [mingw*|cygwin*|mswin*], [
+ LIBRUBY_RELATIVE=yes
+ ])
+], [
+ LIBRUBYARG_SHARED=
+
+ # enable PIE if possible
+ AC_ARG_ENABLE(pie,
+ AS_HELP_STRING([--disable-pie], [disable PIE feature]),
+ [pie=$enableval], [pie=])
+ AS_CASE(["$target_os"],
+ [nacl], [
+ # -pie implies -shared for NaCl.
+ pie=no
+ ])
+ if test "$GCC" = yes -a -z "$EXTSTATIC" -a "x$pie" != xno; then
+ RUBY_TRY_CFLAGS(-fPIE, [pie=yes], [pie=no])
+ if test "$pie" = yes; then
+ # Use -fPIE when testing -pie. RUBY_TRY_LDFLAGS sets
+ # $save_CFLAGS internally, so set other name here.
+ save_CFLAGS_before_pie="$CFLAGS"
+ CFLAGS="$CFLAGS -fPIE"
+
+ # gcc need -pie but clang need -Wl,-pie.
+ for pie in -pie -Wl,-pie; do
+ RUBY_TRY_LDFLAGS([$pie], [], [pie=])
+ if test "x$pie" != x; then
+ RUBY_APPEND_OPTION(XCFLAGS, -fPIE)
+ RUBY_APPEND_OPTION(XLDFLAGS, $pie)
+ break
+ fi
+ done
+ CFLAGS="$save_CFLAGS_before_pie"
+ fi
+ fi
+])
+if test "$enable_rpath" = yes; then
+ test -z "$LIBRUBY_RPATHFLAGS" || LIBRUBY_RPATHFLAGS="$LIBRUBY_RPATHFLAGS "
+ rpathflag="${RPATHFLAG}"
+ AS_CASE(["${cross_compiling}${load_relative}"], [*yes*], [], [rpathflag="$RPATHFLAG$LIBPATHFLAG"])
+ rpathflag=`IFS="$PATH_SEPARATOR"
+ echo x "$rpathflag" |
+ sed "s/^x *//;s${IFS}"'%1\\$-s'"${IFS}${libprefix}${IFS}g;s${IFS}%s${IFS}${libprefix}${IFS}g"
+ `
+ LIBRUBY_RPATHFLAGS="$LIBRUBY_RPATHFLAGS${rpathflag}"
+ LIBRUBYARG_SHARED="$LIBRUBY_RPATHFLAGS $LIBRUBYARG_SHARED"
+ LIBRUBYARG_STATIC="$LIBRUBY_RPATHFLAGS $LIBRUBYARG_STATIC"
+fi
+AC_SUBST(LIBRUBY_RELATIVE)
+
+LDFLAGS="-L. $LDFLAGS"
+AC_SUBST(ARCHFILE)
+
+if test "$EXEEXT" = .exe; then
+ EXECUTABLE_EXTS='".exe",".com",".cmd",".bat"'
+ AC_DEFINE_UNQUOTED(EXECUTABLE_EXTS, $EXECUTABLE_EXTS)
+ EXECUTABLE_EXTS=`echo $EXECUTABLE_EXTS | tr -d '"' | tr , ' '`
+ AC_SUBST(EXECUTABLE_EXTS)
+fi
+
+AS_CASE("$cross_compiling:${LIBPATHENV}", [yes:* | no:], [], [
+ AC_MSG_CHECKING(whether wrapper for $LIBPATHENV is needed)
+ AS_IF([env ${LIBPATHENV}=/lib /bin/sh -c ': ${'${LIBPATHENV}'?}' 2>/dev/null],
+ [AC_MSG_RESULT(no)],
+ [PREP="$PREP"' ruby-runner$(EXEEXT)'
+ AC_MSG_RESULT(yes)]
+ )
+])
+
+AC_ARG_ENABLE(dtrace,
+ AS_HELP_STRING([--enable-dtrace],
+ [enable DTrace for tracing inside ruby. enabled by default on systems having dtrace]),
+ [enable_dtrace=$enableval], [enable_dtrace=auto])
+
+if test "${enable_dtrace}" = "auto"; then
+ if test x"$DTRACE" != x -a x"$cross_compiling" != xyes; then
+ RUBY_DTRACE_AVAILABLE()
+ enable_dtrace=$rb_cv_dtrace_available
+ else
+ enable_dtrace=no
+ fi
+fi
+
+LIBRUBY_A_OBJS='$(OBJS)'
+DTRACE_REBUILD=
+if test "${enable_dtrace}" = "yes"; then
+ if test -z "$DTRACE"; then
+ AC_MSG_ERROR([dtrace(1) is missing])
+ elif test "$cross_compiling" = yes; then
+ AC_MSG_ERROR([--enable-dtrace, however, cross compiling])
+ else
+ RUBY_DTRACE_AVAILABLE()
+ enable_dtrace=$rb_cv_dtrace_available
+ if test "${enable_dtrace}" = "no"; then
+ AC_MSG_ERROR([--enable-dtrace, however, USDT is not available])
+ fi
+ RUBY_DTRACE_POSTPROCESS()
+ if test "$rb_cv_prog_dtrace_g" != 'no'; then
+ DTRACE_OBJ='probes.$(OBJEXT)'
+ fi
+ if test "$rb_cv_prog_dtrace_g" = 'rebuild'; then
+ DTRACE_REBUILD=yes
+ LIBRUBY_A_OBJS='$(DTRACE_GLOMMED_OBJ)'
+ fi
+ AS_CASE("${target_os}", [freebsd*], [
+ # FreeBSD's dtrace requires libelf
+ LIBS="-lelf $LIBS"
+ ])
+ fi
+ DTRACE_EXT=d
+else
+ DTRACE_EXT=dmyh
+fi
+AC_SUBST(DTRACE_EXT)
+AC_SUBST(DTRACE_OBJ)
+AC_SUBST(DTRACE_REBUILD)
+AC_SUBST(LIBRUBY_A_OBJS)
+
+RUBY_SETJMP_TYPE
+}
+{ # build section
+
+dnl build rdoc index if requested
+RDOCTARGET=""
+CAPITARGET=""
+AC_ARG_ENABLE(install-doc,
+ AS_HELP_STRING([--disable-install-doc], [do not install either rdoc indexes or C API documents during install]),
+ [install_doc=$enableval], [install_doc=yes])
+AC_ARG_ENABLE(install-rdoc,
+ AS_HELP_STRING([--disable-install-rdoc], [do not install rdoc indexes during install]),
+ [install_rdoc=$enableval], [install_rdoc=yes])
+AC_ARG_ENABLE(install-capi,
+ AS_HELP_STRING([--disable-install-capi], [do not install C API documents during install]),
+ [install_capi=$enableval], [install_capi=no])
+
+if test "$install_doc" != no; then
+ if test "$install_rdoc" != no; then
+ RDOCTARGET="rdoc"
+ else
+ RDOCTARGET="nodoc"
+ fi
+ if test "$install_capi" != no -a -n "$DOXYGEN"; then
+ CAPITARGET="capi"
+ else
+ CAPITARGET="nodoc"
+ fi
+else
+ RDOCTARGET="nodoc"
+ CAPITARGET="nodoc"
+fi
+
+AC_SUBST(RDOCTARGET)
+AC_SUBST(CAPITARGET)
+
+AS_CASE(["$RDOCTARGET:$CAPITARGET"],[nodoc:nodoc],[INSTALLDOC=nodoc],[INSTALLDOC=all])
+AC_SUBST(INSTALLDOC)
+
+if test "$rb_with_pthread" = "yes"; then
+ THREAD_MODEL=pthread
+fi
+AC_CACHE_CHECK([for prefix of external symbols], rb_cv_symbol_prefix, [
+ AC_TRY_COMPILE([extern void conftest_external(void) {}], [], [
+ rb_cv_symbol_prefix=`$NM conftest.$ac_objext |
+ sed -n ['/.*T[ ]\([^ ]*\)conftest_external.*/!d;s//\1/p;q']`
+ ],
+ [rb_cv_symbol_prefix=''])
+ test -n "$rb_cv_symbol_prefix" || rb_cv_symbol_prefix=NONE
+])
+SYMBOL_PREFIX="$rb_cv_symbol_prefix"
+test "x$SYMBOL_PREFIX" = xNONE && SYMBOL_PREFIX=''
+DLNOBJ=dln.o
+AC_ARG_ENABLE(dln,
+ AC_HELP_STRING([--disable-dln], [disable dynamic link feature]),
+ [test "$enableval" = yes || DLNOBJ=dmydln.o])
+AC_SUBST(DLNOBJ)
+MINIDLNOBJ=dmydln.o
+
+AS_CASE(["$target_os"],
+ [linux*], [
+ ],
+ [netbsd*], [
+ RUBY_APPEND_OPTION(CFLAGS, -pipe)
+ ],
+ [darwin*], [
+ RUBY_APPEND_OPTION(CFLAGS, -pipe)
+ RUBY_APPEND_OPTION(XLDFLAGS, [-framework CoreFoundation])
+ RUBY_APPEND_OPTION(LIBRUBYARG_STATIC, [-framework CoreFoundation])
+ ],
+ [osf*], [
+ if test "$GCC" != "yes" ; then
+ # compile something small: taint.c is fine for this.
+ # the main point is the '-v' flag of 'cc'.
+ AS_CASE(["`cc -v -I. -c main.c -o /tmp/main.o 2>&1`"],
+ [*/gemc_cc*], [ # we have the new DEC GEM CC
+ CFLAGS="$CFLAGS -oldc"
+ ],
+ [ # we have the old MIPS CC
+ ])
+ # cleanup
+ rm -f /tmp/main.o
+ CFLAGS="$CFLAGS -std"
+ fi
+ ],
+ [cygwin*|mingw*], [
+ RUBY_SO_NAME="${RUBY_SO_NAME}"'$(MAJOR)$(MINOR)$(TEENY)'
+ LIBRUBY_DLDFLAGS="${DLDFLAGS}"' -Wl,--out-implib=$(LIBRUBY)'
+ AS_CASE(["$target_os"],
+ [cygwin*], [
+ if test x"$enable_shared" = xyes; then
+ LIBRUBY_SO='cyg$(RUBY_SO_NAME)'.dll
+ LIBRUBY_DLDFLAGS="${LIBRUBY_DLDFLAGS}"' $(RUBYDEF)'
+ fi
+ ],
+ [mingw*], [
+ RUBY_SO_NAME="${rb_cv_msvcrt}-${RUBY_SO_NAME}"
+ if test x"${target_cpu}" != xi386; then
+ RUBY_SO_NAME="${target_cpu}-${RUBY_SO_NAME}"
+ fi
+ if test x"$enable_shared" = xyes; then
+ LIBRUBY_SO='$(RUBY_SO_NAME)'.dll
+ LIBRUBY_DLDFLAGS="${LIBRUBY_DLDFLAGS}"' $(RUBYDEF)'
+ fi
+ EXPORT_PREFIX=' '
+ DLDFLAGS="${DLDFLAGS}"' $(DEFFILE)'
+ AC_LIBOBJ([win32/win32])
+ AC_LIBOBJ([win32/file])
+ COMMON_LIBS=m
+# COMMON_MACROS="WIN32_LEAN_AND_MEAN="
+ COMMON_HEADERS="winsock2.h windows.h"
+ THREAD_MODEL=win32
+ PLATFORM_DIR=win32
+ ])
+ LIBRUBY_ALIASES=''
+ FIRSTMAKEFILE=GNUmakefile:cygwin/GNUmakefile.in
+ SOLIBS='$(LIBS)'
+ if test x"$enable_shared" = xyes; then
+ LIBRUBY='lib$(RUBY_SO_NAME).dll.a'
+ else
+ LIBRUBY_SO=dummy
+ LIBRUBY='lib$(RUBY_SO_NAME).a'
+ LIBRUBYARG='-l$(RUBY_SO_NAME)'
+ fi
+ ],
+ [hpux*], [
+ AS_CASE(["$YACC"],[*yacc*], [
+ XCFLAGS="$XCFLAGS -DYYMAXDEPTH=300"
+ YACC="$YACC -Nl40000 -Nm40000"
+ ])],
+ [nacl], [
+ FIRSTMAKEFILE=GNUmakefile:nacl/GNUmakefile.in
+ ])
+
+AS_CASE(["$with_gmp: $SOLIBS "], [no:* | *' -lgmp '*|*' $(LIBS) '*], [],
+ [SOLIBS="-lgmp $SOLIBS"])
+
+AS_CASE(["$with_jemalloc: $LIBS "], [no:* | *' -ljemalloc '*], [],
+ [LIBS="-ljemalloc $LIBS"])
+
+MINIOBJS="$MINIDLNOBJ"
+
+AS_CASE(["$THREAD_MODEL"],
+[pthread], [AC_CHECK_HEADERS(pthread.h)],
+[win32], [],
+[""], [AC_MSG_ERROR(thread model is missing)],
+ [AC_MSG_ERROR(unknown thread model $THREAD_MODEL)])
+
+AC_ARG_ENABLE(debug-env,
+ AS_HELP_STRING([--enable-debug-env], [enable RUBY_DEBUG environment variable]),
+ [AC_DEFINE(RUBY_DEBUG_ENV)])
+
+AS_CASE(["$FIRSTMAKEFILE"], [*GNUmakefile:*], [gnumake=yes], [
+ AC_MSG_CHECKING([if ${MAKE-make} is GNU make])
+ mkdir conftest.dir
+ echo "all:; @echo yes" > conftest.dir/GNUmakefile
+ echo "all:; @echo no" > conftest.dir/Makefile
+ gnumake=`(cd conftest.dir; ${MAKE-make})`
+ rm -fr conftest.dir
+ AS_CASE(["$gnumake"],
+ [*yes*], [
+ FIRSTMAKEFILE=GNUmakefile:template/GNUmakefile.in
+ gnumake=yes],
+ [
+ gnumake=no])
+ AC_MSG_RESULT($gnumake)
+])
+AS_IF([test "$gnumake" = yes], [ NULLCMD=: ], [
+ AC_MSG_CHECKING([for safe null command for ${MAKE-make}])
+ mkdir conftest.dir
+ NULLCMD=
+ for cmd in : true; do
+ echo 'A=1' > conftest.dir/Makefile
+ echo 'B=$(A:1=@'$cmd')' >> conftest.dir/Makefile
+ echo 'all:; $B 1 2 3 4 5 6 7 8 9' >> conftest.dir/Makefile
+ if (cd conftest.dir; ${MAKE-make} >/dev/null 2>/dev/null); then
+ NULLCMD=$cmd
+ break
+ fi
+ done
+ rm -fr conftest.dir
+ if test -z "$NULLCMD"; then
+ AC_MSG_ERROR(no candidate for safe null command)
+ fi
+ AC_MSG_RESULT($NULLCMD)
+])
+AC_SUBST(NULLCMD)
+
+if test "${universal_binary-no}" = yes ; then
+ AC_CACHE_CHECK([for architecture macros], rb_cv_architecture_macros, [
+ mv confdefs.h confdefs1.h
+ : > confdefs.h
+ AC_TRY_COMPILE([@%:@if defined __`echo ${universal_archnames} |
+ sed 's/=[^ ]*//g;s/ /__ || defined __/g'`__
+@%:@else
+@%:@error
+>>>>>><<<<<<
+@%:@endif], [],
+[
+ rb_cv_architecture_macros=yes
+ mv -f confdefs1.h confdefs.h
+], [
+ rb_cv_architecture_macros=no
+ archflagpat=`eval echo '"'"${ARCH_FLAG}"'"' | sed 's/[[][|.*]]/\\&/g'`
+ new_cflags=`echo "$CFLAGS" | sed "s|$archflagpat"'||'`
+ for archs in ${universal_archnames}; do
+ cpu=${archs@%:@*=}
+ archs=${archs%=*}
+ CFLAGS="$new_cflags -arch $archs"
+ archs="__${archs}__"
+ AC_MSG_CHECKING([for macro ${archs} on ${cpu}])
+ AC_TRY_COMPILE([@%:@ifndef ${archs}
+@%:@error
+@%:@endif], [], [AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no])])
+ done
+ mv -f confdefs1.h confdefs.h
+ AC_MSG_ERROR([failed])
+ ])])
+ AC_CACHE_CHECK(whether __ARCHITECTURE__ is available, rb_cv_architecture_available,
+ AC_TRY_COMPILE([@%:@include <stdio.h>
+ const char arch[[]] = __ARCHITECTURE__;], [puts(arch);],
+ [rb_cv_architecture_available=yes], [rb_cv_architecture_available=no]))
+fi
+
+CPPFLAGS="$CPPFLAGS "'$(DEFS)'
+test -z "$CPPFLAGS" || CPPFLAGS="$CPPFLAGS "; CPPFLAGS="$CPPFLAGS"'${cppflags}'
+if test -n "${cflags+set}"; then
+ cflagspat=`eval echo '"'"${cflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/^ *$/ /'`
+ CFLAGS=`echo " $CFLAGS " | sed "s|$cflagspat"'|${cflags}|;s/^ *//;s/ *$//'`
+fi
+if test -n "${cxxflags+set}"; then
+ cxxflagspat=`eval echo '"'"${cxxflags}"'"' | sed 's/[[][|.*]]/\\&/g;s/^ */ /;s/^ *$/ /'`
+ CXXFLAGS=`echo " $CXXFLAGS " | sed "s|$cxxflagspat"'|${cxxflags}|;s/^ *//;s/ *$//'`
+fi
+if test "${ARCH_FLAG}"; then
+ archflagpat=`eval echo '"'"${ARCH_FLAG}"'"' | sed 's/[[][|.*]]/\\&/g'`
+ CFLAGS=`echo "$CFLAGS" | sed "s| *$archflagpat"'||'`
+ CXXFLAGS=`echo "$CXXFLAGS" | sed "s| *$archflagpat"'||'`
+ LDFLAGS=`echo "$LDFLAGS" | sed "s| *$archflagpat"'||'`
+fi
+warnflags="$rb_cv_warnflags"
+AC_SUBST(cppflags)dnl
+AC_SUBST(cflags, ["$orig_cflags "'${optflags} ${debugflags} ${warnflags}'])dnl
+AC_SUBST(cxxflags, ["$orig_cxxflags "'${optflags} ${debugflags} ${warnflags}'])dnl
+AC_SUBST(optflags)dnl
+AC_SUBST(debugflags)dnl
+AC_SUBST(warnflags)dnl
+AC_SUBST(strict_warnflags)dnl
+AC_SUBST(XCFLAGS)dnl
+AC_SUBST(XLDFLAGS)dnl
+AC_SUBST(EXTLDFLAGS)dnl
+AC_SUBST(EXTDLDFLAGS)dnl
+AC_SUBST(LIBRUBY_LDSHARED)
+AC_SUBST(LIBRUBY_DLDFLAGS)
+AC_SUBST(RUBY_INSTALL_NAME)
+AC_SUBST(rubyw_install_name)
+AC_SUBST(RUBYW_INSTALL_NAME)
+AC_SUBST(RUBY_SO_NAME)
+AC_SUBST(LIBRUBY_A)
+AC_SUBST(LIBRUBY_SO)
+AC_SUBST(LIBRUBY_ALIASES)
+AC_SUBST(LIBRUBY)
+AC_SUBST(LIBRUBYARG)
+AC_SUBST(LIBRUBYARG_STATIC)
+AC_SUBST(LIBRUBYARG_SHARED)
+AC_SUBST(SOLIBS)
+AC_SUBST(DLDLIBS)
+AC_SUBST(ENABLE_SHARED)
+AC_SUBST(MAINLIBS)
+AC_SUBST(COMMON_LIBS)
+AC_SUBST(COMMON_MACROS)
+AC_SUBST(COMMON_HEADERS)
+AC_SUBST(EXPORT_PREFIX)
+AC_SUBST(SYMBOL_PREFIX)
+AC_SUBST(MINIOBJS)
+AC_SUBST(THREAD_MODEL)
+AC_SUBST(PLATFORM_DIR)
+
+firstmf=`echo $FIRSTMAKEFILE | sed 's/:.*//'`
+firsttmpl=`echo $FIRSTMAKEFILE | sed 's/.*://'`
+MAKEFILES="Makefile $firstmf"
+MAKEFILES="`echo $MAKEFILES`"
+AC_SUBST(MAKEFILES)
+
+ri_prefix=
+test "$program_prefix" != NONE &&
+ ri_prefix=$program_prefix
+
+ri_suffix=
+test "$program_suffix" != NONE &&
+ ri_suffix=$program_suffix
+
+RUBY_INSTALL_NAME="${ri_prefix}"'$(RUBY_BASE_NAME)'"${ri_suffix}"
+AS_CASE(["$target_os"],
+ [cygwin*|mingw*], [
+ RUBYW_INSTALL_NAME="${ri_prefix}"'$(RUBYW_BASE_NAME)'"${ri_suffix}"
+ rubyw_install_name='$(RUBYW_INSTALL_NAME)'
+ ])
+
+rubylibdir='${rubylibprefix}/${ruby_version}'
+rubyarchdir=${multiarch+'${rubyarchprefix}/${ruby_version}'}${multiarch-'${rubylibdir}/${arch}'}
+
+rubyarchprefix=${multiarch+'${archlibdir}/${RUBY_BASE_NAME}'}${multiarch-'${rubylibprefix}/${arch}'}
+AC_ARG_WITH(rubyarchprefix,
+ AS_HELP_STRING([--with-rubyarchprefix=DIR],
+ [prefix for architecture dependent ruby libraries [[RUBYLIBPREFIX/ARCH]]]),
+ [rubyarchprefix="$withval"])
+AC_SUBST(rubyarchprefix)
+
+rubysitearchprefix=${multiarch+'${sitearchlibdir}/${RUBY_BASE_NAME}'}${multiarch-'${rubylibprefix}/${sitearch}'}
+AC_ARG_WITH(rubysitearchprefix,
+ AS_HELP_STRING([--with-rubysitearchprefix=DIR],
+ [prefix for architecture dependent site libraries [[RUBYLIBPREFIX/SITEARCH]]]),
+ [rubysitearchprefix="$withval"])
+AC_SUBST(rubysitearchprefix)
+
+RI_BASE_NAME=`echo ${RUBY_BASE_NAME} | sed 's/ruby/ri/'`
+ridir='${datarootdir}/${RI_BASE_NAME}'
+AC_ARG_WITH(ridir,
+ AS_HELP_STRING([--with-ridir=DIR], [ri documentation [[DATAROOTDIR/ri]]]),
+ [ridir=$withval])
+AC_SUBST(ridir)
+AC_SUBST(RI_BASE_NAME)
+
+AC_ARG_WITH(ruby-version,
+ AS_HELP_STRING([--with-ruby-version=STR], [ruby version string for version specific directories [[full]] (full|minor|STR)]),
+ [ruby_version=$withval],
+ [ruby_version=full])
+unset RUBY_LIB_VERSION
+unset RUBY_LIB_VERSION_STYLE
+AS_CASE(["$ruby_version"],
+ [full], [RUBY_LIB_VERSION_STYLE='3 /* full */'],
+ [minor], [RUBY_LIB_VERSION_STYLE='2 /* minor */'])
+if test ${RUBY_LIB_VERSION_STYLE+set}; then
+ {
+ echo "#define RUBY_LIB_VERSION_STYLE $RUBY_LIB_VERSION_STYLE"
+ echo '#define STRINGIZE(x) x'
+ test -f revision.h -o -f "${srcdir}/revision.h" || echo '#define RUBY_REVISION 0'
+ echo '#include "verconf.h"'
+ echo '#include "version.h"'
+ echo 'ruby_version=RUBY_LIB_VERSION'
+ } > conftest.c
+ test -f verconf.h || > verconf.h
+ ruby_version="`$CPP -I. -I"${srcdir}" -I"${srcdir}/include" conftest.c | sed '/^ruby_version=/!d;s/ //g'`"
+ eval $ruby_version
+elif test -z "${ruby_version}"; then
+ AC_MSG_ERROR([No ruby version, No place for bundled libraries])
+else
+ RUBY_LIB_VERSION="${ruby_version}"
+fi
+AC_SUBST(RUBY_LIB_VERSION_STYLE)
+AC_SUBST(RUBY_LIB_VERSION)
+
+AC_ARG_WITH(sitedir,
+ AS_HELP_STRING([--with-sitedir=DIR], [site libraries in DIR [[RUBY_LIB_PREFIX/site_ruby]], "no" to disable site directory]),
+ [sitedir=$withval],
+ [sitedir='${rubylibprefix}/site_ruby'])
+sitelibdir='${sitedir}/${ruby_version}'
+
+AC_ARG_WITH(sitearchdir,
+ AS_HELP_STRING([--with-sitearchdir=DIR],
+ [architecture dependent site libraries in DIR [[SITEDIR/SITEARCH]], "no" to disable site directory]),
+ [sitearchdir=$withval],
+ [sitearchdir=${multiarch+'${rubysitearchprefix}/site_ruby/${ruby_version}'}${multiarch-'${sitelibdir}/${sitearch}'}])
+
+AC_ARG_WITH(vendordir,
+ AS_HELP_STRING([--with-vendordir=DIR], [vendor libraries in DIR [[RUBY_LIB_PREFIX/vendor_ruby]], "no" to disable vendor directory]),
+ [vendordir=$withval],
+ [vendordir='${rubylibprefix}/vendor_ruby'])
+vendorlibdir='${vendordir}/${ruby_version}'
+
+AC_ARG_WITH(vendorarchdir,
+ AS_HELP_STRING([--with-vendorarchdir=DIR],
+ [architecture dependent vendor libraries in DIR [[VENDORDIR/SITEARCH]], "no" to disable vendor directory]),
+ [vendorarchdir=$withval],
+ [vendorarchdir=${multiarch+'${rubysitearchprefix}/vendor_ruby/${ruby_version}'}${multiarch-'${vendorlibdir}/${sitearch}'}])
+
+if test "${LOAD_RELATIVE+set}"; then
+ AC_DEFINE_UNQUOTED(LOAD_RELATIVE, $LOAD_RELATIVE)
+ RUBY_EXEC_PREFIX=''
+fi
+
+AC_SUBST(RUBY_EXEC_PREFIX)
+
+AC_SUBST(libdirname, ${multiarch+arch}libdir)
+AC_SUBST(archlibdir)dnl
+AC_SUBST(sitearchlibdir)dnl
+AC_SUBST(archincludedir)dnl
+AC_SUBST(sitearchincludedir)dnl
+AC_SUBST(arch)dnl
+AC_SUBST(sitearch)dnl
+AC_SUBST(ruby_version)dnl
+AC_SUBST(rubylibdir)dnl
+AC_SUBST(rubyarchdir)dnl
+AC_SUBST(sitedir)dnl
+AC_SUBST(sitelibdir)dnl
+AC_SUBST(sitearchdir)dnl
+AC_SUBST(vendordir)dnl
+AC_SUBST(vendorlibdir)dnl
+AC_SUBST(vendorarchdir)dnl
+
+AC_SUBST(CONFIGURE, "`echo $0 | sed 's|.*/||'`")dnl
+AC_SUBST(configure_args, "`echo "${ac_configure_args}" | sed 's/\\$/$$/g'`")dnl
+
+if test "${universal_binary-no}" = yes ; then
+ arch="universal-${target_os}"
+ if test "${rb_cv_architecture_available}" = yes; then
+ AC_DEFINE_UNQUOTED(RUBY_PLATFORM_CPU, __ARCHITECTURE__)
+ else
+ for archs in ${universal_archnames}; do
+ cpu=`echo $archs | sed 's/.*=//'`
+ archs=`echo $archs | sed 's/=.*//'`
+ RUBY_DEFINE_IF([defined __${archs}__], RUBY_PLATFORM_CPU, ["${cpu}"])
+ done
+ fi
+ ints='long int short'
+ test "$ac_cv_type_long_long" = yes && ints="'long long' $ints"
+ AC_SUBST(UNIVERSAL_ARCHNAMES, "${universal_archnames}")
+ AC_SUBST(UNIVERSAL_INTS, "${ints}")
+ AC_DEFINE_UNQUOTED(RUBY_PLATFORM_OS, "${target_os}")
+ AC_DEFINE_UNQUOTED(RUBY_ARCH, "universal-"RUBY_PLATFORM_OS)
+ AC_DEFINE_UNQUOTED(RUBY_PLATFORM, "universal."RUBY_PLATFORM_CPU"-"RUBY_PLATFORM_OS)
+else
+ arch="${target_cpu}-${target_os}"
+ AS_CASE(["$arch"], [le32-nacl], [arch="pnacl"])
+ AC_DEFINE_UNQUOTED(RUBY_PLATFORM, "$arch")
+fi
+
+unset sitearch
+AS_CASE(["$target_os"],[mingw*],[sitearch="$target_cpu-$rb_cv_msvcrt"])
+: ${sitearch='${arch}'}
+
+AC_ARG_WITH(search-path,
+ AS_HELP_STRING([--with-search-path=DIR], [specify the additional search path]),
+ [search_path=$withval])
+if test "$search_path" != ""; then
+ AC_SUBST(RUBY_SEARCH_PATH, $search_path)
+fi
+
+AC_ARG_WITH(rubyhdrdir,
+ AS_HELP_STRING([--with-rubyhdrdir=DIR], [core headers in DIR [[INCLUDEDIR/RUBY_BASE_NAME-RUBY_VERSION]]]),
+ [rubyhdrdir=$withval],
+ [rubyhdrdir='${includedir}/${RUBY_VERSION_NAME}'])
+
+AC_ARG_WITH(rubyarchhdrdir,
+ AS_HELP_STRING([--with-rubyarchhdrdir=DIR],
+ [architecture dependent core headers in DIR [[$(rubyhdrdir)/$(arch)]]]),
+ [rubyarchhdrdir=$withval],
+ [rubyarchhdrdir=${multiarch+'${archincludedir}/${RUBY_VERSION_NAME}'}${multiarch-'${rubyhdrdir}/${arch}'}])
+
+AC_ARG_WITH(sitehdrdir,
+ AS_HELP_STRING([--with-sitehdrdir=DIR], [core site headers in DIR [[RUBYHDRDIR/site_ruby]]]),
+ [sitehdrdir=$withval],
+ [sitehdrdir='${rubyhdrdir}/site_ruby'])
+
+AC_ARG_WITH(sitearchhdrdir,
+ AS_HELP_STRING([--with-sitearchhdrdir=DIR],
+ [architecture dependent core site headers in DIR [[RUBYHDRDIR/site_ruby]]]),
+ [sitearchhdrdir=$withval],
+ [sitearchhdrdir=${multiarch+'${sitearchincludedir}/${RUBY_VERSION_NAME}/site_ruby'}${multiarch-'${sitehdrdir}/${sitearch}'}])
+
+AC_ARG_WITH(vendorhdrdir,
+ AS_HELP_STRING([--with-vendorhdrdir=DIR], [core vendor headers in DIR [[RUBYHDRDIR/vendor_ruby]]]),
+ [vendorhdrdir=$withval],
+ [vendorhdrdir='${rubyhdrdir}/vendor_ruby'])
+
+AC_ARG_WITH(vendorarchhdrdir,
+ AS_HELP_STRING([--with-vendorarchhdrdir=DIR],
+ [architecture dependent core vendor headers in DIR [[RUBYHDRDIR/vendor_ruby]]]),
+ [vendorarchhdrdir=$withval],
+ [vendorarchhdrdir=${multiarch+'${sitearchincludedir}/${RUBY_VERSION_NAME}/vendor_ruby'}${multiarch-'${vendorhdrdir}/${sitearch}'}])
+
+AC_SUBST(rubyhdrdir)dnl
+AC_SUBST(sitehdrdir)dnl
+AC_SUBST(vendorhdrdir)dnl
+AC_SUBST(rubyarchhdrdir)dnl
+AC_SUBST(sitearchhdrdir)dnl
+AC_SUBST(vendorarchhdrdir)dnl
+
+AC_ARG_WITH(mantype,
+ AS_HELP_STRING([--with-mantype=TYPE], [specify man page type; TYPE is one of man and doc]),
+ [
+ AS_CASE(["$withval"],
+ [man|man.gz|man.bz2|doc|doc.gz|doc.bz2], [MANTYPE=$withval],
+ [AC_MSG_ERROR(invalid man type: $withval)])
+ ])
+if test -z "$MANTYPE"; then
+ AC_PATH_PROGS(NROFF, nroff awf, /bin/false, "/usr/bin:/usr/ucb")
+ if ${NROFF} -mdoc ${srcdir}/man/ruby.1 >/dev/null 2>&1; then
+ MANTYPE=doc
+ else
+ MANTYPE=man
+ fi
+fi
+AC_SUBST(MANTYPE)
+
+AC_ARG_ENABLE(rubygems,
+ AS_HELP_STRING([--disable-rubygems], [disable rubygems by default]),
+ [enable_rubygems="$enableval"], [enable_rubygems=yes])
+if test x"$enable_rubygems" = xno; then
+ AC_DEFINE(DISABLE_RUBYGEMS, 1)
+ USE_RUBYGEMS=NO
+else
+ USE_RUBYGEMS=YES
+fi
+AC_SUBST(USE_RUBYGEMS)
+
+arch_hdrdir="${EXTOUT}/include/${arch}/ruby"
+AS_MKDIR_P("${arch_hdrdir}")
+config_h="${arch_hdrdir}/config.h"
+guard=INCLUDE_RUBY_CONFIG_H
+{
+ echo "#ifndef $guard"
+ echo "#define $guard 1"
+ grep -v "^#define PACKAGE_" confdefs.h
+ echo "#endif /* $guard */"
+} | tr -d '\015' |
+(
+ if test "x$CONFIGURE_TTY" = xyes; then color=--color; else color=; fi
+ exec ${srcdir}/tool/ifchange $color "${config_h}" -
+)
+tr -d '\015' < largefile.h > confdefs.h
+rm largefile.h
+
+BUILTIN_ENCS=["`sed -n -e '/^BUILTIN_ENCS[ ]*=/{' \
+ -e s/// -e :l -e '/\\\\$/N' -e 's/\\\\\\n/ /' -e 't l' -e p \
+ -e '}' "${srcdir}/enc/Makefile.in"`"]
+BUILTIN_ENCOBJS=
+for e in $BUILTIN_ENCS; do BUILTIN_ENCOBJS="$BUILTIN_ENCOBJS "`echo $e | sed 's/\.c$/.$(OBJEXT)/'`; done
+AC_SUBST(BUILTIN_ENCOBJS)
+
+BUILTIN_TRANSES=["`sed -n -e '/^BUILTIN_TRANSES[ ]*=/{' \
+ -e s/// -e :l -e '/\\\\$/N' -e 's/\\\\\\n/ /' -e 't l' -e p \
+ -e '}' "${srcdir}/enc/Makefile.in"`"]
+BUILTIN_TRANSSRCS=
+BUILTIN_TRANSOBJS=
+for e in $BUILTIN_TRANSES; do
+ BUILTIN_TRANSSRCS="$BUILTIN_TRANSSRCS "`echo $e | sed 's/\.trans$/.c/'`
+ BUILTIN_TRANSOBJS="$BUILTIN_TRANSOBJS "`echo $e | sed 's/\.trans$/.$(OBJEXT)/'`
+done
+AC_SUBST(BUILTIN_TRANSSRCS)
+AC_SUBST(BUILTIN_TRANSOBJS)
+
+PACKAGE=$RUBY_BASE_NAME
+AC_SUBST(PACKAGE)
+AS_MESSAGE([$PACKAGE library version = $ruby_version])
+
+AS_CASE([" $CPP "], [*" $CC "*], [CPP=`echo " $CPP " | sed "s| $CC |"' $(CC) |;s/^ *//;s/ *$//'`])
+
+if test x"$firstmf" != x; then
+ AC_CONFIG_FILES($firstmf:$firsttmpl, [], [firstmf="$firstmf" firsttmpl="$firsttmpl"])
+fi
+AC_CONFIG_FILES(Makefile, [
+ tmpmk=confmk$$.tmp
+ {
+ if test ${VCS+set}; then
+ :
+ elif svn info "$srcdir" > /dev/null 2>&1; then
+ VCS='svn'
+ elif test -d "$srcdir/.git/svn"; then
+ VCS='git svn'
+ elif test -d "$srcdir/.git"; then
+ VCS='git'
+ else
+ VCS='echo cannot'
+ fi
+ AS_CASE("$VCS",
+ [svn], [VCSUP='$(VCS) up $(SVNUPOPTIONS)'],
+ ["git svn"], [VCSUP='$(VCS) rebase $(GITSVNREBASEOPTIONS)'],
+ [git], [VCSUP='$(VCS) pull $(GITPULLOPTIONS)'],
+ [VCSUP='$(VCS)'])
+ sed -n 's/^@%:@define \(RUBY_RELEASE_DATE\) "\(.*\)"/\1 = \2/p' "$srcdir/version.h"
+ sed '/^MISSING/s/\$U\././g;/^VCS *=/s#@VCS@#'"$VCS"'#;/^VCSUP *=/s#@VCSUP@#'"$VCSUP"'#' Makefile
+ echo; test x"$EXEEXT" = x || echo 'miniruby: miniruby$(EXEEXT)'
+ if test "$gnumake" != yes; then
+ echo ['$(MKFILES): $(srcdir)/common.mk']
+ sed ['s/{\$([^(){}]*)[^{}]*}//g'] ${srcdir}/common.mk
+ else
+ echo 'distclean-local::; @$(RM) GNUmakefile uncommon.mk'
+ fi
+ } > $tmpmk && if ! grep '^ruby:' $tmpmk > /dev/null; then
+ if test "${gnumake}" = yes; then
+ tmpgmk=confgmk$$.tmp
+ {
+ echo "include $tmpmk"
+ echo "-include uncommon.mk"
+ } > $tmpgmk
+ else
+ tmpgmk=$tmpmk
+ fi &&
+ test -z "`${MAKE-make} -f $tmpgmk info-program | grep '^PROGRAM=ruby$'`" &&
+ echo 'ruby: $(PROGRAM);' >> $tmpmk
+ test "$tmpmk" = "$tmpgmk" || rm -f "$tmpgmk"
+ fi && mv -f $tmpmk Makefile],
+[EXEEXT='$EXEEXT' gnumake='$gnumake'])
+
+AC_ARG_WITH([ruby-pc],
+ AC_HELP_STRING([--with-ruby-pc=FILENAME], [pc file basename]),
+ [ruby_pc="$withval"],
+ [ruby_pc="${RUBY_BASE_NAME}-${MAJOR}.${MINOR}.pc"])
+AC_SUBST(ruby_pc)
+AC_SUBST(exec, [exec])
+
+AC_ARG_WITH(destdir,
+ AS_HELP_STRING([--with-destdir=DESTDIR], [specify default directory to install]),
+ [DESTDIR="$withval"])
+AC_SUBST(DESTDIR)
+
+AC_CONFIG_FILES($ruby_pc:template/ruby.pc.in,
+ [
+ if sed ['s/\$(\([A-Za-z_][A-Za-z0-9_]*\))/${\1}/g;s/@[A-Za-z_][A-Za-z0-9_]*@//'] $ruby_pc > ruby.tmp.pc &&
+ {
+ test -z "$PKG_CONFIG" ||
+ PKG_CONFIG_PATH=. $PKG_CONFIG --print-errors ruby.tmp
+ }
+ then
+ mv -f ruby.tmp.pc $ruby_pc
+ else
+ exit 1
+ fi
+ ],
+ [ruby_pc='$ruby_pc' PKG_CONFIG='$PKG_CONFIG'])
+
+AC_OUTPUT
+}
+}
diff --git a/constant.h b/constant.h
index fcccf07384..23d17ac24c 100644
--- a/constant.h
+++ b/constant.h
@@ -38,7 +38,7 @@ typedef struct rb_const_entry_struct {
VALUE rb_mod_private_constant(int argc, const VALUE *argv, VALUE obj);
VALUE rb_mod_public_constant(int argc, const VALUE *argv, VALUE obj);
VALUE rb_mod_deprecate_constant(int argc, const VALUE *argv, VALUE obj);
-void rb_free_const_table(struct rb_id_table *tbl);
+void rb_free_const_table(st_table *tbl);
VALUE rb_public_const_get(VALUE klass, ID id);
VALUE rb_public_const_get_at(VALUE klass, ID id);
VALUE rb_public_const_get_from(VALUE klass, ID id);
@@ -46,6 +46,5 @@ int rb_public_const_defined(VALUE klass, ID id);
int rb_public_const_defined_at(VALUE klass, ID id);
int rb_public_const_defined_from(VALUE klass, ID id);
rb_const_entry_t *rb_const_lookup(VALUE klass, ID id);
-int rb_autoloading_value(VALUE mod, ID id, VALUE *value, rb_const_flag_t *flag);
#endif /* CONSTANT_H */
diff --git a/cont.c b/cont.c
index da469b6cd5..24b1a4cb1f 100644
--- a/cont.c
+++ b/cont.c
@@ -13,7 +13,6 @@
#include "vm_core.h"
#include "gc.h"
#include "eval_intern.h"
-#include "mjit.h"
/* FIBER_USE_NATIVE enables Fiber performance improvement using system
* dependent method such as make/setcontext on POSIX system or
@@ -26,27 +25,6 @@
* in Proc. of 51th Programming Symposium, pp.21--28 (2010) (in Japanese).
*/
-/*
- Enable FIBER_USE_COROUTINE to make fiber yield/resume much faster by using native assembly implementations.
-
- rvm install ruby-head-ioquatix-native-fiber --url https://github.com/ioquatix/ruby --branch native-fiber
-
- # Without libcoro
- koyoko% ./build/bin/ruby ./fiber_benchmark.rb 10000 1000
- setup time for 10000 fibers: 0.099961
- execution time for 1000 messages: 19.505909
-
- # With libcoro
- koyoko% ./build/bin/ruby ./fiber_benchmark.rb 10000 1000
- setup time for 10000 fibers: 0.099268
- execution time for 1000 messages: 8.491746
-*/
-
-#ifdef FIBER_USE_COROUTINE
-#include FIBER_USE_COROUTINE
-#define FIBER_USE_NATIVE 1
-#endif
-
#if !defined(FIBER_USE_NATIVE)
# if defined(HAVE_GETCONTEXT) && defined(HAVE_SETCONTEXT)
# if 0
@@ -76,7 +54,13 @@
# define FIBER_USE_NATIVE 1
# endif
# elif defined(_WIN32)
-# define FIBER_USE_NATIVE 1
+# if _WIN32_WINNT >= 0x0400
+/* only when _WIN32_WINNT >= 0x0400 on Windows because Fiber APIs are
+ * supported only such building (and running) environments.
+ * [ruby-dev:41192]
+ */
+# define FIBER_USE_NATIVE 1
+# endif
# endif
#endif
#if !defined(FIBER_USE_NATIVE)
@@ -98,15 +82,8 @@ static long pagesize;
enum context_type {
CONTINUATION_CONTEXT = 0,
- FIBER_CONTEXT = 1
-};
-
-struct cont_saved_vm_stack {
- VALUE *ptr;
-#ifdef CAPTURE_JUST_VALID_VM_STACK
- size_t slen; /* length of stack (head of ec->vm_stack) */
- size_t clen; /* length of control frames (tail of ec->vm_stack) */
-#endif
+ FIBER_CONTEXT = 1,
+ ROOT_FIBER_CONTEXT = 2
};
typedef struct rb_context_struct {
@@ -114,9 +91,11 @@ typedef struct rb_context_struct {
int argc;
VALUE self;
VALUE value;
-
- struct cont_saved_vm_stack saved_vm_stack;
-
+ VALUE *vm_stack;
+#ifdef CAPTURE_JUST_VALID_VM_STACK
+ size_t vm_stack_slen; /* length of stack (head of th->stack) */
+ size_t vm_stack_clen; /* length of control frames (tail of th->stack) */
+#endif
struct {
VALUE *stack;
VALUE *stack_src;
@@ -127,79 +106,43 @@ typedef struct rb_context_struct {
int register_stack_size;
#endif
} machine;
- rb_execution_context_t saved_ec;
+ rb_thread_t saved_thread; /* selected properties of GET_THREAD() (see cont_save_thread) */
rb_jmpbuf_t jmpbuf;
rb_ensure_entry_t *ensure_array;
- /* Pointer to MJIT info about the continuation. */
- struct mjit_cont *mjit_cont;
+ rb_ensure_list_t *ensure_list;
} rb_context_t;
-
-/*
- * Fiber status:
- * [Fiber.new] ------> FIBER_CREATED
- * | [Fiber#resume]
- * v
- * +--> FIBER_RESUMED ----+
- * [Fiber#resume] | | [Fiber.yield] |
- * | v |
- * +-- FIBER_SUSPENDED | [Terminate]
- * |
- * FIBER_TERMINATED <-+
- */
enum fiber_status {
- FIBER_CREATED,
- FIBER_RESUMED,
- FIBER_SUSPENDED,
- FIBER_TERMINATED
+ CREATED,
+ RUNNING,
+ TERMINATED
};
-#define FIBER_CREATED_P(fib) ((fib)->status == FIBER_CREATED)
-#define FIBER_RESUMED_P(fib) ((fib)->status == FIBER_RESUMED)
-#define FIBER_SUSPENDED_P(fib) ((fib)->status == FIBER_SUSPENDED)
-#define FIBER_TERMINATED_P(fib) ((fib)->status == FIBER_TERMINATED)
-#define FIBER_RUNNABLE_P(fib) (FIBER_CREATED_P(fib) || FIBER_SUSPENDED_P(fib))
-
-#if FIBER_USE_NATIVE && !defined(FIBER_USE_COROUTINE) && !defined(_WIN32)
-static inline int
-fiber_context_create(ucontext_t *context, void (*func)(), void *arg, void *ptr, size_t size)
-{
- if (getcontext(context) < 0) return -1;
- /*
- * getcontext() may fail by some reasons:
- * 1. SELinux policy banned one of "rt_sigprocmask",
- * "sigprocmask" or "swapcontext";
- * 2. libseccomp (aka. syscall filter) banned one of them.
- */
- context->uc_link = NULL;
- context->uc_stack.ss_sp = ptr;
- context->uc_stack.ss_size = size;
- makecontext(context, func, 0);
- return 0;
-}
+#if FIBER_USE_NATIVE && !defined(_WIN32)
+#define MAX_MACHINE_STACK_CACHE 10
+static int machine_stack_cache_index = 0;
+typedef struct machine_stack_cache_struct {
+ void *ptr;
+ size_t size;
+} machine_stack_cache_t;
+static machine_stack_cache_t machine_stack_cache[MAX_MACHINE_STACK_CACHE];
+static machine_stack_cache_t terminated_machine_stack;
#endif
struct rb_fiber_struct {
rb_context_t cont;
- VALUE first_proc;
struct rb_fiber_struct *prev;
- BITFIELD(enum fiber_status, status, 2);
+ enum fiber_status status;
/* If a fiber invokes "transfer",
* then this fiber can't "resume" any more after that.
* You shouldn't mix "transfer" and "resume".
*/
- unsigned int transferred : 1;
+ int transfered;
#if FIBER_USE_NATIVE
-#if defined(FIBER_USE_COROUTINE)
-#define FIBER_ALLOCATE_STACK
- coroutine_context context;
- void *ss_sp;
- size_t ss_size;
-#elif defined(_WIN32)
+#ifdef _WIN32
void *fib_handle;
#else
-#define FIBER_ALLOCATE_STACK
ucontext_t context;
/* Because context.uc_stack.ss_sp and context.uc_stack.ss_size
* are not necessarily valid after makecontext() or swapcontext(),
@@ -211,245 +154,124 @@ struct rb_fiber_struct {
#endif
};
-#ifdef FIBER_ALLOCATE_STACK
-#define MAX_MACHINE_STACK_CACHE 10
-static int machine_stack_cache_index = 0;
-typedef struct machine_stack_cache_struct {
- void *ptr;
- size_t size;
-} machine_stack_cache_t;
-static machine_stack_cache_t machine_stack_cache[MAX_MACHINE_STACK_CACHE];
-static machine_stack_cache_t terminated_machine_stack;
-#endif
-
-static const char *
-fiber_status_name(enum fiber_status s)
-{
- switch (s) {
- case FIBER_CREATED: return "created";
- case FIBER_RESUMED: return "resumed";
- case FIBER_SUSPENDED: return "suspended";
- case FIBER_TERMINATED: return "terminated";
- }
- VM_UNREACHABLE(fiber_status_name);
- return NULL;
-}
-
-static void
-fiber_verify(const rb_fiber_t *fib)
-{
-#if VM_CHECK_MODE > 0
- VM_ASSERT(fib->cont.saved_ec.fiber_ptr == fib);
-
- switch (fib->status) {
- case FIBER_RESUMED:
- VM_ASSERT(fib->cont.saved_ec.vm_stack != NULL);
- break;
- case FIBER_SUSPENDED:
- VM_ASSERT(fib->cont.saved_ec.vm_stack != NULL);
- break;
- case FIBER_CREATED:
- case FIBER_TERMINATED:
- /* TODO */
- break;
- default:
- VM_UNREACHABLE(fiber_verify);
- }
-#endif
-}
-
-#if VM_CHECK_MODE > 0
-void
-rb_ec_verify(const rb_execution_context_t *ec)
-{
- /* TODO */
-}
-#endif
-
-static void
-fiber_status_set(rb_fiber_t *fib, enum fiber_status s)
-{
- if (0) fprintf(stderr, "fib: %p, status: %s -> %s\n", (void *)fib, fiber_status_name(fib->status), fiber_status_name(s));
- VM_ASSERT(!FIBER_TERMINATED_P(fib));
- VM_ASSERT(fib->status != s);
- fiber_verify(fib);
- fib->status = s;
-}
-
-void
-rb_ec_set_vm_stack(rb_execution_context_t *ec, VALUE *stack, size_t size)
-{
- ec->vm_stack = stack;
- ec->vm_stack_size = size;
-}
-
-static inline void
-ec_switch(rb_thread_t *th, rb_fiber_t *fib)
-{
- rb_execution_context_t *ec = &fib->cont.saved_ec;
-
- ruby_current_execution_context_ptr = th->ec = ec;
-
- /*
- * timer-thread may set trap interrupt on previous th->ec at any time;
- * ensure we do not delay (or lose) the trap interrupt handling.
- */
- if (th->vm->main_thread == th && rb_signal_buff_size() > 0) {
- RUBY_VM_SET_TRAP_INTERRUPT(ec);
- }
-
- VM_ASSERT(ec->fiber_ptr->cont.self == 0 || ec->vm_stack != NULL);
-}
-
static const rb_data_type_t cont_data_type, fiber_data_type;
static VALUE rb_cContinuation;
static VALUE rb_cFiber;
static VALUE rb_eFiberError;
-static rb_context_t *
-cont_ptr(VALUE obj)
-{
- rb_context_t *cont;
+#define GetContPtr(obj, ptr) \
+ TypedData_Get_Struct((obj), rb_context_t, &cont_data_type, (ptr))
- TypedData_Get_Struct(obj, rb_context_t, &cont_data_type, cont);
+#define GetFiberPtr(obj, ptr) do {\
+ TypedData_Get_Struct((obj), rb_fiber_t, &fiber_data_type, (ptr)); \
+ if (!(ptr)) rb_raise(rb_eFiberError, "uninitialized fiber"); \
+} while (0)
- return cont;
-}
-
-static rb_fiber_t *
-fiber_ptr(VALUE obj)
-{
- rb_fiber_t *fib;
-
- TypedData_Get_Struct(obj, rb_fiber_t, &fiber_data_type, fib);
- if (!fib) rb_raise(rb_eFiberError, "uninitialized fiber");
-
- return fib;
-}
-
-NOINLINE(static VALUE cont_capture(volatile int *volatile stat));
+NOINLINE(static VALUE cont_capture(volatile int *stat));
#define THREAD_MUST_BE_RUNNING(th) do { \
- if (!(th)->ec->tag) rb_raise(rb_eThreadError, "not running thread"); \
+ if (!(th)->tag) rb_raise(rb_eThreadError, "not running thread"); \
} while (0)
-static VALUE
-cont_thread_value(const rb_context_t *cont)
-{
- return cont->saved_ec.thread_ptr->self;
-}
-
static void
cont_mark(void *ptr)
{
- rb_context_t *cont = ptr;
-
RUBY_MARK_ENTER("cont");
- rb_gc_mark(cont->value);
-
- rb_execution_context_mark(&cont->saved_ec);
- rb_gc_mark(cont_thread_value(cont));
+ if (ptr) {
+ rb_context_t *cont = ptr;
+ rb_gc_mark(cont->value);
+ rb_thread_mark(&cont->saved_thread);
+ rb_gc_mark(cont->saved_thread.self);
- if (cont->saved_vm_stack.ptr) {
+ if (cont->vm_stack) {
#ifdef CAPTURE_JUST_VALID_VM_STACK
- rb_gc_mark_locations(cont->saved_vm_stack.ptr,
- cont->saved_vm_stack.ptr + cont->saved_vm_stack.slen + cont->saved_vm_stack.clen);
+ rb_gc_mark_locations(cont->vm_stack,
+ cont->vm_stack + cont->vm_stack_slen + cont->vm_stack_clen);
#else
- rb_gc_mark_locations(cont->saved_vm_stack.ptr,
- cont->saved_vm_stack.ptr, cont->saved_ec.stack_size);
+ rb_gc_mark_locations(cont->vm_stack,
+ cont->vm_stack, cont->saved_thread.stack_size);
#endif
- }
-
- if (cont->machine.stack) {
- if (cont->type == CONTINUATION_CONTEXT) {
- /* cont */
- rb_gc_mark_locations(cont->machine.stack,
- cont->machine.stack + cont->machine.stack_size);
}
- else {
- /* fiber */
- const rb_fiber_t *fib = (rb_fiber_t*)cont;
- if (!FIBER_TERMINATED_P(fib)) {
+ if (cont->machine.stack) {
+ if (cont->type == CONTINUATION_CONTEXT) {
+ /* cont */
rb_gc_mark_locations(cont->machine.stack,
cont->machine.stack + cont->machine.stack_size);
+ }
+ else {
+ /* fiber */
+ rb_thread_t *th;
+ rb_fiber_t *fib = (rb_fiber_t*)cont;
+ GetThreadPtr(cont->saved_thread.self, th);
+ if ((th->fiber != fib) && fib->status == RUNNING) {
+ rb_gc_mark_locations(cont->machine.stack,
+ cont->machine.stack + cont->machine.stack_size);
+ }
}
}
- }
#ifdef __ia64
- if (cont->machine.register_stack) {
- rb_gc_mark_locations(cont->machine.register_stack,
- cont->machine.register_stack + cont->machine.register_stack_size);
- }
+ if (cont->machine.register_stack) {
+ rb_gc_mark_locations(cont->machine.register_stack,
+ cont->machine.register_stack + cont->machine.register_stack_size);
+ }
#endif
-
+ }
RUBY_MARK_LEAVE("cont");
}
-static int
-fiber_is_root_p(const rb_fiber_t *fib)
-{
- return fib == fib->cont.saved_ec.thread_ptr->root_fiber;
-}
-
static void
cont_free(void *ptr)
{
- rb_context_t *cont = ptr;
-
RUBY_FREE_ENTER("cont");
- ruby_xfree(cont->saved_ec.vm_stack);
-
+ if (ptr) {
+ rb_context_t *cont = ptr;
+ RUBY_FREE_UNLESS_NULL(cont->saved_thread.stack);
#if FIBER_USE_NATIVE
- if (cont->type == CONTINUATION_CONTEXT) {
- /* cont */
- ruby_xfree(cont->ensure_array);
- RUBY_FREE_UNLESS_NULL(cont->machine.stack);
- }
- else {
- /* fiber */
- rb_fiber_t *fib = (rb_fiber_t*)cont;
-#if defined(FIBER_USE_COROUTINE)
- coroutine_destroy(&fib->context);
- if (fib->ss_sp != NULL) {
- if (fiber_is_root_p(fib)) {
- rb_bug("Illegal root fiber parameter");
- }
-#ifdef _WIN32
- VirtualFree((void*)fib->ss_sp, 0, MEM_RELEASE);
-#else
- munmap((void*)fib->ss_sp, fib->ss_size);
-#endif
- fib->ss_sp = NULL;
+ if (cont->type == CONTINUATION_CONTEXT) {
+ /* cont */
+ ruby_xfree(cont->ensure_array);
+ RUBY_FREE_UNLESS_NULL(cont->machine.stack);
}
-#elif defined(_WIN32)
- if (!fiber_is_root_p(fib)) {
- /* don't delete root fiber handle */
- if (fib->fib_handle) {
- DeleteFiber(fib->fib_handle);
+ else {
+ /* fiber */
+ rb_fiber_t *fib = (rb_fiber_t*)cont;
+ const rb_thread_t *const th = GET_THREAD();
+#ifdef _WIN32
+ if (th && th->fiber != fib && cont->type != ROOT_FIBER_CONTEXT) {
+ /* don't delete root fiber handle */
+ if (fib->fib_handle) {
+ DeleteFiber(fib->fib_handle);
+ }
}
- }
#else /* not WIN32 */
- /* fib->ss_sp == NULL is possible for root fiber */
- if (fib->ss_sp != NULL) {
- munmap((void*)fib->ss_sp, fib->ss_size);
- }
+ if (th && th->fiber != fib) {
+ if (fib->ss_sp) {
+ if (cont->type == ROOT_FIBER_CONTEXT) {
+ rb_bug("Illegal root fiber parameter");
+ }
+ munmap((void*)fib->ss_sp, fib->ss_size);
+ }
+ }
+ else {
+ /* It may reached here when finalize */
+ /* TODO examine whether it is a bug */
+ /* rb_bug("cont_free: release self"); */
+ }
#endif
- }
+ }
#else /* not FIBER_USE_NATIVE */
- ruby_xfree(cont->ensure_array);
- RUBY_FREE_UNLESS_NULL(cont->machine.stack);
+ ruby_xfree(cont->ensure_array);
+ RUBY_FREE_UNLESS_NULL(cont->machine.stack);
#endif
#ifdef __ia64
- RUBY_FREE_UNLESS_NULL(cont->machine.register_stack);
+ RUBY_FREE_UNLESS_NULL(cont->machine.register_stack);
#endif
- RUBY_FREE_UNLESS_NULL(cont->saved_vm_stack.ptr);
+ RUBY_FREE_UNLESS_NULL(cont->vm_stack);
- if (mjit_enabled && cont->mjit_cont != NULL) {
- mjit_cont_free(cont->mjit_cont);
+ /* free rb_cont_t or rb_fiber_t */
+ ruby_xfree(ptr);
}
- /* free rb_cont_t or rb_fiber_t */
- ruby_xfree(ptr);
RUBY_FREE_LEAVE("cont");
}
@@ -460,13 +282,13 @@ cont_memsize(const void *ptr)
size_t size = 0;
size = sizeof(*cont);
- if (cont->saved_vm_stack.ptr) {
+ if (cont->vm_stack) {
#ifdef CAPTURE_JUST_VALID_VM_STACK
- size_t n = (cont->saved_vm_stack.slen + cont->saved_vm_stack.clen);
+ size_t n = (cont->vm_stack_slen + cont->vm_stack_clen);
#else
- size_t n = cont->saved_ec.vm_stack_size;
+ size_t n = cont->saved_thread.stack_size;
#endif
- size += n * sizeof(*cont->saved_vm_stack.ptr);
+ size += n * sizeof(*cont->vm_stack);
}
if (cont->machine.stack) {
@@ -481,49 +303,37 @@ cont_memsize(const void *ptr)
}
void
-rb_fiber_mark_self(const rb_fiber_t *fib)
+rb_fiber_mark_self(rb_fiber_t *fib)
{
- if (fib->cont.self) {
+ if (fib)
rb_gc_mark(fib->cont.self);
- }
- else {
- rb_execution_context_mark(&fib->cont.saved_ec);
- }
}
static void
fiber_mark(void *ptr)
{
- rb_fiber_t *fib = ptr;
RUBY_MARK_ENTER("cont");
- fiber_verify(fib);
- rb_gc_mark(fib->first_proc);
- if (fib->prev) rb_fiber_mark_self(fib->prev);
-
-#if !FIBER_USE_NATIVE
- if (fib->status == FIBER_TERMINATED) {
- /* FIBER_TERMINATED fiber should not mark machine stack */
- if (fib->cont.saved_ec.machine.stack_end != NULL) {
- fib->cont.saved_ec.machine.stack_end = NULL;
- }
+ if (ptr) {
+ rb_fiber_t *fib = ptr;
+ rb_fiber_mark_self(fib->prev);
+ cont_mark(&fib->cont);
}
-#endif
-
- cont_mark(&fib->cont);
RUBY_MARK_LEAVE("cont");
}
static void
fiber_free(void *ptr)
{
- rb_fiber_t *fib = ptr;
RUBY_FREE_ENTER("fiber");
+ if (ptr) {
+ rb_fiber_t *fib = ptr;
+ if (fib->cont.type != ROOT_FIBER_CONTEXT &&
+ fib->cont.saved_thread.local_storage) {
+ st_free_table(fib->cont.saved_thread.local_storage);
+ }
- if (fib->cont.saved_ec.local_storage) {
- st_free_table(fib->cont.saved_ec.local_storage);
+ cont_free(&fib->cont);
}
-
- cont_free(&fib->cont);
RUBY_FREE_LEAVE("fiber");
}
@@ -531,15 +341,12 @@ static size_t
fiber_memsize(const void *ptr)
{
const rb_fiber_t *fib = ptr;
- size_t size = sizeof(*fib);
- const rb_execution_context_t *saved_ec = &fib->cont.saved_ec;
- const rb_thread_t *th = rb_ec_thread_ptr(saved_ec);
+ size_t size = 0;
- /*
- * vm.c::thread_memsize already counts th->ec->local_storage
- */
- if (saved_ec->local_storage && fib != th->root_fiber) {
- size += st_memsize(saved_ec->local_storage);
+ size = sizeof(*fib);
+ if (fib->cont.type != ROOT_FIBER_CONTEXT &&
+ fib->cont.saved_thread.local_storage != NULL) {
+ size += st_memsize(fib->cont.saved_thread.local_storage);
}
size += cont_memsize(&fib->cont);
return size;
@@ -561,18 +368,18 @@ cont_save_machine_stack(rb_thread_t *th, rb_context_t *cont)
{
size_t size;
- SET_MACHINE_STACK_END(&th->ec->machine.stack_end);
+ SET_MACHINE_STACK_END(&th->machine.stack_end);
#ifdef __ia64
- th->ec->machine.register_stack_end = rb_ia64_bsp();
+ th->machine.register_stack_end = rb_ia64_bsp();
#endif
- if (th->ec->machine.stack_start > th->ec->machine.stack_end) {
- size = cont->machine.stack_size = th->ec->machine.stack_start - th->ec->machine.stack_end;
- cont->machine.stack_src = th->ec->machine.stack_end;
+ if (th->machine.stack_start > th->machine.stack_end) {
+ size = cont->machine.stack_size = th->machine.stack_start - th->machine.stack_end;
+ cont->machine.stack_src = th->machine.stack_end;
}
else {
- size = cont->machine.stack_size = th->ec->machine.stack_end - th->ec->machine.stack_start;
- cont->machine.stack_src = th->ec->machine.stack_start;
+ size = cont->machine.stack_size = th->machine.stack_end - th->machine.stack_start;
+ cont->machine.stack_src = th->machine.stack_start;
}
if (cont->machine.stack) {
@@ -587,8 +394,8 @@ cont_save_machine_stack(rb_thread_t *th, rb_context_t *cont)
#ifdef __ia64
rb_ia64_flushrs();
- size = cont->machine.register_stack_size = th->ec->machine.register_stack_end - th->ec->machine.register_stack_start;
- cont->machine.register_stack_src = th->ec->machine.register_stack_start;
+ size = cont->machine.register_stack_size = th->machine.register_stack_end - th->machine.register_stack_start;
+ cont->machine.register_stack_src = th->machine.register_stack_start;
if (cont->machine.register_stack) {
REALLOC_N(cont->machine.register_stack, VALUE, size);
}
@@ -609,20 +416,34 @@ static const rb_data_type_t cont_data_type = {
static inline void
cont_save_thread(rb_context_t *cont, rb_thread_t *th)
{
- rb_execution_context_t *sec = &cont->saved_ec;
-
- VM_ASSERT(th->status == THREAD_RUNNABLE);
+ rb_thread_t *sth = &cont->saved_thread;
/* save thread context */
- *sec = *th->ec;
-
- /* saved_ec->machine.stack_end should be NULL */
+ sth->stack = th->stack;
+ sth->stack_size = th->stack_size;
+ sth->local_storage = th->local_storage;
+ sth->cfp = th->cfp;
+ sth->safe_level = th->safe_level;
+ sth->raised_flag = th->raised_flag;
+ sth->state = th->state;
+ sth->status = th->status;
+ sth->tag = th->tag;
+ sth->protect_tag = th->protect_tag;
+ sth->errinfo = th->errinfo;
+ sth->first_proc = th->first_proc;
+ sth->root_lep = th->root_lep;
+ sth->root_svar = th->root_svar;
+ sth->ensure_list = th->ensure_list;
+
+ sth->trace_arg = th->trace_arg;
+
+ /* saved_thread->machine.stack_(start|end) should be NULL */
/* because it may happen GC afterward */
- sec->machine.stack_end = NULL;
-
+ sth->machine.stack_start = 0;
+ sth->machine.stack_end = 0;
#ifdef __ia64
- sec->machine.register_stack_start = NULL;
- sec->machine.register_stack_end = NULL;
+ sth->machine.register_stack_start = 0;
+ sth->machine.register_stack_end = 0;
#endif
}
@@ -631,13 +452,12 @@ cont_init(rb_context_t *cont, rb_thread_t *th)
{
/* save thread context */
cont_save_thread(cont, th);
- cont->saved_ec.thread_ptr = th;
- cont->saved_ec.local_storage = NULL;
- cont->saved_ec.local_storage_recursive_hash = Qnil;
- cont->saved_ec.local_storage_recursive_hash_for_trace = Qnil;
- if (mjit_enabled) {
- cont->mjit_cont = mjit_cont_new(&cont->saved_ec);
- }
+ cont->saved_thread.self = th->self;
+ cont->saved_thread.machine.stack_maxsize = th->machine.stack_maxsize;
+ cont->saved_thread.fiber = th->fiber;
+ cont->saved_thread.local_storage = 0;
+ cont->saved_thread.local_storage_recursive_hash = Qnil;
+ cont->saved_thread.local_storage_recursive_hash_for_trace = Qnil;
}
static rb_context_t *
@@ -654,66 +474,30 @@ cont_new(VALUE klass)
return cont;
}
-#if 0
-void
-show_vm_stack(const rb_execution_context_t *ec)
-{
- VALUE *p = ec->vm_stack;
- while (p < ec->cfp->sp) {
- fprintf(stderr, "%3d ", (int)(p - ec->vm_stack));
- rb_obj_info_dump(*p);
- p++;
- }
-}
-
-void
-show_vm_pcs(const rb_control_frame_t *cfp,
- const rb_control_frame_t *end_of_cfp)
-{
- int i=0;
- while (cfp != end_of_cfp) {
- int pc = 0;
- if (cfp->iseq) {
- pc = cfp->pc - cfp->iseq->body->iseq_encoded;
- }
- fprintf(stderr, "%2d pc: %d\n", i++, pc);
- cfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp);
- }
-}
-#endif
-COMPILER_WARNING_PUSH
-#ifdef __clang__
-COMPILER_WARNING_IGNORED(-Wduplicate-decl-specifier)
-#endif
static VALUE
-cont_capture(volatile int *volatile stat)
+cont_capture(volatile int *stat)
{
- rb_context_t *volatile cont;
+ rb_context_t *cont;
rb_thread_t *th = GET_THREAD();
volatile VALUE contval;
- const rb_execution_context_t *ec = th->ec;
THREAD_MUST_BE_RUNNING(th);
- rb_vm_stack_to_heap(th->ec);
+ rb_vm_stack_to_heap(th);
cont = cont_new(rb_cContinuation);
contval = cont->self;
#ifdef CAPTURE_JUST_VALID_VM_STACK
- cont->saved_vm_stack.slen = ec->cfp->sp - ec->vm_stack;
- cont->saved_vm_stack.clen = ec->vm_stack + ec->vm_stack_size - (VALUE*)ec->cfp;
- cont->saved_vm_stack.ptr = ALLOC_N(VALUE, cont->saved_vm_stack.slen + cont->saved_vm_stack.clen);
- MEMCPY(cont->saved_vm_stack.ptr,
- ec->vm_stack,
- VALUE, cont->saved_vm_stack.slen);
- MEMCPY(cont->saved_vm_stack.ptr + cont->saved_vm_stack.slen,
- (VALUE*)ec->cfp,
- VALUE,
- cont->saved_vm_stack.clen);
+ cont->vm_stack_slen = th->cfp->sp - th->stack;
+ cont->vm_stack_clen = th->stack + th->stack_size - (VALUE*)th->cfp;
+ cont->vm_stack = ALLOC_N(VALUE, cont->vm_stack_slen + cont->vm_stack_clen);
+ MEMCPY(cont->vm_stack, th->stack, VALUE, cont->vm_stack_slen);
+ MEMCPY(cont->vm_stack + cont->vm_stack_slen, (VALUE*)th->cfp, VALUE, cont->vm_stack_clen);
#else
- cont->saved_vm_stack.ptr = ALLOC_N(VALUE, ec->vm_stack_size);
- MEMCPY(cont->saved_vm_stack.ptr, ec->vm_stack, VALUE, ec->vm_stack_size);
+ cont->vm_stack = ALLOC_N(VALUE, th->stack_size);
+ MEMCPY(cont->vm_stack, th->stack, VALUE, th->stack_size);
#endif
- rb_ec_set_vm_stack(&cont->saved_ec, NULL, 0);
+ cont->saved_thread.stack = 0;
+
cont_save_machine_stack(th, cont);
/* backup ensure_list to array for search in another context */
@@ -721,10 +505,10 @@ cont_capture(volatile int *volatile stat)
rb_ensure_list_t *p;
int size = 0;
rb_ensure_entry_t *entry;
- for (p=th->ec->ensure_list; p; p=p->next)
+ for (p=th->ensure_list; p; p=p->next)
size++;
entry = cont->ensure_array = ALLOC_N(rb_ensure_entry_t,size+1);
- for (p=th->ec->ensure_list; p; p=p->next) {
+ for (p=th->ensure_list; p; p=p->next) {
if (!p->entry.marker)
p->entry.marker = rb_ary_tmp_new(0); /* dummy object */
*entry++ = p->entry;
@@ -747,79 +531,59 @@ cont_capture(volatile int *volatile stat)
return contval;
}
}
-COMPILER_WARNING_POP
-
-static inline void
-fiber_restore_thread(rb_thread_t *th, rb_fiber_t *fib)
-{
- ec_switch(th, fib);
- VM_ASSERT(th->ec->fiber_ptr == fib);
-}
static inline void
cont_restore_thread(rb_context_t *cont)
{
- rb_thread_t *th = GET_THREAD();
+ rb_thread_t *th = GET_THREAD(), *sth = &cont->saved_thread;
/* restore thread context */
if (cont->type == CONTINUATION_CONTEXT) {
/* continuation */
- rb_execution_context_t *sec = &cont->saved_ec;
- rb_fiber_t *fib = NULL;
+ rb_fiber_t *fib;
- if (sec->fiber_ptr != NULL) {
- fib = sec->fiber_ptr;
- }
- else if (th->root_fiber) {
- fib = th->root_fiber;
- }
+ th->fiber = sth->fiber;
+ fib = th->fiber ? th->fiber : th->root_fiber;
- if (fib && th->ec != &fib->cont.saved_ec) {
- ec_switch(th, fib);
+ if (fib) {
+ th->stack_size = fib->cont.saved_thread.stack_size;
+ th->stack = fib->cont.saved_thread.stack;
}
-
- if (th->ec->trace_arg != sec->trace_arg) {
- rb_raise(rb_eRuntimeError, "can't call across trace_func");
- }
-
- /* copy vm stack */
#ifdef CAPTURE_JUST_VALID_VM_STACK
- MEMCPY(th->ec->vm_stack,
- cont->saved_vm_stack.ptr,
- VALUE, cont->saved_vm_stack.slen);
- MEMCPY(th->ec->vm_stack + th->ec->vm_stack_size - cont->saved_vm_stack.clen,
- cont->saved_vm_stack.ptr + cont->saved_vm_stack.slen,
- VALUE, cont->saved_vm_stack.clen);
+ MEMCPY(th->stack, cont->vm_stack, VALUE, cont->vm_stack_slen);
+ MEMCPY(th->stack + sth->stack_size - cont->vm_stack_clen,
+ cont->vm_stack + cont->vm_stack_slen, VALUE, cont->vm_stack_clen);
#else
- MEMCPY(th->ec->vm_stack, cont->saved_vm_stack.ptr, VALUE, sec->vm_stack_size);
+ MEMCPY(th->stack, cont->vm_stack, VALUE, sth->stack_size);
#endif
- /* other members of ec */
-
- th->ec->cfp = sec->cfp;
- th->ec->raised_flag = sec->raised_flag;
- th->ec->tag = sec->tag;
- th->ec->protect_tag = sec->protect_tag;
- th->ec->root_lep = sec->root_lep;
- th->ec->root_svar = sec->root_svar;
- th->ec->ensure_list = sec->ensure_list;
- th->ec->errinfo = sec->errinfo;
-
- VM_ASSERT(th->ec->vm_stack != NULL);
}
else {
/* fiber */
- fiber_restore_thread(th, (rb_fiber_t*)cont);
+ th->stack = sth->stack;
+ th->stack_size = sth->stack_size;
+ th->local_storage = sth->local_storage;
+ th->local_storage_recursive_hash = sth->local_storage_recursive_hash;
+ th->local_storage_recursive_hash_for_trace = sth->local_storage_recursive_hash_for_trace;
+ th->fiber = (rb_fiber_t*)cont;
}
+
+ th->cfp = sth->cfp;
+ th->safe_level = sth->safe_level;
+ th->raised_flag = sth->raised_flag;
+ th->state = sth->state;
+ th->status = sth->status;
+ th->tag = sth->tag;
+ th->protect_tag = sth->protect_tag;
+ th->errinfo = sth->errinfo;
+ th->first_proc = sth->first_proc;
+ th->root_lep = sth->root_lep;
+ th->root_svar = sth->root_svar;
+ th->ensure_list = sth->ensure_list;
+
}
#if FIBER_USE_NATIVE
-#if defined(FIBER_USE_COROUTINE)
-static COROUTINE
-fiber_entry(coroutine_context * from, coroutine_context * to)
-{
- rb_fiber_start();
-}
-#elif defined(_WIN32)
+#ifdef _WIN32
static void
fiber_set_stack_location(void)
{
@@ -827,27 +591,17 @@ fiber_set_stack_location(void)
VALUE *ptr;
SET_MACHINE_STACK_END(&ptr);
- th->ec->machine.stack_start = (void*)(((VALUE)ptr & RB_PAGE_MASK) + STACK_UPPER((void *)&ptr, 0, RB_PAGE_SIZE));
+ th->machine.stack_start = (void*)(((VALUE)ptr & RB_PAGE_MASK) + STACK_UPPER((void *)&ptr, 0, RB_PAGE_SIZE));
}
-NORETURN(static VOID CALLBACK fiber_entry(void *arg));
static VOID CALLBACK
fiber_entry(void *arg)
{
fiber_set_stack_location();
rb_fiber_start();
}
-#else
-NORETURN(static void fiber_entry(void *arg));
-static void
-fiber_entry(void *arg)
-{
- rb_fiber_start();
-}
-#endif
-#endif
+#else /* _WIN32 */
-#ifdef FIBER_ALLOCATE_STACK
/*
* FreeBSD require a first (i.e. addr) argument of mmap(2) is not NULL
* if MAP_STACK is passed.
@@ -859,77 +613,51 @@ fiber_entry(void *arg)
#define FIBER_STACK_FLAGS (MAP_PRIVATE | MAP_ANON)
#endif
-#define ERRNOMSG strerror(errno)
-
static char*
fiber_machine_stack_alloc(size_t size)
{
char *ptr;
-#ifdef _WIN32
- DWORD old_protect;
-#endif
if (machine_stack_cache_index > 0) {
- if (machine_stack_cache[machine_stack_cache_index - 1].size == (size / sizeof(VALUE))) {
- ptr = machine_stack_cache[machine_stack_cache_index - 1].ptr;
- machine_stack_cache_index--;
- machine_stack_cache[machine_stack_cache_index].ptr = NULL;
- machine_stack_cache[machine_stack_cache_index].size = 0;
- } else {
+ if (machine_stack_cache[machine_stack_cache_index - 1].size == (size / sizeof(VALUE))) {
+ ptr = machine_stack_cache[machine_stack_cache_index - 1].ptr;
+ machine_stack_cache_index--;
+ machine_stack_cache[machine_stack_cache_index].ptr = NULL;
+ machine_stack_cache[machine_stack_cache_index].size = 0;
+ }
+ else{
/* TODO handle multiple machine stack size */
- rb_bug("machine_stack_cache size is not canonicalized");
- }
- } else {
-#ifdef _WIN32
- ptr = VirtualAlloc(0, size, MEM_COMMIT, PAGE_READWRITE);
+ rb_bug("machine_stack_cache size is not canonicalized");
+ }
+ }
+ else {
+ void *page;
+ STACK_GROW_DIR_DETECTION;
- if (!ptr) {
- rb_raise(rb_eFiberError, "can't allocate machine stack to fiber: %s", ERRNOMSG);
- }
+ errno = 0;
+ ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, FIBER_STACK_FLAGS, -1, 0);
+ if (ptr == MAP_FAILED) {
+ rb_raise(rb_eFiberError, "can't alloc machine stack to fiber: %s", strerror(errno));
+ }
- if (!VirtualProtect(ptr, RB_PAGE_SIZE, PAGE_READWRITE | PAGE_GUARD, &old_protect)) {
- rb_raise(rb_eFiberError, "can't set a guard page: %s", ERRNOMSG);
- }
-#else
- void *page;
- STACK_GROW_DIR_DETECTION;
-
- errno = 0;
- ptr = mmap(NULL, size, PROT_READ | PROT_WRITE, FIBER_STACK_FLAGS, -1, 0);
- if (ptr == MAP_FAILED) {
- rb_raise(rb_eFiberError, "can't alloc machine stack to fiber: %s", ERRNOMSG);
- }
-
- /* guard page setup */
- page = ptr + STACK_DIR_UPPER(size - RB_PAGE_SIZE, 0);
- if (mprotect(page, RB_PAGE_SIZE, PROT_NONE) < 0) {
- rb_raise(rb_eFiberError, "can't set a guard page: %s", ERRNOMSG);
- }
-#endif
+ /* guard page setup */
+ page = ptr + STACK_DIR_UPPER(size - RB_PAGE_SIZE, 0);
+ if (mprotect(page, RB_PAGE_SIZE, PROT_NONE) < 0) {
+ rb_raise(rb_eFiberError, "mprotect failed");
+ }
}
return ptr;
}
#endif
-#if FIBER_USE_NATIVE
static void
fiber_initialize_machine_stack_context(rb_fiber_t *fib, size_t size)
{
- rb_execution_context_t *sec = &fib->cont.saved_ec;
-
-#if defined(FIBER_USE_COROUTINE)
- char *ptr;
- STACK_GROW_DIR_DETECTION;
+ rb_thread_t *sth = &fib->cont.saved_thread;
- ptr = fiber_machine_stack_alloc(size);
- fib->ss_sp = ptr;
- fib->ss_size = size;
- coroutine_initialize(&fib->context, fiber_entry, ptr+size, size);
- sec->machine.stack_start = (VALUE*)(ptr + STACK_DIR_UPPER(0, size));
- sec->machine.stack_maxsize = size - RB_PAGE_SIZE;
-#elif defined(_WIN32)
-# if defined(_MSC_VER) && _MSC_VER <= 1200
+#ifdef _WIN32
+# if defined(_MSC_VER) && _MSC_VER <= 0x1200
# define CreateFiberEx(cs, stacksize, flags, entry, param) \
CreateFiber((stacksize), (entry), (param))
# endif
@@ -942,19 +670,22 @@ fiber_initialize_machine_stack_context(rb_fiber_t *fib, size_t size)
rb_raise(rb_eFiberError, "can't create fiber");
}
}
- sec->machine.stack_maxsize = size;
+ sth->machine.stack_maxsize = size;
#else /* not WIN32 */
+ ucontext_t *context = &fib->context;
char *ptr;
STACK_GROW_DIR_DETECTION;
+ getcontext(context);
ptr = fiber_machine_stack_alloc(size);
+ context->uc_link = NULL;
+ context->uc_stack.ss_sp = ptr;
+ context->uc_stack.ss_size = size;
fib->ss_sp = ptr;
fib->ss_size = size;
- if (fiber_context_create(&fib->context, fiber_entry, NULL, fib->ss_sp, fib->ss_size)) {
- rb_raise(rb_eFiberError, "can't get context for creating fiber: %s", ERRNOMSG);
- }
- sec->machine.stack_start = (VALUE*)(ptr + STACK_DIR_UPPER(0, size));
- sec->machine.stack_maxsize = size - RB_PAGE_SIZE;
+ makecontext(context, rb_fiber_start, 0);
+ sth->machine.stack_start = (VALUE*)(ptr + STACK_DIR_UPPER(0, size));
+ sth->machine.stack_maxsize = size - RB_PAGE_SIZE;
#endif
#ifdef __ia64
sth->machine.register_stack_maxsize = sth->machine.stack_maxsize;
@@ -966,44 +697,51 @@ NOINLINE(static void fiber_setcontext(rb_fiber_t *newfib, rb_fiber_t *oldfib));
static void
fiber_setcontext(rb_fiber_t *newfib, rb_fiber_t *oldfib)
{
- rb_thread_t *th = GET_THREAD();
+ rb_thread_t *th = GET_THREAD(), *sth = &newfib->cont.saved_thread;
+
+ if (newfib->status != RUNNING) {
+ fiber_initialize_machine_stack_context(newfib, th->vm->default_params.fiber_machine_stack_size);
+ }
+
+ /* restore thread context */
+ cont_restore_thread(&newfib->cont);
+ th->machine.stack_maxsize = sth->machine.stack_maxsize;
+ if (sth->machine.stack_end && (newfib != oldfib)) {
+ rb_bug("fiber_setcontext: sth->machine.stack_end has non zero value");
+ }
- /* save oldfib's machine stack / TODO: is it needed? */
- if (!FIBER_TERMINATED_P(oldfib)) {
+ /* save oldfib's machine stack */
+ if (oldfib->status != TERMINATED) {
STACK_GROW_DIR_DETECTION;
- SET_MACHINE_STACK_END(&th->ec->machine.stack_end);
+ SET_MACHINE_STACK_END(&th->machine.stack_end);
if (STACK_DIR_UPPER(0, 1)) {
- oldfib->cont.machine.stack_size = th->ec->machine.stack_start - th->ec->machine.stack_end;
- oldfib->cont.machine.stack = th->ec->machine.stack_end;
+ oldfib->cont.machine.stack_size = th->machine.stack_start - th->machine.stack_end;
+ oldfib->cont.machine.stack = th->machine.stack_end;
}
else {
- oldfib->cont.machine.stack_size = th->ec->machine.stack_end - th->ec->machine.stack_start;
- oldfib->cont.machine.stack = th->ec->machine.stack_start;
+ oldfib->cont.machine.stack_size = th->machine.stack_end - th->machine.stack_start;
+ oldfib->cont.machine.stack = th->machine.stack_start;
}
}
-
/* exchange machine_stack_start between oldfib and newfib */
- oldfib->cont.saved_ec.machine.stack_start = th->ec->machine.stack_start;
-
+ oldfib->cont.saved_thread.machine.stack_start = th->machine.stack_start;
+ th->machine.stack_start = sth->machine.stack_start;
/* oldfib->machine.stack_end should be NULL */
- oldfib->cont.saved_ec.machine.stack_end = NULL;
-
- /* restore thread context */
- fiber_restore_thread(th, newfib);
+ oldfib->cont.saved_thread.machine.stack_end = 0;
+#ifndef _WIN32
+ if (!newfib->context.uc_stack.ss_sp && th->root_fiber != newfib) {
+ rb_bug("non_root_fiber->context.uc_stac.ss_sp should not be NULL");
+ }
+#endif
/* swap machine context */
-#if defined(FIBER_USE_COROUTINE)
- coroutine_transfer(&oldfib->context, &newfib->context);
-#elif defined(_WIN32)
+#ifdef _WIN32
SwitchToFiber(newfib->fib_handle);
#else
- if (!newfib->context.uc_stack.ss_sp && th->root_fiber != newfib) {
- rb_bug("non_root_fiber->context.uc_stac.ss_sp should not be NULL");
- }
swapcontext(&oldfib->context, &newfib->context);
#endif
}
-#endif /* FIBER_USE_NATIVE */
+#endif
NOINLINE(NORETURN(static void cont_restore_1(rb_context_t *)));
@@ -1265,7 +1003,7 @@ rollback_ensure_stack(VALUE self,rb_ensure_list_t *current,rb_ensure_entry_t *ta
{
rb_ensure_list_t *p;
rb_ensure_entry_t *entry;
- size_t i, j;
+ size_t i;
size_t cur_size;
size_t target_size;
size_t base_point;
@@ -1303,11 +1041,11 @@ rollback_ensure_stack(VALUE self,rb_ensure_list_t *current,rb_ensure_entry_t *ta
cur_size--;
}
/* push ensure stack */
- for (j = 0; j < i; j++) {
- func = (VALUE (*)(ANYARGS)) lookup_rollback_func(target[i - j - 1].e_proc);
- if ((VALUE)func != Qundef) {
- (*func)(target[i - j - 1].data2);
- }
+ while (i--) {
+ func = (VALUE (*)(ANYARGS)) lookup_rollback_func(target[i].e_proc);
+ if ((VALUE)func != Qundef) {
+ (*func)(target[i].data2);
+ }
}
}
@@ -1330,25 +1068,29 @@ rollback_ensure_stack(VALUE self,rb_ensure_list_t *current,rb_ensure_entry_t *ta
static VALUE
rb_cont_call(int argc, VALUE *argv, VALUE contval)
{
- rb_context_t *cont = cont_ptr(contval);
+ rb_context_t *cont;
rb_thread_t *th = GET_THREAD();
+ GetContPtr(contval, cont);
- if (cont_thread_value(cont) != th->self) {
+ if (cont->saved_thread.self != th->self) {
rb_raise(rb_eRuntimeError, "continuation called across threads");
}
- if (cont->saved_ec.protect_tag != th->ec->protect_tag) {
+ if (cont->saved_thread.protect_tag != th->protect_tag) {
rb_raise(rb_eRuntimeError, "continuation called across stack rewinding barrier");
}
- if (cont->saved_ec.fiber_ptr) {
- if (th->ec->fiber_ptr != cont->saved_ec.fiber_ptr) {
+ if (cont->saved_thread.fiber) {
+ if (th->fiber != cont->saved_thread.fiber) {
rb_raise(rb_eRuntimeError, "continuation called across fiber");
}
}
- rollback_ensure_stack(contval, th->ec->ensure_list, cont->ensure_array);
+ rollback_ensure_stack(contval, th->ensure_list, cont->ensure_array);
cont->argc = argc;
cont->value = make_passing_arg(argc, argv);
+ /* restore `tracing' context. see [Feature #4347] */
+ th->trace_arg = cont->saved_thread.trace_arg;
+
cont_restore_0(cont, &contval);
return Qnil; /* unreachable */
}
@@ -1367,9 +1109,8 @@ rb_cont_call(int argc, VALUE *argv, VALUE contval)
* the programmer and not the VM.
*
* As opposed to other stackless light weight concurrency models, each fiber
- * comes with a stack. This enables the fiber to be paused from deeply
- * nested function calls within the fiber block. See the ruby(1)
- * manpage to configure the size of the fiber stack(s).
+ * comes with a small 4KB stack. This enables the fiber to be paused from deeply
+ * nested function calls within the fiber block.
*
* When a fiber is created it will not run automatically. Rather it must
* be explicitly asked to run using the <code>Fiber#resume</code> method.
@@ -1447,70 +1188,52 @@ fiber_t_alloc(VALUE fibval)
fib->cont.self = fibval;
fib->cont.type = FIBER_CONTEXT;
cont_init(&fib->cont, th);
- fib->cont.saved_ec.fiber_ptr = fib;
fib->prev = NULL;
-
- /* fib->status == 0 == CREATED
- * So that we don't need to set status: fiber_status_set(fib, FIBER_CREATED); */
- VM_ASSERT(FIBER_CREATED_P(fib));
+ fib->status = CREATED;
DATA_PTR(fibval) = fib;
return fib;
}
-rb_control_frame_t *
-rb_vm_push_frame(rb_execution_context_t *sec,
- const rb_iseq_t *iseq,
- VALUE type,
- VALUE self,
- VALUE specval,
- VALUE cref_or_me,
- const VALUE *pc,
- VALUE *sp,
- int local_size,
- int stack_max);
-
static VALUE
fiber_init(VALUE fibval, VALUE proc)
{
rb_fiber_t *fib = fiber_t_alloc(fibval);
rb_context_t *cont = &fib->cont;
- rb_execution_context_t *sec = &cont->saved_ec;
+ rb_thread_t *th = &cont->saved_thread;
rb_thread_t *cth = GET_THREAD();
- rb_vm_t *vm = cth->vm;
- size_t fib_stack_bytes = vm->default_params.fiber_vm_stack_size;
- size_t thr_stack_bytes = vm->default_params.thread_vm_stack_size;
- VALUE *vm_stack;
/* initialize cont */
- cont->saved_vm_stack.ptr = NULL;
- if (fib_stack_bytes == thr_stack_bytes) {
- vm_stack = rb_thread_recycle_stack(fib_stack_bytes / sizeof(VALUE));
- }
- else {
- vm_stack = ruby_xmalloc(fib_stack_bytes);
- }
- rb_ec_set_vm_stack(sec, vm_stack, fib_stack_bytes / sizeof(VALUE));
- sec->cfp = (void *)(sec->vm_stack + sec->vm_stack_size);
+ cont->vm_stack = 0;
- rb_vm_push_frame(sec,
- NULL,
- VM_FRAME_MAGIC_DUMMY | VM_ENV_FLAG_LOCAL | VM_FRAME_FLAG_FINISH | VM_FRAME_FLAG_CFRAME,
- Qnil, /* self */
- VM_BLOCK_HANDLER_NONE,
- 0, /* specval */
- NULL, /* pc */
- sec->vm_stack, /* sp */
- 0, /* local_size */
- 0);
+ th->stack = 0;
+ th->stack_size = 0;
- sec->tag = NULL;
- sec->local_storage = NULL;
- sec->local_storage_recursive_hash = Qnil;
- sec->local_storage_recursive_hash_for_trace = Qnil;
+ th->stack_size = cth->vm->default_params.fiber_vm_stack_size / sizeof(VALUE);
+ th->stack = ALLOC_N(VALUE, th->stack_size);
- fib->first_proc = proc;
+ th->cfp = (void *)(th->stack + th->stack_size);
+ th->cfp--;
+ th->cfp->pc = 0;
+ th->cfp->sp = th->stack + 2;
+#if VM_DEBUG_BP_CHECK
+ th->cfp->bp_check = 0;
+#endif
+ th->cfp->ep = th->stack + 1;
+ th->cfp->ep[ 0] = VM_ENVVAL_BLOCK_PTR(0);
+ th->cfp->ep[-1] = 0;
+ th->cfp->self = Qnil;
+ th->cfp->flag = VM_FRAME_MAGIC_DUMMY | VM_FRAME_FLAG_FINISH;
+ th->cfp->iseq = 0;
+ th->cfp->proc = 0;
+ th->cfp->block_iseq = 0;
+ th->tag = 0;
+ th->local_storage = st_init_numtable();
+ th->local_storage_recursive_hash = Qnil;
+ th->local_storage_recursive_hash_for_trace = Qnil;
+
+ th->first_proc = proc;
#if !FIBER_USE_NATIVE
MEMCPY(&cont->jmpbuf, &cth->root_jmpbuf, rb_jmpbuf_t, 1);
@@ -1532,130 +1255,77 @@ rb_fiber_new(VALUE (*func)(ANYARGS), VALUE obj)
return fiber_init(fiber_alloc(rb_cFiber), rb_proc_new(func, obj));
}
-static void rb_fiber_terminate(rb_fiber_t *fib, int need_interrupt);
+static void rb_fiber_terminate(rb_fiber_t *fib);
void
rb_fiber_start(void)
{
- rb_thread_t * volatile th = GET_THREAD();
- rb_fiber_t *fib = th->ec->fiber_ptr;
+ rb_thread_t *th = GET_THREAD();
+ rb_fiber_t *fib = th->fiber;
rb_proc_t *proc;
- enum ruby_tag_type state;
- int need_interrupt = TRUE;
-
- VM_ASSERT(th->ec == ruby_current_execution_context_ptr);
- VM_ASSERT(FIBER_RESUMED_P(fib));
+ int state;
- EC_PUSH_TAG(th->ec);
- if ((state = EC_EXEC_TAG()) == TAG_NONE) {
+ TH_PUSH_TAG(th);
+ if ((state = EXEC_TAG()) == 0) {
rb_context_t *cont = &VAR_FROM_MEMORY(fib)->cont;
int argc;
const VALUE *argv, args = cont->value;
- GetProcPtr(fib->first_proc, proc);
+ GetProcPtr(cont->saved_thread.first_proc, proc);
argv = (argc = cont->argc) > 1 ? RARRAY_CONST_PTR(args) : &args;
cont->value = Qnil;
- th->ec->errinfo = Qnil;
- th->ec->root_lep = rb_vm_proc_local_ep(fib->first_proc);
- th->ec->root_svar = Qfalse;
+ th->errinfo = Qnil;
+ th->root_lep = rb_vm_ep_local_ep(proc->block.ep);
+ th->root_svar = Qfalse;
+ fib->status = RUNNING;
- EXEC_EVENT_HOOK(th->ec, RUBY_EVENT_FIBER_SWITCH, th->self, 0, 0, 0, Qnil);
- cont->value = rb_vm_invoke_proc(th->ec, proc, argc, argv, VM_BLOCK_HANDLER_NONE);
+ EXEC_EVENT_HOOK(th, RUBY_EVENT_FIBER_SWITCH, th->self, 0, 0, Qnil);
+ cont->value = rb_vm_invoke_proc(th, proc, argc, argv, 0);
}
- EC_POP_TAG();
+ TH_POP_TAG();
if (state) {
- VALUE err = th->ec->errinfo;
- VM_ASSERT(FIBER_RESUMED_P(fib));
-
if (state == TAG_RAISE || state == TAG_FATAL) {
- rb_threadptr_pending_interrupt_enque(th, err);
+ rb_threadptr_pending_interrupt_enque(th, th->errinfo);
}
else {
- err = rb_vm_make_jump_tag_but_local_jump(state, err);
- if (!NIL_P(err)) {
+ VALUE err = rb_vm_make_jump_tag_but_local_jump(state, th->errinfo);
+ if (!NIL_P(err))
rb_threadptr_pending_interrupt_enque(th, err);
- }
}
- need_interrupt = TRUE;
+ RUBY_VM_SET_INTERRUPT(th);
}
- rb_fiber_terminate(fib, need_interrupt);
- VM_UNREACHABLE(rb_fiber_start);
+ rb_fiber_terminate(fib);
+ rb_bug("rb_fiber_start: unreachable");
}
static rb_fiber_t *
root_fiber_alloc(rb_thread_t *th)
{
- VALUE fibval = fiber_alloc(rb_cFiber);
- rb_fiber_t *fib = th->ec->fiber_ptr;
-
- VM_ASSERT(DATA_PTR(fibval) == NULL);
- VM_ASSERT(fib->cont.type == FIBER_CONTEXT);
- VM_ASSERT(fib->status == FIBER_RESUMED);
-
- th->root_fiber = fib;
- DATA_PTR(fibval) = fib;
- fib->cont.self = fibval;
-
+ rb_fiber_t *fib;
+ /* no need to allocate vm stack */
+ fib = fiber_t_alloc(fiber_alloc(rb_cFiber));
+ fib->cont.type = ROOT_FIBER_CONTEXT;
#if FIBER_USE_NATIVE
-#if defined(FIBER_USE_COROUTINE)
- coroutine_initialize(&fib->context, NULL, NULL, 0);
-#elif defined(_WIN32)
- /* setup fib_handle for root Fiber */
- if (fib->fib_handle == 0) {
- if ((fib->fib_handle = ConvertThreadToFiber(0)) == 0) {
- rb_bug("root_fiber_alloc: ConvertThreadToFiber() failed - %s\n", rb_w32_strerror(-1));
- }
- }
- else {
- rb_bug("root_fiber_alloc: fib_handle is not NULL.");
- }
+#ifdef _WIN32
+ fib->fib_handle = ConvertThreadToFiber(0);
#endif
#endif
+ fib->status = RUNNING;
return fib;
}
-void
-rb_threadptr_root_fiber_setup(rb_thread_t *th)
-{
- rb_fiber_t *fib = ruby_mimmalloc(sizeof(rb_fiber_t));
- MEMZERO(fib, rb_fiber_t, 1);
- fib->cont.type = FIBER_CONTEXT;
- fib->cont.saved_ec.fiber_ptr = fib;
- fib->cont.saved_ec.thread_ptr = th;
- fiber_status_set(fib, FIBER_RESUMED); /* skip CREATED */
- th->ec = &fib->cont.saved_ec;
-
- /* NOTE: On WIN32, fib_handle is not allocated yet. */
-}
-
-void
-rb_threadptr_root_fiber_release(rb_thread_t *th)
-{
- if (th->root_fiber) {
- /* ignore. A root fiber object will free th->ec */
- }
- else {
- VM_ASSERT(th->ec->fiber_ptr->cont.type == FIBER_CONTEXT);
- VM_ASSERT(th->ec->fiber_ptr->cont.self == 0);
- fiber_free(th->ec->fiber_ptr);
-
- if (th->ec == ruby_current_execution_context_ptr) {
- ruby_current_execution_context_ptr = NULL;
- }
- th->ec = NULL;
- }
-}
-
static inline rb_fiber_t*
fiber_current(void)
{
- rb_execution_context_t *ec = GET_EC();
- if (ec->fiber_ptr->cont.self == 0) {
- root_fiber_alloc(rb_ec_thread_ptr(ec));
+ rb_thread_t *th = GET_THREAD();
+ if (th->fiber == 0) {
+ /* save root */
+ rb_fiber_t *fib = root_fiber_alloc(th);
+ th->root_fiber = th->fiber = fib;
}
- return ec->fiber_ptr;
+ return th->fiber;
}
static inline rb_fiber_t*
@@ -1665,10 +1335,7 @@ return_fiber(void)
rb_fiber_t *prev = fib->prev;
if (!prev) {
- rb_thread_t *th = GET_THREAD();
- rb_fiber_t *root_fiber = th->root_fiber;
-
- VM_ASSERT(root_fiber != NULL);
+ rb_fiber_t *root_fiber = GET_THREAD()->root_fiber;
if (root_fiber == fib) {
rb_raise(rb_eFiberError, "can't yield from root fiber");
@@ -1692,76 +1359,58 @@ fiber_store(rb_fiber_t *next_fib, rb_thread_t *th)
{
rb_fiber_t *fib;
- if (th->ec->fiber_ptr != NULL) {
- fib = th->ec->fiber_ptr;
+ if (th->fiber) {
+ fib = th->fiber;
+ cont_save_thread(&fib->cont, th);
}
else {
- /* create root fiber */
- fib = root_fiber_alloc(th);
+ /* create current fiber */
+ fib = root_fiber_alloc(th);
+ th->root_fiber = th->fiber = fib;
}
- VM_ASSERT(FIBER_RESUMED_P(fib) || FIBER_TERMINATED_P(fib));
- VM_ASSERT(FIBER_RUNNABLE_P(next_fib));
-
-#if FIBER_USE_NATIVE
- if (FIBER_CREATED_P(next_fib)) {
- fiber_initialize_machine_stack_context(next_fib, th->vm->default_params.fiber_machine_stack_size);
- }
-#endif
-
- if (FIBER_RESUMED_P(fib)) fiber_status_set(fib, FIBER_SUSPENDED);
-
-#if FIBER_USE_NATIVE == 0
- /* should (re-)allocate stack are before fib->status change to pass fiber_verify() */
- cont_save_machine_stack(th, &fib->cont);
-#endif
-
- fiber_status_set(next_fib, FIBER_RESUMED);
-
#if FIBER_USE_NATIVE
fiber_setcontext(next_fib, fib);
/* restored */
-#ifdef MAX_MACHINE_STACK_CACHE
+#ifndef _WIN32
if (terminated_machine_stack.ptr) {
- if (machine_stack_cache_index < MAX_MACHINE_STACK_CACHE) {
- machine_stack_cache[machine_stack_cache_index++] = terminated_machine_stack;
- }
- else {
- if (terminated_machine_stack.ptr != fib->cont.machine.stack) {
-#ifdef _WIN32
- VirtualFree(terminated_machine_stack.ptr, 0, MEM_RELEASE);
-#else
- munmap((void*)terminated_machine_stack.ptr, terminated_machine_stack.size * sizeof(VALUE));
-#endif
- }
- else {
- rb_bug("terminated fiber resumed");
- }
- }
- terminated_machine_stack.ptr = NULL;
- terminated_machine_stack.size = 0;
+ if (machine_stack_cache_index < MAX_MACHINE_STACK_CACHE) {
+ machine_stack_cache[machine_stack_cache_index].ptr = terminated_machine_stack.ptr;
+ machine_stack_cache[machine_stack_cache_index].size = terminated_machine_stack.size;
+ machine_stack_cache_index++;
+ }
+ else {
+ if (terminated_machine_stack.ptr != fib->cont.machine.stack) {
+ munmap((void*)terminated_machine_stack.ptr, terminated_machine_stack.size * sizeof(VALUE));
+ }
+ else {
+ rb_bug("terminated fiber resumed");
+ }
+ }
+ terminated_machine_stack.ptr = NULL;
+ terminated_machine_stack.size = 0;
}
#endif /* not _WIN32 */
- fib = th->ec->fiber_ptr;
+ fib = th->fiber;
if (fib->cont.argc == -1) rb_exc_raise(fib->cont.value);
return fib->cont.value;
#else /* FIBER_USE_NATIVE */
- fib->cont.saved_ec.machine.stack_end = NULL;
+ cont_save_machine_stack(th, &fib->cont);
if (ruby_setjmp(fib->cont.jmpbuf)) {
- /* restored */
- fib = th->ec->fiber_ptr;
- if (fib->cont.argc == -1) rb_exc_raise(fib->cont.value);
- if (next_fib->cont.value == Qundef) {
- cont_restore_0(&next_fib->cont, &next_fib->cont.value);
- VM_UNREACHABLE(fiber_store);
- }
- return fib->cont.value;
+ /* restored */
+ fib = th->fiber;
+ if (fib->cont.argc == -1) rb_exc_raise(fib->cont.value);
+ if (next_fib->cont.value == Qundef) {
+ cont_restore_0(&next_fib->cont, &next_fib->cont.value);
+ rb_bug("rb_fiber_resume: unreachable");
+ }
+ return fib->cont.value;
}
else {
- VALUE undef = Qundef;
- cont_restore_0(&next_fib->cont, &undef);
- VM_UNREACHABLE(fiber_store);
+ VALUE undef = Qundef;
+ cont_restore_0(&next_fib->cont, &undef);
+ rb_bug("rb_fiber_resume: unreachable");
}
#endif /* FIBER_USE_NATIVE */
}
@@ -1773,59 +1422,53 @@ fiber_switch(rb_fiber_t *fib, int argc, const VALUE *argv, int is_resume)
rb_context_t *cont = &fib->cont;
rb_thread_t *th = GET_THREAD();
- /* make sure the root_fiber object is available */
- if (th->root_fiber == NULL) root_fiber_alloc(th);
-
- if (th->ec->fiber_ptr == fib) {
+ if (th->fiber == fib) {
/* ignore fiber context switch
* because destination fiber is same as current fiber
*/
return make_passing_arg(argc, argv);
}
- if (cont_thread_value(cont) != th->self) {
+ if (cont->saved_thread.self != th->self) {
rb_raise(rb_eFiberError, "fiber called across threads");
}
- else if (cont->saved_ec.protect_tag != th->ec->protect_tag) {
+ else if (cont->saved_thread.protect_tag != th->protect_tag) {
rb_raise(rb_eFiberError, "fiber called across stack rewinding barrier");
}
- else if (FIBER_TERMINATED_P(fib)) {
+ else if (fib->status == TERMINATED) {
value = rb_exc_new2(rb_eFiberError, "dead fiber called");
- if (!FIBER_TERMINATED_P(th->ec->fiber_ptr)) {
- rb_exc_raise(value);
- VM_UNREACHABLE(fiber_switch);
- }
- else {
- /* th->ec->fiber_ptr is also dead => switch to root fiber */
- /* (this means we're being called from rb_fiber_terminate, */
- /* and the terminated fiber's return_fiber() is already dead) */
- VM_ASSERT(FIBER_SUSPENDED_P(th->root_fiber));
-
- cont = &th->root_fiber->cont;
- cont->argc = -1;
- cont->value = value;
+ if (th->fiber->status != TERMINATED) rb_exc_raise(value);
+
+ /* th->fiber is also dead => switch to root fiber */
+ /* (this means we're being called from rb_fiber_terminate, */
+ /* and the terminated fiber's return_fiber() is already dead) */
+ cont = &th->root_fiber->cont;
+ cont->argc = -1;
+ cont->value = value;
#if FIBER_USE_NATIVE
- fiber_setcontext(th->root_fiber, th->ec->fiber_ptr);
+ fiber_setcontext(th->root_fiber, th->fiber);
#else
- cont_restore_0(cont, &value);
+ cont_restore_0(cont, &value);
#endif
- VM_UNREACHABLE(fiber_switch);
- }
+ /* unreachable */
}
if (is_resume) {
fib->prev = fiber_current();
}
-
- VM_ASSERT(FIBER_RUNNABLE_P(fib));
+ else {
+ /* restore `tracing' context. see [Feature #4347] */
+ th->trace_arg = cont->saved_thread.trace_arg;
+ }
cont->argc = argc;
cont->value = make_passing_arg(argc, argv);
+
value = fiber_store(fib, th);
- RUBY_VM_CHECK_INTS(th->ec);
+ RUBY_VM_CHECK_INTS(th);
- EXEC_EVENT_HOOK(th->ec, RUBY_EVENT_FIBER_SWITCH, th->self, 0, 0, 0, Qnil);
+ EXEC_EVENT_HOOK(th, RUBY_EVENT_FIBER_SWITCH, th->self, 0, 0, Qnil);
return value;
}
@@ -1833,71 +1476,38 @@ fiber_switch(rb_fiber_t *fib, int argc, const VALUE *argv, int is_resume)
VALUE
rb_fiber_transfer(VALUE fibval, int argc, const VALUE *argv)
{
- return fiber_switch(fiber_ptr(fibval), argc, argv, 0);
-}
-
-void
-rb_fiber_close(rb_fiber_t *fib)
-{
- rb_execution_context_t *ec = &fib->cont.saved_ec;
- VALUE *vm_stack = ec->vm_stack;
- size_t stack_bytes = ec->vm_stack_size * sizeof(VALUE);
-
- fiber_status_set(fib, FIBER_TERMINATED);
- if (stack_bytes == rb_ec_vm_ptr(ec)->default_params.thread_vm_stack_size) {
- rb_thread_recycle_stack_release(vm_stack);
- }
- else {
- ruby_xfree(vm_stack);
- }
- rb_ec_set_vm_stack(ec, NULL, 0);
-
-#if !FIBER_USE_NATIVE
- /* should not mark machine stack any more */
- ec->machine.stack_end = NULL;
-#endif
+ rb_fiber_t *fib;
+ GetFiberPtr(fibval, fib);
+ return fiber_switch(fib, argc, argv, 0);
}
static void
-rb_fiber_terminate(rb_fiber_t *fib, int need_interrupt)
+rb_fiber_terminate(rb_fiber_t *fib)
{
VALUE value = fib->cont.value;
- rb_fiber_t *ret_fib;
-
- VM_ASSERT(FIBER_RESUMED_P(fib));
- rb_fiber_close(fib);
-
-#if FIBER_USE_NATIVE
-#if defined(FIBER_USE_COROUTINE)
- coroutine_destroy(&fib->context);
-#elif !defined(_WIN32)
- fib->context.uc_stack.ss_sp = NULL;
-#endif
-
-#ifdef MAX_MACHINE_STACK_CACHE
+ fib->status = TERMINATED;
+#if FIBER_USE_NATIVE && !defined(_WIN32)
/* Ruby must not switch to other thread until storing terminated_machine_stack */
terminated_machine_stack.ptr = fib->ss_sp;
terminated_machine_stack.size = fib->ss_size / sizeof(VALUE);
fib->ss_sp = NULL;
+ fib->context.uc_stack.ss_sp = NULL;
fib->cont.machine.stack = NULL;
fib->cont.machine.stack_size = 0;
#endif
-#endif
-
- ret_fib = return_fiber();
- if (need_interrupt) RUBY_VM_SET_INTERRUPT(&ret_fib->cont.saved_ec);
- fiber_switch(ret_fib, 1, &value, 0);
+ fiber_switch(return_fiber(), 1, &value, 0);
}
VALUE
rb_fiber_resume(VALUE fibval, int argc, const VALUE *argv)
{
- rb_fiber_t *fib = fiber_ptr(fibval);
+ rb_fiber_t *fib;
+ GetFiberPtr(fibval, fib);
- if (fib->prev != 0 || fiber_is_root_p(fib)) {
+ if (fib->prev != 0 || fib->cont.type == ROOT_FIBER_CONTEXT) {
rb_raise(rb_eFiberError, "double resume");
}
- if (fib->transferred != 0) {
+ if (fib->transfered != 0) {
rb_raise(rb_eFiberError, "cannot resume transferred Fiber");
}
@@ -1911,10 +1521,13 @@ rb_fiber_yield(int argc, const VALUE *argv)
}
void
-rb_fiber_reset_root_local_storage(rb_thread_t *th)
+rb_fiber_reset_root_local_storage(VALUE thval)
{
- if (th->root_fiber && th->root_fiber != th->ec->fiber_ptr) {
- th->ec->local_storage = th->root_fiber->cont.saved_ec.local_storage;
+ rb_thread_t *th;
+
+ GetThreadPtr(thval, th);
+ if (th->root_fiber && th->root_fiber != th->fiber) {
+ th->local_storage = th->root_fiber->cont.saved_thread.local_storage;
}
}
@@ -1930,7 +1543,9 @@ rb_fiber_reset_root_local_storage(rb_thread_t *th)
VALUE
rb_fiber_alive_p(VALUE fibval)
{
- return FIBER_TERMINATED_P(fiber_ptr(fibval)) ? Qfalse : Qtrue;
+ rb_fiber_t *fib;
+ GetFiberPtr(fibval, fib);
+ return fib->status != TERMINATED ? Qtrue : Qfalse;
}
/*
@@ -2002,8 +1617,9 @@ rb_fiber_m_resume(int argc, VALUE *argv, VALUE fib)
static VALUE
rb_fiber_m_transfer(int argc, VALUE *argv, VALUE fibval)
{
- rb_fiber_t *fib = fiber_ptr(fibval);
- fib->transferred = 1;
+ rb_fiber_t *fib;
+ GetFiberPtr(fibval, fib);
+ fib->transfered = 1;
return fiber_switch(fib, argc, argv, 0);
}
@@ -2037,45 +1653,7 @@ rb_fiber_s_current(VALUE klass)
return rb_fiber_current();
}
-/*
- * call-seq:
- * fiber.to_s -> string
- *
- * Returns fiber information string.
- *
- */
-
-static VALUE
-fiber_to_s(VALUE fibval)
-{
- const rb_fiber_t *fib = fiber_ptr(fibval);
- const rb_proc_t *proc;
- char status_info[0x10];
-
- snprintf(status_info, 0x10, " (%s)", fiber_status_name(fib->status));
- if (!rb_obj_is_proc(fib->first_proc)) {
- VALUE str = rb_any_to_s(fibval);
- strlcat(status_info, ">", sizeof(status_info));
- rb_str_set_len(str, RSTRING_LEN(str)-1);
- rb_str_cat_cstr(str, status_info);
- return str;
- }
- GetProcPtr(fib->first_proc, proc);
- return rb_block_to_s(fibval, &proc->block, status_info);
-}
-#ifdef HAVE_WORKING_FORK
-void
-rb_fiber_atfork(rb_thread_t *th)
-{
- if (th->root_fiber) {
- if (&th->root_fiber->cont.saved_ec != th->ec) {
- th->root_fiber = th->ec->fiber_ptr;
- }
- th->root_fiber->prev = 0;
- }
-}
-#endif
/*
* Document-class: FiberError
@@ -2103,7 +1681,7 @@ Init_Cont(void)
#else /* not WIN32 */
pagesize = sysconf(_SC_PAGESIZE);
#endif
- SET_MACHINE_STACK_END(&th->ec->machine.stack_end);
+ SET_MACHINE_STACK_END(&th->machine.stack_end);
#endif
rb_cFiber = rb_define_class("Fiber", rb_cObject);
@@ -2112,8 +1690,6 @@ Init_Cont(void)
rb_define_singleton_method(rb_cFiber, "yield", rb_fiber_s_yield, -1);
rb_define_method(rb_cFiber, "initialize", rb_fiber_init, 0);
rb_define_method(rb_cFiber, "resume", rb_fiber_m_resume, -1);
- rb_define_method(rb_cFiber, "to_s", fiber_to_s, 0);
- rb_define_alias(rb_cFiber, "inspect", "to_s");
}
RUBY_SYMBOL_EXPORT_BEGIN
diff --git a/coroutine/amd64/Context.S b/coroutine/amd64/Context.S
deleted file mode 100644
index 6193993e03..0000000000
--- a/coroutine/amd64/Context.S
+++ /dev/null
@@ -1,46 +0,0 @@
-##
-## This file is part of the "Coroutine" project and released under the MIT License.
-##
-## Created by Samuel Williams on 10/5/2018.
-## Copyright, 2018, by Samuel Williams. All rights reserved.
-##
-
-.text
-
-# For older linkers
-.globl _coroutine_transfer
-_coroutine_transfer:
-
-.globl coroutine_transfer
-coroutine_transfer:
- # Save caller state
- pushq %rbp
- pushq %rbx
- pushq %r12
- pushq %r13
- pushq %r14
- pushq %r15
-
- # Save caller stack pointer
- movq %rsp, (%rdi)
-
- # Restore callee stack pointer
- movq (%rsi), %rsp
-
- # Restore callee stack
- popq %r15
- popq %r14
- popq %r13
- popq %r12
- popq %rbx
- popq %rbp
-
- # Put the first argument into the return value
- movq %rdi, %rax
-
- # We pop the return address and jump to it
- ret
-
-#if defined(__linux__) && defined(__ELF__)
-.section .note.GNU-stack,"",%progbits
-#endif
diff --git a/coroutine/amd64/Context.h b/coroutine/amd64/Context.h
deleted file mode 100644
index 1801c1e2c5..0000000000
--- a/coroutine/amd64/Context.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * This file is part of the "Coroutine" project and released under the MIT License.
- *
- * Created by Samuel Williams on 10/5/2018.
- * Copyright, 2018, by Samuel Williams. All rights reserved.
-*/
-
-#pragma once
-
-#include <assert.h>
-#include <string.h>
-
-#if __cplusplus
-extern "C" {
-#endif
-
-#define COROUTINE __attribute__((noreturn)) void
-
-const size_t COROUTINE_REGISTERS = 6;
-
-typedef struct
-{
- void **stack_pointer;
-} coroutine_context;
-
-typedef COROUTINE(* coroutine_start)(coroutine_context *from, coroutine_context *self);
-
-static inline void coroutine_initialize(
- coroutine_context *context,
- coroutine_start start,
- void *stack_pointer,
- size_t stack_size
-) {
- /* Force 16-byte alignment */
- context->stack_pointer = (void**)((uintptr_t)stack_pointer & ~0xF);
-
- if (!start) {
- assert(!context->stack_pointer);
- /* We are main coroutine for this thread */
- return;
- }
-
- *--context->stack_pointer = NULL;
- *--context->stack_pointer = (void*)start;
-
- context->stack_pointer -= COROUTINE_REGISTERS;
- memset(context->stack_pointer, 0, sizeof(void*) * COROUTINE_REGISTERS);
-}
-
-coroutine_context * coroutine_transfer(coroutine_context * current, coroutine_context * target);
-
-static inline void coroutine_destroy(coroutine_context * context)
-{
- context->stack_pointer = NULL;
-}
-
-#if __cplusplus
-}
-#endif
diff --git a/coroutine/arm32/Context.S b/coroutine/arm32/Context.S
deleted file mode 100644
index c2b93d0a34..0000000000
--- a/coroutine/arm32/Context.S
+++ /dev/null
@@ -1,14 +0,0 @@
-##
-## This file is part of the "Coroutine" project and released under the MIT License.
-##
-## Created by Samuel Williams on 10/5/2018.
-## Copyright, 2018, by Samuel Williams. All rights reserved.
-##
-
-.text
-
-.globl coroutine_transfer
-coroutine_transfer:
- stmia r1!, {r4-r11,sp,lr}
- ldmia r0!, {r4-r11,sp,pc}
- bx lr
diff --git a/coroutine/arm32/Context.h b/coroutine/arm32/Context.h
deleted file mode 100644
index 60732df7a0..0000000000
--- a/coroutine/arm32/Context.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * This file is part of the "Coroutine" project and released under the MIT License.
- *
- * Created by Samuel Williams on 10/5/2018.
- * Copyright, 2018, by Samuel Williams. All rights reserved.
-*/
-
-#pragma once
-
-#include <assert.h>
-#include <string.h>
-
-#if __cplusplus
-extern "C" {
-#endif
-
-#define COROUTINE __attribute__((noreturn)) void
-
-const size_t COROUTINE_REGISTERS = 9;
-
-typedef struct
-{
- void **stack_pointer;
-} coroutine_context;
-
-typedef COROUTINE(* coroutine_start)(coroutine_context *from, coroutine_context *self);
-
-static inline void coroutine_initialize(
- coroutine_context *context,
- coroutine_start start,
- void *stack_pointer,
- size_t stack_size
-) {
- context->stack_pointer = (void**)stack_pointer;
-
- if (!start) {
- assert(!context->stack_pointer);
- /* We are main coroutine for this thread */
- return;
- }
-
- *--context->stack_pointer = (void*)start;
-
- context->stack_pointer -= COROUTINE_REGISTERS;
- memset(context->stack_pointer, 0, sizeof(void*) * COROUTINE_REGISTERS);
-}
-
-coroutine_context * coroutine_transfer(coroutine_context * current, coroutine_context * target);
-
-static inline void coroutine_destroy(coroutine_context * context)
-{
-}
-
-#if __cplusplus
-}
-#endif
diff --git a/coroutine/arm64/Context.S b/coroutine/arm64/Context.S
deleted file mode 100644
index f6e5f0a6bc..0000000000
--- a/coroutine/arm64/Context.S
+++ /dev/null
@@ -1,59 +0,0 @@
-##
-## This file is part of the "Coroutine" project and released under the MIT License.
-##
-## Created by Samuel Williams on 10/5/2018.
-## Copyright, 2018, by Samuel Williams. All rights reserved.
-##
-
-.text
-.align 2
-
-.global coroutine_transfer
-coroutine_transfer:
-
- # Make space on the stack for caller registers
- sub sp, sp, 0xb0
-
- # Save caller registers
- stp d8, d9, [sp, 0x00]
- stp d10, d11, [sp, 0x10]
- stp d12, d13, [sp, 0x20]
- stp d14, d15, [sp, 0x30]
- stp x19, x20, [sp, 0x40]
- stp x21, x22, [sp, 0x50]
- stp x23, x24, [sp, 0x60]
- stp x25, x26, [sp, 0x70]
- stp x27, x28, [sp, 0x80]
- stp x29, x30, [sp, 0x90]
-
- # Save return address
- str x30, [sp, 0xa0]
-
- # Save stack pointer to x0 (first argument)
- mov x2, sp
- str x2, [x0, 0]
-
- # Load stack pointer from x1 (second argument)
- ldr x3, [x1, 0]
- mov sp, x3
-
- # Restore caller registers
- ldp d8, d9, [sp, 0x00]
- ldp d10, d11, [sp, 0x10]
- ldp d12, d13, [sp, 0x20]
- ldp d14, d15, [sp, 0x30]
- ldp x19, x20, [sp, 0x40]
- ldp x21, x22, [sp, 0x50]
- ldp x23, x24, [sp, 0x60]
- ldp x25, x26, [sp, 0x70]
- ldp x27, x28, [sp, 0x80]
- ldp x29, x30, [sp, 0x90]
-
- # Load return address into x4
- ldr x4, [sp, 0xa0]
-
- # Pop stack frame
- add sp, sp, 0xb0
-
- # Jump to return address (in x4)
- ret x4
diff --git a/coroutine/arm64/Context.h b/coroutine/arm64/Context.h
deleted file mode 100644
index 03b91fd937..0000000000
--- a/coroutine/arm64/Context.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * This file is part of the "Coroutine" project and released under the MIT License.
- *
- * Created by Samuel Williams on 10/5/2018.
- * Copyright, 2018, by Samuel Williams. All rights reserved.
-*/
-
-#pragma once
-
-#include <assert.h>
-#include <string.h>
-
-#if __cplusplus
-extern "C" {
-#endif
-
-#define COROUTINE __attribute__((noreturn)) void
-
-const size_t COROUTINE_REGISTERS = 0xb0 / 8;
-
-typedef struct
-{
- void **stack_pointer;
-} coroutine_context;
-
-typedef COROUTINE(* coroutine_start)(coroutine_context *from, coroutine_context *self);
-
-static inline void coroutine_initialize(
- coroutine_context *context,
- coroutine_start start,
- void *stack_pointer,
- size_t stack_size
-) {
- /* Force 16-byte alignment */
- context->stack_pointer = (void**)((uintptr_t)stack_pointer & ~0xF);
-
- if (!start) {
- assert(!context->stack_pointer);
- /* We are main coroutine for this thread */
- return;
- }
-
- context->stack_pointer -= COROUTINE_REGISTERS;
- memset(context->stack_pointer, 0, sizeof(void*) * COROUTINE_REGISTERS);
-
- context->stack_pointer[0xa0 / 8] = (void*)start;
-}
-
-coroutine_context * coroutine_transfer(coroutine_context * current, coroutine_context * target);
-
-static inline void coroutine_destroy(coroutine_context * context)
-{
-}
-
-#if __cplusplus
-}
-#endif
diff --git a/coroutine/ppc64le/Context.S b/coroutine/ppc64le/Context.S
deleted file mode 100644
index 1b39086f8f..0000000000
--- a/coroutine/ppc64le/Context.S
+++ /dev/null
@@ -1,72 +0,0 @@
-.text
-.align 2
-
-.globl coroutine_transfer
-.type coroutine_transfer, @function
-coroutine_transfer:
- # Make space on the stack for caller registers
- addi 1,1,-152
-
- # Save caller registers
- std 14,0(1)
- std 15,8(1)
- std 16,16(1)
- std 17,24(1)
- std 18,32(1)
- std 19,40(1)
- std 20,48(1)
- std 21,56(1)
- std 22,64(1)
- std 23,72(1)
- std 24,80(1)
- std 25,88(1)
- std 26,96(1)
- std 27,104(1)
- std 28,112(1)
- std 29,120(1)
- std 30,128(1)
- std 31,136(1)
-
- # Save return address
- mflr 0
- std 0,144(1)
-
- # Save stack pointer to first argument
- std 1,0(3)
-
- # Load stack pointer from second argument
- ld 1,0(4)
-
- # Restore caller registers
- ld 14,0(1)
- ld 15,8(1)
- ld 16,16(1)
- ld 17,24(1)
- ld 18,32(1)
- ld 19,40(1)
- ld 20,48(1)
- ld 21,56(1)
- ld 22,64(1)
- ld 23,72(1)
- ld 24,80(1)
- ld 25,88(1)
- ld 26,96(1)
- ld 27,104(1)
- ld 28,112(1)
- ld 29,120(1)
- ld 30,128(1)
- ld 31,136(1)
-
- # Load return address
- ld 0,144(1)
- mtlr 0
-
- # Pop stack frame
- addi 1,1,152
-
- # Jump to return address
- blr
-
-#if defined(__linux__) && defined(__ELF__)
-.section .note.GNU-stack,"",%progbits
-#endif
diff --git a/coroutine/ppc64le/Context.h b/coroutine/ppc64le/Context.h
deleted file mode 100644
index de592f5a46..0000000000
--- a/coroutine/ppc64le/Context.h
+++ /dev/null
@@ -1,54 +0,0 @@
-#pragma once
-
-#include <assert.h>
-#include <string.h>
-
-#if __cplusplus
-extern "C" {
-#endif
-
-#define COROUTINE __attribute__((noreturn)) void
-
-const size_t COROUTINE_REGISTERS =
- 19 /* 18 general purpose registers (r14-r31) and 1 return address */
- + 4; /* space for fiber_entry() to store the link register */
-
-typedef struct
-{
- void **stack_pointer;
-} coroutine_context;
-
-typedef COROUTINE(* coroutine_start)(coroutine_context *from, coroutine_context *self);
-
-static inline void coroutine_initialize(
- coroutine_context *context,
- coroutine_start start,
- void *stack_pointer,
- size_t stack_size
-) {
- /* Force 16-byte alignment */
- context->stack_pointer = (void**)((uintptr_t)stack_pointer & ~0xF);
-
- if (!start) {
- assert(!context->stack_pointer);
- /* We are main coroutine for this thread */
- return;
- }
-
- context->stack_pointer -= COROUTINE_REGISTERS;
- memset(context->stack_pointer, 0, sizeof(void*) * COROUTINE_REGISTERS);
-
- /* Skip a global prologue that sets the TOC register */
- context->stack_pointer[18] = ((char*)start) + 8;
-}
-
-coroutine_context * coroutine_transfer(coroutine_context * current, coroutine_context * target);
-
-static inline void coroutine_destroy(coroutine_context * context)
-{
- context->stack_pointer = NULL;
-}
-
-#if __cplusplus
-}
-#endif
diff --git a/coroutine/win32/Context.asm b/coroutine/win32/Context.asm
deleted file mode 100644
index 2647ea4bc4..0000000000
--- a/coroutine/win32/Context.asm
+++ /dev/null
@@ -1,55 +0,0 @@
-;;
-;; This file is part of the "Coroutine" project and released under the MIT License.
-;;
-;; Created by Samuel Williams on 10/5/2018.
-;; Copyright, 2018, by Samuel Williams. All rights reserved.
-;;
-
-.386
-.model flat
-
-.code
-
-assume fs:nothing
-
-; Using fastcall is a big win (and it's the same has how x64 works).
-; In coroutine transfer, the arguments are passed in ecx and edx. We don't need
-; to touch these in order to pass them to the destination coroutine.
-
-@coroutine_transfer@8 proc
- ; Save the thread information block:
- push fs:[0]
- push fs:[4]
- push fs:[8]
-
- ; Save caller registers:
- push ebp
- push ebx
- push edi
- push esi
-
- ; Save caller stack pointer:
- mov dword ptr [ecx], esp
-
- ; Restore callee stack pointer:
- mov esp, dword ptr [edx]
-
- ; Restore callee stack:
- pop esi
- pop edi
- pop ebx
- pop ebp
-
- ; Restore the thread information block:
- pop fs:[8]
- pop fs:[4]
- pop fs:[0]
-
- ; Save the first argument as the return value:
- mov eax, dword ptr ecx
-
- ; Jump to the address on the stack:
- ret
-@coroutine_transfer@8 endp
-
-end
diff --git a/coroutine/win32/Context.h b/coroutine/win32/Context.h
deleted file mode 100644
index aa9f17ddab..0000000000
--- a/coroutine/win32/Context.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * This file is part of the "Coroutine" project and released under the MIT License.
- *
- * Created by Samuel Williams on 10/5/2018.
- * Copyright, 2018, by Samuel Williams. All rights reserved.
-*/
-
-#pragma once
-
-#include <assert.h>
-#include <string.h>
-
-#if __cplusplus
-extern "C" {
-#endif
-
-#define COROUTINE __declspec(noreturn) void __fastcall
-
-/* This doesn't include thread information block */
-const size_t COROUTINE_REGISTERS = 4;
-
-typedef struct
-{
- void **stack_pointer;
-} coroutine_context;
-
-typedef void(__fastcall * coroutine_start)(coroutine_context *from, coroutine_context *self);
-
-static inline void coroutine_initialize(
- coroutine_context *context,
- coroutine_start start,
- void *stack_pointer,
- size_t stack_size
-) {
- context->stack_pointer = (void**)stack_pointer;
-
- if (!start) {
- assert(!context->stack_pointer);
- /* We are main coroutine for this thread */
- return;
- }
-
- *--context->stack_pointer = (void*)start;
-
- /* Windows Thread Information Block */
- *--context->stack_pointer = 0; /* fs:[0] */
- *--context->stack_pointer = (void*)stack_pointer; /* fs:[4] */
- *--context->stack_pointer = (void*)((char *)stack_pointer - stack_size); /* fs:[8] */
-
- context->stack_pointer -= COROUTINE_REGISTERS;
- memset(context->stack_pointer, 0, sizeof(void*) * COROUTINE_REGISTERS);
-}
-
-coroutine_context * __fastcall coroutine_transfer(coroutine_context * current, coroutine_context * target);
-
-static inline void coroutine_destroy(coroutine_context * context)
-{
-}
-
-#if __cplusplus
-}
-#endif
diff --git a/coroutine/win64/Context.S b/coroutine/win64/Context.S
deleted file mode 100644
index 4b16e0ce8c..0000000000
--- a/coroutine/win64/Context.S
+++ /dev/null
@@ -1,77 +0,0 @@
-##
-## This file is part of the "Coroutine" project and released under the MIT License.
-##
-## Created by Samuel Williams on 4/11/2018.
-## Copyright, 2018, by Samuel Williams. All rights reserved.
-##
-
-.text
-
-.globl coroutine_transfer
-coroutine_transfer:
- # Save the thread information block:
- pushq %gs:8
- pushq %gs:16
-
- # Save caller registers:
- pushq %rbp
- pushq %rbx
- pushq %rdi
- pushq %rsi
- pushq %r12
- pushq %r13
- pushq %r14
- pushq %r15
-
- movaps %xmm15, -168(%rsp)
- movaps %xmm14, -152(%rsp)
- movaps %xmm13, -136(%rsp)
- movaps %xmm12, -120(%rsp)
- movaps %xmm11, -104(%rsp)
- movaps %xmm10, -88(%rsp)
- movaps %xmm9, -72(%rsp)
- movaps %xmm8, -56(%rsp)
- movaps %xmm7, -40(%rsp)
- movaps %xmm6, -24(%rsp)
-
- # Save caller stack pointer:
- mov %rsp, (%rcx)
-
- # Restore callee stack pointer:
- mov (%rdx), %rsp
-
- movaps -24(%rsp), %xmm6
- movaps -40(%rsp), %xmm7
- movaps -56(%rsp), %xmm8
- movaps -72(%rsp), %xmm9
- movaps -88(%rsp), %xmm10
- movaps -104(%rsp), %xmm11
- movaps -120(%rsp), %xmm12
- movaps -136(%rsp), %xmm13
- movaps -152(%rsp), %xmm14
- movaps -168(%rsp), %xmm15
-
- # Restore callee stack:
- popq %r15
- popq %r14
- popq %r13
- popq %r12
- popq %rsi
- popq %rdi
- popq %rbx
- popq %rbp
-
- # Restore the thread information block:
- popq %gs:16
- popq %gs:8
-
- # Put the first argument into the return value:
- mov %rcx, %rax
-
- # We pop the return address and jump to it:
- ret
-
-.globl coroutine_trampoline
-coroutine_trampoline:
- # Do not remove this. This forces 16-byte alignment when entering the coroutine.
- ret
diff --git a/coroutine/win64/Context.asm b/coroutine/win64/Context.asm
deleted file mode 100644
index 59673ffa3e..0000000000
--- a/coroutine/win64/Context.asm
+++ /dev/null
@@ -1,79 +0,0 @@
-;;
-;; This file is part of the "Coroutine" project and released under the MIT License.
-;;
-;; Created by Samuel Williams on 10/5/2018.
-;; Copyright, 2018, by Samuel Williams. All rights reserved.
-;;
-
-.code
-
-coroutine_transfer proc
- ; Save the thread information block:
- push qword ptr gs:[8]
- push qword ptr gs:[16]
-
- ; Save caller registers:
- push rbp
- push rbx
- push rdi
- push rsi
- push r12
- push r13
- push r14
- push r15
-
- movaps [rsp - 24], xmm6
- movaps [rsp - 40], xmm7
- movaps [rsp - 56], xmm8
- movaps [rsp - 72], xmm9
- movaps [rsp - 88], xmm10
- movaps [rsp - 104], xmm11
- movaps [rsp - 120], xmm12
- movaps [rsp - 136], xmm13
- movaps [rsp - 152], xmm14
- movaps [rsp - 168], xmm15
-
- ; Save caller stack pointer:
- mov [rcx], rsp
-
- ; Restore callee stack pointer:
- mov rsp, [rdx]
-
- movaps xmm15, [rsp - 168]
- movaps xmm14, [rsp - 152]
- movaps xmm13, [rsp - 136]
- movaps xmm12, [rsp - 120]
- movaps xmm11, [rsp - 104]
- movaps xmm10, [rsp - 88]
- movaps xmm9, [rsp - 72]
- movaps xmm8, [rsp - 56]
- movaps xmm7, [rsp - 40]
- movaps xmm6, [rsp - 24]
-
- ; Restore callee stack:
- pop r15
- pop r14
- pop r13
- pop r12
- pop rsi
- pop rdi
- pop rbx
- pop rbp
-
- ; Restore the thread information block:
- pop qword ptr gs:[16]
- pop qword ptr gs:[8]
-
- ; Put the first argument into the return value:
- mov rax, rcx
-
- ; We pop the return address and jump to it:
- ret
-coroutine_transfer endp
-
-coroutine_trampoline proc
- ; Do not remove this. This forces 16-byte alignment when entering the coroutine.
- ret
-coroutine_trampoline endp
-
-end
diff --git a/coroutine/win64/Context.h b/coroutine/win64/Context.h
deleted file mode 100644
index 16a8f583ab..0000000000
--- a/coroutine/win64/Context.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * This file is part of the "Coroutine" project and released under the MIT License.
- *
- * Created by Samuel Williams on 10/5/2018.
- * Copyright, 2018, by Samuel Williams. All rights reserved.
-*/
-
-#pragma once
-
-#include <assert.h>
-#include <string.h>
-
-#if __cplusplus
-extern "C" {
-#endif
-
-#define COROUTINE __declspec(noreturn) void
-
-const size_t COROUTINE_REGISTERS = 8;
-const size_t COROUTINE_XMM_REGISTERS = 1+10*2;
-
-typedef struct
-{
- void **stack_pointer;
-} coroutine_context;
-
-typedef void(* coroutine_start)(coroutine_context *from, coroutine_context *self);
-
-void coroutine_trampoline();
-
-static inline void coroutine_initialize(
- coroutine_context *context,
- coroutine_start start,
- void *stack_pointer,
- size_t stack_size
-) {
- /* Force 16-byte alignment */
- context->stack_pointer = (void**)((uintptr_t)stack_pointer & ~0xF);
-
- if (!start) {
- assert(!context->stack_pointer);
- /* We are main coroutine for this thread */
- return;
- }
-
- /* Win64 ABI requires space for arguments */
- context->stack_pointer -= 4;
-
- /* Return address */
- *--context->stack_pointer = 0;
- *--context->stack_pointer = (void*)start;
- *--context->stack_pointer = (void*)coroutine_trampoline;
-
- /* Windows Thread Information Block */
- /* *--context->stack_pointer = 0; */ /* gs:[0x00] is not used */
- *--context->stack_pointer = (void*)stack_pointer; /* gs:[0x08] */
- *--context->stack_pointer = (void*)((char *)stack_pointer - stack_size); /* gs:[0x10] */
-
- context->stack_pointer -= COROUTINE_REGISTERS;
- memset(context->stack_pointer, 0, sizeof(void*) * COROUTINE_REGISTERS);
- memset(context->stack_pointer - COROUTINE_XMM_REGISTERS, 0, sizeof(void*) * COROUTINE_XMM_REGISTERS);
-}
-
-coroutine_context * coroutine_transfer(coroutine_context * current, coroutine_context * target);
-
-static inline void coroutine_destroy(coroutine_context * context)
-{
-}
-
-#if __cplusplus
-}
-#endif
diff --git a/coroutine/x86/Context.S b/coroutine/x86/Context.S
deleted file mode 100644
index d6a0a2def7..0000000000
--- a/coroutine/x86/Context.S
+++ /dev/null
@@ -1,43 +0,0 @@
-##
-## This file is part of the "Coroutine" project and released under the MIT License.
-##
-## Created by Samuel Williams on 3/11/2018.
-## Copyright, 2018, by Samuel Williams. All rights reserved.
-##
-
-.text
-
-.globl coroutine_transfer
-coroutine_transfer:
-
-# For older linkers
-.globl _coroutine_transfer
-_coroutine_transfer:
-
- # Save caller registers
- pushl %ebp
- pushl %ebx
- pushl %edi
- pushl %esi
-
- # Save caller stack pointer
- movl %esp, (%ecx)
-
- # Restore callee stack pointer
- movl (%edx), %esp
-
- # Restore callee stack
- popl %esi
- popl %edi
- popl %ebx
- popl %ebp
-
- # Save the first argument as the return value
- movl %ecx, %eax
-
- # Jump to the address on the stack
- ret
-
-#if defined(__linux__) && defined(__ELF__)
-.section .note.GNU-stack,"",%progbits
-#endif
diff --git a/coroutine/x86/Context.h b/coroutine/x86/Context.h
deleted file mode 100644
index b077227a1d..0000000000
--- a/coroutine/x86/Context.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * This file is part of the "Coroutine" project and released under the MIT License.
- *
- * Created by Samuel Williams on 3/11/2018.
- * Copyright, 2018, by Samuel Williams. All rights reserved.
-*/
-
-#pragma once
-
-#include <assert.h>
-#include <string.h>
-
-#if __cplusplus
-extern "C" {
-#endif
-
-#define COROUTINE __attribute__((noreturn, fastcall)) void
-
-const size_t COROUTINE_REGISTERS = 4;
-
-typedef struct
-{
- void **stack_pointer;
-} coroutine_context;
-
-typedef COROUTINE(* coroutine_start)(coroutine_context *from, coroutine_context *self) __attribute__((fastcall));
-
-static inline void coroutine_initialize(
- coroutine_context *context,
- coroutine_start start,
- void *stack_pointer,
- size_t stack_size
-) {
- /* Force 16-byte alignment */
- context->stack_pointer = (void**)((uintptr_t)stack_pointer & ~0xF);
-
- if (!start) {
- assert(!context->stack_pointer);
- /* We are main coroutine for this thread */
- return;
- }
-
- *--context->stack_pointer = NULL;
- *--context->stack_pointer = (void*)start;
-
- context->stack_pointer -= COROUTINE_REGISTERS;
- memset(context->stack_pointer, 0, sizeof(void*) * COROUTINE_REGISTERS);
-}
-
-coroutine_context * coroutine_transfer(coroutine_context * current, coroutine_context * target) __attribute__((fastcall));
-
-static inline void coroutine_destroy(coroutine_context * context)
-{
- context->stack_pointer = NULL;
-}
-
-#if __cplusplus
-}
-#endif
diff --git a/cygwin/GNUmakefile.in b/cygwin/GNUmakefile.in
index 192cf43b37..14ffd1db85 100644
--- a/cygwin/GNUmakefile.in
+++ b/cygwin/GNUmakefile.in
@@ -3,7 +3,6 @@ include Makefile
ENABLE_SHARED=@ENABLE_SHARED@
DLLWRAP = @DLLWRAP@ --target=@target_os@ --driver-name="$(CC)"
WINDRES = @WINDRES@ --preprocessor="$(CPP) -xc" -DRC_INVOKED
-STRIP = @STRIP@
ifeq (@target_os@,cygwin)
DLL_BASE_NAME := $(LIBRUBY_SO:.dll=)
@@ -11,6 +10,9 @@ else
DLL_BASE_NAME := $(RUBY_SO_NAME)
DLLWRAP += -mno-cygwin
VPATH := $(VPATH):$(srcdir)/win32
+ STUBPROGRAM = rubystub$(EXEEXT)
+ IGNOREDPATTERNS = %~ .% %.orig %.rej \#%\#
+ SCRIPTPROGRAMS = $(addsuffix $(EXEEXT),$(filter-out $(IGNOREDPATTERNS),$(notdir $(wildcard $(srcdir)/bin/*))))
endif
ifneq ($(ENABLE_SHARED),yes)
@@ -30,8 +32,6 @@ WPROGRAM = $(RUBYW_INSTALL_NAME)$(EXEEXT)
-include uncommon.mk
-include $(srcdir)/defs/gmake.mk
-
SOLIBS := $(DLL_BASE_NAME).res.@OBJEXT@ $(SOLIBS)
override EXTOBJS += $(if $(filter-out $(RUBYW_INSTALL_NAME),$(@:$(EXEEXT)=)),$(RUBY_INSTALL_NAME),$(@:$(EXEEXT)=)).res.$(OBJEXT)
RCFILES = $(RUBY_INSTALL_NAME).rc $(RUBYW_INSTALL_NAME).rc $(DLL_BASE_NAME).rc
@@ -39,6 +39,13 @@ RUBYDEF = $(DLL_BASE_NAME).def
ruby: $(PROGRAM)
rubyw: $(WPROGRAM)
+stub: $(STUBPROGRAM)
+scriptbin: $(SCRIPTPROGRAMS)
+
+%$(EXEEXT): bin/% $(STUBPROGRAM)
+ $(ECHO) generating $@
+ $(Q) { cat $(STUBPROGRAM); echo; sed -e '1{' -e '/^#!.*ruby/!i\' -e '#!/bin/ruby' -e '}' $<; } > $@
+ $(Q) chmod +x $@
$(LIBRUBY): $(RUBY_EXP) $(LIBRUBY_SO)
$(RUBY_EXP) $(LIBRUBY_SO): $(DLL_BASE_NAME).res.@OBJEXT@
@@ -47,11 +54,11 @@ $(RUBY_EXP) $(LIBRUBY_SO): $(DLL_BASE_NAME).res.@OBJEXT@
$(ECHO) compiling $@
$(Q) $(WINDRES) --include-dir . --include-dir $(<D) --include-dir $(srcdir)/win32 $< $@
-%.rc: $(RBCONFIG) $(srcdir)/revision.h $(srcdir)/win32/resource.rb
+$(RCFILES): $(RBCONFIG) $(srcdir)/revision.h $(srcdir)/win32/resource.rb
$(ECHO) generating $@
$(Q) $(MINIRUBY) $(srcdir)/win32/resource.rb \
-ruby_name=$(RUBY_INSTALL_NAME) -rubyw_name=$(RUBYW_INSTALL_NAME) \
- -so_name=$(DLL_BASE_NAME) -output=$(*F) \
+ -so_name=$(DLL_BASE_NAME) \
. $(icondirs) $(srcdir)/win32
$(PROGRAM): $(RUBY_INSTALL_NAME).res.@OBJEXT@
@@ -60,7 +67,11 @@ $(WPROGRAM): $(RUBYW_INSTALL_NAME).res.@OBJEXT@
$(ECHO) linking $@
$(Q) $(PURIFY) $(CC) -mwindows -e $(SYMBOL_PREFIX)mainCRTStartup $(LDFLAGS) $(XLDFLAGS) \
$(MAINOBJ) $(EXTOBJS) $(LIBRUBYARG) $(LIBS) -o $@
-$(STUBPROGRAM): $(RUBY_INSTALL_NAME).res.@OBJEXT@
+$(STUBPROGRAM): $(RUBY_INSTALL_NAME).res.@OBJEXT@ win32/stub.@OBJEXT@
+ @rm -f $@
+ $(ECHO) linking $@
+ $(Q) $(PURIFY) $(CC) $(LDFLAGS) $(XLDFLAGS) \
+ win32/stub.@OBJEXT@ $(EXTOBJS) $(LIBRUBYARG) $(LIBS) -o $@
$(RUBY_EXP): $(LIBRUBY_A)
$(ECHO) creating $@
@@ -77,13 +88,6 @@ $(OBJS) $(MAINOBJ): win32.h
dir.$(OBJEXT) win32/win32.$(OBJEXT): win32/dir.h
file.$(OBJEXT) win32/win32.$(OBJEXT): win32/file.h
-
-MSYS2_ARG_CONV_EXCL_PARAM = --exclude=;--name=
-
-yes-test-ruby: export MSYS2_ARG_CONV_EXCL=$(MSYS2_ARG_CONV_EXCL_PARAM)
-yes-test-all: export MSYS2_ARG_CONV_EXCL=$(MSYS2_ARG_CONV_EXCL_PARAM)
-yes-test-almost: export MSYS2_ARG_CONV_EXCL=$(MSYS2_ARG_CONV_EXCL_PARAM)
-
endif
$(LIBRUBY_SO): $(RUBYDEF)
@@ -96,7 +100,7 @@ clean-local::
@$(RM) $(RUBYDEF)
ifeq (@target_os@,cygwin)
-cygwin-$(RUBY_INSTALL_NAME)$(MAJOR)$(MINOR)0.dll: $(LIBRUBY_A) $(RUBYDEF)
+cygwin-$(RUBY_INSTALL_NAME)$(MAJOR)$(MINOR)$(TEENY).dll: $(LIBRUBY_A) $(RUBYDEF)
$(ECHO) generating $@
$(Q) @DLLWRAP@ -s --def=$(RUBYDEF) -o $@
endif
diff --git a/debug.c b/debug.c
index e4ad163ad1..a600259818 100644
--- a/debug.c
+++ b/debug.c
@@ -11,12 +11,10 @@
#include "ruby/ruby.h"
#include "ruby/encoding.h"
-#include "ruby/io.h"
#include "ruby/util.h"
#include "vm_debug.h"
#include "eval_intern.h"
#include "vm_core.h"
-#include "symbol.h"
#include "id.h"
/* for gdb */
@@ -31,41 +29,12 @@ const union {
enum ruby_encoding_consts encoding_consts;
enum ruby_coderange_type enc_coderange_types;
enum ruby_econv_flag_type econv_flag_types;
- enum ruby_robject_flags robject_flags;
- enum ruby_rmodule_flags rmodule_flags;
- enum ruby_rstring_flags rstring_flags;
- enum ruby_rarray_flags rarray_flags;
enum {
- RUBY_FMODE_READABLE = FMODE_READABLE,
- RUBY_FMODE_WRITABLE = FMODE_WRITABLE,
- RUBY_FMODE_READWRITE = FMODE_READWRITE,
- RUBY_FMODE_BINMODE = FMODE_BINMODE,
- RUBY_FMODE_SYNC = FMODE_SYNC,
- RUBY_FMODE_TTY = FMODE_TTY,
- RUBY_FMODE_DUPLEX = FMODE_DUPLEX,
- RUBY_FMODE_APPEND = FMODE_APPEND,
- RUBY_FMODE_CREATE = FMODE_CREATE,
- RUBY_FMODE_NOREVLOOKUP = 0x00000100,
- RUBY_FMODE_TRUNC = FMODE_TRUNC,
- RUBY_FMODE_TEXTMODE = FMODE_TEXTMODE,
- RUBY_FMODE_PREP = 0x00010000,
- RUBY_FMODE_SETENC_BY_BOM = FMODE_SETENC_BY_BOM,
- RUBY_FMODE_UNIX = 0x00200000,
- RUBY_FMODE_INET = 0x00400000,
- RUBY_FMODE_INET6 = 0x00800000,
-
RUBY_NODE_TYPESHIFT = NODE_TYPESHIFT,
RUBY_NODE_TYPEMASK = NODE_TYPEMASK,
RUBY_NODE_LSHIFT = NODE_LSHIFT,
RUBY_NODE_FL_NEWLINE = NODE_FL_NEWLINE
} various;
- union {
- enum imemo_type types;
- enum {RUBY_IMEMO_MASK = IMEMO_MASK} mask;
- struct RIMemo *ptr;
- } imemo;
- struct RSymbol *symbol_ptr;
- enum vm_call_flag_bits vm_call_flags;
} ruby_dummy_gdb_enums;
const SIGNED_VALUE RUBY_NODE_LMASK = NODE_LMASK;
@@ -90,16 +59,14 @@ ruby_debug_printf(const char *format, ...)
va_end(ap);
}
-#include "gc.h"
-
VALUE
ruby_debug_print_value(int level, int debug_level, const char *header, VALUE obj)
{
if (level < debug_level) {
- char buff[0x100];
- rb_raw_obj_info(buff, 0x100, obj);
-
- fprintf(stderr, "DBG> %s: %s\n", header, buff);
+ VALUE str;
+ str = rb_inspect(obj);
+ fprintf(stderr, "DBG> %s: %s\n", header,
+ obj == (VALUE)(SIGNED_VALUE)-1 ? "" : StringValueCStr(str));
fflush(stderr);
}
return obj;
@@ -137,87 +104,25 @@ ruby_debug_breakpoint(void)
/* */
}
-#if defined _WIN32
-# if RUBY_MSVCRT_VERSION >= 80
-extern int ruby_w32_rtc_error;
-# endif
-#endif
-#if defined _WIN32 || defined __CYGWIN__
-#include <windows.h>
-UINT ruby_w32_codepage[2];
-#endif
-extern int ruby_rgengc_debug;
-
-int
-ruby_env_debug_option(const char *str, int len, void *arg)
+static void
+set_debug_option(const char *str, int len, void *arg)
{
- int ov;
- size_t retlen;
- unsigned long n;
+#if defined _WIN32 && RUBY_MSVCRT_VERSION >= 80
+ extern int ruby_w32_rtc_error;
+#endif
#define SET_WHEN(name, var, val) do { \
if (len == sizeof(name) - 1 && \
strncmp(str, (name), len) == 0) { \
(var) = (val); \
- return 1; \
+ return; \
} \
} while (0)
-#define NAME_MATCH_VALUE(name) \
- ((size_t)len >= sizeof(name)-1 && \
- strncmp(str, (name), sizeof(name)-1) == 0 && \
- ((len == sizeof(name)-1 && !(len = 0)) || \
- (str[sizeof(name)-1] == '=' && \
- (str += sizeof(name), len -= sizeof(name), 1))))
-#define SET_UINT(val) do { \
- n = ruby_scan_digits(str, len, 10, &retlen, &ov); \
- if (!ov && retlen) { \
- val = (unsigned int)n; \
- } \
- str += retlen; \
- len -= retlen; \
- } while (0)
-#define SET_UINT_LIST(name, vals, num) do { \
- int i; \
- for (i = 0; i < (num); ++i) { \
- SET_UINT((vals)[i]); \
- if (!len || *str != ':') break; \
- ++str; \
- --len; \
- } \
- if (len > 0) { \
- fprintf(stderr, "ignored "name" option: `%.*s'\n", len, str); \
- } \
- } while (0)
-#define SET_WHEN_UINT(name, vals, num, req) \
- if (NAME_MATCH_VALUE(name)) SET_UINT_LIST(name, vals, num);
-
SET_WHEN("gc_stress", *ruby_initial_gc_stress_ptr, Qtrue);
SET_WHEN("core", ruby_enable_coredump, 1);
- if (NAME_MATCH_VALUE("rgengc")) {
- if (!len) ruby_rgengc_debug = 1;
- else SET_UINT_LIST("rgengc", &ruby_rgengc_debug, 1);
- return 1;
- }
-#if defined _WIN32
-# if RUBY_MSVCRT_VERSION >= 80
+#if defined _WIN32 && RUBY_MSVCRT_VERSION >= 80
SET_WHEN("rtc_error", ruby_w32_rtc_error, 1);
-# endif
#endif
-#if defined _WIN32 || defined __CYGWIN__
- if (NAME_MATCH_VALUE("codepage")) {
- if (!len) fprintf(stderr, "missing codepage argument");
- else SET_UINT_LIST("codepage", ruby_w32_codepage, numberof(ruby_w32_codepage));
- return 1;
- }
-#endif
- return 0;
-}
-
-static void
-set_debug_option(const char *str, int len, void *arg)
-{
- if (!ruby_env_debug_option(str, len, arg)) {
- fprintf(stderr, "unexpected debug option: %.*s\n", len, str);
- }
+ fprintf(stderr, "unexpected debug option: %.*s\n", len, str);
}
void
diff --git a/debug_counter.c b/debug_counter.c
deleted file mode 100644
index 8c4004af41..0000000000
--- a/debug_counter.c
+++ /dev/null
@@ -1,55 +0,0 @@
-/**********************************************************************
-
- debug_counter.c -
-
- created at: Tue Feb 21 16:51:18 2017
-
- Copyright (C) 2017 Koichi Sasada
-
-**********************************************************************/
-
-#include "debug_counter.h"
-#if USE_DEBUG_COUNTER
-#include <stdio.h>
-#include <locale.h>
-#include "internal.h"
-
-static const char *const debug_counter_names[] = {
- ""
-#define RB_DEBUG_COUNTER(name) #name,
-#include "debug_counter.h"
-#undef RB_DEBUG_COUNTER
-};
-
-size_t rb_debug_counter[numberof(debug_counter_names)];
-
-void
-rb_debug_counter_show_results(const char *msg)
-{
- const char *env = getenv("RUBY_DEBUG_COUNTER_DISABLE");
-
- setlocale(LC_NUMERIC, "");
-
- if (env == NULL || strcmp("1", env) != 0) {
- int i;
- fprintf(stderr, "[RUBY_DEBUG_COUNTER]\t%d %s\n", getpid(), msg);
- for (i=0; i<RB_DEBUG_COUNTER_MAX; i++) {
- fprintf(stderr, "[RUBY_DEBUG_COUNTER]\t%-30s\t%'14"PRIuSIZE"\n",
- debug_counter_names[i],
- rb_debug_counter[i]);
- }
- }
-}
-
-__attribute__((destructor))
-static void
-debug_counter_show_results_at_exit(void)
-{
- rb_debug_counter_show_results("normal exit.");
-}
-#else
-void
-rb_debug_counter_show_results(const char *msg)
-{
-}
-#endif /* USE_DEBUG_COUNTER */
diff --git a/debug_counter.h b/debug_counter.h
deleted file mode 100644
index bd03204af4..0000000000
--- a/debug_counter.h
+++ /dev/null
@@ -1,283 +0,0 @@
-/**********************************************************************
-
- debug_counter.h -
-
- created at: Tue Feb 21 16:51:18 2017
-
- Copyright (C) 2017 Koichi Sasada
-
-**********************************************************************/
-
-#ifndef USE_DEBUG_COUNTER
-#define USE_DEBUG_COUNTER 0
-#endif
-
-#ifdef RB_DEBUG_COUNTER
-
-/*
- * method cache (mc) counts.
- *
- * * mc_inline_hit/miss: inline mc hit/miss counts (VM send insn)
- * * mc_global_hit/miss: global method cache hit/miss counts
- * two types: (1) inline cache miss (VM send insn)
- * (2) called from C (rb_funcall).
- * * mc_global_state_miss: inline mc miss by global_state miss.
- * * mc_class_serial_miss: ... by mc_class_serial_miss
- * * mc_cme_complement: cme complement counts.
- * * mc_cme_complement_hit: cme cache hit counts.
- * * mc_search_super: search_method() call counts.
- */
-RB_DEBUG_COUNTER(mc_inline_hit)
-RB_DEBUG_COUNTER(mc_inline_miss)
-RB_DEBUG_COUNTER(mc_global_hit)
-RB_DEBUG_COUNTER(mc_global_miss)
-RB_DEBUG_COUNTER(mc_global_state_miss)
-RB_DEBUG_COUNTER(mc_class_serial_miss)
-RB_DEBUG_COUNTER(mc_cme_complement)
-RB_DEBUG_COUNTER(mc_cme_complement_hit)
-RB_DEBUG_COUNTER(mc_search_super)
-
-/*
- * control frame push counts.
- *
- * * frame_push: frame push counts.
- * * frame_push_*: frame push counts per each type.
- * * frame_R2R: Ruby frame to Ruby frame
- * * frame_R2C: Ruby frame to C frame
- * * frame_C2C: C frame to C frame
- * * frame_C2R: C frame to Ruby frame
- */
-RB_DEBUG_COUNTER(frame_push)
-RB_DEBUG_COUNTER(frame_push_method)
-RB_DEBUG_COUNTER(frame_push_block)
-RB_DEBUG_COUNTER(frame_push_class)
-RB_DEBUG_COUNTER(frame_push_top)
-RB_DEBUG_COUNTER(frame_push_cfunc)
-RB_DEBUG_COUNTER(frame_push_ifunc)
-RB_DEBUG_COUNTER(frame_push_eval)
-RB_DEBUG_COUNTER(frame_push_rescue)
-RB_DEBUG_COUNTER(frame_push_dummy)
-
-RB_DEBUG_COUNTER(frame_R2R)
-RB_DEBUG_COUNTER(frame_R2C)
-RB_DEBUG_COUNTER(frame_C2C)
-RB_DEBUG_COUNTER(frame_C2R)
-
-/* instance variable counts
- *
- * * ivar_get_ic_hit/miss: ivar_get inline cache (ic) hit/miss counts (VM insn)
- * * ivar_get_ic_miss_serial: ivar_get ic miss reason by serial (VM insn)
- * * ivar_get_ic_miss_unset: ... by unset (VM insn)
- * * ivar_get_ic_miss_noobject: ... by "not T_OBJECT" (VM insn)
- * * ivar_set_...: same counts with ivar_set (VM insn)
- * * ivar_get/set_base: call counts of "rb_ivar_get/set()".
- * because of (1) ic miss.
- * (2) direct call by C extensions.
- */
-RB_DEBUG_COUNTER(ivar_get_ic_hit)
-RB_DEBUG_COUNTER(ivar_get_ic_miss)
-RB_DEBUG_COUNTER(ivar_get_ic_miss_serial)
-RB_DEBUG_COUNTER(ivar_get_ic_miss_unset)
-RB_DEBUG_COUNTER(ivar_get_ic_miss_noobject)
-RB_DEBUG_COUNTER(ivar_set_ic_hit)
-RB_DEBUG_COUNTER(ivar_set_ic_miss)
-RB_DEBUG_COUNTER(ivar_set_ic_miss_serial)
-RB_DEBUG_COUNTER(ivar_set_ic_miss_unset)
-RB_DEBUG_COUNTER(ivar_set_ic_miss_oorange)
-RB_DEBUG_COUNTER(ivar_set_ic_miss_noobject)
-RB_DEBUG_COUNTER(ivar_get_base)
-RB_DEBUG_COUNTER(ivar_set_base)
-
-/* local variable counts
- *
- * * lvar_get: total lvar get counts (VM insn)
- * * lvar_get_dynamic: lvar get counts if accessing upper env (VM insn)
- * * lvar_set*: same as "get"
- * * lvar_set_slowpath: counts using vm_env_write_slowpath()
- */
-RB_DEBUG_COUNTER(lvar_get)
-RB_DEBUG_COUNTER(lvar_get_dynamic)
-RB_DEBUG_COUNTER(lvar_set)
-RB_DEBUG_COUNTER(lvar_set_dynamic)
-RB_DEBUG_COUNTER(lvar_set_slowpath)
-
-/* GC counts:
- *
- * * count: simple count
- * * _minor: minor gc
- * * _major: major gc
- * * other suffix is corresponding to last_gc_info or
- * gc_profile_record_flag in gc.c.
- */
-RB_DEBUG_COUNTER(gc_count)
-RB_DEBUG_COUNTER(gc_minor_newobj)
-RB_DEBUG_COUNTER(gc_minor_malloc)
-RB_DEBUG_COUNTER(gc_minor_method)
-RB_DEBUG_COUNTER(gc_minor_capi)
-RB_DEBUG_COUNTER(gc_minor_stress)
-RB_DEBUG_COUNTER(gc_major_nofree)
-RB_DEBUG_COUNTER(gc_major_oldgen)
-RB_DEBUG_COUNTER(gc_major_shady)
-RB_DEBUG_COUNTER(gc_major_force)
-RB_DEBUG_COUNTER(gc_major_oldmalloc)
-
-/* object allocation counts:
- *
- * * obj_newobj: newobj counts
- * * obj_newobj_slowpath: newobj with slowpath counts
- * * obj_newobj_wb_unprotected: newobj for wb_unprotecte.
- * * obj_free: obj_free() counts
- * * obj_promote: promoted counts (oldgen)
- * * obj_wb_unprotect: wb unprotect counts
- *
- * * obj_[type]_[attr]: *free'ed counts* for each type.
- * Note that it is not a allocated counts.
- * * [type]
- * * _obj: T_OBJECT
- * * _str: T_STRING
- * * _ary: T_ARRAY
- * * _xxx: T_XXX (hash, struct, ...)
- *
- * * [attr]
- * * _ptr: R?? is not embed.
- * * _embed: R?? is embed.
- * * _transient: R?? uses transient heap.
- * * type specific attr.
- * * str_shared: str is shared.
- * * str_nofree: nofree
- * * str_fstr: fstr
- * * hash_empty: hash is empty
- * * hash_under4: has under 4 entries
- * * hash_ge4: has n entries (4<=n<8)
- * * hash_ge8: has n entries (8<=n)
- * * data_empty: T_DATA but no memory free.
- * * data_xfree: free'ed by xfree().
- * * data_imm_free: free'ed immediately.
- * * data_zombie: free'ed with zombie.
- * * imemo_*: T_IMEMO with each type.
- */
-RB_DEBUG_COUNTER(obj_newobj)
-RB_DEBUG_COUNTER(obj_newobj_slowpath)
-RB_DEBUG_COUNTER(obj_newobj_wb_unprotected)
-RB_DEBUG_COUNTER(obj_free)
-RB_DEBUG_COUNTER(obj_promote)
-RB_DEBUG_COUNTER(obj_wb_unprotect)
-
-RB_DEBUG_COUNTER(obj_obj_embed)
-RB_DEBUG_COUNTER(obj_obj_transient)
-RB_DEBUG_COUNTER(obj_obj_ptr)
-
-RB_DEBUG_COUNTER(obj_str_ptr)
-RB_DEBUG_COUNTER(obj_str_embed)
-RB_DEBUG_COUNTER(obj_str_shared)
-RB_DEBUG_COUNTER(obj_str_nofree)
-RB_DEBUG_COUNTER(obj_str_fstr)
-
-RB_DEBUG_COUNTER(obj_ary_embed)
-RB_DEBUG_COUNTER(obj_ary_transient)
-RB_DEBUG_COUNTER(obj_ary_ptr)
-
-RB_DEBUG_COUNTER(obj_hash_empty)
-RB_DEBUG_COUNTER(obj_hash_under4)
-RB_DEBUG_COUNTER(obj_hash_ge4)
-RB_DEBUG_COUNTER(obj_hash_ge8)
-RB_DEBUG_COUNTER(obj_hash_ar)
-RB_DEBUG_COUNTER(obj_hash_st)
-RB_DEBUG_COUNTER(obj_hash_transient)
-
-RB_DEBUG_COUNTER(obj_hash_force_convert)
-
-RB_DEBUG_COUNTER(obj_struct_embed)
-RB_DEBUG_COUNTER(obj_struct_transient)
-RB_DEBUG_COUNTER(obj_struct_ptr)
-
-RB_DEBUG_COUNTER(obj_regexp_ptr)
-
-RB_DEBUG_COUNTER(obj_data_empty)
-RB_DEBUG_COUNTER(obj_data_xfree)
-RB_DEBUG_COUNTER(obj_data_imm_free)
-RB_DEBUG_COUNTER(obj_data_zombie)
-
-RB_DEBUG_COUNTER(obj_match_ptr)
-RB_DEBUG_COUNTER(obj_file_ptr)
-RB_DEBUG_COUNTER(obj_bignum_ptr)
-
-RB_DEBUG_COUNTER(obj_symbol)
-
-RB_DEBUG_COUNTER(obj_imemo_ment)
-RB_DEBUG_COUNTER(obj_imemo_iseq)
-RB_DEBUG_COUNTER(obj_imemo_env)
-RB_DEBUG_COUNTER(obj_imemo_tmpbuf)
-RB_DEBUG_COUNTER(obj_imemo_ast)
-RB_DEBUG_COUNTER(obj_imemo_cref)
-RB_DEBUG_COUNTER(obj_imemo_svar)
-RB_DEBUG_COUNTER(obj_imemo_throw_data)
-RB_DEBUG_COUNTER(obj_imemo_ifunc)
-RB_DEBUG_COUNTER(obj_imemo_memo)
-RB_DEBUG_COUNTER(obj_imemo_parser_strterm)
-
-RB_DEBUG_COUNTER(obj_iclass_ptr)
-RB_DEBUG_COUNTER(obj_class_ptr)
-RB_DEBUG_COUNTER(obj_module_ptr)
-
-/* heap function counts
- *
- * * heap_xmalloc/realloc/xfree: call counts
- */
-RB_DEBUG_COUNTER(heap_xmalloc)
-RB_DEBUG_COUNTER(heap_xrealloc)
-RB_DEBUG_COUNTER(heap_xfree)
-
-/* transient_heap */
-RB_DEBUG_COUNTER(theap_alloc)
-RB_DEBUG_COUNTER(theap_alloc_fail)
-RB_DEBUG_COUNTER(theap_evacuate)
-
-/* load (not implemented yet) */
-/*
-RB_DEBUG_COUNTER(load_files)
-RB_DEBUG_COUNTER(load_path_is_not_realpath)
-*/
-#endif
-
-#ifndef RUBY_DEBUG_COUNTER_H
-#define RUBY_DEBUG_COUNTER_H 1
-
-#if !defined(__GNUC__) && USE_DEBUG_COUNTER
-#error "USE_DEBUG_COUNTER is not supported by other than __GNUC__"
-#endif
-
-enum rb_debug_counter_type {
-#define RB_DEBUG_COUNTER(name) RB_DEBUG_COUNTER_##name,
-#include __FILE__
- RB_DEBUG_COUNTER_MAX
-#undef RB_DEBUG_COUNTER
-};
-
-#if USE_DEBUG_COUNTER
-#include "ruby/ruby.h"
-
-extern size_t rb_debug_counter[];
-
-inline static int
-rb_debug_counter_add(enum rb_debug_counter_type type, int add, int cond)
-{
- if (cond) {
- rb_debug_counter[(int)type] += add;
- }
- return cond;
-}
-
-#define RB_DEBUG_COUNTER_INC(type) rb_debug_counter_add(RB_DEBUG_COUNTER_##type, 1, 1)
-#define RB_DEBUG_COUNTER_INC_UNLESS(type, cond) (!rb_debug_counter_add(RB_DEBUG_COUNTER_##type, 1, !(cond)))
-#define RB_DEBUG_COUNTER_INC_IF(type, cond) rb_debug_counter_add(RB_DEBUG_COUNTER_##type, 1, (cond))
-
-#else
-#define RB_DEBUG_COUNTER_INC(type) ((void)0)
-#define RB_DEBUG_COUNTER_INC_UNLESS(type, cond) (cond)
-#define RB_DEBUG_COUNTER_INC_IF(type, cond) (cond)
-#endif
-
-void rb_debug_counter_show_results(const char *msg);
-
-#endif /* RUBY_DEBUG_COUNTER_H */
diff --git a/defs/gmake.mk b/defs/gmake.mk
index d8a43802ef..439ca9b6f0 100644
--- a/defs/gmake.mk
+++ b/defs/gmake.mk
@@ -1,28 +1,13 @@
# -*- makefile-gmake -*-
gnumake = yes
-override gnumake_recursive := $(if $(findstring n,$(firstword $(MFLAGS))),,+)
-override mflags := $(filter-out -j%,$(MFLAGS))
-MSPECOPT += $(if $(filter -j%,$(MFLAGS)),-j)
-CHECK_TARGETS := great exam love check test check% test% btest%
-# expand test targets, and those dependents
-TEST_TARGETS := $(filter $(CHECK_TARGETS),$(MAKECMDGOALS))
-TEST_DEPENDS := $(filter-out commit $(TEST_TARGETS),$(MAKECMDGOALS))
-TEST_TARGETS := $(patsubst great,exam,$(TEST_TARGETS))
-TEST_DEPENDS := $(filter-out great $(TEST_TARGETS),$(TEST_DEPENDS))
-TEST_TARGETS := $(patsubst exam,check,$(TEST_TARGETS))
-TEST_TARGETS := $(patsubst check,test-spec test-all,$(TEST_TARGETS))
-TEST_TARGETS := $(patsubst test-rubyspec,test-spec,$(TEST_TARGETS))
-TEST_DEPENDS := $(filter-out exam check test-spec $(TEST_TARGETS),$(TEST_DEPENDS))
-TEST_TARGETS := $(patsubst love,check,$(TEST_TARGETS))
-TEST_DEPENDS := $(filter-out love $(TEST_TARGETS),$(TEST_DEPENDS))
-TEST_TARGETS := $(patsubst test-all,test test-testframework test-almost,$(patsubst check-%,test test-%,$(TEST_TARGETS)))
-TEST_DEPENDS := $(filter-out test-all $(TEST_TARGETS),$(TEST_DEPENDS))
-TEST_TARGETS := $(patsubst test,test-short,$(TEST_TARGETS))
-TEST_DEPENDS := $(filter-out test $(TEST_TARGETS),$(TEST_DEPENDS))
-TEST_TARGETS := $(patsubst test-short,btest-ruby test-knownbug test-basic,$(TEST_TARGETS))
-TEST_DEPENDS := $(filter-out test-short $(TEST_TARGETS),$(TEST_DEPENDS))
-TEST_DEPENDS += $(if $(filter great exam love check,$(MAKECMDGOALS)),all exts)
+CHECK_TARGETS := exam love check%
+TEST_TARGETS := $(filter check test check% test% btest%,$(MAKECMDGOALS))
+TEST_TARGETS += $(subst check,test-all,$(patsubst check-%,test-%,$(TEST_TARGETS)))
+TEST_TARGETS := $(patsubst test-%,yes-test-%,$(patsubst btest-%,yes-btest-%,$(TEST_TARGETS)))
+TEST_DEPENDS := $(if $(TEST_TARGETS),$(filter all main exts,$(MAKECMDGOALS)))
+TEST_DEPENDS += $(if $(filter $(CHECK_TARGETS),$(MAKECMDGOALS)),main)
+TEST_DEPENDS += $(if $(filter main,$(TEST_DEPENDS)),$(if $(filter all,$(INSTALLDOC)),docs))
ifneq ($(filter -O0 -Od,$(optflags)),)
override XCFLAGS := $(filter-out -D_FORTIFY_SOURCE=%,$(XCFLAGS))
@@ -51,25 +36,24 @@ define archcmd
%.i: %.$(1).i
endef
-$(foreach arch,$(arch_flags),\
+$(foreach arch,$(filter -arch=%,$(subst -arch ,-arch=,$(ARCH_FLAG))),\
$(eval $(call archcmd,$(patsubst -arch=%,%,$(value arch)),$(patsubst -arch=%,-arch %,$(value arch)))))
endif
-.PHONY: $(addprefix yes-,$(TEST_TARGETS))
-
-ifneq ($(filter-out btest%,$(TEST_TARGETS)),)
-$(addprefix yes-,$(TEST_TARGETS)): $(TEST_DEPENDS)
+ifneq ($(filter $(CHECK_TARGETS) test,$(MAKECMDGOALS)),)
+yes-test-knownbug: $(TEST_DEPENDS) yes-btest-ruby
+yes-btest-ruby: $(TEST_DEPENDS) yes-test-sample
+yes-test-sample: $(TEST_DEPENDS)
+endif
+ifneq ($(filter $(CHECK_TARGETS),$(MAKECMDGOALS)) $(filter test-all,$(TEST_TARGETS)),)
+yes-test-testframework yes-test-almost yes-test-ruby: $(filter-out %test-all %test-ruby check%,$(TEST_TARGETS))
+endif
+ifneq ($(filter $(CHECK_TARGETS),$(MAKECMDGOALS))$(if $(filter test-all,$(MAKECMDGOALS)),$(filter test-knownbug,$(MAKECMDGOALS))),)
+yes-test-testframework yes-test-almost yes-test-ruby: yes-test-knownbug
+yes-test-almost: yes-test-testframework
endif
-ORDERED_TEST_TARGETS := $(filter $(TEST_TARGETS), \
- btest-ruby test-knownbug test-basic \
- test-testframework test-ruby test-almost test-all \
- test-spec test-bundler-prepare test-bundler \
- )
-prev_test := $(if $(filter test-spec,$(ORDERED_TEST_TARGETS)),test-spec-precheck)
-$(foreach test,$(ORDERED_TEST_TARGETS), \
- $(eval yes-$(value test) no-$(value test): $(value prev_test)); \
- $(eval prev_test := $(value test)))
+$(TEST_TARGETS): $(TEST_DEPENDS)
ifneq ($(if $(filter install,$(MAKECMDGOALS)),$(filter uninstall,$(MAKECMDGOALS))),)
install-targets := $(filter install uninstall,$(MAKECMDGOALS))
@@ -81,125 +65,14 @@ install-prereq: uninstall
uninstall sudo-precheck: all $(if $(filter all,$(INSTALLDOC)),docs)
endif
+ifneq ($(filter exam,$(MAKECMDGOALS)),)
+test-rubyspec: check
+yes-test-all no-test-all: test
+endif
+
ifneq ($(filter love,$(MAKECMDGOALS)),)
showflags: up
-sudo-precheck: test yes-test-testframework no-test-testframework
+sudo-precheck: test
install-prereq: sudo-precheck
yes-test-all no-test-all: install
-yes-test-almost no-test-almost: install
-endif
-ifneq ($(filter great,$(MAKECMDGOALS)),)
-love: test-rubyspec
-endif
-
-$(srcdir)/missing/des_tables.c: $(srcdir)/missing/crypt.c
-ifeq ($(if $(filter yes,$(CROSS_COMPILING)),,$(CC)),)
- touch $@
-else
- @$(ECHO) building make_des_table
- $(CC) $(CPPFLAGS) -DDUMP $(LDFLAGS) $(XLDFLAGS) $(LIBS) -omake_des_table $(srcdir)/missing/crypt.c
- @[ -x ./make_des_table ]
- @$(ECHO) generating $@
- $(Q) $(MAKEDIRS) $(@D)
- $(Q) ./make_des_table > $@.new
- $(Q) mv $@.new $@
- $(Q) $(RMALL) make_des_table*
endif
-
-STUBPROGRAM = rubystub$(EXEEXT)
-IGNOREDPATTERNS = %~ .% %.orig %.rej \#%\#
-SCRIPTBINDIR := $(if $(EXEEXT),,exec/)
-SCRIPTPROGRAMS = $(addprefix $(SCRIPTBINDIR),$(addsuffix $(EXEEXT),$(filter-out $(IGNOREDPATTERNS),$(notdir $(wildcard $(srcdir)/libexec/*)))))
-
-stub: $(STUBPROGRAM)
-scriptbin: $(SCRIPTPROGRAMS)
-ifneq ($(STUBPROGRAM),rubystub)
-rubystub: $(STUBPROGRAM)
-endif
-
-$(SCRIPTPROGRAMS): $(STUBPROGRAM)
-
-$(STUBPROGRAM): rubystub.$(OBJEXT) $(LIBRUBY) $(MAINOBJ) $(OBJS) $(EXTOBJS) $(SETUP) $(PREP)
-
-rubystub$(EXEEXT):
- @rm -f $@
- $(ECHO) linking $@
- $(Q) $(PURIFY) $(CC) $(LDFLAGS) $(XLDFLAGS) rubystub.$(OBJEXT) $(EXTOBJS) $(LIBRUBYARG) $(MAINLIBS) $(LIBS) $(EXTLIBS) $(OUTFLAG)$@
- $(Q) $(POSTLINK)
- $(if $(STRIP),$(Q) $(STRIP) $@)
-
-$(SCRIPTBINDIR)%$(EXEEXT): bin/% $(STUBPROGRAM) \
- $(if $(SCRIPTBINDIR),$(TIMESTAMPDIR)/.exec.time)
- $(ECHO) generating $@
- $(Q) { cat $(STUBPROGRAM); echo; sed -e '1{' -e '/^#!.*ruby/!i\' -e '#!/bin/ruby' -e '}' $<; } > $@
- $(Q) chmod +x $@
- $(Q) $(POSTLINK)
-
-$(TIMESTAMPDIR)/.exec.time:
- $(Q) mkdir exec
- $(Q) exit > $@
-
-.PHONY: commit
-commit: $(if $(filter commit,$(MAKECMDGOALS)),$(filter-out commit,$(MAKECMDGOALS)))
- @$(BASERUBY) -C "$(srcdir)" -I./tool -rvcs -e 'VCS.detect(".").commit'
- +$(Q) \
- { \
- $(CHDIR) "$(srcdir)"; \
- sed 's/^@.*@$$//;s/@[A-Za-z_][A-Za-z_0-9]*@//g;/^all-incs:/d' defs/gmake.mk Makefile.in; \
- sed 's/{[.;]*$$([a-zA-Z0-9_]*)}//g' common.mk; \
- } | \
- $(MAKE) $(mflags) Q=$(Q) ECHO=$(ECHO) srcdir="$(srcdir)" srcs_vpath="$(srcdir)/" CHDIR="$(CHDIR)" \
- BOOTSTRAPRUBY="$(BOOTSTRAPRUBY)" MINIRUBY="$(BASERUBY)" BASERUBY="$(BASERUBY)" \
- VCSUP="" ENC_MK=.top-enc.mk REVISION_FORCE=PHONY CONFIGURE="$(CONFIGURE)" -f - \
- update-src srcs all-incs
-
-ifeq ($(words $(filter update-gems extract-gems,$(MAKECMDGOALS))),2)
-extract-gems: update-gems
-endif
-
-ifeq ($(filter 0 1,$(words $(arch_flags))),)
-$(foreach x,$(patsubst -arch=%,%,$(arch_flags)), \
- $(eval $$(MJIT_HEADER:.h=)-$(value x).h \
- $$(MJIT_MIN_HEADER:.h=)-$(value x).h \
- $$(TIMESTAMPDIR)/$$(MJIT_HEADER:.h=)-$(value x).time \
- : ARCH_FLAG := -arch $(value x)))
-
-$(foreach x,$(patsubst -arch=%,%,$(arch_flags)), \
- $(eval $$(MJIT_HEADER:.h=)-$(value x).h: \
- $$(TIMESTAMPDIR)/$$(MJIT_HEADER:.h=)-$(value x).time))
-
-mjit_min_headers := $(patsubst -arch=%,$(MJIT_MIN_HEADER:.h=-%.h),$(arch_flags))
-$(MJIT_MIN_HEADER): $(mjit_min_headers) $(PREP)
- @ set -e; set $(patsubst -arch=%,%,$(arch_flags)); \
- cd $(@D); h=$(@F:.h=); \
- exec > $(@F).new; \
- echo '#if 0'; \
- for arch; do\
- echo "#elif defined __$${arch}__"; \
- echo "# include \"$$h-$$arch.h\""; \
- done; \
- echo "#else"; echo "# error unsupported platform"; echo "#endif"
- $(IFCHANGE) $@ $@.new
- $(Q) $(MAKEDIRS) $(MJIT_HEADER_INSTALL_DIR)
- $(Q) $(MAKE_LINK) $@ $(MJIT_HEADER_INSTALL_DIR)/$(@F)
-
-endif
-
-# GNU make treat the target as unmodified when its dependents get
-# updated but it is not updated, while others may not.
-$(srcdir)/revision.h: $(REVISION_H)
-
-# Query on the generated rdoc
-#
-# $ make rdoc:Integer#+
-rdoc\:%: PHONY
- $(Q)$(RUNRUBY) $(srcdir)/libexec/ri --no-standard-docs --doc-dir=$(RDOCOUT) $(patsubst rdoc:%,%,$@)
-
-test_%.rb test/%: programs PHONY
- +$(Q)$(exec) $(RUNRUBY) "$(srcdir)/test/runner.rb" --ruby="$(RUNRUBY)" $(TEST_EXCLUDES) $(TESTOPTS) -- $(patsubst test/%,%,$@)
-
-clean-srcs-ext::
- $(Q)$(RM) $(patsubst $(srcdir)/%,%,$(EXT_SRCS))
-
-clean-srcs-extra::
- $(Q)$(RM) $(patsubst $(srcdir)/%,%,$(EXTRA_SRCS))
diff --git a/defs/id.def b/defs/id.def
index bb7cc6f922..1ff0d9aa3d 100644
--- a/defs/id.def
+++ b/defs/id.def
@@ -1,7 +1,5 @@
# -*- mode: ruby; coding: us-ascii -*-
firstline, predefined = __LINE__+1, %[\
- max
- min
freeze
inspect
intern
@@ -38,16 +36,11 @@ firstline, predefined = __LINE__+1, %[\
to_a
to_s
to_i
- to_f
- to_r
bt
bt_locations
call
mesg
exception
- not NOT
- and AND
- or OR
_ UScore
"/*NULL*/" NULL
@@ -63,13 +56,12 @@ firstline, predefined = __LINE__+1, %[\
core#define_method
core#define_singleton_method
core#set_postexe
+ core#hash_from_ary
+ core#hash_merge_ary
core#hash_merge_ptr
core#hash_merge_kwd
- debug#created_info
-
- $_ LASTLINE
- $~ BACKREF
]
# VM ID OP Parser Token
@@ -79,6 +71,7 @@ token_ops = %[\
UPlus +@ UPLUS
UMinus -@ UMINUS
Pow ** POW
+ DSTAR **
Cmp <=> CMP
PLUS +
MINUS -
@@ -95,14 +88,13 @@ token_ops = %[\
Eqq === EQQ
Neq != NEQ
Not !
- And &
- Or |
Backquote `
EqTilde =~ MATCH
NeqTilde !~ NMATCH
AREF []
ASET []=
COLON2 ::
+ COLON3 ::
ANDOP &&
OROP ||
ANDDOT &.
@@ -153,7 +145,7 @@ predefined.split(/^/).each_with_index do |line, num|
case name
when /\A[A-Z]\w*\z/; const_ids
when /\A(?!\d)\w+\z/; local_ids
- when /\A\$(?:\d+|(?!\d)\w+|\W)\z/; global_ids
+ when /\A\$(?:\d+|(?!\d)\w+)\z/; global_ids
when /\A@@(?!\d)\w+\z/; class_ids
when /\A@(?!\d)\w+\z/; instance_ids
when /\A((?!\d)\w+)=\z/; attrset_ids
diff --git a/defs/keywords b/defs/keywords
index fc30ec2d15..20044a420c 100644
--- a/defs/keywords
+++ b/defs/keywords
@@ -1,8 +1,8 @@
%{
-struct kwtable {short name, id[2], state;};
+struct kwtable {int name, id[2], state;};
const struct kwtable *rb_reserved_word(const char *, unsigned int);
#ifndef RIPPER
-static const struct kwtable *reserved_word(/*!ANSI{*/const char *, unsigned int/*}!ANSI*/);
+static const struct kwtable *reserved_word(const char *, unsigned int);
#define rb_reserved_word(str, len) reserved_word(str, len)
%}
@@ -13,7 +13,7 @@ __LINE__, {keyword__LINE__, keyword__LINE__}, EXPR_END
__FILE__, {keyword__FILE__, keyword__FILE__}, EXPR_END
BEGIN, {keyword_BEGIN, keyword_BEGIN}, EXPR_END
END, {keyword_END, keyword_END}, EXPR_END
-alias, {keyword_alias, keyword_alias}, EXPR_FNAME|EXPR_FITEM
+alias, {keyword_alias, keyword_alias}, EXPR_FNAME
and, {keyword_and, keyword_and}, EXPR_VALUE
begin, {keyword_begin, keyword_begin}, EXPR_BEG
break, {keyword_break, keyword_break}, EXPR_MID
@@ -43,7 +43,7 @@ self, {keyword_self, keyword_self}, EXPR_END
super, {keyword_super, keyword_super}, EXPR_ARG
then, {keyword_then, keyword_then}, EXPR_BEG
true, {keyword_true, keyword_true}, EXPR_END
-undef, {keyword_undef, keyword_undef}, EXPR_FNAME|EXPR_FITEM
+undef, {keyword_undef, keyword_undef}, EXPR_FNAME
unless, {keyword_unless, modifier_unless}, EXPR_VALUE
until, {keyword_until, modifier_until}, EXPR_VALUE
when, {keyword_when, keyword_when}, EXPR_VALUE
diff --git a/defs/known_errors.def b/defs/known_errors.def
index e9694cfbda..b9c490d3a2 100644
--- a/defs/known_errors.def
+++ b/defs/known_errors.def
@@ -1,157 +1,148 @@
+EPERM
+ENOENT
+ESRCH
+EINTR
+EIO
+ENXIO
E2BIG
-EACCES
-EADDRINUSE
-EADDRNOTAVAIL
-EADV
-EAFNOSUPPORT
+ENOEXEC
+EBADF
+ECHILD
EAGAIN
-EALREADY
-EAUTH
-EBADARCH
+ENOMEM
+EACCES
+EFAULT
+ENOTBLK
+EBUSY
+EEXIST
+EXDEV
+ENODEV
+ENOTDIR
+EISDIR
+EINVAL
+ENFILE
+EMFILE
+ENOTTY
+ETXTBSY
+EFBIG
+ENOSPC
+ESPIPE
+EROFS
+EMLINK
+EPIPE
+EDOM
+ERANGE
+EDEADLK
+ENAMETOOLONG
+ENOLCK
+ENOSYS
+ENOTEMPTY
+ELOOP
+EWOULDBLOCK
+ENOMSG
+EIDRM
+ECHRNG
+EL2NSYNC
+EL3HLT
+EL3RST
+ELNRNG
+EUNATCH
+ENOCSI
+EL2HLT
EBADE
-EBADEXEC
-EBADF
-EBADFD
-EBADMACHO
-EBADMSG
EBADR
-EBADRPC
+EXFULL
+ENOANO
EBADRQC
EBADSLT
+EDEADLOCK
EBFONT
-EBUSY
-ECANCELED
-ECAPMODE
-ECHILD
-ECHRNG
+ENOSTR
+ENODATA
+ETIME
+ENOSR
+ENONET
+ENOPKG
+EREMOTE
+ENOLINK
+EADV
+ESRMNT
ECOMM
+EPROTO
+EMULTIHOP
+EDOTDOT
+EBADMSG
+EOVERFLOW
+ENOTUNIQ
+EBADFD
+EREMCHG
+ELIBACC
+ELIBBAD
+ELIBSCN
+ELIBMAX
+ELIBEXEC
+EILSEQ
+ERESTART
+ESTRPIPE
+EUSERS
+ENOTSOCK
+EDESTADDRREQ
+EMSGSIZE
+EPROTOTYPE
+ENOPROTOOPT
+EPROTONOSUPPORT
+ESOCKTNOSUPPORT
+EOPNOTSUPP
+EPFNOSUPPORT
+EAFNOSUPPORT
+EADDRINUSE
+EADDRNOTAVAIL
+ENETDOWN
+ENETUNREACH
+ENETRESET
ECONNABORTED
-ECONNREFUSED
ECONNRESET
-EDEADLK
-EDEADLOCK
-EDESTADDRREQ
-EDEVERR
-EDOM
-EDOOFUS
-EDOTDOT
-EDQUOT
-EEXIST
-EFAULT
-EFBIG
-EFTYPE
+ENOBUFS
+EISCONN
+ENOTCONN
+ESHUTDOWN
+ETOOMANYREFS
+ETIMEDOUT
+ECONNREFUSED
EHOSTDOWN
EHOSTUNREACH
-EHWPOISON
-EIDRM
-EILSEQ
+EALREADY
EINPROGRESS
-EINTR
-EINVAL
-EIO
-EIPSEC
-EISCONN
-EISDIR
+ESTALE
+EUCLEAN
+ENOTNAM
+ENAVAIL
EISNAM
+EREMOTEIO
+EDQUOT
+ECANCELED
EKEYEXPIRED
EKEYREJECTED
EKEYREVOKED
-EL2HLT
-EL2NSYNC
-EL3HLT
-EL3RST
-ELAST
-ELIBACC
-ELIBBAD
-ELIBEXEC
-ELIBMAX
-ELIBSCN
-ELNRNG
-ELOOP
EMEDIUMTYPE
-EMFILE
-EMLINK
-EMSGSIZE
-EMULTIHOP
-ENAMETOOLONG
-ENAVAIL
-ENEEDAUTH
-ENETDOWN
-ENETRESET
-ENETUNREACH
-ENFILE
-ENOANO
-ENOATTR
-ENOBUFS
-ENOCSI
-ENODATA
-ENODEV
-ENOENT
-ENOEXEC
ENOKEY
-ENOLCK
-ENOLINK
ENOMEDIUM
-ENOMEM
-ENOMSG
-ENONET
-ENOPKG
-ENOPOLICY
-ENOPROTOOPT
-ENOSPC
-ENOSR
-ENOSTR
-ENOSYS
-ENOTBLK
-ENOTCAPABLE
-ENOTCONN
-ENOTDIR
-ENOTEMPTY
-ENOTNAM
ENOTRECOVERABLE
-ENOTSOCK
-ENOTSUP
-ENOTTY
-ENOTUNIQ
-ENXIO
-EOPNOTSUPP
-EOVERFLOW
EOWNERDEAD
-EPERM
-EPFNOSUPPORT
-EPIPE
+ERFKILL
+EAUTH
+EBADRPC
+EDOOFUS
+EFTYPE
+ENEEDAUTH
+ENOATTR
+ENOTSUP
EPROCLIM
EPROCUNAVAIL
EPROGMISMATCH
EPROGUNAVAIL
-EPROTO
-EPROTONOSUPPORT
-EPROTOTYPE
-EPWROFF
-EQFULL
-ERANGE
-EREMCHG
-EREMOTE
-EREMOTEIO
-ERESTART
-ERFKILL
-EROFS
ERPCMISMATCH
-ESHLIBVERS
-ESHUTDOWN
-ESOCKTNOSUPPORT
-ESPIPE
-ESRCH
-ESRMNT
-ESTALE
-ESTRPIPE
-ETIME
-ETIMEDOUT
-ETOOMANYREFS
-ETXTBSY
-EUCLEAN
-EUNATCH
-EUSERS
-EWOULDBLOCK
-EXDEV
-EXFULL
+EIPSEC
+EHWPOISON
+ECAPMODE
+ENOTCAPABLE
diff --git a/defs/lex.c.src b/defs/lex.c.src
index fc30ec2d15..20044a420c 100644
--- a/defs/lex.c.src
+++ b/defs/lex.c.src
@@ -1,8 +1,8 @@
%{
-struct kwtable {short name, id[2], state;};
+struct kwtable {int name, id[2], state;};
const struct kwtable *rb_reserved_word(const char *, unsigned int);
#ifndef RIPPER
-static const struct kwtable *reserved_word(/*!ANSI{*/const char *, unsigned int/*}!ANSI*/);
+static const struct kwtable *reserved_word(const char *, unsigned int);
#define rb_reserved_word(str, len) reserved_word(str, len)
%}
@@ -13,7 +13,7 @@ __LINE__, {keyword__LINE__, keyword__LINE__}, EXPR_END
__FILE__, {keyword__FILE__, keyword__FILE__}, EXPR_END
BEGIN, {keyword_BEGIN, keyword_BEGIN}, EXPR_END
END, {keyword_END, keyword_END}, EXPR_END
-alias, {keyword_alias, keyword_alias}, EXPR_FNAME|EXPR_FITEM
+alias, {keyword_alias, keyword_alias}, EXPR_FNAME
and, {keyword_and, keyword_and}, EXPR_VALUE
begin, {keyword_begin, keyword_begin}, EXPR_BEG
break, {keyword_break, keyword_break}, EXPR_MID
@@ -43,7 +43,7 @@ self, {keyword_self, keyword_self}, EXPR_END
super, {keyword_super, keyword_super}, EXPR_ARG
then, {keyword_then, keyword_then}, EXPR_BEG
true, {keyword_true, keyword_true}, EXPR_END
-undef, {keyword_undef, keyword_undef}, EXPR_FNAME|EXPR_FITEM
+undef, {keyword_undef, keyword_undef}, EXPR_FNAME
unless, {keyword_unless, modifier_unless}, EXPR_VALUE
until, {keyword_until, modifier_until}, EXPR_VALUE
when, {keyword_when, keyword_when}, EXPR_VALUE
diff --git a/defs/opt_insn_unif.def b/defs/opt_insn_unif.def
index 31ae2eb6a1..1ac613dbea 100644
--- a/defs/opt_insn_unif.def
+++ b/defs/opt_insn_unif.def
@@ -8,10 +8,12 @@ __END__
putobject putobject
putobject putstring
putobject setlocal
+putobject setdynamic
putstring putstring
putstring putobject
putstring setlocal
+putstring setdynamic
# putnil end
diff --git a/defs/separated_version.mk b/defs/separated_version.mk
deleted file mode 100644
index f086f4b24a..0000000000
--- a/defs/separated_version.mk
+++ /dev/null
@@ -1,38 +0,0 @@
-# ******** FOR DEVELEPERS ONLY ********
-# Separate version.o into a shared library which varies every
-# revisions, in order to make the rest sharable.
-
-include $(firstword $(wildcard GNUmakefile Makefile))
-
-ifneq ($(filter @executable_path/%,$(DLDFLAGS)),)
-RUBY_VERSION_SO = $(subst ruby,ruby_version,$(LIBRUBY_SO))
-RUBY_VERSION_DLDFLAGS := $(patsubst @executable_path/%/$(LIBRUBY_SO),@loader_path/$(RUBY_VERSION_SO),$(DLDFLAGS)) -exported_symbol=Init_version
-else ifneq ($(findstring -soname,$(DLDFLAGS)),)
-RUBY_VERSION_SO = $(subst ruby,ruby_version,$(LIBRUBY_SO))
-RUBY_VERSION_DLDFLAGS := $(subst ruby,ruby_version,$(DLDFLAGS)) -Wl,-rpath-link,'$${ORIGIN}'
-else
-ERROR
-endif
-
-ifneq ($(RUBY_VERSION_SO),)
-
-version.$(OBJEXT): XCFLAGS := $(subst -fvisibility=hidden,,$(XCFLAGS))
-
-MINIOBJS += version.$(OBJEXT)
-DLDOBJS += $(RUBY_VERSION_SO)
-LIBRUBYARG_SHARED := -lruby_version $(LIBRUBYARG_SHARED)
-$(LIBRUBY_SO): COMMONOBJS := $(filter-out version.$(OBJEXT),$(COMMONOBJS))
-$(LIBRUBY_A): COMMONOBJS := $(sort version.$(OBJEXT) $(COMMONOBJS))
-
-$(LIBRUBY_SO): $(RUBY_VERSION_SO)
-
-$(RUBY_VERSION_SO): version.$(OBJEXT)
- $(ECHO) linking shared-library $@
- $(LDSHARED) $(RUBY_VERSION_DLDFLAGS) version.$(OBJEXT) $(OUTFLAG)$@
- -$(Q) $(MINIRUBY) -e 'ARGV.each{|link|' \
- -e 'File.delete link rescue nil' \
- -e 'File.symlink "$(RUBY_VERSION_SO)", link' \
- -e '}' \
- $(subst ruby,ruby_version,$(LIBRUBY_ALIASES)) || true
-
-endif
diff --git a/defs/universal.mk b/defs/universal.mk
deleted file mode 100644
index c34a31b356..0000000000
--- a/defs/universal.mk
+++ /dev/null
@@ -1,5 +0,0 @@
-arch_flags := $(filter -arch=%,$(subst -arch ,-arch=,$(ARCH_FLAG)))
-ifeq ($(filter 0 1,$(words $(arch_flags))),)
-override MJIT_HEADER_SUFFIX = -%
-override MJIT_HEADER_ARCH = -$(word 2,$(ARCH_FLAG))
-endif
diff --git a/dir.c b/dir.c
index 69b53cb0e6..193b5bece0 100644
--- a/dir.c
+++ b/dir.c
@@ -11,10 +11,7 @@
**********************************************************************/
-#include "ruby/encoding.h"
-#include "ruby/thread.h"
#include "internal.h"
-#include "id.h"
#include "encindex.h"
#include <sys/types.h>
@@ -24,26 +21,6 @@
#include <unistd.h>
#endif
-#ifndef O_CLOEXEC
-# define O_CLOEXEC 0
-#endif
-
-#ifndef USE_OPENDIR_AT
-# if defined(HAVE_FDOPENDIR) && defined(HAVE_DIRFD) && \
- defined(HAVE_OPENAT) && defined(HAVE_FSTATAT)
-# define USE_OPENDIR_AT 1
-# else
-# define USE_OPENDIR_AT 0
-# endif
-#endif
-#if USE_OPENDIR_AT
-# include <fcntl.h>
-#endif
-#ifndef AT_FDCWD
-# define AT_FDCWD -1
-#endif
-
-#undef HAVE_DIRENT_NAMLEN
#if defined HAVE_DIRENT_H && !defined _WIN32
# include <dirent.h>
# define NAMLEN(dirent) strlen((dirent)->d_name)
@@ -53,7 +30,6 @@
#else
# define dirent direct
# define NAMLEN(dirent) (dirent)->d_namlen
-# define HAVE_DIRENT_NAMLEN 1
# if HAVE_SYS_NDIR_H
# include <sys/ndir.h>
# endif
@@ -67,6 +43,10 @@
# include "win32/dir.h"
# endif
#endif
+#if defined(__native_client__) && defined(NACL_NEWLIB)
+# include "nacl/dirent.h"
+# include "nacl/stat.h"
+#endif
#include <errno.h>
@@ -82,8 +62,6 @@ char *strchr(char*,char);
#include "ruby/util.h"
-#define vm_initialized rb_cThread
-
/* define system APIs */
#ifdef _WIN32
#undef chdir
@@ -94,7 +72,6 @@ char *strchr(char*,char);
#define rmdir(p) rb_w32_urmdir(p)
#undef opendir
#define opendir(p) rb_w32_uopendir(p)
-#define ruby_getcwd() rb_w32_ugetcwd(NULL, 0)
#define IS_WIN32 1
#else
#define IS_WIN32 0
@@ -104,19 +81,14 @@ char *strchr(char*,char);
#include <sys/attr.h>
#endif
-#define USE_NAME_ON_FS_REAL_BASENAME 1 /* platform dependent APIs to
- * get real basenames */
-#define USE_NAME_ON_FS_BY_FNMATCH 2 /* select the matching
- * basename by fnmatch */
-
#ifdef HAVE_GETATTRLIST
-# define USE_NAME_ON_FS USE_NAME_ON_FS_REAL_BASENAME
+# define USE_NAME_ON_FS 1
# define RUP32(size) ((size)+3/4)
# define SIZEUP32(type) RUP32(sizeof(type))
#elif defined _WIN32
-# define USE_NAME_ON_FS USE_NAME_ON_FS_REAL_BASENAME
+# define USE_NAME_ON_FS 1
#elif defined DOSISH
-# define USE_NAME_ON_FS USE_NAME_ON_FS_BY_FNMATCH
+# define USE_NAME_ON_FS 2 /* by fnmatch */
#else
# define USE_NAME_ON_FS 0
#endif
@@ -177,7 +149,7 @@ has_nonascii(const char *ptr, size_t len)
#endif
#ifndef IFTODT
-# define IFTODT(m) (((m) & S_IFMT) / ((~S_IFMT & (S_IFMT-1)) + 1))
+# define IFTODT(m) (((m) & S_IFMT) / ((~S_IFMT & S_IFMT-1) + 1))
#endif
typedef enum {
@@ -442,7 +414,7 @@ VALUE rb_cDir;
struct dir_data {
DIR *dir;
- const VALUE path;
+ VALUE path;
rb_encoding *enc;
};
@@ -457,8 +429,9 @@ static void
dir_free(void *ptr)
{
struct dir_data *dir = ptr;
-
- if (dir->dir) closedir(dir->dir);
+ if (dir) {
+ if (dir->dir) closedir(dir->dir);
+ }
xfree(dir);
}
@@ -471,11 +444,20 @@ dir_memsize(const void *ptr)
static const rb_data_type_t dir_data_type = {
"dir",
{dir_mark, dir_free, dir_memsize,},
- 0, 0, RUBY_TYPED_WB_PROTECTED | RUBY_TYPED_FREE_IMMEDIATELY
+ 0, 0, RUBY_TYPED_FREE_IMMEDIATELY
};
static VALUE dir_close(VALUE);
+#define GlobPathValue(str, safe) \
+ /* can contain null bytes as separators */ \
+ (!RB_TYPE_P((str), T_STRING) ? \
+ (void)FilePathValue(str) : \
+ (void)(check_safe_glob((str), (safe)), \
+ check_glob_encoding(str), (str)))
+#define check_safe_glob(str, safe) ((safe) ? rb_check_safe_obj(str) : (void)0)
+#define check_glob_encoding(str) rb_enc_check((str), rb_enc_from_encoding(rb_usascii_encoding()))
+
static VALUE
dir_s_alloc(VALUE klass)
{
@@ -483,34 +465,12 @@ dir_s_alloc(VALUE klass)
VALUE obj = TypedData_Make_Struct(klass, struct dir_data, &dir_data_type, dirp);
dirp->dir = NULL;
- RB_OBJ_WRITE(obj, &dirp->path, Qnil);
+ dirp->path = Qnil;
dirp->enc = NULL;
return obj;
}
-static void *
-nogvl_opendir(void *ptr)
-{
- const char *path = ptr;
-
- return (void *)opendir(path);
-}
-
-static DIR *
-opendir_without_gvl(const char *path)
-{
- if (vm_initialized) {
- union { const void *in; void *out; } u;
-
- u.in = path;
-
- return rb_thread_call_without_gvl(nogvl_opendir, u.out, RUBY_UBF_IO, 0);
- }
- else
- return opendir(path);
-}
-
/*
* call-seq:
* Dir.new( string ) -> aDir
@@ -518,7 +478,7 @@ opendir_without_gvl(const char *path)
*
* Returns a new directory object for the named directory.
*
- * The optional <i>encoding</i> keyword argument specifies the encoding of the directory.
+ * The optional <i>enc</i> argument specifies the encoding of the directory.
* If not specified, the filesystem encoding is used.
*/
static VALUE
@@ -546,7 +506,7 @@ dir_initialize(int argc, VALUE *argv, VALUE dir)
}
}
- FilePathValue(dirname);
+ GlobPathValue(dirname, FALSE);
orig = rb_str_dup_frozen(dirname);
dirname = rb_str_encode_ospath(dirname);
dirname = rb_str_dup_frozen(dirname);
@@ -554,30 +514,29 @@ dir_initialize(int argc, VALUE *argv, VALUE dir)
TypedData_Get_Struct(dir, struct dir_data, &dir_data_type, dp);
if (dp->dir) closedir(dp->dir);
dp->dir = NULL;
- RB_OBJ_WRITE(dir, &dp->path, Qnil);
+ dp->path = Qnil;
dp->enc = fsenc;
path = RSTRING_PTR(dirname);
- dp->dir = opendir_without_gvl(path);
+ dp->dir = opendir(path);
if (dp->dir == NULL) {
- int e = errno;
- if (rb_gc_for_fd(e)) {
- dp->dir = opendir_without_gvl(path);
+ if (rb_gc_for_fd(errno)) {
+ dp->dir = opendir(path);
}
#ifdef HAVE_GETATTRLIST
- else if (e == EIO) {
+ else if (errno == EIO) {
u_int32_t attrbuf[1];
struct attrlist al = {ATTR_BIT_MAP_COUNT, 0};
if (getattrlist(path, &al, attrbuf, sizeof(attrbuf), FSOPT_NOFOLLOW) == 0) {
- dp->dir = opendir_without_gvl(path);
+ dp->dir = opendir(path);
}
}
#endif
if (dp->dir == NULL) {
RB_GC_GUARD(dirname);
- rb_syserr_fail_path(e, orig);
+ rb_sys_fail_path(orig);
}
}
- RB_OBJ_WRITE(dir, &dp->path, orig);
+ dp->path = orig;
return dir;
}
@@ -589,7 +548,7 @@ dir_initialize(int argc, VALUE *argv, VALUE dir)
* Dir.open( string ) {| aDir | block } -> anObject
* Dir.open( string, encoding: enc ) {| aDir | block } -> anObject
*
- * The optional <i>encoding</i> keyword argument specifies the encoding of the directory.
+ * The optional <i>enc</i> argument specifies the encoding of the directory.
* If not specified, the filesystem encoding is used.
*
* With no block, <code>open</code> is a synonym for
@@ -612,8 +571,6 @@ dir_s_open(int argc, VALUE *argv, VALUE klass)
return dir;
}
-NORETURN(static void dir_closed(void));
-
static void
dir_closed(void)
{
@@ -658,7 +615,7 @@ dir_inspect(VALUE dir)
rb_str_cat2(str, ">");
return str;
}
- return rb_funcallv(dir, idTo_s, 0, 0);
+ return rb_funcallv(dir, rb_intern("to_s"), 0, 0);
}
/* Workaround for Solaris 10 that does not have dirfd.
@@ -743,29 +700,6 @@ fundamental_encoding_p(rb_encoding *enc)
# define READDIR(dir, enc) readdir((dir))
#endif
-/* safe to use without GVL */
-static int
-to_be_skipped(const struct dirent *dp)
-{
- const char *name = dp->d_name;
- if (name[0] != '.') return FALSE;
-#ifdef HAVE_DIRENT_NAMLEN
- switch (NAMLEN(dp)) {
- case 2:
- if (name[1] != '.') return FALSE;
- case 1:
- return TRUE;
- default:
- break;
- }
-#else
- if (!name[1]) return TRUE;
- if (name[1] != '.') return FALSE;
- if (!name[2]) return TRUE;
-#endif
- return FALSE;
-}
-
/*
* call-seq:
* dir.read -> string or nil
@@ -790,20 +724,11 @@ dir_read(VALUE dir)
return rb_external_str_new_with_enc(dp->d_name, NAMLEN(dp), dirp->enc);
}
else {
- int e = errno;
- if (e != 0) rb_syserr_fail(e, 0);
+ if (errno != 0) rb_sys_fail(0);
return Qnil; /* end of stream */
}
}
-static VALUE dir_each_entry(VALUE, VALUE (*)(VALUE, VALUE), VALUE, int);
-
-static VALUE
-dir_yield(VALUE arg, VALUE path)
-{
- return rb_yield(path);
-}
-
/*
* call-seq:
* dir.each { |filename| block } -> dir
@@ -827,17 +752,11 @@ dir_yield(VALUE arg, VALUE path)
static VALUE
dir_each(VALUE dir)
{
- RETURN_ENUMERATOR(dir, 0, 0);
- return dir_each_entry(dir, dir_yield, Qnil, FALSE);
-}
-
-static VALUE
-dir_each_entry(VALUE dir, VALUE (*each)(VALUE, VALUE), VALUE arg, int children_only)
-{
struct dir_data *dirp;
struct dirent *dp;
IF_NORMALIZE_UTF8PATH(int norm_p);
+ RETURN_ENUMERATOR(dir, 0, 0);
GetDIR(dir, dirp);
rewinddir(dirp->dir);
IF_NORMALIZE_UTF8PATH(norm_p = need_normalization(dirp->dir, RSTRING_PTR(dirp->path)));
@@ -845,11 +764,6 @@ dir_each_entry(VALUE dir, VALUE (*each)(VALUE, VALUE), VALUE arg, int children_o
const char *name = dp->d_name;
size_t namlen = NAMLEN(dp);
VALUE path;
-
- if (children_only && name[0] == '.') {
- if (namlen == 1) continue; /* current directory */
- if (namlen == 2 && name[1] == '.') continue; /* parent directory */
- }
#if NORMALIZE_UTF8PATH
if (norm_p && has_nonascii(name, namlen) &&
!NIL_P(path = rb_str_normalize_ospath(name, namlen))) {
@@ -858,7 +772,7 @@ dir_each_entry(VALUE dir, VALUE (*each)(VALUE, VALUE), VALUE arg, int children_o
else
#endif
path = rb_external_str_new_with_enc(name, namlen, dirp->enc);
- (*each)(arg, path);
+ rb_yield(path);
if (dirp->dir == NULL) dir_closed();
}
return dir;
@@ -971,8 +885,8 @@ dir_rewind(VALUE dir)
* call-seq:
* dir.close -> nil
*
- * Closes the directory stream.
- * Calling this method on closed Dir object is ignored since Ruby 2.3.
+ * Closes the directory stream. Any further attempts to access
+ * <em>dir</em> will raise an <code>IOError</code>.
*
* d = Dir.new("testdir")
* d.close #=> nil
@@ -990,14 +904,6 @@ dir_close(VALUE dir)
return Qnil;
}
-static void *
-nogvl_chdir(void *ptr)
-{
- const char *path = ptr;
-
- return (void *)(VALUE)chdir(path);
-}
-
static void
dir_chdir(VALUE path)
{
@@ -1080,8 +986,9 @@ dir_s_chdir(int argc, VALUE *argv, VALUE obj)
{
VALUE path = Qnil;
- if (rb_check_arity(argc, 0, 1) == 1) {
- path = rb_str_encode_ospath(rb_get_path(argv[0]));
+ if (rb_scan_args(argc, argv, "01", &path) == 1) {
+ FilePathValue(path);
+ path = rb_str_encode_ospath(path);
}
else {
const char *dist = getenv("HOME");
@@ -1105,62 +1012,31 @@ dir_s_chdir(int argc, VALUE *argv, VALUE obj)
args.done = FALSE;
return rb_ensure(chdir_yield, (VALUE)&args, chdir_restore, (VALUE)&args);
}
- else {
- char *p = RSTRING_PTR(path);
- int r = (int)(VALUE)rb_thread_call_without_gvl(nogvl_chdir, p,
- RUBY_UBF_IO, 0);
- if (r < 0)
- rb_sys_fail_path(path);
- }
+ dir_chdir(path);
return INT2FIX(0);
}
-#ifndef _WIN32
VALUE
-rb_dir_getwd_ospath(void)
+rb_dir_getwd(void)
{
char *path;
VALUE cwd;
- VALUE path_guard;
+ int fsenc = rb_enc_to_index(rb_filesystem_encoding());
-#undef RUBY_UNTYPED_DATA_WARNING
-#define RUBY_UNTYPED_DATA_WARNING 0
- path_guard = Data_Wrap_Struct((VALUE)0, NULL, RUBY_DEFAULT_FREE, NULL);
- path = ruby_getcwd();
- DATA_PTR(path_guard) = path;
+ if (fsenc == ENCINDEX_US_ASCII) fsenc = ENCINDEX_ASCII;
+ path = my_getcwd();
#ifdef __APPLE__
cwd = rb_str_normalize_ospath(path, strlen(path));
OBJ_TAINT(cwd);
#else
cwd = rb_tainted_str_new2(path);
#endif
- DATA_PTR(path_guard) = 0;
+ rb_enc_associate_index(cwd, fsenc);
xfree(path);
return cwd;
}
-#endif
-
-VALUE
-rb_dir_getwd(void)
-{
- rb_encoding *fs = rb_filesystem_encoding();
- int fsenc = rb_enc_to_index(fs);
- VALUE cwd = rb_dir_getwd_ospath();
-
- switch (fsenc) {
- case ENCINDEX_US_ASCII:
- fsenc = ENCINDEX_ASCII;
- case ENCINDEX_ASCII:
- break;
-#if defined _WIN32 || defined __APPLE__
- default:
- return rb_str_conv_enc(cwd, NULL, fs);
-#endif
- }
- return rb_enc_associate_index(cwd, fsenc);
-}
/*
* call-seq:
@@ -1223,19 +1099,6 @@ dir_s_chroot(VALUE dir, VALUE path)
#define dir_s_chroot rb_f_notimplement
#endif
-struct mkdir_arg {
- const char *path;
- mode_t mode;
-};
-
-static void *
-nogvl_mkdir(void *ptr)
-{
- struct mkdir_arg *m = ptr;
-
- return (void *)(VALUE)mkdir(m->path, m->mode);
-}
-
/*
* call-seq:
* Dir.mkdir( string [, integer] ) -> 0
@@ -1254,34 +1117,23 @@ nogvl_mkdir(void *ptr)
static VALUE
dir_s_mkdir(int argc, VALUE *argv, VALUE obj)
{
- struct mkdir_arg m;
VALUE path, vmode;
- int r;
+ int mode;
if (rb_scan_args(argc, argv, "11", &path, &vmode) == 2) {
- m.mode = NUM2MODET(vmode);
+ mode = NUM2INT(vmode);
}
else {
- m.mode = 0777;
+ mode = 0777;
}
path = check_dirname(path);
- m.path = RSTRING_PTR(path);
- r = (int)(VALUE)rb_thread_call_without_gvl(nogvl_mkdir, &m, RUBY_UBF_IO, 0);
- if (r < 0)
+ if (mkdir(RSTRING_PTR(path), mode) == -1)
rb_sys_fail_path(path);
return INT2FIX(0);
}
-static void *
-nogvl_rmdir(void *ptr)
-{
- const char *path = ptr;
-
- return (void *)(VALUE)rmdir(path);
-}
-
/*
* call-seq:
* Dir.delete( string ) -> 0
@@ -1294,13 +1146,8 @@ nogvl_rmdir(void *ptr)
static VALUE
dir_s_rmdir(VALUE obj, VALUE dir)
{
- const char *p;
- int r;
-
dir = check_dirname(dir);
- p = RSTRING_PTR(dir);
- r = (int)(VALUE)rb_thread_call_without_gvl(nogvl_rmdir, (void *)p, RUBY_UBF_IO, 0);
- if (r < 0)
+ if (rmdir(RSTRING_PTR(dir)) < 0)
rb_sys_fail_path(dir);
return INT2FIX(0);
@@ -1356,63 +1203,32 @@ sys_enc_warning_in(const char *func, const char *mesg, rb_encoding *enc)
* ENOTDIR can be returned by stat(2) if a non-leaf element of the path
* is not a directory.
*/
-ALWAYS_INLINE(static int to_be_ignored(int e));
-static inline int
-to_be_ignored(int e)
-{
- return e == ENOENT || e == ENOTDIR;
-}
+#define to_be_ignored(e) ((e) == ENOENT || (e) == ENOTDIR)
#ifdef _WIN32
-#define STAT(p, s) rb_w32_ustati128((p), (s))
+#define STAT(p, s) rb_w32_ustati64((p), (s))
#undef lstat
-#define lstat(p, s) rb_w32_ulstati128((p), (s))
+#define lstat(p, s) rb_w32_ulstati64((p), (s))
#else
#define STAT(p, s) stat((p), (s))
#endif
-typedef int ruby_glob_errfunc(const char*, VALUE, const void*, int);
-typedef struct {
- ruby_glob_func *match;
- ruby_glob_errfunc *error;
-} ruby_glob_funcs_t;
-
-static const char *
-at_subpath(int fd, size_t baselen, const char *path)
-{
-#if USE_OPENDIR_AT
- if (fd != (int)AT_FDCWD && baselen > 0) {
- path += baselen;
- if (*path == '/') ++path;
- }
-#endif
- return *path ? path : ".";
-}
-
/* System call with warning */
static int
-do_stat(int fd, size_t baselen, const char *path, struct stat *pst, int flags, rb_encoding *enc)
+do_stat(const char *path, struct stat *pst, int flags, rb_encoding *enc)
{
-#if USE_OPENDIR_AT
- int ret = fstatat(fd, at_subpath(fd, baselen, path), pst, 0);
-#else
int ret = STAT(path, pst);
-#endif
if (ret < 0 && !to_be_ignored(errno))
sys_warning(path, enc);
return ret;
}
-#if defined HAVE_LSTAT || defined lstat || USE_OPENDIR_AT
+#if defined HAVE_LSTAT || defined lstat
static int
-do_lstat(int fd, size_t baselen, const char *path, struct stat *pst, int flags, rb_encoding *enc)
+do_lstat(const char *path, struct stat *pst, int flags, rb_encoding *enc)
{
-#if USE_OPENDIR_AT
- int ret = fstatat(fd, at_subpath(fd, baselen, path), pst, AT_SYMLINK_NOFOLLOW);
-#else
int ret = lstat(path, pst);
-#endif
if (ret < 0 && !to_be_ignored(errno))
sys_warning(path, enc);
@@ -1422,85 +1238,8 @@ do_lstat(int fd, size_t baselen, const char *path, struct stat *pst, int flags,
#define do_lstat do_stat
#endif
-struct opendir_at_arg {
- int basefd;
- const char *path;
-};
-
-static void *
-with_gvl_gc_for_fd(void *ptr)
-{
- int *e = ptr;
-
- return (void *)(rb_gc_for_fd(*e) ? Qtrue : Qfalse);
-}
-
-static int
-gc_for_fd_with_gvl(int e)
-{
- if (vm_initialized)
- return (int)(VALUE)rb_thread_call_with_gvl(with_gvl_gc_for_fd, &e);
- else
- return rb_gc_for_fd(e) ? Qtrue : Qfalse;
-}
-
-static void *
-nogvl_opendir_at(void *ptr)
-{
- const struct opendir_at_arg *oaa = ptr;
- DIR *dirp;
-
-#if USE_OPENDIR_AT
- const int opendir_flags = (O_RDONLY|O_CLOEXEC|
-# ifdef O_DIRECTORY
- O_DIRECTORY|
-# endif /* O_DIRECTORY */
- 0);
- int fd = openat(oaa->basefd, oaa->path, opendir_flags);
-
- dirp = fd >= 0 ? fdopendir(fd) : 0;
- if (!dirp) {
- int e = errno;
-
- switch (gc_for_fd_with_gvl(e)) {
- default:
- if (fd < 0) fd = openat(oaa->basefd, oaa->path, opendir_flags);
- if (fd >= 0) dirp = fdopendir(fd);
- if (dirp) return dirp;
-
- e = errno;
- /* fallthrough*/
- case 0:
- if (fd >= 0) close(fd);
- errno = e;
- }
- }
-#else /* !USE_OPENDIR_AT */
- dirp = opendir(oaa->path);
- if (!dirp && gc_for_fd_with_gvl(errno))
- dirp = opendir(oaa->path);
-#endif /* !USE_OPENDIR_AT */
-
- return dirp;
-}
-
static DIR *
-opendir_at(int basefd, const char *path)
-{
- struct opendir_at_arg oaa;
-
- oaa.basefd = basefd;
- oaa.path = path;
-
- if (vm_initialized)
- return rb_thread_call_without_gvl(nogvl_opendir_at, &oaa, RUBY_UBF_IO, 0);
- else
- return nogvl_opendir_at(&oaa);
-}
-
-static DIR *
-do_opendir(const int basefd, size_t baselen, const char *path, int flags, rb_encoding *enc,
- ruby_glob_errfunc *errfunc, VALUE arg, int *status)
+do_opendir(const char *path, int flags, rb_encoding *enc)
{
DIR *dirp;
#ifdef _WIN32
@@ -1511,20 +1250,9 @@ do_opendir(const int basefd, size_t baselen, const char *path, int flags, rb_enc
path = RSTRING_PTR(tmp);
}
#endif
- dirp = opendir_at(basefd, at_subpath(basefd, baselen, path));
- if (!dirp) {
- int e = errno;
-
- *status = 0;
- if (!to_be_ignored(e)) {
- if (errfunc) {
- *status = (*errfunc)(path, arg, enc, e);
- }
- else {
- sys_warning(path, enc);
- }
- }
- }
+ dirp = opendir(path);
+ if (dirp == NULL && !to_be_ignored(errno))
+ sys_warning(path, enc);
#ifdef _WIN32
if (tmp) rb_str_resize(tmp, 0); /* GC guard */
#endif
@@ -1533,7 +1261,7 @@ do_opendir(const int basefd, size_t baselen, const char *path, int flags, rb_enc
}
/* Globing pattern */
-enum glob_pattern_type { PLAIN, ALPHA, BRACE, MAGICAL, RECURSIVE, MATCH_ALL, MATCH_DIR };
+enum glob_pattern_type { PLAIN, ALPHA, MAGICAL, RECURSIVE, MATCH_ALL, MATCH_DIR };
/* Return nonzero if S has any special globbing chars in it. */
static enum glob_pattern_type
@@ -1541,20 +1269,15 @@ has_magic(const char *p, const char *pend, int flags, rb_encoding *enc)
{
const int escape = !(flags & FNM_NOESCAPE);
int hasalpha = 0;
- int hasmagical = 0;
register char c;
while (p < pend && (c = *p++) != 0) {
switch (c) {
- case '{':
- return BRACE;
-
case '*':
case '?':
case '[':
- hasmagical = 1;
- break;
+ return MAGICAL;
case '\\':
if (escape && p++ >= pend)
@@ -1579,7 +1302,7 @@ has_magic(const char *p, const char *pend, int flags, rb_encoding *enc)
p = Next(p-1, pend, enc);
}
- return hasmagical ? MAGICAL : hasalpha ? ALPHA : PLAIN;
+ return hasalpha ? ALPHA : PLAIN;
}
/* Find separator in globbing pattern. */
@@ -1600,13 +1323,6 @@ find_dirsep(const char *p, const char *pend, int flags, rb_encoding *enc)
open = 0;
continue;
- case '{':
- open = 1;
- continue;
- case '}':
- open = 0;
- continue;
-
case '/':
if (!open)
return (char *)p-1;
@@ -1739,7 +1455,7 @@ glob_free_pattern(struct glob_pattern *list)
}
static char *
-join_path(const char *path, size_t len, int dirsep, const char *name, size_t namlen)
+join_path(const char *path, long len, int dirsep, const char *name, size_t namlen)
{
char *buf = GLOB_ALLOC_N(char, len+namlen+(dirsep?1:0)+1);
@@ -1754,13 +1470,8 @@ join_path(const char *path, size_t len, int dirsep, const char *name, size_t nam
}
#ifdef HAVE_GETATTRLIST
-# if defined HAVE_FGETATTRLIST
-# define is_case_sensitive(dirp, path) is_case_sensitive(dirp)
-# else
-# define is_case_sensitive(dirp, path) is_case_sensitive(path)
-# endif
static int
-is_case_sensitive(DIR *dirp, const char *path)
+is_case_sensitive(DIR *dirp)
{
struct {
u_int32_t length;
@@ -1771,13 +1482,8 @@ is_case_sensitive(DIR *dirp, const char *path)
const int idx = VOL_CAPABILITIES_FORMAT;
const uint32_t mask = VOL_CAP_FMT_CASE_SENSITIVE;
-# if defined HAVE_FGETATTRLIST
if (fgetattrlist(dirfd(dirp), &al, attrbuf, sizeof(attrbuf), FSOPT_NOFOLLOW))
return -1;
-# else
- if (getattrlist(path, &al, attrbuf, sizeof(attrbuf), FSOPT_NOFOLLOW))
- return -1;
-# endif
if (!(cap->valid[idx] & mask))
return -1;
return (cap->capabilities[idx] & mask) != 0;
@@ -1909,7 +1615,7 @@ replace_real_basename(char *path, long base, rb_encoding *enc, int norm_p, int f
}
return path;
}
-#elif USE_NAME_ON_FS == USE_NAME_ON_FS_REAL_BASENAME
+#elif USE_NAME_ON_FS == 1
# error not implemented
#endif
@@ -1928,8 +1634,6 @@ replace_real_basename(char *path, long base, rb_encoding *enc, int norm_p, int f
struct glob_args {
void (*func)(const char *, VALUE, void *);
const char *path;
- const char *base;
- size_t baselen;
VALUE value;
rb_encoding *enc;
};
@@ -1945,61 +1649,6 @@ glob_func_caller(VALUE val)
return Qnil;
}
-struct glob_error_args {
- const char *path;
- rb_encoding *enc;
- int error;
-};
-
-static VALUE
-glob_func_warning(VALUE val)
-{
- struct glob_error_args *arg = (struct glob_error_args *)val;
- rb_syserr_enc_warning(arg->error, arg->enc, "%s", arg->path);
- return Qnil;
-}
-
-#if 0
-static int
-rb_glob_warning(const char *path, VALUE a, const void *enc, int error)
-{
- int status;
- struct glob_error_args args;
-
- args.path = path;
- args.enc = enc;
- args.error = error;
- rb_protect(glob_func_warning, (VALUE)&args, &status);
- return status;
-}
-#endif
-
-static VALUE
-glob_func_error(VALUE val)
-{
- struct glob_error_args *arg = (struct glob_error_args *)val;
- VALUE path = rb_enc_str_new_cstr(arg->path, arg->enc);
- rb_syserr_fail_str(arg->error, path);
- return Qnil;
-}
-
-static int
-rb_glob_error(const char *path, VALUE a, const void *enc, int error)
-{
- int status;
- struct glob_error_args args;
- VALUE (*errfunc)(VALUE) = glob_func_error;
-
- if (error == EACCES) {
- errfunc = glob_func_warning;
- }
- args.path = path;
- args.enc = enc;
- args.error = error;
- rb_protect(errfunc, (VALUE)&args, &status);
- return status;
-}
-
static inline int
dirent_match(const char *pat, rb_encoding *enc, const char *name, const struct dirent *dp, int flags)
{
@@ -2012,101 +1661,24 @@ dirent_match(const char *pat, rb_encoding *enc, const char *name, const struct d
return 0;
}
-struct push_glob_args {
- int fd;
- const char *path;
- size_t baselen;
- size_t namelen;
- int dirsep; /* '/' should be placed before appending child entry's name to 'path'. */
- rb_pathtype_t pathtype; /* type of 'path' */
- int flags;
- const ruby_glob_funcs_t *funcs;
- VALUE arg;
-};
-
-struct dirent_brace_args {
- const char *name;
- const struct dirent *dp;
- int flags;
-};
-
-static int
-dirent_match_brace(const char *pattern, VALUE val, void *enc)
-{
- struct dirent_brace_args *arg = (struct dirent_brace_args *)val;
-
- return dirent_match(pattern, enc, arg->name, arg->dp, arg->flags);
-}
-
-/* join paths from pattern list of glob_make_pattern() */
-static char*
-join_path_from_pattern(struct glob_pattern **beg)
-{
- struct glob_pattern *p;
- char *path = NULL;
- size_t path_len = 0;
-
- for (p = *beg; p; p = p->next) {
- const char *str;
- switch (p->type) {
- case RECURSIVE:
- str = "**";
- break;
- case MATCH_DIR:
- /* append last slash */
- str = "";
- break;
- default:
- str = p->str;
- if (!str) continue;
- }
- if (!path) {
- path_len = strlen(str);
- path = GLOB_ALLOC_N(char, path_len + 1);
- memcpy(path, str, path_len);
- path[path_len] = '\0';
- } else {
- size_t len = strlen(str);
- char *tmp;
- tmp = GLOB_REALLOC(path, path_len + len + 2);
- if (tmp) {
- path = tmp;
- path[path_len++] = '/';
- memcpy(path + path_len, str, len);
- path_len += len;
- path[path_len] = '\0';
- }
- }
- }
- return path;
-}
-
-static int push_caller(const char *path, VALUE val, void *enc);
-
-static int ruby_brace_expand(const char *str, int flags, ruby_glob_func *func, VALUE arg,
- rb_encoding *enc, VALUE var);
-
static int
glob_helper(
- int fd,
const char *path,
- size_t baselen,
- size_t namelen,
+ long pathlen,
int dirsep, /* '/' should be placed before appending child entry's name to 'path'. */
rb_pathtype_t pathtype, /* type of 'path' */
struct glob_pattern **beg,
struct glob_pattern **end,
int flags,
- const ruby_glob_funcs_t *funcs,
+ ruby_glob_func *func,
VALUE arg,
rb_encoding *enc)
{
struct stat st;
int status = 0;
struct glob_pattern **cur, **new_beg, **new_end;
- int plain = 0, brace = 0, magical = 0, recursive = 0, match_all = 0, match_dir = 0;
+ int plain = 0, magical = 0, recursive = 0, match_all = 0, match_dir = 0;
int escape = !(flags & FNM_NOESCAPE);
- size_t pathlen = baselen + namelen;
for (cur = beg; cur < end; ++cur) {
struct glob_pattern *p = *cur;
@@ -2119,17 +1691,12 @@ glob_helper(
plain = 1;
break;
case ALPHA:
-#if USE_NAME_ON_FS == USE_NAME_ON_FS_REAL_BASENAME
+#if USE_NAME_ON_FS == 1
plain = 1;
#else
magical = 1;
#endif
break;
- case BRACE:
- if (!recursive) {
- brace = 1;
- }
- break;
case MAGICAL:
magical = 2;
break;
@@ -2144,35 +1711,17 @@ glob_helper(
}
}
- if (brace) {
- struct push_glob_args args;
- char* brace_path = join_path_from_pattern(beg);
- if (!brace_path) return -1;
- args.fd = fd;
- args.path = path;
- args.baselen = baselen;
- args.namelen = namelen;
- args.dirsep = dirsep;
- args.pathtype = pathtype;
- args.flags = flags;
- args.funcs = funcs;
- args.arg = arg;
- status = ruby_brace_expand(brace_path, flags, push_caller, (VALUE)&args, enc, Qfalse);
- GLOB_FREE(brace_path);
- return status;
- }
-
if (*path) {
if (match_all && pathtype == path_unknown) {
- if (do_lstat(fd, baselen, path, &st, flags, enc) == 0) {
+ if (do_lstat(path, &st, flags, enc) == 0) {
pathtype = IFTODT(st.st_mode);
}
else {
pathtype = path_noent;
}
}
- if (match_dir && (pathtype == path_unknown || pathtype == path_symlink)) {
- if (do_stat(fd, baselen, path, &st, flags, enc) == 0) {
+ if (match_dir && pathtype == path_unknown) {
+ if (do_stat(path, &st, flags, enc) == 0) {
pathtype = IFTODT(st.st_mode);
}
else {
@@ -2180,16 +1729,13 @@ glob_helper(
}
}
if (match_all && pathtype > path_noent) {
- const char *subpath = path + baselen + (baselen && path[baselen] == '/');
- status = glob_call_func(funcs->match, subpath, arg, enc);
+ status = glob_call_func(func, path, arg, enc);
if (status) return status;
}
if (match_dir && pathtype == path_directory) {
- int seplen = (baselen && path[baselen] == '/');
- const char *subpath = path + baselen + seplen;
- char *tmp = join_path(subpath, namelen - seplen, dirsep, "", 0);
+ char *tmp = join_path(path, pathlen, dirsep, "", 0);
if (!tmp) return -1;
- status = glob_call_func(funcs->match, tmp, arg, enc);
+ status = glob_call_func(func, tmp, arg, enc);
GLOB_FREE(tmp);
if (status) return status;
}
@@ -2200,22 +1746,20 @@ glob_helper(
if (magical || recursive) {
struct dirent *dp;
DIR *dirp;
-# if USE_NAME_ON_FS == USE_NAME_ON_FS_BY_FNMATCH
+# if USE_NAME_ON_FS == 2
char *plainname = 0;
# endif
IF_NORMALIZE_UTF8PATH(int norm_p);
-# if USE_NAME_ON_FS == USE_NAME_ON_FS_BY_FNMATCH
+# if USE_NAME_ON_FS == 2
if (cur + 1 == end && (*cur)->type <= ALPHA) {
plainname = join_path(path, pathlen, dirsep, (*cur)->str, strlen((*cur)->str));
if (!plainname) return -1;
- dirp = do_opendir(fd, basename, plainname, flags, enc, funcs->error, arg, &status);
+ dirp = do_opendir(plainname, flags, enc);
GLOB_FREE(plainname);
}
else
-# else
- ;
# endif
- dirp = do_opendir(fd, baselen, path, flags, enc, funcs->error, arg, &status);
+ dirp = do_opendir(*path ? path : ".", flags, enc);
if (dirp == NULL) {
# if FNM_SYSCASE || NORMALIZE_UTF8PATH
if ((magical < 2) && !recursive && (errno == EACCES)) {
@@ -2223,7 +1767,7 @@ glob_helper(
goto literally;
}
# endif
- return status;
+ return 0;
}
IF_NORMALIZE_UTF8PATH(norm_p = need_normalization(dirp, *path ? path : "."));
@@ -2234,7 +1778,7 @@ glob_helper(
}
# endif
# ifdef HAVE_GETATTRLIST
- if (is_case_sensitive(dirp, path) == 0)
+ if (is_case_sensitive(dirp) == 0)
flags |= FNM_CASEFOLD;
# endif
while ((dp = READDIR(dirp, enc)) != NULL) {
@@ -2245,22 +1789,21 @@ glob_helper(
int dotfile = 0;
IF_NORMALIZE_UTF8PATH(VALUE utf8str = Qnil);
- name = dp->d_name;
- namlen = NAMLEN(dp);
- if (recursive && name[0] == '.') {
+ if (recursive && dp->d_name[0] == '.') {
++dotfile;
- if (namlen == 1) {
+ if (!dp->d_name[1]) {
/* unless DOTMATCH, skip current directories not to recurse infinitely */
if (!(flags & FNM_DOTMATCH)) continue;
++dotfile;
- new_pathtype = path_directory; /* force to skip stat/lstat */
}
- else if (namlen == 2 && name[1] == '.') {
+ else if (dp->d_name[1] == '.' && !dp->d_name[2]) {
/* always skip parent directories not to recurse infinitely */
continue;
}
}
+ name = dp->d_name;
+ namlen = NAMLEN(dp);
# if NORMALIZE_UTF8PATH
if (norm_p && has_nonascii(name, namlen)) {
if (!NIL_P(utf8str = rb_str_normalize_ospath(name, namlen))) {
@@ -2275,16 +1818,16 @@ glob_helper(
break;
}
name = buf + pathlen + (dirsep != 0);
+ if (recursive && dotfile < ((flags & FNM_DOTMATCH) ? 2 : 1)) {
#ifdef DT_UNKNOWN
- if (dp->d_type != DT_UNKNOWN) {
- /* Got it. We need no more lstat. */
- new_pathtype = dp->d_type;
- }
+ if ((new_pathtype = dp->d_type) != (rb_pathtype_t)DT_UNKNOWN)
+ /* Got it. We need nothing more. */
+ ;
+ else
+ /* fall back to call lstat(2) */
#endif
- if (recursive && dotfile < ((flags & FNM_DOTMATCH) ? 2 : 1) &&
- new_pathtype == path_unknown) {
/* RECURSIVE never match dot files unless FNM_DOTMATCH is set */
- if (do_lstat(fd, baselen, buf, &st, flags, enc) == 0)
+ if (do_lstat(buf, &st, flags, enc) == 0)
new_pathtype = IFTODT(st.st_mode);
else
new_pathtype = path_noent;
@@ -2299,26 +1842,15 @@ glob_helper(
for (cur = beg; cur < end; ++cur) {
struct glob_pattern *p = *cur;
- struct dirent_brace_args args;
if (p->type == RECURSIVE) {
if (new_pathtype == path_directory || /* not symlink but real directory */
- new_pathtype == path_exist) {
- if (dotfile < ((flags & FNM_DOTMATCH) ? 2 : 1))
- *new_end++ = p; /* append recursive pattern */
- }
+ new_pathtype == path_exist)
+ *new_end++ = p; /* append recursive pattern */
p = p->next; /* 0 times recursion */
}
switch (p->type) {
- case BRACE:
- args.name = name;
- args.dp = dp;
- args.flags = flags;
- if (ruby_brace_expand(p->str, flags, dirent_match_brace,
- (VALUE)&args, enc, Qfalse) > 0)
- *new_end++ = p->next;
- break;
case ALPHA:
-# if USE_NAME_ON_FS == USE_NAME_ON_FS_BY_FNMATCH
+# if USE_NAME_ON_FS == 2
if (plainname) {
*new_end++ = p->next;
break;
@@ -2333,9 +1865,9 @@ glob_helper(
}
}
- status = glob_helper(fd, buf, baselen, name - buf - baselen + namlen, 1,
+ status = glob_helper(buf, name - buf + namlen, 1,
new_pathtype, new_beg, new_end,
- flags, funcs, arg, enc);
+ flags, func, arg, enc);
GLOB_FREE(buf);
GLOB_FREE(new_beg);
if (status) break;
@@ -2390,18 +1922,16 @@ glob_helper(
status = -1;
break;
}
-#if USE_NAME_ON_FS == USE_NAME_ON_FS_REAL_BASENAME
+#if USE_NAME_ON_FS == 1
if ((*cur)->type == ALPHA) {
- buf = replace_real_basename(buf, pathlen + (dirsep != 0), enc,
- IF_NORMALIZE_UTF8PATH(1)+0,
+ long base = pathlen + (dirsep != 0);
+ buf = replace_real_basename(buf, base, enc, IF_NORMALIZE_UTF8PATH(1)+0,
flags, &new_pathtype);
- if (!buf) break;
}
#endif
- status = glob_helper(fd, buf, baselen,
- namelen + strlen(buf + pathlen), 1,
+ status = glob_helper(buf, pathlen + strlen(buf + pathlen), 1,
new_pathtype, new_beg, new_end,
- flags, funcs, arg, enc);
+ flags, func, arg, enc);
GLOB_FREE(buf);
GLOB_FREE(new_beg);
if (status) break;
@@ -2415,64 +1945,15 @@ glob_helper(
}
static int
-push_caller(const char *path, VALUE val, void *enc)
-{
- struct push_glob_args *arg = (struct push_glob_args *)val;
- struct glob_pattern *list;
- int status;
-
- list = glob_make_pattern(path, path + strlen(path), arg->flags, enc);
- if (!list) {
- return -1;
- }
- status = glob_helper(arg->fd, arg->path, arg->baselen, arg->namelen, arg->dirsep,
- arg->pathtype, &list, &list + 1, arg->flags, arg->funcs,
- arg->arg, enc);
- glob_free_pattern(list);
- return status;
-}
-
-static int ruby_glob0(const char *path, int fd, const char *base, int flags,
- const ruby_glob_funcs_t *funcs, VALUE arg, rb_encoding *enc);
-
-struct push_glob0_args {
- int fd;
- const char *base;
- int flags;
- const ruby_glob_funcs_t *funcs;
- VALUE arg;
-};
-
-static int
-push_glob0_caller(const char *path, VALUE val, void *enc)
-{
- struct push_glob0_args *arg = (struct push_glob0_args *)val;
- return ruby_glob0(path, arg->fd, arg->base, arg->flags, arg->funcs, arg->arg, enc);
-}
-
-static int
-ruby_glob0(const char *path, int fd, const char *base, int flags,
- const ruby_glob_funcs_t *funcs, VALUE arg,
- rb_encoding *enc)
+ruby_glob0(const char *path, int flags, ruby_glob_func *func, VALUE arg, rb_encoding *enc)
{
struct glob_pattern *list;
const char *root, *start;
char *buf;
- size_t n, baselen = 0;
- int status, dirsep = FALSE;
+ size_t n;
+ int status;
start = root = path;
-
- if (*root == '{') {
- struct push_glob0_args args;
- args.fd = fd;
- args.base = base;
- args.flags = flags;
- args.funcs = funcs;
- args.arg = arg;
- return ruby_brace_expand(path, flags, push_glob0_caller, (VALUE)&args, enc, Qfalse);
- }
-
flags |= FNM_SYSCASE;
#if defined DOSISH
root = rb_enc_path_skip_prefix(root, root + strlen(root), enc);
@@ -2481,12 +1962,6 @@ ruby_glob0(const char *path, int fd, const char *base, int flags,
if (*root == '/') root++;
n = root - start;
- if (!n && base) {
- n = strlen(base);
- baselen = n;
- start = base;
- dirsep = TRUE;
- }
buf = GLOB_ALLOC_N(char, n + 1);
if (!buf) return -1;
MEMCPY(buf, start, char, n);
@@ -2497,9 +1972,8 @@ ruby_glob0(const char *path, int fd, const char *base, int flags,
GLOB_FREE(buf);
return -1;
}
- status = glob_helper(fd, buf, baselen, n-baselen, dirsep,
- path_unknown, &list, &list + 1,
- flags, funcs, arg, enc);
+ status = glob_helper(buf, n, 0, path_unknown, &list, &list + 1,
+ flags, func, arg, enc);
glob_free_pattern(list);
GLOB_FREE(buf);
@@ -2509,11 +1983,8 @@ ruby_glob0(const char *path, int fd, const char *base, int flags,
int
ruby_glob(const char *path, int flags, ruby_glob_func *func, VALUE arg)
{
- ruby_glob_funcs_t funcs;
- funcs.match = func;
- funcs.error = NULL;
- return ruby_glob0(path, AT_FDCWD, 0, flags & ~GLOB_VERBOSE,
- &funcs, arg, rb_ascii8bit_encoding());
+ return ruby_glob0(path, flags & ~GLOB_VERBOSE, func, arg,
+ rb_ascii8bit_encoding());
}
static int
@@ -2527,29 +1998,36 @@ rb_glob_caller(const char *path, VALUE a, void *enc)
return status;
}
-static const ruby_glob_funcs_t rb_glob_funcs = {
- rb_glob_caller, rb_glob_error,
-};
-
-void
-rb_glob(const char *path, void (*func)(const char *, VALUE, void *), VALUE arg)
+static int
+rb_glob2(const char *path, int flags,
+ void (*func)(const char *, VALUE, void *), VALUE arg,
+ rb_encoding* enc)
{
struct glob_args args;
- int status;
args.func = func;
args.value = arg;
- args.enc = rb_ascii8bit_encoding();
+ args.enc = enc;
+
+ if (flags & FNM_SYSCASE) {
+ rb_warning("Dir.glob() ignores File::FNM_CASEFOLD");
+ }
+
+ return ruby_glob0(path, flags | GLOB_VERBOSE, rb_glob_caller, (VALUE)&args,
+ enc);
+}
- status = ruby_glob0(path, AT_FDCWD, 0, GLOB_VERBOSE, &rb_glob_funcs,
- (VALUE)&args, args.enc);
+void
+rb_glob(const char *path, void (*func)(const char *, VALUE, void *), VALUE arg)
+{
+ int status = rb_glob2(path, 0, func, arg, rb_ascii8bit_encoding());
if (status) GLOB_JUMP_TAG(status);
}
static void
push_pattern(const char *path, VALUE ary, void *enc)
{
-#if defined _WIN32 || defined __APPLE__
+#ifdef __APPLE__
VALUE name = rb_utf8_str_new_cstr(path);
rb_encoding *eenc = rb_default_internal_encoding();
OBJ_TAINT(name);
@@ -2562,7 +2040,7 @@ push_pattern(const char *path, VALUE ary, void *enc)
static int
ruby_brace_expand(const char *str, int flags, ruby_glob_func *func, VALUE arg,
- rb_encoding *enc, VALUE var)
+ rb_encoding *enc)
{
const int escape = !(flags & FNM_NOESCAPE);
const char *p = str;
@@ -2607,7 +2085,7 @@ ruby_brace_expand(const char *str, int flags, ruby_glob_func *func, VALUE arg,
}
memcpy(buf+shift, t, p-t);
strlcpy(buf+shift+(p-t), rbrace+1, len-(shift+(p-t)));
- status = ruby_brace_expand(buf, flags, func, arg, enc, var);
+ status = ruby_brace_expand(buf, flags, func, arg, enc);
if (status) break;
}
GLOB_FREE(buf);
@@ -2616,12 +2094,11 @@ ruby_brace_expand(const char *str, int flags, ruby_glob_func *func, VALUE arg,
status = glob_call_func(func, s, arg, enc);
}
- RB_GC_GUARD(var);
return status;
}
struct brace_args {
- ruby_glob_funcs_t funcs;
+ ruby_glob_func *func;
VALUE value;
int flags;
};
@@ -2631,7 +2108,7 @@ glob_brace(const char *path, VALUE val, void *enc)
{
struct brace_args *arg = (struct brace_args *)val;
- return ruby_glob0(path, AT_FDCWD, 0, arg->flags, &arg->funcs, arg->value, enc);
+ return ruby_glob0(path, arg->flags, arg->func, arg->value, enc);
}
int
@@ -2640,11 +2117,10 @@ ruby_brace_glob_with_enc(const char *str, int flags, ruby_glob_func *func, VALUE
struct brace_args args;
flags &= ~GLOB_VERBOSE;
- args.funcs.match = func;
- args.funcs.error = NULL;
+ args.func = func;
args.value = arg;
args.flags = flags;
- return ruby_brace_expand(str, flags, glob_brace, (VALUE)&args, enc, Qfalse);
+ return ruby_brace_expand(str, flags, glob_brace, (VALUE)&args, enc);
}
int
@@ -2653,14 +2129,26 @@ ruby_brace_glob(const char *str, int flags, ruby_glob_func *func, VALUE arg)
return ruby_brace_glob_with_enc(str, flags, func, arg, rb_ascii8bit_encoding());
}
+struct push_glob_args {
+ struct glob_args glob;
+ int flags;
+};
+
static int
-push_glob(VALUE ary, VALUE str, VALUE base, int flags)
+push_caller(const char *path, VALUE val, void *enc)
{
- struct glob_args args;
- int fd;
+ struct push_glob_args *arg = (struct push_glob_args *)val;
+
+ return ruby_glob0(path, arg->flags, rb_glob_caller, (VALUE)&arg->glob, enc);
+}
+
+static int
+push_glob(VALUE ary, VALUE str, int flags)
+{
+ struct push_glob_args args;
rb_encoding *enc = rb_enc_get(str);
-#if defined _WIN32 || defined __APPLE__
+#ifdef __APPLE__
str = rb_str_encode_ospath(str);
#endif
if (rb_enc_to_index(enc) == ENCINDEX_US_ASCII)
@@ -2668,75 +2156,48 @@ push_glob(VALUE ary, VALUE str, VALUE base, int flags)
if (rb_enc_to_index(enc) == ENCINDEX_US_ASCII)
enc = rb_ascii8bit_encoding();
flags |= GLOB_VERBOSE;
- args.func = push_pattern;
- args.value = ary;
- args.enc = enc;
- args.base = 0;
- fd = AT_FDCWD;
- if (!NIL_P(base)) {
- if (!RB_TYPE_P(base, T_STRING) || !rb_enc_check(str, base)) {
- struct dir_data *dirp = DATA_PTR(base);
- if (!dirp->dir) dir_closed();
-#ifdef HAVE_DIRFD
- if ((fd = dirfd(dirp->dir)) == -1)
- rb_sys_fail_path(dir_inspect(base));
-#endif
- base = dirp->path;
- }
- args.base = RSTRING_PTR(base);
- }
-#if defined _WIN32 || defined __APPLE__
+ args.glob.func = push_pattern;
+ args.glob.value = ary;
+ args.glob.enc = enc;
+ args.flags = flags;
+#ifdef __APPLE__
enc = rb_utf8_encoding();
#endif
- return ruby_glob0(RSTRING_PTR(str), fd, args.base, flags, &rb_glob_funcs,
- (VALUE)&args, enc);
+ RB_GC_GUARD(str);
+ return ruby_brace_expand(RSTRING_PTR(str), flags,
+ push_caller, (VALUE)&args, enc);
}
static VALUE
-rb_push_glob(VALUE str, VALUE base, int flags) /* '\0' is delimiter */
+rb_push_glob(VALUE str, int flags) /* '\0' is delimiter */
{
long offset = 0;
- long len;
VALUE ary;
- int warned = FALSE;
- /* can contain null bytes as separators */
- if (!RB_TYPE_P((str), T_STRING)) {
- FilePathValue(str);
- }
- else {
- rb_check_safe_obj(str);
- rb_enc_check(str, rb_enc_from_encoding(rb_usascii_encoding()));
- }
+ GlobPathValue(str, TRUE);
ary = rb_ary_new();
- while (offset < (len = RSTRING_LEN(str))) {
+ while (offset < RSTRING_LEN(str)) {
+ char *p, *pend;
int status;
- long rest = len - offset;
- const char *pbeg = RSTRING_PTR(str), *p = pbeg + offset;
- const char *pend = memchr(p, '\0', rest);
- if (pend) {
- if (!warned) {
- rb_warn("use glob patterns list instead of nul-separated patterns");
- warned = TRUE;
- }
- rest = ++pend - p;
- offset = pend - pbeg;
- }
- else {
- offset = len;
- }
- status = push_glob(ary, rb_str_subseq(str, p-pbeg, rest),
- base, flags);
+ p = RSTRING_PTR(str) + offset;
+ status = push_glob(ary, rb_enc_str_new(p, strlen(p), rb_enc_get(str)),
+ flags);
if (status) GLOB_JUMP_TAG(status);
+ if (offset >= RSTRING_LEN(str)) break;
+ p += strlen(p) + 1;
+ pend = RSTRING_PTR(str) + RSTRING_LEN(str);
+ while (p < pend && !*p)
+ p++;
+ offset = p - RSTRING_PTR(str);
}
return ary;
}
static VALUE
-dir_globs(long argc, const VALUE *argv, VALUE base, int flags)
+dir_globs(long argc, const VALUE *argv, int flags)
{
VALUE ary = rb_ary_new();
long i;
@@ -2744,84 +2205,47 @@ dir_globs(long argc, const VALUE *argv, VALUE base, int flags)
for (i = 0; i < argc; ++i) {
int status;
VALUE str = argv[i];
- FilePathValue(str);
- status = push_glob(ary, str, base, flags);
+ GlobPathValue(str, TRUE);
+ status = push_glob(ary, str, flags);
if (status) GLOB_JUMP_TAG(status);
}
return ary;
}
-static void
-dir_glob_options(VALUE opt, VALUE *base, int *flags)
-{
- ID kw[2];
- VALUE args[2];
- kw[0] = rb_intern("base");
- if (flags) kw[1] = rb_intern("flags");
- rb_get_kwargs(opt, kw, 0, flags ? 2 : 1, args);
- if (args[0] == Qundef || NIL_P(args[0])) {
- *base = Qnil;
- }
-#if USE_OPENDIR_AT
- else if (rb_typeddata_is_kind_of(args[0], &dir_data_type)) {
- *base = args[0];
- }
-#endif
- else {
- FilePathValue(args[0]);
- if (!RSTRING_LEN(args[0])) args[0] = Qnil;
- *base = args[0];
- }
- if (flags && args[1] != Qundef) {
- *flags = NUM2INT(args[1]);
- }
-}
-
/*
* call-seq:
- * Dir[ string [, string ...] [, base: path] ] -> array
+ * Dir[ string [, string ...] ] -> array
*
* Equivalent to calling
- * <code>Dir.glob([</code><i>string,...</i><code>], 0)</code>.
+ * <code>Dir.glob([</code><i>string,...</i><code>],0)</code>.
*
*/
static VALUE
dir_s_aref(int argc, VALUE *argv, VALUE obj)
{
- VALUE opts, base;
- argc = rb_scan_args(argc, argv, "*:", NULL, &opts);
- dir_glob_options(opts, &base, NULL);
if (argc == 1) {
- return rb_push_glob(argv[0], base, 0);
+ return rb_push_glob(argv[0], 0);
}
- return dir_globs(argc, argv, base, 0);
+ return dir_globs(argc, argv, 0);
}
/*
* call-seq:
- * Dir.glob( pattern, [flags], [base: path] ) -> array
- * Dir.glob( pattern, [flags], [base: path] ) { |filename| block } -> nil
- *
- * Expands +pattern+, which is a pattern string or an Array of pattern
- * strings, and returns an array containing the matching filenames.
- * If a block is given, calls the block once for each matching filename,
- * passing the filename as a parameter to the block.
+ * Dir.glob( pattern, [flags] ) -> matches
+ * Dir.glob( pattern, [flags] ) { |filename| block } -> nil
*
- * The optional +base+ keyword argument specifies the base directory for
- * interpreting relative pathnames instead of the current working directory.
- * As the results are not prefixed with the base directory name in this
- * case, you will need to prepend the base directory name if you want real
- * paths.
+ * Expands +pattern+, which is an Array of patterns or a pattern String, and
+ * returns the results as +matches+ or as arguments given to the block.
*
- * Note that the pattern is not a regexp, it's closer to a shell glob.
- * See File::fnmatch for the meaning of the +flags+ parameter.
- * Case sensitivity depends on your system (File::FNM_CASEFOLD is ignored),
- * as does the order in which the results are returned.
+ * Note that this pattern is not a regexp, it's closer to a shell glob. See
+ * File::fnmatch for the meaning of the +flags+ parameter. Note that case
+ * sensitivity depends on your system (so File::FNM_CASEFOLD is ignored), as
+ * does the order in which the results are returned.
*
* <code>*</code>::
* Matches any file. Can be restricted by other values in the glob.
- * Equivalent to <code>/ .* /mx</code> in regexp.
+ * Equivalent to <code>/ .* /x</code> in regexp.
*
* <code>*</code>:: Matches all files
* <code>c*</code>:: Matches all files beginning with <code>c</code>
@@ -2866,16 +2290,11 @@ dir_s_aref(int argc, VALUE *argv, VALUE obj)
* Dir.glob("*.{rb,h}") #=> ["main.rb", "config.h"]
* Dir.glob("*") #=> ["config.h", "main.rb"]
* Dir.glob("*", File::FNM_DOTMATCH) #=> [".", "..", "config.h", "main.rb"]
- * Dir.glob(["*.rb", "*.h"]) #=> ["main.rb", "config.h"]
*
* rbfiles = File.join("**", "*.rb")
* Dir.glob(rbfiles) #=> ["main.rb",
* # "lib/song.rb",
* # "lib/song/karaoke.rb"]
- *
- * Dir.glob(rbfiles, base: "lib") #=> ["song.rb",
- * # "song/karaoke.rb"]
- *
* libdirs = File.join("**", "lib")
* Dir.glob(libdirs) #=> ["lib"]
*
@@ -2889,23 +2308,21 @@ dir_s_aref(int argc, VALUE *argv, VALUE obj)
static VALUE
dir_s_glob(int argc, VALUE *argv, VALUE obj)
{
- VALUE str, rflags, ary, opts, base;
+ VALUE str, rflags, ary;
int flags;
- argc = rb_scan_args(argc, argv, "11:", &str, &rflags, &opts);
- if (argc == 2)
+ if (rb_scan_args(argc, argv, "11", &str, &rflags) == 2)
flags = NUM2INT(rflags);
else
flags = 0;
- dir_glob_options(opts, &base, &flags);
ary = rb_check_array_type(str);
if (NIL_P(ary)) {
- ary = rb_push_glob(str, base, flags);
+ ary = rb_push_glob(str, flags);
}
else {
VALUE v = ary;
- ary = dir_globs(RARRAY_LEN(v), RARRAY_CONST_PTR(v), base, flags);
+ ary = dir_globs(RARRAY_LEN(v), RARRAY_CONST_PTR(v), flags);
RB_GC_GUARD(v);
}
@@ -2919,7 +2336,7 @@ dir_s_glob(int argc, VALUE *argv, VALUE obj)
static VALUE
dir_open_dir(int argc, VALUE *argv)
{
- VALUE dir = rb_funcallv(rb_cDir, rb_intern("open"), argc, argv);
+ VALUE dir = rb_funcall2(rb_cDir, rb_intern("open"), argc, argv);
rb_check_typeddata(dir, &dir_data_type);
return dir;
@@ -2959,14 +2376,6 @@ dir_foreach(int argc, VALUE *argv, VALUE io)
return Qnil;
}
-static VALUE
-dir_collect(VALUE dir)
-{
- VALUE ary = rb_ary_new();
- dir_each_entry(dir, rb_ary_push, ary, FALSE);
- return ary;
-}
-
/*
* call-seq:
* Dir.entries( dirname ) -> array
@@ -2976,8 +2385,8 @@ dir_collect(VALUE dir)
* directory. Will raise a <code>SystemCallError</code> if the named
* directory doesn't exist.
*
- * The optional <i>encoding</i> keyword argument specifies the encoding of the
- * directory. If not specified, the filesystem encoding is used.
+ * The optional <i>enc</i> argument specifies the encoding of the directory.
+ * If not specified, the filesystem encoding is used.
*
* Dir.entries("testdir") #=> [".", "..", "config.h", "main.rb"]
*
@@ -2988,115 +2397,7 @@ dir_entries(int argc, VALUE *argv, VALUE io)
VALUE dir;
dir = dir_open_dir(argc, argv);
- return rb_ensure(dir_collect, dir, dir_close, dir);
-}
-
-static VALUE
-dir_each_child(VALUE dir)
-{
- return dir_each_entry(dir, dir_yield, Qnil, TRUE);
-}
-
-/*
- * call-seq:
- * Dir.each_child( dirname ) {| filename | block } -> nil
- * Dir.each_child( dirname, encoding: enc ) {| filename | block } -> nil
- * Dir.each_child( dirname ) -> an_enumerator
- * Dir.each_child( dirname, encoding: enc ) -> an_enumerator
- *
- * Calls the block once for each entry except for "." and ".." in the
- * named directory, passing the filename of each entry as a parameter
- * to the block.
- *
- * If no block is given, an enumerator is returned instead.
- *
- * Dir.each_child("testdir") {|x| puts "Got #{x}" }
- *
- * <em>produces:</em>
- *
- * Got config.h
- * Got main.rb
- *
- */
-static VALUE
-dir_s_each_child(int argc, VALUE *argv, VALUE io)
-{
- VALUE dir;
-
- RETURN_ENUMERATOR(io, argc, argv);
- dir = dir_open_dir(argc, argv);
- rb_ensure(dir_each_child, dir, dir_close, dir);
- return Qnil;
-}
-
-/*
- * call-seq:
- * dir.each_child {| filename | block } -> nil
- * dir.each_child -> an_enumerator
- *
- * Calls the block once for each entry except for "." and ".." in
- * this directory, passing the filename of each entry as a parameter
- * to the block.
- *
- * If no block is given, an enumerator is returned instead.
- *
- * d = Dir.new("testdir")
- * d.each_child {|x| puts "Got #{x}" }
- *
- * <em>produces:</em>
- *
- * Got config.h
- * Got main.rb
- *
- */
-static VALUE
-dir_each_child_m(VALUE dir)
-{
- RETURN_ENUMERATOR(dir, 0, 0);
- return dir_each_entry(dir, dir_yield, Qnil, TRUE);
-}
-
-/*
- * call-seq:
- * dir.children -> array
- *
- * Returns an array containing all of the filenames except for "."
- * and ".." in this directory.
- *
- * d = Dir.new("testdir")
- * d.children #=> ["config.h", "main.rb"]
- *
- */
-static VALUE
-dir_collect_children(VALUE dir)
-{
- VALUE ary = rb_ary_new();
- dir_each_entry(dir, rb_ary_push, ary, TRUE);
- return ary;
-}
-
-/*
- * call-seq:
- * Dir.children( dirname ) -> array
- * Dir.children( dirname, encoding: enc ) -> array
- *
- * Returns an array containing all of the filenames except for "."
- * and ".." in the given directory. Will raise a
- * <code>SystemCallError</code> if the named directory doesn't exist.
- *
- * The optional <i>encoding</i> keyword argument specifies the encoding of the
- * directory. If not specified, the filesystem encoding is used.
- *
- * Dir.children("testdir") #=> ["config.h", "main.rb"]
- *
- */
-static VALUE
-dir_s_children(int argc, VALUE *argv, VALUE io)
-{
- VALUE dir;
-
- dir = dir_open_dir(argc, argv);
- return rb_ensure(dir_collect_children, dir, dir_close, dir);
+ return rb_ensure(rb_Array, dir, dir_close, dir);
}
static int
@@ -3239,7 +2540,7 @@ file_s_fnmatch(int argc, VALUE *argv, VALUE obj)
args.value = path;
args.flags = flags;
if (ruby_brace_expand(RSTRING_PTR(pattern), flags, fnmatch_brace,
- (VALUE)&args, rb_enc_get(pattern), pattern) > 0)
+ (VALUE)&args, rb_enc_get(pattern)) > 0)
return Qtrue;
}
else {
@@ -3309,85 +2610,6 @@ rb_dir_exists_p(VALUE obj, VALUE fname)
return rb_file_directory_p(obj, fname);
}
-static void *
-nogvl_dir_empty_p(void *ptr)
-{
- const char *path = ptr;
- DIR *dir = opendir(path);
- struct dirent *dp;
- VALUE result = Qtrue;
-
- if (!dir) {
- int e = errno;
- switch (gc_for_fd_with_gvl(e)) {
- default:
- dir = opendir(path);
- if (dir) break;
- e = errno;
- /* fall through */
- case 0:
- if (e == ENOTDIR) return (void *)Qfalse;
- errno = e; /* for rb_sys_fail_path */
- return (void *)Qundef;
- }
- }
- while ((dp = READDIR(dir, NULL)) != NULL) {
- if (!to_be_skipped(dp)) {
- result = Qfalse;
- break;
- }
- }
- closedir(dir);
- return (void *)result;
-}
-
-/*
- * call-seq:
- * Dir.empty?(path_name) -> true or false
- *
- * Returns <code>true</code> if the named file is an empty directory,
- * <code>false</code> if it is not a directory or non-empty.
- */
-static VALUE
-rb_dir_s_empty_p(VALUE obj, VALUE dirname)
-{
- VALUE result, orig;
- const char *path;
- enum {false_on_notdir = 1};
-
- FilePathValue(dirname);
- orig = rb_str_dup_frozen(dirname);
- dirname = rb_str_encode_ospath(dirname);
- dirname = rb_str_dup_frozen(dirname);
- path = RSTRING_PTR(dirname);
-
-#if defined HAVE_GETATTRLIST && defined ATTR_DIR_ENTRYCOUNT
- {
- u_int32_t attrbuf[SIZEUP32(fsobj_tag_t)];
- struct attrlist al = {ATTR_BIT_MAP_COUNT, 0, ATTR_CMN_OBJTAG,};
- if (getattrlist(path, &al, attrbuf, sizeof(attrbuf), 0) != 0)
- rb_sys_fail_path(orig);
- if (*(const fsobj_tag_t *)(attrbuf+1) == VT_HFS) {
- al.commonattr = 0;
- al.dirattr = ATTR_DIR_ENTRYCOUNT;
- if (getattrlist(path, &al, attrbuf, sizeof(attrbuf), 0) == 0) {
- if (attrbuf[0] >= 2 * sizeof(u_int32_t))
- return attrbuf[1] ? Qfalse : Qtrue;
- if (false_on_notdir) return Qfalse;
- }
- rb_sys_fail_path(orig);
- }
- }
-#endif
-
- result = (VALUE)rb_thread_call_without_gvl(nogvl_dir_empty_p, (void *)path,
- RUBY_UBF_IO, 0);
- if (result == Qundef) {
- rb_sys_fail_path(orig);
- }
- return result;
-}
-
/*
* Objects of class <code>Dir</code> are directory streams representing
* directories in the underlying file system. They provide a variety of
@@ -3410,8 +2632,6 @@ Init_Dir(void)
rb_define_singleton_method(rb_cDir, "open", dir_s_open, -1);
rb_define_singleton_method(rb_cDir, "foreach", dir_foreach, -1);
rb_define_singleton_method(rb_cDir, "entries", dir_entries, -1);
- rb_define_singleton_method(rb_cDir, "each_child", dir_s_each_child, -1);
- rb_define_singleton_method(rb_cDir, "children", dir_s_children, -1);
rb_define_method(rb_cDir,"initialize", dir_initialize, -1);
rb_define_method(rb_cDir,"fileno", dir_fileno, 0);
@@ -3420,8 +2640,6 @@ Init_Dir(void)
rb_define_method(rb_cDir,"inspect", dir_inspect, 0);
rb_define_method(rb_cDir,"read", dir_read, 0);
rb_define_method(rb_cDir,"each", dir_each, 0);
- rb_define_method(rb_cDir,"each_child", dir_each_child_m, 0);
- rb_define_method(rb_cDir,"children", dir_collect_children, 0);
rb_define_method(rb_cDir,"rewind", dir_rewind, 0);
rb_define_method(rb_cDir,"tell", dir_tell, 0);
rb_define_method(rb_cDir,"seek", dir_seek, 1);
@@ -3443,7 +2661,6 @@ Init_Dir(void)
rb_define_singleton_method(rb_cDir,"[]", dir_s_aref, -1);
rb_define_singleton_method(rb_cDir,"exist?", rb_file_directory_p, 1);
rb_define_singleton_method(rb_cDir,"exists?", rb_dir_exists_p, 1);
- rb_define_singleton_method(rb_cDir,"empty?", rb_dir_s_empty_p, 1);
rb_define_singleton_method(rb_cFile,"fnmatch", file_s_fnmatch, -1);
rb_define_singleton_method(rb_cFile,"fnmatch?", file_s_fnmatch, -1);
diff --git a/dln.c b/dln.c
index 7acea5f888..51545fbbb2 100644
--- a/dln.c
+++ b/dln.c
@@ -22,7 +22,6 @@
static void dln_loaderror(const char *format, ...);
#endif
#include "dln.h"
-#include "internal.h"
#ifdef HAVE_STDLIB_H
# include <stdlib.h>
@@ -232,13 +231,13 @@ load_header(int fd, struct exec *hdrp, long disp)
# define R_RIGHTSHIFT(r) (reloc_r_rightshift[(r)->r_type])
# define R_BITSIZE(r) (reloc_r_bitsize[(r)->r_type])
# define R_LENGTH(r) (reloc_r_length[(r)->r_type])
-static const int reloc_r_rightshift[] = {
+static int reloc_r_rightshift[] = {
0, 0, 0, 0, 0, 0, 2, 2, 10, 0, 0, 0, 0, 0, 0,
};
-static const int reloc_r_bitsize[] = {
+static int reloc_r_bitsize[] = {
8, 16, 32, 8, 16, 32, 30, 22, 22, 22, 13, 10, 32, 32, 16,
};
-static const int reloc_r_length[] = {
+static int reloc_r_length[] = {
0, 1, 2, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
};
# define R_PCREL(r) \
@@ -1243,28 +1242,12 @@ rb_w32_check_imported(HMODULE ext, HMODULE mine)
#define translit_separator(str) (void)(str)
#endif
-#ifdef USE_DLN_DLOPEN
-COMPILER_WARNING_PUSH
-#if defined(__clang__) || GCC_VERSION_SINCE(4, 2, 0)
-COMPILER_WARNING_IGNORED(-Wpedantic)
-#endif
-static bool
-dln_incompatible_library_p(void *handle)
-{
- void *ex = dlsym(handle, EXTERNAL_PREFIX"ruby_xmalloc");
- return ex && ex != ruby_xmalloc;
-}
-COMPILER_WARNING_POP
-#endif
-
void*
dln_load(const char *file)
{
-#if (defined _WIN32 || defined USE_DLN_DLOPEN) && defined RUBY_EXPORT
- static const char incompatible[] = "incompatible library version";
-#endif
#if !defined(_AIX) && !defined(NeXT)
const char *error = 0;
+#define DLN_ERROR() (error = dln_strerror(), strcpy(ALLOCA_N(char, strlen(error) + 1), error))
#endif
#if defined _WIN32
@@ -1295,7 +1278,7 @@ dln_load(const char *file)
#if defined _WIN32 && defined RUBY_EXPORT
if (!rb_w32_check_imported(handle, rb_libruby_handle())) {
FreeLibrary(handle);
- error = incompatible;
+ error = "incompatible library version";
goto failed;
}
#endif
@@ -1344,11 +1327,11 @@ dln_load(const char *file)
}
# if defined RUBY_EXPORT
{
- if (dln_incompatible_library_p(handle)) {
+ static const char incompatible[] = "incompatible library version";
+ void *ex = dlsym(handle, EXTERNAL_PREFIX"ruby_xmalloc");
+ if (ex && ex != ruby_xmalloc) {
-# if defined __APPLE__ && \
- defined(MAC_OS_X_VERSION_MIN_REQUIRED) && \
- (MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_11)
+# if defined __APPLE__
/* dlclose() segfaults */
rb_fatal("%s - %s", incompatible, file);
# else
@@ -1362,8 +1345,7 @@ dln_load(const char *file)
init_fct = (void(*)())(VALUE)dlsym(handle, buf);
if (init_fct == NULL) {
- const size_t errlen = strlen(error = dln_strerror()) + 1;
- error = memcpy(ALLOCA_N(char, errlen), error, errlen);
+ error = DLN_ERROR();
dlclose(handle);
goto failed;
}
diff --git a/dln_find.c b/dln_find.c
index b08612764e..b17b0d23e1 100644
--- a/dln_find.c
+++ b/dln_find.c
@@ -48,6 +48,13 @@ char *dln_argv0;
# define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
#endif
+#ifdef HAVE_SYS_PARAM_H
+# include <sys/param.h>
+#endif
+#ifndef MAXPATHLEN
+# define MAXPATHLEN 1024
+#endif
+
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif
diff --git a/dmydln.c b/dmydln.c
index d05cda0b8e..25872efc98 100644
--- a/dmydln.c
+++ b/dmydln.c
@@ -1,10 +1,9 @@
#include "ruby/ruby.h"
-NORETURN(void *dln_load(const char *));
void*
dln_load(const char *file)
{
rb_loaderror("this executable file can't load extension libraries");
- UNREACHABLE_RETURN(NULL);
+ UNREACHABLE;
}
diff --git a/doc/.document b/doc/.document
index d739c9f6bc..b48c0387a7 100644
--- a/doc/.document
+++ b/doc/.document
@@ -1,3 +1,4 @@
*.rdoc
+ChangeLog*
NEWS-*
syntax
diff --git a/doc/ChangeLog-0.60_to_1.1 b/doc/ChangeLog-0.60_to_1.1
index bd5f140dc3..a0a138eada 100644
--- a/doc/ChangeLog-0.60_to_1.1
+++ b/doc/ChangeLog-0.60_to_1.1
@@ -334,7 +334,7 @@ Fri Apr 11 10:27:29 1997 Yukihiro Matsumoto <matz@caelum.co.jp>
* eval.c (proc_s_new): save safe-level in the proc context.
- * eval.c (rb_eval): no class/module extension in safe mode.
+ * eval.c (rb_eval): no class/module extention in safe mode.
Thu Apr 10 02:10:41 1997 Yukihiro Matsumoto <matz@caelum.co.jp>
@@ -392,7 +392,7 @@ Thu Apr 3 02:12:31 1997 Yukihiro Matsumoto <matz@caelum.co.jp>
* parse.y (parse_regx): new option //[nes] to specify character
code for regexp literals. Last specified code option is valid.
- * re.c (reg_s_new): additional 3rd argument to specify compiled
+ * re.c (reg_s_new): addtional 3rd argument to specify compiled
regexp's character code.
* re.c (reg_new_1): regexp character code can be specified for
@@ -838,7 +838,7 @@ Fri Jan 17 12:31:37 1997 Yukihiro Matsumoto <matz@caelum.co.jp>
* ruby.c (ruby_options): constant PLATFORM, which is in the {cpu}-{os}
form, defined.
- * configure.in: platform information embedded in the interpreter.
+ * configure.in: platform infomation embedded in the interpreter.
* regex.c (re_search): /^$/ did not match to "" by wrong exit condition.
@@ -3166,7 +3166,7 @@ Fri Aug 11 14:37:03 1995 Yukihiro Matsumoto <matz@caelum.co.jp>
* io.c: マクロREAD_DATA_PENDINGの定義を変更(Linux対応)
- * io.c (io_fptr_finalize): fptrの解放時の処理を指定できるように.
+ * io.c (io_fptr_finalize): fptrの開放時の処理を指定できるように.
Wed Aug 9 16:52:41 1995 Yukihiro Matsumoto <matz@caelum.co.jp>
@@ -3448,7 +3448,7 @@ Thu May 18 12:27:23 1995 Yukihiro Matsumoto <matz@ix-02>
無くなった(と思う).
* gc.c (gc): the_scopeをマークしていなかったので,ローカル変数の指
- しているオブジェクトが間違って解放される場合があった.
+ しているオブジェクトが間違って開放される場合があった.
* gc.c (mark_locations_array): 若干の高速化.
diff --git a/doc/ChangeLog-1.8.0 b/doc/ChangeLog-1.8.0
index 3f7d6bfb3c..07d7c6b165 100644
--- a/doc/ChangeLog-1.8.0
+++ b/doc/ChangeLog-1.8.0
@@ -1454,7 +1454,7 @@ Fri Jun 27 03:24:54 2003 Nobuyoshi Nakada <nobu.nokada@softhome.net>
Thu Jun 26 21:34:49 2003 Nobuyoshi Nakada <nobu.nokada@softhome.net>
* class.c (class_instance_method_list): get rid of warning about
- argument type mismatch, and inline method_list().
+ arguement type mismatch, and inline method_list().
[ruby-core:01198]
Wed Jun 25 14:40:33 2003 Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp>
@@ -3361,7 +3361,7 @@ Fri Apr 11 02:41:35 2003 Nobuyoshi Nakada <nobu.nokada@softhome.net>
Thu Apr 10 21:12:19 2003 Minero Aoki <aamine@loveruby.net>
- * lib/net/pop.rb: Exception line was accidentally removed.
+ * lib/net/pop.rb: Exception line was accidentaly removed.
[ruby-dev:19989]
Thu Apr 10 18:42:13 2003 Tadayoshi Funaba <tadf@dotrb.org>
@@ -5986,7 +5986,7 @@ Thu Nov 7 09:51:37 2002 Nobuyoshi Nakada <nobu.nokada@softhome.net>
Wed Nov 6 16:57:06 2002 Yukihiro Matsumoto <matz@ruby-lang.org>
* class.c (rb_define_method): do not set NOEX_CFUNC if klass is
- really a module, whose methods must be safe for receiver's type.
+ really a module, whose methods must be safe for reciever's type.
* eval.c (rb_eval): nosuper should not be inherited unless the
overwritten method is an undef placeholder.
@@ -21236,7 +21236,7 @@ Sun Jan 3 01:37:58 1999 Takao KAWAMURA <kawamura@ike.tottori-u.ac.jp>
Sat Jan 2 17:09:06 1999 Yukihiro Matsumoto <matz@netlab.co.jp>
* eval.c (rb_jump_tag): new api to invoke JUMP_TAG. tag values
- can be obtained from rb_eval_string_protect()/rb_load_protect().
+ can obtained from rb_eval_string_protect()/rb_load_protect().
* eval.c (rb_rescue): now catches all exceptions but SystemExit.
diff --git a/doc/ChangeLog-1.9.3 b/doc/ChangeLog-1.9.3
index eecfc44325..e9ede641f5 100644
--- a/doc/ChangeLog-1.9.3
+++ b/doc/ChangeLog-1.9.3